@tenphi/eslint-plugin-tasty 1.10.0 → 1.11.0

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.
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","names":[],"sources":["../src/constants.ts"],"sourcesContent":["// ---------------------------------------------------------------------------\n// Enhanced logical style families, mirroring `@tenphi/tasty`'s `logical-list.ts`.\n//\n// Tasty v3.8 gave each logical axis/category pair its own handler, named\n// `<axis><Category>` — `blockPadding`, `inlineBorder` — which emits native\n// logical CSS (`padding-block`, `border-inline`) rather than converting the\n// value to a physical edge. The browser resolves `start`/`end` from the\n// element's `writingMode` and `direction`.\n//\n// The native CSS spellings (`paddingBlock`, `insetInlineStart`, …) stay valid\n// keys, but they are now *ordinary* CSS properties: tasty stopped reading\n// `paddingBlock`/`paddingInline`/`insetBlock`/`insetInline` in its physical\n// handlers, so they no longer get category defaults or directional behaviour.\n// That is why they are absent from `KNOWN_TASTY_PROPERTIES` (they are still\n// recognised, via `KNOWN_CSS_PROPERTIES`) and why `SHORTHAND_MAPPING` points\n// them at the enhanced style instead.\n//\n// The groups are split by *vocabulary*, not for tidiness: each one is spread\n// into a different set below, and the splits are what keep `true` off the size\n// constraints and the single-value rule off the borders.\n// ---------------------------------------------------------------------------\n\n/** Logical edge modifiers, the `start`/`end` counterpart of {@link BOX_SIDES}. */\nexport const LOGICAL_EDGES = ['start', 'end'] as const;\n\n/** Enhanced logical sizes. `min`/`max` variants are read by the same handler. */\nexport const LOGICAL_SIZE_STYLES = ['blockSize', 'inlineSize'] as const;\nexport const LOGICAL_SIZE_CONSTRAINT_STYLES = [\n 'minBlockSize',\n 'maxBlockSize',\n 'minInlineSize',\n 'maxInlineSize',\n] as const;\n\n/**\n * Enhanced logical spacing and inset axes — the categories that take a value\n * per logical edge, so they share the `start`/`end` modifier vocabulary and the\n * one-value-per-directional-group rule.\n */\nexport const LOGICAL_SPACING_STYLES = [\n 'blockPadding',\n 'inlinePadding',\n 'blockMargin',\n 'inlineMargin',\n 'blockInset',\n 'inlineInset',\n 'blockScrollMargin',\n 'inlineScrollMargin',\n 'blockScrollPadding',\n 'inlineScrollPadding',\n] as const;\n\n/**\n * Enhanced logical borders. Kept apart from {@link LOGICAL_SPACING_STYLES}\n * because a border group legitimately carries width + style + colour, exactly\n * as physical `border` does, so it is not subject to the single-value rule.\n */\nexport const LOGICAL_BORDER_STYLES = ['blockBorder', 'inlineBorder'] as const;\n\n/** Every enhanced logical style, in the order tasty's own lists declare them. */\nexport const LOGICAL_STYLES = [\n ...LOGICAL_SIZE_STYLES,\n ...LOGICAL_SIZE_CONSTRAINT_STYLES,\n ...LOGICAL_SPACING_STYLES,\n ...LOGICAL_BORDER_STYLES,\n] as const;\n\n/**\n * Built-in tasty style properties that are always valid as style keys.\n */\nexport const KNOWN_TASTY_PROPERTIES = new Set([\n 'display',\n 'font',\n 'preset',\n 'hide',\n 'whiteSpace',\n 'opacity',\n 'transition',\n 'gridArea',\n 'order',\n 'gridColumn',\n 'gridRow',\n 'placeSelf',\n 'alignSelf',\n 'justifySelf',\n 'zIndex',\n 'margin',\n 'inset',\n 'position',\n 'padding',\n 'overflow',\n 'scrollbar',\n 'textAlign',\n 'border',\n 'radius',\n 'shadow',\n 'outline',\n 'color',\n 'fill',\n 'fade',\n 'image',\n 'textTransform',\n 'fontWeight',\n 'fontStyle',\n 'width',\n 'height',\n 'flexBasis',\n 'flexGrow',\n 'flexShrink',\n 'flex',\n 'flow',\n 'place',\n 'placeItems',\n 'placeContent',\n 'alignItems',\n 'alignContent',\n 'justifyItems',\n 'justifyContent',\n 'align',\n 'justify',\n 'gap',\n 'columnGap',\n 'rowGap',\n 'gridColumns',\n 'gridRows',\n 'gridTemplate',\n 'gridAreas',\n 'recipe',\n 'textOverflow',\n 'textDecoration',\n 'animation',\n 'cursor',\n 'pointerEvents',\n 'userSelect',\n 'transform',\n 'transformOrigin',\n 'filter',\n 'backdropFilter',\n 'mixBlendMode',\n 'objectFit',\n 'objectPosition',\n 'resize',\n 'appearance',\n 'listStyle',\n 'listStyleType',\n 'content',\n 'boxSizing',\n 'verticalAlign',\n 'wordBreak',\n 'overflowWrap',\n 'hyphens',\n 'tabSize',\n 'direction',\n 'unicodeBidi',\n 'writingMode',\n 'lineClamp',\n 'aspectRatio',\n 'contain',\n 'container',\n 'containerType',\n 'containerName',\n 'interpolateSize',\n 'willChange',\n 'isolation',\n 'touchAction',\n 'scrollBehavior',\n 'scrollSnapType',\n 'scrollSnapAlign',\n 'caretColor',\n 'accentColor',\n 'colorScheme',\n // Physical scroll shorthands: tasty v3.8 gave `scrollPadding` its own\n // directional handler alongside the `scrollMargin` one, so both take the\n // padding vocabulary (modifiers, `true`, one value per directional group).\n 'scrollMargin',\n 'scrollPadding',\n ...LOGICAL_STYLES,\n]);\n\n/**\n * Special top-level keys that are valid but not regular style properties.\n *\n * These match the real CSS at-rule names Tasty emits, so they are kebab-case.\n */\nexport const SPECIAL_STYLE_KEYS = new Set([\n '@keyframes',\n '@property',\n '@font-face',\n '@counter-style',\n '@function',\n]);\n\n/**\n * At-rule style keys renamed in Tasty v3, mapped old spelling -> new.\n *\n * The v2 spellings were camelCase; v3 uses the CSS at-rule names Tasty already\n * emitted. Reported (and auto-fixed) so upgrading is mechanical.\n */\nexport const RENAMED_SPECIAL_STYLE_KEYS: Record<string, string> = {\n '@properties': '@property',\n '@fontFace': '@font-face',\n '@counterStyle': '@counter-style',\n};\n\n/**\n * CSS property names, camelCase, derived from `known-css-properties` — the\n * MDN/W3C-sourced dataset stylelint uses for `property-no-unknown`.\n *\n * Generated. Run `pnpm generate:css-properties` after bumping the dataset rather\n * than editing this list; `constants.css-properties.test.ts` fails on drift.\n *\n * Tasty renders any camelCase style key straight through to its kebab-case CSS\n * declaration (`maskSize` -> `mask-size`), so anything absent here is a false\n * positive from `known-property` on valid CSS — which is why the list is derived\n * from data instead of maintained by hand.\n *\n * The dataset also carries at-rule descriptors (`src`, `syntax`, `symbols`, `size`),\n * which are kept, as stylelint keeps them. They are only reachable as top-level\n * style keys, where the cost is a declaration browsers drop rather than a report —\n * and separating them would mean hand-maintaining the exclusion list this change\n * exists to delete. Inside an at-rule block nothing validates them: `known-property`\n * exempts every `@`-prefixed key and does not descend.\n */\nconst DATASET_CSS_PROPERTIES = [\n 'accelerator',\n 'accentColor',\n 'additiveSymbols',\n 'alignContent',\n 'alignItems',\n 'alignSelf',\n 'alignmentBaseline',\n 'all',\n 'alt',\n 'anchorName',\n 'anchorScope',\n 'animation',\n 'animationComposition',\n 'animationDelay',\n 'animationDirection',\n 'animationDuration',\n 'animationFillMode',\n 'animationIterationCount',\n 'animationName',\n 'animationPlayState',\n 'animationRange',\n 'animationRangeEnd',\n 'animationRangeStart',\n 'animationTimeline',\n 'animationTimingFunction',\n 'animationTrigger',\n 'animationTriggerBehavior',\n 'animationTriggerExitRange',\n 'animationTriggerExitRangeEnd',\n 'animationTriggerExitRangeStart',\n 'animationTriggerRange',\n 'animationTriggerRangeEnd',\n 'animationTriggerRangeStart',\n 'animationTriggerTimeline',\n 'appRegion',\n 'appearance',\n 'ascentOverride',\n 'aspectRatio',\n 'audioLevel',\n 'azimuth',\n 'backdropFilter',\n 'backfaceVisibility',\n 'background',\n 'backgroundAttachment',\n 'backgroundBlendMode',\n 'backgroundClip',\n 'backgroundColor',\n 'backgroundImage',\n 'backgroundOrigin',\n 'backgroundPosition',\n 'backgroundPositionX',\n 'backgroundPositionY',\n 'backgroundRepeat',\n 'backgroundRepeatX',\n 'backgroundRepeatY',\n 'backgroundSize',\n 'basePalette',\n 'baselineShift',\n 'baselineSource',\n 'behavior',\n 'blockEllipsis',\n 'blockSize',\n 'blockStep',\n 'blockStepAlign',\n 'blockStepInsert',\n 'blockStepRound',\n 'blockStepSize',\n 'bookmarkLabel',\n 'bookmarkLevel',\n 'bookmarkState',\n 'border',\n 'borderBlock',\n 'borderBlockColor',\n 'borderBlockEnd',\n 'borderBlockEndColor',\n 'borderBlockEndStyle',\n 'borderBlockEndWidth',\n 'borderBlockStart',\n 'borderBlockStartColor',\n 'borderBlockStartStyle',\n 'borderBlockStartWidth',\n 'borderBlockStyle',\n 'borderBlockWidth',\n 'borderBottom',\n 'borderBottomColor',\n 'borderBottomLeftRadius',\n 'borderBottomRightRadius',\n 'borderBottomStyle',\n 'borderBottomWidth',\n 'borderBoundary',\n 'borderCollapse',\n 'borderColor',\n 'borderEndEndRadius',\n 'borderEndStartRadius',\n 'borderImage',\n 'borderImageOutset',\n 'borderImageRepeat',\n 'borderImageSlice',\n 'borderImageSource',\n 'borderImageWidth',\n 'borderInline',\n 'borderInlineColor',\n 'borderInlineEnd',\n 'borderInlineEndColor',\n 'borderInlineEndStyle',\n 'borderInlineEndWidth',\n 'borderInlineStart',\n 'borderInlineStartColor',\n 'borderInlineStartStyle',\n 'borderInlineStartWidth',\n 'borderInlineStyle',\n 'borderInlineWidth',\n 'borderLeft',\n 'borderLeftColor',\n 'borderLeftStyle',\n 'borderLeftWidth',\n 'borderRadius',\n 'borderRight',\n 'borderRightColor',\n 'borderRightStyle',\n 'borderRightWidth',\n 'borderSpacing',\n 'borderStartEndRadius',\n 'borderStartStartRadius',\n 'borderStyle',\n 'borderTop',\n 'borderTopColor',\n 'borderTopLeftRadius',\n 'borderTopRightRadius',\n 'borderTopStyle',\n 'borderTopWidth',\n 'borderWidth',\n 'bottom',\n 'boxDecorationBreak',\n 'boxShadow',\n 'boxSizing',\n 'boxSnap',\n 'breakAfter',\n 'breakBefore',\n 'breakInside',\n 'bufferedRendering',\n 'captionSide',\n 'caret',\n 'caretAnimation',\n 'caretColor',\n 'caretShape',\n 'chains',\n 'clear',\n 'clip',\n 'clipPath',\n 'clipRule',\n 'color',\n 'colorAdjust',\n 'colorInterpolation',\n 'colorInterpolationFilters',\n 'colorProfile',\n 'colorRendering',\n 'colorScheme',\n 'columnCount',\n 'columnFill',\n 'columnGap',\n 'columnHeight',\n 'columnProgression',\n 'columnRule',\n 'columnRuleBreak',\n 'columnRuleColor',\n 'columnRuleOutset',\n 'columnRuleStyle',\n 'columnRuleWidth',\n 'columnSpan',\n 'columnWidth',\n 'columnWrap',\n 'columns',\n 'contain',\n 'containIntrinsicBlockSize',\n 'containIntrinsicHeight',\n 'containIntrinsicInlineSize',\n 'containIntrinsicSize',\n 'containIntrinsicWidth',\n 'container',\n 'containerName',\n 'containerType',\n 'content',\n 'contentVisibility',\n 'continue',\n 'counterIncrement',\n 'counterReset',\n 'counterSet',\n 'cue',\n 'cueAfter',\n 'cueBefore',\n 'cursor',\n 'cx',\n 'cy',\n 'd',\n 'descentOverride',\n 'direction',\n 'display',\n 'displayAlign',\n 'dominantBaseline',\n 'dynamicRangeLimit',\n 'elevation',\n 'emptyCells',\n 'enableBackground',\n 'epubCaptionSide',\n 'epubHyphens',\n 'epubTextCombine',\n 'epubTextEmphasis',\n 'epubTextEmphasisColor',\n 'epubTextEmphasisStyle',\n 'epubTextOrientation',\n 'epubTextTransform',\n 'epubWordBreak',\n 'epubWritingMode',\n 'fallback',\n 'fieldSizing',\n 'fill',\n 'fillBreak',\n 'fillColor',\n 'fillImage',\n 'fillOpacity',\n 'fillOrigin',\n 'fillPosition',\n 'fillRepeat',\n 'fillRule',\n 'fillSize',\n 'filter',\n 'flex',\n 'flexBasis',\n 'flexDirection',\n 'flexFlow',\n 'flexGrow',\n 'flexShrink',\n 'flexWrap',\n 'float',\n 'floatDefer',\n 'floatOffset',\n 'floatReference',\n 'floodColor',\n 'floodOpacity',\n 'flow',\n 'flowFrom',\n 'flowInto',\n 'font',\n 'fontDisplay',\n 'fontFamily',\n 'fontFeatureSettings',\n 'fontKerning',\n 'fontLanguageOverride',\n 'fontOpticalSizing',\n 'fontPalette',\n 'fontSize',\n 'fontSizeAdjust',\n 'fontStretch',\n 'fontStyle',\n 'fontSynthesis',\n 'fontSynthesisPosition',\n 'fontSynthesisSmallCaps',\n 'fontSynthesisStyle',\n 'fontSynthesisWeight',\n 'fontVariant',\n 'fontVariantAlternates',\n 'fontVariantCaps',\n 'fontVariantEastAsian',\n 'fontVariantEmoji',\n 'fontVariantLigatures',\n 'fontVariantNumeric',\n 'fontVariantPosition',\n 'fontVariationSettings',\n 'fontWeight',\n 'fontWidth',\n 'footnoteDisplay',\n 'footnotePolicy',\n 'forcedColorAdjust',\n 'gap',\n 'glyphOrientationHorizontal',\n 'glyphOrientationVertical',\n 'grid',\n 'gridArea',\n 'gridAutoColumns',\n 'gridAutoFlow',\n 'gridAutoRows',\n 'gridColumn',\n 'gridColumnEnd',\n 'gridColumnGap',\n 'gridColumnStart',\n 'gridGap',\n 'gridRow',\n 'gridRowEnd',\n 'gridRowGap',\n 'gridRowStart',\n 'gridTemplate',\n 'gridTemplateAreas',\n 'gridTemplateColumns',\n 'gridTemplateRows',\n 'hangingPunctuation',\n 'height',\n 'hyphenateCharacter',\n 'hyphenateLimitChars',\n 'hyphenateLimitLast',\n 'hyphenateLimitLines',\n 'hyphenateLimitZone',\n 'hyphens',\n 'imageOrientation',\n 'imageRendering',\n 'imageResolution',\n 'imeMode',\n 'inherits',\n 'initialLetter',\n 'initialLetterAlign',\n 'initialLetterWrap',\n 'initialValue',\n 'inlineSize',\n 'inlineSizing',\n 'inputFormat',\n 'inputSecurity',\n 'inset',\n 'insetArea',\n 'insetBlock',\n 'insetBlockEnd',\n 'insetBlockStart',\n 'insetInline',\n 'insetInlineEnd',\n 'insetInlineStart',\n 'interactivity',\n 'interpolateSize',\n 'isolation',\n 'itemCross',\n 'itemDirection',\n 'itemFlow',\n 'itemPack',\n 'itemSlack',\n 'itemTrack',\n 'itemWrap',\n 'justifyContent',\n 'justifyItems',\n 'justifySelf',\n 'kerning',\n 'layoutFlow',\n 'layoutGrid',\n 'layoutGridChar',\n 'layoutGridLine',\n 'layoutGridMode',\n 'layoutGridType',\n 'left',\n 'letterSpacing',\n 'lightingColor',\n 'lineBreak',\n 'lineClamp',\n 'lineFitEdge',\n 'lineGapOverride',\n 'lineGrid',\n 'lineHeight',\n 'lineHeightStep',\n 'lineIncrement',\n 'linePadding',\n 'lineSnap',\n 'listStyle',\n 'listStyleImage',\n 'listStylePosition',\n 'listStyleType',\n 'margin',\n 'marginBlock',\n 'marginBlockEnd',\n 'marginBlockStart',\n 'marginBottom',\n 'marginBreak',\n 'marginInline',\n 'marginInlineEnd',\n 'marginInlineStart',\n 'marginLeft',\n 'marginRight',\n 'marginTop',\n 'marginTrim',\n 'marker',\n 'markerEnd',\n 'markerKnockoutLeft',\n 'markerKnockoutRight',\n 'markerMid',\n 'markerOffset',\n 'markerPattern',\n 'markerSegment',\n 'markerSide',\n 'markerStart',\n 'marks',\n 'mask',\n 'maskBorder',\n 'maskBorderMode',\n 'maskBorderOutset',\n 'maskBorderRepeat',\n 'maskBorderSlice',\n 'maskBorderSource',\n 'maskBorderWidth',\n 'maskClip',\n 'maskComposite',\n 'maskImage',\n 'maskMode',\n 'maskOrigin',\n 'maskPosition',\n 'maskPositionX',\n 'maskPositionY',\n 'maskRepeat',\n 'maskSize',\n 'maskSourceType',\n 'maskType',\n 'mathDepth',\n 'mathShift',\n 'mathStyle',\n 'maxBlockSize',\n 'maxHeight',\n 'maxInlineSize',\n 'maxLines',\n 'maxWidth',\n 'maxZoom',\n 'minBlockSize',\n 'minHeight',\n 'minInlineSize',\n 'minIntrinsicSizing',\n 'minWidth',\n 'minZoom',\n 'mixBlendMode',\n 'motion',\n 'motionOffset',\n 'motionPath',\n 'motionRotation',\n 'navDown',\n 'navIndex',\n 'navLeft',\n 'navRight',\n 'navUp',\n 'navigation',\n 'negative',\n 'objectFit',\n 'objectPosition',\n 'objectViewBox',\n 'offset',\n 'offsetAnchor',\n 'offsetBlockEnd',\n 'offsetBlockStart',\n 'offsetDistance',\n 'offsetInlineEnd',\n 'offsetInlineStart',\n 'offsetPath',\n 'offsetPosition',\n 'offsetRotate',\n 'offsetRotation',\n 'opacity',\n 'order',\n 'orientation',\n 'orphans',\n 'outline',\n 'outlineColor',\n 'outlineOffset',\n 'outlineStyle',\n 'outlineWidth',\n 'overflow',\n 'overflowAnchor',\n 'overflowBlock',\n 'overflowClipMargin',\n 'overflowClipMarginBlock',\n 'overflowClipMarginBlockEnd',\n 'overflowClipMarginBlockStart',\n 'overflowClipMarginBottom',\n 'overflowClipMarginInline',\n 'overflowClipMarginInlineEnd',\n 'overflowClipMarginInlineStart',\n 'overflowClipMarginLeft',\n 'overflowClipMarginRight',\n 'overflowClipMarginTop',\n 'overflowInline',\n 'overflowWrap',\n 'overflowX',\n 'overflowY',\n 'overlay',\n 'overrideColors',\n 'overscrollBehavior',\n 'overscrollBehaviorBlock',\n 'overscrollBehaviorInline',\n 'overscrollBehaviorX',\n 'overscrollBehaviorY',\n 'pad',\n 'padding',\n 'paddingBlock',\n 'paddingBlockEnd',\n 'paddingBlockStart',\n 'paddingBottom',\n 'paddingInline',\n 'paddingInlineEnd',\n 'paddingInlineStart',\n 'paddingLeft',\n 'paddingRight',\n 'paddingTop',\n 'page',\n 'pageBreakAfter',\n 'pageBreakBefore',\n 'pageBreakInside',\n 'pageOrientation',\n 'paintOrder',\n 'pause',\n 'pauseAfter',\n 'pauseBefore',\n 'penAction',\n 'perspective',\n 'perspectiveOrigin',\n 'perspectiveOriginX',\n 'perspectiveOriginY',\n 'pitch',\n 'pitchRange',\n 'placeContent',\n 'placeItems',\n 'placeSelf',\n 'playDuring',\n 'pointerEvents',\n 'position',\n 'positionAnchor',\n 'positionArea',\n 'positionTry',\n 'positionTryFallbacks',\n 'positionTryOptions',\n 'positionTryOrder',\n 'positionVisibility',\n 'prefix',\n 'printColorAdjust',\n 'propertyName',\n 'quotes',\n 'r',\n 'range',\n 'readingFlow',\n 'readingOrder',\n 'regionFragment',\n 'resize',\n 'rest',\n 'restAfter',\n 'restBefore',\n 'richness',\n 'right',\n 'rotate',\n 'rowGap',\n 'rowRule',\n 'rowRuleBreak',\n 'rowRuleColor',\n 'rowRuleOutset',\n 'rowRuleStyle',\n 'rowRuleWidth',\n 'rubyAlign',\n 'rubyMerge',\n 'rubyOverhang',\n 'rubyPosition',\n 'rule',\n 'ruleBreak',\n 'ruleColor',\n 'ruleOutset',\n 'rulePaintOrder',\n 'ruleStyle',\n 'ruleWidth',\n 'running',\n 'rx',\n 'ry',\n 'scale',\n 'scrollBehavior',\n 'scrollInitialTarget',\n 'scrollMargin',\n 'scrollMarginBlock',\n 'scrollMarginBlockEnd',\n 'scrollMarginBlockStart',\n 'scrollMarginBottom',\n 'scrollMarginInline',\n 'scrollMarginInlineEnd',\n 'scrollMarginInlineStart',\n 'scrollMarginLeft',\n 'scrollMarginRight',\n 'scrollMarginTop',\n 'scrollMarkerGroup',\n 'scrollPadding',\n 'scrollPaddingBlock',\n 'scrollPaddingBlockEnd',\n 'scrollPaddingBlockStart',\n 'scrollPaddingBottom',\n 'scrollPaddingInline',\n 'scrollPaddingInlineEnd',\n 'scrollPaddingInlineStart',\n 'scrollPaddingLeft',\n 'scrollPaddingRight',\n 'scrollPaddingTop',\n 'scrollSnapAlign',\n 'scrollSnapCoordinate',\n 'scrollSnapDestination',\n 'scrollSnapMargin',\n 'scrollSnapMarginBottom',\n 'scrollSnapMarginLeft',\n 'scrollSnapMarginRight',\n 'scrollSnapMarginTop',\n 'scrollSnapPointsX',\n 'scrollSnapPointsY',\n 'scrollSnapStop',\n 'scrollSnapType',\n 'scrollSnapTypeX',\n 'scrollSnapTypeY',\n 'scrollStartTarget',\n 'scrollTargetGroup',\n 'scrollTimeline',\n 'scrollTimelineAxis',\n 'scrollTimelineName',\n 'scrollbar3dLightColor',\n 'scrollbar3dlightColor',\n 'scrollbarArrowColor',\n 'scrollbarBaseColor',\n 'scrollbarColor',\n 'scrollbarDarkShadowColor',\n 'scrollbarDarkshadowColor',\n 'scrollbarFaceColor',\n 'scrollbarGutter',\n 'scrollbarHighlightColor',\n 'scrollbarShadowColor',\n 'scrollbarTrackColor',\n 'scrollbarWidth',\n 'shapeImageThreshold',\n 'shapeInside',\n 'shapeMargin',\n 'shapeOutside',\n 'shapeRendering',\n 'size',\n 'sizeAdjust',\n 'sliderOrientation',\n 'snapHeight',\n 'solidColor',\n 'solidOpacity',\n 'spatialNavigationAction',\n 'spatialNavigationContain',\n 'spatialNavigationFunction',\n 'speak',\n 'speakAs',\n 'speakHeader',\n 'speakNumeral',\n 'speakPunctuation',\n 'speechRate',\n 'src',\n 'stopColor',\n 'stopOpacity',\n 'stress',\n 'stringSet',\n 'stroke',\n 'strokeAlign',\n 'strokeAlignment',\n 'strokeBreak',\n 'strokeColor',\n 'strokeDashCorner',\n 'strokeDashJustify',\n 'strokeDashadjust',\n 'strokeDasharray',\n 'strokeDashcorner',\n 'strokeDashoffset',\n 'strokeImage',\n 'strokeLinecap',\n 'strokeLinejoin',\n 'strokeMiterlimit',\n 'strokeOpacity',\n 'strokeOrigin',\n 'strokePosition',\n 'strokeRepeat',\n 'strokeSize',\n 'strokeWidth',\n 'suffix',\n 'supportedColorSchemes',\n 'symbols',\n 'syntax',\n 'system',\n 'tabSize',\n 'tableLayout',\n 'textAlign',\n 'textAlignAll',\n 'textAlignLast',\n 'textAnchor',\n 'textAutospace',\n 'textBox',\n 'textBoxEdge',\n 'textBoxTrim',\n 'textCombineUpright',\n 'textDecoration',\n 'textDecorationBlink',\n 'textDecorationColor',\n 'textDecorationLine',\n 'textDecorationLineThrough',\n 'textDecorationNone',\n 'textDecorationOverline',\n 'textDecorationSkip',\n 'textDecorationSkipBox',\n 'textDecorationSkipInk',\n 'textDecorationSkipInset',\n 'textDecorationSkipSelf',\n 'textDecorationSkipSpaces',\n 'textDecorationStyle',\n 'textDecorationThickness',\n 'textDecorationTrim',\n 'textDecorationUnderline',\n 'textEmphasis',\n 'textEmphasisColor',\n 'textEmphasisPosition',\n 'textEmphasisSkip',\n 'textEmphasisStyle',\n 'textGroupAlign',\n 'textIndent',\n 'textJustify',\n 'textJustifyTrim',\n 'textKashida',\n 'textKashidaSpace',\n 'textLineThrough',\n 'textLineThroughColor',\n 'textLineThroughMode',\n 'textLineThroughStyle',\n 'textLineThroughWidth',\n 'textOrientation',\n 'textOverflow',\n 'textOverline',\n 'textOverlineColor',\n 'textOverlineMode',\n 'textOverlineStyle',\n 'textOverlineWidth',\n 'textRendering',\n 'textShadow',\n 'textSizeAdjust',\n 'textSpacing',\n 'textSpacingTrim',\n 'textTransform',\n 'textUnderline',\n 'textUnderlineColor',\n 'textUnderlineMode',\n 'textUnderlineOffset',\n 'textUnderlinePosition',\n 'textUnderlineStyle',\n 'textUnderlineWidth',\n 'textWrap',\n 'textWrapMode',\n 'textWrapStyle',\n 'timelineScope',\n 'top',\n 'touchAction',\n 'touchActionDelay',\n 'transform',\n 'transformBox',\n 'transformOrigin',\n 'transformOriginX',\n 'transformOriginY',\n 'transformOriginZ',\n 'transformStyle',\n 'transition',\n 'transitionBehavior',\n 'transitionDelay',\n 'transitionDuration',\n 'transitionProperty',\n 'transitionTimingFunction',\n 'translate',\n 'types',\n 'ucAltSkin',\n 'ucSkin',\n 'unicodeBidi',\n 'unicodeRange',\n 'userSelect',\n 'userZoom',\n 'vectorEffect',\n 'verticalAlign',\n 'viewTimeline',\n 'viewTimelineAxis',\n 'viewTimelineInset',\n 'viewTimelineName',\n 'viewTransitionClass',\n 'viewTransitionGroup',\n 'viewTransitionName',\n 'viewportFill',\n 'viewportFillOpacity',\n 'viewportFit',\n 'visibility',\n 'voiceBalance',\n 'voiceDuration',\n 'voiceFamily',\n 'voicePitch',\n 'voiceRange',\n 'voiceRate',\n 'voiceStress',\n 'voiceVolume',\n 'volume',\n 'whiteSpace',\n 'whiteSpaceCollapse',\n 'whiteSpaceTrim',\n 'widows',\n 'width',\n 'willChange',\n 'wordBreak',\n 'wordSpaceTransform',\n 'wordSpacing',\n 'wordWrap',\n 'wrapAfter',\n 'wrapBefore',\n 'wrapFlow',\n 'wrapInside',\n 'wrapThrough',\n 'writingMode',\n 'x',\n 'y',\n 'zIndex',\n 'zoom',\n];\n\n/**\n * Properties that ship in browsers or sit in a spec, but have not landed in\n * `known-css-properties` yet. Hand-maintained, and pruned as the dataset catches\n * up — the guard test fails on any entry the dataset already covers.\n */\nexport const EMERGING_CSS_PROPERTIES = [\n // CSS Borders and Box Decorations 4 — squircles and notched corners, shipped in\n // Chromium 139.\n 'cornerShape',\n 'cornerTopShape',\n 'cornerRightShape',\n 'cornerBottomShape',\n 'cornerLeftShape',\n 'cornerBlockStartShape',\n 'cornerBlockEndShape',\n 'cornerInlineStartShape',\n 'cornerInlineEndShape',\n 'cornerTopLeftShape',\n 'cornerTopRightShape',\n 'cornerBottomRightShape',\n 'cornerBottomLeftShape',\n 'cornerStartStartShape',\n 'cornerStartEndShape',\n 'cornerEndStartShape',\n 'cornerEndEndShape',\n];\n\n/**\n * Every CSS property `known-property` accepts as a camelCase style key.\n */\nexport const KNOWN_CSS_PROPERTIES = new Set([\n ...DATASET_CSS_PROPERTIES,\n ...EMERGING_CSS_PROPERTIES,\n]);\n\n/**\n * Built-in custom units recognized by the tasty parser.\n */\nexport const BUILT_IN_UNITS = new Set(['x', 'r', 'cr', 'bw', 'ow', 'lh', 'sf']);\n\n/**\n * Custom properties Tasty registers as default `@property` rules, so they are\n * always defined whatever the config's `tokens` list says. The scale tokens\n * match their built-in units; style handlers read the rest as bare `var()`s\n * (`radius: 'leaf'`, `preset: 'h1 / strong'`, the font fallbacks, timings).\n */\nexport const BUILT_IN_CUSTOM_PROPERTIES = new Set([\n '$gap',\n '$radius',\n '$border-width',\n '$outline-width',\n '$transition',\n '$sharp-radius',\n '$bold-font-weight',\n '$font-sans-fallback',\n '$font-mono-fallback',\n]);\n\n/**\n * Standard CSS units (always valid).\n */\nexport const CSS_UNITS = new Set([\n 'px',\n 'em',\n 'rem',\n '%',\n 'vw',\n 'vh',\n 'vmin',\n 'vmax',\n 'ch',\n 'ex',\n 'cm',\n 'mm',\n 'in',\n 'pt',\n 'pc',\n 'fr',\n 'deg',\n 'rad',\n 'turn',\n 'grad',\n 's',\n 'ms',\n 'dpi',\n 'dpcm',\n 'dppx',\n 'svw',\n 'svh',\n 'lvw',\n 'lvh',\n 'dvw',\n 'dvh',\n 'cqw',\n 'cqh',\n 'cqi',\n 'cqb',\n 'cqmin',\n 'cqmax',\n 'cap',\n 'ic',\n 'rlh',\n 'vi',\n 'vb',\n]);\n\n/**\n * Properties that accept `true` as a value (means \"use default\").\n *\n * `fill` is documented as accepting `true` but is deliberately absent: as of\n * tasty 3.8 the handler passes the boolean straight through, so `fill: true`\n * emits `background-color: true` — a declaration the browser drops, leaving no\n * background at all. Reporting it is the useful answer while that is what runs.\n * `constants.round-trip.test.ts` pins both halves of that: no property in this\n * set may swallow `true`, and `fill` still does — so whichever way tasty\n * resolves it (docs or implementation), a test says so rather than the plugin\n * quietly disagreeing with the runtime.\n */\nexport const BOOLEAN_TRUE_PROPERTIES = new Set([\n 'border',\n 'radius',\n 'padding',\n 'margin',\n 'gap',\n 'color',\n 'shadow',\n 'outline',\n 'inset',\n 'width',\n 'height',\n // `fade: true` falls back to `2x`, which follows `configure({ units })`.\n 'fade',\n 'hide',\n 'preset',\n 'font',\n 'scrollbar',\n 'scrollMargin',\n 'scrollPadding',\n // Every enhanced logical *category* carries the same design-system default as\n // its physical counterpart: `1x` for spacing and scroll edges, `0` for inset,\n // `1bw` for border, a reset for the sizes.\n //\n // The min/max size constraints are deliberately excluded, mirroring the\n // absence of `minWidth`/`maxWidth` here. The runtime does accept `true` on\n // them — they route through the same dimension handler as the axis — but what\n // it does with it is reset the whole axis: `minBlockSize: true` emits\n // `block-size: auto; min-block-size: initial; max-block-size: initial`, not a\n // default for the one constraint named. `blockSize: true` is how you ask for\n // that, so the constraint spellings stay an error, exactly as `minWidth: true`\n // already is.\n ...LOGICAL_SIZE_STYLES,\n ...LOGICAL_SPACING_STYLES,\n ...LOGICAL_BORDER_STYLES,\n]);\n\n/**\n * Directional modifiers and which properties accept them.\n */\nexport const DIRECTIONAL_MODIFIERS: Record<string, Set<string>> = {\n border: new Set(['top', 'right', 'bottom', 'left']),\n radius: new Set([\n 'top',\n 'right',\n 'bottom',\n 'left',\n 'top-left',\n 'top-right',\n 'bottom-left',\n 'bottom-right',\n ]),\n padding: new Set(['top', 'right', 'bottom', 'left']),\n margin: new Set(['top', 'right', 'bottom', 'left']),\n fade: new Set(['top', 'right', 'bottom', 'left']),\n scrollMargin: new Set(['top', 'right', 'bottom', 'left']),\n scrollPadding: new Set(['top', 'right', 'bottom', 'left']),\n inset: new Set(['top', 'right', 'bottom', 'left', 'dock']),\n // Enhanced logical styles take `start`/`end` and nothing else. Listing them\n // here is what makes a physical modifier on a logical axis — `blockPadding:\n // '1x top'`, which the handler silently drops — a report rather than silence.\n ...Object.fromEntries(\n [...LOGICAL_SPACING_STYLES, ...LOGICAL_BORDER_STYLES].map((style) => [\n style,\n new Set<string>(LOGICAL_EDGES),\n ]),\n ),\n};\n\n/**\n * Properties where a group naming directions carries exactly **one** value.\n *\n * Tasty v3 dropped the positional multi-value form for these: values and\n * modifiers are bucketed separately per comma group, so `'2x 4x top right'` and\n * `'2x top 4x right'` were the same input and the pairing depended on modifier\n * order. Per-side values now come from comma groups.\n *\n * Deliberately excludes `border` and `radius`. A `border` group legitimately\n * carries width + style + color, and a `radius` group can carry two values with\n * `leaf`/`backleaf`; neither takes the positional-per-side form, so neither is\n * subject to the rule.\n */\nexport const SINGLE_VALUE_DIRECTIONAL_PROPERTIES = new Set<string>([\n 'padding',\n 'margin',\n 'inset',\n 'scrollMargin',\n 'scrollPadding',\n 'fade',\n // The logical axis handlers bucket values and modifiers the same way, and warn\n // on a second value in a group that names an edge. `blockBorder`/`inlineBorder`\n // are excluded for the same reason `border` is: width + style + colour.\n ...LOGICAL_SPACING_STYLES,\n]);\n\n/**\n * Position names a 4-value box maps onto, in source order.\n */\nexport const BOX_SIDES = ['top', 'right', 'bottom', 'left'] as const;\nexport const BOX_CORNERS = [\n 'top-left',\n 'top-right',\n 'bottom-right',\n 'bottom-left',\n] as const;\n\nexport interface DirectionalBoxConfig {\n /**\n * The token that marks an unset position — dropping it from the shorthand\n * leaves the emitted CSS unchanged. This is the CSS initial value of the\n * longhand, which is not always `0`: `inset` initialises to `auto`, so a `0`\n * there is a real offset the shorthand must not drop.\n */\n identity: string;\n /** Modifier names for each of the four positions, in source order. */\n positions: readonly string[];\n /**\n * Whether `eslint --fix` may apply the rewrite. False when the rewrite is\n * still an improvement but changes what the browser renders, so a human has\n * to opt in.\n */\n fixable: boolean;\n /**\n * Set when the 4-value form is not interpreted per-position at all, so the\n * current output is wrong rather than merely verbose. Surfaced in the report.\n */\n note?: string;\n}\n\n/**\n * Properties whose 4-value box syntax has a directional-shorthand equivalent.\n *\n * `radius` uses corner names rather than sides: a directional modifier\n * addresses the corner *pair* along an edge, so only `top-left` & co. can\n * express a single corner (requires `@tenphi/tasty` >= 2.10).\n */\nexport const DIRECTIONAL_BOX: Record<string, DirectionalBoxConfig> = {\n margin: { identity: '0', positions: BOX_SIDES, fixable: true },\n padding: { identity: '0', positions: BOX_SIDES, fixable: true },\n inset: { identity: 'auto', positions: BOX_SIDES, fixable: true },\n radius: { identity: '0', positions: BOX_CORNERS, fixable: true },\n fade: { identity: '0', positions: BOX_SIDES, fixable: true },\n // Four `border` tokens parse as a single border value (width/style/color),\n // not as a box: `border: '0 0 1bw 0'` emits `border: 0 solid …` — no border\n // on any side. The directional form is what the author meant, but applying\n // it changes rendering, so it stays a manual fix.\n border: {\n identity: '0',\n positions: BOX_SIDES,\n fixable: false,\n note: 'four border tokens parse as one border value, so the current style sets no border at all',\n },\n};\n\n/**\n * Properties that support a `dock` modifier — pin one edge and span its full\n * length. Lets a 4-value box with a single `identity` side collapse, e.g.\n * `inset: 'auto 0 0 0'` -> `inset: '0 bottom dock'`.\n * Requires `@tenphi/tasty` >= 2.10.\n */\nexport const DOCK_PROPERTIES = new Set(['inset']);\n\n/**\n * Valid radius shape keywords.\n */\nexport const RADIUS_SHAPES = new Set(['round', 'ellipse', 'leaf', 'backleaf']);\n\n/**\n * Known semantic transition names — the keys of Tasty's transition map, plus\n * `zIndex`, which Tasty compiles to `z-index`. Any other name is emitted\n * verbatim as a CSS property.\n */\nexport const SEMANTIC_TRANSITIONS = new Set([\n 'fade',\n 'fill',\n 'border',\n 'radius',\n 'shadow',\n 'preset',\n 'gap',\n 'theme',\n 'color',\n 'outline',\n 'inset',\n 'text',\n 'opacity',\n 'translate',\n 'rotate',\n 'scale',\n 'filter',\n 'image',\n 'background',\n 'width',\n 'height',\n 'zIndex',\n]);\n\n/**\n * Mapping of native CSS properties to tasty shorthand alternatives.\n */\nexport const SHORTHAND_MAPPING: Record<\n string,\n { property: string; hint: string; safeFix?: boolean }\n> = {\n backgroundColor: { property: 'fill', hint: \"fill: '...'\", safeFix: true },\n borderColor: { property: 'border', hint: \"border: '...'\" },\n borderWidth: { property: 'border', hint: \"border: '...'\" },\n borderStyle: { property: 'border', hint: \"border: '...'\" },\n borderTop: { property: 'border', hint: \"border: '... top'\" },\n borderRight: { property: 'border', hint: \"border: '... right'\" },\n borderBottom: { property: 'border', hint: \"border: '... bottom'\" },\n borderLeft: { property: 'border', hint: \"border: '... left'\" },\n borderRadius: { property: 'radius', hint: \"radius: '...'\", safeFix: true },\n maxWidth: { property: 'width', hint: \"width: 'max ...'\" },\n minWidth: { property: 'width', hint: \"width: 'min ...'\" },\n maxHeight: { property: 'height', hint: \"height: 'max ...'\" },\n minHeight: { property: 'height', hint: \"height: 'min ...'\" },\n flexDirection: { property: 'flow', hint: \"flow: '...'\" },\n flexWrap: { property: 'flow', hint: \"flow: '...'\" },\n flexFlow: { property: 'flow', hint: \"flow: '...'\" },\n gridAutoFlow: { property: 'flow', hint: \"flow: '...'\" },\n outlineOffset: { property: 'outline', hint: \"outline: '... / offset'\" },\n paddingTop: { property: 'padding', hint: \"padding: '... top'\" },\n paddingRight: { property: 'padding', hint: \"padding: '... right'\" },\n paddingBottom: { property: 'padding', hint: \"padding: '... bottom'\" },\n paddingLeft: { property: 'padding', hint: \"padding: '... left'\" },\n marginTop: { property: 'margin', hint: \"margin: '... top'\" },\n marginRight: { property: 'margin', hint: \"margin: '... right'\" },\n marginBottom: { property: 'margin', hint: \"margin: '... bottom'\" },\n marginLeft: { property: 'margin', hint: \"margin: '... left'\" },\n fontSize: { property: 'preset', hint: \"preset: '...'\" },\n fontWeight: {\n property: 'preset',\n hint: \"preset: 'name / strong' (with strong modifier)\",\n },\n lineHeight: {\n property: 'preset',\n hint: \"preset: 'name / tight' (with tight modifier)\",\n },\n boxShadow: { property: 'shadow', hint: \"shadow: '...'\" },\n backgroundImage: { property: 'image', hint: \"image: '...'\" },\n fontFamily: { property: 'font', hint: \"font: '...'\" },\n fontStyle: {\n property: 'preset',\n hint: \"preset: 'name / italic' (with italic modifier)\",\n },\n letterSpacing: { property: 'preset', hint: \"preset: '...'\" },\n textTransform: { property: 'preset', hint: \"preset: '...'\" },\n flexGap: { property: 'gap', hint: \"gap: '...'\" },\n scrollbarWidth: { property: 'scrollbar', hint: \"scrollbar: '...'\" },\n scrollbarColor: { property: 'scrollbar', hint: \"scrollbar: '...'\" },\n scrollbarGutter: { property: 'scrollbar', hint: \"scrollbar: '...'\" },\n gridTemplateColumns: {\n property: 'gridColumns',\n hint: \"gridColumns: '...'\",\n },\n gridTemplateRows: { property: 'gridRows', hint: \"gridRows: '...'\" },\n gridTemplateAreas: { property: 'gridAreas', hint: \"gridAreas: '...'\" },\n top: { property: 'inset', hint: \"inset: '... top'\" },\n right: { property: 'inset', hint: \"inset: '... right'\" },\n bottom: { property: 'inset', hint: \"inset: '... bottom'\" },\n left: { property: 'inset', hint: \"inset: '... left'\" },\n outlineColor: { property: 'outline', hint: \"outline: '...'\" },\n outlineWidth: { property: 'outline', hint: \"outline: '...'\" },\n outlineStyle: { property: 'outline', hint: \"outline: '...'\" },\n lineClamp: {\n property: 'textOverflow',\n hint: \"textOverflow: 'ellipsis / {lines}'\",\n },\n\n // --- Native logical CSS -> the enhanced Tasty logical style. ---\n //\n // These mirror the physical rows above one for one. Tasty v3.8 moved the\n // enhanced behaviour onto `<axis><Category>` names and stopped reading the\n // native spellings in its handlers, so `paddingBlock` is now a plain CSS\n // declaration with no category default: the rename is the same advice as\n // `paddingTop` -> `padding: '... top'`, not a new opinion.\n //\n // Only the axis shorthands carry `safeFix`. `paddingBlock: '1x 2x'` and\n // `blockPadding: '1x 2x'` both emit `padding-block: 1x 2x`, so the key rename\n // is the whole edit — `constants.round-trip.test.ts` asserts that against the\n // installed runtime rather than trusting this comment. An edge longhand needs\n // a `start`/`end` modifier added to the value, and a `border-*` rename also\n // gains the style/colour defaults `border-block` never had (`border-block:\n // 1bw` renders nothing at all), so those stay report-only.\n //\n // These renames are why the `@tenphi/tasty` peer floor is 3.8.0. The plugin\n // never imports tasty, so its constants are fixed at publish time and cannot\n // adapt to the consumer's version: on 3.7 and below `blockPadding` is not a\n // style tasty knows, and an unhandled camelCase key renders straight through\n // to `block-padding`, which the browser drops. The fix would silently delete\n // the padding, so the floor is the only thing standing between that and a\n // consumer — recognising the logical names is harmless on an older tasty\n // (a missed warning), but rewriting *to* them is not.\n paddingBlock: {\n property: 'blockPadding',\n hint: \"blockPadding: '...'\",\n safeFix: true,\n },\n paddingBlockStart: {\n property: 'blockPadding',\n hint: \"blockPadding: '... start'\",\n },\n paddingBlockEnd: {\n property: 'blockPadding',\n hint: \"blockPadding: '... end'\",\n },\n paddingInline: {\n property: 'inlinePadding',\n hint: \"inlinePadding: '...'\",\n safeFix: true,\n },\n paddingInlineStart: {\n property: 'inlinePadding',\n hint: \"inlinePadding: '... start'\",\n },\n paddingInlineEnd: {\n property: 'inlinePadding',\n hint: \"inlinePadding: '... end'\",\n },\n marginBlock: {\n property: 'blockMargin',\n hint: \"blockMargin: '...'\",\n safeFix: true,\n },\n marginBlockStart: {\n property: 'blockMargin',\n hint: \"blockMargin: '... start'\",\n },\n marginBlockEnd: { property: 'blockMargin', hint: \"blockMargin: '... end'\" },\n marginInline: {\n property: 'inlineMargin',\n hint: \"inlineMargin: '...'\",\n safeFix: true,\n },\n marginInlineStart: {\n property: 'inlineMargin',\n hint: \"inlineMargin: '... start'\",\n },\n marginInlineEnd: {\n property: 'inlineMargin',\n hint: \"inlineMargin: '... end'\",\n },\n insetBlock: {\n property: 'blockInset',\n hint: \"blockInset: '...'\",\n safeFix: true,\n },\n insetBlockStart: { property: 'blockInset', hint: \"blockInset: '... start'\" },\n insetBlockEnd: { property: 'blockInset', hint: \"blockInset: '... end'\" },\n insetInline: {\n property: 'inlineInset',\n hint: \"inlineInset: '...'\",\n safeFix: true,\n },\n insetInlineStart: {\n property: 'inlineInset',\n hint: \"inlineInset: '... start'\",\n },\n insetInlineEnd: { property: 'inlineInset', hint: \"inlineInset: '... end'\" },\n scrollMarginBlock: {\n property: 'blockScrollMargin',\n hint: \"blockScrollMargin: '...'\",\n safeFix: true,\n },\n scrollMarginBlockStart: {\n property: 'blockScrollMargin',\n hint: \"blockScrollMargin: '... start'\",\n },\n scrollMarginBlockEnd: {\n property: 'blockScrollMargin',\n hint: \"blockScrollMargin: '... end'\",\n },\n scrollMarginInline: {\n property: 'inlineScrollMargin',\n hint: \"inlineScrollMargin: '...'\",\n safeFix: true,\n },\n scrollMarginInlineStart: {\n property: 'inlineScrollMargin',\n hint: \"inlineScrollMargin: '... start'\",\n },\n scrollMarginInlineEnd: {\n property: 'inlineScrollMargin',\n hint: \"inlineScrollMargin: '... end'\",\n },\n scrollPaddingBlock: {\n property: 'blockScrollPadding',\n hint: \"blockScrollPadding: '...'\",\n safeFix: true,\n },\n scrollPaddingBlockStart: {\n property: 'blockScrollPadding',\n hint: \"blockScrollPadding: '... start'\",\n },\n scrollPaddingBlockEnd: {\n property: 'blockScrollPadding',\n hint: \"blockScrollPadding: '... end'\",\n },\n scrollPaddingInline: {\n property: 'inlineScrollPadding',\n hint: \"inlineScrollPadding: '...'\",\n safeFix: true,\n },\n scrollPaddingInlineStart: {\n property: 'inlineScrollPadding',\n hint: \"inlineScrollPadding: '... start'\",\n },\n scrollPaddingInlineEnd: {\n property: 'inlineScrollPadding',\n hint: \"inlineScrollPadding: '... end'\",\n },\n borderBlock: { property: 'blockBorder', hint: \"blockBorder: '...'\" },\n borderBlockColor: { property: 'blockBorder', hint: \"blockBorder: '...'\" },\n borderBlockWidth: { property: 'blockBorder', hint: \"blockBorder: '...'\" },\n borderBlockStyle: { property: 'blockBorder', hint: \"blockBorder: '...'\" },\n borderBlockStart: {\n property: 'blockBorder',\n hint: \"blockBorder: '... start'\",\n },\n borderBlockEnd: { property: 'blockBorder', hint: \"blockBorder: '... end'\" },\n borderInline: { property: 'inlineBorder', hint: \"inlineBorder: '...'\" },\n borderInlineColor: { property: 'inlineBorder', hint: \"inlineBorder: '...'\" },\n borderInlineWidth: { property: 'inlineBorder', hint: \"inlineBorder: '...'\" },\n borderInlineStyle: { property: 'inlineBorder', hint: \"inlineBorder: '...'\" },\n borderInlineStart: {\n property: 'inlineBorder',\n hint: \"inlineBorder: '... start'\",\n },\n borderInlineEnd: {\n property: 'inlineBorder',\n hint: \"inlineBorder: '... end'\",\n },\n minBlockSize: { property: 'blockSize', hint: \"blockSize: 'min ...'\" },\n maxBlockSize: { property: 'blockSize', hint: \"blockSize: 'max ...'\" },\n minInlineSize: { property: 'inlineSize', hint: \"inlineSize: 'min ...'\" },\n maxInlineSize: { property: 'inlineSize', hint: \"inlineSize: 'max ...'\" },\n};\n\n/**\n * CSS shorthands whose *longhands* are the preferred Tasty form — the reverse\n * of `SHORTHAND_MAPPING`.\n *\n * `flex` is lossy in a way the longhands are not: it resets the two components\n * you did not write to values that are not their CSS initial. `flex: '0'`\n * expands to `flex-grow: 0; flex-shrink: 1; flex-basis: 0%`, so it cannot\n * express \"do not shrink\" (`flexShrink: 0`) at all, and it silently changes\n * `flex-basis`. Writing the longhands keeps each component independent, which\n * also lets them carry separate state maps.\n */\nexport const LONGHAND_MAPPING: Record<\n string,\n { longhands: string[]; hint: string }\n> = {\n flex: {\n longhands: ['flexGrow', 'flexShrink', 'flexBasis'],\n hint: 'flexGrow / flexShrink / flexBasis',\n },\n};\n\n/**\n * CSS transition property names mapped to Tasty semantic transition names.\n */\nexport const TRANSITION_SEMANTIC_MAPPING: Record<string, string> = {\n backgroundColor: 'fill',\n 'background-color': 'fill',\n backgroundImage: 'image',\n 'background-image': 'image',\n borderRadius: 'radius',\n 'border-radius': 'radius',\n borderColor: 'border',\n 'border-color': 'border',\n borderWidth: 'border',\n 'border-width': 'border',\n borderStyle: 'border',\n 'border-style': 'border',\n boxShadow: 'shadow',\n 'box-shadow': 'shadow',\n outlineColor: 'outline',\n 'outline-color': 'outline',\n outlineWidth: 'outline',\n 'outline-width': 'outline',\n outlineOffset: 'outline',\n 'outline-offset': 'outline',\n fontSize: 'preset',\n 'font-size': 'preset',\n lineHeight: 'preset',\n 'line-height': 'preset',\n letterSpacing: 'preset',\n 'letter-spacing': 'preset',\n};\n\n/**\n * Known preset modifiers, mirroring Tasty's preset handler. `normal` sets\n * `line-height: normal`.\n */\nexport const PRESET_MODIFIERS = new Set([\n 'strong',\n 'bold',\n 'italic',\n 'icon',\n 'tight',\n 'normal',\n]);\n\n/**\n * Default import sources for tasty.\n */\nexport const DEFAULT_IMPORT_SOURCES = ['@tenphi/tasty', '@tenphi/tasty/static'];\n\n/**\n * Built-in state prefixes that are always valid (not aliases).\n */\nexport const BUILT_IN_STATE_PREFIXES = new Set([\n '@media',\n '@root',\n '@parent',\n '@own',\n '@supports',\n '@starting',\n '@keyframes',\n '@property',\n '@font-face',\n '@counter-style',\n '@function',\n]);\n\n/**\n * Known CSS pseudo-classes: every standard element pseudo-class in MDN's\n * browser-compat-data (`css.selectors`), plus the Selectors Level 4 ones it\n * does not list yet (`:local-link`, `:target-within`, `:blank`, `:current`).\n * Functional pseudo-classes are listed by name, so `:dir` covers `:dir(rtl)`.\n * The `@page` pseudo-classes (`:first`, `:left`, `:right`) never match elements.\n */\nexport const KNOWN_PSEUDO_CLASSES = new Set([\n // User action\n ':hover',\n ':active',\n ':focus',\n ':focus-visible',\n ':focus-within',\n // Location\n ':any-link',\n ':link',\n ':visited',\n ':local-link',\n ':target',\n ':target-within',\n ':target-current',\n ':target-before',\n ':target-after',\n ':scope',\n // Linguistic\n ':dir',\n ':lang',\n // Input\n ':autofill',\n ':enabled',\n ':disabled',\n ':read-only',\n ':read-write',\n ':placeholder-shown',\n ':default',\n ':checked',\n ':indeterminate',\n ':blank',\n ':valid',\n ':invalid',\n ':user-valid',\n ':user-invalid',\n ':in-range',\n ':out-of-range',\n ':required',\n ':optional',\n // Element display state\n ':open',\n ':popover-open',\n ':modal',\n ':fullscreen',\n ':picture-in-picture',\n // Media resource state\n ':playing',\n ':paused',\n ':seeking',\n ':buffering',\n ':stalled',\n ':muted',\n ':volume-locked',\n // Time-dimensional\n ':current',\n ':past',\n ':future',\n // Tree-structural\n ':root',\n ':empty',\n ':first-child',\n ':last-child',\n ':only-child',\n ':first-of-type',\n ':last-of-type',\n ':only-of-type',\n ':nth-child',\n ':nth-last-child',\n ':nth-of-type',\n ':nth-last-of-type',\n ':heading',\n // Logical combinations\n ':is',\n ':not',\n ':where',\n ':has',\n // Custom elements and shadow DOM\n ':defined',\n ':state',\n ':host',\n ':host-context',\n ':has-slotted',\n // View transitions, interest invokers, navigation and WebXR\n ':active-view-transition',\n ':active-view-transition-type',\n ':interest-source',\n ':interest-target',\n ':navigation-source',\n ':xr-overlay',\n // Pseudo-elements\n '::before',\n '::after',\n '::placeholder',\n '::selection',\n '::first-line',\n '::first-letter',\n '::marker',\n '::backdrop',\n]);\n\n/**\n * Color tokens Tasty provides without any project configuration, so they are\n * always defined whatever the config's `tokens` list says.\n *\n * `#current` compiles to the `currentcolor` keyword, `#clear` is a default\n * replace token for `transparent`, and the rest are registered as default\n * `@property` rules (`#white`, `#black`, and `#border`/`#outline`, which fall\n * back to `currentcolor`). `prefer-custom-property-syntax` rewrites\n * `transparent` / `currentColor` to `#clear` / `#current`, so both must stay here.\n */\nexport const BUILT_IN_COLOR_TOKENS = new Set([\n '#current',\n '#clear',\n '#white',\n '#black',\n '#border',\n '#outline',\n]);\n\n/**\n * CSS named colors (level 1–4) that should be replaced by `#color` tokens.\n * `transparent` and `currentcolor` are excluded — they have their own token\n * suggestions (`#clear`, `#current`) handled by `prefer-custom-property-syntax`.\n */\nexport const NAMED_CSS_COLORS = new Set<string>([\n 'aliceblue',\n 'antiquewhite',\n 'aqua',\n 'aquamarine',\n 'azure',\n 'beige',\n 'bisque',\n 'black',\n 'blanchedalmond',\n 'blue',\n 'blueviolet',\n 'brown',\n 'burlywood',\n 'cadetblue',\n 'chartreuse',\n 'chocolate',\n 'coral',\n 'cornflowerblue',\n 'cornsilk',\n 'crimson',\n 'cyan',\n 'darkblue',\n 'darkcyan',\n 'darkgoldenrod',\n 'darkgray',\n 'darkgreen',\n 'darkgrey',\n 'darkkhaki',\n 'darkmagenta',\n 'darkolivegreen',\n 'darkorange',\n 'darkorchid',\n 'darkred',\n 'darksalmon',\n 'darkseagreen',\n 'darkslateblue',\n 'darkslategray',\n 'darkslategrey',\n 'darkturquoise',\n 'darkviolet',\n 'deeppink',\n 'deepskyblue',\n 'dimgray',\n 'dimgrey',\n 'dodgerblue',\n 'firebrick',\n 'floralwhite',\n 'forestgreen',\n 'fuchsia',\n 'gainsboro',\n 'ghostwhite',\n 'gold',\n 'goldenrod',\n 'gray',\n 'green',\n 'greenyellow',\n 'grey',\n 'honeydew',\n 'hotpink',\n 'indianred',\n 'indigo',\n 'ivory',\n 'khaki',\n 'lavender',\n 'lavenderblush',\n 'lawngreen',\n 'lemonchiffon',\n 'lightblue',\n 'lightcoral',\n 'lightcyan',\n 'lightgoldenrodyellow',\n 'lightgray',\n 'lightgreen',\n 'lightgrey',\n 'lightpink',\n 'lightsalmon',\n 'lightseagreen',\n 'lightskyblue',\n 'lightslategray',\n 'lightslategrey',\n 'lightsteelblue',\n 'lightyellow',\n 'lime',\n 'limegreen',\n 'linen',\n 'magenta',\n 'maroon',\n 'mediumaquamarine',\n 'mediumblue',\n 'mediumorchid',\n 'mediumpurple',\n 'mediumseagreen',\n 'mediumslateblue',\n 'mediumspringgreen',\n 'mediumturquoise',\n 'mediumvioletred',\n 'midnightblue',\n 'mintcream',\n 'mistyrose',\n 'moccasin',\n 'navajowhite',\n 'navy',\n 'oldlace',\n 'olive',\n 'olivedrab',\n 'orange',\n 'orangered',\n 'orchid',\n 'palegoldenrod',\n 'palegreen',\n 'paleturquoise',\n 'palevioletred',\n 'papayawhip',\n 'peachpuff',\n 'peru',\n 'pink',\n 'plum',\n 'powderblue',\n 'purple',\n 'rebeccapurple',\n 'red',\n 'rosybrown',\n 'royalblue',\n 'saddlebrown',\n 'salmon',\n 'sandybrown',\n 'seagreen',\n 'seashell',\n 'sienna',\n 'silver',\n 'skyblue',\n 'slateblue',\n 'slategray',\n 'slategrey',\n 'snow',\n 'springgreen',\n 'steelblue',\n 'tan',\n 'teal',\n 'thistle',\n 'tomato',\n 'turquoise',\n 'violet',\n 'wheat',\n 'white',\n 'whitesmoke',\n 'yellow',\n 'yellowgreen',\n]);\n\n/**\n * CSS system colors (CSS Color 4), lowercase. Tasty (>= 3.12) reads these as\n * colors, matched case-insensitively. Forced-colors styles are written in them,\n * so unlike `NAMED_CSS_COLORS` they are not something to replace with a token.\n * The deprecated system colors (`Menu`, `Window`, `ButtonHighlight`, …) are\n * left out, as Tasty leaves them out.\n */\nexport const SYSTEM_COLORS = new Set<string>([\n 'accentcolor',\n 'accentcolortext',\n 'activetext',\n 'buttonborder',\n 'buttonface',\n 'buttontext',\n 'canvas',\n 'canvastext',\n 'field',\n 'fieldtext',\n 'graytext',\n 'highlight',\n 'highlighttext',\n 'linktext',\n 'mark',\n 'marktext',\n 'selecteditem',\n 'selecteditemtext',\n 'visitedtext',\n]);\n\n/**\n * Properties that accept color values. Used to scope named-color checks so\n * string properties like `content` or `cursor` don't false-positive.\n */\nexport const COLOR_BEARING_PROPERTIES = new Set<string>([\n // Tasty enhanced properties\n 'fill',\n 'color',\n 'caretColor',\n 'accentColor',\n 'shadow',\n 'border',\n 'blockBorder',\n 'inlineBorder',\n 'outline',\n 'fade',\n // CSS background\n 'background',\n 'backgroundColor',\n // CSS border colors\n 'borderColor',\n 'borderTopColor',\n 'borderRightColor',\n 'borderBottomColor',\n 'borderLeftColor',\n // CSS logical border colors — the `block`/`inline` counterparts of the four\n // above, which a writing-mode-aware codebase reaches for just as often.\n 'borderBlockColor',\n 'borderBlockStartColor',\n 'borderBlockEndColor',\n 'borderInlineColor',\n 'borderInlineStartColor',\n 'borderInlineEndColor',\n // CSS shadows\n 'boxShadow',\n 'textShadow',\n // CSS text decoration\n 'textDecorationColor',\n // CSS outline / misc\n 'outlineColor',\n 'scrollbarColor',\n 'columnRuleColor',\n // SVG\n 'stroke',\n 'stopColor',\n 'floodColor',\n 'lightingColor',\n]);\n\n/**\n * Properties where tasty does NOT expand a `$name` custom-property reference.\n *\n * **Empty since tasty 3.0.2**, which taught the pass-through style handlers to\n * substitute `$name` refs too (tasty#264). Before that, `fontFamily:\n * '$font-sans'` emitted a literal `font-family: $font-sans` — an invalid\n * declaration the browser drops — so `prefer-custom-property-syntax` had to\n * suppress the rewrite for two dozen properties. It no longer does, which means\n * those rewrites are now offered where they were previously (and, since 3.0.2,\n * needlessly) held back.\n *\n * The set is kept rather than deleted: it is the seam the round-trip guard\n * writes to, so a future handler that regains pass-through behaviour surfaces\n * as a failing test instead of a silently broken autofix.\n *\n * An empty list here would let `--fix` delete a declaration on 3.0.0/3.0.1,\n * which the `@tenphi/tasty` peer floor rules out — that floor is 3.8.0, set by\n * the logical renames in {@link SHORTHAND_MAPPING} rather than by this list.\n *\n * Note that {@link PROPERTIES_WITHOUT_COLOR_TOKEN_EXPANSION} is *not* empty:\n * `#token` expansion is still property-scoped (`fontSize: '#accent'` is\n * meaningless and passes through). The two sets are genuinely different.\n *\n * Derived from the runtime, not by hand — `constants.round-trip.test.ts` rebuilds\n * both sets against the installed `@tenphi/tasty` and fails if either drifts.\n */\nexport const PROPERTIES_WITHOUT_CUSTOM_PROPERTY_EXPANSION = new Set<string>([]);\n\n/**\n * Properties where tasty does NOT expand a `#name` colour token.\n *\n * Mostly dimension and keyword properties: `fontSize: '#accent'` is meaningless,\n * so the handler leaves the value alone and the declaration is dropped. Suggesting\n * `#x` for a `var(--x-color)` inside one of these would break it.\n *\n * See {@link PROPERTIES_WITHOUT_CUSTOM_PROPERTY_EXPANSION} for why this is a\n * separate list rather than the same one.\n */\nexport const PROPERTIES_WITHOUT_COLOR_TOKEN_EXPANSION = new Set([\n 'align',\n 'alignContent',\n 'alignItems',\n 'backgroundAttachment',\n 'backgroundClip',\n 'backgroundOrigin',\n 'backgroundRepeat',\n 'display',\n 'font',\n 'fontFamily',\n 'fontSize',\n 'fontWeight',\n 'justify',\n 'justifyContent',\n 'justifyItems',\n 'letterSpacing',\n 'lineHeight',\n 'outlineOffset',\n 'overflow',\n 'place',\n 'placeContent',\n 'placeItems',\n 'textTransform',\n 'whiteSpace',\n]);\n"],"mappings":";;AAuBA,MAAa,gBAAgB,CAAC,SAAS,MAAM;;AAG7C,MAAa,sBAAsB,CAAC,aAAa,aAAa;AAC9D,MAAa,iCAAiC;CAC5C;CACA;CACA;CACA;CACD;;;;;;AAOD,MAAa,yBAAyB;CACpC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;;;;;;AAOD,MAAa,wBAAwB,CAAC,eAAe,eAAe;;AAGpE,MAAa,iBAAiB;CAC5B,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACJ;;;;AAKD,MAAa,yBAAyB,IAAI,IAAI;CAC5C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAIA;CACA;CACA,GAAG;CACJ,CAAC;;;;;;AAOF,MAAa,qBAAqB,IAAI,IAAI;CACxC;CACA;CACA;CACA;CACA;CACD,CAAC;;;;;;;AAQF,MAAa,6BAAqD;CAChE,eAAe;CACf,aAAa;CACb,iBAAiB;CAClB;;;;;;;;;;;;;;;;;;;;AAqBD,MAAM,yBAAyB;CAC7B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;;;;;;AAOD,MAAa,0BAA0B;CAGrC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;;;;AAKD,MAAa,uBAAuB,IAAI,IAAI,CAC1C,GAAG,wBACH,GAAG,wBACJ,CAAC;;;;AAKF,MAAa,iBAAiB,IAAI,IAAI;CAAC;CAAK;CAAK;CAAM;CAAM;CAAM;CAAM;CAAK,CAAC;;;;;;;AAQ/E,MAAa,6BAA6B,IAAI,IAAI;CAChD;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;;;;AAKF,MAAa,YAAY,IAAI,IAAI;CAC/B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;;;;;;;;;;;;;AAcF,MAAa,0BAA0B,IAAI,IAAI;CAC7C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAEA;CACA;CACA;CACA;CACA;CACA;CACA;CAaA,GAAG;CACH,GAAG;CACH,GAAG;CACJ,CAAC;;;;AAKF,MAAa,wBAAqD;CAChE,QAAQ,IAAI,IAAI;EAAC;EAAO;EAAS;EAAU;EAAO,CAAC;CACnD,QAAQ,IAAI,IAAI;EACd;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC;CACF,SAAS,IAAI,IAAI;EAAC;EAAO;EAAS;EAAU;EAAO,CAAC;CACpD,QAAQ,IAAI,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xE,eAAe;EAAE,UAAU;EAAc,MAAM;EAAyB;CACzE;;;;;;;;;;;;AAaD,MAAa,mBAGT,EACF,MAAM;CACJ,WAAW;EAAC;EAAY;EAAc;EAAY;CAClD,MAAM;CACP,EACF;;;;AAKD,MAAa,8BAAsD;CACjE,iBAAiB;CACjB,oBAAoB;CACpB,iBAAiB;CACjB,oBAAoB;CACpB,cAAc;CACd,iBAAiB;CACjB,aAAa;CACb,gBAAgB;CAChB,aAAa;CACb,gBAAgB;CAChB,aAAa;CACb,gBAAgB;CAChB,WAAW;CACX,cAAc;CACd,cAAc;CACd,iBAAiB;CACjB,cAAc;CACd,iBAAiB;CACjB,eAAe;CACf,kBAAkB;CAClB,UAAU;CACV,aAAa;CACb,YAAY;CACZ,eAAe;CACf,eAAe;CACf,kBAAkB;CACnB;;;;;AAMD,MAAa,mBAAmB,IAAI,IAAI;CACtC;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;;;;AAKF,MAAa,yBAAyB,CAAC,iBAAiB,uBAAuB;;;;AAK/E,MAAa,0BAA0B,IAAI,IAAI;CAC7C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;;;;;;;;AASF,MAAa,uBAAuB,IAAI,IAAI;CAE1C;CACA;CACA;CACA;CACA;CAEA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAEA;CACA;CAEA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAEA;CACA;CACA;CACA;CACA;CAEA;CACA;CACA;CACA;CACA;CACA;CACA;CAEA;CACA;CACA;CAEA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAEA;CACA;CACA;CACA;CAEA;CACA;CACA;CACA;CACA;CAEA;CACA;CACA;CACA;CACA;CACA;CAEA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;;;;;;;;;;;AAYF,MAAa,wBAAwB,IAAI,IAAI;CAC3C;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;;;;;;AAOF,MAAa,mBAAmB,IAAI,IAAY;CAC9C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;;;;;;;;AASF,MAAa,gBAAgB,IAAI,IAAY;CAC3C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;;;;;AAMF,MAAa,2BAA2B,IAAI,IAAY;CAEtD;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAEA;CACA;CAEA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CACA;CACA;CACA;CAEA;CACA;CAEA;CAEA;CACA;CACA;CAEA;CACA;CACA;CACA;CACD,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BF,MAAa,+DAA+C,IAAI,IAAY,EAAE,CAAC;;;;;;;;;;;AAY/E,MAAa,2CAA2C,IAAI,IAAI;CAC9D;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC"}
1
+ {"version":3,"file":"constants.js","names":[],"sources":["../src/constants.ts"],"sourcesContent":["// ---------------------------------------------------------------------------\n// Enhanced logical style families, mirroring `@tenphi/tasty`'s `logical-list.ts`.\n//\n// Tasty v3.8 gave each logical axis/category pair its own handler, named\n// `<axis><Category>` — `blockPadding`, `inlineBorder` — which emits native\n// logical CSS (`padding-block`, `border-inline`) rather than converting the\n// value to a physical edge. The browser resolves `start`/`end` from the\n// element's `writingMode` and `direction`.\n//\n// The native CSS spellings (`paddingBlock`, `insetInlineStart`, …) stay valid\n// keys, but they are now *ordinary* CSS properties: tasty stopped reading\n// `paddingBlock`/`paddingInline`/`insetBlock`/`insetInline` in its physical\n// handlers, so they no longer get category defaults or directional behaviour.\n// That is why they are absent from `KNOWN_TASTY_PROPERTIES` (they are still\n// recognised, via `KNOWN_CSS_PROPERTIES`) and why `SHORTHAND_MAPPING` points\n// them at the enhanced style instead.\n//\n// The groups are split by *vocabulary*, not for tidiness: each one is spread\n// into a different set below, and the splits are what keep `true` off the size\n// constraints and the single-value rule off the borders.\n// ---------------------------------------------------------------------------\n\n/** Logical edge modifiers, the `start`/`end` counterpart of {@link BOX_SIDES}. */\nexport const LOGICAL_EDGES = ['start', 'end'] as const;\n\n/** Enhanced logical sizes. `min`/`max` variants are read by the same handler. */\nexport const LOGICAL_SIZE_STYLES = ['blockSize', 'inlineSize'] as const;\nexport const LOGICAL_SIZE_CONSTRAINT_STYLES = [\n 'minBlockSize',\n 'maxBlockSize',\n 'minInlineSize',\n 'maxInlineSize',\n] as const;\n\n/**\n * Enhanced logical spacing and inset axes — the categories that take a value\n * per logical edge, so they share the `start`/`end` modifier vocabulary and the\n * one-value-per-directional-group rule.\n */\nexport const LOGICAL_SPACING_STYLES = [\n 'blockPadding',\n 'inlinePadding',\n 'blockMargin',\n 'inlineMargin',\n 'blockInset',\n 'inlineInset',\n 'blockScrollMargin',\n 'inlineScrollMargin',\n 'blockScrollPadding',\n 'inlineScrollPadding',\n] as const;\n\n/**\n * Enhanced logical borders. Kept apart from {@link LOGICAL_SPACING_STYLES}\n * because a border group legitimately carries width + style + colour, exactly\n * as physical `border` does, so it is not subject to the single-value rule.\n */\nexport const LOGICAL_BORDER_STYLES = ['blockBorder', 'inlineBorder'] as const;\n\n/** Every enhanced logical style, in the order tasty's own lists declare them. */\nexport const LOGICAL_STYLES = [\n ...LOGICAL_SIZE_STYLES,\n ...LOGICAL_SIZE_CONSTRAINT_STYLES,\n ...LOGICAL_SPACING_STYLES,\n ...LOGICAL_BORDER_STYLES,\n] as const;\n\n/** Tasty's `POSITION_STYLES`: style props that place an element. */\nexport const POSITION_STYLES = [\n 'gridArea',\n 'order',\n 'gridColumn',\n 'gridRow',\n 'placeSelf',\n 'alignSelf',\n 'justifySelf',\n 'zIndex',\n 'margin',\n 'blockMargin',\n 'inlineMargin',\n 'inset',\n 'blockInset',\n 'inlineInset',\n 'position',\n 'scrollMargin',\n 'blockScrollMargin',\n 'inlineScrollMargin',\n 'scrollPadding',\n 'blockScrollPadding',\n 'inlineScrollPadding',\n] as const;\n\n/** Tasty's `DIMENSION_STYLES`: style props that size an element. */\nexport const DIMENSION_STYLES = [\n 'width',\n 'height',\n ...LOGICAL_SIZE_STYLES,\n 'flexBasis',\n 'flexGrow',\n 'flexShrink',\n 'flex',\n] as const;\n\n/**\n * Built-in tasty style properties that are always valid as style keys.\n */\nexport const KNOWN_TASTY_PROPERTIES = new Set([\n 'display',\n 'font',\n 'preset',\n 'hide',\n 'whiteSpace',\n 'opacity',\n 'transition',\n 'gridArea',\n 'order',\n 'gridColumn',\n 'gridRow',\n 'placeSelf',\n 'alignSelf',\n 'justifySelf',\n 'zIndex',\n 'margin',\n 'inset',\n 'position',\n 'padding',\n 'overflow',\n 'scrollbar',\n 'textAlign',\n 'border',\n 'radius',\n 'shadow',\n 'outline',\n 'color',\n 'fill',\n 'fade',\n 'image',\n 'textTransform',\n 'fontWeight',\n 'fontStyle',\n 'width',\n 'height',\n 'flexBasis',\n 'flexGrow',\n 'flexShrink',\n 'flex',\n 'flow',\n 'place',\n 'placeItems',\n 'placeContent',\n 'alignItems',\n 'alignContent',\n 'justifyItems',\n 'justifyContent',\n 'align',\n 'justify',\n 'gap',\n 'columnGap',\n 'rowGap',\n 'gridColumns',\n 'gridRows',\n 'gridTemplate',\n 'gridAreas',\n 'recipe',\n 'textOverflow',\n 'textDecoration',\n 'animation',\n 'cursor',\n 'pointerEvents',\n 'userSelect',\n 'transform',\n 'transformOrigin',\n 'filter',\n 'backdropFilter',\n 'mixBlendMode',\n 'objectFit',\n 'objectPosition',\n 'resize',\n 'appearance',\n 'listStyle',\n 'listStyleType',\n 'content',\n 'boxSizing',\n 'verticalAlign',\n 'wordBreak',\n 'overflowWrap',\n 'hyphens',\n 'tabSize',\n 'direction',\n 'unicodeBidi',\n 'writingMode',\n 'lineClamp',\n 'aspectRatio',\n 'contain',\n 'container',\n 'containerType',\n 'containerName',\n 'interpolateSize',\n 'willChange',\n 'isolation',\n 'touchAction',\n 'scrollBehavior',\n 'scrollSnapType',\n 'scrollSnapAlign',\n 'caretColor',\n 'accentColor',\n 'colorScheme',\n // Physical scroll shorthands: tasty v3.8 gave `scrollPadding` its own\n // directional handler alongside the `scrollMargin` one, so both take the\n // padding vocabulary (modifiers, `true`, one value per directional group).\n 'scrollMargin',\n 'scrollPadding',\n ...LOGICAL_STYLES,\n]);\n\n/**\n * Special top-level keys that are valid but not regular style properties.\n *\n * These match the real CSS at-rule names Tasty emits, so they are kebab-case.\n */\nexport const SPECIAL_STYLE_KEYS = new Set([\n '@keyframes',\n '@property',\n '@font-face',\n '@counter-style',\n '@function',\n]);\n\n/**\n * At-rule style keys renamed in Tasty v3, mapped old spelling -> new.\n *\n * The v2 spellings were camelCase; v3 uses the CSS at-rule names Tasty already\n * emitted. Reported (and auto-fixed) so upgrading is mechanical.\n */\nexport const RENAMED_SPECIAL_STYLE_KEYS: Record<string, string> = {\n '@properties': '@property',\n '@fontFace': '@font-face',\n '@counterStyle': '@counter-style',\n};\n\n/**\n * CSS property names, camelCase, derived from `known-css-properties` — the\n * MDN/W3C-sourced dataset stylelint uses for `property-no-unknown`.\n *\n * Generated. Run `pnpm generate:css-properties` after bumping the dataset rather\n * than editing this list; `constants.css-properties.test.ts` fails on drift.\n *\n * Tasty renders any camelCase style key straight through to its kebab-case CSS\n * declaration (`maskSize` -> `mask-size`), so anything absent here is a false\n * positive from `known-property` on valid CSS — which is why the list is derived\n * from data instead of maintained by hand.\n *\n * The dataset also carries at-rule descriptors (`src`, `syntax`, `symbols`, `size`),\n * which are kept, as stylelint keeps them. They are only reachable as top-level\n * style keys, where the cost is a declaration browsers drop rather than a report —\n * and separating them would mean hand-maintaining the exclusion list this change\n * exists to delete. Inside an at-rule block nothing validates them: `known-property`\n * exempts every `@`-prefixed key and does not descend.\n */\nconst DATASET_CSS_PROPERTIES = [\n 'accelerator',\n 'accentColor',\n 'additiveSymbols',\n 'alignContent',\n 'alignItems',\n 'alignSelf',\n 'alignmentBaseline',\n 'all',\n 'alt',\n 'anchorName',\n 'anchorScope',\n 'animation',\n 'animationComposition',\n 'animationDelay',\n 'animationDirection',\n 'animationDuration',\n 'animationFillMode',\n 'animationIterationCount',\n 'animationName',\n 'animationPlayState',\n 'animationRange',\n 'animationRangeEnd',\n 'animationRangeStart',\n 'animationTimeline',\n 'animationTimingFunction',\n 'animationTrigger',\n 'animationTriggerBehavior',\n 'animationTriggerExitRange',\n 'animationTriggerExitRangeEnd',\n 'animationTriggerExitRangeStart',\n 'animationTriggerRange',\n 'animationTriggerRangeEnd',\n 'animationTriggerRangeStart',\n 'animationTriggerTimeline',\n 'appRegion',\n 'appearance',\n 'ascentOverride',\n 'aspectRatio',\n 'audioLevel',\n 'azimuth',\n 'backdropFilter',\n 'backfaceVisibility',\n 'background',\n 'backgroundAttachment',\n 'backgroundBlendMode',\n 'backgroundClip',\n 'backgroundColor',\n 'backgroundImage',\n 'backgroundOrigin',\n 'backgroundPosition',\n 'backgroundPositionX',\n 'backgroundPositionY',\n 'backgroundRepeat',\n 'backgroundRepeatX',\n 'backgroundRepeatY',\n 'backgroundSize',\n 'basePalette',\n 'baselineShift',\n 'baselineSource',\n 'behavior',\n 'blockEllipsis',\n 'blockSize',\n 'blockStep',\n 'blockStepAlign',\n 'blockStepInsert',\n 'blockStepRound',\n 'blockStepSize',\n 'bookmarkLabel',\n 'bookmarkLevel',\n 'bookmarkState',\n 'border',\n 'borderBlock',\n 'borderBlockColor',\n 'borderBlockEnd',\n 'borderBlockEndColor',\n 'borderBlockEndStyle',\n 'borderBlockEndWidth',\n 'borderBlockStart',\n 'borderBlockStartColor',\n 'borderBlockStartStyle',\n 'borderBlockStartWidth',\n 'borderBlockStyle',\n 'borderBlockWidth',\n 'borderBottom',\n 'borderBottomColor',\n 'borderBottomLeftRadius',\n 'borderBottomRightRadius',\n 'borderBottomStyle',\n 'borderBottomWidth',\n 'borderBoundary',\n 'borderCollapse',\n 'borderColor',\n 'borderEndEndRadius',\n 'borderEndStartRadius',\n 'borderImage',\n 'borderImageOutset',\n 'borderImageRepeat',\n 'borderImageSlice',\n 'borderImageSource',\n 'borderImageWidth',\n 'borderInline',\n 'borderInlineColor',\n 'borderInlineEnd',\n 'borderInlineEndColor',\n 'borderInlineEndStyle',\n 'borderInlineEndWidth',\n 'borderInlineStart',\n 'borderInlineStartColor',\n 'borderInlineStartStyle',\n 'borderInlineStartWidth',\n 'borderInlineStyle',\n 'borderInlineWidth',\n 'borderLeft',\n 'borderLeftColor',\n 'borderLeftStyle',\n 'borderLeftWidth',\n 'borderRadius',\n 'borderRight',\n 'borderRightColor',\n 'borderRightStyle',\n 'borderRightWidth',\n 'borderSpacing',\n 'borderStartEndRadius',\n 'borderStartStartRadius',\n 'borderStyle',\n 'borderTop',\n 'borderTopColor',\n 'borderTopLeftRadius',\n 'borderTopRightRadius',\n 'borderTopStyle',\n 'borderTopWidth',\n 'borderWidth',\n 'bottom',\n 'boxDecorationBreak',\n 'boxShadow',\n 'boxSizing',\n 'boxSnap',\n 'breakAfter',\n 'breakBefore',\n 'breakInside',\n 'bufferedRendering',\n 'captionSide',\n 'caret',\n 'caretAnimation',\n 'caretColor',\n 'caretShape',\n 'chains',\n 'clear',\n 'clip',\n 'clipPath',\n 'clipRule',\n 'color',\n 'colorAdjust',\n 'colorInterpolation',\n 'colorInterpolationFilters',\n 'colorProfile',\n 'colorRendering',\n 'colorScheme',\n 'columnCount',\n 'columnFill',\n 'columnGap',\n 'columnHeight',\n 'columnProgression',\n 'columnRule',\n 'columnRuleBreak',\n 'columnRuleColor',\n 'columnRuleOutset',\n 'columnRuleStyle',\n 'columnRuleWidth',\n 'columnSpan',\n 'columnWidth',\n 'columnWrap',\n 'columns',\n 'contain',\n 'containIntrinsicBlockSize',\n 'containIntrinsicHeight',\n 'containIntrinsicInlineSize',\n 'containIntrinsicSize',\n 'containIntrinsicWidth',\n 'container',\n 'containerName',\n 'containerType',\n 'content',\n 'contentVisibility',\n 'continue',\n 'counterIncrement',\n 'counterReset',\n 'counterSet',\n 'cue',\n 'cueAfter',\n 'cueBefore',\n 'cursor',\n 'cx',\n 'cy',\n 'd',\n 'descentOverride',\n 'direction',\n 'display',\n 'displayAlign',\n 'dominantBaseline',\n 'dynamicRangeLimit',\n 'elevation',\n 'emptyCells',\n 'enableBackground',\n 'epubCaptionSide',\n 'epubHyphens',\n 'epubTextCombine',\n 'epubTextEmphasis',\n 'epubTextEmphasisColor',\n 'epubTextEmphasisStyle',\n 'epubTextOrientation',\n 'epubTextTransform',\n 'epubWordBreak',\n 'epubWritingMode',\n 'fallback',\n 'fieldSizing',\n 'fill',\n 'fillBreak',\n 'fillColor',\n 'fillImage',\n 'fillOpacity',\n 'fillOrigin',\n 'fillPosition',\n 'fillRepeat',\n 'fillRule',\n 'fillSize',\n 'filter',\n 'flex',\n 'flexBasis',\n 'flexDirection',\n 'flexFlow',\n 'flexGrow',\n 'flexShrink',\n 'flexWrap',\n 'float',\n 'floatDefer',\n 'floatOffset',\n 'floatReference',\n 'floodColor',\n 'floodOpacity',\n 'flow',\n 'flowFrom',\n 'flowInto',\n 'font',\n 'fontDisplay',\n 'fontFamily',\n 'fontFeatureSettings',\n 'fontKerning',\n 'fontLanguageOverride',\n 'fontOpticalSizing',\n 'fontPalette',\n 'fontSize',\n 'fontSizeAdjust',\n 'fontStretch',\n 'fontStyle',\n 'fontSynthesis',\n 'fontSynthesisPosition',\n 'fontSynthesisSmallCaps',\n 'fontSynthesisStyle',\n 'fontSynthesisWeight',\n 'fontVariant',\n 'fontVariantAlternates',\n 'fontVariantCaps',\n 'fontVariantEastAsian',\n 'fontVariantEmoji',\n 'fontVariantLigatures',\n 'fontVariantNumeric',\n 'fontVariantPosition',\n 'fontVariationSettings',\n 'fontWeight',\n 'fontWidth',\n 'footnoteDisplay',\n 'footnotePolicy',\n 'forcedColorAdjust',\n 'gap',\n 'glyphOrientationHorizontal',\n 'glyphOrientationVertical',\n 'grid',\n 'gridArea',\n 'gridAutoColumns',\n 'gridAutoFlow',\n 'gridAutoRows',\n 'gridColumn',\n 'gridColumnEnd',\n 'gridColumnGap',\n 'gridColumnStart',\n 'gridGap',\n 'gridRow',\n 'gridRowEnd',\n 'gridRowGap',\n 'gridRowStart',\n 'gridTemplate',\n 'gridTemplateAreas',\n 'gridTemplateColumns',\n 'gridTemplateRows',\n 'hangingPunctuation',\n 'height',\n 'hyphenateCharacter',\n 'hyphenateLimitChars',\n 'hyphenateLimitLast',\n 'hyphenateLimitLines',\n 'hyphenateLimitZone',\n 'hyphens',\n 'imageOrientation',\n 'imageRendering',\n 'imageResolution',\n 'imeMode',\n 'inherits',\n 'initialLetter',\n 'initialLetterAlign',\n 'initialLetterWrap',\n 'initialValue',\n 'inlineSize',\n 'inlineSizing',\n 'inputFormat',\n 'inputSecurity',\n 'inset',\n 'insetArea',\n 'insetBlock',\n 'insetBlockEnd',\n 'insetBlockStart',\n 'insetInline',\n 'insetInlineEnd',\n 'insetInlineStart',\n 'interactivity',\n 'interpolateSize',\n 'isolation',\n 'itemCross',\n 'itemDirection',\n 'itemFlow',\n 'itemPack',\n 'itemSlack',\n 'itemTrack',\n 'itemWrap',\n 'justifyContent',\n 'justifyItems',\n 'justifySelf',\n 'kerning',\n 'layoutFlow',\n 'layoutGrid',\n 'layoutGridChar',\n 'layoutGridLine',\n 'layoutGridMode',\n 'layoutGridType',\n 'left',\n 'letterSpacing',\n 'lightingColor',\n 'lineBreak',\n 'lineClamp',\n 'lineFitEdge',\n 'lineGapOverride',\n 'lineGrid',\n 'lineHeight',\n 'lineHeightStep',\n 'lineIncrement',\n 'linePadding',\n 'lineSnap',\n 'listStyle',\n 'listStyleImage',\n 'listStylePosition',\n 'listStyleType',\n 'margin',\n 'marginBlock',\n 'marginBlockEnd',\n 'marginBlockStart',\n 'marginBottom',\n 'marginBreak',\n 'marginInline',\n 'marginInlineEnd',\n 'marginInlineStart',\n 'marginLeft',\n 'marginRight',\n 'marginTop',\n 'marginTrim',\n 'marker',\n 'markerEnd',\n 'markerKnockoutLeft',\n 'markerKnockoutRight',\n 'markerMid',\n 'markerOffset',\n 'markerPattern',\n 'markerSegment',\n 'markerSide',\n 'markerStart',\n 'marks',\n 'mask',\n 'maskBorder',\n 'maskBorderMode',\n 'maskBorderOutset',\n 'maskBorderRepeat',\n 'maskBorderSlice',\n 'maskBorderSource',\n 'maskBorderWidth',\n 'maskClip',\n 'maskComposite',\n 'maskImage',\n 'maskMode',\n 'maskOrigin',\n 'maskPosition',\n 'maskPositionX',\n 'maskPositionY',\n 'maskRepeat',\n 'maskSize',\n 'maskSourceType',\n 'maskType',\n 'mathDepth',\n 'mathShift',\n 'mathStyle',\n 'maxBlockSize',\n 'maxHeight',\n 'maxInlineSize',\n 'maxLines',\n 'maxWidth',\n 'maxZoom',\n 'minBlockSize',\n 'minHeight',\n 'minInlineSize',\n 'minIntrinsicSizing',\n 'minWidth',\n 'minZoom',\n 'mixBlendMode',\n 'motion',\n 'motionOffset',\n 'motionPath',\n 'motionRotation',\n 'navDown',\n 'navIndex',\n 'navLeft',\n 'navRight',\n 'navUp',\n 'navigation',\n 'negative',\n 'objectFit',\n 'objectPosition',\n 'objectViewBox',\n 'offset',\n 'offsetAnchor',\n 'offsetBlockEnd',\n 'offsetBlockStart',\n 'offsetDistance',\n 'offsetInlineEnd',\n 'offsetInlineStart',\n 'offsetPath',\n 'offsetPosition',\n 'offsetRotate',\n 'offsetRotation',\n 'opacity',\n 'order',\n 'orientation',\n 'orphans',\n 'outline',\n 'outlineColor',\n 'outlineOffset',\n 'outlineStyle',\n 'outlineWidth',\n 'overflow',\n 'overflowAnchor',\n 'overflowBlock',\n 'overflowClipMargin',\n 'overflowClipMarginBlock',\n 'overflowClipMarginBlockEnd',\n 'overflowClipMarginBlockStart',\n 'overflowClipMarginBottom',\n 'overflowClipMarginInline',\n 'overflowClipMarginInlineEnd',\n 'overflowClipMarginInlineStart',\n 'overflowClipMarginLeft',\n 'overflowClipMarginRight',\n 'overflowClipMarginTop',\n 'overflowInline',\n 'overflowWrap',\n 'overflowX',\n 'overflowY',\n 'overlay',\n 'overrideColors',\n 'overscrollBehavior',\n 'overscrollBehaviorBlock',\n 'overscrollBehaviorInline',\n 'overscrollBehaviorX',\n 'overscrollBehaviorY',\n 'pad',\n 'padding',\n 'paddingBlock',\n 'paddingBlockEnd',\n 'paddingBlockStart',\n 'paddingBottom',\n 'paddingInline',\n 'paddingInlineEnd',\n 'paddingInlineStart',\n 'paddingLeft',\n 'paddingRight',\n 'paddingTop',\n 'page',\n 'pageBreakAfter',\n 'pageBreakBefore',\n 'pageBreakInside',\n 'pageOrientation',\n 'paintOrder',\n 'pause',\n 'pauseAfter',\n 'pauseBefore',\n 'penAction',\n 'perspective',\n 'perspectiveOrigin',\n 'perspectiveOriginX',\n 'perspectiveOriginY',\n 'pitch',\n 'pitchRange',\n 'placeContent',\n 'placeItems',\n 'placeSelf',\n 'playDuring',\n 'pointerEvents',\n 'position',\n 'positionAnchor',\n 'positionArea',\n 'positionTry',\n 'positionTryFallbacks',\n 'positionTryOptions',\n 'positionTryOrder',\n 'positionVisibility',\n 'prefix',\n 'printColorAdjust',\n 'propertyName',\n 'quotes',\n 'r',\n 'range',\n 'readingFlow',\n 'readingOrder',\n 'regionFragment',\n 'resize',\n 'rest',\n 'restAfter',\n 'restBefore',\n 'richness',\n 'right',\n 'rotate',\n 'rowGap',\n 'rowRule',\n 'rowRuleBreak',\n 'rowRuleColor',\n 'rowRuleOutset',\n 'rowRuleStyle',\n 'rowRuleWidth',\n 'rubyAlign',\n 'rubyMerge',\n 'rubyOverhang',\n 'rubyPosition',\n 'rule',\n 'ruleBreak',\n 'ruleColor',\n 'ruleOutset',\n 'rulePaintOrder',\n 'ruleStyle',\n 'ruleWidth',\n 'running',\n 'rx',\n 'ry',\n 'scale',\n 'scrollBehavior',\n 'scrollInitialTarget',\n 'scrollMargin',\n 'scrollMarginBlock',\n 'scrollMarginBlockEnd',\n 'scrollMarginBlockStart',\n 'scrollMarginBottom',\n 'scrollMarginInline',\n 'scrollMarginInlineEnd',\n 'scrollMarginInlineStart',\n 'scrollMarginLeft',\n 'scrollMarginRight',\n 'scrollMarginTop',\n 'scrollMarkerGroup',\n 'scrollPadding',\n 'scrollPaddingBlock',\n 'scrollPaddingBlockEnd',\n 'scrollPaddingBlockStart',\n 'scrollPaddingBottom',\n 'scrollPaddingInline',\n 'scrollPaddingInlineEnd',\n 'scrollPaddingInlineStart',\n 'scrollPaddingLeft',\n 'scrollPaddingRight',\n 'scrollPaddingTop',\n 'scrollSnapAlign',\n 'scrollSnapCoordinate',\n 'scrollSnapDestination',\n 'scrollSnapMargin',\n 'scrollSnapMarginBottom',\n 'scrollSnapMarginLeft',\n 'scrollSnapMarginRight',\n 'scrollSnapMarginTop',\n 'scrollSnapPointsX',\n 'scrollSnapPointsY',\n 'scrollSnapStop',\n 'scrollSnapType',\n 'scrollSnapTypeX',\n 'scrollSnapTypeY',\n 'scrollStartTarget',\n 'scrollTargetGroup',\n 'scrollTimeline',\n 'scrollTimelineAxis',\n 'scrollTimelineName',\n 'scrollbar3dLightColor',\n 'scrollbar3dlightColor',\n 'scrollbarArrowColor',\n 'scrollbarBaseColor',\n 'scrollbarColor',\n 'scrollbarDarkShadowColor',\n 'scrollbarDarkshadowColor',\n 'scrollbarFaceColor',\n 'scrollbarGutter',\n 'scrollbarHighlightColor',\n 'scrollbarShadowColor',\n 'scrollbarTrackColor',\n 'scrollbarWidth',\n 'shapeImageThreshold',\n 'shapeInside',\n 'shapeMargin',\n 'shapeOutside',\n 'shapeRendering',\n 'size',\n 'sizeAdjust',\n 'sliderOrientation',\n 'snapHeight',\n 'solidColor',\n 'solidOpacity',\n 'spatialNavigationAction',\n 'spatialNavigationContain',\n 'spatialNavigationFunction',\n 'speak',\n 'speakAs',\n 'speakHeader',\n 'speakNumeral',\n 'speakPunctuation',\n 'speechRate',\n 'src',\n 'stopColor',\n 'stopOpacity',\n 'stress',\n 'stringSet',\n 'stroke',\n 'strokeAlign',\n 'strokeAlignment',\n 'strokeBreak',\n 'strokeColor',\n 'strokeDashCorner',\n 'strokeDashJustify',\n 'strokeDashadjust',\n 'strokeDasharray',\n 'strokeDashcorner',\n 'strokeDashoffset',\n 'strokeImage',\n 'strokeLinecap',\n 'strokeLinejoin',\n 'strokeMiterlimit',\n 'strokeOpacity',\n 'strokeOrigin',\n 'strokePosition',\n 'strokeRepeat',\n 'strokeSize',\n 'strokeWidth',\n 'suffix',\n 'supportedColorSchemes',\n 'symbols',\n 'syntax',\n 'system',\n 'tabSize',\n 'tableLayout',\n 'textAlign',\n 'textAlignAll',\n 'textAlignLast',\n 'textAnchor',\n 'textAutospace',\n 'textBox',\n 'textBoxEdge',\n 'textBoxTrim',\n 'textCombineUpright',\n 'textDecoration',\n 'textDecorationBlink',\n 'textDecorationColor',\n 'textDecorationLine',\n 'textDecorationLineThrough',\n 'textDecorationNone',\n 'textDecorationOverline',\n 'textDecorationSkip',\n 'textDecorationSkipBox',\n 'textDecorationSkipInk',\n 'textDecorationSkipInset',\n 'textDecorationSkipSelf',\n 'textDecorationSkipSpaces',\n 'textDecorationStyle',\n 'textDecorationThickness',\n 'textDecorationTrim',\n 'textDecorationUnderline',\n 'textEmphasis',\n 'textEmphasisColor',\n 'textEmphasisPosition',\n 'textEmphasisSkip',\n 'textEmphasisStyle',\n 'textGroupAlign',\n 'textIndent',\n 'textJustify',\n 'textJustifyTrim',\n 'textKashida',\n 'textKashidaSpace',\n 'textLineThrough',\n 'textLineThroughColor',\n 'textLineThroughMode',\n 'textLineThroughStyle',\n 'textLineThroughWidth',\n 'textOrientation',\n 'textOverflow',\n 'textOverline',\n 'textOverlineColor',\n 'textOverlineMode',\n 'textOverlineStyle',\n 'textOverlineWidth',\n 'textRendering',\n 'textShadow',\n 'textSizeAdjust',\n 'textSpacing',\n 'textSpacingTrim',\n 'textTransform',\n 'textUnderline',\n 'textUnderlineColor',\n 'textUnderlineMode',\n 'textUnderlineOffset',\n 'textUnderlinePosition',\n 'textUnderlineStyle',\n 'textUnderlineWidth',\n 'textWrap',\n 'textWrapMode',\n 'textWrapStyle',\n 'timelineScope',\n 'top',\n 'touchAction',\n 'touchActionDelay',\n 'transform',\n 'transformBox',\n 'transformOrigin',\n 'transformOriginX',\n 'transformOriginY',\n 'transformOriginZ',\n 'transformStyle',\n 'transition',\n 'transitionBehavior',\n 'transitionDelay',\n 'transitionDuration',\n 'transitionProperty',\n 'transitionTimingFunction',\n 'translate',\n 'types',\n 'ucAltSkin',\n 'ucSkin',\n 'unicodeBidi',\n 'unicodeRange',\n 'userSelect',\n 'userZoom',\n 'vectorEffect',\n 'verticalAlign',\n 'viewTimeline',\n 'viewTimelineAxis',\n 'viewTimelineInset',\n 'viewTimelineName',\n 'viewTransitionClass',\n 'viewTransitionGroup',\n 'viewTransitionName',\n 'viewportFill',\n 'viewportFillOpacity',\n 'viewportFit',\n 'visibility',\n 'voiceBalance',\n 'voiceDuration',\n 'voiceFamily',\n 'voicePitch',\n 'voiceRange',\n 'voiceRate',\n 'voiceStress',\n 'voiceVolume',\n 'volume',\n 'whiteSpace',\n 'whiteSpaceCollapse',\n 'whiteSpaceTrim',\n 'widows',\n 'width',\n 'willChange',\n 'wordBreak',\n 'wordSpaceTransform',\n 'wordSpacing',\n 'wordWrap',\n 'wrapAfter',\n 'wrapBefore',\n 'wrapFlow',\n 'wrapInside',\n 'wrapThrough',\n 'writingMode',\n 'x',\n 'y',\n 'zIndex',\n 'zoom',\n];\n\n/**\n * Properties that ship in browsers or sit in a spec, but have not landed in\n * `known-css-properties` yet. Hand-maintained, and pruned as the dataset catches\n * up — the guard test fails on any entry the dataset already covers.\n */\nexport const EMERGING_CSS_PROPERTIES = [\n // CSS Borders and Box Decorations 4 — squircles and notched corners, shipped in\n // Chromium 139.\n 'cornerShape',\n 'cornerTopShape',\n 'cornerRightShape',\n 'cornerBottomShape',\n 'cornerLeftShape',\n 'cornerBlockStartShape',\n 'cornerBlockEndShape',\n 'cornerInlineStartShape',\n 'cornerInlineEndShape',\n 'cornerTopLeftShape',\n 'cornerTopRightShape',\n 'cornerBottomRightShape',\n 'cornerBottomLeftShape',\n 'cornerStartStartShape',\n 'cornerStartEndShape',\n 'cornerEndStartShape',\n 'cornerEndEndShape',\n];\n\n/**\n * Every CSS property `known-property` accepts as a camelCase style key.\n */\nexport const KNOWN_CSS_PROPERTIES = new Set([\n ...DATASET_CSS_PROPERTIES,\n ...EMERGING_CSS_PROPERTIES,\n]);\n\n/**\n * Built-in custom units recognized by the tasty parser.\n */\nexport const BUILT_IN_UNITS = new Set(['x', 'r', 'cr', 'bw', 'ow', 'lh', 'sf']);\n\n/**\n * Custom properties Tasty registers as default `@property` rules, so they are\n * always defined whatever the config's `tokens` list says. The scale tokens\n * match their built-in units; style handlers read the rest as bare `var()`s\n * (`radius: 'leaf'`, `preset: 'h1 / strong'`, the font fallbacks, timings).\n */\nexport const BUILT_IN_CUSTOM_PROPERTIES = new Set([\n '$gap',\n '$radius',\n '$border-width',\n '$outline-width',\n '$transition',\n '$sharp-radius',\n '$bold-font-weight',\n '$font-sans-fallback',\n '$font-mono-fallback',\n]);\n\n/**\n * Standard CSS units (always valid).\n */\nexport const CSS_UNITS = new Set([\n 'px',\n 'em',\n 'rem',\n '%',\n 'vw',\n 'vh',\n 'vmin',\n 'vmax',\n 'ch',\n 'ex',\n 'cm',\n 'mm',\n 'in',\n 'pt',\n 'pc',\n 'fr',\n 'deg',\n 'rad',\n 'turn',\n 'grad',\n 's',\n 'ms',\n 'dpi',\n 'dpcm',\n 'dppx',\n 'svw',\n 'svh',\n 'lvw',\n 'lvh',\n 'dvw',\n 'dvh',\n 'cqw',\n 'cqh',\n 'cqi',\n 'cqb',\n 'cqmin',\n 'cqmax',\n 'cap',\n 'ic',\n 'rlh',\n 'vi',\n 'vb',\n]);\n\n/**\n * Properties that accept `true` as a value (means \"use default\").\n *\n * `fill` is documented as accepting `true` but is deliberately absent: as of\n * tasty 3.8 the handler passes the boolean straight through, so `fill: true`\n * emits `background-color: true` — a declaration the browser drops, leaving no\n * background at all. Reporting it is the useful answer while that is what runs.\n * `constants.round-trip.test.ts` pins both halves of that: no property in this\n * set may swallow `true`, and `fill` still does — so whichever way tasty\n * resolves it (docs or implementation), a test says so rather than the plugin\n * quietly disagreeing with the runtime.\n */\nexport const BOOLEAN_TRUE_PROPERTIES = new Set([\n 'border',\n 'radius',\n 'padding',\n 'margin',\n 'gap',\n 'color',\n 'shadow',\n 'outline',\n 'inset',\n 'width',\n 'height',\n // `fade: true` falls back to `2x`, which follows `configure({ units })`.\n 'fade',\n 'hide',\n 'preset',\n 'font',\n 'scrollbar',\n 'scrollMargin',\n 'scrollPadding',\n // Every enhanced logical *category* carries the same design-system default as\n // its physical counterpart: `1x` for spacing and scroll edges, `0` for inset,\n // `1bw` for border, a reset for the sizes.\n //\n // The min/max size constraints are deliberately excluded, mirroring the\n // absence of `minWidth`/`maxWidth` here. The runtime does accept `true` on\n // them — they route through the same dimension handler as the axis — but what\n // it does with it is reset the whole axis: `minBlockSize: true` emits\n // `block-size: auto; min-block-size: initial; max-block-size: initial`, not a\n // default for the one constraint named. `blockSize: true` is how you ask for\n // that, so the constraint spellings stay an error, exactly as `minWidth: true`\n // already is.\n ...LOGICAL_SIZE_STYLES,\n ...LOGICAL_SPACING_STYLES,\n ...LOGICAL_BORDER_STYLES,\n]);\n\n/**\n * Directional modifiers and which properties accept them.\n */\nexport const DIRECTIONAL_MODIFIERS: Record<string, Set<string>> = {\n border: new Set(['top', 'right', 'bottom', 'left']),\n radius: new Set([\n 'top',\n 'right',\n 'bottom',\n 'left',\n 'top-left',\n 'top-right',\n 'bottom-left',\n 'bottom-right',\n ]),\n padding: new Set(['top', 'right', 'bottom', 'left']),\n margin: new Set(['top', 'right', 'bottom', 'left']),\n fade: new Set(['top', 'right', 'bottom', 'left']),\n scrollMargin: new Set(['top', 'right', 'bottom', 'left']),\n scrollPadding: new Set(['top', 'right', 'bottom', 'left']),\n inset: new Set(['top', 'right', 'bottom', 'left', 'dock']),\n // Enhanced logical styles take `start`/`end` and nothing else. Listing them\n // here is what makes a physical modifier on a logical axis — `blockPadding:\n // '1x top'`, which the handler silently drops — a report rather than silence.\n ...Object.fromEntries(\n [...LOGICAL_SPACING_STYLES, ...LOGICAL_BORDER_STYLES].map((style) => [\n style,\n new Set<string>(LOGICAL_EDGES),\n ]),\n ),\n};\n\n/**\n * Properties where a group naming directions carries exactly **one** value.\n *\n * Tasty v3 dropped the positional multi-value form for these: values and\n * modifiers are bucketed separately per comma group, so `'2x 4x top right'` and\n * `'2x top 4x right'` were the same input and the pairing depended on modifier\n * order. Per-side values now come from comma groups.\n *\n * Deliberately excludes `border` and `radius`. A `border` group legitimately\n * carries width + style + color, and a `radius` group can carry two values with\n * `leaf`/`backleaf`; neither takes the positional-per-side form, so neither is\n * subject to the rule.\n */\nexport const SINGLE_VALUE_DIRECTIONAL_PROPERTIES = new Set<string>([\n 'padding',\n 'margin',\n 'inset',\n 'scrollMargin',\n 'scrollPadding',\n 'fade',\n // The logical axis handlers bucket values and modifiers the same way, and warn\n // on a second value in a group that names an edge. `blockBorder`/`inlineBorder`\n // are excluded for the same reason `border` is: width + style + colour.\n ...LOGICAL_SPACING_STYLES,\n]);\n\n/**\n * Position names a 4-value box maps onto, in source order.\n */\nexport const BOX_SIDES = ['top', 'right', 'bottom', 'left'] as const;\nexport const BOX_CORNERS = [\n 'top-left',\n 'top-right',\n 'bottom-right',\n 'bottom-left',\n] as const;\n\nexport interface DirectionalBoxConfig {\n /**\n * The token that marks an unset position — dropping it from the shorthand\n * leaves the emitted CSS unchanged. This is the CSS initial value of the\n * longhand, which is not always `0`: `inset` initialises to `auto`, so a `0`\n * there is a real offset the shorthand must not drop.\n */\n identity: string;\n /** Modifier names for each of the four positions, in source order. */\n positions: readonly string[];\n /**\n * Whether `eslint --fix` may apply the rewrite. False when the rewrite is\n * still an improvement but changes what the browser renders, so a human has\n * to opt in.\n */\n fixable: boolean;\n /**\n * Set when the 4-value form is not interpreted per-position at all, so the\n * current output is wrong rather than merely verbose. Surfaced in the report.\n */\n note?: string;\n}\n\n/**\n * Properties whose 4-value box syntax has a directional-shorthand equivalent.\n *\n * `radius` uses corner names rather than sides: a directional modifier\n * addresses the corner *pair* along an edge, so only `top-left` & co. can\n * express a single corner (requires `@tenphi/tasty` >= 2.10).\n */\nexport const DIRECTIONAL_BOX: Record<string, DirectionalBoxConfig> = {\n margin: { identity: '0', positions: BOX_SIDES, fixable: true },\n padding: { identity: '0', positions: BOX_SIDES, fixable: true },\n inset: { identity: 'auto', positions: BOX_SIDES, fixable: true },\n radius: { identity: '0', positions: BOX_CORNERS, fixable: true },\n fade: { identity: '0', positions: BOX_SIDES, fixable: true },\n // Four `border` tokens parse as a single border value (width/style/color),\n // not as a box: `border: '0 0 1bw 0'` emits `border: 0 solid …` — no border\n // on any side. The directional form is what the author meant, but applying\n // it changes rendering, so it stays a manual fix.\n border: {\n identity: '0',\n positions: BOX_SIDES,\n fixable: false,\n note: 'four border tokens parse as one border value, so the current style sets no border at all',\n },\n};\n\n/**\n * Properties that support a `dock` modifier — pin one edge and span its full\n * length. Lets a 4-value box with a single `identity` side collapse, e.g.\n * `inset: 'auto 0 0 0'` -> `inset: '0 bottom dock'`.\n * Requires `@tenphi/tasty` >= 2.10.\n */\nexport const DOCK_PROPERTIES = new Set(['inset']);\n\n/**\n * Valid radius shape keywords.\n */\nexport const RADIUS_SHAPES = new Set(['round', 'ellipse', 'leaf', 'backleaf']);\n\n/**\n * Known semantic transition names — the keys of Tasty's transition map, plus\n * `zIndex`, which Tasty compiles to `z-index`. Any other name is emitted\n * verbatim as a CSS property.\n */\nexport const SEMANTIC_TRANSITIONS = new Set([\n 'fade',\n 'fill',\n 'border',\n 'radius',\n 'shadow',\n 'preset',\n 'gap',\n 'theme',\n 'color',\n 'outline',\n 'inset',\n 'text',\n 'opacity',\n 'translate',\n 'rotate',\n 'scale',\n 'filter',\n 'image',\n 'background',\n 'width',\n 'height',\n 'zIndex',\n]);\n\n/**\n * Mapping of native CSS properties to tasty shorthand alternatives.\n */\nexport const SHORTHAND_MAPPING: Record<\n string,\n { property: string; hint: string; safeFix?: boolean }\n> = {\n backgroundColor: { property: 'fill', hint: \"fill: '...'\", safeFix: true },\n borderColor: { property: 'border', hint: \"border: '...'\" },\n borderWidth: { property: 'border', hint: \"border: '...'\" },\n borderStyle: { property: 'border', hint: \"border: '...'\" },\n borderTop: { property: 'border', hint: \"border: '... top'\" },\n borderRight: { property: 'border', hint: \"border: '... right'\" },\n borderBottom: { property: 'border', hint: \"border: '... bottom'\" },\n borderLeft: { property: 'border', hint: \"border: '... left'\" },\n borderRadius: { property: 'radius', hint: \"radius: '...'\", safeFix: true },\n maxWidth: { property: 'width', hint: \"width: 'max ...'\" },\n minWidth: { property: 'width', hint: \"width: 'min ...'\" },\n maxHeight: { property: 'height', hint: \"height: 'max ...'\" },\n minHeight: { property: 'height', hint: \"height: 'min ...'\" },\n flexDirection: { property: 'flow', hint: \"flow: '...'\" },\n flexWrap: { property: 'flow', hint: \"flow: '...'\" },\n flexFlow: { property: 'flow', hint: \"flow: '...'\" },\n gridAutoFlow: { property: 'flow', hint: \"flow: '...'\" },\n outlineOffset: { property: 'outline', hint: \"outline: '... / offset'\" },\n paddingTop: { property: 'padding', hint: \"padding: '... top'\" },\n paddingRight: { property: 'padding', hint: \"padding: '... right'\" },\n paddingBottom: { property: 'padding', hint: \"padding: '... bottom'\" },\n paddingLeft: { property: 'padding', hint: \"padding: '... left'\" },\n marginTop: { property: 'margin', hint: \"margin: '... top'\" },\n marginRight: { property: 'margin', hint: \"margin: '... right'\" },\n marginBottom: { property: 'margin', hint: \"margin: '... bottom'\" },\n marginLeft: { property: 'margin', hint: \"margin: '... left'\" },\n fontSize: { property: 'preset', hint: \"preset: '...'\" },\n fontWeight: {\n property: 'preset',\n hint: \"preset: 'name / strong' (with strong modifier)\",\n },\n lineHeight: {\n property: 'preset',\n hint: \"preset: 'name / tight' (with tight modifier)\",\n },\n boxShadow: { property: 'shadow', hint: \"shadow: '...'\" },\n backgroundImage: { property: 'image', hint: \"image: '...'\" },\n fontFamily: { property: 'font', hint: \"font: '...'\" },\n fontStyle: {\n property: 'preset',\n hint: \"preset: 'name / italic' (with italic modifier)\",\n },\n letterSpacing: { property: 'preset', hint: \"preset: '...'\" },\n textTransform: { property: 'preset', hint: \"preset: '...'\" },\n flexGap: { property: 'gap', hint: \"gap: '...'\" },\n scrollbarWidth: { property: 'scrollbar', hint: \"scrollbar: '...'\" },\n scrollbarColor: { property: 'scrollbar', hint: \"scrollbar: '...'\" },\n scrollbarGutter: { property: 'scrollbar', hint: \"scrollbar: '...'\" },\n gridTemplateColumns: {\n property: 'gridColumns',\n hint: \"gridColumns: '...'\",\n },\n gridTemplateRows: { property: 'gridRows', hint: \"gridRows: '...'\" },\n gridTemplateAreas: { property: 'gridAreas', hint: \"gridAreas: '...'\" },\n top: { property: 'inset', hint: \"inset: '... top'\" },\n right: { property: 'inset', hint: \"inset: '... right'\" },\n bottom: { property: 'inset', hint: \"inset: '... bottom'\" },\n left: { property: 'inset', hint: \"inset: '... left'\" },\n outlineColor: { property: 'outline', hint: \"outline: '...'\" },\n outlineWidth: { property: 'outline', hint: \"outline: '...'\" },\n outlineStyle: { property: 'outline', hint: \"outline: '...'\" },\n lineClamp: {\n property: 'textOverflow',\n hint: \"textOverflow: 'ellipsis / {lines}'\",\n },\n\n // --- Native logical CSS -> the enhanced Tasty logical style. ---\n //\n // These mirror the physical rows above one for one. Tasty v3.8 moved the\n // enhanced behaviour onto `<axis><Category>` names and stopped reading the\n // native spellings in its handlers, so `paddingBlock` is now a plain CSS\n // declaration with no category default: the rename is the same advice as\n // `paddingTop` -> `padding: '... top'`, not a new opinion.\n //\n // Only the axis shorthands carry `safeFix`. `paddingBlock: '1x 2x'` and\n // `blockPadding: '1x 2x'` both emit `padding-block: 1x 2x`, so the key rename\n // is the whole edit — `constants.round-trip.test.ts` asserts that against the\n // installed runtime rather than trusting this comment. An edge longhand needs\n // a `start`/`end` modifier added to the value, and a `border-*` rename also\n // gains the style/colour defaults `border-block` never had (`border-block:\n // 1bw` renders nothing at all), so those stay report-only.\n //\n // These renames are why the `@tenphi/tasty` peer floor is 3.8.0. The plugin\n // never imports tasty, so its constants are fixed at publish time and cannot\n // adapt to the consumer's version: on 3.7 and below `blockPadding` is not a\n // style tasty knows, and an unhandled camelCase key renders straight through\n // to `block-padding`, which the browser drops. The fix would silently delete\n // the padding, so the floor is the only thing standing between that and a\n // consumer — recognising the logical names is harmless on an older tasty\n // (a missed warning), but rewriting *to* them is not.\n paddingBlock: {\n property: 'blockPadding',\n hint: \"blockPadding: '...'\",\n safeFix: true,\n },\n paddingBlockStart: {\n property: 'blockPadding',\n hint: \"blockPadding: '... start'\",\n },\n paddingBlockEnd: {\n property: 'blockPadding',\n hint: \"blockPadding: '... end'\",\n },\n paddingInline: {\n property: 'inlinePadding',\n hint: \"inlinePadding: '...'\",\n safeFix: true,\n },\n paddingInlineStart: {\n property: 'inlinePadding',\n hint: \"inlinePadding: '... start'\",\n },\n paddingInlineEnd: {\n property: 'inlinePadding',\n hint: \"inlinePadding: '... end'\",\n },\n marginBlock: {\n property: 'blockMargin',\n hint: \"blockMargin: '...'\",\n safeFix: true,\n },\n marginBlockStart: {\n property: 'blockMargin',\n hint: \"blockMargin: '... start'\",\n },\n marginBlockEnd: { property: 'blockMargin', hint: \"blockMargin: '... end'\" },\n marginInline: {\n property: 'inlineMargin',\n hint: \"inlineMargin: '...'\",\n safeFix: true,\n },\n marginInlineStart: {\n property: 'inlineMargin',\n hint: \"inlineMargin: '... start'\",\n },\n marginInlineEnd: {\n property: 'inlineMargin',\n hint: \"inlineMargin: '... end'\",\n },\n insetBlock: {\n property: 'blockInset',\n hint: \"blockInset: '...'\",\n safeFix: true,\n },\n insetBlockStart: { property: 'blockInset', hint: \"blockInset: '... start'\" },\n insetBlockEnd: { property: 'blockInset', hint: \"blockInset: '... end'\" },\n insetInline: {\n property: 'inlineInset',\n hint: \"inlineInset: '...'\",\n safeFix: true,\n },\n insetInlineStart: {\n property: 'inlineInset',\n hint: \"inlineInset: '... start'\",\n },\n insetInlineEnd: { property: 'inlineInset', hint: \"inlineInset: '... end'\" },\n scrollMarginBlock: {\n property: 'blockScrollMargin',\n hint: \"blockScrollMargin: '...'\",\n safeFix: true,\n },\n scrollMarginBlockStart: {\n property: 'blockScrollMargin',\n hint: \"blockScrollMargin: '... start'\",\n },\n scrollMarginBlockEnd: {\n property: 'blockScrollMargin',\n hint: \"blockScrollMargin: '... end'\",\n },\n scrollMarginInline: {\n property: 'inlineScrollMargin',\n hint: \"inlineScrollMargin: '...'\",\n safeFix: true,\n },\n scrollMarginInlineStart: {\n property: 'inlineScrollMargin',\n hint: \"inlineScrollMargin: '... start'\",\n },\n scrollMarginInlineEnd: {\n property: 'inlineScrollMargin',\n hint: \"inlineScrollMargin: '... end'\",\n },\n scrollPaddingBlock: {\n property: 'blockScrollPadding',\n hint: \"blockScrollPadding: '...'\",\n safeFix: true,\n },\n scrollPaddingBlockStart: {\n property: 'blockScrollPadding',\n hint: \"blockScrollPadding: '... start'\",\n },\n scrollPaddingBlockEnd: {\n property: 'blockScrollPadding',\n hint: \"blockScrollPadding: '... end'\",\n },\n scrollPaddingInline: {\n property: 'inlineScrollPadding',\n hint: \"inlineScrollPadding: '...'\",\n safeFix: true,\n },\n scrollPaddingInlineStart: {\n property: 'inlineScrollPadding',\n hint: \"inlineScrollPadding: '... start'\",\n },\n scrollPaddingInlineEnd: {\n property: 'inlineScrollPadding',\n hint: \"inlineScrollPadding: '... end'\",\n },\n borderBlock: { property: 'blockBorder', hint: \"blockBorder: '...'\" },\n borderBlockColor: { property: 'blockBorder', hint: \"blockBorder: '...'\" },\n borderBlockWidth: { property: 'blockBorder', hint: \"blockBorder: '...'\" },\n borderBlockStyle: { property: 'blockBorder', hint: \"blockBorder: '...'\" },\n borderBlockStart: {\n property: 'blockBorder',\n hint: \"blockBorder: '... start'\",\n },\n borderBlockEnd: { property: 'blockBorder', hint: \"blockBorder: '... end'\" },\n borderInline: { property: 'inlineBorder', hint: \"inlineBorder: '...'\" },\n borderInlineColor: { property: 'inlineBorder', hint: \"inlineBorder: '...'\" },\n borderInlineWidth: { property: 'inlineBorder', hint: \"inlineBorder: '...'\" },\n borderInlineStyle: { property: 'inlineBorder', hint: \"inlineBorder: '...'\" },\n borderInlineStart: {\n property: 'inlineBorder',\n hint: \"inlineBorder: '... start'\",\n },\n borderInlineEnd: {\n property: 'inlineBorder',\n hint: \"inlineBorder: '... end'\",\n },\n minBlockSize: { property: 'blockSize', hint: \"blockSize: 'min ...'\" },\n maxBlockSize: { property: 'blockSize', hint: \"blockSize: 'max ...'\" },\n minInlineSize: { property: 'inlineSize', hint: \"inlineSize: 'min ...'\" },\n maxInlineSize: { property: 'inlineSize', hint: \"inlineSize: 'max ...'\" },\n};\n\n/**\n * CSS shorthands whose *longhands* are the preferred Tasty form — the reverse\n * of `SHORTHAND_MAPPING`.\n *\n * `flex` is lossy in a way the longhands are not: it resets the two components\n * you did not write to values that are not their CSS initial. `flex: '0'`\n * expands to `flex-grow: 0; flex-shrink: 1; flex-basis: 0%`, so it cannot\n * express \"do not shrink\" (`flexShrink: 0`) at all, and it silently changes\n * `flex-basis`. Writing the longhands keeps each component independent, which\n * also lets them carry separate state maps.\n */\nexport const LONGHAND_MAPPING: Record<\n string,\n { longhands: string[]; hint: string }\n> = {\n flex: {\n longhands: ['flexGrow', 'flexShrink', 'flexBasis'],\n hint: 'flexGrow / flexShrink / flexBasis',\n },\n};\n\n/**\n * CSS transition property names mapped to Tasty semantic transition names.\n */\nexport const TRANSITION_SEMANTIC_MAPPING: Record<string, string> = {\n backgroundColor: 'fill',\n 'background-color': 'fill',\n backgroundImage: 'image',\n 'background-image': 'image',\n borderRadius: 'radius',\n 'border-radius': 'radius',\n borderColor: 'border',\n 'border-color': 'border',\n borderWidth: 'border',\n 'border-width': 'border',\n borderStyle: 'border',\n 'border-style': 'border',\n boxShadow: 'shadow',\n 'box-shadow': 'shadow',\n outlineColor: 'outline',\n 'outline-color': 'outline',\n outlineWidth: 'outline',\n 'outline-width': 'outline',\n outlineOffset: 'outline',\n 'outline-offset': 'outline',\n fontSize: 'preset',\n 'font-size': 'preset',\n lineHeight: 'preset',\n 'line-height': 'preset',\n letterSpacing: 'preset',\n 'letter-spacing': 'preset',\n};\n\n/**\n * Known preset modifiers, mirroring Tasty's preset handler. `normal` sets\n * `line-height: normal`.\n */\nexport const PRESET_MODIFIERS = new Set([\n 'strong',\n 'bold',\n 'italic',\n 'icon',\n 'tight',\n 'normal',\n]);\n\n/**\n * Default import sources for tasty.\n */\nexport const DEFAULT_IMPORT_SOURCES = ['@tenphi/tasty', '@tenphi/tasty/static'];\n\n/**\n * Built-in state prefixes that are always valid (not aliases).\n */\nexport const BUILT_IN_STATE_PREFIXES = new Set([\n '@media',\n '@root',\n '@parent',\n '@own',\n '@supports',\n '@starting',\n '@keyframes',\n '@property',\n '@font-face',\n '@counter-style',\n '@function',\n]);\n\n/**\n * Known CSS pseudo-classes: every standard element pseudo-class in MDN's\n * browser-compat-data (`css.selectors`), plus the Selectors Level 4 ones it\n * does not list yet (`:local-link`, `:target-within`, `:blank`, `:current`).\n * Functional pseudo-classes are listed by name, so `:dir` covers `:dir(rtl)`.\n * The `@page` pseudo-classes (`:first`, `:left`, `:right`) never match elements.\n */\nexport const KNOWN_PSEUDO_CLASSES = new Set([\n // User action\n ':hover',\n ':active',\n ':focus',\n ':focus-visible',\n ':focus-within',\n // Location\n ':any-link',\n ':link',\n ':visited',\n ':local-link',\n ':target',\n ':target-within',\n ':target-current',\n ':target-before',\n ':target-after',\n ':scope',\n // Linguistic\n ':dir',\n ':lang',\n // Input\n ':autofill',\n ':enabled',\n ':disabled',\n ':read-only',\n ':read-write',\n ':placeholder-shown',\n ':default',\n ':checked',\n ':indeterminate',\n ':blank',\n ':valid',\n ':invalid',\n ':user-valid',\n ':user-invalid',\n ':in-range',\n ':out-of-range',\n ':required',\n ':optional',\n // Element display state\n ':open',\n ':popover-open',\n ':modal',\n ':fullscreen',\n ':picture-in-picture',\n // Media resource state\n ':playing',\n ':paused',\n ':seeking',\n ':buffering',\n ':stalled',\n ':muted',\n ':volume-locked',\n // Time-dimensional\n ':current',\n ':past',\n ':future',\n // Tree-structural\n ':root',\n ':empty',\n ':first-child',\n ':last-child',\n ':only-child',\n ':first-of-type',\n ':last-of-type',\n ':only-of-type',\n ':nth-child',\n ':nth-last-child',\n ':nth-of-type',\n ':nth-last-of-type',\n ':heading',\n // Logical combinations\n ':is',\n ':not',\n ':where',\n ':has',\n // Custom elements and shadow DOM\n ':defined',\n ':state',\n ':host',\n ':host-context',\n ':has-slotted',\n // View transitions, interest invokers, navigation and WebXR\n ':active-view-transition',\n ':active-view-transition-type',\n ':interest-source',\n ':interest-target',\n ':navigation-source',\n ':xr-overlay',\n // Pseudo-elements\n '::before',\n '::after',\n '::placeholder',\n '::selection',\n '::first-line',\n '::first-letter',\n '::marker',\n '::backdrop',\n]);\n\n/**\n * Color tokens Tasty provides without any project configuration, so they are\n * always defined whatever the config's `tokens` list says.\n *\n * `#current` compiles to the `currentcolor` keyword, `#clear` is a default\n * replace token for `transparent`, and the rest are registered as default\n * `@property` rules (`#white`, `#black`, and `#border`/`#outline`, which fall\n * back to `currentcolor`). `prefer-custom-property-syntax` rewrites\n * `transparent` / `currentColor` to `#clear` / `#current`, so both must stay here.\n */\nexport const BUILT_IN_COLOR_TOKENS = new Set([\n '#current',\n '#clear',\n '#white',\n '#black',\n '#border',\n '#outline',\n]);\n\n/**\n * CSS named colors (level 1–4) that should be replaced by `#color` tokens.\n * `transparent` and `currentcolor` are excluded — they have their own token\n * suggestions (`#clear`, `#current`) handled by `prefer-custom-property-syntax`.\n */\nexport const NAMED_CSS_COLORS = new Set<string>([\n 'aliceblue',\n 'antiquewhite',\n 'aqua',\n 'aquamarine',\n 'azure',\n 'beige',\n 'bisque',\n 'black',\n 'blanchedalmond',\n 'blue',\n 'blueviolet',\n 'brown',\n 'burlywood',\n 'cadetblue',\n 'chartreuse',\n 'chocolate',\n 'coral',\n 'cornflowerblue',\n 'cornsilk',\n 'crimson',\n 'cyan',\n 'darkblue',\n 'darkcyan',\n 'darkgoldenrod',\n 'darkgray',\n 'darkgreen',\n 'darkgrey',\n 'darkkhaki',\n 'darkmagenta',\n 'darkolivegreen',\n 'darkorange',\n 'darkorchid',\n 'darkred',\n 'darksalmon',\n 'darkseagreen',\n 'darkslateblue',\n 'darkslategray',\n 'darkslategrey',\n 'darkturquoise',\n 'darkviolet',\n 'deeppink',\n 'deepskyblue',\n 'dimgray',\n 'dimgrey',\n 'dodgerblue',\n 'firebrick',\n 'floralwhite',\n 'forestgreen',\n 'fuchsia',\n 'gainsboro',\n 'ghostwhite',\n 'gold',\n 'goldenrod',\n 'gray',\n 'green',\n 'greenyellow',\n 'grey',\n 'honeydew',\n 'hotpink',\n 'indianred',\n 'indigo',\n 'ivory',\n 'khaki',\n 'lavender',\n 'lavenderblush',\n 'lawngreen',\n 'lemonchiffon',\n 'lightblue',\n 'lightcoral',\n 'lightcyan',\n 'lightgoldenrodyellow',\n 'lightgray',\n 'lightgreen',\n 'lightgrey',\n 'lightpink',\n 'lightsalmon',\n 'lightseagreen',\n 'lightskyblue',\n 'lightslategray',\n 'lightslategrey',\n 'lightsteelblue',\n 'lightyellow',\n 'lime',\n 'limegreen',\n 'linen',\n 'magenta',\n 'maroon',\n 'mediumaquamarine',\n 'mediumblue',\n 'mediumorchid',\n 'mediumpurple',\n 'mediumseagreen',\n 'mediumslateblue',\n 'mediumspringgreen',\n 'mediumturquoise',\n 'mediumvioletred',\n 'midnightblue',\n 'mintcream',\n 'mistyrose',\n 'moccasin',\n 'navajowhite',\n 'navy',\n 'oldlace',\n 'olive',\n 'olivedrab',\n 'orange',\n 'orangered',\n 'orchid',\n 'palegoldenrod',\n 'palegreen',\n 'paleturquoise',\n 'palevioletred',\n 'papayawhip',\n 'peachpuff',\n 'peru',\n 'pink',\n 'plum',\n 'powderblue',\n 'purple',\n 'rebeccapurple',\n 'red',\n 'rosybrown',\n 'royalblue',\n 'saddlebrown',\n 'salmon',\n 'sandybrown',\n 'seagreen',\n 'seashell',\n 'sienna',\n 'silver',\n 'skyblue',\n 'slateblue',\n 'slategray',\n 'slategrey',\n 'snow',\n 'springgreen',\n 'steelblue',\n 'tan',\n 'teal',\n 'thistle',\n 'tomato',\n 'turquoise',\n 'violet',\n 'wheat',\n 'white',\n 'whitesmoke',\n 'yellow',\n 'yellowgreen',\n]);\n\n/**\n * CSS system colors (CSS Color 4), lowercase. Tasty (>= 3.12) reads these as\n * colors, matched case-insensitively. Forced-colors styles are written in them,\n * so unlike `NAMED_CSS_COLORS` they are not something to replace with a token.\n * The deprecated system colors (`Menu`, `Window`, `ButtonHighlight`, …) are\n * left out, as Tasty leaves them out.\n */\nexport const SYSTEM_COLORS = new Set<string>([\n 'accentcolor',\n 'accentcolortext',\n 'activetext',\n 'buttonborder',\n 'buttonface',\n 'buttontext',\n 'canvas',\n 'canvastext',\n 'field',\n 'fieldtext',\n 'graytext',\n 'highlight',\n 'highlighttext',\n 'linktext',\n 'mark',\n 'marktext',\n 'selecteditem',\n 'selecteditemtext',\n 'visitedtext',\n]);\n\n/**\n * Properties that accept color values. Used to scope named-color checks so\n * string properties like `content` or `cursor` don't false-positive.\n */\nexport const COLOR_BEARING_PROPERTIES = new Set<string>([\n // Tasty enhanced properties\n 'fill',\n 'color',\n 'caretColor',\n 'accentColor',\n 'shadow',\n 'border',\n 'blockBorder',\n 'inlineBorder',\n 'outline',\n 'fade',\n // CSS background\n 'background',\n 'backgroundColor',\n // CSS border colors\n 'borderColor',\n 'borderTopColor',\n 'borderRightColor',\n 'borderBottomColor',\n 'borderLeftColor',\n // CSS logical border colors — the `block`/`inline` counterparts of the four\n // above, which a writing-mode-aware codebase reaches for just as often.\n 'borderBlockColor',\n 'borderBlockStartColor',\n 'borderBlockEndColor',\n 'borderInlineColor',\n 'borderInlineStartColor',\n 'borderInlineEndColor',\n // CSS shadows\n 'boxShadow',\n 'textShadow',\n // CSS text decoration\n 'textDecorationColor',\n // CSS outline / misc\n 'outlineColor',\n 'scrollbarColor',\n 'columnRuleColor',\n // SVG\n 'stroke',\n 'stopColor',\n 'floodColor',\n 'lightingColor',\n]);\n\n/**\n * Properties where tasty does NOT expand a `$name` custom-property reference.\n *\n * **Empty since tasty 3.0.2**, which taught the pass-through style handlers to\n * substitute `$name` refs too (tasty#264). Before that, `fontFamily:\n * '$font-sans'` emitted a literal `font-family: $font-sans` — an invalid\n * declaration the browser drops — so `prefer-custom-property-syntax` had to\n * suppress the rewrite for two dozen properties. It no longer does, which means\n * those rewrites are now offered where they were previously (and, since 3.0.2,\n * needlessly) held back.\n *\n * The set is kept rather than deleted: it is the seam the round-trip guard\n * writes to, so a future handler that regains pass-through behaviour surfaces\n * as a failing test instead of a silently broken autofix.\n *\n * An empty list here would let `--fix` delete a declaration on 3.0.0/3.0.1,\n * which the `@tenphi/tasty` peer floor rules out — that floor is 3.8.0, set by\n * the logical renames in {@link SHORTHAND_MAPPING} rather than by this list.\n *\n * Note that {@link PROPERTIES_WITHOUT_COLOR_TOKEN_EXPANSION} is *not* empty:\n * `#token` expansion is still property-scoped (`fontSize: '#accent'` is\n * meaningless and passes through). The two sets are genuinely different.\n *\n * Derived from the runtime, not by hand — `constants.round-trip.test.ts` rebuilds\n * both sets against the installed `@tenphi/tasty` and fails if either drifts.\n */\nexport const PROPERTIES_WITHOUT_CUSTOM_PROPERTY_EXPANSION = new Set<string>([]);\n\n/**\n * Properties where tasty does NOT expand a `#name` colour token.\n *\n * Mostly dimension and keyword properties: `fontSize: '#accent'` is meaningless,\n * so the handler leaves the value alone and the declaration is dropped. Suggesting\n * `#x` for a `var(--x-color)` inside one of these would break it.\n *\n * See {@link PROPERTIES_WITHOUT_CUSTOM_PROPERTY_EXPANSION} for why this is a\n * separate list rather than the same one.\n */\nexport const PROPERTIES_WITHOUT_COLOR_TOKEN_EXPANSION = new Set([\n 'align',\n 'alignContent',\n 'alignItems',\n 'backgroundAttachment',\n 'backgroundClip',\n 'backgroundOrigin',\n 'backgroundRepeat',\n 'display',\n 'font',\n 'fontFamily',\n 'fontSize',\n 'fontWeight',\n 'justify',\n 'justifyContent',\n 'justifyItems',\n 'letterSpacing',\n 'lineHeight',\n 'outlineOffset',\n 'overflow',\n 'place',\n 'placeContent',\n 'placeItems',\n 'textTransform',\n 'whiteSpace',\n]);\n"],"mappings":";;AAuBA,MAAa,gBAAgB,CAAC,SAAS,MAAM;;AAG7C,MAAa,sBAAsB,CAAC,aAAa,aAAa;AAC9D,MAAa,iCAAiC;CAC5C;CACA;CACA;CACA;CACD;;;;;;AAOD,MAAa,yBAAyB;CACpC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;;;;;;AAOD,MAAa,wBAAwB,CAAC,eAAe,eAAe;;AAGpE,MAAa,iBAAiB;CAC5B,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACJ;;AAGD,MAAa,kBAAkB;CAC7B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;;AAGD,MAAa,mBAAmB;CAC9B;CACA;CACA,GAAG;CACH;CACA;CACA;CACA;CACD;;;;AAKD,MAAa,yBAAyB,IAAI,IAAI;CAC5C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAIA;CACA;CACA,GAAG;CACJ,CAAC;;;;;;AAOF,MAAa,qBAAqB,IAAI,IAAI;CACxC;CACA;CACA;CACA;CACA;CACD,CAAC;;;;;;;AAQF,MAAa,6BAAqD;CAChE,eAAe;CACf,aAAa;CACb,iBAAiB;CAClB;;;;;;;;;;;;;;;;;;;;AAqBD,MAAM,yBAAyB;CAC7B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;;;;;;AAOD,MAAa,0BAA0B;CAGrC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;;;;AAKD,MAAa,uBAAuB,IAAI,IAAI,CAC1C,GAAG,wBACH,GAAG,wBACJ,CAAC;;;;AAKF,MAAa,iBAAiB,IAAI,IAAI;CAAC;CAAK;CAAK;CAAM;CAAM;CAAM;CAAM;CAAK,CAAC;;;;;;;AAQ/E,MAAa,6BAA6B,IAAI,IAAI;CAChD;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;;;;AAKF,MAAa,YAAY,IAAI,IAAI;CAC/B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;;;;;;;;;;;;;AAcF,MAAa,0BAA0B,IAAI,IAAI;CAC7C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAEA;CACA;CACA;CACA;CACA;CACA;CACA;CAaA,GAAG;CACH,GAAG;CACH,GAAG;CACJ,CAAC;;;;AAKF,MAAa,wB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AuB;CAC5E,mBAAmB;EACjB,UAAU;EACV,MAAM;EACP;CACD,iBAAiB;EACf,UAAU;EACV,MAAM;EACP;CACD,cAAc;EAAE,UAAU;EAAa,MAAM;EAAwB;CACrE,cAAc;EAAE,UAAU;EAAa,MAAM;EAAwB;CACrE,eAAe;EAAE,UAAU;EAAc,MAAM;EAAyB;CACxE,eAAe;EAAE,UAAU;EAAc,MAAM;EAAyB;CACzE;;;;;;;;;;;;AAaD,MAAa,mBAGT,EACF,MAAM;CACJ,WAAW;EAAC;EAAY;EAAc;EAAY;CAClD,MAAM;CACP,EACF;;;;AAKD,MAAa,8BAAsD;CACjE,iBAAiB;CACjB,oBAAoB;CACpB,iBAAiB;CACjB,oBAAoB;CACpB,cAAc;CACd,iBAAiB;CACjB,aAAa;CACb,gBAAgB;CAChB,aAAa;CACb,gBAAgB;CAChB,aAAa;CACb,gBAAgB;CAChB,WAAW;CACX,cAAc;CACd,cAAc;CACd,iBAAiB;CACjB,cAAc;CACd,iBAAiB;CACjB,eAAe;CACf,kBAAkB;CAClB,UAAU;CACV,aAAa;CACb,YAAY;CACZ,eAAe;CACf,eAAe;CACf,kBAAkB;CACnB;;;;;AAMD,MAAa,mBAAmB,IAAI,IAAI;CACtC;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;;;;AAKF,MAAa,yBAAyB,CAAC,iBAAiB,uBAAuB;;;;AAK/E,MAAa,0BAA0B,IAAI,IAAI;CAC7C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;;;;;;;;AASF,MAAa,uBAAuB,IAAI,IAAI;CAE1C;CACA;CACA;CACA;CACA;CAEA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAEA;CACA;CAEA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAEA;CACA;CACA;CACA;CACA;CAEA;CACA;CACA;CACA;CACA;CACA;CACA;CAEA;CACA;CACA;CAEA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAEA;CACA;CACA;CACA;CAEA;CACA;CACA;CACA;CACA;CAEA;CACA;CACA;CACA;CACA;CACA;CAEA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;;;;;;;;;;;AAYF,MAAa,wBAAwB,IAAI,IAAI;CAC3C;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;;;;;;AAOF,MAAa,mBAAmB,IAAI,IAAY;CAC9C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;;;;;;;;AASF,MAAa,gBAAgB,IAAI,IAAY;CAC3C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;;;;;AAMF,MAAa,2BAA2B,IAAI,IAAY;CAEtD;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAEA;CACA;CAEA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CACA;CACA;CACA;CAEA;CACA;CAEA;CAEA;CACA;CACA;CAEA;CACA;CACA;CACA;CACD,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BF,MAAa,+DAA+C,IAAI,IAAY,EAAE,CAAC;;;;;;;;;;;AAY/E,MAAa,2CAA2C,IAAI,IAAI;CAC9D;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC"}
package/dist/context.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { DEFAULT_IMPORT_SOURCES, KNOWN_CSS_PROPERTIES, KNOWN_TASTY_PROPERTIES, SPECIAL_STYLE_KEYS } from "./constants.js";
2
2
  import { loadConfig } from "./config.js";
