meno-core 1.1.4 → 1.1.6

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 (37) hide show
  1. package/dist/chunks/{chunk-ZEDLSHYQ.js → chunk-GHNLTFCN.js} +44 -12
  2. package/dist/chunks/chunk-GHNLTFCN.js.map +7 -0
  3. package/dist/chunks/{chunk-UOF4MCAD.js → chunk-KX2LPIZZ.js} +607 -16
  4. package/dist/chunks/{chunk-UOF4MCAD.js.map → chunk-KX2LPIZZ.js.map} +3 -3
  5. package/dist/chunks/{chunk-FQBIC2OB.js → chunk-YMBUSHII.js} +1 -1
  6. package/dist/chunks/{chunk-FQBIC2OB.js.map → chunk-YMBUSHII.js.map} +1 -1
  7. package/dist/lib/client/index.js +56 -12
  8. package/dist/lib/client/index.js.map +2 -2
  9. package/dist/lib/server/index.js +121 -26
  10. package/dist/lib/server/index.js.map +3 -3
  11. package/dist/lib/shared/index.js +8 -2
  12. package/dist/lib/shared/index.js.map +1 -1
  13. package/lib/client/core/ComponentBuilder.test.ts +137 -0
  14. package/lib/client/core/ComponentBuilder.ts +52 -13
  15. package/lib/client/core/builders/embedBuilder.ts +15 -1
  16. package/lib/client/core/builders/linkNodeBuilder.ts +15 -1
  17. package/lib/client/core/builders/localeListBuilder.ts +15 -1
  18. package/lib/client/templateEngine.test.ts +106 -3
  19. package/lib/client/templateEngine.ts +50 -10
  20. package/lib/server/fileWatcher.test.ts +90 -0
  21. package/lib/server/fileWatcher.ts +36 -0
  22. package/lib/server/services/configService.ts +0 -5
  23. package/lib/server/ssr/htmlGenerator.test.ts +105 -3
  24. package/lib/server/ssr/htmlGenerator.ts +94 -42
  25. package/lib/server/ssr/ssrRenderer.test.ts +100 -0
  26. package/lib/server/ssr/ssrRenderer.ts +59 -14
  27. package/lib/shared/cssGeneration.test.ts +36 -0
  28. package/lib/shared/cssGeneration.ts +6 -1
  29. package/lib/shared/tailwindThemeScale.ts +1 -0
  30. package/lib/shared/templateStyleVars.ts +49 -0
  31. package/lib/shared/types/comment.ts +9 -3
  32. package/lib/shared/utilityClassConfig.ts +469 -10
  33. package/lib/shared/utilityClassMapper.test.ts +200 -2
  34. package/lib/shared/utilityClassMapper.ts +153 -0
  35. package/lib/shared/utilityClassNames.ts +90 -0
  36. package/package.json +1 -1
  37. package/dist/chunks/chunk-ZEDLSHYQ.js.map +0 -7
