@tenphi/tasty 0.0.0-snapshot.db103fd → 0.0.0-snapshot.dc62ea3

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 (365) hide show
  1. package/README.md +196 -140
  2. package/dist/astro-CeYENy2x.js +301 -0
  3. package/dist/astro-CeYENy2x.js.map +1 -0
  4. package/dist/{ssr/async-storage.js → async-storage-DKK-wTD4.js} +16 -6
  5. package/dist/async-storage-DKK-wTD4.js.map +1 -0
  6. package/dist/babel-DWCsafYw.d.ts +83 -0
  7. package/dist/collector-B3OsM252.js +327 -0
  8. package/dist/collector-B3OsM252.js.map +1 -0
  9. package/dist/collector-BTVXj2hS.d.ts +163 -0
  10. package/dist/config-B3gPdCqd.js +12421 -0
  11. package/dist/config-B3gPdCqd.js.map +1 -0
  12. package/dist/config-LfIDmVHx.d.ts +1363 -0
  13. package/dist/context-CA8YKeMn.js +24 -0
  14. package/dist/context-CA8YKeMn.js.map +1 -0
  15. package/dist/core/index.d.ts +5 -33
  16. package/dist/core/index.js +6 -26
  17. package/dist/core-DGm0CFHP.js +1732 -0
  18. package/dist/core-DGm0CFHP.js.map +1 -0
  19. package/dist/css-resources-Cyl_axbI.js +149 -0
  20. package/dist/css-resources-Cyl_axbI.js.map +1 -0
  21. package/dist/{zero/extractor.js → css-writer-Bgowobbx.js} +148 -24
  22. package/dist/css-writer-Bgowobbx.js.map +1 -0
  23. package/dist/{ssr/format-global-rules.js → format-global-rules-DklyaXv-.js} +2 -2
  24. package/dist/format-global-rules-DklyaXv-.js.map +1 -0
  25. package/dist/{ssr/format-rules.js → format-rules-XRw9u7d4.js} +33 -2
  26. package/dist/format-rules-XRw9u7d4.js.map +1 -0
  27. package/dist/hydrate-CNOmZprz.js +37 -0
  28. package/dist/hydrate-CNOmZprz.js.map +1 -0
  29. package/dist/index-Bm9ltvdH.d.ts +1933 -0
  30. package/dist/index-BmogEzTo.d.ts +1575 -0
  31. package/dist/index.d.ts +5 -50
  32. package/dist/index.js +922 -35
  33. package/dist/index.js.map +1 -0
  34. package/dist/keyframes-DE-OE76F.js +535 -0
  35. package/dist/keyframes-DE-OE76F.js.map +1 -0
  36. package/dist/{utils/merge-styles.d.ts → merge-styles-BcLl1u_d.d.ts} +3 -3
  37. package/dist/{utils/merge-styles.js → merge-styles-DuoZEsm9.js} +3 -4
  38. package/dist/merge-styles-DuoZEsm9.js.map +1 -0
  39. package/dist/{utils/resolve-recipes.js → resolve-recipes-H9NqOQuP.js} +4 -6
  40. package/dist/resolve-recipes-H9NqOQuP.js.map +1 -0
  41. package/dist/ssr/astro-client.js +19 -0
  42. package/dist/ssr/astro-client.js.map +1 -0
  43. package/dist/ssr/astro-middleware-extract-static.d.ts +11 -0
  44. package/dist/ssr/astro-middleware-extract-static.js +9 -0
  45. package/dist/ssr/astro-middleware-extract-static.js.map +1 -0
  46. package/dist/ssr/astro-middleware-extract.d.ts +11 -0
  47. package/dist/ssr/astro-middleware-extract.js +9 -0
  48. package/dist/ssr/astro-middleware-extract.js.map +1 -0
  49. package/dist/ssr/astro-middleware-static.d.ts +18 -0
  50. package/dist/ssr/astro-middleware-static.js +18 -0
  51. package/dist/ssr/astro-middleware-static.js.map +1 -0
  52. package/dist/ssr/astro-middleware.d.ts +19 -0
  53. package/dist/ssr/astro-middleware.js +19 -0
  54. package/dist/ssr/astro-middleware.js.map +1 -0
  55. package/dist/ssr/astro.d.ts +117 -11
  56. package/dist/ssr/astro.js +2 -64
  57. package/dist/ssr/index.d.ts +37 -5
  58. package/dist/ssr/index.js +6 -7
  59. package/dist/ssr/index.js.map +1 -1
  60. package/dist/ssr/next-config.d.ts +66 -0
  61. package/dist/ssr/next-config.js +115 -0
  62. package/dist/ssr/next-config.js.map +1 -0
  63. package/dist/ssr/next.d.ts +14 -7
  64. package/dist/ssr/next.js +38 -16
  65. package/dist/ssr/next.js.map +1 -1
  66. package/dist/ssr-collector-ref-COs_ioWl.js +29 -0
  67. package/dist/ssr-collector-ref-COs_ioWl.js.map +1 -0
  68. package/dist/static/index.d.ts +91 -5
  69. package/dist/static/index.js +49 -3
  70. package/dist/static/index.js.map +1 -0
  71. package/dist/static/inject.js.map +1 -1
  72. package/dist/zero/babel.d.ts +2 -182
  73. package/dist/zero/babel.js +80 -40
  74. package/dist/zero/babel.js.map +1 -1
  75. package/dist/zero/index.d.ts +81 -3
  76. package/dist/zero/index.js +2 -3
  77. package/dist/zero/next.d.ts +1 -1
  78. package/dist/zero/next.js +1 -1
  79. package/dist/zero/next.js.map +1 -1
  80. package/docs/README.md +20 -12
  81. package/docs/adoption.md +59 -32
  82. package/docs/ai-agents.md +224 -0
  83. package/docs/comparison.md +76 -48
  84. package/docs/configuration.md +566 -69
  85. package/docs/debug.md +35 -18
  86. package/docs/design-system.md +63 -32
  87. package/docs/dsl.md +527 -179
  88. package/docs/getting-started.md +62 -41
  89. package/docs/injector.md +157 -51
  90. package/docs/methodology.md +116 -35
  91. package/docs/migration-v3.md +285 -0
  92. package/docs/pipeline.md +741 -0
  93. package/docs/plugins.md +353 -0
  94. package/docs/react-api.md +681 -0
  95. package/docs/runtime-benchmarks.md +351 -0
  96. package/docs/ssr.md +356 -130
  97. package/docs/styles.md +79 -16
  98. package/docs/tasty-static.md +149 -87
  99. package/package.json +78 -23
  100. package/tasty.config.ts +6 -0
  101. package/dist/_virtual/_rolldown/runtime.js +0 -7
  102. package/dist/chunks/cacheKey.js +0 -77
  103. package/dist/chunks/cacheKey.js.map +0 -1
  104. package/dist/chunks/definitions.d.ts +0 -37
  105. package/dist/chunks/definitions.js +0 -258
  106. package/dist/chunks/definitions.js.map +0 -1
  107. package/dist/chunks/index.d.ts +0 -1
  108. package/dist/chunks/renderChunk.d.ts +0 -1
  109. package/dist/chunks/renderChunk.js +0 -59
  110. package/dist/chunks/renderChunk.js.map +0 -1
  111. package/dist/config.d.ts +0 -366
  112. package/dist/config.js +0 -503
  113. package/dist/config.js.map +0 -1
  114. package/dist/counter-style/index.js +0 -51
  115. package/dist/counter-style/index.js.map +0 -1
  116. package/dist/debug.d.ts +0 -89
  117. package/dist/debug.js +0 -453
  118. package/dist/debug.js.map +0 -1
  119. package/dist/font-face/index.js +0 -63
  120. package/dist/font-face/index.js.map +0 -1
  121. package/dist/hooks/index.d.ts +0 -7
  122. package/dist/hooks/resolve-ssr-collector.js +0 -14
  123. package/dist/hooks/resolve-ssr-collector.js.map +0 -1
  124. package/dist/hooks/useCounterStyle.d.ts +0 -50
  125. package/dist/hooks/useCounterStyle.js +0 -46
  126. package/dist/hooks/useCounterStyle.js.map +0 -1
  127. package/dist/hooks/useFontFace.d.ts +0 -43
  128. package/dist/hooks/useFontFace.js +0 -70
  129. package/dist/hooks/useFontFace.js.map +0 -1
  130. package/dist/hooks/useGlobalStyles.d.ts +0 -30
  131. package/dist/hooks/useGlobalStyles.js +0 -78
  132. package/dist/hooks/useGlobalStyles.js.map +0 -1
  133. package/dist/hooks/useKeyframes.d.ts +0 -56
  134. package/dist/hooks/useKeyframes.js +0 -64
  135. package/dist/hooks/useKeyframes.js.map +0 -1
  136. package/dist/hooks/useProperty.d.ts +0 -79
  137. package/dist/hooks/useProperty.js +0 -109
  138. package/dist/hooks/useProperty.js.map +0 -1
  139. package/dist/hooks/useRawCSS.d.ts +0 -53
  140. package/dist/hooks/useRawCSS.js +0 -35
  141. package/dist/hooks/useRawCSS.js.map +0 -1
  142. package/dist/hooks/useStyles.d.ts +0 -45
  143. package/dist/hooks/useStyles.js +0 -237
  144. package/dist/hooks/useStyles.js.map +0 -1
  145. package/dist/injector/index.d.ts +0 -183
  146. package/dist/injector/index.js +0 -179
  147. package/dist/injector/index.js.map +0 -1
  148. package/dist/injector/injector.d.ts +0 -166
  149. package/dist/injector/injector.js +0 -464
  150. package/dist/injector/injector.js.map +0 -1
  151. package/dist/injector/sheet-manager.d.ts +0 -136
  152. package/dist/injector/sheet-manager.js +0 -733
  153. package/dist/injector/sheet-manager.js.map +0 -1
  154. package/dist/injector/types.d.ts +0 -204
  155. package/dist/keyframes/index.js +0 -206
  156. package/dist/keyframes/index.js.map +0 -1
  157. package/dist/parser/classify.js +0 -319
  158. package/dist/parser/classify.js.map +0 -1
  159. package/dist/parser/const.js +0 -49
  160. package/dist/parser/const.js.map +0 -1
  161. package/dist/parser/lru.js +0 -109
  162. package/dist/parser/lru.js.map +0 -1
  163. package/dist/parser/parser.d.ts +0 -25
  164. package/dist/parser/parser.js +0 -115
  165. package/dist/parser/parser.js.map +0 -1
  166. package/dist/parser/tokenizer.js +0 -69
  167. package/dist/parser/tokenizer.js.map +0 -1
  168. package/dist/parser/types.d.ts +0 -51
  169. package/dist/parser/types.js +0 -46
  170. package/dist/parser/types.js.map +0 -1
  171. package/dist/pipeline/conditions.d.ts +0 -134
  172. package/dist/pipeline/conditions.js +0 -406
  173. package/dist/pipeline/conditions.js.map +0 -1
  174. package/dist/pipeline/exclusive.js +0 -230
  175. package/dist/pipeline/exclusive.js.map +0 -1
  176. package/dist/pipeline/index.d.ts +0 -55
  177. package/dist/pipeline/index.js +0 -708
  178. package/dist/pipeline/index.js.map +0 -1
  179. package/dist/pipeline/materialize.js +0 -1103
  180. package/dist/pipeline/materialize.js.map +0 -1
  181. package/dist/pipeline/parseStateKey.d.ts +0 -15
  182. package/dist/pipeline/parseStateKey.js +0 -446
  183. package/dist/pipeline/parseStateKey.js.map +0 -1
  184. package/dist/pipeline/simplify.js +0 -515
  185. package/dist/pipeline/simplify.js.map +0 -1
  186. package/dist/pipeline/warnings.js +0 -18
  187. package/dist/pipeline/warnings.js.map +0 -1
  188. package/dist/plugins/index.d.ts +0 -2
  189. package/dist/plugins/okhsl-plugin.d.ts +0 -35
  190. package/dist/plugins/okhsl-plugin.js +0 -97
  191. package/dist/plugins/okhsl-plugin.js.map +0 -1
  192. package/dist/plugins/types.d.ts +0 -76
  193. package/dist/properties/index.js +0 -222
  194. package/dist/properties/index.js.map +0 -1
  195. package/dist/properties/property-type-resolver.d.ts +0 -24
  196. package/dist/properties/property-type-resolver.js +0 -90
  197. package/dist/properties/property-type-resolver.js.map +0 -1
  198. package/dist/ssr/astro.js.map +0 -1
  199. package/dist/ssr/async-storage.d.ts +0 -17
  200. package/dist/ssr/async-storage.js.map +0 -1
  201. package/dist/ssr/collect-auto-properties.js +0 -39
  202. package/dist/ssr/collect-auto-properties.js.map +0 -1
  203. package/dist/ssr/collector.d.ts +0 -102
  204. package/dist/ssr/collector.js +0 -226
  205. package/dist/ssr/collector.js.map +0 -1
  206. package/dist/ssr/context.d.ts +0 -8
  207. package/dist/ssr/context.js +0 -13
  208. package/dist/ssr/context.js.map +0 -1
  209. package/dist/ssr/format-global-rules.js.map +0 -1
  210. package/dist/ssr/format-keyframes.js +0 -69
  211. package/dist/ssr/format-keyframes.js.map +0 -1
  212. package/dist/ssr/format-property.js +0 -49
  213. package/dist/ssr/format-property.js.map +0 -1
  214. package/dist/ssr/format-rules.js.map +0 -1
  215. package/dist/ssr/hydrate.d.ts +0 -22
  216. package/dist/ssr/hydrate.js +0 -49
  217. package/dist/ssr/hydrate.js.map +0 -1
  218. package/dist/ssr/ssr-collector-ref.js +0 -12
  219. package/dist/ssr/ssr-collector-ref.js.map +0 -1
  220. package/dist/states/index.d.ts +0 -49
  221. package/dist/states/index.js +0 -170
  222. package/dist/states/index.js.map +0 -1
  223. package/dist/static/tastyStatic.d.ts +0 -46
  224. package/dist/static/tastyStatic.js +0 -30
  225. package/dist/static/tastyStatic.js.map +0 -1
  226. package/dist/static/types.d.ts +0 -49
  227. package/dist/static/types.js +0 -24
  228. package/dist/static/types.js.map +0 -1
  229. package/dist/styles/align.d.ts +0 -15
  230. package/dist/styles/align.js +0 -14
  231. package/dist/styles/align.js.map +0 -1
  232. package/dist/styles/border.d.ts +0 -25
  233. package/dist/styles/border.js +0 -113
  234. package/dist/styles/border.js.map +0 -1
  235. package/dist/styles/color.d.ts +0 -14
  236. package/dist/styles/color.js +0 -26
  237. package/dist/styles/color.js.map +0 -1
  238. package/dist/styles/createStyle.js +0 -79
  239. package/dist/styles/createStyle.js.map +0 -1
  240. package/dist/styles/dimension.js +0 -96
  241. package/dist/styles/dimension.js.map +0 -1
  242. package/dist/styles/display.d.ts +0 -37
  243. package/dist/styles/display.js +0 -66
  244. package/dist/styles/display.js.map +0 -1
  245. package/dist/styles/fade.d.ts +0 -15
  246. package/dist/styles/fade.js +0 -57
  247. package/dist/styles/fade.js.map +0 -1
  248. package/dist/styles/fill.d.ts +0 -42
  249. package/dist/styles/fill.js +0 -51
  250. package/dist/styles/fill.js.map +0 -1
  251. package/dist/styles/flow.d.ts +0 -16
  252. package/dist/styles/flow.js +0 -12
  253. package/dist/styles/flow.js.map +0 -1
  254. package/dist/styles/gap.d.ts +0 -31
  255. package/dist/styles/gap.js +0 -36
  256. package/dist/styles/gap.js.map +0 -1
  257. package/dist/styles/height.d.ts +0 -17
  258. package/dist/styles/height.js +0 -19
  259. package/dist/styles/height.js.map +0 -1
  260. package/dist/styles/index.d.ts +0 -1
  261. package/dist/styles/index.js +0 -8
  262. package/dist/styles/index.js.map +0 -1
  263. package/dist/styles/inset.d.ts +0 -52
  264. package/dist/styles/inset.js +0 -149
  265. package/dist/styles/inset.js.map +0 -1
  266. package/dist/styles/justify.d.ts +0 -15
  267. package/dist/styles/justify.js +0 -14
  268. package/dist/styles/justify.js.map +0 -1
  269. package/dist/styles/list.d.ts +0 -16
  270. package/dist/styles/list.js +0 -98
  271. package/dist/styles/list.js.map +0 -1
  272. package/dist/styles/margin.d.ts +0 -24
  273. package/dist/styles/margin.js +0 -103
  274. package/dist/styles/margin.js.map +0 -1
  275. package/dist/styles/outline.d.ts +0 -29
  276. package/dist/styles/outline.js +0 -64
  277. package/dist/styles/outline.js.map +0 -1
  278. package/dist/styles/padding.d.ts +0 -24
  279. package/dist/styles/padding.js +0 -103
  280. package/dist/styles/padding.js.map +0 -1
  281. package/dist/styles/predefined.d.ts +0 -71
  282. package/dist/styles/predefined.js +0 -237
  283. package/dist/styles/predefined.js.map +0 -1
  284. package/dist/styles/preset.d.ts +0 -52
  285. package/dist/styles/preset.js +0 -126
  286. package/dist/styles/preset.js.map +0 -1
  287. package/dist/styles/radius.d.ts +0 -12
  288. package/dist/styles/radius.js +0 -71
  289. package/dist/styles/radius.js.map +0 -1
  290. package/dist/styles/scrollbar.d.ts +0 -25
  291. package/dist/styles/scrollbar.js +0 -46
  292. package/dist/styles/scrollbar.js.map +0 -1
  293. package/dist/styles/shadow.d.ts +0 -14
  294. package/dist/styles/shadow.js +0 -23
  295. package/dist/styles/shadow.js.map +0 -1
  296. package/dist/styles/transition.d.ts +0 -14
  297. package/dist/styles/transition.js +0 -157
  298. package/dist/styles/transition.js.map +0 -1
  299. package/dist/styles/types.d.ts +0 -549
  300. package/dist/styles/width.d.ts +0 -17
  301. package/dist/styles/width.js +0 -19
  302. package/dist/styles/width.js.map +0 -1
  303. package/dist/tasty.d.ts +0 -119
  304. package/dist/tasty.js +0 -231
  305. package/dist/tasty.js.map +0 -1
  306. package/dist/types.d.ts +0 -184
  307. package/dist/utils/cache-wrapper.js +0 -21
  308. package/dist/utils/cache-wrapper.js.map +0 -1
  309. package/dist/utils/case-converter.js +0 -8
  310. package/dist/utils/case-converter.js.map +0 -1
  311. package/dist/utils/color-math.d.ts +0 -46
  312. package/dist/utils/color-math.js +0 -749
  313. package/dist/utils/color-math.js.map +0 -1
  314. package/dist/utils/color-space.d.ts +0 -5
  315. package/dist/utils/color-space.js +0 -228
  316. package/dist/utils/color-space.js.map +0 -1
  317. package/dist/utils/colors.d.ts +0 -5
  318. package/dist/utils/colors.js +0 -10
  319. package/dist/utils/colors.js.map +0 -1
  320. package/dist/utils/css-types.d.ts +0 -7
  321. package/dist/utils/dotize.d.ts +0 -26
  322. package/dist/utils/dotize.js +0 -122
  323. package/dist/utils/dotize.js.map +0 -1
  324. package/dist/utils/filter-base-props.d.ts +0 -15
  325. package/dist/utils/filter-base-props.js +0 -45
  326. package/dist/utils/filter-base-props.js.map +0 -1
  327. package/dist/utils/get-display-name.d.ts +0 -7
  328. package/dist/utils/get-display-name.js +0 -10
  329. package/dist/utils/get-display-name.js.map +0 -1
  330. package/dist/utils/has-keys.js +0 -13
  331. package/dist/utils/has-keys.js.map +0 -1
  332. package/dist/utils/is-dev-env.js +0 -19
  333. package/dist/utils/is-dev-env.js.map +0 -1
  334. package/dist/utils/is-valid-element-type.js +0 -15
  335. package/dist/utils/is-valid-element-type.js.map +0 -1
  336. package/dist/utils/merge-styles.js.map +0 -1
  337. package/dist/utils/mod-attrs.d.ts +0 -6
  338. package/dist/utils/mod-attrs.js +0 -20
  339. package/dist/utils/mod-attrs.js.map +0 -1
  340. package/dist/utils/process-tokens.d.ts +0 -21
  341. package/dist/utils/process-tokens.js +0 -90
  342. package/dist/utils/process-tokens.js.map +0 -1
  343. package/dist/utils/resolve-recipes.d.ts +0 -17
  344. package/dist/utils/resolve-recipes.js.map +0 -1
  345. package/dist/utils/selector-transform.js +0 -32
  346. package/dist/utils/selector-transform.js.map +0 -1
  347. package/dist/utils/string.js +0 -8
  348. package/dist/utils/string.js.map +0 -1
  349. package/dist/utils/styles.d.ts +0 -99
  350. package/dist/utils/styles.js +0 -220
  351. package/dist/utils/styles.js.map +0 -1
  352. package/dist/utils/typography.d.ts +0 -47
  353. package/dist/utils/typography.js +0 -51
  354. package/dist/utils/typography.js.map +0 -1
  355. package/dist/utils/warnings.d.ts +0 -16
  356. package/dist/utils/warnings.js +0 -16
  357. package/dist/utils/warnings.js.map +0 -1
  358. package/dist/zero/css-writer.d.ts +0 -45
  359. package/dist/zero/css-writer.js +0 -73
  360. package/dist/zero/css-writer.js.map +0 -1
  361. package/dist/zero/extractor.d.ts +0 -24
  362. package/dist/zero/extractor.js.map +0 -1
  363. package/docs/PIPELINE.md +0 -519
  364. package/docs/runtime.md +0 -485
  365. /package/dist/{chunks/cacheKey.d.ts → ssr/astro-client.d.ts} +0 -0