3
- import { collectLocalStateAliases, getKeyName, unwrapExpression } from "./utils.js";
3
+ import { collectLocalStateAliases, getKeyName, unwrapExpression, wildcardPattern } from "./utils.js";
4
4
  import { finishJSXAnalysis, jsxPropKind } from "./type-aware-jsx.js";
5
5
  import { isModuleTastyComponent } from "./module-components.js";
6
6
 
@@ -163,11 +163,6 @@ function baseComponentName(node) {
163
163
  function isInRepoSource(source) {
164
164
  return source.startsWith(".") || source.startsWith("/") || source.startsWith("~") || source.startsWith("#") || source.startsWith("@/");
165
165
  }
166
- /** Matches a source against an `ownedSources` pattern, where `*` is any run of characters. */
167
- function matchesSourcePattern(pattern, source) {
168
- const escaped = pattern.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
169
- return new RegExp(`^${escaped.replace(/\\\*/g, ".*")}$`).test(source);
170
- }
171
166
  /** `settings.tasty.mergeFunctions`: project helpers with `mergeStyles` semantics. */
172
167
  function readMergeFunctions(context) {
173
168
  const option = (context.settings?.tasty)?.mergeFunctions;
@@ -224,6 +219,10 @@ var TastyContext = class {
224
219
  getImport(localName) {
225
220
  return this.imports.get(localName);
226
221
  }
222
+ /** The built-in and configured `importSources`. */
223
+ get trackedSources() {
224
+ return this.importSources;
225
+ }
227
226
  /**
228
227
  * Whether the base component an extension layer sits on top of lives in a file
229
228
  * this project can edit — so a rule can decide whether pointing the author at
@@ -238,7 +237,7 @@ var TastyContext = class {
238
237
  const source = this.moduleSources.get(localName);
239
238
  if (source === void 0) return true;
240
239
  if (isInRepoSource(source)) return true;
241
- return (this.config.ownedSources ?? []).some((pattern) => matchesSourcePattern(pattern, source));
240
+ return (this.config.ownedSources ?? []).some((pattern) => wildcardPattern(pattern).test(source));
242
241
  }
243
242
  isTastyCall(node) {
244
243
  const callee = unwrapExpression(node.callee);