@@ -3891,12 +3891,43 @@ var propertyMap = {
3891
3891
  textShadow: "text-shadow",
3892
3892
  filter: "filter",
3893
3893
  backdropFilter: "backdrop-filter",
3894
+ mixBlendMode: "mix-blend",
3895
+ backgroundBlendMode: "bg-blend",
3896
+ willChange: "will-change",
3897
+ columns: "columns",
3898
+ overscrollBehavior: "overscroll",
3899
+ overscrollBehaviorX: "overscroll-x",
3900
+ overscrollBehaviorY: "overscroll-y",
3901
+ touchAction: "touch",
3902
+ breakAfter: "break-after",
3903
+ breakBefore: "break-before",
3904
+ breakInside: "break-inside",
3905
+ textUnderlineOffset: "underline-offset",
3906
+ textDecorationColor: "decoration",
3907
+ textDecorationThickness: "decoration",
3908
+ caretColor: "caret",
3909
+ fill: "fill",
3910
+ stroke: "stroke",
3911
+ strokeWidth: "stroke",
3912
+ borderSpacing: "border-spacing",
3913
+ scrollMargin: "scroll-m",
3914
+ scrollMarginTop: "scroll-mt",
3915
+ scrollMarginRight: "scroll-mr",
3916
+ scrollMarginBottom: "scroll-mb",
3917
+ scrollMarginLeft: "scroll-ml",
3918
+ scrollPadding: "scroll-p",
3919
+ scrollPaddingTop: "scroll-pt",
3920
+ scrollPaddingRight: "scroll-pr",
3921
+ scrollPaddingBottom: "scroll-pb",
3922
+ scrollPaddingLeft: "scroll-pl",
3894
3923
  // Positioning
3895
3924
  top: "top",
3896
3925
  right: "right",
3897
3926
  bottom: "bottom",
3898
3927
  left: "left",
3899
3928
  inset: "inset",
3929
+ insetInlineStart: "start",
3930
+ insetInlineEnd: "end",
3900
3931
  zIndex: "z",
3901
3932
  // Grid Layout
3902
3933
  gridTemplateColumns: "grid-cols",
@@ -4008,6 +4039,68 @@ var prefixToCSSProperty = {
4008
4039
  "text-shadow": "text-shadow",
4009
4040
  filter: "filter",
4010
4041
  "backdrop-filter": "backdrop-filter",
4042
+ // Filter-function roots (value is wrapped in the function — see FILTER_FN_ROOTS +
4043
+ // parseRootValue's filter branch). Kept here too so hash/dynamic property derivation
4044
+ // and SORTED_ROOTS matching see them like any other root.
4045
+ blur: "filter",
4046
+ brightness: "filter",
4047
+ contrast: "filter",
4048
+ saturate: "filter",
4049
+ grayscale: "filter",
4050
+ invert: "filter",
4051
+ sepia: "filter",
4052
+ "hue-rotate": "filter",
4053
+ "drop-shadow": "filter",
4054
+ "backdrop-blur": "backdrop-filter",
4055
+ "backdrop-brightness": "backdrop-filter",
4056
+ "backdrop-contrast": "backdrop-filter",
4057
+ "backdrop-saturate": "backdrop-filter",
4058
+ "backdrop-grayscale": "backdrop-filter",
4059
+ "backdrop-invert": "backdrop-filter",
4060
+ "backdrop-sepia": "backdrop-filter",
4061
+ "backdrop-hue-rotate": "backdrop-filter",
4062
+ "backdrop-opacity": "backdrop-filter",
4063
+ // Per-axis transforms (value composed into the axis slot — see parseRootValue)
4064
+ "skew-x": "transform",
4065
+ "skew-y": "transform",
4066
+ "scale-x": "scale",
4067
+ "scale-y": "scale",
4068
+ // Side border-radius (two corners — expanded in generateRuleForClass / classesToStyles)
4069
+ "rounded-t": "border-top-left-radius",
4070
+ "rounded-r": "border-top-right-radius",
4071
+ "rounded-b": "border-bottom-left-radius",
4072
+ "rounded-l": "border-top-left-radius",
4073
+ // Blend / misc keyword roots
4074
+ "mix-blend": "mix-blend-mode",
4075
+ "bg-blend": "background-blend-mode",
4076
+ "will-change": "will-change",
4077
+ columns: "columns",
4078
+ overscroll: "overscroll-behavior",
4079
+ "overscroll-x": "overscroll-behavior-x",
4080
+ "overscroll-y": "overscroll-behavior-y",
4081
+ touch: "touch-action",
4082
+ "break-after": "break-after",
4083
+ "break-before": "break-before",
4084
+ "break-inside": "break-inside",
4085
+ // Text decoration & SVG (shared roots disambiguated by value type — see resolveRootProperty)
4086
+ "underline-offset": "text-underline-offset",
4087
+ decoration: "text-decoration-color",
4088
+ caret: "caret-color",
4089
+ fill: "fill",
4090
+ stroke: "stroke",
4091
+ // Tables
4092
+ "border-spacing": "border-spacing",
4093
+ // Scroll margin/padding (Tailwind spacing scale)
4094
+ "scroll-m": "scroll-margin",
4095
+ "scroll-mt": "scroll-margin-top",
4096
+ "scroll-mr": "scroll-margin-right",
4097
+ "scroll-mb": "scroll-margin-bottom",
4098
+ "scroll-ml": "scroll-margin-left",
4099
+ "scroll-p": "scroll-padding",
4100
+ "scroll-pt": "scroll-padding-top",
4101
+ "scroll-pr": "scroll-padding-right",
4102
+ "scroll-pb": "scroll-padding-bottom",
4103
+ "scroll-pl": "scroll-padding-left",
4011
4104
  // Positioning
4012
4105
  top: "top",
4013
4106
  right: "right",
@@ -4016,6 +4109,8 @@ var prefixToCSSProperty = {
4016
4109
  inset: "inset",
4017
4110
  "inset-x": "inset-inline",
4018
4111
  "inset-y": "inset-block",
4112
+ start: "inset-inline-start",
4113
+ end: "inset-inline-end",
4019
4114
  z: "z-index",
4020
4115
  // Outline
4021
4116
  outline: "outline",
@@ -4028,6 +4123,50 @@ var prefixToCSSProperty = {
4028
4123
  transition: "transition",
4029
4124
  object: "object-position"
4030
4125
  };
4126
+ var FILTER_FN_ROOTS = {
4127
+ blur: { property: "filter", fn: "blur" },
4128
+ brightness: { property: "filter", fn: "brightness", scale: "ratio" },
4129
+ contrast: { property: "filter", fn: "contrast", scale: "ratio" },
4130
+ saturate: { property: "filter", fn: "saturate", scale: "ratio" },
4131
+ grayscale: { property: "filter", fn: "grayscale", scale: "percent" },
4132
+ invert: { property: "filter", fn: "invert", scale: "percent" },
4133
+ sepia: { property: "filter", fn: "sepia", scale: "percent" },
4134
+ "hue-rotate": { property: "filter", fn: "hue-rotate", scale: "deg" },
4135
+ "drop-shadow": { property: "filter", fn: "drop-shadow" },
4136
+ "backdrop-blur": { property: "backdrop-filter", fn: "blur" },
4137
+ "backdrop-brightness": { property: "backdrop-filter", fn: "brightness", scale: "ratio" },
4138
+ "backdrop-contrast": { property: "backdrop-filter", fn: "contrast", scale: "ratio" },
4139
+ "backdrop-saturate": { property: "backdrop-filter", fn: "saturate", scale: "ratio" },
4140
+ "backdrop-grayscale": { property: "backdrop-filter", fn: "grayscale", scale: "percent" },
4141
+ "backdrop-invert": { property: "backdrop-filter", fn: "invert", scale: "percent" },
4142
+ "backdrop-sepia": { property: "backdrop-filter", fn: "sepia", scale: "percent" },
4143
+ "backdrop-hue-rotate": { property: "backdrop-filter", fn: "hue-rotate", scale: "deg" },
4144
+ "backdrop-opacity": { property: "backdrop-filter", fn: "opacity", scale: "ratio" }
4145
+ };
4146
+ var FILTER_ROOT_BY_PROP_FN = new Map(
4147
+ Object.entries(FILTER_FN_ROOTS).map(([root, e]) => [`${e.property}|${e.fn}`, root])
4148
+ );
4149
+ function filterStepToArg(scale, step) {
4150
+ if (scale === "ratio") return String(Number(step) / 100);
4151
+ if (scale === "percent") return `${step}%`;
4152
+ return `${step}deg`;
4153
+ }
4154
+ function filterArgToStep(scale, arg) {
4155
+ if (scale === "ratio") {
4156
+ const m2 = arg.match(/^(\d+(?:\.\d+)?)$/);
4157
+ if (!m2) return null;
4158
+ const step = Number(m2[1]) * 100;
4159
+ return Number.isInteger(step) ? String(step) : null;
4160
+ }
4161
+ const m = scale === "percent" ? arg.match(/^(\d+)%$/) : arg.match(/^(\d+)deg$/);
4162
+ return m ? m[1] ?? null : null;
4163
+ }
4164
+ var ROUNDED_SIDE_CORNERS = {
4165
+ "rounded-t": ["border-top-left-radius", "border-top-right-radius"],
4166
+ "rounded-r": ["border-top-right-radius", "border-bottom-right-radius"],
4167
+ "rounded-b": ["border-bottom-left-radius", "border-bottom-right-radius"],
4168
+ "rounded-l": ["border-top-left-radius", "border-bottom-left-radius"]
4169
+ };
4031
4170
  var staticUtilities = {
4032
4171
  display: {
4033
4172
  flex: "flex",
@@ -4041,7 +4180,15 @@ var staticUtilities = {
4041
4180
  table: "table",
4042
4181
  contents: "contents",
4043
4182
  "flow-root": "flow-root",
4044
- "list-item": "list-item"
4183
+ "list-item": "list-item",
4184
+ "table-row": "table-row",
4185
+ "table-cell": "table-cell",
4186
+ "table-caption": "table-caption",
4187
+ "table-row-group": "table-row-group",
4188
+ "table-header-group": "table-header-group",
4189
+ "table-footer-group": "table-footer-group",
4190
+ "table-column": "table-column",
4191
+ "table-column-group": "table-column-group"
4045
4192
  },
4046
4193
  flexDirection: {
4047
4194
  column: "flex-col",
@@ -4297,15 +4444,182 @@ var staticUtilities = {
4297
4444
  none: "transition-none"
4298
4445
  },
4299
4446
  transform: {
4300
- none: "transform-none"
4447
+ none: "transform-none",
4448
+ "translateZ(0)": "transform-gpu"
4301
4449
  },
4302
4450
  boxShadow: {
4303
4451
  none: "shadow-none"
4304
4452
  },
4305
4453
  outline: {
4306
4454
  none: "outline-none"
4455
+ },
4456
+ outlineStyle: {
4457
+ solid: "outline-solid",
4458
+ dashed: "outline-dashed",
4459
+ dotted: "outline-dotted",
4460
+ double: "outline-double"
4461
+ },
4462
+ fontStyle: {
4463
+ italic: "italic",
4464
+ normal: "not-italic"
4465
+ },
4466
+ isolation: {
4467
+ isolate: "isolate",
4468
+ auto: "isolation-auto"
4469
+ },
4470
+ borderCollapse: {
4471
+ collapse: "border-collapse",
4472
+ separate: "border-separate"
4473
+ },
4474
+ tableLayout: {
4475
+ auto: "table-auto",
4476
+ fixed: "table-fixed"
4477
+ },
4478
+ appearance: {
4479
+ none: "appearance-none",
4480
+ auto: "appearance-auto"
4481
+ },
4482
+ fontVariantNumeric: {
4483
+ "tabular-nums": "tabular-nums",
4484
+ normal: "normal-nums",
4485
+ ordinal: "ordinal",
4486
+ "slashed-zero": "slashed-zero",
4487
+ "lining-nums": "lining-nums",
4488
+ "oldstyle-nums": "oldstyle-nums",
4489
+ "proportional-nums": "proportional-nums",
4490
+ "diagonal-fractions": "diagonal-fractions",
4491
+ "stacked-fractions": "stacked-fractions"
4492
+ },
4493
+ // Tailwind pairs snap-x/y/both with a separate strictness class composed via a CSS
4494
+ // var; without var composition the common `snap-x snap-mandatory` intent collapses
4495
+ // into the type class itself. `snap-proximity`/`snap-mandatory` alone stay foreign.
4496
+ scrollSnapType: {
4497
+ "x mandatory": "snap-x",
4498
+ "y mandatory": "snap-y",
4499
+ "both mandatory": "snap-both",
4500
+ none: "snap-none"
4501
+ },
4502
+ scrollSnapAlign: {
4503
+ start: "snap-start",
4504
+ center: "snap-center",
4505
+ end: "snap-end",
4506
+ none: "snap-align-none"
4507
+ },
4508
+ // Bare filter-function switches (the 100% forms); numeric/arbitrary forms flow
4509
+ // through FILTER_FN_ROOTS (`grayscale-50`, `invert-[0.3]`).
4510
+ filter: {
4511
+ "grayscale(100%)": "grayscale",
4512
+ "invert(100%)": "invert",
4513
+ "sepia(100%)": "sepia",
4514
+ none: "filter-none"
4515
+ },
4516
+ backdropFilter: {
4517
+ "grayscale(100%)": "backdrop-grayscale",
4518
+ "invert(100%)": "backdrop-invert",
4519
+ "sepia(100%)": "backdrop-sepia",
4520
+ none: "backdrop-filter-none"
4521
+ },
4522
+ float: {
4523
+ left: "float-left",
4524
+ right: "float-right",
4525
+ none: "float-none",
4526
+ "inline-start": "float-start",
4527
+ "inline-end": "float-end"
4528
+ },
4529
+ clear: {
4530
+ both: "clear-both",
4531
+ left: "clear-left",
4532
+ right: "clear-right",
4533
+ none: "clear-none"
4534
+ },
4535
+ backgroundSize: {
4536
+ cover: "bg-cover",
4537
+ contain: "bg-contain",
4538
+ auto: "bg-auto"
4539
+ },
4540
+ backgroundAttachment: {
4541
+ fixed: "bg-fixed",
4542
+ local: "bg-local",
4543
+ scroll: "bg-scroll"
4544
+ },
4545
+ backgroundRepeat: {
4546
+ "no-repeat": "bg-no-repeat",
4547
+ repeat: "bg-repeat",
4548
+ "repeat-x": "bg-repeat-x",
4549
+ "repeat-y": "bg-repeat-y",
4550
+ round: "bg-repeat-round",
4551
+ space: "bg-repeat-space"
4552
+ },
4553
+ backgroundPosition: {
4554
+ center: "bg-center",
4555
+ top: "bg-top",
4556
+ bottom: "bg-bottom",
4557
+ left: "bg-left",
4558
+ right: "bg-right",
4559
+ "left top": "bg-left-top",
4560
+ "left bottom": "bg-left-bottom",
4561
+ "right top": "bg-right-top",
4562
+ "right bottom": "bg-right-bottom"
4563
+ },
4564
+ backgroundClip: {
4565
+ "border-box": "bg-clip-border",
4566
+ "padding-box": "bg-clip-padding",
4567
+ "content-box": "bg-clip-content",
4568
+ text: "bg-clip-text"
4569
+ },
4570
+ backgroundOrigin: {
4571
+ "border-box": "bg-origin-border",
4572
+ "padding-box": "bg-origin-padding",
4573
+ "content-box": "bg-origin-content"
4574
+ },
4575
+ textOverflow: {
4576
+ ellipsis: "text-ellipsis",
4577
+ clip: "text-clip"
4578
+ },
4579
+ // `text-nowrap` deliberately stays a whiteSpace alias (same rendering) — see staticClassAliases.
4580
+ textWrap: {
4581
+ wrap: "text-wrap",
4582
+ balance: "text-balance",
4583
+ pretty: "text-pretty"
4584
+ },
4585
+ textDecorationStyle: {
4586
+ solid: "decoration-solid",
4587
+ dashed: "decoration-dashed",
4588
+ dotted: "decoration-dotted",
4589
+ double: "decoration-double",
4590
+ wavy: "decoration-wavy"
4591
+ },
4592
+ hyphens: {
4593
+ auto: "hyphens-auto",
4594
+ none: "hyphens-none",
4595
+ manual: "hyphens-manual"
4596
+ },
4597
+ content: {
4598
+ none: "content-none"
4599
+ },
4600
+ captionSide: {
4601
+ top: "caption-top",
4602
+ bottom: "caption-bottom"
4603
+ },
4604
+ animation: {
4605
+ none: "animate-none"
4606
+ },
4607
+ // SVG paint statics; token/arbitrary colors flow through the fill/stroke roots.
4608
+ fill: {
4609
+ currentColor: "fill-current",
4610
+ none: "fill-none"
4611
+ },
4612
+ stroke: {
4613
+ currentColor: "stroke-current",
4614
+ none: "stroke-none"
4307
4615
  }
4308
4616
  };
4617
+ var staticClassAliases = {
4618
+ "text-nowrap": { prop: "whiteSpace", value: "nowrap" },
4619
+ // canonical: whitespace-nowrap
4620
+ "break-words": { prop: "overflowWrap", value: "break-word" }
4621
+ // canonical: wrap-break-word
4622
+ };
4309
4623
  var SPACING_SCALE = {
4310
4624
  "0": "0px",
4311
4625
  px: "1px",
@@ -4375,6 +4689,20 @@ var SPACING_SCALE_ROOTS = /* @__PURE__ */ new Set([
4375
4689
  "inset",
4376
4690
  "inset-x",
4377
4691
  "inset-y",
4692
+ "start",
4693
+ "end",
4694
+ "indent",
4695
+ "border-spacing",
4696
+ "scroll-m",
4697
+ "scroll-mt",
4698
+ "scroll-mr",
4699
+ "scroll-mb",
4700
+ "scroll-ml",
4701
+ "scroll-p",
4702
+ "scroll-pt",
4703
+ "scroll-pr",
4704
+ "scroll-pb",
4705
+ "scroll-pl",
4378
4706
  "w",
4379
4707
  "h",
4380
4708
  "size",
@@ -4384,9 +4712,19 @@ var SPACING_SCALE_ROOTS = /* @__PURE__ */ new Set([
4384
4712
  "max-h",
4385
4713
  "basis"
4386
4714
  ]);
4387
- var COLOR_TOKEN_ROOTS = /* @__PURE__ */ new Set(["text", "bg", "border", "accent", "outline"]);
4715
+ var COLOR_TOKEN_ROOTS = /* @__PURE__ */ new Set([
4716
+ "text",
4717
+ "bg",
4718
+ "border",
4719
+ "accent",
4720
+ "outline",
4721
+ "decoration",
4722
+ "caret",
4723
+ "fill",
4724
+ "stroke"
4725
+ ]);
4388
4726
  var staticUtilityReverse = (() => {
4389
- const reverse = {};
4727
+ const reverse = { ...staticClassAliases };
4390
4728
  for (const [prop, values] of Object.entries(staticUtilities)) {
4391
4729
  for (const [value, className] of Object.entries(values)) {
4392
4730
  if (!reverse[className]) {
@@ -4397,13 +4735,72 @@ var staticUtilityReverse = (() => {
4397
4735
  return reverse;
4398
4736
  })();
4399
4737
  var keywordValues = {
4400
- w: { auto: "auto", full: "100%", screen: "100vw", fit: "fit-content", min: "min-content", max: "max-content" },
4401
- h: { auto: "auto", full: "100%", screen: "100vh", fit: "fit-content", min: "min-content", max: "max-content" },
4402
- "max-w": { full: "100%", none: "none", screen: "100vw", fit: "fit-content", min: "min-content", max: "max-content" },
4403
- "max-h": { full: "100%", none: "none", screen: "100vh", fit: "fit-content", min: "min-content", max: "max-content" },
4738
+ w: {
4739
+ auto: "auto",
4740
+ full: "100%",
4741
+ screen: "100vw",
4742
+ svw: "100svw",
4743
+ dvw: "100dvw",
4744
+ lvw: "100lvw",
4745
+ fit: "fit-content",
4746
+ min: "min-content",
4747
+ max: "max-content"
4748
+ },
4749
+ h: {
4750
+ auto: "auto",
4751
+ full: "100%",
4752
+ screen: "100vh",
4753
+ svh: "100svh",
4754
+ dvh: "100dvh",
4755
+ lvh: "100lvh",
4756
+ fit: "fit-content",
4757
+ min: "min-content",
4758
+ max: "max-content"
4759
+ },
4760
+ "max-w": {
4761
+ full: "100%",
4762
+ none: "none",
4763
+ screen: "100vw",
4764
+ svw: "100svw",
4765
+ dvw: "100dvw",
4766
+ lvw: "100lvw",
4767
+ fit: "fit-content",
4768
+ min: "min-content",
4769
+ max: "max-content"
4770
+ },
4771
+ "max-h": {
4772
+ full: "100%",
4773
+ none: "none",
4774
+ screen: "100vh",
4775
+ svh: "100svh",
4776
+ dvh: "100dvh",
4777
+ lvh: "100lvh",
4778
+ fit: "fit-content",
4779
+ min: "min-content",
4780
+ max: "max-content"
4781
+ },
4404
4782
  size: { auto: "auto", full: "100%", fit: "fit-content", min: "min-content", max: "max-content" },
4405
- "min-w": { auto: "auto", full: "100%", fit: "fit-content", min: "min-content", max: "max-content" },
4406
- "min-h": { auto: "auto", full: "100%", screen: "100vh", fit: "fit-content", min: "min-content", max: "max-content" },
4783
+ "min-w": {
4784
+ auto: "auto",
4785
+ full: "100%",
4786
+ svw: "100svw",
4787
+ dvw: "100dvw",
4788
+ lvw: "100lvw",
4789
+ fit: "fit-content",
4790
+ min: "min-content",
4791
+ max: "max-content"
4792
+ },
4793
+ "min-h": {
4794
+ auto: "auto",
4795
+ full: "100%",
4796
+ screen: "100vh",
4797
+ svh: "100svh",
4798
+ dvh: "100dvh",
4799
+ lvh: "100lvh",
4800
+ fit: "fit-content",
4801
+ min: "min-content",
4802
+ max: "max-content"
4803
+ },
4407
4804
  m: { auto: "auto" },
4408
4805
  mt: { auto: "auto" },
4409
4806
  mr: { auto: "auto" },
@@ -4428,16 +4825,48 @@ var keywordValues = {
4428
4825
  "inset-x": { auto: "auto", full: "100%" },
4429
4826
  "inset-y": { auto: "auto", full: "100%" },
4430
4827
  aspect: { auto: "auto", square: "1 / 1", video: "16 / 9" },
4431
- order: { first: "-9999", last: "9999", none: "0" }
4828
+ order: { first: "-9999", last: "9999", none: "0" },
4829
+ "will-change": { scroll: "scroll-position" },
4830
+ // other values (transform, contents, auto) pass through generically
4831
+ columns: { auto: "auto" },
4832
+ start: { auto: "auto", full: "100%" },
4833
+ end: { auto: "auto", full: "100%" },
4834
+ "underline-offset": { auto: "auto" },
4835
+ "auto-cols": { auto: "auto", min: "min-content", max: "max-content", fr: "minmax(0, 1fr)" },
4836
+ "auto-rows": { auto: "auto", min: "min-content", max: "max-content", fr: "minmax(0, 1fr)" },
4837
+ col: { auto: "auto" },
4838
+ row: { auto: "auto" },
4839
+ decoration: { "from-font": "from-font" }
4840
+ // thickness keyword; style keywords are statics, colors flow via value type
4432
4841
  };
4433
- var genericKeywordRoots = /* @__PURE__ */ new Set(["cursor", "align", "origin", "object", "list"]);
4434
- var integerValueRoots = /* @__PURE__ */ new Set(["z", "order", "flex", "grow", "shrink"]);
4842
+ var genericKeywordRoots = /* @__PURE__ */ new Set([
4843
+ "cursor",
4844
+ "align",
4845
+ "origin",
4846
+ "object",
4847
+ "list",
4848
+ "mix-blend",
4849
+ "bg-blend",
4850
+ "will-change",
4851
+ "overscroll",
4852
+ "overscroll-x",
4853
+ "overscroll-y",
4854
+ "touch",
4855
+ "break-after",
4856
+ "break-before",
4857
+ "break-inside"
4858
+ ]);
4859
+ var integerValueRoots = /* @__PURE__ */ new Set(["z", "order", "flex", "grow", "shrink", "columns", "stroke"]);
4435
4860
  var colorTokenProps = /* @__PURE__ */ new Set([
4436
4861
  "color",
4437
4862
  "backgroundColor",
4438
4863
  "borderColor",
4439
4864
  "accentColor",
4440
- "outlineColor"
4865
+ "outlineColor",
4866
+ "textDecorationColor",
4867
+ "caretColor",
4868
+ "fill",
4869
+ "stroke"
4441
4870
  ]);
4442
4871
  var FRACTION_ROOTS = /* @__PURE__ */ new Set([
4443
4872
  "w",
@@ -4770,7 +5199,8 @@ var SPECS = [
4770
5199
  ["md", "0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)"],
4771
5200
  ["lg", "0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1)"],
4772
5201
  ["xl", "0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1)"],
4773
- ["2xl", "0 25px 50px -12px rgb(0 0 0 / 0.25)"]
5202
+ ["2xl", "0 25px 50px -12px rgb(0 0 0 / 0.25)"],
5203
+ ["inner", "inset 0 2px 4px 0 rgb(0 0 0 / 0.05)"]
4774
5204
  ]
4775
5205
  },
4776
5206
  {
@@ -4995,6 +5425,10 @@ function resolveRootProperty(root, value) {
4995
5425
  if (isLengthValue(value)) return "outline-width";
4996
5426
  return "outline";
4997
5427
  }
5428
+ case "decoration":
5429
+ return isLengthValue(value) || value === "from-font" ? "text-decoration-thickness" : "text-decoration-color";
5430
+ case "stroke":
5431
+ return isColorValue(value) ? "stroke" : "stroke-width";
4998
5432
  default:
4999
5433
  return prefixToCSSProperty[root] ?? root;
5000
5434
  }
@@ -5133,6 +5567,47 @@ function parseUtilityClass(className, knownTokens) {
5133
5567
  return null;
5134
5568
  }
5135
5569
  function parseRootValue(root, rest, knownTokens) {
5570
+ const filterFn = FILTER_FN_ROOTS[root];
5571
+ if (filterFn) {
5572
+ const { property, fn, scale } = filterFn;
5573
+ if (rest.startsWith("[") && rest.endsWith("]") && rest.length > 2) {
5574
+ const arg = decodeArbitraryValue(rest.slice(1, -1));
5575
+ return { property, value: `${fn}(${arg})`, root, kind: "arbitrary" };
5576
+ }
5577
+ const varArg = rest.match(/^\((--[\w-]+)\)$/);
5578
+ if (varArg) {
5579
+ return { property, value: `${fn}(var(${varArg[1]}))`, root, kind: "var" };
5580
+ }
5581
+ if (scale && /^\d+(\.\d+)?$/.test(rest)) {
5582
+ return { property, value: `${fn}(${filterStepToArg(scale, rest)})`, root, kind: "numeric" };
5583
+ }
5584
+ return null;
5585
+ }
5586
+ if (root === "skew-x" || root === "skew-y") {
5587
+ const fn = root === "skew-x" ? "skewX" : "skewY";
5588
+ if (rest.startsWith("[") && rest.endsWith("]") && rest.length > 2) {
5589
+ return {
5590
+ property: "transform",
5591
+ value: `${fn}(${decodeArbitraryValue(rest.slice(1, -1))})`,
5592
+ root,
5593
+ kind: "arbitrary"
5594
+ };
5595
+ }
5596
+ if (/^\d+(\.\d+)?$/.test(rest)) {
5597
+ return { property: "transform", value: `${fn}(${rest}deg)`, root, kind: "numeric" };
5598
+ }
5599
+ return null;
5600
+ }
5601
+ if (root === "scale-x" || root === "scale-y") {
5602
+ const pair = (v) => root === "scale-x" ? `${v} 1` : `1 ${v}`;
5603
+ if (rest.startsWith("[") && rest.endsWith("]") && rest.length > 2) {
5604
+ return { property: "scale", value: pair(decodeArbitraryValue(rest.slice(1, -1))), root, kind: "arbitrary" };
5605
+ }
5606
+ if (/^\d+$/.test(rest)) {
5607
+ return { property: "scale", value: pair(String(Number(rest) / 100)), root, kind: "numeric" };
5608
+ }
5609
+ return null;
5610
+ }
5136
5611
  if (rest.startsWith("[") && rest.endsWith("]") && rest.length > 2) {
5137
5612
  const value = decodeArbitraryValue(rest.slice(1, -1));
5138
5613
  return { property: resolveRootProperty(root, value), value, root, kind: "arbitrary" };
@@ -5151,6 +5626,17 @@ function parseRootValue(root, rest, knownTokens) {
5151
5626
  }
5152
5627
  return { property, value, root, kind: "var" };
5153
5628
  }
5629
+ if (root.startsWith("rounded-") && prefixToCSSProperty[root]) {
5630
+ const themed = THEME_SCALE_BY_CLASS.get(`rounded-${rest}`);
5631
+ if (themed) {
5632
+ return { property: prefixToCSSProperty[root] ?? root, value: themeScaleValue(themed), root, kind: "var" };
5633
+ }
5634
+ const kw = keywordValues[root]?.[rest] ?? keywordValues.rounded?.[rest];
5635
+ if (kw !== void 0) {
5636
+ return { property: prefixToCSSProperty[root] ?? root, value: kw, root, kind: "keyword" };
5637
+ }
5638
+ return null;
5639
+ }
5154
5640
  if (root === "border" || BORDER_SIDE_PROPERTY[root]) {
5155
5641
  const border = parseBorderClass(root, rest);
5156
5642
  if (border) return border;
@@ -5197,6 +5683,16 @@ function parseRootValue(root, rest, knownTokens) {
5197
5683
  if ((root === "duration" || root === "delay") && /^\d+$/.test(rest)) {
5198
5684
  return { property: prefixToCSSProperty[root] ?? root, value: `${rest}ms`, root, kind: "numeric" };
5199
5685
  }
5686
+ if ((root === "outline" || root === "outline-offset" || root === "underline-offset") && /^\d+$/.test(rest)) {
5687
+ const property = root === "outline" ? "outline-width" : prefixToCSSProperty[root] ?? root;
5688
+ return { property, value: `${rest}px`, root, kind: "numeric" };
5689
+ }
5690
+ if (root === "decoration" && /^\d+$/.test(rest)) {
5691
+ return { property: "text-decoration-thickness", value: `${rest}px`, root, kind: "numeric" };
5692
+ }
5693
+ if (root === "stroke" && /^\d+$/.test(rest)) {
5694
+ return { property: "stroke-width", value: rest, root, kind: "numeric" };
5695
+ }
5200
5696
  if (root === "ease") {
5201
5697
  const timing = EASE_TIMING[rest];
5202
5698
  if (timing) return { property: "transition-timing-function", value: timing, root, kind: "keyword" };
@@ -5354,6 +5850,25 @@ function propertyValueToClass(prop, value) {
5354
5850
  return className2;
5355
5851
  }
5356
5852
  let className = null;
5853
+ if (prop === "filter" || prop === "backdropFilter") {
5854
+ const property = camelToKebab(prop);
5855
+ const varForm = stringValue.match(/^([a-z-]+)\(\s*var\((--[\w-]+)\)\s*\)$/);
5856
+ const plainForm = varForm ? null : stringValue.match(/^([a-z-]+)\(([^()]+)\)$/);
5857
+ const fnRoot = FILTER_ROOT_BY_PROP_FN.get(`${property}|${(varForm ?? plainForm)?.[1]}`);
5858
+ if (fnRoot && varForm) {
5859
+ className = `${fnRoot}-(${varForm[2]})`;
5860
+ } else if (fnRoot && plainForm) {
5861
+ const arg = (plainForm[2] ?? "").trim();
5862
+ const scale = FILTER_FN_ROOTS[fnRoot]?.scale;
5863
+ const step = scale ? filterArgToStep(scale, arg) : null;
5864
+ if (step != null) {
5865
+ className = `${fnRoot}-${step}`;
5866
+ } else {
5867
+ const encoded = encodeArbitraryValue(arg);
5868
+ if (encoded) className = `${fnRoot}-[${encoded}]`;
5869
+ }
5870
+ }
5871
+ }
5357
5872
  const kwTable = keywordValues[root];
5358
5873
  if (kwTable) {
5359
5874
  for (const [keyword, cssValue] of Object.entries(kwTable)) {
@@ -5573,6 +6088,11 @@ function classesToStyles(classes, knownTokens) {
5573
6088
  if (cleanClass.startsWith("size-") && styleEntry.prop === "width") {
5574
6089
  styles[breakpoint].height = styleEntry.value;
5575
6090
  }
6091
+ const sideRoot = cleanClass.match(/^(rounded-[trbl])-/)?.[1];
6092
+ const corners = sideRoot ? ROUNDED_SIDE_CORNERS[sideRoot] : void 0;
6093
+ if (corners) {
6094
+ styles[breakpoint][cssPropertyToCamel(corners[1] ?? "")] = styleEntry.value;
6095
+ }
5576
6096
  }
5577
6097
  }
5578
6098
  if (Object.keys(styles.tablet || {}).length === 0) delete styles.tablet;
@@ -5580,6 +6100,70 @@ function classesToStyles(classes, knownTokens) {
5580
6100
  const hasAny = Object.keys(styles.base || {}).length > 0 || Object.keys(styles.tablet || {}).length > 0 || Object.keys(styles.mobile || {}).length > 0;
5581
6101
  return hasAny ? styles : null;
5582
6102
  }
6103
+ var COLOR_ROOT_TO_PROP = {
6104
+ text: "color",
6105
+ bg: "backgroundColor",
6106
+ border: "borderColor",
6107
+ accent: "accentColor",
6108
+ outline: "outlineColor",
6109
+ decoration: "textDecorationColor",
6110
+ caret: "caretColor",
6111
+ fill: "fill",
6112
+ stroke: "stroke"
6113
+ };
6114
+ function classMergeKey(className) {
6115
+ const { breakpoint, base } = splitVariantPrefix(className);
6116
+ let bp = normalizeBreakpointVariant(breakpoint) ?? "";
6117
+ if (bp === "lg") bp = "tablet";
6118
+ else if (bp === "sm") bp = "mobile";
6119
+ const entry = classToStyle(className);
6120
+ if (entry) return `${bp}|${entry.prop}`;
6121
+ const dash = base.indexOf("-");
6122
+ if (dash > 0) {
6123
+ const prop = COLOR_ROOT_TO_PROP[base.slice(0, dash)];
6124
+ if (prop && /^[a-zA-Z][\w-]*$/.test(base.slice(dash + 1))) return `${bp}|${prop}`;
6125
+ }
6126
+ return null;
6127
+ }
6128
+ function mergeInstanceClasses(own, instanceClass) {
6129
+ const instance = instanceClass.split(/\s+/).filter(Boolean);
6130
+ if (instance.length === 0) return own;
6131
+ const overridden = new Set(instance.map(classMergeKey).filter((k) => k !== null));
6132
+ const kept = own.filter((cls) => {
6133
+ const key = classMergeKey(cls);
6134
+ return key === null || !overridden.has(key);
6135
+ });
6136
+ return [...kept, ...instance];
6137
+ }
6138
+ function stripClassOverriddenStyleProps(style, instanceClass) {
6139
+ if (!style || typeof style !== "object") return null;
6140
+ const overridden = new Set(
6141
+ instanceClass.split(/\s+/).filter(Boolean).map(classMergeKey).filter((k) => k !== null)
6142
+ );
6143
+ if (overridden.size === 0) return style;
6144
+ const stripBucket = (bucket, bp) => {
6145
+ const out = {};
6146
+ for (const [prop, value] of Object.entries(bucket)) {
6147
+ if (!overridden.has(`${bp}|${prop}`)) out[prop] = value;
6148
+ }
6149
+ return out;
6150
+ };
6151
+ if (isResponsiveStyle(style)) {
6152
+ const out = {};
6153
+ let changed = false;
6154
+ for (const [bpName, bucket] of Object.entries(style)) {
6155
+ if (!bucket || typeof bucket !== "object") continue;
6156
+ const stripped = stripBucket(bucket, bpName === "base" ? "" : bpName);
6157
+ if (Object.keys(stripped).length !== Object.keys(bucket).length) changed = true;
6158
+ if (Object.keys(stripped).length > 0) out[bpName] = stripped;
6159
+ }
6160
+ if (!changed) return style;
6161
+ return Object.keys(out).length > 0 ? out : null;
6162
+ }
6163
+ const flat = stripBucket(style, "");
6164
+ if (Object.keys(flat).length === Object.keys(style).length) return style;
6165
+ return Object.keys(flat).length > 0 ? flat : null;
6166
+ }
5583
6167
  function isClassableStyleValue(value) {
5584
6168
  if (typeof value === "number") return true;
5585
6169
  if (typeof value === "string") return !value.includes("{{");
@@ -6294,6 +6878,10 @@ function generateRuleForClass(className, knownTokens) {
6294
6878
  if (root === "size") {
6295
6879
  return `width: ${value}; height: ${value};`;
6296
6880
  }
6881
+ const sideCorners = root ? ROUNDED_SIDE_CORNERS[root] : void 0;
6882
+ if (sideCorners) {
6883
+ return `${sideCorners[0]}: ${value}; ${sideCorners[1]}: ${value};`;
6884
+ }
6297
6885
  if (root === "px") {
6298
6886
  return `padding-left: ${value}; padding-right: ${value};`;
6299
6887
  }
@@ -6877,6 +7465,9 @@ export {
6877
7465
  responsiveStylesToClasses,
6878
7466
  classToStyle,
6879
7467
  classesToStyles,
7468
+ classMergeKey,
7469
+ mergeInstanceClasses,
7470
+ stripClassOverriddenStyleProps,
6880
7471
  isClassableStyleValue,
6881
7472
  splitStyleByClassability,
6882
7473
  styleHasMapping,
@@ -6927,4 +7518,4 @@ export {
6927
7518
  generateInteractiveCSS,
6928
7519
  generateAllInteractiveCSS
6929
7520
  };
6930
- //# sourceMappingURL=chunk-UOF4MCAD.js.map
7521
+ //# sourceMappingURL=chunk-KX2LPIZZ.js.map