@pandacss/generator 0.10.0 → 0.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -94,6 +94,10 @@ declare const getEngine: (conf: ConfigResultWithHooks) => {
94
94
  conditions: _pandacss_core.Conditions;
95
95
  createSheetContext: () => _pandacss_core.StylesheetContext;
96
96
  createSheet: (options?: Pick<_pandacss_core.StylesheetOptions, "content"> | undefined) => _pandacss_core.Stylesheet;
97
+ layers: _pandacss_types.CascadeLayers;
98
+ isValidLayerRule: (layerRule: string) => boolean;
99
+ layerString: string;
100
+ layerNames: string[];
97
101
  hooks: _pandacss_types.PandaHookable;
98
102
  path: string;
99
103
  config: _pandacss_types_dist_shared.UnwrapExtend<_pandacss_types.RequiredBy<_pandacss_types.Config, "outdir" | "cwd" | "include">>;
@@ -320,6 +324,10 @@ declare const createGenerator: (conf: ConfigResultWithHooks) => {
320
324
  conditions: _pandacss_core.Conditions;
321
325
  createSheetContext: () => _pandacss_core.StylesheetContext;
322
326
  createSheet: (options?: Pick<_pandacss_core.StylesheetOptions, "content"> | undefined) => _pandacss_core.Stylesheet;
327
+ layers: _pandacss_types.CascadeLayers;
328
+ isValidLayerRule: (layerRule: string) => boolean;
329
+ layerString: string;
330
+ layerNames: string[];
323
331
  hooks: _pandacss_types.PandaHookable;
324
332
  path: string;
325
333
  config: _pandacss_types_dist_shared.UnwrapExtend<_pandacss_types.RequiredBy<_pandacss_types.Config, "outdir" | "cwd" | "include">>;
package/dist/index.d.ts CHANGED
@@ -94,6 +94,10 @@ declare const getEngine: (conf: ConfigResultWithHooks) => {
94
94
  conditions: _pandacss_core.Conditions;
95
95
  createSheetContext: () => _pandacss_core.StylesheetContext;
96
96
  createSheet: (options?: Pick<_pandacss_core.StylesheetOptions, "content"> | undefined) => _pandacss_core.Stylesheet;
97
+ layers: _pandacss_types.CascadeLayers;
98
+ isValidLayerRule: (layerRule: string) => boolean;
99
+ layerString: string;
100
+ layerNames: string[];
97
101
  hooks: _pandacss_types.PandaHookable;
98
102
  path: string;
99
103
  config: _pandacss_types_dist_shared.UnwrapExtend<_pandacss_types.RequiredBy<_pandacss_types.Config, "outdir" | "cwd" | "include">>;
@@ -320,6 +324,10 @@ declare const createGenerator: (conf: ConfigResultWithHooks) => {
320
324
  conditions: _pandacss_core.Conditions;
321
325
  createSheetContext: () => _pandacss_core.StylesheetContext;
322
326
  createSheet: (options?: Pick<_pandacss_core.StylesheetOptions, "content"> | undefined) => _pandacss_core.Stylesheet;
327
+ layers: _pandacss_types.CascadeLayers;
328
+ isValidLayerRule: (layerRule: string) => boolean;
329
+ layerString: string;
330
+ layerNames: string[];
323
331
  hooks: _pandacss_types.PandaHookable;
324
332
  path: string;
325
333
  config: _pandacss_types_dist_shared.UnwrapExtend<_pandacss_types.RequiredBy<_pandacss_types.Config, "outdir" | "cwd" | "include">>;
package/dist/index.js CHANGED
@@ -206,7 +206,7 @@ function generateKeyframeCss(ctx) {
206
206
  var css = String.raw;
207
207
  function generateResetCss(ctx, scope = "") {
208
208
  const selector = scope ? `${scope} ` : "";
209
- const output = css`@layer reset {
209
+ const output = css`@layer ${ctx.layers.reset} {
210
210
  ${selector}* {
211
211
  margin: 0;
212
212
  padding: 0;
@@ -473,7 +473,7 @@ function generateTokenCss(ctx) {
473
473
  }
474
474
  }
475
475
  const css2 = results.join("\n\n");
476
- const output = `@layer tokens {
476
+ const output = `@layer ${ctx.layers.tokens} {
477
477
  ${(0, import_core3.prettifyCss)(cleanupSelectors(css2, root))}
478
478
  }
479
479
  `;
@@ -623,11 +623,7 @@ function generateCssFn(ctx) {
623
623
  config: { hash, prefix },
624
624
  conditions
625
625
  } = ctx;
626
- const { separator } = utility;
627
- const shorthandsByProp = Array.from(utility.shorthands.entries()).reduce((acc, [shorthand, prop]) => {
628
- acc[prop] = shorthand;
629
- return acc;
630
- }, {});
626
+ const { separator, getPropShorthands } = utility;
631
627
  return {
632
628
  dts: import_outdent4.outdent`
633
629
  import type { SystemStyleObject } from '../types'
@@ -644,25 +640,39 @@ function generateCssFn(ctx) {
644
640
  ${ctx.file.import("sortConditions, finalizeConditions", "./conditions")}
645
641
 
646
642
  const utilities = "${utility.entries().map(([prop, className]) => {
647
- const shorthand = shorthandsByProp[prop];
648
- return [prop, shorthand ? [className, shorthand === className ? 1 : shorthand].join("/") : className].join(":");
643
+ const shorthandList = getPropShorthands(prop);
644
+ const result = [
645
+ prop,
646
+ [
647
+ className,
648
+ shorthandList.length ? (
649
+ // mark shorthand equal to className as 1 to save a few bytes
650
+ shorthandList.map((shorthand) => shorthand === className ? 1 : shorthand).join("/")
651
+ ) : null
652
+ ].filter(Boolean).join("/")
653
+ ].join(":");
654
+ return result;
649
655
  }).join(",")}"
650
656
 
651
- const classMap = {}
657
+ const classNameByProp = new Map()
652
658
  ${utility.hasShorthand ? import_outdent4.outdent`
653
- const shorthands = {}
659
+ const shorthands = new Map()
654
660
  utilities.split(',').forEach((utility) => {
655
661
  const [prop, meta] = utility.split(':')
656
- const [className, shorthand] = meta.split('/')
657
- classMap[prop] = className
658
- if (shorthand) shorthands[shorthand === '1' ? className : shorthand] = prop
662
+ const [className, ...shorthandList] = meta.split('/')
663
+ classNameByProp.set(prop, className)
664
+ if (shorthandList.length) {
665
+ shorthandList.forEach((shorthand) => {
666
+ shorthands.set(shorthand === '1' ? className : shorthand, prop)
667
+ })
668
+ }
659
669
  })
660
670
 
661
- const resolveShorthand = (prop) => shorthands[prop] || prop
671
+ const resolveShorthand = (prop) => shorthands.get(prop) || prop
662
672
  ` : import_outdent4.outdent`
663
673
  utilities.split(',').forEach((utility) => {
664
674
  const [prop, className] = utility.split(':')
665
- classMap[prop] = className
675
+ classNameByProp.set(prop, className)
666
676
  })
667
677
  `}
668
678
 
@@ -677,15 +687,21 @@ function generateCssFn(ctx) {
677
687
  ${prefix ? "prefix: " + JSON.stringify(prefix) + "," : ""}
678
688
  transform: ${utility.hasShorthand ? `(prop, value) => {
679
689
  const key = resolveShorthand(prop)
680
- const propKey = classMap[key] || hypenateProperty(key)
690
+ const propKey = classNameByProp.get(key) || hypenateProperty(key)
681
691
  return { className: \`\${propKey}${separator}\${withoutSpace(value)}\` }
682
- }` : `(key, value) => ({ className: \`\${classMap[key] || hypenateProperty(key)}${separator}\${withoutSpace(value)}\` })`},
692
+ }` : `(key, value) => ({ className: \`\${classNameByProp.get(key) || hypenateProperty(key)}${separator}\${withoutSpace(value)}\` })`},
683
693
  ${utility.hasShorthand ? "hasShorthand: true," : ""}
684
694
  resolveShorthand: ${utility.hasShorthand ? "resolveShorthand" : "prop => prop"},
685
695
  }
686
696
  }
687
697
 
688
- export const css = createCss(context)
698
+ const cssFn = createCss(context)
699
+ export const cssCache = new Map()
700
+ export const css = (styles) => {
701
+ const classNames = cssFn(styles)
702
+ cssCache.set(classNames, styles)
703
+ return classNames
704
+ }
689
705
  css.raw = (styles) => styles
690
706
 
691
707
  export const { mergeCss, assignCss } = createMergeCss(context)
@@ -823,23 +839,34 @@ function generateCvaFn(ctx) {
823
839
 
824
840
  // src/artifacts/js/cx.ts
825
841
  var import_outdent7 = __toESM(require("outdent"));
826
- function generateCx() {
842
+ function generateCx(ctx) {
827
843
  return {
828
844
  js: import_outdent7.default`
845
+ ${ctx.file.import("cssCache, css, mergeCss", "./css")}
846
+
829
847
  function cx() {
848
+ const objs = []
830
849
  let str = '',
831
850
  i = 0,
832
851
  arg
833
-
852
+
834
853
  for (; i < arguments.length; ) {
835
- if ((arg = arguments[i++]) && typeof arg === 'string') {
836
- str && (str += ' ')
837
- str += arg
854
+ arg = arguments[i++]
855
+ if (!arg || typeof arg !== 'string') continue
856
+
857
+ if (cssCache.has(arg)) {
858
+ objs.push(cssCache.get(arg))
859
+ continue
838
860
  }
861
+
862
+ str && (str += ' ')
863
+ str += arg.toString()
839
864
  }
840
- return str
865
+
866
+ const merged = mergeCss(...objs)
867
+ return [css(merged), str].join(' ')
841
868
  }
842
-
869
+
843
870
  export { cx }
844
871
  `,
845
872
  dts: import_outdent7.default`
@@ -891,14 +918,14 @@ function generateHelpers(ctx) {
891
918
 
892
919
  // src/artifacts/generated/is-valid-prop.mjs.json
893
920
  var is_valid_prop_mjs_default = {
894
- content: '// src/index.ts\nvar userGeneratedStr = "";\nvar userGenerated = userGeneratedStr.split(",");\nvar cssPropertiesStr = "WebkitAppearance,WebkitBorderBefore,WebkitBorderBeforeColor,WebkitBorderBeforeStyle,WebkitBorderBeforeWidth,WebkitBoxReflect,WebkitLineClamp,WebkitMask,WebkitMaskAttachment,WebkitMaskClip,WebkitMaskComposite,WebkitMaskImage,WebkitMaskOrigin,WebkitMaskPosition,WebkitMaskPositionX,WebkitMaskPositionY,WebkitMaskRepeat,WebkitMaskRepeatX,WebkitMaskRepeatY,WebkitMaskSize,WebkitOverflowScrolling,WebkitTapHighlightColor,WebkitTextFillColor,WebkitTextStroke,WebkitTextStrokeColor,WebkitTextStrokeWidth,WebkitTouchCallout,WebkitUserModify,accentColor,alignContent,alignItems,alignSelf,alignTracks,all,animation,animationComposition,animationDelay,animationDirection,animationDuration,animationFillMode,animationIterationCount,animationName,animationPlayState,animationTimingFunction,animationTimeline,appearance,aspectRatio,azimuth,backdropFilter,backfaceVisibility,background,backgroundAttachment,backgroundBlendMode,backgroundClip,backgroundColor,backgroundImage,backgroundOrigin,backgroundPosition,backgroundPositionX,backgroundPositionY,backgroundRepeat,backgroundSize,blockOverflow,blockSize,border,borderBlock,borderBlockColor,borderBlockStyle,borderBlockWidth,borderBlockEnd,borderBlockEndColor,borderBlockEndStyle,borderBlockEndWidth,borderBlockStart,borderBlockStartColor,borderBlockStartStyle,borderBlockStartWidth,borderBottom,borderBottomColor,borderBottomLeftRadius,borderBottomRightRadius,borderBottomStyle,borderBottomWidth,borderCollapse,borderColor,borderEndEndRadius,borderEndStartRadius,borderImage,borderImageOutset,borderImageRepeat,borderImageSlice,borderImageSource,borderImageWidth,borderInline,borderInlineEnd,borderInlineColor,borderInlineStyle,borderInlineWidth,borderInlineEndColor,borderInlineEndStyle,borderInlineEndWidth,borderInlineStart,borderInlineStartColor,borderInlineStartStyle,borderInlineStartWidth,borderLeft,borderLeftColor,borderLeftStyle,borderLeftWidth,borderRadius,borderRight,borderRightColor,borderRightStyle,borderRightWidth,borderSpacing,borderStartEndRadius,borderStartStartRadius,borderStyle,borderTop,borderTopColor,borderTopLeftRadius,borderTopRightRadius,borderTopStyle,borderTopWidth,borderWidth,bottom,boxAlign,boxDecorationBreak,boxDirection,boxFlex,boxFlexGroup,boxLines,boxOrdinalGroup,boxOrient,boxPack,boxShadow,boxSizing,breakAfter,breakBefore,breakInside,captionSide,caret,caretColor,caretShape,clear,clip,clipPath,color,colorScheme,columnCount,columnFill,columnGap,columnRule,columnRuleColor,columnRuleStyle,columnRuleWidth,columnSpan,columnWidth,columns,contain,containIntrinsicSize,containIntrinsicBlockSize,containIntrinsicHeight,containIntrinsicInlineSize,containIntrinsicWidth,container,containerName,containerType,content,contentVisibility,counterIncrement,counterReset,counterSet,cursor,direction,display,emptyCells,filter,flex,flexBasis,flexDirection,flexFlow,flexGrow,flexShrink,flexWrap,float,font,fontFamily,fontFeatureSettings,fontKerning,fontLanguageOverride,fontOpticalSizing,fontPalette,fontVariationSettings,fontSize,fontSizeAdjust,fontSmooth,fontStretch,fontStyle,fontSynthesis,fontVariant,fontVariantAlternates,fontVariantCaps,fontVariantEastAsian,fontVariantEmoji,fontVariantLigatures,fontVariantNumeric,fontVariantPosition,fontWeight,forcedColorAdjust,gap,grid,gridArea,gridAutoColumns,gridAutoFlow,gridAutoRows,gridColumn,gridColumnEnd,gridColumnGap,gridColumnStart,gridGap,gridRow,gridRowEnd,gridRowGap,gridRowStart,gridTemplate,gridTemplateAreas,gridTemplateColumns,gridTemplateRows,hangingPunctuation,height,hyphenateCharacter,hyphenateLimitChars,hyphens,imageOrientation,imageRendering,imageResolution,imeMode,initialLetter,initialLetterAlign,inlineSize,inputSecurity,inset,insetBlock,insetBlockEnd,insetBlockStart,insetInline,insetInlineEnd,insetInlineStart,isolation,justifyContent,justifyItems,justifySelf,justifyTracks,left,letterSpacing,lineBreak,lineClamp,lineHeight,lineHeightStep,listStyle,listStyleImage,listStylePosition,listStyleType,margin,marginBlock,marginBlockEnd,marginBlockStart,marginBottom,marginInline,marginInlineEnd,marginInlineStart,marginLeft,marginRight,marginTop,marginTrim,mask,maskBorder,maskBorderMode,maskBorderOutset,maskBorderRepeat,maskBorderSlice,maskBorderSource,maskBorderWidth,maskClip,maskComposite,maskImage,maskMode,maskOrigin,maskPosition,maskRepeat,maskSize,maskType,masonryAutoFlow,mathDepth,mathShift,mathStyle,maxBlockSize,maxHeight,maxInlineSize,maxLines,maxWidth,minBlockSize,minHeight,minInlineSize,minWidth,mixBlendMode,objectFit,objectPosition,offset,offsetAnchor,offsetDistance,offsetPath,offsetPosition,offsetRotate,opacity,order,orphans,outline,outlineColor,outlineOffset,outlineStyle,outlineWidth,overflow,overflowAnchor,overflowBlock,overflowClipBox,overflowClipMargin,overflowInline,overflowWrap,overflowX,overflowY,overscrollBehavior,overscrollBehaviorBlock,overscrollBehaviorInline,overscrollBehaviorX,overscrollBehaviorY,padding,paddingBlock,paddingBlockEnd,paddingBlockStart,paddingBottom,paddingInline,paddingInlineEnd,paddingInlineStart,paddingLeft,paddingRight,paddingTop,page,pageBreakAfter,pageBreakBefore,pageBreakInside,paintOrder,perspective,perspectiveOrigin,placeContent,placeItems,placeSelf,pointerEvents,position,printColorAdjust,quotes,resize,right,rotate,rowGap,rubyAlign,rubyMerge,rubyPosition,scale,scrollbarColor,scrollbarGutter,scrollbarWidth,scrollBehavior,scrollMargin,scrollMarginBlock,scrollMarginBlockStart,scrollMarginBlockEnd,scrollMarginBottom,scrollMarginInline,scrollMarginInlineStart,scrollMarginInlineEnd,scrollMarginLeft,scrollMarginRight,scrollMarginTop,scrollPadding,scrollPaddingBlock,scrollPaddingBlockStart,scrollPaddingBlockEnd,scrollPaddingBottom,scrollPaddingInline,scrollPaddingInlineStart,scrollPaddingInlineEnd,scrollPaddingLeft,scrollPaddingRight,scrollPaddingTop,scrollSnapAlign,scrollSnapCoordinate,scrollSnapDestination,scrollSnapPointsX,scrollSnapPointsY,scrollSnapStop,scrollSnapType,scrollSnapTypeX,scrollSnapTypeY,scrollTimeline,scrollTimelineAxis,scrollTimelineName,shapeImageThreshold,shapeMargin,shapeOutside,tabSize,tableLayout,textAlign,textAlignLast,textCombineUpright,textDecoration,textDecorationColor,textDecorationLine,textDecorationSkip,textDecorationSkipInk,textDecorationStyle,textDecorationThickness,textEmphasis,textEmphasisColor,textEmphasisPosition,textEmphasisStyle,textIndent,textJustify,textOrientation,textOverflow,textRendering,textShadow,textSizeAdjust,textTransform,textUnderlineOffset,textUnderlinePosition,top,touchAction,transform,transformBox,transformOrigin,transformStyle,transition,transitionDelay,transitionDuration,transitionProperty,transitionTimingFunction,translate,unicodeBidi,userSelect,verticalAlign,viewTransitionName,visibility,whiteSpace,widows,width,willChange,wordBreak,wordSpacing,wordWrap,writingMode,zIndex,zoom";\nvar allCssProperties = cssPropertiesStr.split(",").concat(userGenerated);\nvar properties = new Map(allCssProperties.map((prop) => [prop, true]));\nfunction memo(fn) {\n const cache = /* @__PURE__ */ Object.create(null);\n return (arg) => {\n if (cache[arg] === void 0)\n cache[arg] = fn(arg);\n return cache[arg];\n };\n}\nvar selectorRegex = /&|@/;\nvar isCssProperty = /* @__PURE__ */ memo((prop) => {\n return properties.has(prop) || prop.startsWith("--") || selectorRegex.test(prop);\n});\nexport {\n allCssProperties,\n isCssProperty\n};\n'
921
+ content: '// src/index.ts\nvar userGeneratedStr = "";\nvar userGenerated = userGeneratedStr.split(",");\nvar cssPropertiesStr = "WebkitAppearance,WebkitBorderBefore,WebkitBorderBeforeColor,WebkitBorderBeforeStyle,WebkitBorderBeforeWidth,WebkitBoxReflect,WebkitLineClamp,WebkitMask,WebkitMaskAttachment,WebkitMaskClip,WebkitMaskComposite,WebkitMaskImage,WebkitMaskOrigin,WebkitMaskPosition,WebkitMaskPositionX,WebkitMaskPositionY,WebkitMaskRepeat,WebkitMaskRepeatX,WebkitMaskRepeatY,WebkitMaskSize,WebkitOverflowScrolling,WebkitTapHighlightColor,WebkitTextFillColor,WebkitTextStroke,WebkitTextStrokeColor,WebkitTextStrokeWidth,WebkitTouchCallout,WebkitUserModify,accentColor,alignContent,alignItems,alignSelf,alignTracks,all,animation,animationComposition,animationDelay,animationDirection,animationDuration,animationFillMode,animationIterationCount,animationName,animationPlayState,animationTimingFunction,animationTimeline,appearance,aspectRatio,azimuth,backdropFilter,backfaceVisibility,background,backgroundAttachment,backgroundBlendMode,backgroundClip,backgroundColor,backgroundImage,backgroundOrigin,backgroundPosition,backgroundPositionX,backgroundPositionY,backgroundRepeat,backgroundSize,blockOverflow,blockSize,border,borderBlock,borderBlockColor,borderBlockStyle,borderBlockWidth,borderBlockEnd,borderBlockEndColor,borderBlockEndStyle,borderBlockEndWidth,borderBlockStart,borderBlockStartColor,borderBlockStartStyle,borderBlockStartWidth,borderBottom,borderBottomColor,borderBottomLeftRadius,borderBottomRightRadius,borderBottomStyle,borderBottomWidth,borderCollapse,borderColor,borderEndEndRadius,borderEndStartRadius,borderImage,borderImageOutset,borderImageRepeat,borderImageSlice,borderImageSource,borderImageWidth,borderInline,borderInlineEnd,borderInlineColor,borderInlineStyle,borderInlineWidth,borderInlineEndColor,borderInlineEndStyle,borderInlineEndWidth,borderInlineStart,borderInlineStartColor,borderInlineStartStyle,borderInlineStartWidth,borderLeft,borderLeftColor,borderLeftStyle,borderLeftWidth,borderRadius,borderRight,borderRightColor,borderRightStyle,borderRightWidth,borderSpacing,borderStartEndRadius,borderStartStartRadius,borderStyle,borderTop,borderTopColor,borderTopLeftRadius,borderTopRightRadius,borderTopStyle,borderTopWidth,borderWidth,bottom,boxAlign,boxDecorationBreak,boxDirection,boxFlex,boxFlexGroup,boxLines,boxOrdinalGroup,boxOrient,boxPack,boxShadow,boxSizing,breakAfter,breakBefore,breakInside,captionSide,caret,caretColor,caretShape,clear,clip,clipPath,color,colorScheme,columnCount,columnFill,columnGap,columnRule,columnRuleColor,columnRuleStyle,columnRuleWidth,columnSpan,columnWidth,columns,contain,containIntrinsicSize,containIntrinsicBlockSize,containIntrinsicHeight,containIntrinsicInlineSize,containIntrinsicWidth,container,containerName,containerType,content,contentVisibility,counterIncrement,counterReset,counterSet,cursor,direction,display,emptyCells,filter,flex,flexBasis,flexDirection,flexFlow,flexGrow,flexShrink,flexWrap,float,font,fontFamily,fontFeatureSettings,fontKerning,fontLanguageOverride,fontOpticalSizing,fontPalette,fontVariationSettings,fontSize,fontSizeAdjust,fontSmooth,fontStretch,fontStyle,fontSynthesis,fontVariant,fontVariantAlternates,fontVariantCaps,fontVariantEastAsian,fontVariantEmoji,fontVariantLigatures,fontVariantNumeric,fontVariantPosition,fontWeight,forcedColorAdjust,gap,grid,gridArea,gridAutoColumns,gridAutoFlow,gridAutoRows,gridColumn,gridColumnEnd,gridColumnGap,gridColumnStart,gridGap,gridRow,gridRowEnd,gridRowGap,gridRowStart,gridTemplate,gridTemplateAreas,gridTemplateColumns,gridTemplateRows,hangingPunctuation,height,hyphenateCharacter,hyphenateLimitChars,hyphens,imageOrientation,imageRendering,imageResolution,imeMode,initialLetter,initialLetterAlign,inlineSize,inputSecurity,inset,insetBlock,insetBlockEnd,insetBlockStart,insetInline,insetInlineEnd,insetInlineStart,isolation,justifyContent,justifyItems,justifySelf,justifyTracks,left,letterSpacing,lineBreak,lineClamp,lineHeight,lineHeightStep,listStyle,listStyleImage,listStylePosition,listStyleType,margin,marginBlock,marginBlockEnd,marginBlockStart,marginBottom,marginInline,marginInlineEnd,marginInlineStart,marginLeft,marginRight,marginTop,marginTrim,mask,maskBorder,maskBorderMode,maskBorderOutset,maskBorderRepeat,maskBorderSlice,maskBorderSource,maskBorderWidth,maskClip,maskComposite,maskImage,maskMode,maskOrigin,maskPosition,maskRepeat,maskSize,maskType,masonryAutoFlow,mathDepth,mathShift,mathStyle,maxBlockSize,maxHeight,maxInlineSize,maxLines,maxWidth,minBlockSize,minHeight,minInlineSize,minWidth,mixBlendMode,objectFit,objectPosition,offset,offsetAnchor,offsetDistance,offsetPath,offsetPosition,offsetRotate,opacity,order,orphans,outline,outlineColor,outlineOffset,outlineStyle,outlineWidth,overflow,overflowAnchor,overflowBlock,overflowClipBox,overflowClipMargin,overflowInline,overflowWrap,overflowX,overflowY,overscrollBehavior,overscrollBehaviorBlock,overscrollBehaviorInline,overscrollBehaviorX,overscrollBehaviorY,padding,paddingBlock,paddingBlockEnd,paddingBlockStart,paddingBottom,paddingInline,paddingInlineEnd,paddingInlineStart,paddingLeft,paddingRight,paddingTop,page,pageBreakAfter,pageBreakBefore,pageBreakInside,paintOrder,perspective,perspectiveOrigin,placeContent,placeItems,placeSelf,pointerEvents,position,printColorAdjust,quotes,resize,right,rotate,rowGap,rubyAlign,rubyMerge,rubyPosition,scale,scrollbarColor,scrollbarGutter,scrollbarWidth,scrollBehavior,scrollMargin,scrollMarginBlock,scrollMarginBlockStart,scrollMarginBlockEnd,scrollMarginBottom,scrollMarginInline,scrollMarginInlineStart,scrollMarginInlineEnd,scrollMarginLeft,scrollMarginRight,scrollMarginTop,scrollPadding,scrollPaddingBlock,scrollPaddingBlockStart,scrollPaddingBlockEnd,scrollPaddingBottom,scrollPaddingInline,scrollPaddingInlineStart,scrollPaddingInlineEnd,scrollPaddingLeft,scrollPaddingRight,scrollPaddingTop,scrollSnapAlign,scrollSnapCoordinate,scrollSnapDestination,scrollSnapPointsX,scrollSnapPointsY,scrollSnapStop,scrollSnapType,scrollSnapTypeX,scrollSnapTypeY,scrollTimeline,scrollTimelineAxis,scrollTimelineName,shapeImageThreshold,shapeMargin,shapeOutside,tabSize,tableLayout,textAlign,textAlignLast,textCombineUpright,textDecoration,textDecorationColor,textDecorationLine,textDecorationSkip,textDecorationSkipInk,textDecorationStyle,textDecorationThickness,textEmphasis,textEmphasisColor,textEmphasisPosition,textEmphasisStyle,textIndent,textJustify,textOrientation,textOverflow,textRendering,textShadow,textSizeAdjust,textTransform,textUnderlineOffset,textUnderlinePosition,top,touchAction,transform,transformBox,transformOrigin,transformStyle,transition,transitionDelay,transitionDuration,transitionProperty,transitionTimingFunction,translate,unicodeBidi,userSelect,verticalAlign,viewTransitionName,visibility,whiteSpace,widows,width,willChange,wordBreak,wordSpacing,wordWrap,writingMode,zIndex,zoom,alignmentBaseline,baselineShift,clipRule,colorInterpolation,colorRendering,dominantBaseline,fill,fillOpacity,fillRule,floodColor,floodOpacity,glyphOrientationVertical,lightingColor,marker,markerEnd,markerMid,markerStart,shapeRendering,stopColor,stopOpacity,stroke,strokeDasharray,strokeDashoffset,strokeLinecap,strokeLinejoin,strokeMiterlimit,strokeOpacity,strokeWidth,textAnchor,vectorEffect";\nvar allCssProperties = cssPropertiesStr.split(",").concat(userGenerated);\nvar properties = new Map(allCssProperties.map((prop) => [prop, true]));\nfunction memo(fn) {\n const cache = /* @__PURE__ */ Object.create(null);\n return (arg) => {\n if (cache[arg] === void 0)\n cache[arg] = fn(arg);\n return cache[arg];\n };\n}\nvar cssPropertySelectorRegex = /&|@/;\nvar isCssProperty = /* @__PURE__ */ memo((prop) => {\n return properties.has(prop) || prop.startsWith("--") || cssPropertySelectorRegex.test(prop);\n});\nexport {\n allCssProperties,\n isCssProperty\n};\n'
895
922
  };
896
923
 
897
924
  // src/artifacts/js/is-valid-prop.ts
898
925
  var import_outdent9 = require("outdent");
899
926
  var import_ts_pattern = require("ts-pattern");
900
927
  var cssPropRegex = /var cssPropertiesStr = ".*?";/;
901
- var memoFnDeclarationRegex = /function memo(.+?)\nvar selectorRegex/s;
928
+ var memoFnDeclarationRegex = /function memo(.+?)\nvar cssPropertySelectorRegex/s;
902
929
  function generateIsValidProp(ctx) {
903
930
  if (ctx.isTemplateLiteralSyntax)
904
931
  return;
@@ -907,7 +934,7 @@ function generateIsValidProp(ctx) {
907
934
  'var userGeneratedStr = "";',
908
935
  `var userGeneratedStr = "${(0, import_ts_pattern.match)(ctx.jsx.styleProps).with("all", () => Array.from(new Set(ctx.properties)).join(",")).with("minimal", () => "css").with("none", () => "").exhaustive()}"`
909
936
  );
910
- content = content.replace(memoFnDeclarationRegex, "var selectorRegex");
937
+ content = content.replace(memoFnDeclarationRegex, "var cssPropertySelectorRegex");
911
938
  if (ctx.jsx.styleProps === "minimal" || ctx.jsx.styleProps === "none") {
912
939
  content = content.replace("/* @__PURE__ */ memo(", "/* @__PURE__ */ (");
913
940
  content = content.replace(cssPropRegex, 'var cssPropertiesStr = "";');
@@ -2990,9 +3017,9 @@ function generatePropTypes(ctx) {
2990
3017
  ${result.join("\n")}
2991
3018
 
2992
3019
  export type PropertyValue<T extends string> = T extends keyof PropertyTypes
2993
- ? ConditionalValue<PropertyTypes[T]${strictText}>
3020
+ ? ConditionalValue<PropertyTypes[T]${strictText} | (string & {})>
2994
3021
  : T extends keyof CssProperties
2995
- ? ConditionalValue<CssProperties[T]>
3022
+ ? ConditionalValue<CssProperties[T] | (string & {})>
2996
3023
  : ConditionalValue<string | number>
2997
3024
  `;
2998
3025
  }
@@ -3158,7 +3185,7 @@ function setupSva(ctx) {
3158
3185
  };
3159
3186
  }
3160
3187
  function setupCx(ctx) {
3161
- const code = generateCx();
3188
+ const code = generateCx(ctx);
3162
3189
  return {
3163
3190
  dir: ctx.paths.css,
3164
3191
  files: [
@@ -3324,7 +3351,7 @@ var generateFlattenedCss = (ctx) => (options) => {
3324
3351
  const { files, resolve } = options;
3325
3352
  const { theme: { keyframes } = {}, preflight, minify, staticCss } = ctx.config;
3326
3353
  const unresolved = [
3327
- "@layer reset, base, tokens, recipes, utilities;",
3354
+ ctx.layerString,
3328
3355
  preflight && "@import './reset.css';",
3329
3356
  "@import './global.css';",
3330
3357
  staticCss && "@import './static.css';",
@@ -3341,7 +3368,9 @@ var generateFlattenedCss = (ctx) => (options) => {
3341
3368
  ].filter(Boolean).join("\n\n") : unresolved
3342
3369
  });
3343
3370
  sheet.append(...files);
3344
- return sheet.toCss({ optimize: true, minify });
3371
+ const output = sheet.toCss({ optimize: true, minify });
3372
+ ctx.hooks.callHook("generator:css", "styles.css", output);
3373
+ return output;
3345
3374
  };
3346
3375
 
3347
3376
  // src/artifacts/css/parser-css.ts
@@ -3473,12 +3502,20 @@ var getBaseEngine = (conf) => {
3473
3502
  });
3474
3503
  const compositionContext = { conditions, utility };
3475
3504
  (0, import_core5.assignCompositions)(compositions, compositionContext);
3505
+ const layers = config.layers;
3506
+ const layerNames = Object.values(layers);
3507
+ const isValidLayerRule = (0, import_shared5.memo)((layerRule) => {
3508
+ const names = new Set(layerRule.split(",").map((name) => name.trim()));
3509
+ return names.size >= 5 && layerNames.every((name) => names.has(name));
3510
+ });
3511
+ const layerString = `@layer ${layerNames.join(", ")};`;
3476
3512
  const createSheetContext = () => ({
3477
3513
  root: import_postcss3.default.root(),
3478
3514
  conditions,
3479
3515
  utility,
3480
3516
  hash: hash.className,
3481
- helpers
3517
+ helpers,
3518
+ layers
3482
3519
  });
3483
3520
  const createSheet = (options) => {
3484
3521
  const sheetContext = createSheetContext();
@@ -3514,7 +3551,12 @@ var getBaseEngine = (conf) => {
3514
3551
  recipes,
3515
3552
  conditions,
3516
3553
  createSheetContext,
3517
- createSheet
3554
+ createSheet,
3555
+ // cascade layer
3556
+ layers,
3557
+ isValidLayerRule,
3558
+ layerString,
3559
+ layerNames
3518
3560
  };
3519
3561
  };
3520
3562
 
@@ -3623,7 +3665,15 @@ var defaults = (conf) => ({
3623
3665
  outExtension: "mjs",
3624
3666
  shorthands: true,
3625
3667
  syntax: "object-literal",
3626
- ...conf.config
3668
+ ...conf.config,
3669
+ layers: {
3670
+ reset: "reset",
3671
+ base: "base",
3672
+ tokens: "tokens",
3673
+ recipes: "recipes",
3674
+ utilities: "utilities",
3675
+ ...conf.config.layers
3676
+ }
3627
3677
  }
3628
3678
  });
3629
3679
  var getImportMap = (outdir) => ({
package/dist/index.mjs CHANGED
@@ -175,7 +175,7 @@ function generateKeyframeCss(ctx) {
175
175
  var css = String.raw;
176
176
  function generateResetCss(ctx, scope = "") {
177
177
  const selector = scope ? `${scope} ` : "";
178
- const output = css`@layer reset {
178
+ const output = css`@layer ${ctx.layers.reset} {
179
179
  ${selector}* {
180
180
  margin: 0;
181
181
  padding: 0;
@@ -442,7 +442,7 @@ function generateTokenCss(ctx) {
442
442
  }
443
443
  }
444
444
  const css2 = results.join("\n\n");
445
- const output = `@layer tokens {
445
+ const output = `@layer ${ctx.layers.tokens} {
446
446
  ${prettifyCss(cleanupSelectors(css2, root))}
447
447
  }
448
448
  `;
@@ -592,11 +592,7 @@ function generateCssFn(ctx) {
592
592
  config: { hash, prefix },
593
593
  conditions
594
594
  } = ctx;
595
- const { separator } = utility;
596
- const shorthandsByProp = Array.from(utility.shorthands.entries()).reduce((acc, [shorthand, prop]) => {
597
- acc[prop] = shorthand;
598
- return acc;
599
- }, {});
595
+ const { separator, getPropShorthands } = utility;
600
596
  return {
601
597
  dts: outdent4`
602
598
  import type { SystemStyleObject } from '../types'
@@ -613,25 +609,39 @@ function generateCssFn(ctx) {
613
609
  ${ctx.file.import("sortConditions, finalizeConditions", "./conditions")}
614
610
 
615
611
  const utilities = "${utility.entries().map(([prop, className]) => {
616
- const shorthand = shorthandsByProp[prop];
617
- return [prop, shorthand ? [className, shorthand === className ? 1 : shorthand].join("/") : className].join(":");
612
+ const shorthandList = getPropShorthands(prop);
613
+ const result = [
614
+ prop,
615
+ [
616
+ className,
617
+ shorthandList.length ? (
618
+ // mark shorthand equal to className as 1 to save a few bytes
619
+ shorthandList.map((shorthand) => shorthand === className ? 1 : shorthand).join("/")
620
+ ) : null
621
+ ].filter(Boolean).join("/")
622
+ ].join(":");
623
+ return result;
618
624
  }).join(",")}"
619
625
 
620
- const classMap = {}
626
+ const classNameByProp = new Map()
621
627
  ${utility.hasShorthand ? outdent4`
622
- const shorthands = {}
628
+ const shorthands = new Map()
623
629
  utilities.split(',').forEach((utility) => {
624
630
  const [prop, meta] = utility.split(':')
625
- const [className, shorthand] = meta.split('/')
626
- classMap[prop] = className
627
- if (shorthand) shorthands[shorthand === '1' ? className : shorthand] = prop
631
+ const [className, ...shorthandList] = meta.split('/')
632
+ classNameByProp.set(prop, className)
633
+ if (shorthandList.length) {
634
+ shorthandList.forEach((shorthand) => {
635
+ shorthands.set(shorthand === '1' ? className : shorthand, prop)
636
+ })
637
+ }
628
638
  })
629
639
 
630
- const resolveShorthand = (prop) => shorthands[prop] || prop
640
+ const resolveShorthand = (prop) => shorthands.get(prop) || prop
631
641
  ` : outdent4`
632
642
  utilities.split(',').forEach((utility) => {
633
643
  const [prop, className] = utility.split(':')
634
- classMap[prop] = className
644
+ classNameByProp.set(prop, className)
635
645
  })
636
646
  `}
637
647
 
@@ -646,15 +656,21 @@ function generateCssFn(ctx) {
646
656
  ${prefix ? "prefix: " + JSON.stringify(prefix) + "," : ""}
647
657
  transform: ${utility.hasShorthand ? `(prop, value) => {
648
658
  const key = resolveShorthand(prop)
649
- const propKey = classMap[key] || hypenateProperty(key)
659
+ const propKey = classNameByProp.get(key) || hypenateProperty(key)
650
660
  return { className: \`\${propKey}${separator}\${withoutSpace(value)}\` }
651
- }` : `(key, value) => ({ className: \`\${classMap[key] || hypenateProperty(key)}${separator}\${withoutSpace(value)}\` })`},
661
+ }` : `(key, value) => ({ className: \`\${classNameByProp.get(key) || hypenateProperty(key)}${separator}\${withoutSpace(value)}\` })`},
652
662
  ${utility.hasShorthand ? "hasShorthand: true," : ""}
653
663
  resolveShorthand: ${utility.hasShorthand ? "resolveShorthand" : "prop => prop"},
654
664
  }
655
665
  }
656
666
 
657
- export const css = createCss(context)
667
+ const cssFn = createCss(context)
668
+ export const cssCache = new Map()
669
+ export const css = (styles) => {
670
+ const classNames = cssFn(styles)
671
+ cssCache.set(classNames, styles)
672
+ return classNames
673
+ }
658
674
  css.raw = (styles) => styles
659
675
 
660
676
  export const { mergeCss, assignCss } = createMergeCss(context)
@@ -792,23 +808,34 @@ function generateCvaFn(ctx) {
792
808
 
793
809
  // src/artifacts/js/cx.ts
794
810
  import outdent7 from "outdent";
795
- function generateCx() {
811
+ function generateCx(ctx) {
796
812
  return {
797
813
  js: outdent7`
814
+ ${ctx.file.import("cssCache, css, mergeCss", "./css")}
815
+
798
816
  function cx() {
817
+ const objs = []
799
818
  let str = '',
800
819
  i = 0,
801
820
  arg
802
-
821
+
803
822
  for (; i < arguments.length; ) {
804
- if ((arg = arguments[i++]) && typeof arg === 'string') {
805
- str && (str += ' ')
806
- str += arg
823
+ arg = arguments[i++]
824
+ if (!arg || typeof arg !== 'string') continue
825
+
826
+ if (cssCache.has(arg)) {
827
+ objs.push(cssCache.get(arg))
828
+ continue
807
829
  }
830
+
831
+ str && (str += ' ')
832
+ str += arg.toString()
808
833
  }
809
- return str
834
+
835
+ const merged = mergeCss(...objs)
836
+ return [css(merged), str].join(' ')
810
837
  }
811
-
838
+
812
839
  export { cx }
813
840
  `,
814
841
  dts: outdent7`
@@ -860,14 +887,14 @@ function generateHelpers(ctx) {
860
887
 
861
888
  // src/artifacts/generated/is-valid-prop.mjs.json
862
889
  var is_valid_prop_mjs_default = {
863
- content: '// src/index.ts\nvar userGeneratedStr = "";\nvar userGenerated = userGeneratedStr.split(",");\nvar cssPropertiesStr = "WebkitAppearance,WebkitBorderBefore,WebkitBorderBeforeColor,WebkitBorderBeforeStyle,WebkitBorderBeforeWidth,WebkitBoxReflect,WebkitLineClamp,WebkitMask,WebkitMaskAttachment,WebkitMaskClip,WebkitMaskComposite,WebkitMaskImage,WebkitMaskOrigin,WebkitMaskPosition,WebkitMaskPositionX,WebkitMaskPositionY,WebkitMaskRepeat,WebkitMaskRepeatX,WebkitMaskRepeatY,WebkitMaskSize,WebkitOverflowScrolling,WebkitTapHighlightColor,WebkitTextFillColor,WebkitTextStroke,WebkitTextStrokeColor,WebkitTextStrokeWidth,WebkitTouchCallout,WebkitUserModify,accentColor,alignContent,alignItems,alignSelf,alignTracks,all,animation,animationComposition,animationDelay,animationDirection,animationDuration,animationFillMode,animationIterationCount,animationName,animationPlayState,animationTimingFunction,animationTimeline,appearance,aspectRatio,azimuth,backdropFilter,backfaceVisibility,background,backgroundAttachment,backgroundBlendMode,backgroundClip,backgroundColor,backgroundImage,backgroundOrigin,backgroundPosition,backgroundPositionX,backgroundPositionY,backgroundRepeat,backgroundSize,blockOverflow,blockSize,border,borderBlock,borderBlockColor,borderBlockStyle,borderBlockWidth,borderBlockEnd,borderBlockEndColor,borderBlockEndStyle,borderBlockEndWidth,borderBlockStart,borderBlockStartColor,borderBlockStartStyle,borderBlockStartWidth,borderBottom,borderBottomColor,borderBottomLeftRadius,borderBottomRightRadius,borderBottomStyle,borderBottomWidth,borderCollapse,borderColor,borderEndEndRadius,borderEndStartRadius,borderImage,borderImageOutset,borderImageRepeat,borderImageSlice,borderImageSource,borderImageWidth,borderInline,borderInlineEnd,borderInlineColor,borderInlineStyle,borderInlineWidth,borderInlineEndColor,borderInlineEndStyle,borderInlineEndWidth,borderInlineStart,borderInlineStartColor,borderInlineStartStyle,borderInlineStartWidth,borderLeft,borderLeftColor,borderLeftStyle,borderLeftWidth,borderRadius,borderRight,borderRightColor,borderRightStyle,borderRightWidth,borderSpacing,borderStartEndRadius,borderStartStartRadius,borderStyle,borderTop,borderTopColor,borderTopLeftRadius,borderTopRightRadius,borderTopStyle,borderTopWidth,borderWidth,bottom,boxAlign,boxDecorationBreak,boxDirection,boxFlex,boxFlexGroup,boxLines,boxOrdinalGroup,boxOrient,boxPack,boxShadow,boxSizing,breakAfter,breakBefore,breakInside,captionSide,caret,caretColor,caretShape,clear,clip,clipPath,color,colorScheme,columnCount,columnFill,columnGap,columnRule,columnRuleColor,columnRuleStyle,columnRuleWidth,columnSpan,columnWidth,columns,contain,containIntrinsicSize,containIntrinsicBlockSize,containIntrinsicHeight,containIntrinsicInlineSize,containIntrinsicWidth,container,containerName,containerType,content,contentVisibility,counterIncrement,counterReset,counterSet,cursor,direction,display,emptyCells,filter,flex,flexBasis,flexDirection,flexFlow,flexGrow,flexShrink,flexWrap,float,font,fontFamily,fontFeatureSettings,fontKerning,fontLanguageOverride,fontOpticalSizing,fontPalette,fontVariationSettings,fontSize,fontSizeAdjust,fontSmooth,fontStretch,fontStyle,fontSynthesis,fontVariant,fontVariantAlternates,fontVariantCaps,fontVariantEastAsian,fontVariantEmoji,fontVariantLigatures,fontVariantNumeric,fontVariantPosition,fontWeight,forcedColorAdjust,gap,grid,gridArea,gridAutoColumns,gridAutoFlow,gridAutoRows,gridColumn,gridColumnEnd,gridColumnGap,gridColumnStart,gridGap,gridRow,gridRowEnd,gridRowGap,gridRowStart,gridTemplate,gridTemplateAreas,gridTemplateColumns,gridTemplateRows,hangingPunctuation,height,hyphenateCharacter,hyphenateLimitChars,hyphens,imageOrientation,imageRendering,imageResolution,imeMode,initialLetter,initialLetterAlign,inlineSize,inputSecurity,inset,insetBlock,insetBlockEnd,insetBlockStart,insetInline,insetInlineEnd,insetInlineStart,isolation,justifyContent,justifyItems,justifySelf,justifyTracks,left,letterSpacing,lineBreak,lineClamp,lineHeight,lineHeightStep,listStyle,listStyleImage,listStylePosition,listStyleType,margin,marginBlock,marginBlockEnd,marginBlockStart,marginBottom,marginInline,marginInlineEnd,marginInlineStart,marginLeft,marginRight,marginTop,marginTrim,mask,maskBorder,maskBorderMode,maskBorderOutset,maskBorderRepeat,maskBorderSlice,maskBorderSource,maskBorderWidth,maskClip,maskComposite,maskImage,maskMode,maskOrigin,maskPosition,maskRepeat,maskSize,maskType,masonryAutoFlow,mathDepth,mathShift,mathStyle,maxBlockSize,maxHeight,maxInlineSize,maxLines,maxWidth,minBlockSize,minHeight,minInlineSize,minWidth,mixBlendMode,objectFit,objectPosition,offset,offsetAnchor,offsetDistance,offsetPath,offsetPosition,offsetRotate,opacity,order,orphans,outline,outlineColor,outlineOffset,outlineStyle,outlineWidth,overflow,overflowAnchor,overflowBlock,overflowClipBox,overflowClipMargin,overflowInline,overflowWrap,overflowX,overflowY,overscrollBehavior,overscrollBehaviorBlock,overscrollBehaviorInline,overscrollBehaviorX,overscrollBehaviorY,padding,paddingBlock,paddingBlockEnd,paddingBlockStart,paddingBottom,paddingInline,paddingInlineEnd,paddingInlineStart,paddingLeft,paddingRight,paddingTop,page,pageBreakAfter,pageBreakBefore,pageBreakInside,paintOrder,perspective,perspectiveOrigin,placeContent,placeItems,placeSelf,pointerEvents,position,printColorAdjust,quotes,resize,right,rotate,rowGap,rubyAlign,rubyMerge,rubyPosition,scale,scrollbarColor,scrollbarGutter,scrollbarWidth,scrollBehavior,scrollMargin,scrollMarginBlock,scrollMarginBlockStart,scrollMarginBlockEnd,scrollMarginBottom,scrollMarginInline,scrollMarginInlineStart,scrollMarginInlineEnd,scrollMarginLeft,scrollMarginRight,scrollMarginTop,scrollPadding,scrollPaddingBlock,scrollPaddingBlockStart,scrollPaddingBlockEnd,scrollPaddingBottom,scrollPaddingInline,scrollPaddingInlineStart,scrollPaddingInlineEnd,scrollPaddingLeft,scrollPaddingRight,scrollPaddingTop,scrollSnapAlign,scrollSnapCoordinate,scrollSnapDestination,scrollSnapPointsX,scrollSnapPointsY,scrollSnapStop,scrollSnapType,scrollSnapTypeX,scrollSnapTypeY,scrollTimeline,scrollTimelineAxis,scrollTimelineName,shapeImageThreshold,shapeMargin,shapeOutside,tabSize,tableLayout,textAlign,textAlignLast,textCombineUpright,textDecoration,textDecorationColor,textDecorationLine,textDecorationSkip,textDecorationSkipInk,textDecorationStyle,textDecorationThickness,textEmphasis,textEmphasisColor,textEmphasisPosition,textEmphasisStyle,textIndent,textJustify,textOrientation,textOverflow,textRendering,textShadow,textSizeAdjust,textTransform,textUnderlineOffset,textUnderlinePosition,top,touchAction,transform,transformBox,transformOrigin,transformStyle,transition,transitionDelay,transitionDuration,transitionProperty,transitionTimingFunction,translate,unicodeBidi,userSelect,verticalAlign,viewTransitionName,visibility,whiteSpace,widows,width,willChange,wordBreak,wordSpacing,wordWrap,writingMode,zIndex,zoom";\nvar allCssProperties = cssPropertiesStr.split(",").concat(userGenerated);\nvar properties = new Map(allCssProperties.map((prop) => [prop, true]));\nfunction memo(fn) {\n const cache = /* @__PURE__ */ Object.create(null);\n return (arg) => {\n if (cache[arg] === void 0)\n cache[arg] = fn(arg);\n return cache[arg];\n };\n}\nvar selectorRegex = /&|@/;\nvar isCssProperty = /* @__PURE__ */ memo((prop) => {\n return properties.has(prop) || prop.startsWith("--") || selectorRegex.test(prop);\n});\nexport {\n allCssProperties,\n isCssProperty\n};\n'
890
+ content: '// src/index.ts\nvar userGeneratedStr = "";\nvar userGenerated = userGeneratedStr.split(",");\nvar cssPropertiesStr = "WebkitAppearance,WebkitBorderBefore,WebkitBorderBeforeColor,WebkitBorderBeforeStyle,WebkitBorderBeforeWidth,WebkitBoxReflect,WebkitLineClamp,WebkitMask,WebkitMaskAttachment,WebkitMaskClip,WebkitMaskComposite,WebkitMaskImage,WebkitMaskOrigin,WebkitMaskPosition,WebkitMaskPositionX,WebkitMaskPositionY,WebkitMaskRepeat,WebkitMaskRepeatX,WebkitMaskRepeatY,WebkitMaskSize,WebkitOverflowScrolling,WebkitTapHighlightColor,WebkitTextFillColor,WebkitTextStroke,WebkitTextStrokeColor,WebkitTextStrokeWidth,WebkitTouchCallout,WebkitUserModify,accentColor,alignContent,alignItems,alignSelf,alignTracks,all,animation,animationComposition,animationDelay,animationDirection,animationDuration,animationFillMode,animationIterationCount,animationName,animationPlayState,animationTimingFunction,animationTimeline,appearance,aspectRatio,azimuth,backdropFilter,backfaceVisibility,background,backgroundAttachment,backgroundBlendMode,backgroundClip,backgroundColor,backgroundImage,backgroundOrigin,backgroundPosition,backgroundPositionX,backgroundPositionY,backgroundRepeat,backgroundSize,blockOverflow,blockSize,border,borderBlock,borderBlockColor,borderBlockStyle,borderBlockWidth,borderBlockEnd,borderBlockEndColor,borderBlockEndStyle,borderBlockEndWidth,borderBlockStart,borderBlockStartColor,borderBlockStartStyle,borderBlockStartWidth,borderBottom,borderBottomColor,borderBottomLeftRadius,borderBottomRightRadius,borderBottomStyle,borderBottomWidth,borderCollapse,borderColor,borderEndEndRadius,borderEndStartRadius,borderImage,borderImageOutset,borderImageRepeat,borderImageSlice,borderImageSource,borderImageWidth,borderInline,borderInlineEnd,borderInlineColor,borderInlineStyle,borderInlineWidth,borderInlineEndColor,borderInlineEndStyle,borderInlineEndWidth,borderInlineStart,borderInlineStartColor,borderInlineStartStyle,borderInlineStartWidth,borderLeft,borderLeftColor,borderLeftStyle,borderLeftWidth,borderRadius,borderRight,borderRightColor,borderRightStyle,borderRightWidth,borderSpacing,borderStartEndRadius,borderStartStartRadius,borderStyle,borderTop,borderTopColor,borderTopLeftRadius,borderTopRightRadius,borderTopStyle,borderTopWidth,borderWidth,bottom,boxAlign,boxDecorationBreak,boxDirection,boxFlex,boxFlexGroup,boxLines,boxOrdinalGroup,boxOrient,boxPack,boxShadow,boxSizing,breakAfter,breakBefore,breakInside,captionSide,caret,caretColor,caretShape,clear,clip,clipPath,color,colorScheme,columnCount,columnFill,columnGap,columnRule,columnRuleColor,columnRuleStyle,columnRuleWidth,columnSpan,columnWidth,columns,contain,containIntrinsicSize,containIntrinsicBlockSize,containIntrinsicHeight,containIntrinsicInlineSize,containIntrinsicWidth,container,containerName,containerType,content,contentVisibility,counterIncrement,counterReset,counterSet,cursor,direction,display,emptyCells,filter,flex,flexBasis,flexDirection,flexFlow,flexGrow,flexShrink,flexWrap,float,font,fontFamily,fontFeatureSettings,fontKerning,fontLanguageOverride,fontOpticalSizing,fontPalette,fontVariationSettings,fontSize,fontSizeAdjust,fontSmooth,fontStretch,fontStyle,fontSynthesis,fontVariant,fontVariantAlternates,fontVariantCaps,fontVariantEastAsian,fontVariantEmoji,fontVariantLigatures,fontVariantNumeric,fontVariantPosition,fontWeight,forcedColorAdjust,gap,grid,gridArea,gridAutoColumns,gridAutoFlow,gridAutoRows,gridColumn,gridColumnEnd,gridColumnGap,gridColumnStart,gridGap,gridRow,gridRowEnd,gridRowGap,gridRowStart,gridTemplate,gridTemplateAreas,gridTemplateColumns,gridTemplateRows,hangingPunctuation,height,hyphenateCharacter,hyphenateLimitChars,hyphens,imageOrientation,imageRendering,imageResolution,imeMode,initialLetter,initialLetterAlign,inlineSize,inputSecurity,inset,insetBlock,insetBlockEnd,insetBlockStart,insetInline,insetInlineEnd,insetInlineStart,isolation,justifyContent,justifyItems,justifySelf,justifyTracks,left,letterSpacing,lineBreak,lineClamp,lineHeight,lineHeightStep,listStyle,listStyleImage,listStylePosition,listStyleType,margin,marginBlock,marginBlockEnd,marginBlockStart,marginBottom,marginInline,marginInlineEnd,marginInlineStart,marginLeft,marginRight,marginTop,marginTrim,mask,maskBorder,maskBorderMode,maskBorderOutset,maskBorderRepeat,maskBorderSlice,maskBorderSource,maskBorderWidth,maskClip,maskComposite,maskImage,maskMode,maskOrigin,maskPosition,maskRepeat,maskSize,maskType,masonryAutoFlow,mathDepth,mathShift,mathStyle,maxBlockSize,maxHeight,maxInlineSize,maxLines,maxWidth,minBlockSize,minHeight,minInlineSize,minWidth,mixBlendMode,objectFit,objectPosition,offset,offsetAnchor,offsetDistance,offsetPath,offsetPosition,offsetRotate,opacity,order,orphans,outline,outlineColor,outlineOffset,outlineStyle,outlineWidth,overflow,overflowAnchor,overflowBlock,overflowClipBox,overflowClipMargin,overflowInline,overflowWrap,overflowX,overflowY,overscrollBehavior,overscrollBehaviorBlock,overscrollBehaviorInline,overscrollBehaviorX,overscrollBehaviorY,padding,paddingBlock,paddingBlockEnd,paddingBlockStart,paddingBottom,paddingInline,paddingInlineEnd,paddingInlineStart,paddingLeft,paddingRight,paddingTop,page,pageBreakAfter,pageBreakBefore,pageBreakInside,paintOrder,perspective,perspectiveOrigin,placeContent,placeItems,placeSelf,pointerEvents,position,printColorAdjust,quotes,resize,right,rotate,rowGap,rubyAlign,rubyMerge,rubyPosition,scale,scrollbarColor,scrollbarGutter,scrollbarWidth,scrollBehavior,scrollMargin,scrollMarginBlock,scrollMarginBlockStart,scrollMarginBlockEnd,scrollMarginBottom,scrollMarginInline,scrollMarginInlineStart,scrollMarginInlineEnd,scrollMarginLeft,scrollMarginRight,scrollMarginTop,scrollPadding,scrollPaddingBlock,scrollPaddingBlockStart,scrollPaddingBlockEnd,scrollPaddingBottom,scrollPaddingInline,scrollPaddingInlineStart,scrollPaddingInlineEnd,scrollPaddingLeft,scrollPaddingRight,scrollPaddingTop,scrollSnapAlign,scrollSnapCoordinate,scrollSnapDestination,scrollSnapPointsX,scrollSnapPointsY,scrollSnapStop,scrollSnapType,scrollSnapTypeX,scrollSnapTypeY,scrollTimeline,scrollTimelineAxis,scrollTimelineName,shapeImageThreshold,shapeMargin,shapeOutside,tabSize,tableLayout,textAlign,textAlignLast,textCombineUpright,textDecoration,textDecorationColor,textDecorationLine,textDecorationSkip,textDecorationSkipInk,textDecorationStyle,textDecorationThickness,textEmphasis,textEmphasisColor,textEmphasisPosition,textEmphasisStyle,textIndent,textJustify,textOrientation,textOverflow,textRendering,textShadow,textSizeAdjust,textTransform,textUnderlineOffset,textUnderlinePosition,top,touchAction,transform,transformBox,transformOrigin,transformStyle,transition,transitionDelay,transitionDuration,transitionProperty,transitionTimingFunction,translate,unicodeBidi,userSelect,verticalAlign,viewTransitionName,visibility,whiteSpace,widows,width,willChange,wordBreak,wordSpacing,wordWrap,writingMode,zIndex,zoom,alignmentBaseline,baselineShift,clipRule,colorInterpolation,colorRendering,dominantBaseline,fill,fillOpacity,fillRule,floodColor,floodOpacity,glyphOrientationVertical,lightingColor,marker,markerEnd,markerMid,markerStart,shapeRendering,stopColor,stopOpacity,stroke,strokeDasharray,strokeDashoffset,strokeLinecap,strokeLinejoin,strokeMiterlimit,strokeOpacity,strokeWidth,textAnchor,vectorEffect";\nvar allCssProperties = cssPropertiesStr.split(",").concat(userGenerated);\nvar properties = new Map(allCssProperties.map((prop) => [prop, true]));\nfunction memo(fn) {\n const cache = /* @__PURE__ */ Object.create(null);\n return (arg) => {\n if (cache[arg] === void 0)\n cache[arg] = fn(arg);\n return cache[arg];\n };\n}\nvar cssPropertySelectorRegex = /&|@/;\nvar isCssProperty = /* @__PURE__ */ memo((prop) => {\n return properties.has(prop) || prop.startsWith("--") || cssPropertySelectorRegex.test(prop);\n});\nexport {\n allCssProperties,\n isCssProperty\n};\n'
864
891
  };
865
892
 
866
893
  // src/artifacts/js/is-valid-prop.ts
867
894
  import { outdent as outdent9 } from "outdent";
868
895
  import { match } from "ts-pattern";
869
896
  var cssPropRegex = /var cssPropertiesStr = ".*?";/;
870
- var memoFnDeclarationRegex = /function memo(.+?)\nvar selectorRegex/s;
897
+ var memoFnDeclarationRegex = /function memo(.+?)\nvar cssPropertySelectorRegex/s;
871
898
  function generateIsValidProp(ctx) {
872
899
  if (ctx.isTemplateLiteralSyntax)
873
900
  return;
@@ -876,7 +903,7 @@ function generateIsValidProp(ctx) {
876
903
  'var userGeneratedStr = "";',
877
904
  `var userGeneratedStr = "${match(ctx.jsx.styleProps).with("all", () => Array.from(new Set(ctx.properties)).join(",")).with("minimal", () => "css").with("none", () => "").exhaustive()}"`
878
905
  );
879
- content = content.replace(memoFnDeclarationRegex, "var selectorRegex");
906
+ content = content.replace(memoFnDeclarationRegex, "var cssPropertySelectorRegex");
880
907
  if (ctx.jsx.styleProps === "minimal" || ctx.jsx.styleProps === "none") {
881
908
  content = content.replace("/* @__PURE__ */ memo(", "/* @__PURE__ */ (");
882
909
  content = content.replace(cssPropRegex, 'var cssPropertiesStr = "";');
@@ -2959,9 +2986,9 @@ function generatePropTypes(ctx) {
2959
2986
  ${result.join("\n")}
2960
2987
 
2961
2988
  export type PropertyValue<T extends string> = T extends keyof PropertyTypes
2962
- ? ConditionalValue<PropertyTypes[T]${strictText}>
2989
+ ? ConditionalValue<PropertyTypes[T]${strictText} | (string & {})>
2963
2990
  : T extends keyof CssProperties
2964
- ? ConditionalValue<CssProperties[T]>
2991
+ ? ConditionalValue<CssProperties[T] | (string & {})>
2965
2992
  : ConditionalValue<string | number>
2966
2993
  `;
2967
2994
  }
@@ -3127,7 +3154,7 @@ function setupSva(ctx) {
3127
3154
  };
3128
3155
  }
3129
3156
  function setupCx(ctx) {
3130
- const code = generateCx();
3157
+ const code = generateCx(ctx);
3131
3158
  return {
3132
3159
  dir: ctx.paths.css,
3133
3160
  files: [
@@ -3293,7 +3320,7 @@ var generateFlattenedCss = (ctx) => (options) => {
3293
3320
  const { files, resolve } = options;
3294
3321
  const { theme: { keyframes } = {}, preflight, minify, staticCss } = ctx.config;
3295
3322
  const unresolved = [
3296
- "@layer reset, base, tokens, recipes, utilities;",
3323
+ ctx.layerString,
3297
3324
  preflight && "@import './reset.css';",
3298
3325
  "@import './global.css';",
3299
3326
  staticCss && "@import './static.css';",
@@ -3310,7 +3337,9 @@ var generateFlattenedCss = (ctx) => (options) => {
3310
3337
  ].filter(Boolean).join("\n\n") : unresolved
3311
3338
  });
3312
3339
  sheet.append(...files);
3313
- return sheet.toCss({ optimize: true, minify });
3340
+ const output = sheet.toCss({ optimize: true, minify });
3341
+ ctx.hooks.callHook("generator:css", "styles.css", output);
3342
+ return output;
3314
3343
  };
3315
3344
 
3316
3345
  // src/artifacts/css/parser-css.ts
@@ -3448,12 +3477,20 @@ var getBaseEngine = (conf) => {
3448
3477
  });
3449
3478
  const compositionContext = { conditions, utility };
3450
3479
  assignCompositions(compositions, compositionContext);
3480
+ const layers = config.layers;
3481
+ const layerNames = Object.values(layers);
3482
+ const isValidLayerRule = memo((layerRule) => {
3483
+ const names = new Set(layerRule.split(",").map((name) => name.trim()));
3484
+ return names.size >= 5 && layerNames.every((name) => names.has(name));
3485
+ });
3486
+ const layerString = `@layer ${layerNames.join(", ")};`;
3451
3487
  const createSheetContext = () => ({
3452
3488
  root: postcss3.root(),
3453
3489
  conditions,
3454
3490
  utility,
3455
3491
  hash: hash.className,
3456
- helpers
3492
+ helpers,
3493
+ layers
3457
3494
  });
3458
3495
  const createSheet = (options) => {
3459
3496
  const sheetContext = createSheetContext();
@@ -3489,7 +3526,12 @@ var getBaseEngine = (conf) => {
3489
3526
  recipes,
3490
3527
  conditions,
3491
3528
  createSheetContext,
3492
- createSheet
3529
+ createSheet,
3530
+ // cascade layer
3531
+ layers,
3532
+ isValidLayerRule,
3533
+ layerString,
3534
+ layerNames
3493
3535
  };
3494
3536
  };
3495
3537
 
@@ -3598,7 +3640,15 @@ var defaults = (conf) => ({
3598
3640
  outExtension: "mjs",
3599
3641
  shorthands: true,
3600
3642
  syntax: "object-literal",
3601
- ...conf.config
3643
+ ...conf.config,
3644
+ layers: {
3645
+ reset: "reset",
3646
+ base: "base",
3647
+ tokens: "tokens",
3648
+ recipes: "recipes",
3649
+ utilities: "utilities",
3650
+ ...conf.config.layers
3651
+ }
3602
3652
  }
3603
3653
  });
3604
3654
  var getImportMap = (outdir) => ({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pandacss/generator",
3
- "version": "0.10.0",
3
+ "version": "0.11.1",
4
4
  "description": "The css generator for css panda",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -20,17 +20,17 @@
20
20
  "pluralize": "8.0.0",
21
21
  "postcss": "8.4.27",
22
22
  "ts-pattern": "5.0.4",
23
- "@pandacss/core": "0.10.0",
24
- "@pandacss/is-valid-prop": "0.10.0",
25
- "@pandacss/logger": "0.10.0",
26
- "@pandacss/shared": "0.10.0",
27
- "@pandacss/token-dictionary": "0.10.0",
28
- "@pandacss/types": "0.10.0"
23
+ "@pandacss/core": "0.11.1",
24
+ "@pandacss/is-valid-prop": "0.11.1",
25
+ "@pandacss/logger": "0.11.1",
26
+ "@pandacss/shared": "0.11.1",
27
+ "@pandacss/token-dictionary": "0.11.1",
28
+ "@pandacss/types": "0.11.1"
29
29
  },
30
30
  "devDependencies": {
31
31
  "@types/pluralize": "0.0.30",
32
32
  "hookable": "5.5.3",
33
- "@pandacss/fixture": "0.10.0"
33
+ "@pandacss/fixture": "0.11.1"
34
34
  },
35
35
  "scripts": {
36
36
  "prebuild": "tsx scripts/prebuild.ts",