@tenphi/tasty 3.9.0 → 3.9.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,18 +1,18 @@
1
1
  <p align="center">
2
- <img src="assets/tasty.svg" width="128" height="128" alt="Tasty logo">
2
+ <img src="assets/tasty.svg" width="128" height="128" alt="Tasty logo" />
3
3
  </p>
4
4
 
5
5
  <h1 align="center">Tasty</h1>
6
6
 
7
7
  <p align="center">
8
- <strong>CSS-in-JS for React design systems.</strong><br>
8
+ <strong>CSS-in-JS for React design systems.</strong><br />
9
9
  Build components whose styles don’t fight.
10
10
  </p>
11
11
 
12
12
  <p align="center">
13
- <a href="https://www.npmjs.com/package/@tenphi/tasty"><img src="https://img.shields.io/npm/v/@tenphi/tasty.svg" alt="npm version"></a>
14
- <a href="https://github.com/tenphi/tasty/actions/workflows/ci.yml"><img src="https://github.com/tenphi/tasty/actions/workflows/ci.yml/badge.svg?branch=main" alt="CI"></a>
15
- <a href="https://github.com/tenphi/tasty/blob/main/LICENSE"><img src="https://img.shields.io/github/license/tenphi/tasty" alt="license"></a>
13
+ <a href="https://www.npmjs.com/package/@tenphi/tasty"><img src="https://img.shields.io/npm/v/@tenphi/tasty.svg" alt="npm version" /></a>
14
+ <a href="https://github.com/tenphi/tasty/actions/workflows/ci.yml"><img src="https://github.com/tenphi/tasty/actions/workflows/ci.yml/badge.svg?branch=main" alt="CI" /></a>
15
+ <a href="https://github.com/tenphi/tasty/blob/main/LICENSE"><img src="https://img.shields.io/github/license/tenphi/tasty" alt="license" /></a>
16
16
  </p>
17
17
 
18
18
  ---
@@ -615,7 +615,7 @@ const tokens = theme.tasty(); // Ready-to-use Tasty tokens
615
615
  Syntax highlighting for Tasty styles in TypeScript, TSX, JavaScript, and JSX. Highlights color tokens, custom units, state keys, presets, and style properties inside `tasty()`, `tastyStatic()`, and related APIs.
616
616
 
617
617
  <p align="center">
618
- <img src="assets/tasty-vscode-highlight.png" width="512" alt="Tasty VS Code syntax highlighting example">
618
+ <img src="assets/tasty-vscode-highlight.png" width="512" alt="Tasty VS Code syntax highlighting example" />
619
619
  </p>
620
620
 
621
621
  ## Built with Tasty
@@ -1,6 +1,6 @@
1
1
  import { k as tastyClassRegex } from "./css-definitions-D_it4XZH.js";
2
2
  import { j as CHUNK_NAMES } from "./style-engine-C1ECBZxR.js";
3
- import { B as getNamePrefix, D as injector, Y as flushStyles, x as getCSSTextForNode } from "./runtime-engine-DvnE2g-E.js";
3
+ import { B as getNamePrefix, D as injector, Y as flushStyles, x as getCSSTextForNode } from "./runtime-engine-BrRcOZwD.js";
4
4
  //#region src/debug.ts
