meno-core 1.1.3 → 1.1.5

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 (57) hide show
  1. package/dist/chunks/{chunk-3JXK2QFU.js → chunk-H6EOTPJA.js} +2 -2
  2. package/dist/chunks/{chunk-LOZL5HOF.js → chunk-RLBV2R6J.js} +603 -17
  3. package/dist/chunks/chunk-RLBV2R6J.js.map +7 -0
  4. package/dist/chunks/{chunk-FQBIC2OB.js → chunk-YMBUSHII.js} +1 -1
  5. package/dist/chunks/{chunk-FQBIC2OB.js.map → chunk-YMBUSHII.js.map} +1 -1
  6. package/dist/lib/client/index.js +46 -28
  7. package/dist/lib/client/index.js.map +2 -2
  8. package/dist/lib/server/index.js +1304 -241
  9. package/dist/lib/server/index.js.map +4 -4
  10. package/dist/lib/shared/index.js +4 -2
  11. package/dist/lib/shared/index.js.map +1 -1
  12. package/lib/client/core/ComponentBuilder.test.ts +32 -0
  13. package/lib/client/core/ComponentBuilder.ts +30 -0
  14. package/lib/client/theme.test.ts +2 -2
  15. package/lib/client/theme.ts +28 -26
  16. package/lib/server/createServer.ts +5 -1
  17. package/lib/server/cssAudit.test.ts +270 -0
  18. package/lib/server/cssAudit.ts +815 -0
  19. package/lib/server/deMirror.test.ts +61 -0
  20. package/lib/server/deMirror.ts +317 -0
  21. package/lib/server/fileWatcher.test.ts +113 -0
  22. package/lib/server/fileWatcher.ts +42 -1
  23. package/lib/server/index.ts +19 -0
  24. package/lib/server/routes/api/core-routes.ts +18 -0
  25. package/lib/server/routes/api/cssAudit.test.ts +101 -0
  26. package/lib/server/routes/api/cssAudit.ts +138 -0
  27. package/lib/server/routes/api/deMirror.test.ts +105 -0
  28. package/lib/server/routes/api/deMirror.ts +127 -0
  29. package/lib/server/routes/api/pages.ts +2 -2
  30. package/lib/server/services/componentService.test.ts +43 -0
  31. package/lib/server/services/componentService.ts +49 -12
  32. package/lib/server/services/configService.ts +0 -5
  33. package/lib/server/services/pageService.test.ts +15 -0
  34. package/lib/server/services/pageService.ts +44 -22
  35. package/lib/server/ssr/htmlGenerator.test.ts +29 -1
  36. package/lib/server/ssr/htmlGenerator.ts +86 -14
  37. package/lib/server/themeCssCodec.test.ts +67 -0
  38. package/lib/server/themeCssCodec.ts +67 -5
  39. package/lib/server/webflow/templateWrapper.ts +54 -0
  40. package/lib/shared/cssGeneration.test.ts +64 -0
  41. package/lib/shared/cssGeneration.ts +6 -1
  42. package/lib/shared/interfaces/contentProvider.ts +9 -0
  43. package/lib/shared/tailwindThemeScale.ts +1 -0
  44. package/lib/shared/types/cms.ts +1 -0
  45. package/lib/shared/types/comment.ts +9 -3
  46. package/lib/shared/utilityClassConfig.ts +471 -10
  47. package/lib/shared/utilityClassMapper.test.ts +173 -2
  48. package/lib/shared/utilityClassMapper.ts +37 -0
  49. package/lib/shared/utilityClassNames.ts +164 -0
  50. package/lib/shared/utils/fileUtils.ts +11 -0
  51. package/lib/shared/validation/schemas.ts +1 -0
  52. package/lib/shared/viewportUnits.test.ts +34 -1
  53. package/lib/shared/viewportUnits.ts +43 -0
  54. package/package.json +3 -1
  55. package/vite.config.ts +4 -1
  56. package/dist/chunks/chunk-LOZL5HOF.js.map +0 -7
  57. /package/dist/chunks/{chunk-3JXK2QFU.js.map → chunk-H6EOTPJA.js.map} +0 -0
@@ -515,7 +515,9 @@ var init_schemas = __esm({
515
515
  options: z.array(z.string()).optional(),
516
516
  accept: z.string().optional(),
517
517
  collection: z.string().optional(),
518
- multiple: z.boolean().optional()
518
+ multiple: z.boolean().optional(),
519
+ editor: z.enum(["basic", "extended"]).optional()
520
+ // For 'rich-text' type: selects the render helper (Basic → richText(); Extended → richTextWithComponents())
519
521
  }).passthrough();
520
522
  CMSClientDataStrategySchema = z.enum(["auto", "inline", "static"]);