package/dist/debug.d.ts DELETED
@@ -1,89 +0,0 @@
1
- import { CacheMetrics } from "./injector/types.js";
2
-
3
- //#region src/debug.d.ts
4
- declare global {
5
- interface Window {
6
- tastyDebug?: typeof tastyDebug;
7
- }
8
- }
9
- type CSSTarget = 'all' | 'global' | 'active' | 'unused' | 'page' | string | string[] | Element;
10
- interface DebugOptions {
11
- root?: Document | ShadowRoot;
12
- /** Suppress console logging and return data only (default: false) */
13
- raw?: boolean;
14
- }
15
- interface CssOptions extends DebugOptions {
16
- prettify?: boolean;
17
- /** Read from stored source CSS (dev-mode only) instead of live CSSOM */
18
- source?: boolean;
19
- }
20
- interface ChunkInfo {
21
- className: string;
22
- chunkName: string | null;
23
- }
24
- interface InspectResult {
25
- element?: Element | null;
26
- classes: string[];
27
- chunks: ChunkInfo[];
28
- css: string;
29
- size: number;
30
- rules: number;
31
- }
32
- interface CacheStatus {
33
- classes: {
34
- active: string[];
35
- unused: string[];
36
- all: string[];
37
- };
38
- metrics: CacheMetrics | null;
39
- }
40
- interface ChunkBreakdown {
41
- byChunk: Record<string, {
42
- classes: string[];
43
- cssSize: number;
44
- ruleCount: number;
45
- }>;
46
- totalChunkTypes: number;
47
- totalClasses: number;
48
- }
49
- interface Summary {
50
- activeClasses: string[];
51
- unusedClasses: string[];
52
- totalStyledClasses: string[];
53
- activeCSSSize: number;
54
- unusedCSSSize: number;
55
- globalCSSSize: number;
56
- rawCSSSize: number;
57
- keyframesCSSSize: number;
58
- propertyCSSSize: number;
59
- totalCSSSize: number;
60
- activeRuleCount: number;
61
- unusedRuleCount: number;
62
- globalRuleCount: number;
63
- rawRuleCount: number;
64
- keyframesRuleCount: number;
65
- propertyRuleCount: number;
66
- totalRuleCount: number;
67
- metrics: CacheMetrics | null;
68
- definedProperties: string[];
69
- definedKeyframes: {
70
- name: string;
71
- refCount: number;
72
- }[];
73
- chunkBreakdown: ChunkBreakdown;
74
- }
75
- declare const tastyDebug: {
76
- css(target: CSSTarget, opts?: CssOptions): string;
77
- inspect(target: string | Element, opts?: DebugOptions): InspectResult;
78
- summary(opts?: DebugOptions): Summary;
79
- chunks(opts?: DebugOptions): ChunkBreakdown;
80
- cache(opts?: DebugOptions): CacheStatus;
81
- cleanup(opts?: {
82
- root?: Document | ShadowRoot;
83
- }): void;
84
- help(): void;
85
- install(): void;
86
- };
87
- //#endregion
88
- export { tastyDebug };
89
- //# sourceMappingURL=debug.d.ts.map
package/dist/debug.js DELETED
@@ -1,453 +0,0 @@
1
- import { isDevEnv } from "./utils/is-dev-env.js";
2
- import { CHUNK_NAMES } from "./chunks/definitions.js";
3
- import { getCssTextForNode, injector } from "./injector/index.js";
4
- //#region src/debug.ts
5
- function fmtSize(bytes) {
6
- return bytes > 1024 ? `${(bytes / 1024).toFixed(1)}KB` : `${bytes}B`;
7
- }
8
- function countRules(css) {
9
- return (css.match(/\{[^}]*\}/g) || []).length;
10
- }
11
- function sortTastyClasses(classes) {
12
- return Array.from(classes).sort((a, b) => parseInt(a.slice(1)) - parseInt(b.slice(1)));
13
- }
14
- function getRegistry(root = document) {
15
- return injector.instance._sheetManager?.getRegistry(root);
16
- }
17
- function getUnusedClasses(root = document) {
18
- const registry = getRegistry(root);
19
- if (!registry) return [];
20
- const result = [];
21
- for (const [cls, rc] of registry.refCounts) if (rc === 0) result.push(cls);
22
- return sortTastyClasses(result);
23
- }
24
- function findDomTastyClasses(root = document) {
25
- const classes = /* @__PURE__ */ new Set();
26
- (root.querySelectorAll?.("[class]") || []).forEach((el) => {
27
- const attr = el.getAttribute("class");
28
- if (attr) {
29
- for (const cls of attr.split(/\s+/)) if (/^t\d+$/.test(cls)) classes.add(cls);
30
- }
31
- });
32
- return sortTastyClasses(classes);
33
- }
34
- function prettifyCSS(css) {
35
- if (!css || !css.trim()) return "";
36
- const out = [];
37
- let depth = 0;
38
- const indent = () => " ".repeat(depth);
39
- let normalized = css.replace(/\s+/g, " ").trim();
40
- normalized = normalized.replace(/\s*\{\s*/g, " { ");
41
- normalized = normalized.replace(/\s*\}\s*/g, " } ");
42
- normalized = normalized.replace(/;\s*/g, "; ");
43
- const tokens = normalized.split(/\s+/);
44
- let buf = "";
45
- for (const t of tokens) if (t === "{") {
46
- const header = buf.trim();
47
- if (header) {
48
- const parts = splitOutsideParens(header, ",");
49
- if (parts.length > 1) out.push(parts.map((p, idx) => idx === 0 ? `${indent()}${p.trim()},` : `${indent()}${p.trim()}${idx < parts.length - 1 ? "," : ""}`).join("\n") + " {");
50
- else out.push(`${indent()}${header} {`);
51
- } else out.push(`${indent()}{`);
52
- depth++;
53
- buf = "";
54
- } else if (t === "}") {
55
- if (buf.trim()) {
56
- for (const decl of buf.split(";").filter((s) => s.trim())) out.push(`${indent()}${decl.trim()};`);
57
- buf = "";
58
- }
59
- depth = Math.max(0, depth - 1);
60
- out.push(`${indent()}}`);
61
- } else if (t.endsWith(";")) {
62
- buf += ` ${t}`;
63
- const full = buf.trim();
64
- if (full) out.push(`${indent()}${full}`);
65
- buf = "";
66
- } else buf += ` ${t}`;
67
- if (buf.trim()) out.push(buf.trim());
68
- return out.filter((l) => l.trim()).join("\n").replace(/\n{3,}/g, "\n\n").trim();
69
- }
70
- /** Split `str` by `sep` only when not inside parentheses */
71
- function splitOutsideParens(str, sep) {
72
- const parts = [];
73
- let depth = 0;
74
- let start = 0;
75
- for (let i = 0; i < str.length; i++) {
76
- const ch = str[i];
77
- if (ch === "(") depth++;
78
- else if (ch === ")") depth--;
79
- else if (depth === 0 && str.startsWith(sep, i)) {
80
- parts.push(str.slice(start, i));
81
- start = i + sep.length;
82
- }
83
- }
84
- parts.push(str.slice(start));
85
- return parts;
86
- }
87
- function extractChunkName(cacheKey) {
88
- for (const part of cacheKey.split("\0")) {
89
- if (part.startsWith("[states:")) continue;
90
- if (!part.includes(":") && part.length > 0) return part;
91
- }
92
- return null;
93
- }
94
- function getChunkForClass(className, root = document) {
95
- const registry = getRegistry(root);
96
- if (!registry) return null;
97
- for (const [key, cn] of registry.cacheKeyToClassName) if (cn === className) return extractChunkName(key);
98
- return null;
99
- }
100
- function buildChunkBreakdown(root = document) {
101
- const registry = getRegistry(root);
102
- if (!registry) return {
103
- byChunk: {},
104
- totalChunkTypes: 0,
105
- totalClasses: 0
106
- };
107
- const byChunk = {};
108
- for (const [cacheKey, className] of registry.cacheKeyToClassName) {
109
- const chunk = extractChunkName(cacheKey) || "unknown";
110
- if (!byChunk[chunk]) byChunk[chunk] = {
111
- classes: [],
112
- cssSize: 0,
113
- ruleCount: 0
114
- };
115
- byChunk[chunk].classes.push(className);
116
- const css = injector.instance.getCssTextForClasses([className], { root });
117
- byChunk[chunk].cssSize += css.length;
118
- byChunk[chunk].ruleCount += countRules(css);
119
- }
120
- for (const entry of Object.values(byChunk)) entry.classes = sortTastyClasses(entry.classes);
121
- const totalClasses = Object.values(byChunk).reduce((s, e) => s + e.classes.length, 0);
122
- return {
123
- byChunk,
124
- totalChunkTypes: Object.keys(byChunk).length,
125
- totalClasses
126
- };
127
- }
128
- function getGlobalTypeCSS(type, root = document) {
129
- const registry = getRegistry(root);
130
- if (!registry) return {
131
- css: "",
132
- ruleCount: 0,
133
- size: 0
134
- };
135
- const chunks = [];
136
- let rc = 0;
137
- if (type === "keyframes") for (const [, entry] of registry.keyframesCache) {
138
- const info = entry.info;
139
- const ss = registry.sheets[info.sheetIndex]?.sheet?.sheet;
140
- if (ss && info.ruleIndex < ss.cssRules.length) {
141
- const rule = ss.cssRules[info.ruleIndex];
142
- if (rule) {
143
- chunks.push(rule.cssText);
144
- rc++;
145
- }
146
- } else if (info.cssText) {
147
- chunks.push(info.cssText);
148
- rc++;
149
- }
150
- }
151
- else {
152
- const prefix = type === "global" ? "global:" : type === "raw" ? "raw:" : "property:";
153
- for (const [key, ri] of registry.globalRules) {
154
- if (!key.startsWith(prefix)) continue;
155
- const ss = registry.sheets[ri.sheetIndex]?.sheet?.sheet;
156
- if (ss) {
157
- const start = Math.max(0, ri.ruleIndex);
158
- const end = Math.min(ss.cssRules.length - 1, ri.endRuleIndex ?? ri.ruleIndex);
159
- if (start >= 0 && end >= start && start < ss.cssRules.length) for (let i = start; i <= end; i++) {
160
- const rule = ss.cssRules[i];
161
- if (rule) {
162
- chunks.push(rule.cssText);
163
- rc++;
164
- }
165
- }
166
- } else if (ri.cssText?.length) {
167
- chunks.push(...ri.cssText);
168
- rc += ri.cssText.length;
169
- }
170
- }
171
- }
172
- const raw = chunks.join("\n");
173
- return {
174
- css: prettifyCSS(raw),
175
- ruleCount: rc,
176
- size: raw.length
177
- };
178
- }
179
- function getSourceCssForClasses(classNames, root = document) {
180
- const registry = getRegistry(root);
181
- if (!registry) return null;
182
- const chunks = [];
183
- let found = false;
184
- for (const cls of classNames) {
185
- const info = registry.rules.get(cls);
186
- if (info?.cssText?.length) {
187
- chunks.push(...info.cssText);
188
- found = true;
189
- }
190
- }
191
- return found ? chunks.join("\n") : null;
192
- }
193
- function getDefs(root = document) {
194
- const registry = getRegistry(root);
195
- let properties = [];
196
- if (registry?.injectedProperties) properties = Array.from(registry.injectedProperties.keys()).sort();
197
- const keyframes = [];
198
- if (registry) {
199
- for (const entry of registry.keyframesCache.values()) keyframes.push({
200
- name: entry.name,
201
- refCount: entry.refCount
202
- });
203
- keyframes.sort((a, b) => a.name.localeCompare(b.name));
204
- }
205
- return {
206
- properties,
207
- keyframes
208
- };
209
- }
210
- const CHUNK_ORDER = [
211
- CHUNK_NAMES.COMBINED,
212
- CHUNK_NAMES.APPEARANCE,
213
- CHUNK_NAMES.FONT,
214
- CHUNK_NAMES.DIMENSION,
215
- CHUNK_NAMES.DISPLAY,
216
- CHUNK_NAMES.LAYOUT,
217
- CHUNK_NAMES.POSITION,
218
- CHUNK_NAMES.MISC,
219
- CHUNK_NAMES.SUBCOMPONENTS
220
- ];
221
- const tastyDebug = {
222
- css(target, opts) {
223
- const { root = document, prettify = true, raw = false, source = false } = opts || {};
224
- let css = "";
225
- if (source && typeof target === "string" && /^t\d+$/.test(target)) {
226
- const src = getSourceCssForClasses([target], root);
227
- if (src) css = src;
228
- else {
229
- if (!raw) console.warn("tastyDebug: source CSS not available (requires dev mode or TASTY_DEBUG=true). Falling back to live CSSOM.");
230
- css = injector.instance.getCssTextForClasses([target], { root });
231
- }
232
- } else if (source && Array.isArray(target)) {
233
- const src = getSourceCssForClasses(target, root);
234
- if (src) css = src;
235
- else {
236
- if (!raw) console.warn("tastyDebug: source CSS not available. Falling back to live CSSOM.");
237
- css = injector.instance.getCssTextForClasses(target, { root });
238
- }
239
- } else if (typeof target === "string") if (target === "all") css = injector.instance.getCssText({ root });
240
- else if (target === "global") {
241
- css = getGlobalTypeCSS("global", root).css;
242
- return css;
243
- } else if (target === "active") {
244
- const active = findDomTastyClasses(root);
245
- css = injector.instance.getCssTextForClasses(active, { root });
246
- } else if (target === "unused") {
247
- const unused = getUnusedClasses(root);
248
- css = injector.instance.getCssTextForClasses(unused, { root });
249
- } else if (target === "page") css = getPageCSS(root);
250
- else if (/^t\d+$/.test(target)) css = injector.instance.getCssTextForClasses([target], { root });
251
- else {
252
- const el = root.querySelector?.(target);
253
- if (el) css = getCssTextForNode(el, { root });
254
- }
255
- else if (Array.isArray(target)) css = injector.instance.getCssTextForClasses(target, { root });
256
- else if (target instanceof Element) css = getCssTextForNode(target, { root });
257
- const result = prettify ? prettifyCSS(css) : css;
258
- if (!raw) {
259
- const label = Array.isArray(target) ? `[${target.join(", ")}]` : target;
260
- const rc = countRules(css);
261
- console.group(`CSS for ${label} (${rc} rules, ${fmtSize(css.length)})`);
262
- console.log(result || "(empty)");
263
- console.groupEnd();
264
- }
265
- return result;
266
- },
267
- inspect(target, opts) {
268
- const { root = document, raw = false } = opts || {};
269
- const element = typeof target === "string" ? root.querySelector?.(target) : target;
270
- if (!element) {
271
- const empty = {
272
- element: null,
273
- classes: [],
274
- chunks: [],
275
- css: "",
276
- size: 0,
277
- rules: 0
278
- };
279
- if (!raw) console.warn("tastyDebug.inspect: element not found");
280
- return empty;
281
- }
282
- const tastyClasses = (element.getAttribute("class") || "").split(/\s+/).filter((cls) => /^t\d+$/.test(cls));
283
- const chunks = tastyClasses.map((className) => ({
284
- className,
285
- chunkName: getChunkForClass(className, root)
286
- }));
287
- const css = getCssTextForNode(element, { root });
288
- const rules = countRules(css);
289
- const result = {
290
- element,
291
- classes: tastyClasses,
292
- chunks,
293
- css: prettifyCSS(css),
294
- size: css.length,
295
- rules
296
- };
297
- if (!raw) {
298
- const tag = element.tagName.toLowerCase();
299
- const id = element.id ? `#${element.id}` : "";
300
- console.group(`inspect ${tag}${id} — ${tastyClasses.length} classes, ${rules} rules, ${fmtSize(css.length)}`);
301
- if (chunks.length) console.log("Chunks:", chunks.map((c) => `${c.className}→${c.chunkName || "?"}`).join(", "));
302
- console.groupCollapsed("CSS");
303
- console.log(result.css || "(empty)");
304
- console.groupEnd();
305
- console.groupEnd();
306
- }
307
- return result;
308
- },
309
- summary(opts) {
310
- const { root = document, raw = false } = opts || {};
311
- const activeClasses = findDomTastyClasses(root);
312
- const unusedClasses = getUnusedClasses(root);
313
- const totalStyledClasses = [...activeClasses, ...unusedClasses];
314
- const activeCSS = injector.instance.getCssTextForClasses(activeClasses, { root });
315
- const unusedCSS = injector.instance.getCssTextForClasses(unusedClasses, { root });
316
- const allCSS = injector.instance.getCssText({ root });
317
- const activeRuleCount = countRules(activeCSS);
318
- const unusedRuleCount = countRules(unusedCSS);
319
- const globalData = getGlobalTypeCSS("global", root);
320
- const rawData = getGlobalTypeCSS("raw", root);
321
- const kfData = getGlobalTypeCSS("keyframes", root);
322
- const propData = getGlobalTypeCSS("property", root);
323
- const totalRuleCount = activeRuleCount + unusedRuleCount + globalData.ruleCount + rawData.ruleCount + kfData.ruleCount + propData.ruleCount;
324
- const metrics = injector.instance.getMetrics({ root });
325
- const defs = getDefs(root);
326
- const chunkBreakdown = buildChunkBreakdown(root);
327
- const summary = {
328
- activeClasses,
329
- unusedClasses,
330
- totalStyledClasses,
331
- activeCSSSize: activeCSS.length,
332
- unusedCSSSize: unusedCSS.length,
333
- globalCSSSize: globalData.size,
334
- rawCSSSize: rawData.size,
335
- keyframesCSSSize: kfData.size,
336
- propertyCSSSize: propData.size,
337
- totalCSSSize: allCSS.length,
338
- activeRuleCount,
339
- unusedRuleCount,
340
- globalRuleCount: globalData.ruleCount,
341
- rawRuleCount: rawData.ruleCount,
342
- keyframesRuleCount: kfData.ruleCount,
343
- propertyRuleCount: propData.ruleCount,
344
- totalRuleCount,
345
- metrics,
346
- definedProperties: defs.properties,
347
- definedKeyframes: defs.keyframes,
348
- chunkBreakdown
349
- };
350
- if (!raw) {
351
- console.group("Tasty Summary");
352
- console.log(`Active: ${activeClasses.length} classes, ${activeRuleCount} rules, ${fmtSize(activeCSS.length)}`);
353
- console.log(`Unused: ${unusedClasses.length} classes, ${unusedRuleCount} rules, ${fmtSize(unusedCSS.length)}`);
354
- console.log(`Global: ${globalData.ruleCount} rules, ${fmtSize(globalData.size)}`);
355
- if (rawData.ruleCount) console.log(`Raw: ${rawData.ruleCount} rules, ${fmtSize(rawData.size)}`);
356
- if (kfData.ruleCount) console.log(`Keyframes: ${kfData.ruleCount} rules, ${fmtSize(kfData.size)}`);
357
- if (propData.ruleCount) console.log(`@property: ${propData.ruleCount} rules, ${fmtSize(propData.size)}`);
358
- console.log(`Total: ${totalStyledClasses.length} classes, ${totalRuleCount} rules, ${fmtSize(allCSS.length)}`);
359
- if (metrics) {
360
- const total = metrics.hits + metrics.misses;
361
- const rate = total > 0 ? (metrics.hits / total * 100).toFixed(1) : 0;
362
- console.log(`Cache: ${rate}% hit rate (${total} lookups)`);
363
- }
364
- if (chunkBreakdown.totalChunkTypes > 0) {
365
- console.groupCollapsed(`Chunks (${chunkBreakdown.totalChunkTypes} types, ${chunkBreakdown.totalClasses} classes)`);
366
- for (const name of CHUNK_ORDER) {
367
- const d = chunkBreakdown.byChunk[name];
368
- if (d) console.log(` ${name}: ${d.classes.length} cls, ${d.ruleCount} rules, ${fmtSize(d.cssSize)}`);
369
- }
370
- for (const [name, d] of Object.entries(chunkBreakdown.byChunk)) if (!CHUNK_ORDER.includes(name)) console.log(` ${name}: ${d.classes.length} cls, ${d.ruleCount} rules, ${fmtSize(d.cssSize)}`);
371
- console.groupEnd();
372
- }
373
- if (defs.properties.length || defs.keyframes.length) console.log(`Defs: ${defs.properties.length} @property, ${defs.keyframes.length} @keyframes`);
374
- console.groupEnd();
375
- }
376
- return summary;
377
- },
378
- chunks(opts) {
379
- const { root = document, raw = false } = opts || {};
380
- const breakdown = buildChunkBreakdown(root);
381
- if (!raw) {
382
- console.group(`Chunks (${breakdown.totalChunkTypes} types, ${breakdown.totalClasses} classes)`);
383
- for (const name of CHUNK_ORDER) {
384
- const d = breakdown.byChunk[name];
385
- if (d) console.log(` ${name}: ${d.classes.length} cls, ${d.ruleCount} rules, ${fmtSize(d.cssSize)}`);
386
- }
387
- for (const [name, d] of Object.entries(breakdown.byChunk)) if (!CHUNK_ORDER.includes(name)) console.log(` ${name}: ${d.classes.length} cls, ${d.ruleCount} rules, ${fmtSize(d.cssSize)}`);
388
- console.groupEnd();
389
- }
390
- return breakdown;
391
- },
392
- cache(opts) {
393
- const { root = document, raw = false } = opts || {};
394
- const active = findDomTastyClasses(root);
395
- const unused = getUnusedClasses(root);
396
- const metrics = injector.instance.getMetrics({ root });
397
- const status = {
398
- classes: {
399
- active,
400
- unused,
401
- all: [...active, ...unused]
402
- },
403
- metrics
404
- };
405
- if (!raw) {
406
- console.group("Cache");
407
- console.log(`Active: ${active.length}, Unused: ${unused.length}`);
408
- if (metrics) {
409
- const total = metrics.hits + metrics.misses;
410
- const rate = total > 0 ? (metrics.hits / total * 100).toFixed(1) : 0;
411
- console.log(`Hits: ${metrics.hits}, Misses: ${metrics.misses}, Rate: ${rate}%`);
412
- }
413
- console.groupEnd();
414
- }
415
- return status;
416
- },
417
- cleanup(opts) {
418
- injector.instance.cleanup(opts?.root);
419
- },
420
- help() {
421
- console.log(`tastyDebug API:
422
- .summary() — overview (classes, rules, sizes)
423
- .css("active") — CSS for classes in DOM
424
- .css("t42") — CSS for a specific class
425
- .css("t42",{source:1})— original CSS before browser parsing (dev only)
426
- .css(".selector") — CSS for a DOM element
427
- .inspect(".selector") — element details (classes, chunks, rules)
428
- .chunks() — style chunk breakdown
429
- .cache() — cache status and metrics
430
- .cleanup() — force unused style cleanup
431
- Options: { raw: true } suppresses logging, { root: shadowRoot } targets Shadow DOM`);
432
- },
433
- install() {
434
- if (typeof window !== "undefined" && window.tastyDebug !== tastyDebug) {
435
- window.tastyDebug = tastyDebug;
436
- console.log("tastyDebug installed. Run tastyDebug.help() for commands.");
437
- }
438
- }
439
- };
440
- function getPageCSS(root = document) {
441
- const chunks = [];
442
- try {
443
- if ("styleSheets" in root) for (const sheet of Array.from(root.styleSheets)) try {
444
- if (sheet.cssRules) chunks.push(Array.from(sheet.cssRules).map((r) => r.cssText).join("\n"));
445
- } catch {}
446
- } catch {}
447
- return chunks.join("\n");
448
- }
449
- if (typeof window !== "undefined" && isDevEnv()) tastyDebug.install();
450
- //#endregion
451
- export { tastyDebug };
452
-
453
- //# sourceMappingURL=debug.js.map
package/dist/debug.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"debug.js","names":[],"sources":["../src/debug.ts"],"sourcesContent":["/* eslint-disable no-console */\nimport { CHUNK_NAMES } from './chunks/definitions';\nimport { getCssTextForNode, injector } from './injector';\nimport type { CacheMetrics, RootRegistry } from './injector/types';\nimport { isDevEnv } from './utils/is-dev-env';\n\ndeclare global {\n interface Window {\n tastyDebug?: typeof tastyDebug;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype CSSTarget =\n | 'all'\n | 'global'\n | 'active'\n | 'unused'\n | 'page'\n | string\n | string[]\n | Element;\n\ninterface DebugOptions {\n root?: Document | ShadowRoot;\n /** Suppress console logging and return data only (default: false) */\n raw?: boolean;\n}\n\ninterface CssOptions extends DebugOptions {\n prettify?: boolean;\n /** Read from stored source CSS (dev-mode only) instead of live CSSOM */\n source?: boolean;\n}\n\ninterface ChunkInfo {\n className: string;\n chunkName: string | null;\n}\n\ninterface InspectResult {\n element?: Element | null;\n classes: string[];\n chunks: ChunkInfo[];\n css: string;\n size: number;\n rules: number;\n}\n\ninterface CacheStatus {\n classes: {\n active: string[];\n unused: string[];\n all: string[];\n };\n metrics: CacheMetrics | null;\n}\n\ninterface ChunkBreakdown {\n byChunk: Record<\n string,\n { classes: string[]; cssSize: number; ruleCount: number }\n >;\n totalChunkTypes: number;\n totalClasses: number;\n}\n\ninterface Summary {\n activeClasses: string[];\n unusedClasses: 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 return Array.from(classes).sort(\n (a, b) => parseInt(a.slice(1)) - parseInt(b.slice(1)),\n );\n}\n\nfunction getRegistry(\n root: Document | ShadowRoot = document,\n): RootRegistry | undefined {\n return injector.instance._sheetManager?.getRegistry(root);\n}\n\nfunction getUnusedClasses(root: Document | ShadowRoot = document): string[] {\n const registry = getRegistry(root);\n if (!registry) return [];\n const result: string[] = [];\n for (const [cls, rc] of registry.refCounts as Map<string, number>) {\n if (rc === 0) result.push(cls);\n }\n return sortTastyClasses(result);\n}\n\nfunction findDomTastyClasses(root: Document | ShadowRoot = document): string[] {\n const classes = new Set<string>();\n const elements = (root as Document).querySelectorAll?.('[class]') || [];\n elements.forEach((el) => {\n const attr = el.getAttribute('class');\n if (attr) {\n for (const cls of attr.split(/\\s+/)) {\n if (/^t\\d+$/.test(cls)) classes.add(cls);\n }\n }\n });\n return sortTastyClasses(classes);\n}\n\n// ---------------------------------------------------------------------------\n// prettifyCSS — readable output for nested at-rules & comma selectors\n// ---------------------------------------------------------------------------\n\nfunction prettifyCSS(css: string): string {\n if (!css || !css.trim()) return '';\n\n const out: string[] = [];\n let depth = 0;\n const indent = () => ' '.repeat(depth);\n\n let normalized = css.replace(/\\s+/g, ' ').trim();\n // Ensure braces are surrounded by spaces for splitting\n normalized = normalized.replace(/\\s*\\{\\s*/g, ' { ');\n normalized = normalized.replace(/\\s*\\}\\s*/g, ' } ');\n normalized = normalized.replace(/;\\s*/g, '; ');\n\n const tokens = normalized.split(/\\s+/);\n let buf = '';\n\n for (const t of tokens) {\n if (t === '{') {\n // buf contains the selector / at-rule header\n const header = buf.trim();\n if (header) {\n // Split comma-separated selectors onto their own lines\n // but only if the comma is outside parentheses\n const parts = splitOutsideParens(header, ',');\n if (parts.length > 1) {\n out.push(\n parts\n .map((p, idx) =>\n idx === 0\n ? `${indent()}${p.trim()},`\n : `${indent()}${p.trim()}${idx < parts.length - 1 ? ',' : ''}`,\n )\n .join('\\n') + ' {',\n );\n } else {\n out.push(`${indent()}${header} {`);\n }\n } else {\n out.push(`${indent()}{`);\n }\n depth++;\n buf = '';\n } else if (t === '}') {\n // Flush any trailing declarations\n if (buf.trim()) {\n for (const decl of buf.split(';').filter((s) => s.trim())) {\n out.push(`${indent()}${decl.trim()};`);\n }\n buf = '';\n }\n depth = Math.max(0, depth - 1);\n out.push(`${indent()}}`);\n } else if (t.endsWith(';')) {\n buf += ` ${t}`;\n const full = buf.trim();\n if (full) out.push(`${indent()}${full}`);\n buf = '';\n } else {\n buf += ` ${t}`;\n }\n }\n if (buf.trim()) out.push(buf.trim());\n\n return out\n .filter((l) => l.trim())\n .join('\\n')\n .replace(/\\n{3,}/g, '\\n\\n')\n .trim();\n}\n\n/** Split `str` by `sep` only when not inside parentheses */\nfunction splitOutsideParens(str: string, sep: string): string[] {\n const parts: string[] = [];\n let depth = 0;\n let start = 0;\n for (let i = 0; i < str.length; i++) {\n const ch = str[i];\n if (ch === '(') depth++;\n else if (ch === ')') depth--;\n else if (depth === 0 && str.startsWith(sep, i)) {\n parts.push(str.slice(start, i));\n start = i + sep.length;\n }\n }\n parts.push(str.slice(start));\n return parts;\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: Document | ShadowRoot = document,\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(\n root: Document | ShadowRoot = document,\n): ChunkBreakdown {\n const registry = getRegistry(root);\n if (!registry) 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 if (!byChunk[chunk])\n byChunk[chunk] = { classes: [], cssSize: 0, ruleCount: 0 };\n byChunk[chunk].classes.push(className);\n const css = injector.instance.getCssTextForClasses([className], { root });\n byChunk[chunk].cssSize += css.length;\n byChunk[chunk].ruleCount += countRules(css);\n }\n\n for (const entry of Object.values(byChunk)) {\n entry.classes = sortTastyClasses(entry.classes);\n }\n\n const totalClasses = Object.values(byChunk).reduce(\n (s, e) => s + e.classes.length,\n 0,\n );\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\nfunction getGlobalTypeCSS(\n type: 'global' | 'raw' | 'keyframes' | 'property',\n root: Document | ShadowRoot = document,\n): { css: string; ruleCount: number; size: number } {\n const registry = getRegistry(root);\n if (!registry) return { css: '', ruleCount: 0, size: 0 };\n\n const chunks: string[] = [];\n let rc = 0;\n\n if (type === 'keyframes') {\n for (const [, entry] of registry.keyframesCache) {\n const info = entry.info;\n const sheet = registry.sheets[info.sheetIndex];\n const ss = sheet?.sheet?.sheet;\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 =\n type === 'global' ? 'global:' : type === 'raw' ? 'raw:' : 'property:';\n for (const [key, ri] of registry.globalRules) {\n if (!key.startsWith(prefix)) continue;\n const sheet = registry.sheets[ri.sheetIndex];\n const ss = sheet?.sheet?.sheet;\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 { css: prettifyCSS(raw), ruleCount: rc, size: raw.length };\n}\n\n// ---------------------------------------------------------------------------\n// Source CSS (dev-mode RuleInfo.cssText)\n// ---------------------------------------------------------------------------\n\nfunction getSourceCssForClasses(\n classNames: string[],\n root: Document | ShadowRoot = document,\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: Document | ShadowRoot = document) {\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\n// ---------------------------------------------------------------------------\n// tastyDebug API\n// ---------------------------------------------------------------------------\n\nexport const tastyDebug = {\n css(target: CSSTarget, opts?: CssOptions): string {\n const {\n root = document,\n prettify = true,\n raw = false,\n source = false,\n } = opts || {};\n let css = '';\n\n if (source && typeof target === 'string' && /^t\\d+$/.test(target)) {\n const src = getSourceCssForClasses([target], root);\n if (src) {\n css = src;\n } else {\n if (!raw) {\n console.warn(\n 'tastyDebug: source CSS not available (requires dev mode or TASTY_DEBUG=true). Falling back to live CSSOM.',\n );\n }\n css = injector.instance.getCssTextForClasses([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 'tastyDebug: source CSS not available. Falling back to live CSSOM.',\n );\n }\n css = injector.instance.getCssTextForClasses(target, { root });\n }\n } else if (typeof target === 'string') {\n if (target === 'all') {\n css = injector.instance.getCssText({ 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 = injector.instance.getCssTextForClasses(active, { root });\n } else if (target === 'unused') {\n const unused = getUnusedClasses(root);\n css = injector.instance.getCssTextForClasses(unused, { root });\n } else if (target === 'page') {\n css = getPageCSS(root);\n } else if (/^t\\d+$/.test(target)) {\n css = injector.instance.getCssTextForClasses([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 = injector.instance.getCssTextForClasses(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 = document, raw = false } = opts || {};\n const element =\n typeof target === 'string'\n ? (root as Document).querySelector?.(target)\n : target;\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 if (!raw) console.warn('tastyDebug.inspect: element not found');\n return empty;\n }\n\n const classList = element.getAttribute('class') || '';\n const tastyClasses = classList\n .split(/\\s+/)\n .filter((cls) => /^t\\d+$/.test(cls));\n\n const chunks: ChunkInfo[] = tastyClasses.map((className) => ({\n className,\n chunkName: getChunkForClass(className, root),\n }));\n\n const css = getCssTextForNode(element, { root });\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 = document, raw = false } = opts || {};\n\n const activeClasses = findDomTastyClasses(root);\n const unusedClasses = getUnusedClasses(root);\n const totalStyledClasses = [...activeClasses, ...unusedClasses];\n\n const activeCSS = injector.instance.getCssTextForClasses(activeClasses, {\n root,\n });\n const unusedCSS = injector.instance.getCssTextForClasses(unusedClasses, {\n root,\n });\n const allCSS = injector.instance.getCssText({ root });\n\n const activeRuleCount = countRules(activeCSS);\n const unusedRuleCount = countRules(unusedCSS);\n\n const globalData = getGlobalTypeCSS('global', root);\n const rawData = getGlobalTypeCSS('raw', root);\n const kfData = getGlobalTypeCSS('keyframes', root);\n const propData = getGlobalTypeCSS('property', root);\n\n const totalRuleCount =\n activeRuleCount +\n unusedRuleCount +\n globalData.ruleCount +\n rawData.ruleCount +\n kfData.ruleCount +\n propData.ruleCount;\n\n const metrics = injector.instance.getMetrics({ root });\n const defs = getDefs(root);\n const chunkBreakdown = buildChunkBreakdown(root);\n\n const summary: Summary = {\n activeClasses,\n unusedClasses,\n totalStyledClasses,\n activeCSSSize: activeCSS.length,\n unusedCSSSize: unusedCSS.length,\n globalCSSSize: globalData.size,\n rawCSSSize: rawData.size,\n keyframesCSSSize: kfData.size,\n propertyCSSSize: propData.size,\n totalCSSSize: allCSS.length,\n activeRuleCount,\n unusedRuleCount,\n globalRuleCount: globalData.ruleCount,\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 console.log(\n `Global: ${globalData.ruleCount} rules, ${fmtSize(globalData.size)}`,\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 for (const name of CHUNK_ORDER) {\n const d = chunkBreakdown.byChunk[name];\n if (d)\n console.log(\n ` ${name}: ${d.classes.length} cls, ${d.ruleCount} rules, ${fmtSize(d.cssSize)}`,\n );\n }\n for (const [name, d] of Object.entries(chunkBreakdown.byChunk)) {\n if (!CHUNK_ORDER.includes(name as (typeof CHUNK_ORDER)[number]))\n console.log(\n ` ${name}: ${d.classes.length} cls, ${d.ruleCount} rules, ${fmtSize(d.cssSize)}`,\n );\n }\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 = document, raw = false } = opts || {};\n const breakdown = buildChunkBreakdown(root);\n\n if (!raw) {\n console.group(\n `Chunks (${breakdown.totalChunkTypes} types, ${breakdown.totalClasses} classes)`,\n );\n for (const name of CHUNK_ORDER) {\n const d = breakdown.byChunk[name];\n if (d)\n console.log(\n ` ${name}: ${d.classes.length} cls, ${d.ruleCount} rules, ${fmtSize(d.cssSize)}`,\n );\n }\n for (const [name, d] of Object.entries(breakdown.byChunk)) {\n if (!CHUNK_ORDER.includes(name as (typeof CHUNK_ORDER)[number]))\n console.log(\n ` ${name}: ${d.classes.length} cls, ${d.ruleCount} rules, ${fmtSize(d.cssSize)}`,\n );\n }\n console.groupEnd();\n }\n\n return breakdown;\n },\n\n cache(opts?: DebugOptions): CacheStatus {\n const { root = document, raw = false } = opts || {};\n const active = findDomTastyClasses(root);\n const unused = getUnusedClasses(root);\n const metrics = injector.instance.getMetrics({ root });\n\n const status: CacheStatus = {\n classes: { active, unused, all: [...active, ...unused] },\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 injector.instance.cleanup(opts?.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: Document | ShadowRoot = document): string {\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\n// ---------------------------------------------------------------------------\n// Auto-install in development\n// ---------------------------------------------------------------------------\n\nif (typeof window !== 'undefined' && isDevEnv()) {\n tastyDebug.install();\n}\n"],"mappings":"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"}