5
5
  function fmtSize(bytes) {
6
6
  return bytes > 1024 ? `${(bytes / 1024).toFixed(1)}KB` : `${bytes}B`;
@@ -498,4 +498,4 @@ function getPageCSS(root = defaultRoot()) {
498
498
  //#endregion
499
499
  export { tastyDebug as t };
500
500
 
501
- //# sourceMappingURL=debug-C9LeNVoJ.js.map
501
+ //# sourceMappingURL=debug-CiiHDgmR.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"debug-C9LeNVoJ.js","names":[],"sources":["../../src/debug.ts"],"sourcesContent":["/* eslint-disable no-console */\nimport { CHUNK_NAMES } from './chunks/definitions';\nimport { getNamePrefix } from './config';\nimport { flushStyles, getCSSTextForNode, injector } from './injector';\nimport type { CacheMetrics, RootRegistry } from './injector/types';\nimport { tastyClassRegex } from './utils/name-prefix';\n\ndeclare global {\n interface Window {\n tastyDebug?: typeof tastyDebug;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype CSSTarget =\n 'all' | 'global' | 'active' | 'unused' | 'page' | string | string[] | Element;\n\nexport interface DebugOptions {\n root?: Document | ShadowRoot;\n /** Suppress console logging and return data only (default: false) */\n raw?: boolean;\n}\n\nexport interface CSSOptions extends DebugOptions {\n prettify?: boolean;\n /** Read from stored source CSS (dev-mode only) instead of live CSSOM */\n source?: boolean;\n}\n\nexport interface DebugChunkInfo {\n className: string;\n chunkName: string | null;\n}\n\nexport interface InspectResult {\n element?: Element | null;\n classes: string[];\n chunks: DebugChunkInfo[];\n css: string;\n size: number;\n rules: number;\n}\n\nexport interface CacheStatus {\n classes: {\n active: string[];\n unused: string[];\n all: string[];\n };\n metrics: CacheMetrics | null;\n}\n\nexport interface ChunkBreakdown {\n byChunk: Record<\n string,\n { classes: string[]; cssSize: number; ruleCount: number }\n >;\n totalChunkTypes: number;\n totalClasses: number;\n}\n\nexport interface Summary {\n activeClasses: string[];\n /** Classes `gc({ force: true })` would delete right now. */\n unusedClasses: string[];\n /**\n * Held but in neither list: nothing renders them, yet collection will not\n * take them — inside the grace window, or pinned by an `inject()` handle.\n */\n hotClasses: string[];\n totalStyledClasses: string[];\n\n activeCSSSize: number;\n unusedCSSSize: number;\n globalCSSSize: number;\n rawCSSSize: number;\n keyframesCSSSize: number;\n propertyCSSSize: number;\n totalCSSSize: number;\n\n activeRuleCount: number;\n unusedRuleCount: number;\n globalRuleCount: number;\n rawRuleCount: number;\n keyframesRuleCount: number;\n propertyRuleCount: number;\n totalRuleCount: number;\n\n metrics: CacheMetrics | null;\n definedProperties: string[];\n definedKeyframes: { name: string; refCount: number }[];\n chunkBreakdown: ChunkBreakdown;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction fmtSize(bytes: number): string {\n return bytes > 1024 ? `${(bytes / 1024).toFixed(1)}KB` : `${bytes}B`;\n}\n\nfunction countRules(css: string): number {\n return (css.match(/\\{[^}]*\\}/g) || []).length;\n}\n\nfunction sortTastyClasses(classes: Iterable<string>): string[] {\n // Class names use a base36 hash format (e.g. `t3a5f`), so sort lexicographically.\n return Array.from(classes).sort((a, b) => a.localeCompare(b));\n}\n\n/** A DOM root to read, or `null` when the environment has no DOM at all. */\ntype DebugRoot = Document | ShadowRoot | null;\n\n/**\n * The root these helpers read, or `null` where there is no DOM.\n *\n * `document` used to be a default parameter value, and a default is evaluated\n * at the call site — so every read below threw a bare `ReferenceError` under\n * Node, taking out five of the eight public methods. A debug utility must not\n * be able to fail an SSR render because a call was left in, so the DOM-less\n * case reports an empty result and says why.\n */\nfunction defaultRoot(): DebugRoot {\n return typeof document === 'undefined' ? null : document;\n}\n\nlet warnedNoDom = false;\n\n/** Say once why the numbers are empty. Silent under `{ raw: true }`. */\nfunction warnNoDom(raw: boolean): void {\n if (raw || warnedNoDom) return;\n warnedNoDom = true;\n console.warn(\n '[Tasty] tastyDebug reads the DOM and this environment has none, so the ' +\n 'result is empty. During SSR, read the ServerStyleCollector instead.',\n );\n}\n\n/**\n * The registry for `root`, with every queued write landed first.\n *\n * Every injector read API is a flush point, and the reads below reach past\n * those APIs straight into the registry and the sheet manager. Without this\n * they would report a batch window's contents as absent — a rule that is\n * enqueued but not yet in a sheet is missing from `globalRules`, from the\n * sheets, and from anything counting either.\n */\nfunction getRegistry(\n root: DebugRoot = defaultRoot(),\n): RootRegistry | undefined {\n if (!root) return undefined;\n flushStyles();\n\n return injector.instance._sheetManager?.getRegistry(root);\n}\n\nfunction findDomTastyClasses(root: DebugRoot = defaultRoot()): string[] {\n if (!root) return [];\n const classes = new Set<string>();\n const elements = (root as Document).querySelectorAll?.('[class]') || [];\n const classRegex = tastyClassRegex(getNamePrefix());\n for (const element of elements) {\n const attribute = element.getAttribute('class');\n if (!attribute) continue;\n for (const className of attribute.split(/\\s+/)) {\n if (classRegex.test(className)) classes.add(className);\n }\n }\n return sortTastyClasses(classes);\n}\n\n/**\n * Everything this injector holds in `root`, in the order the engine applies it,\n * with the sources kept byte-for-byte — trimming would report a total smaller\n * than one of its own parts whenever raw CSS has edge whitespace.\n */\nfunction getAllCSS(root: DebugRoot = defaultRoot()): string {\n const registry = getRegistry(root);\n const sheetManager = injector.instance._sheetManager;\n // `getRegistry` already returns nothing for a null root; the `!root` is what\n // narrows the type for the call below.\n if (!root || !registry || !sheetManager) return '';\n\n return sheetManager.getOwnedCSSInOrder(registry, root).join('\\n');\n}\n\n/**\n * The injector's own readers fall back to `document` when `root` is omitted, so\n * they have to be reached with a real root or not at all.\n */\nfunction cssTextForClasses(classNames: string[], root: DebugRoot): string {\n if (!root) return '';\n\n return injector.instance.getCSSTextForClasses(classNames, { root });\n}\n\nfunction getInjectorMetrics(root: DebugRoot): CacheMetrics | null {\n if (!root) return null;\n\n return injector.instance.getMetrics({ root });\n}\n\n/**\n * Injected classes that no element carries and nobody pinned — the exact set\n * `gc({ force: true })` would delete.\n *\n * Deliberately borrowed from the injector rather than recomputed here: the two\n * drifted apart once before, when this file still read \"unused\" off the pin\n * counts the render path had stopped maintaining.\n */\nfunction getUnusedClasses(root: DebugRoot = defaultRoot()): string[] {\n if (!root) return [];\n\n return sortTastyClasses(injector.instance.getUnusedClasses({ root }));\n}\n\n/** Every class this injector holds CSS for in `root`. */\nfunction getOwnedClasses(root: DebugRoot = defaultRoot()): string[] {\n const registry = getRegistry(root);\n if (!registry) return [];\n\n const owned: string[] = [];\n for (const [className, info] of registry.rules) {\n // A negative sheet index marks a class whose CSS this injector does not\n // hold: server-rendered, pre-allocated, or queued.\n if (info.sheetIndex >= 0) owned.push(className);\n }\n\n return sortTastyClasses(owned);\n}\n\n// ---------------------------------------------------------------------------\n// prettifyCSS — readable output for nested rules\n// ---------------------------------------------------------------------------\n\nfunction prettifyCSS(css: string): string {\n if (!css || !css.trim()) return '';\n\n const out: string[] = [];\n let depth = 0;\n\n const lines = css\n .replace(/\\s+/g, ' ')\n .trim()\n .replaceAll(' {', '{')\n .replaceAll('{', ' {\\n')\n .replaceAll('}', '\\n}\\n')\n .replaceAll(';', ';\\n')\n .split('\\n');\n\n for (let line of lines) {\n line = line.trim();\n if (!line) continue;\n\n if (line === '}') {\n const last = out.at(-1);\n if (last && !/[;{}]$/.test(last)) {\n out[out.length - 1] += ';';\n }\n depth = Math.max(0, depth - 1);\n }\n out.push(`${' '.repeat(depth)}${line}`);\n if (line.endsWith('{')) depth++;\n }\n\n return out.join('\\n');\n}\n\n// ---------------------------------------------------------------------------\n// Chunk helpers\n// ---------------------------------------------------------------------------\n\nfunction extractChunkName(cacheKey: string): string | null {\n for (const part of cacheKey.split('\\0')) {\n if (part.startsWith('[states:')) continue;\n if (!part.includes(':') && part.length > 0) return part;\n }\n return null;\n}\n\nfunction getChunkForClass(\n className: string,\n root: DebugRoot = defaultRoot(),\n): string | null {\n const registry = getRegistry(root);\n if (!registry) return null;\n for (const [key, cn] of registry.cacheKeyToClassName) {\n if (cn === className) return extractChunkName(key);\n }\n return null;\n}\n\nfunction buildChunkBreakdown(root: DebugRoot = defaultRoot()): ChunkBreakdown {\n const registry = getRegistry(root);\n if (!root || !registry)\n return { byChunk: {}, totalChunkTypes: 0, totalClasses: 0 };\n\n const byChunk: ChunkBreakdown['byChunk'] = {};\n for (const [cacheKey, className] of registry.cacheKeyToClassName) {\n const chunk = extractChunkName(cacheKey) || 'unknown';\n const entry = (byChunk[chunk] ??= {\n classes: [],\n cssSize: 0,\n ruleCount: 0,\n });\n entry.classes.push(className);\n const css = cssTextForClasses([className], root);\n entry.cssSize += css.length;\n entry.ruleCount += countRules(css);\n }\n\n const entries = Object.values(byChunk);\n for (const entry of entries) {\n entry.classes = sortTastyClasses(entry.classes);\n }\n\n const totalClasses = entries.reduce((sum, entry) => {\n return sum + entry.classes.length;\n }, 0);\n return {\n byChunk,\n totalChunkTypes: Object.keys(byChunk).length,\n totalClasses,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Global-type CSS helper (internal only)\n// ---------------------------------------------------------------------------\n\n/**\n * Every prefix `registry.globalRules` is keyed by. Anything missing here is a\n * rule the summary would hold but never count, which is how the totals stopped\n * adding up the first time.\n */\nconst GLOBAL_RULE_PREFIXES = {\n global: 'global:',\n property: 'property:',\n fontFace: 'fontface:',\n counterStyle: 'counterstyle:',\n function: 'function:',\n} as const;\n\nfunction getGlobalTypeCSS(\n type: keyof typeof GLOBAL_RULE_PREFIXES | 'raw' | 'keyframes',\n root: DebugRoot = defaultRoot(),\n includeCSS = true,\n): { css: string; ruleCount: number; size: number } {\n const registry = getRegistry(root);\n if (!root || !registry) return { css: '', ruleCount: 0, size: 0 };\n\n const chunks: string[] = [];\n const sheetManager = injector.instance._sheetManager;\n let rc = 0;\n\n if (type === 'raw') {\n // Raw blocks are kept by the sheet manager, not in `globalRules`, so the\n // prefix scan below never sees them — and their rules are counted from the\n // parsed sheet, since one raw block is one string but any number of rules.\n const css = injector.instance.getRawCSSText({ root });\n\n return {\n css: includeCSS ? prettifyCSS(css) : '',\n ruleCount: sheetManager?.getRawRuleCount(root) ?? 0,\n size: css.length,\n };\n }\n\n if (type === 'keyframes') {\n for (const [, entry] of registry.keyframesCache) {\n const info = entry.info;\n const sheetInfo = registry.sheets[info.sheetIndex];\n const ss =\n sheetInfo && sheetManager ? sheetManager.getCSSSheet(sheetInfo) : null;\n if (ss && info.ruleIndex < ss.cssRules.length) {\n const rule = ss.cssRules[info.ruleIndex];\n if (rule) {\n chunks.push(rule.cssText);\n rc++;\n }\n } else if (info.cssText) {\n chunks.push(info.cssText);\n rc++;\n }\n }\n } else {\n const prefix = GLOBAL_RULE_PREFIXES[type];\n for (const [key, ri] of registry.globalRules) {\n if (!key.startsWith(prefix)) continue;\n const sheetInfo = registry.sheets[ri.sheetIndex];\n const ss =\n sheetInfo && sheetManager ? sheetManager.getCSSSheet(sheetInfo) : null;\n if (ss) {\n const start = Math.max(0, ri.ruleIndex);\n const end = Math.min(\n ss.cssRules.length - 1,\n (ri.endRuleIndex as number) ?? ri.ruleIndex,\n );\n if (start >= 0 && end >= start && start < ss.cssRules.length) {\n for (let i = start; i <= end; i++) {\n const rule = ss.cssRules[i];\n if (rule) {\n chunks.push(rule.cssText);\n rc++;\n }\n }\n }\n } else if (ri.cssText?.length) {\n chunks.push(...ri.cssText);\n rc += ri.cssText.length;\n }\n }\n }\n\n const raw = chunks.join('\\n');\n return {\n css: includeCSS ? prettifyCSS(raw) : '',\n ruleCount: rc,\n size: raw.length,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Source CSS (dev-mode RuleInfo.cssText)\n// ---------------------------------------------------------------------------\n\nfunction getSourceCssForClasses(\n classNames: string[],\n root: DebugRoot = defaultRoot(),\n): string | null {\n const registry = getRegistry(root);\n if (!registry) return null;\n\n const chunks: string[] = [];\n let found = false;\n for (const cls of classNames) {\n const info = registry.rules.get(cls);\n if (info?.cssText?.length) {\n chunks.push(...info.cssText);\n found = true;\n }\n }\n return found ? chunks.join('\\n') : null;\n}\n\n// ---------------------------------------------------------------------------\n// Definitions helper (internal)\n// ---------------------------------------------------------------------------\n\nfunction getDefs(root: DebugRoot = defaultRoot()) {\n const registry = getRegistry(root);\n let properties: string[] = [];\n if (registry?.injectedProperties) {\n properties = Array.from(\n (registry.injectedProperties as Map<string, string>).keys(),\n ).sort();\n }\n\n const keyframes: { name: string; refCount: number }[] = [];\n if (registry) {\n for (const entry of registry.keyframesCache.values()) {\n keyframes.push({ name: entry.name, refCount: entry.refCount });\n }\n keyframes.sort((a, b) => a.name.localeCompare(b.name));\n }\n\n return { properties, keyframes };\n}\n\n// ---------------------------------------------------------------------------\n// Chunk display order\n// ---------------------------------------------------------------------------\n\nconst CHUNK_ORDER = [\n CHUNK_NAMES.COMBINED,\n CHUNK_NAMES.APPEARANCE,\n CHUNK_NAMES.FONT,\n CHUNK_NAMES.DIMENSION,\n CHUNK_NAMES.DISPLAY,\n CHUNK_NAMES.LAYOUT,\n CHUNK_NAMES.POSITION,\n CHUNK_NAMES.MISC,\n CHUNK_NAMES.SUBCOMPONENTS,\n];\n\nfunction logChunkEntries(breakdown: ChunkBreakdown): void {\n for (const name of CHUNK_ORDER) {\n const data = breakdown.byChunk[name];\n if (data)\n console.log(\n ` ${name}: ${data.classes.length} cls, ${data.ruleCount} rules, ${fmtSize(data.cssSize)}`,\n );\n }\n for (const [name, data] of Object.entries(breakdown.byChunk)) {\n if (!CHUNK_ORDER.includes(name as (typeof CHUNK_ORDER)[number]))\n console.log(\n ` ${name}: ${data.classes.length} cls, ${data.ruleCount} rules, ${fmtSize(data.cssSize)}`,\n );\n }\n}\n\n// ---------------------------------------------------------------------------\n// tastyDebug API\n// ---------------------------------------------------------------------------\n\nexport const tastyDebug = {\n css(target: CSSTarget, opts?: CSSOptions): string {\n const {\n root = defaultRoot(),\n prettify = true,\n raw = false,\n source = false,\n } = opts || {};\n if (!root) {\n warnNoDom(raw);\n\n return '';\n }\n let css = '';\n\n const classRegex = tastyClassRegex(getNamePrefix());\n if (source && typeof target === 'string' && classRegex.test(target)) {\n const src = getSourceCssForClasses([target], root);\n if (src) {\n css = src;\n } else {\n if (!raw) {\n console.warn(\n '[Tasty] source CSS not available (requires dev mode or TASTY_DEBUG=true). Falling back to live CSSOM.',\n );\n }\n css = cssTextForClasses([target], root);\n }\n } else if (source && Array.isArray(target)) {\n const src = getSourceCssForClasses(target, root);\n if (src) {\n css = src;\n } else {\n if (!raw) {\n console.warn(\n '[Tasty] source CSS not available. Falling back to live CSSOM.',\n );\n }\n css = cssTextForClasses(target, root);\n }\n } else if (typeof target === 'string') {\n if (target === 'all') {\n // Documented as component + global + raw, and raw has its own sheet.\n css = getAllCSS(root);\n } else if (target === 'global') {\n css = getGlobalTypeCSS('global', root).css;\n return css; // already prettified\n } else if (target === 'active') {\n const active = findDomTastyClasses(root);\n css = cssTextForClasses(active, root);\n } else if (target === 'unused') {\n const unused = getUnusedClasses(root);\n css = cssTextForClasses(unused, root);\n } else if (target === 'page') {\n css = getPageCSS(root);\n } else if (classRegex.test(target)) {\n css = cssTextForClasses([target], root);\n } else {\n const el = (root as Document).querySelector?.(target);\n if (el) css = getCSSTextForNode(el, { root });\n }\n } else if (Array.isArray(target)) {\n css = cssTextForClasses(target, root);\n } else if (target instanceof Element) {\n css = getCSSTextForNode(target, { root });\n }\n\n const result = prettify ? prettifyCSS(css) : css;\n\n if (!raw) {\n const label = Array.isArray(target) ? `[${target.join(', ')}]` : target;\n const rc = countRules(css);\n console.group(`CSS for ${label} (${rc} rules, ${fmtSize(css.length)})`);\n console.log(result || '(empty)');\n console.groupEnd();\n }\n\n return result;\n },\n\n inspect(target: string | Element, opts?: DebugOptions): InspectResult {\n const { root = defaultRoot(), raw = false } = opts || {};\n const element = !root\n ? null\n : typeof target === 'string'\n ? (root as Document).querySelector?.(target)\n : target;\n if (!root) warnNoDom(raw);\n\n if (!element) {\n const empty: InspectResult = {\n element: null,\n classes: [],\n chunks: [],\n css: '',\n size: 0,\n rules: 0,\n };\n // With no DOM at all, `warnNoDom` above already said why; \"element not\n // found\" would only misdirect.\n if (!raw && root)\n console.warn('[Tasty] debug.inspect: element not found');\n return empty;\n }\n\n const classList = element.getAttribute('class') || '';\n const classRegex = tastyClassRegex(getNamePrefix());\n const tastyClasses = classList\n .split(/\\s+/)\n .filter((cls) => classRegex.test(cls));\n\n const chunks: DebugChunkInfo[] = tastyClasses.map((className) => ({\n className,\n chunkName: getChunkForClass(className, root),\n }));\n\n const css = getCSSTextForNode(element, { root: root ?? undefined });\n const rules = countRules(css);\n\n const result: InspectResult = {\n element,\n classes: tastyClasses,\n chunks,\n css: prettifyCSS(css),\n size: css.length,\n rules,\n };\n\n if (!raw) {\n const tag = element.tagName.toLowerCase();\n const id = element.id ? `#${element.id}` : '';\n console.group(\n `inspect ${tag}${id} — ${tastyClasses.length} classes, ${rules} rules, ${fmtSize(css.length)}`,\n );\n if (chunks.length) {\n console.log(\n 'Chunks:',\n chunks.map((c) => `${c.className}→${c.chunkName || '?'}`).join(', '),\n );\n }\n console.groupCollapsed('CSS');\n console.log(result.css || '(empty)');\n console.groupEnd();\n console.groupEnd();\n }\n\n return result;\n },\n\n summary(opts?: DebugOptions): Summary {\n const { root = defaultRoot(), raw = false } = opts || {};\n if (!root) warnNoDom(raw);\n\n const activeClasses = findDomTastyClasses(root);\n const unusedClasses = getUnusedClasses(root);\n // Everything, not just the two bands above: a class that went cold a\n // moment ago is in neither, and dropping it here is the accounting failure\n // this whole change started from.\n const ownedClasses = getOwnedClasses(root);\n const totalStyledClasses = sortTastyClasses(\n new Set([...activeClasses, ...ownedClasses]),\n );\n const unusedSet = new Set(unusedClasses);\n const activeSet = new Set(activeClasses);\n const hotClasses = ownedClasses.filter(\n (className) => !activeSet.has(className) && !unusedSet.has(className),\n );\n const hotCSS = cssTextForClasses(hotClasses, root);\n\n const activeCSS = cssTextForClasses(activeClasses, root);\n const unusedCSS = cssTextForClasses(unusedClasses, root);\n const allCSS = getAllCSS(root);\n\n const activeRuleCount = countRules(activeCSS);\n const unusedRuleCount = countRules(unusedCSS);\n\n const globalData = getGlobalTypeCSS('global', root, false);\n const rawData = getGlobalTypeCSS('raw', root, false);\n const kfData = getGlobalTypeCSS('keyframes', root, false);\n const propData = getGlobalTypeCSS('property', root, false);\n // Folded into the global line rather than given their own: they are all\n // at-rules injected once and kept forever, and leaving them out of the\n // total is what made it not a total.\n const atRuleData = (\n ['fontFace', 'counterStyle', 'function'] as const\n ).reduce(\n (total, type) => {\n const data = getGlobalTypeCSS(type, root, false);\n total.ruleCount += data.ruleCount;\n total.size += data.size;\n return total;\n },\n { ruleCount: 0, size: 0 },\n );\n\n const hotRuleCount = countRules(hotCSS);\n const globalRuleCount = globalData.ruleCount + atRuleData.ruleCount;\n const globalCSSSize = globalData.size + atRuleData.size;\n\n const totalRuleCount =\n activeRuleCount +\n unusedRuleCount +\n hotRuleCount +\n globalRuleCount +\n rawData.ruleCount +\n kfData.ruleCount +\n propData.ruleCount;\n\n const metrics = getInjectorMetrics(root);\n const defs = getDefs(root);\n const chunkBreakdown = buildChunkBreakdown(root);\n\n const summary: Summary = {\n activeClasses,\n unusedClasses,\n hotClasses,\n totalStyledClasses,\n activeCSSSize: activeCSS.length,\n unusedCSSSize: unusedCSS.length,\n globalCSSSize,\n rawCSSSize: rawData.size,\n keyframesCSSSize: kfData.size,\n propertyCSSSize: propData.size,\n totalCSSSize: allCSS.length,\n activeRuleCount,\n unusedRuleCount,\n globalRuleCount,\n rawRuleCount: rawData.ruleCount,\n keyframesRuleCount: kfData.ruleCount,\n propertyRuleCount: propData.ruleCount,\n totalRuleCount,\n metrics,\n definedProperties: defs.properties,\n definedKeyframes: defs.keyframes,\n chunkBreakdown,\n };\n\n if (!raw) {\n console.group('Tasty Summary');\n console.log(\n `Active: ${activeClasses.length} classes, ${activeRuleCount} rules, ${fmtSize(activeCSS.length)}`,\n );\n console.log(\n `Unused: ${unusedClasses.length} classes, ${unusedRuleCount} rules, ${fmtSize(unusedCSS.length)}`,\n );\n if (hotClasses.length)\n console.log(\n `Held: ${hotClasses.length} classes, ${hotRuleCount} rules, ${fmtSize(hotCSS.length)} (not rendered, not yet collectable)`,\n );\n console.log(\n `Global: ${globalRuleCount} rules, ${fmtSize(globalCSSSize)}`,\n );\n if (rawData.ruleCount)\n console.log(\n `Raw: ${rawData.ruleCount} rules, ${fmtSize(rawData.size)}`,\n );\n if (kfData.ruleCount)\n console.log(\n `Keyframes: ${kfData.ruleCount} rules, ${fmtSize(kfData.size)}`,\n );\n if (propData.ruleCount)\n console.log(\n `@property: ${propData.ruleCount} rules, ${fmtSize(propData.size)}`,\n );\n console.log(\n `Total: ${totalStyledClasses.length} classes, ${totalRuleCount} rules, ${fmtSize(allCSS.length)}`,\n );\n\n if (metrics) {\n const total = metrics.hits + metrics.misses;\n const rate = total > 0 ? ((metrics.hits / total) * 100).toFixed(1) : 0;\n console.log(`Cache: ${rate}% hit rate (${total} lookups)`);\n }\n\n if (chunkBreakdown.totalChunkTypes > 0) {\n console.groupCollapsed(\n `Chunks (${chunkBreakdown.totalChunkTypes} types, ${chunkBreakdown.totalClasses} classes)`,\n );\n logChunkEntries(chunkBreakdown);\n console.groupEnd();\n }\n\n if (defs.properties.length || defs.keyframes.length) {\n console.log(\n `Defs: ${defs.properties.length} @property, ${defs.keyframes.length} @keyframes`,\n );\n }\n\n console.groupEnd();\n }\n\n return summary;\n },\n\n chunks(opts?: DebugOptions): ChunkBreakdown {\n const { root = defaultRoot(), raw = false } = opts || {};\n if (!root) warnNoDom(raw);\n const breakdown = buildChunkBreakdown(root);\n\n if (!raw) {\n console.group(\n `Chunks (${breakdown.totalChunkTypes} types, ${breakdown.totalClasses} classes)`,\n );\n logChunkEntries(breakdown);\n console.groupEnd();\n }\n\n return breakdown;\n },\n\n cache(opts?: DebugOptions): CacheStatus {\n const { root = defaultRoot(), raw = false } = opts || {};\n if (!root) warnNoDom(raw);\n const active = findDomTastyClasses(root);\n const unused = getUnusedClasses(root);\n const metrics = getInjectorMetrics(root);\n\n // `all` is everything held, not the two bands above: a class that went cold\n // a moment ago is in neither, and it is still taking up a sheet.\n const all = sortTastyClasses(\n new Set([...active, ...getOwnedClasses(root)]),\n );\n\n const status: CacheStatus = {\n classes: { active, unused, all },\n metrics,\n };\n\n if (!raw) {\n console.group('Cache');\n console.log(`Active: ${active.length}, Unused: ${unused.length}`);\n if (metrics) {\n const total = metrics.hits + metrics.misses;\n const rate = total > 0 ? ((metrics.hits / total) * 100).toFixed(1) : 0;\n console.log(\n `Hits: ${metrics.hits}, Misses: ${metrics.misses}, Rate: ${rate}%`,\n );\n }\n console.groupEnd();\n }\n\n return status;\n },\n\n cleanup(opts?: { root?: Document | ShadowRoot }): void {\n const root = opts?.root ?? defaultRoot();\n if (!root) return;\n injector.instance.cleanup(root);\n },\n\n help(): void {\n console.log(`tastyDebug API:\n .summary() — overview (classes, rules, sizes)\n .css(\"active\") — CSS for classes in DOM\n .css(\"t42\") — CSS for a specific class\n .css(\"t42\",{source:1})— original CSS before browser parsing (dev only)\n .css(\".selector\") — CSS for a DOM element\n .inspect(\".selector\") — element details (classes, chunks, rules)\n .chunks() — style chunk breakdown\n .cache() — cache status and metrics\n .cleanup() — force unused style cleanup\nOptions: { raw: true } suppresses logging, { root: shadowRoot } targets Shadow DOM`);\n },\n\n install(): void {\n if (typeof window !== 'undefined' && window.tastyDebug !== tastyDebug) {\n window.tastyDebug = tastyDebug;\n console.log('tastyDebug installed. Run tastyDebug.help() for commands.');\n }\n },\n};\n\n// ---------------------------------------------------------------------------\n// Page CSS (minimal, kept internal)\n// ---------------------------------------------------------------------------\n\nfunction getPageCSS(root: DebugRoot = defaultRoot()): string {\n if (!root) return '';\n const chunks: string[] = [];\n try {\n if ('styleSheets' in root) {\n for (const sheet of Array.from((root as Document).styleSheets)) {\n try {\n if (sheet.cssRules)\n chunks.push(\n Array.from(sheet.cssRules)\n .map((r) => r.cssText)\n .join('\\n'),\n );\n } catch {\n /* cross-origin */\n }\n }\n }\n } catch {\n /* ignore */\n }\n return chunks.join('\\n');\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"debug-CiiHDgmR.js","names":[],"sources":["../../src/debug.ts"],"sourcesContent":["/* eslint-disable no-console */\nimport { CHUNK_NAMES } from './chunks/definitions';\nimport { getNamePrefix } from './config';\nimport { flushStyles, getCSSTextForNode, injector } from './injector';\nimport type { CacheMetrics, RootRegistry } from './injector/types';\nimport { tastyClassRegex } from './utils/name-prefix';\n\ndeclare global {\n interface Window {\n tastyDebug?: typeof tastyDebug;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype CSSTarget =\n 'all' | 'global' | 'active' | 'unused' | 'page' | string | string[] | Element;\n\nexport interface DebugOptions {\n root?: Document | ShadowRoot;\n /** Suppress console logging and return data only (default: false) */\n raw?: boolean;\n}\n\nexport interface CSSOptions extends DebugOptions {\n prettify?: boolean;\n /** Read from stored source CSS (dev-mode only) instead of live CSSOM */\n source?: boolean;\n}\n\nexport interface DebugChunkInfo {\n className: string;\n chunkName: string | null;\n}\n\nexport interface InspectResult {\n element?: Element | null;\n classes: string[];\n chunks: DebugChunkInfo[];\n css: string;\n size: number;\n rules: number;\n}\n\nexport interface CacheStatus {\n classes: {\n active: string[];\n unused: string[];\n all: string[];\n };\n metrics: CacheMetrics | null;\n}\n\nexport interface ChunkBreakdown {\n byChunk: Record<\n string,\n { classes: string[]; cssSize: number; ruleCount: number }\n >;\n totalChunkTypes: number;\n totalClasses: number;\n}\n\nexport interface Summary {\n activeClasses: string[];\n /** Classes `gc({ force: true })` would delete right now. */\n unusedClasses: string[];\n /**\n * Held but in neither list: nothing renders them, yet collection will not\n * take them — inside the grace window, or pinned by an `inject()` handle.\n */\n hotClasses: string[];\n totalStyledClasses: string[];\n\n activeCSSSize: number;\n unusedCSSSize: number;\n globalCSSSize: number;\n rawCSSSize: number;\n keyframesCSSSize: number;\n propertyCSSSize: number;\n totalCSSSize: number;\n\n activeRuleCount: number;\n unusedRuleCount: number;\n globalRuleCount: number;\n rawRuleCount: number;\n keyframesRuleCount: number;\n propertyRuleCount: number;\n totalRuleCount: number;\n\n metrics: CacheMetrics | null;\n definedProperties: string[];\n definedKeyframes: { name: string; refCount: number }[];\n chunkBreakdown: ChunkBreakdown;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction fmtSize(bytes: number): string {\n return bytes > 1024 ? `${(bytes / 1024).toFixed(1)}KB` : `${bytes}B`;\n}\n\nfunction countRules(css: string): number {\n return (css.match(/\\{[^}]*\\}/g) || []).length;\n}\n\nfunction sortTastyClasses(classes: Iterable<string>): string[] {\n // Class names use a base36 hash format (e.g. `t3a5f`), so sort lexicographically.\n return Array.from(classes).sort((a, b) => a.localeCompare(b));\n}\n\n/** A DOM root to read, or `null` when the environment has no DOM at all. */\ntype DebugRoot = Document | ShadowRoot | null;\n\n/**\n * The root these helpers read, or `null` where there is no DOM.\n *\n * `document` used to be a default parameter value, and a default is evaluated\n * at the call site — so every read below threw a bare `ReferenceError` under\n * Node, taking out five of the eight public methods. A debug utility must not\n * be able to fail an SSR render because a call was left in, so the DOM-less\n * case reports an empty result and says why.\n */\nfunction defaultRoot(): DebugRoot {\n return typeof document === 'undefined' ? null : document;\n}\n\nlet warnedNoDom = false;\n\n/** Say once why the numbers are empty. Silent under `{ raw: true }`. */\nfunction warnNoDom(raw: boolean): void {\n if (raw || warnedNoDom) return;\n warnedNoDom = true;\n console.warn(\n '[Tasty] tastyDebug reads the DOM and this environment has none, so the ' +\n 'result is empty. During SSR, read the ServerStyleCollector instead.',\n );\n}\n\n/**\n * The registry for `root`, with every queued write landed first.\n *\n * Every injector read API is a flush point, and the reads below reach past\n * those APIs straight into the registry and the sheet manager. Without this\n * they would report a batch window's contents as absent — a rule that is\n * enqueued but not yet in a sheet is missing from `globalRules`, from the\n * sheets, and from anything counting either.\n */\nfunction getRegistry(\n root: DebugRoot = defaultRoot(),\n): RootRegistry | undefined {\n if (!root) return undefined;\n flushStyles();\n\n return injector.instance._sheetManager?.getRegistry(root);\n}\n\nfunction findDomTastyClasses(root: DebugRoot = defaultRoot()): string[] {\n if (!root) return [];\n const classes = new Set<string>();\n const elements = (root as Document).querySelectorAll?.('[class]') || [];\n const classRegex = tastyClassRegex(getNamePrefix());\n for (const element of elements) {\n const attribute = element.getAttribute('class');\n if (!attribute) continue;\n for (const className of attribute.split(/\\s+/)) {\n if (classRegex.test(className)) classes.add(className);\n }\n }\n return sortTastyClasses(classes);\n}\n\n/**\n * Everything this injector holds in `root`, in the order the engine applies it,\n * with the sources kept byte-for-byte — trimming would report a total smaller\n * than one of its own parts whenever raw CSS has edge whitespace.\n */\nfunction getAllCSS(root: DebugRoot = defaultRoot()): string {\n const registry = getRegistry(root);\n const sheetManager = injector.instance._sheetManager;\n // `getRegistry` already returns nothing for a null root; the `!root` is what\n // narrows the type for the call below.\n if (!root || !registry || !sheetManager) return '';\n\n return sheetManager.getOwnedCSSInOrder(registry, root).join('\\n');\n}\n\n/**\n * The injector's own readers fall back to `document` when `root` is omitted, so\n * they have to be reached with a real root or not at all.\n */\nfunction cssTextForClasses(classNames: string[], root: DebugRoot): string {\n if (!root) return '';\n\n return injector.instance.getCSSTextForClasses(classNames, { root });\n}\n\nfunction getInjectorMetrics(root: DebugRoot): CacheMetrics | null {\n if (!root) return null;\n\n return injector.instance.getMetrics({ root });\n}\n\n/**\n * Injected classes that no element carries and nobody pinned — the exact set\n * `gc({ force: true })` would delete.\n *\n * Deliberately borrowed from the injector rather than recomputed here: the two\n * drifted apart once before, when this file still read \"unused\" off the pin\n * counts the render path had stopped maintaining.\n */\nfunction getUnusedClasses(root: DebugRoot = defaultRoot()): string[] {\n if (!root) return [];\n\n return sortTastyClasses(injector.instance.getUnusedClasses({ root }));\n}\n\n/** Every class this injector holds CSS for in `root`. */\nfunction getOwnedClasses(root: DebugRoot = defaultRoot()): string[] {\n const registry = getRegistry(root);\n if (!registry) return [];\n\n const owned: string[] = [];\n for (const [className, info] of registry.rules) {\n // A negative sheet index marks a class whose CSS this injector does not\n // hold: server-rendered, pre-allocated, or queued.\n if (info.sheetIndex >= 0) owned.push(className);\n }\n\n return sortTastyClasses(owned);\n}\n\n// ---------------------------------------------------------------------------\n// prettifyCSS — readable output for nested rules\n// ---------------------------------------------------------------------------\n\nfunction prettifyCSS(css: string): string {\n if (!css || !css.trim()) return '';\n\n const out: string[] = [];\n let depth = 0;\n\n const lines = css\n .replace(/\\s+/g, ' ')\n .trim()\n .replaceAll(' {', '{')\n .replaceAll('{', ' {\\n')\n .replaceAll('}', '\\n}\\n')\n .replaceAll(';', ';\\n')\n .split('\\n');\n\n for (let line of lines) {\n line = line.trim();\n if (!line) continue;\n\n if (line === '}') {\n const last = out.at(-1);\n if (last && !/[;{}]$/.test(last)) {\n out[out.length - 1] += ';';\n }\n depth = Math.max(0, depth - 1);\n }\n out.push(`${' '.repeat(depth)}${line}`);\n if (line.endsWith('{')) depth++;\n }\n\n return out.join('\\n');\n}\n\n// ---------------------------------------------------------------------------\n// Chunk helpers\n// ---------------------------------------------------------------------------\n\nfunction extractChunkName(cacheKey: string): string | null {\n for (const part of cacheKey.split('\\0')) {\n if (part.startsWith('[states:')) continue;\n if (!part.includes(':') && part.length > 0) return part;\n }\n return null;\n}\n\nfunction getChunkForClass(\n className: string,\n root: DebugRoot = defaultRoot(),\n): string | null {\n const registry = getRegistry(root);\n if (!registry) return null;\n for (const [key, cn] of registry.cacheKeyToClassName) {\n if (cn === className) return extractChunkName(key);\n }\n return null;\n}\n\nfunction buildChunkBreakdown(root: DebugRoot = defaultRoot()): ChunkBreakdown {\n const registry = getRegistry(root);\n if (!root || !registry)\n return { byChunk: {}, totalChunkTypes: 0, totalClasses: 0 };\n\n const byChunk: ChunkBreakdown['byChunk'] = {};\n for (const [cacheKey, className] of registry.cacheKeyToClassName) {\n const chunk = extractChunkName(cacheKey) || 'unknown';\n const entry = (byChunk[chunk] ??= {\n classes: [],\n cssSize: 0,\n ruleCount: 0,\n });\n entry.classes.push(className);\n const css = cssTextForClasses([className], root);\n entry.cssSize += css.length;\n entry.ruleCount += countRules(css);\n }\n\n const entries = Object.values(byChunk);\n for (const entry of entries) {\n entry.classes = sortTastyClasses(entry.classes);\n }\n\n const totalClasses = entries.reduce((sum, entry) => {\n return sum + entry.classes.length;\n }, 0);\n return {\n byChunk,\n totalChunkTypes: Object.keys(byChunk).length,\n totalClasses,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Global-type CSS helper (internal only)\n// ---------------------------------------------------------------------------\n\n/**\n * Every prefix `registry.globalRules` is keyed by. Anything missing here is a\n * rule the summary would hold but never count, which is how the totals stopped\n * adding up the first time.\n */\nconst GLOBAL_RULE_PREFIXES = {\n global: 'global:',\n property: 'property:',\n fontFace: 'fontface:',\n counterStyle: 'counterstyle:',\n function: 'function:',\n} as const;\n\nfunction getGlobalTypeCSS(\n type: keyof typeof GLOBAL_RULE_PREFIXES | 'raw' | 'keyframes',\n root: DebugRoot = defaultRoot(),\n includeCSS = true,\n): { css: string; ruleCount: number; size: number } {\n const registry = getRegistry(root);\n if (!root || !registry) return { css: '', ruleCount: 0, size: 0 };\n\n const chunks: string[] = [];\n const sheetManager = injector.instance._sheetManager;\n let rc = 0;\n\n if (type === 'raw') {\n // Raw blocks are kept by the sheet manager, not in `globalRules`, so the\n // prefix scan below never sees them — and their rules are counted from the\n // parsed sheet, since one raw block is one string but any number of rules.\n const css = injector.instance.getRawCSSText({ root });\n\n return {\n css: includeCSS ? prettifyCSS(css) : '',\n ruleCount: sheetManager?.getRawRuleCount(root) ?? 0,\n size: css.length,\n };\n }\n\n if (type === 'keyframes') {\n for (const [, entry] of registry.keyframesCache) {\n const info = entry.info;\n const sheetInfo = registry.sheets[info.sheetIndex];\n const ss =\n sheetInfo && sheetManager ? sheetManager.getCSSSheet(sheetInfo) : null;\n if (ss && info.ruleIndex < ss.cssRules.length) {\n const rule = ss.cssRules[info.ruleIndex];\n if (rule) {\n chunks.push(rule.cssText);\n rc++;\n }\n } else if (info.cssText) {\n chunks.push(info.cssText);\n rc++;\n }\n }\n } else {\n const prefix = GLOBAL_RULE_PREFIXES[type];\n for (const [key, ri] of registry.globalRules) {\n if (!key.startsWith(prefix)) continue;\n const sheetInfo = registry.sheets[ri.sheetIndex];\n const ss =\n sheetInfo && sheetManager ? sheetManager.getCSSSheet(sheetInfo) : null;\n if (ss) {\n const start = Math.max(0, ri.ruleIndex);\n const end = Math.min(\n ss.cssRules.length - 1,\n (ri.endRuleIndex as number) ?? ri.ruleIndex,\n );\n if (start >= 0 && end >= start && start < ss.cssRules.length) {\n for (let i = start; i <= end; i++) {\n const rule = ss.cssRules[i];\n if (rule) {\n chunks.push(rule.cssText);\n rc++;\n }\n }\n }\n } else if (ri.cssText?.length) {\n chunks.push(...ri.cssText);\n rc += ri.cssText.length;\n }\n }\n }\n\n const raw = chunks.join('\\n');\n return {\n css: includeCSS ? prettifyCSS(raw) : '',\n ruleCount: rc,\n size: raw.length,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Source CSS (dev-mode RuleInfo.cssText)\n// ---------------------------------------------------------------------------\n\nfunction getSourceCssForClasses(\n classNames: string[],\n root: DebugRoot = defaultRoot(),\n): string | null {\n const registry = getRegistry(root);\n if (!registry) return null;\n\n const chunks: string[] = [];\n let found = false;\n for (const cls of classNames) {\n const info = registry.rules.get(cls);\n if (info?.cssText?.length) {\n chunks.push(...info.cssText);\n found = true;\n }\n }\n return found ? chunks.join('\\n') : null;\n}\n\n// ---------------------------------------------------------------------------\n// Definitions helper (internal)\n// ---------------------------------------------------------------------------\n\nfunction getDefs(root: DebugRoot = defaultRoot()) {\n const registry = getRegistry(root);\n let properties: string[] = [];\n if (registry?.injectedProperties) {\n properties = Array.from(\n (registry.injectedProperties as Map<string, string>).keys(),\n ).sort();\n }\n\n const keyframes: { name: string; refCount: number }[] = [];\n if (registry) {\n for (const entry of registry.keyframesCache.values()) {\n keyframes.push({ name: entry.name, refCount: entry.refCount });\n }\n keyframes.sort((a, b) => a.name.localeCompare(b.name));\n }\n\n return { properties, keyframes };\n}\n\n// ---------------------------------------------------------------------------\n// Chunk display order\n// ---------------------------------------------------------------------------\n\nconst CHUNK_ORDER = [\n CHUNK_NAMES.COMBINED,\n CHUNK_NAMES.APPEARANCE,\n CHUNK_NAMES.FONT,\n CHUNK_NAMES.DIMENSION,\n CHUNK_NAMES.DISPLAY,\n CHUNK_NAMES.LAYOUT,\n CHUNK_NAMES.POSITION,\n CHUNK_NAMES.MISC,\n CHUNK_NAMES.SUBCOMPONENTS,\n];\n\nfunction logChunkEntries(breakdown: ChunkBreakdown): void {\n for (const name of CHUNK_ORDER) {\n const data = breakdown.byChunk[name];\n if (data)\n console.log(\n ` ${name}: ${data.classes.length} cls, ${data.ruleCount} rules, ${fmtSize(data.cssSize)}`,\n );\n }\n for (const [name, data] of Object.entries(breakdown.byChunk)) {\n if (!CHUNK_ORDER.includes(name as (typeof CHUNK_ORDER)[number]))\n console.log(\n ` ${name}: ${data.classes.length} cls, ${data.ruleCount} rules, ${fmtSize(data.cssSize)}`,\n );\n }\n}\n\n// ---------------------------------------------------------------------------\n// tastyDebug API\n// ---------------------------------------------------------------------------\n\nexport const tastyDebug = {\n css(target: CSSTarget, opts?: CSSOptions): string {\n const {\n root = defaultRoot(),\n prettify = true,\n raw = false,\n source = false,\n } = opts || {};\n if (!root) {\n warnNoDom(raw);\n\n return '';\n }\n let css = '';\n\n const classRegex = tastyClassRegex(getNamePrefix());\n if (source && typeof target === 'string' && classRegex.test(target)) {\n const src = getSourceCssForClasses([target], root);\n if (src) {\n css = src;\n } else {\n if (!raw) {\n console.warn(\n '[Tasty] source CSS not available (requires dev mode or TASTY_DEBUG=true). Falling back to live CSSOM.',\n );\n }\n css = cssTextForClasses([target], root);\n }\n } else if (source && Array.isArray(target)) {\n const src = getSourceCssForClasses(target, root);\n if (src) {\n css = src;\n } else {\n if (!raw) {\n console.warn(\n '[Tasty] source CSS not available. Falling back to live CSSOM.',\n );\n }\n css = cssTextForClasses(target, root);\n }\n } else if (typeof target === 'string') {\n if (target === 'all') {\n // Documented as component + global + raw, and raw has its own sheet.\n css = getAllCSS(root);\n } else if (target === 'global') {\n css = getGlobalTypeCSS('global', root).css;\n return css; // already prettified\n } else if (target === 'active') {\n const active = findDomTastyClasses(root);\n css = cssTextForClasses(active, root);\n } else if (target === 'unused') {\n const unused = getUnusedClasses(root);\n css = cssTextForClasses(unused, root);\n } else if (target === 'page') {\n css = getPageCSS(root);\n } else if (classRegex.test(target)) {\n css = cssTextForClasses([target], root);\n } else {\n const el = (root as Document).querySelector?.(target);\n if (el) css = getCSSTextForNode(el, { root });\n }\n } else if (Array.isArray(target)) {\n css = cssTextForClasses(target, root);\n } else if (target instanceof Element) {\n css = getCSSTextForNode(target, { root });\n }\n\n const result = prettify ? prettifyCSS(css) : css;\n\n if (!raw) {\n const label = Array.isArray(target) ? `[${target.join(', ')}]` : target;\n const rc = countRules(css);\n console.group(`CSS for ${label} (${rc} rules, ${fmtSize(css.length)})`);\n console.log(result || '(empty)');\n console.groupEnd();\n }\n\n return result;\n },\n\n inspect(target: string | Element, opts?: DebugOptions): InspectResult {\n const { root = defaultRoot(), raw = false } = opts || {};\n const element = !root\n ? null\n : typeof target === 'string'\n ? (root as Document).querySelector?.(target)\n : target;\n if (!root) warnNoDom(raw);\n\n if (!element) {\n const empty: InspectResult = {\n element: null,\n classes: [],\n chunks: [],\n css: '',\n size: 0,\n rules: 0,\n };\n // With no DOM at all, `warnNoDom` above already said why; \"element not\n // found\" would only misdirect.\n if (!raw && root)\n console.warn('[Tasty] debug.inspect: element not found');\n return empty;\n }\n\n const classList = element.getAttribute('class') || '';\n const classRegex = tastyClassRegex(getNamePrefix());\n const tastyClasses = classList\n .split(/\\s+/)\n .filter((cls) => classRegex.test(cls));\n\n const chunks: DebugChunkInfo[] = tastyClasses.map((className) => ({\n className,\n chunkName: getChunkForClass(className, root),\n }));\n\n const css = getCSSTextForNode(element, { root: root ?? undefined });\n const rules = countRules(css);\n\n const result: InspectResult = {\n element,\n classes: tastyClasses,\n chunks,\n css: prettifyCSS(css),\n size: css.length,\n rules,\n };\n\n if (!raw) {\n const tag = element.tagName.toLowerCase();\n const id = element.id ? `#${element.id}` : '';\n console.group(\n `inspect ${tag}${id} — ${tastyClasses.length} classes, ${rules} rules, ${fmtSize(css.length)}`,\n );\n if (chunks.length) {\n console.log(\n 'Chunks:',\n chunks.map((c) => `${c.className}→${c.chunkName || '?'}`).join(', '),\n );\n }\n console.groupCollapsed('CSS');\n console.log(result.css || '(empty)');\n console.groupEnd();\n console.groupEnd();\n }\n\n return result;\n },\n\n summary(opts?: DebugOptions): Summary {\n const { root = defaultRoot(), raw = false } = opts || {};\n if (!root) warnNoDom(raw);\n\n const activeClasses = findDomTastyClasses(root);\n const unusedClasses = getUnusedClasses(root);\n // Everything, not just the two bands above: a class that went cold a\n // moment ago is in neither, and dropping it here is the accounting failure\n // this whole change started from.\n const ownedClasses = getOwnedClasses(root);\n const totalStyledClasses = sortTastyClasses(\n new Set([...activeClasses, ...ownedClasses]),\n );\n const unusedSet = new Set(unusedClasses);\n const activeSet = new Set(activeClasses);\n const hotClasses = ownedClasses.filter(\n (className) => !activeSet.has(className) && !unusedSet.has(className),\n );\n const hotCSS = cssTextForClasses(hotClasses, root);\n\n const activeCSS = cssTextForClasses(activeClasses, root);\n const unusedCSS = cssTextForClasses(unusedClasses, root);\n const allCSS = getAllCSS(root);\n\n const activeRuleCount = countRules(activeCSS);\n const unusedRuleCount = countRules(unusedCSS);\n\n const globalData = getGlobalTypeCSS('global', root, false);\n const rawData = getGlobalTypeCSS('raw', root, false);\n const kfData = getGlobalTypeCSS('keyframes', root, false);\n const propData = getGlobalTypeCSS('property', root, false);\n // Folded into the global line rather than given their own: they are all\n // at-rules injected once and kept forever, and leaving them out of the\n // total is what made it not a total.\n const atRuleData = (\n ['fontFace', 'counterStyle', 'function'] as const\n ).reduce(\n (total, type) => {\n const data = getGlobalTypeCSS(type, root, false);\n total.ruleCount += data.ruleCount;\n total.size += data.size;\n return total;\n },\n { ruleCount: 0, size: 0 },\n );\n\n const hotRuleCount = countRules(hotCSS);\n const globalRuleCount = globalData.ruleCount + atRuleData.ruleCount;\n const globalCSSSize = globalData.size + atRuleData.size;\n\n const totalRuleCount =\n activeRuleCount +\n unusedRuleCount +\n hotRuleCount +\n globalRuleCount +\n rawData.ruleCount +\n kfData.ruleCount +\n propData.ruleCount;\n\n const metrics = getInjectorMetrics(root);\n const defs = getDefs(root);\n const chunkBreakdown = buildChunkBreakdown(root);\n\n const summary: Summary = {\n activeClasses,\n unusedClasses,\n hotClasses,\n totalStyledClasses,\n activeCSSSize: activeCSS.length,\n unusedCSSSize: unusedCSS.length,\n globalCSSSize,\n rawCSSSize: rawData.size,\n keyframesCSSSize: kfData.size,\n propertyCSSSize: propData.size,\n totalCSSSize: allCSS.length,\n activeRuleCount,\n unusedRuleCount,\n globalRuleCount,\n rawRuleCount: rawData.ruleCount,\n keyframesRuleCount: kfData.ruleCount,\n propertyRuleCount: propData.ruleCount,\n totalRuleCount,\n metrics,\n definedProperties: defs.properties,\n definedKeyframes: defs.keyframes,\n chunkBreakdown,\n };\n\n if (!raw) {\n console.group('Tasty Summary');\n console.log(\n `Active: ${activeClasses.length} classes, ${activeRuleCount} rules, ${fmtSize(activeCSS.length)}`,\n );\n console.log(\n `Unused: ${unusedClasses.length} classes, ${unusedRuleCount} rules, ${fmtSize(unusedCSS.length)}`,\n );\n if (hotClasses.length)\n console.log(\n `Held: ${hotClasses.length} classes, ${hotRuleCount} rules, ${fmtSize(hotCSS.length)} (not rendered, not yet collectable)`,\n );\n console.log(\n `Global: ${globalRuleCount} rules, ${fmtSize(globalCSSSize)}`,\n );\n if (rawData.ruleCount)\n console.log(\n `Raw: ${rawData.ruleCount} rules, ${fmtSize(rawData.size)}`,\n );\n if (kfData.ruleCount)\n console.log(\n `Keyframes: ${kfData.ruleCount} rules, ${fmtSize(kfData.size)}`,\n );\n if (propData.ruleCount)\n console.log(\n `@property: ${propData.ruleCount} rules, ${fmtSize(propData.size)}`,\n );\n console.log(\n `Total: ${totalStyledClasses.length} classes, ${totalRuleCount} rules, ${fmtSize(allCSS.length)}`,\n );\n\n if (metrics) {\n const total = metrics.hits + metrics.misses;\n const rate = total > 0 ? ((metrics.hits / total) * 100).toFixed(1) : 0;\n console.log(`Cache: ${rate}% hit rate (${total} lookups)`);\n }\n\n if (chunkBreakdown.totalChunkTypes > 0) {\n console.groupCollapsed(\n `Chunks (${chunkBreakdown.totalChunkTypes} types, ${chunkBreakdown.totalClasses} classes)`,\n );\n logChunkEntries(chunkBreakdown);\n console.groupEnd();\n }\n\n if (defs.properties.length || defs.keyframes.length) {\n console.log(\n `Defs: ${defs.properties.length} @property, ${defs.keyframes.length} @keyframes`,\n );\n }\n\n console.groupEnd();\n }\n\n return summary;\n },\n\n chunks(opts?: DebugOptions): ChunkBreakdown {\n const { root = defaultRoot(), raw = false } = opts || {};\n if (!root) warnNoDom(raw);\n const breakdown = buildChunkBreakdown(root);\n\n if (!raw) {\n console.group(\n `Chunks (${breakdown.totalChunkTypes} types, ${breakdown.totalClasses} classes)`,\n );\n logChunkEntries(breakdown);\n console.groupEnd();\n }\n\n return breakdown;\n },\n\n cache(opts?: DebugOptions): CacheStatus {\n const { root = defaultRoot(), raw = false } = opts || {};\n if (!root) warnNoDom(raw);\n const active = findDomTastyClasses(root);\n const unused = getUnusedClasses(root);\n const metrics = getInjectorMetrics(root);\n\n // `all` is everything held, not the two bands above: a class that went cold\n // a moment ago is in neither, and it is still taking up a sheet.\n const all = sortTastyClasses(\n new Set([...active, ...getOwnedClasses(root)]),\n );\n\n const status: CacheStatus = {\n classes: { active, unused, all },\n metrics,\n };\n\n if (!raw) {\n console.group('Cache');\n console.log(`Active: ${active.length}, Unused: ${unused.length}`);\n if (metrics) {\n const total = metrics.hits + metrics.misses;\n const rate = total > 0 ? ((metrics.hits / total) * 100).toFixed(1) : 0;\n console.log(\n `Hits: ${metrics.hits}, Misses: ${metrics.misses}, Rate: ${rate}%`,\n );\n }\n console.groupEnd();\n }\n\n return status;\n },\n\n cleanup(opts?: { root?: Document | ShadowRoot }): void {\n const root = opts?.root ?? defaultRoot();\n if (!root) return;\n injector.instance.cleanup(root);\n },\n\n help(): void {\n console.log(`tastyDebug API:\n .summary() — overview (classes, rules, sizes)\n .css(\"active\") — CSS for classes in DOM\n .css(\"t42\") — CSS for a specific class\n .css(\"t42\",{source:1})— original CSS before browser parsing (dev only)\n .css(\".selector\") — CSS for a DOM element\n .inspect(\".selector\") — element details (classes, chunks, rules)\n .chunks() — style chunk breakdown\n .cache() — cache status and metrics\n .cleanup() — force unused style cleanup\nOptions: { raw: true } suppresses logging, { root: shadowRoot } targets Shadow DOM`);\n },\n\n install(): void {\n if (typeof window !== 'undefined' && window.tastyDebug !== tastyDebug) {\n window.tastyDebug = tastyDebug;\n console.log('tastyDebug installed. Run tastyDebug.help() for commands.');\n }\n },\n};\n\n// ---------------------------------------------------------------------------\n// Page CSS (minimal, kept internal)\n// ---------------------------------------------------------------------------\n\nfunction getPageCSS(root: DebugRoot = defaultRoot()): string {\n if (!root) return '';\n const chunks: string[] = [];\n try {\n if ('styleSheets' in root) {\n for (const sheet of Array.from((root as Document).styleSheets)) {\n try {\n if (sheet.cssRules)\n chunks.push(\n Array.from(sheet.cssRules)\n .map((r) => r.cssText)\n .join('\\n'),\n );\n } catch {\n /* cross-origin */\n }\n }\n }\n } catch {\n /* ignore */\n }\n return chunks.join('\\n');\n}\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { n as isSelector, t as mergeStyles } from "./shared-utils-DWA4LjIa.js";
2
2
  import { D as makeKeyframeName, E as makeCounterStyleName, U as parseFunctionName, V as formatFunctionRule, W as registerFunctionPolyfill, a as formatPropertyCSS, b as formatFontFaceRule, h as formatCounterStyleRule, i as formatKeyframesCSS, j as hashString, n as formatGlobalRules, v as fontFaceContentHash } from "./css-definitions-D_it4XZH.js";
3
3
  import { U as isFunctionsPolyfillEnabled, b as renderStyles, i as baseStylePropsRegistry, s as BASE_STYLES } from "./style-engine-C1ECBZxR.js";
4
- import { $ as propHandlerRegistry, B as getNamePrefix, E as injectRawCSS, I as getConfig, J as closeBatchWindow, L as getGlobalInjector, M as touch, T as injectGlobal, Z as openBatchWindow, c as hasKeys, d as getStyleTarget, f as pushRSCCSS, i as modAttrs, k as keyframes, l as collectAutoInferredProperties, n as createClientState, o as computeStyles, r as processTokens, s as resolveRecipes, t as depsEqual, u as collectAutoInferredPropertiesRSC } from "./runtime-engine-DvnE2g-E.js";
4
+ import { $ as propHandlerRegistry, B as getNamePrefix, E as injectRawCSS, I as getConfig, J as closeBatchWindow, L as getGlobalInjector, M as touch, T as injectGlobal, Z as openBatchWindow, c as hasKeys, d as getStyleTarget, f as pushRSCCSS, i as modAttrs, k as keyframes, l as collectAutoInferredProperties, n as createClientState, o as computeStyles, r as processTokens, s as resolveRecipes, t as depsEqual, u as collectAutoInferredPropertiesRSC } from "./runtime-engine-BrRcOZwD.js";
5
5
  import { Fragment, createContext, createElement, forwardRef, useContext, useInsertionEffect } from "react";
6
6
  //#region src/utils/get-display-name.ts
7
7
  const DEFAULT_NAME = "Anonymous";
@@ -554,4 +554,4 @@ function TastyBatchProvider({ children }) {
554
554
  //#endregion
555
555
  export { useProperty as a, useGlobalStyles as c, Element as d, tasty as f, useFontFace as i, useStyles as l, useFunction as n, useKeyframes as o, getDisplayName as p, useCounterStyle as r, useRawCSS as s, TastyBatchProvider as t, getTastySSRContext as u };
556
556
 
557
- //# sourceMappingURL=react-runtime-O-OUrKLH.js.map
557
+ //# sourceMappingURL=react-runtime-sH6r6Ajr.js.map