521
523
  CMSClientDataConfigSchema = z.object({
@@ -3889,12 +3891,43 @@ var propertyMap = {
3889
3891
  textShadow: "text-shadow",
3890
3892
  filter: "filter",
3891
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",
3892
3923
  // Positioning
3893
3924
  top: "top",
3894
3925
  right: "right",
3895
3926
  bottom: "bottom",
3896
3927
  left: "left",
3897
3928
  inset: "inset",
3929
+ insetInlineStart: "start",
3930
+ insetInlineEnd: "end",
3898
3931
  zIndex: "z",
3899
3932
  // Grid Layout
3900
3933
  gridTemplateColumns: "grid-cols",
@@ -3956,6 +3989,8 @@ var prefixToCSSProperty = {
3956
3989
  "border-r": "border-right",
3957
3990
  "border-b": "border-bottom",
3958
3991
  "border-l": "border-left",
3992
+ "border-x": "border-inline",
3993
+ "border-y": "border-block",
3959
3994
  rounded: "border-radius",
3960
3995
  "rounded-tl": "border-top-left-radius",
3961
3996
  "rounded-tr": "border-top-right-radius",
@@ -4004,6 +4039,68 @@ var prefixToCSSProperty = {
4004
4039
  "text-shadow": "text-shadow",
4005
4040
  filter: "filter",
4006
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",
4007
4104
  // Positioning
4008
4105
  top: "top",
4009
4106
  right: "right",
@@ -4012,6 +4109,8 @@ var prefixToCSSProperty = {
4012
4109
  inset: "inset",
4013
4110
  "inset-x": "inset-inline",
4014
4111
  "inset-y": "inset-block",
4112
+ start: "inset-inline-start",
4113
+ end: "inset-inline-end",
4015
4114
  z: "z-index",
4016
4115
  // Outline
4017
4116
  outline: "outline",
@@ -4024,6 +4123,50 @@ var prefixToCSSProperty = {
4024
4123
  transition: "transition",
4025
4124
  object: "object-position"
4026
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
+ };
4027
4170
  var staticUtilities = {
4028
4171
  display: {
4029
4172
  flex: "flex",
@@ -4037,7 +4180,15 @@ var staticUtilities = {
4037
4180
  table: "table",
4038
4181
  contents: "contents",
4039
4182
  "flow-root": "flow-root",
4040
- "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"
4041
4192
  },
4042
4193
  flexDirection: {
4043
4194
  column: "flex-col",
@@ -4293,15 +4444,182 @@ var staticUtilities = {
4293
4444
  none: "transition-none"
4294
4445
  },
4295
4446
  transform: {
4296
- none: "transform-none"
4447
+ none: "transform-none",
4448
+ "translateZ(0)": "transform-gpu"
4297
4449
  },
4298
4450
  boxShadow: {
4299
4451
  none: "shadow-none"
4300
4452
  },
4301
4453
  outline: {
4302
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"
4303
4615
  }
4304
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
+ };
4305
4623
  var SPACING_SCALE = {
4306
4624
  "0": "0px",
4307
4625
  px: "1px",
@@ -4371,6 +4689,20 @@ var SPACING_SCALE_ROOTS = /* @__PURE__ */ new Set([
4371
4689
  "inset",
4372
4690
  "inset-x",
4373
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",
4374
4706
  "w",
4375
4707
  "h",
4376
4708
  "size",
@@ -4380,9 +4712,19 @@ var SPACING_SCALE_ROOTS = /* @__PURE__ */ new Set([
4380
4712
  "max-h",
4381
4713
  "basis"
4382
4714
  ]);
4383
- 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
+ ]);
4384
4726
  var staticUtilityReverse = (() => {
4385
- const reverse = {};
4727
+ const reverse = { ...staticClassAliases };
4386
4728
  for (const [prop, values] of Object.entries(staticUtilities)) {
4387
4729
  for (const [value, className] of Object.entries(values)) {
4388
4730
  if (!reverse[className]) {
@@ -4393,13 +4735,72 @@ var staticUtilityReverse = (() => {
4393
4735
  return reverse;
4394
4736
  })();
4395
4737
  var keywordValues = {
4396
- w: { auto: "auto", full: "100%", screen: "100vw", fit: "fit-content", min: "min-content", max: "max-content" },
4397
- h: { auto: "auto", full: "100%", screen: "100vh", fit: "fit-content", min: "min-content", max: "max-content" },
4398
- "max-w": { full: "100%", none: "none", screen: "100vw", fit: "fit-content", min: "min-content", max: "max-content" },
4399
- "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
+ },
4400
4782
  size: { auto: "auto", full: "100%", fit: "fit-content", min: "min-content", max: "max-content" },
4401
- "min-w": { auto: "auto", full: "100%", fit: "fit-content", min: "min-content", max: "max-content" },
4402
- "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
+ },
4403
4804
  m: { auto: "auto" },
4404
4805
  mt: { auto: "auto" },
4405
4806
  mr: { auto: "auto" },
@@ -4424,16 +4825,48 @@ var keywordValues = {
4424
4825
  "inset-x": { auto: "auto", full: "100%" },
4425
4826
  "inset-y": { auto: "auto", full: "100%" },
4426
4827
  aspect: { auto: "auto", square: "1 / 1", video: "16 / 9" },
4427
- 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
4428
4841
  };
4429
- var genericKeywordRoots = /* @__PURE__ */ new Set(["cursor", "align", "origin", "object", "list"]);
4430
- 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"]);
4431
4860
  var colorTokenProps = /* @__PURE__ */ new Set([
4432
4861
  "color",
4433
4862
  "backgroundColor",
4434
4863
  "borderColor",
4435
4864
  "accentColor",
4436
- "outlineColor"
4865
+ "outlineColor",
4866
+ "textDecorationColor",
4867
+ "caretColor",
4868
+ "fill",
4869
+ "stroke"
4437
4870
  ]);
4438
4871
  var FRACTION_ROOTS = /* @__PURE__ */ new Set([
4439
4872
  "w",
@@ -4766,7 +5199,8 @@ var SPECS = [
4766
5199
  ["md", "0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)"],
4767
5200
  ["lg", "0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1)"],
4768
5201
  ["xl", "0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1)"],
4769
- ["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)"]
4770
5204
  ]
4771
5205
  },
4772
5206
  {
@@ -4991,6 +5425,10 @@ function resolveRootProperty(root, value) {
4991
5425
  if (isLengthValue(value)) return "outline-width";
4992
5426
  return "outline";
4993
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";
4994
5432
  default:
4995
5433
  return prefixToCSSProperty[root] ?? root;
4996
5434
  }
@@ -5046,6 +5484,38 @@ function negateCssValue(root, value) {
5046
5484
  }
5047
5485
  return /^\d/.test(value) ? `-${value}` : null;
5048
5486
  }
5487
+ var BORDER_SIDE_PROPERTY = {
5488
+ border: "border",
5489
+ "border-t": "border-top",
5490
+ "border-r": "border-right",
5491
+ "border-b": "border-bottom",
5492
+ "border-l": "border-left",
5493
+ "border-x": "border-inline",
5494
+ "border-y": "border-block"
5495
+ };
5496
+ var BORDER_STYLE_KEYWORDS = /* @__PURE__ */ new Set(["solid", "dashed", "dotted", "double", "none", "hidden"]);
5497
+ var BORDER_STYLE = "solid";
5498
+ function parseBorderClass(root, rest) {
5499
+ if (root !== "border") {
5500
+ const sideProp2 = BORDER_SIDE_PROPERTY[root];
5501
+ if (sideProp2 && /^\d+$/.test(rest)) {
5502
+ return { property: sideProp2, value: `${rest}px ${BORDER_STYLE}`, root, kind: "numeric" };
5503
+ }
5504
+ return null;
5505
+ }
5506
+ const sideRoot = `border-${rest}`;
5507
+ const sideProp = BORDER_SIDE_PROPERTY[sideRoot];
5508
+ if (sideProp) {
5509
+ return { property: sideProp, value: `1px ${BORDER_STYLE}`, root: sideRoot, kind: "keyword" };
5510
+ }
5511
+ if (/^\d+$/.test(rest)) {
5512
+ return { property: "border", value: `${rest}px ${BORDER_STYLE}`, root: "border", kind: "numeric" };
5513
+ }
5514
+ if (BORDER_STYLE_KEYWORDS.has(rest)) {
5515
+ return { property: "border-style", value: rest, root: "border", kind: "keyword" };
5516
+ }
5517
+ return null;
5518
+ }
5049
5519
  function parseUtilityClass(className, knownTokens) {
5050
5520
  const stat = staticUtilityReverse[className];
5051
5521
  if (stat) {
@@ -5059,6 +5529,9 @@ function parseUtilityClass(className, knownTokens) {
5059
5529
  kind: "keyword"
5060
5530
  };
5061
5531
  }
5532
+ if (className === "border") {
5533
+ return { property: "border", value: `1px ${BORDER_STYLE}`, root: "border", kind: "keyword" };
5534
+ }
5062
5535
  if (className.startsWith("-") && className.length > 1) {
5063
5536
  const positive = parseUtilityClass(className.slice(1), knownTokens);
5064
5537
  if (positive?.root && positive.value != null && NEGATABLE_ROOTS.has(positive.root)) {
@@ -5094,6 +5567,47 @@ function parseUtilityClass(className, knownTokens) {
5094
5567
  return null;
5095
5568
  }
5096
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
+ }
5097
5611
  if (rest.startsWith("[") && rest.endsWith("]") && rest.length > 2) {
5098
5612
  const value = decodeArbitraryValue(rest.slice(1, -1));
5099
5613
  return { property: resolveRootProperty(root, value), value, root, kind: "arbitrary" };
@@ -5112,6 +5626,21 @@ function parseRootValue(root, rest, knownTokens) {
5112
5626
  }
5113
5627
  return { property, value, root, kind: "var" };
5114
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
+ }
5640
+ if (root === "border" || BORDER_SIDE_PROPERTY[root]) {
5641
+ const border = parseBorderClass(root, rest);
5642
+ if (border) return border;
5643
+ }
5115
5644
  const keyword = keywordValues[root]?.[rest];
5116
5645
  if (keyword !== void 0) {
5117
5646
  return { property: resolveRootProperty(root, keyword), value: keyword, root, kind: "keyword" };
@@ -5154,6 +5683,16 @@ function parseRootValue(root, rest, knownTokens) {
5154
5683
  if ((root === "duration" || root === "delay") && /^\d+$/.test(rest)) {
5155
5684
  return { property: prefixToCSSProperty[root] ?? root, value: `${rest}ms`, root, kind: "numeric" };
5156
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
+ }
5157
5696
  if (root === "ease") {
5158
5697
  const timing = EASE_TIMING[rest];
5159
5698
  if (timing) return { property: "transition-timing-function", value: timing, root, kind: "keyword" };
@@ -5311,6 +5850,25 @@ function propertyValueToClass(prop, value) {
5311
5850
  return className2;
5312
5851
  }
5313
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
+ }
5314
5872
  const kwTable = keywordValues[root];
5315
5873
  if (kwTable) {
5316
5874
  for (const [keyword, cssValue] of Object.entries(kwTable)) {
@@ -5530,6 +6088,11 @@ function classesToStyles(classes, knownTokens) {
5530
6088
  if (cleanClass.startsWith("size-") && styleEntry.prop === "width") {
5531
6089
  styles[breakpoint].height = styleEntry.value;
5532
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
+ }
5533
6096
  }
5534
6097
  }
5535
6098
  if (Object.keys(styles.tablet || {}).length === 0) delete styles.tablet;
@@ -5980,6 +6543,24 @@ function rewriteViewportUnits(input) {
5980
6543
  return `calc(var(--design-${unit}, 1${unit}) * ${num})`;
5981
6544
  });
5982
6545
  }
6546
+ function rewriteViewportUnitsInStylesheet(css) {
6547
+ if (!css) return css;
6548
+ let out = "";
6549
+ let seg = "";
6550
+ for (let i = 0; i < css.length; i++) {
6551
+ const ch = css[i];
6552
+ if (ch === "{") {
6553
+ out += seg + ch;
6554
+ seg = "";
6555
+ } else if (ch === "}") {
6556
+ out += rewriteViewportUnits(seg) + ch;
6557
+ seg = "";
6558
+ } else {
6559
+ seg += ch;
6560
+ }
6561
+ }
6562
+ return out + seg;
6563
+ }
5983
6564
  var DESIGN_VIEWPORT_VARS = [
5984
6565
  "--design-vh",
5985
6566
  "--design-svh",
@@ -6233,6 +6814,10 @@ function generateRuleForClass(className, knownTokens) {
6233
6814
  if (root === "size") {
6234
6815
  return `width: ${value}; height: ${value};`;
6235
6816
  }
6817
+ const sideCorners = root ? ROUNDED_SIDE_CORNERS[root] : void 0;
6818
+ if (sideCorners) {
6819
+ return `${sideCorners[0]}: ${value}; ${sideCorners[1]}: ${value};`;
6820
+ }
6236
6821
  if (root === "px") {
6237
6822
  return `padding-left: ${value}; padding-right: ${value};`;
6238
6823
  }
@@ -6853,6 +7438,7 @@ export {
6853
7438
  normalizePath,
6854
7439
  isCurrentLink,
6855
7440
  rewriteViewportUnits,
7441
+ rewriteViewportUnitsInStylesheet,
6856
7442
  DESIGN_VIEWPORT_VARS,
6857
7443
  toFriendlyError,
6858
7444
  sortClassesByPropertyOrder,
@@ -6865,4 +7451,4 @@ export {
6865
7451
  generateInteractiveCSS,
6866
7452
  generateAllInteractiveCSS
6867
7453
  };
6868
- //# sourceMappingURL=chunk-LOZL5HOF.js.map
7454
+ //# sourceMappingURL=chunk-RLBV2R6J.js.map