tokenami 0.0.90 → 0.0.92

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/cli.js +323 -247
  2. package/package.json +4 -4
package/dist/cli.js CHANGED
@@ -665,7 +665,6 @@ function debug(str) {
665
665
  var UNUSED_LAYERS_REGEX = /[\n\s]*@layer[^;{]+;/g;
666
666
  var DEFAULT_SELECTOR = "[style]";
667
667
  var CUSTOM_PROP_PREFIX = "--_";
668
- var SELECTOR_TAG = "<selector>";
669
668
  var LAYERS = {
670
669
  BASE: "tk",
671
670
  LOGICAL: "tkl",
@@ -692,114 +691,258 @@ function generate(params) {
692
691
  }
693
692
  function createSheet(params) {
694
693
  if (!params.tokens.properties.length) return "";
695
- const tokenProperties = params.tokens.properties;
696
- const tokenValues = params.tokens.values;
694
+ const sheet = new Sheet(params.tokens.values, params.config);
697
695
  const composeBlocks = parseComposeBlocks(params.tokens.composeBlocks, params.config);
698
- const propertyConfigsByCSSProperty = getPropertyConfigs(tokenProperties, params.config);
699
- let themeTokenSelectors = [];
700
- const styles = {
701
- reset: /* @__PURE__ */ new Set(),
702
- atomic: {},
703
- selectors: {},
704
- components: {},
705
- toggles: {}
706
- };
707
- for (const [cssProperty, configs] of propertyConfigsByCSSProperty) {
696
+ const propertyConfigsByCSSProperty = getPropertyConfigs(params.tokens.properties, params.config);
697
+ for (const [cssProperty, propertyConfigs] of propertyConfigsByCSSProperty) {
708
698
  const isInheritable = inheritedProperties.has(cssProperty);
709
- const elementConfigs = configs.filter((c) => {
710
- const selectorConfig = getPropertyConfigSelector(c.selector, params.config);
699
+ const elementConfigs = propertyConfigs.filter((c) => {
700
+ const selectorConfig = getSelectorFromConfig(c.selector, params.config);
711
701
  return !selectorConfig.some(isPseudoElementSelector);
712
702
  });
713
- for (const prop of configs) {
714
- const toggleKey = prop.responsive || prop.selector;
715
- const propertyPrefix = prop.isCustom ? CUSTOM_PROP_PREFIX : "";
716
- const gridToggle = prop.isGrid ? getGridPropertyToggle(prop.tokenProperty) : "";
717
- const selectors = getPropertySelectors(composeBlocks, prop, params.config);
718
- themeTokenSelectors.push(...selectors.base.map(removePseudoElementSelector));
719
- if (prop.variant && toggleKey) {
720
- const responsive = getResponsiveSelectorFromConfig(prop.responsive, params.config);
721
- const selectorConfig = getPropertyConfigSelector(prop.selector, params.config);
722
- const hasChildSelector = selectorConfig.some(isChildSelector);
723
- const propertyConfigs = selectorConfig.some(isPseudoElementSelector) ? configs.filter((c) => c.selector === prop.selector) : elementConfigs;
724
- const declarationValue = createVariantValue(cssProperty, prop, propertyConfigs);
703
+ for (const prop of propertyConfigs) {
704
+ const baseProperty = prop.isCustom ? CUSTOM_PROP_PREFIX + cssProperty : cssProperty;
705
+ const gridProperty3 = hashVariantProperty("grid", prop.tokenProperty);
706
+ const gridToggleValue = createGridToggleValue(prop.tokenProperty);
707
+ const selectorConfig = getSelectorFromConfig(prop.selector, params.config);
708
+ const parsedSelectors = getPropertySelectors(composeBlocks, prop, selectorConfig);
709
+ const configs = selectorConfig.some(isPseudoElementSelector) ? propertyConfigs.filter((c) => c.selector === prop.selector) : elementConfigs;
710
+ sheet.addThemeTokenSelectors(parsedSelectors.elements);
711
+ if (!isInheritable && !selectorConfig.some(isChildSelector)) {
712
+ sheet.addReset(prop.tokenProperty);
713
+ if (prop.isGrid) sheet.addReset(Tokenami2.calcProperty(prop.tokenProperty));
714
+ }
715
+ if (prop.variant) {
716
+ const responsiveConfig = getResponsiveSelectorFromConfig(prop.responsive, params.config);
725
717
  const hashedProperty = hashVariantProperty(prop.variant, cssProperty);
726
- const basePropertyValue = getBasePropertyValue(prop.tokenProperty, prop, false);
727
718
  const toggleProperty = Tokenami2.parsedTokenProperty(prop.variant);
728
- const declaration = `${propertyPrefix}${cssProperty}: ${declarationValue};`;
729
- const toggleDeclaration = `${hashedProperty}: var(${toggleProperty}) ${basePropertyValue};`;
730
- const toggleTemplate = `@layer ${prop.layer} {${SELECTOR_TAG} { ${toggleDeclaration} }}`;
731
- const gridToggleTemplate = `@layer ${prop.layer} {${SELECTOR_TAG} { ${gridToggle} }}`;
732
- const template = `@layer ${prop.layer} {${SELECTOR_TAG} { ${declaration} }}`;
733
- styles.reset.add(`${toggleProperty}: initial;`);
734
- styles.reset.add(`${hashedProperty}: initial;`);
735
- if (!isInheritable && !hasChildSelector) {
736
- styles.reset.add(`${prop.tokenProperty}: initial;`);
737
- }
738
- styles.selectors[template] ??= /* @__PURE__ */ new Set();
739
- styles.selectors[toggleTemplate] ??= /* @__PURE__ */ new Set();
740
- styles.selectors[gridToggleTemplate] ??= /* @__PURE__ */ new Set();
741
- for (const selector of selectors.base) {
742
- const elemSelector = removePseudoElementSelector(selector);
743
- styles.selectors[template].add(prop.isCustom ? elemSelector : selector);
744
- styles.selectors[toggleTemplate].add(elemSelector);
745
- styles.selectors[gridToggleTemplate].add(elemSelector);
719
+ const variantValue = createVariantValue(cssProperty, prop, configs);
720
+ const variantToggleValue = prop.isGrid ? createGridVariantToggleValue(toggleProperty, prop.tokenProperty) : createVariantToggleValue(toggleProperty, prop.tokenProperty);
721
+ sheet.addReset(toggleProperty);
722
+ sheet.addReset(hashedProperty);
723
+ for (const selector of parsedSelectors.all) {
724
+ sheet.addToggleFlagDeclaration(responsiveConfig, selector, toggleProperty);
746
725
  }
747
- for (const selector of selectors.all) {
748
- const toggle = createToggleDeclaration(responsive, selector, toggleProperty);
749
- styles.toggles[toggleKey] ??= /* @__PURE__ */ new Set();
750
- styles.toggles[toggleKey].add(toggle);
726
+ for (const selector of parsedSelectors.elements) {
727
+ const pseudoOwnerSelector = removePseudoElementSelector(selector);
728
+ const baseSelector = prop.isCustom ? pseudoOwnerSelector : selector;
729
+ sheet.addDeclaration(prop.layer, baseSelector, baseProperty, variantValue);
730
+ sheet.addDeclaration(prop.layer, pseudoOwnerSelector, hashedProperty, variantToggleValue);
731
+ if (prop.isGrid) {
732
+ sheet.addDeclaration(prop.layer, pseudoOwnerSelector, gridProperty3, gridToggleValue);
733
+ }
751
734
  }
752
735
  } else {
753
- const propertyValue = getBasePropertyValue(prop.tokenProperty, prop);
754
- const declaration = `${propertyPrefix}${cssProperty}: ${propertyValue};`;
755
- const template = `@layer ${prop.layer} {${SELECTOR_TAG} { ${declaration} ${gridToggle} }}`;
756
- if (!isInheritable) styles.reset.add(`${prop.tokenProperty}: initial;`);
757
- styles.atomic[template] ??= /* @__PURE__ */ new Set();
758
- for (const selector of selectors.base) {
759
- styles.atomic[template].add(selector);
736
+ const propertyValue = prop.isGrid ? createGridPropertyValue(prop.tokenProperty, "revert-layer") : createBasePropertyValue(prop.tokenProperty, "revert-layer");
737
+ for (const selector of parsedSelectors.elements) {
738
+ sheet.addDeclaration(prop.layer, selector, baseProperty, propertyValue);
739
+ if (prop.isGrid) {
740
+ sheet.addDeclaration(prop.layer, selector, gridProperty3, gridToggleValue);
741
+ }
760
742
  }
761
743
  }
762
744
  }
763
745
  }
764
- for (const [selector, tokenamiProperties] of Object.entries(composeBlocks)) {
765
- for (let [key, value] of Object.entries(tokenamiProperties)) {
766
- const atomicPair = `${key}: ${value};`;
767
- styles.components[atomicPair] ??= /* @__PURE__ */ new Set();
768
- styles.components[atomicPair].add(selector);
746
+ const composeEntries = Object.entries(composeBlocks);
747
+ for (const [selector, tokenamiProperties] of composeEntries) {
748
+ const propertyEntries = Object.entries(tokenamiProperties);
749
+ for (let [key, value] of propertyEntries) {
750
+ sheet.addDeclaration(LAYERS.COMPONENTS, selector, key, value);
769
751
  }
770
752
  }
771
- const composeStyles = Object.entries(styles.components).map(([atomicPair, blocks]) => {
772
- return `@layer ${LAYERS.COMPONENTS} { ${Array.from(blocks)} { ${atomicPair} } }`;
773
- });
774
- return `
775
- @layer global {
776
- ${params.config.globalStyles ? stringify(params.config.globalStyles) : ""}
753
+ return sheet.toString();
754
+ }
755
+ var SELECTOR_TAG = "<selector>";
756
+ var CUSTOM_PROP_REGEX = /\(--[^-][\w-]+/g;
757
+ var Sheet = class {
758
+ config;
759
+ tokenValues;
760
+ themeTokenSelectors = [];
761
+ reset = /* @__PURE__ */ new Set();
762
+ toggles = {};
763
+ layers = {};
764
+ constructor(tokenValues, config) {
765
+ this.tokenValues = tokenValues;
766
+ this.config = config;
767
+ }
768
+ addReset(property) {
769
+ this.reset.add(`${property}: initial;`);
770
+ }
771
+ addThemeTokenSelectors(baseSelectors) {
772
+ this.themeTokenSelectors.push(...baseSelectors.map(removePseudoElementSelector));
773
+ }
774
+ addDeclaration(layer, selector, property, value) {
775
+ const declaration = `${property}: ${value}`;
776
+ const template = `@layer ${layer} { ${SELECTOR_TAG} { ${declaration} } }`;
777
+ this.layers[template] ??= /* @__PURE__ */ new Set();
778
+ this.layers[template].add(selector);
779
+ }
780
+ addToggleFlagDeclaration(responsiveConfig, selector, toggleProperty) {
781
+ let toggle = `${toggleProperty}: ;`;
782
+ const toggleKey = responsiveConfig || selector.join();
783
+ const responsiveSelectors = [responsiveConfig, ...selector].reverse();
784
+ for (const selector2 of responsiveSelectors) {
785
+ if (!selector2) continue;
786
+ const elemSelector = removePseudoElementSelector(selector2);
787
+ toggle = `${elemSelector} { ${toggle} }`;
777
788
  }
778
-
779
- @layer tkb {
780
- ${generateKeyframeRules(tokenValues, params.config)}
781
- ${generateThemeTokens(tokenValues, unique(themeTokenSelectors), params.config)}
782
- * { ${Array.from(styles.reset).join(" ")} }
783
-
784
- ${Object.values(styles.toggles).flatMap((set) => Array.from(set)).join(" ")}
789
+ this.toggles[toggleKey] ??= /* @__PURE__ */ new Set();
790
+ this.toggles[toggleKey].add(toggle);
791
+ }
792
+ #generateGlobalStyles() {
793
+ if (!this.config.globalStyles) return "";
794
+ return `@layer global { ${stringify(this.config.globalStyles)} }`;
795
+ }
796
+ #generateTokenamiResets() {
797
+ const themeTokenSelectors = unique(this.themeTokenSelectors);
798
+ return `
799
+ @layer tkb {
800
+ ${this.#generateKeyframeRules()}
801
+ ${this.#generateThemeTokens(themeTokenSelectors)}
802
+ * { ${Array.from(this.reset).join(" ")} }
803
+ ${Object.values(this.toggles).flatMap((set) => Array.from(set)).join(" ")}
804
+ }
805
+ `;
806
+ }
807
+ #generatePlaceholderLayers(prefix) {
808
+ return `@layer ${Array.from({ length: 20 }).map((_, layer) => `${prefix}${layer}`).join(", ")};`;
809
+ }
810
+ #generateLayerStyles() {
811
+ const entries = Object.entries(this.layers);
812
+ const groupedBySelectors = /* @__PURE__ */ new Map();
813
+ for (const [template, selectors] of entries) {
814
+ const { pseudoElements, otherSelectors } = this.#separateSelectors(selectors);
815
+ if (otherSelectors.length > 0) {
816
+ const groupedSelector = otherSelectors.sort().join(",");
817
+ const existingStyles = groupedBySelectors.get(groupedSelector) || "";
818
+ const newStyles = template.replace(SELECTOR_TAG, groupedSelector);
819
+ groupedBySelectors.set(groupedSelector, existingStyles + " " + newStyles);
820
+ }
821
+ for (const pseudoElement of pseudoElements) {
822
+ const existingStyles = groupedBySelectors.get(pseudoElement) || "";
823
+ const newStyles = template.replace(SELECTOR_TAG, pseudoElement);
824
+ groupedBySelectors.set(pseudoElement, existingStyles + " " + newStyles);
825
+ }
785
826
  }
786
-
787
- ${generatePlaceholderLayers(LAYERS.BASE)}
788
- ${generatePlaceholderLayers(LAYERS.LOGICAL)}
789
- ${generatePlaceholderLayers(LAYERS.SELECTORS)}
790
- ${generatePlaceholderLayers(LAYERS.SELECTORS_LOGICAL)}
791
- ${generatePlaceholderLayers(LAYERS.COMPONENTS)}
792
- ${generateLayerStyles(styles.atomic)}
793
- ${generateLayerStyles(styles.selectors)}
794
-
795
- ${composeStyles.join(" ")}
796
- `;
797
- }
827
+ return Array.from(groupedBySelectors.values()).join(" ");
828
+ }
829
+ #separateSelectors(selectors) {
830
+ const pseudoElements = [];
831
+ const otherSelectors = [];
832
+ for (const selector of selectors) {
833
+ if (isPseudoElementSelector(selector)) {
834
+ pseudoElements.push(selector);
835
+ } else {
836
+ otherSelectors.push(selector);
837
+ }
838
+ }
839
+ return { pseudoElements, otherSelectors };
840
+ }
841
+ #generateKeyframeRules() {
842
+ const themeValues = this.tokenValues.flatMap((tokenValue2) => {
843
+ return Object.values(getThemeValuesByThemeMode(tokenValue2, this.config.theme));
844
+ });
845
+ const rules = Object.entries(this.config.keyframes || {}).flatMap(([name, styles]) => {
846
+ const nameRegex = new RegExp(`\\b${name}\\b`);
847
+ const isUsingKeyframeName = themeValues.some((value) => nameRegex.test(value));
848
+ if (!isUsingKeyframeName) return [];
849
+ return [[`@keyframes ${name} { ${stringify(styles)} }`]];
850
+ });
851
+ return rules.join(" ");
852
+ }
853
+ #generateThemeTokens(styleSelector) {
854
+ const theme = getThemeFromConfig(this.config.theme);
855
+ const rootSelector = this.config.themeSelector("root");
856
+ const gridStyles = `${rootSelector} { ${Tokenami2.gridProperty()}: ${this.config.grid}; }`;
857
+ const rootStyles = this.#getThemeStyles(styleSelector, rootSelector, theme.root);
858
+ const themeToModes = {};
859
+ const modeEntries = Object.entries(theme.modes || {});
860
+ for (const [mode, theme2] of modeEntries) {
861
+ const themeKey = JSON.stringify(theme2);
862
+ if (themeKey in themeToModes) themeToModes[themeKey].push(mode);
863
+ else themeToModes[themeKey] = [mode];
864
+ }
865
+ const modeStyles = Object.entries(themeToModes).map(([theme2, modes]) => {
866
+ const selector = modes.map(this.config.themeSelector).join(", ");
867
+ return this.#getThemeStyles(styleSelector, selector, JSON.parse(theme2));
868
+ });
869
+ const themeTokens = [gridStyles, rootStyles, modeStyles.join(" ")];
870
+ return themeTokens.join(" ");
871
+ }
872
+ #getThemeStyles(styleSelector, selector, theme) {
873
+ const themeValues = getThemeValuesByTokenValues(this.tokenValues, theme);
874
+ const customPropertyThemeValues = this.#getCustomPropertyThemeValues(themeValues);
875
+ const customPropertyThemeKeys = Object.keys(customPropertyThemeValues);
876
+ const selectors = [selector].flat();
877
+ const elementSelector = selectors.at(-1);
878
+ const parentSelectors = selectors.slice(0, -1);
879
+ const elementThemeStyles = this.#getElementThemeStyles(
880
+ styleSelector,
881
+ elementSelector,
882
+ customPropertyThemeValues
883
+ );
884
+ for (const customKey of customPropertyThemeKeys) {
885
+ delete themeValues[customKey];
886
+ }
887
+ const themeStyles = selectors.reduceRight(
888
+ (declaration, selector2) => `${selector2} { ${declaration} }`,
889
+ stringify(themeValues)
890
+ );
891
+ const customPropertyThemeStyles = parentSelectors.reduceRight(
892
+ (declaration, selector2) => `${selector2} { ${declaration} }`,
893
+ elementThemeStyles
894
+ );
895
+ return themeStyles + " " + customPropertyThemeStyles;
896
+ }
897
+ #getCustomPropertyThemeValues(themeValues) {
898
+ const entries = Object.entries(themeValues).flatMap(([key, value]) => {
899
+ const valueWithCustomPrefixes = this.#getPrefixedCustomPropertyValues(value);
900
+ return valueWithCustomPrefixes ? [[key, valueWithCustomPrefixes]] : [];
901
+ });
902
+ return Object.fromEntries(entries);
903
+ }
904
+ #getPrefixedCustomPropertyValues(themeValue) {
905
+ const variables = themeValue.match(CUSTOM_PROP_REGEX);
906
+ if (!variables) return null;
907
+ return themeValue.replace(CUSTOM_PROP_REGEX, (m) => {
908
+ const match = m.replace("(", "");
909
+ const tokenProperty3 = Tokenami2.TokenProperty.safeParse(match);
910
+ if (!tokenProperty3.success) return m;
911
+ const parts = Tokenami2.getTokenPropertySplit(tokenProperty3.output);
912
+ const isCustom = Boolean(this.config.customProperties?.[parts.alias]);
913
+ if (!isCustom) return m;
914
+ const tokenPrefix = Tokenami2.tokenProperty("");
915
+ const customPrefixTokenValue = tokenProperty3.output.replace(tokenPrefix, CUSTOM_PROP_PREFIX);
916
+ return "(" + customPrefixTokenValue;
917
+ });
918
+ }
919
+ #getElementThemeStyles(styleSelector, selector, themeValues) {
920
+ const splitGroups = selector.split(",");
921
+ const themeStyles = splitGroups.map((selector2) => {
922
+ const elemSelector = [styleSelector].flat().map((s) => `${selector2} ${s}`);
923
+ return `${selector2}, ${elemSelector} { ${stringify(themeValues)} }`;
924
+ });
925
+ return themeStyles.join(" ");
926
+ }
927
+ toString() {
928
+ return `
929
+ ${this.#generateGlobalStyles()}
930
+ ${this.#generateTokenamiResets()}
931
+ ${this.#generatePlaceholderLayers(LAYERS.BASE)}
932
+ ${this.#generatePlaceholderLayers(LAYERS.LOGICAL)}
933
+ ${this.#generatePlaceholderLayers(LAYERS.SELECTORS)}
934
+ ${this.#generatePlaceholderLayers(LAYERS.SELECTORS_LOGICAL)}
935
+ ${this.#generatePlaceholderLayers(LAYERS.COMPONENTS)}
936
+ ${this.#generateLayerStyles()}
937
+ `;
938
+ }
939
+ };
798
940
  function parseComposeBlocks(composeBlocks, config) {
799
941
  let parsedComposeBlocks = {};
800
- for (const [selector, tokenamiProperties] of Object.entries(composeBlocks)) {
801
- const entries = Object.entries(tokenamiProperties);
802
- const aliasProperties = Tokenami2.iterateAliasProperties(entries, config);
942
+ const entries = Object.entries(composeBlocks);
943
+ for (const [selector, tokenamiProperties] of entries) {
944
+ const entries2 = Object.entries(tokenamiProperties);
945
+ const aliasProperties = Tokenami2.iterateAliasProperties(entries2, config);
803
946
  let styles = {};
804
947
  for (let [key, value, propertyConfig] of aliasProperties) {
805
948
  const tokenProperty3 = key;
@@ -815,21 +958,22 @@ function parseComposeBlocks(composeBlocks, config) {
815
958
  }
816
959
  return parsedComposeBlocks;
817
960
  }
818
- function getPropertySelectors(composeBlocks, prop, config) {
961
+ function getPropertySelectors(composeBlocks, prop, selectorConfig) {
819
962
  let selectors = [];
820
- const selectorConfig = getPropertyConfigSelector(prop.selector, config);
821
963
  const baseSelectors = getBaseSelectors(composeBlocks, prop.tokenProperty);
822
964
  const elemSelector = selectorConfig.find(isElementSelector);
823
965
  if (elemSelector) {
824
966
  const parsedSelectors = getParsedSelectors(prop.selector, [elemSelector], baseSelectors);
825
- if (elemSelector === "&") selectors.push(...parsedSelectors.flat());
826
967
  selectors.push(...parsedSelectors.flat());
827
968
  } else {
828
969
  selectors.push(...baseSelectors);
829
970
  }
971
+ const elementSelectors = unique(selectors).map((selector) => {
972
+ return isPseudoElementSelector(selector) ? selector : selector.replace(/:[^ ]+$/, "");
973
+ });
830
974
  return {
831
- base: unique(selectors),
832
- all: getParsedSelectors(prop.selector, selectorConfig, baseSelectors)
975
+ all: getParsedSelectors(prop.selector, selectorConfig, baseSelectors),
976
+ elements: elementSelectors
833
977
  };
834
978
  }
835
979
  function getBaseSelectors(composeBlocks, property) {
@@ -838,8 +982,17 @@ function getBaseSelectors(composeBlocks, property) {
838
982
  });
839
983
  return [DEFAULT_SELECTOR, ...composeSelectors];
840
984
  }
985
+ function createBasePropertyValue(property, fallback) {
986
+ return `var(${property}${fallback ? ", " + fallback : ""})`;
987
+ }
988
+ function createGridPropertyValue(property, fallback) {
989
+ const hashGridProperty = hashVariantProperty("grid", property);
990
+ const baseProperty = createBasePropertyValue(property, fallback);
991
+ return `var(${hashGridProperty}, ${baseProperty})`;
992
+ }
841
993
  function createVariantValue(cssProperty, prop, propertyConfigs) {
842
- let variantValue = "revert-layer";
994
+ const customPropertyFallback = `var(${Tokenami2.tokenProperty(cssProperty)})`;
995
+ let variantValue = prop.isCustom ? customPropertyFallback : "revert-layer";
843
996
  const seen = /* @__PURE__ */ new Set();
844
997
  for (const propertyConfig of propertyConfigs) {
845
998
  if (!propertyConfig.variant) continue;
@@ -848,62 +1001,20 @@ function createVariantValue(cssProperty, prop, propertyConfigs) {
848
1001
  variantValue = `var(${hashedProperty}, ${variantValue})`;
849
1002
  seen.add(propertyConfig.variant);
850
1003
  }
851
- const customPropertyFallback = `var(${Tokenami2.tokenProperty(cssProperty)})`;
852
- const customPropertyValue = variantValue.replace("revert-layer", customPropertyFallback);
853
- return prop.isCustom ? customPropertyValue : variantValue;
854
- }
855
- function createToggleDeclaration(responsiveSelector, selector, toggleProperty) {
856
- let toggle = `${toggleProperty}: ;`;
857
- const responsiveSelectors = [responsiveSelector, ...selector].reverse();
858
- for (const selector2 of responsiveSelectors) {
859
- if (!selector2) continue;
860
- const elemSelector = removePseudoElementSelector(selector2);
861
- toggle = `${elemSelector} { ${toggle} }`;
862
- }
863
- return toggle;
1004
+ return variantValue;
864
1005
  }
865
- function getGridPropertyToggle(property) {
866
- const hashGridProperty = hashVariantProperty("grid", property);
1006
+ function createGridToggleValue(property) {
867
1007
  const gridProperty3 = Tokenami2.gridProperty();
868
- return `${hashGridProperty}: var(${property}__calc) calc(var(${property}) * var(${gridProperty3}));`;
869
- }
870
- function getBasePropertyValue(property, config, revert = true) {
871
- const hashGridProperty = hashVariantProperty("grid", property);
872
- const baseProperty = `var(${property}${revert ? ", revert-layer" : ""})`;
873
- return config.isGrid ? `var(${hashGridProperty}, ${baseProperty})` : baseProperty;
1008
+ const gridToggleProperty = Tokenami2.calcProperty(property);
1009
+ return `var(${gridToggleProperty}) calc(var(${property}) * var(${gridProperty3}))`;
874
1010
  }
875
- function generatePlaceholderLayers(prefix) {
876
- return `@layer ${Array.from({ length: 20 }).map((_, layer) => `${prefix}${layer}`).join(", ")};`;
1011
+ function createVariantToggleValue(toggleProperty, tokenProperty3) {
1012
+ const basePropertyValue = createBasePropertyValue(tokenProperty3);
1013
+ return `var(${toggleProperty}) ${basePropertyValue};`;
877
1014
  }
878
- function generateLayerStyles(styles) {
879
- const groupedBySelectors = /* @__PURE__ */ new Map();
880
- for (const [template, selectors] of Object.entries(styles)) {
881
- const { pseudoElements, otherSelectors } = separateSelectors(selectors);
882
- if (otherSelectors.length > 0) {
883
- const groupedSelector = otherSelectors.sort().join(",");
884
- const existingStyles = groupedBySelectors.get(groupedSelector) || "";
885
- const newStyles = template.replace(SELECTOR_TAG, groupedSelector);
886
- groupedBySelectors.set(groupedSelector, existingStyles + " " + newStyles);
887
- }
888
- for (const pseudoElement of pseudoElements) {
889
- const existingStyles = groupedBySelectors.get(pseudoElement) || "";
890
- const newStyles = template.replace(SELECTOR_TAG, pseudoElement);
891
- groupedBySelectors.set(pseudoElement, existingStyles + " " + newStyles);
892
- }
893
- }
894
- return Array.from(groupedBySelectors.values()).join(" ");
895
- }
896
- function separateSelectors(selectors) {
897
- const pseudoElements = [];
898
- const otherSelectors = [];
899
- for (const selector of selectors) {
900
- if (isPseudoElementSelector(selector)) {
901
- pseudoElements.push(selector);
902
- } else {
903
- otherSelectors.push(selector);
904
- }
905
- }
906
- return { pseudoElements, otherSelectors };
1015
+ function createGridVariantToggleValue(toggleProperty, tokenProperty3) {
1016
+ const basePropertyValue = createGridPropertyValue(tokenProperty3);
1017
+ return `var(${toggleProperty}) ${basePropertyValue};`;
907
1018
  }
908
1019
  function getPropertyConfigs(tokenProperties, config) {
909
1020
  let propertyConfigs = /* @__PURE__ */ new Map();
@@ -915,7 +1026,7 @@ function getPropertyConfigs(tokenProperties, config) {
915
1026
  const selectorOrder = parts.selector ? 2 : 0;
916
1027
  const order = responsiveOrder + selectorOrder;
917
1028
  for (const cssProperty of properties) {
918
- const layerIndex = getAtomicLayerIndex(cssProperty, config);
1029
+ const layerIndex = getPropertyLayerIndex(cssProperty, config);
919
1030
  if (layerIndex === -1) continue;
920
1031
  const longhandProperty = Tokenami2.createLonghandProperty(property, cssProperty);
921
1032
  const tokenProperty3 = Tokenami2.parseProperty(longhandProperty);
@@ -933,100 +1044,17 @@ function getPropertyConfigs(tokenProperties, config) {
933
1044
  }
934
1045
  return propertyConfigs;
935
1046
  }
936
- var SHORTHAND_TO_LONGHAND_ENTRIES = [...Tokenami2.mapShorthandToLonghands.entries()];
937
- function getAtomicLayerIndex(cssProperty, config) {
1047
+ var SHORTHAND_TO_LONGHAND_ENTRIES = Array.from(Tokenami2.mapShorthandToLonghands.entries());
1048
+ function getPropertyLayerIndex(cssProperty, config) {
938
1049
  const validProperties = getValidProperties(config);
939
1050
  const isSupported = validProperties.has(cssProperty);
940
1051
  const initialDepth = isSupported ? 1 : -1;
941
1052
  if (cssProperty === "all") return 0;
942
1053
  return SHORTHAND_TO_LONGHAND_ENTRIES.reduce((depth, [shorthand, longhands]) => {
943
1054
  const isLonghand = longhands.includes(cssProperty);
944
- return isLonghand ? depth + getAtomicLayerIndex(shorthand, config) : depth;
1055
+ return isLonghand ? depth + getPropertyLayerIndex(shorthand, config) : depth;
945
1056
  }, initialDepth);
946
1057
  }
947
- function generateKeyframeRules(tokenValues, config) {
948
- const themeValues = tokenValues.flatMap((tokenValue2) => {
949
- return Object.values(getThemeValuesByThemeMode(tokenValue2, config.theme));
950
- });
951
- const rules = Object.entries(config.keyframes || {}).flatMap(([name, styles]) => {
952
- const nameRegex = new RegExp(`\\b${name}\\b`);
953
- const isUsingKeyframeName = themeValues.some((value) => nameRegex.test(value));
954
- if (!isUsingKeyframeName) return [];
955
- return [[`@keyframes ${name} { ${stringify(styles)} }`]];
956
- });
957
- return rules.join(" ");
958
- }
959
- function generateThemeTokens(tokenValues, styleSelector, config) {
960
- const theme = getThemeFromConfig(config.theme);
961
- const rootSelector = config.themeSelector("root");
962
- const gridStyles = `${rootSelector} { ${Tokenami2.gridProperty()}: ${config.grid}; }`;
963
- const rootStyles = getThemeStyles(styleSelector, rootSelector, tokenValues, theme.root, config);
964
- const themeToModes = {};
965
- const modeEntries = Object.entries(theme.modes || {});
966
- for (const [mode, theme2] of modeEntries) {
967
- const themeKey = JSON.stringify(theme2);
968
- if (themeKey in themeToModes) themeToModes[themeKey].push(mode);
969
- else themeToModes[themeKey] = [mode];
970
- }
971
- const modeStyles = Object.entries(themeToModes).map(([theme2, modes]) => {
972
- const selector = modes.map(config.themeSelector).join(", ");
973
- return getThemeStyles(styleSelector, selector, tokenValues, JSON.parse(theme2), config);
974
- });
975
- const themeTokens = [gridStyles, rootStyles, modeStyles.join(" ")];
976
- return themeTokens.join(" ");
977
- }
978
- var getThemeStyles = (styleSelector, selector, tokenValues, theme, config) => {
979
- const themeValues = getThemeValuesByTokenValues(tokenValues, theme);
980
- const customPropertyThemeValues = getCustomPropertyThemeValues(themeValues, config);
981
- const selectors = [selector].flat();
982
- for (const customKey of Object.keys(customPropertyThemeValues)) {
983
- delete themeValues[customKey];
984
- }
985
- const themeStyles = selectors.reduceRight((declaration, selector2) => {
986
- return `${selector2} { ${declaration} }`;
987
- }, stringify(themeValues));
988
- const elementSelector = selectors.at(-1);
989
- const elementThemeStyles = getElementThemeStyles(
990
- styleSelector,
991
- elementSelector,
992
- customPropertyThemeValues
993
- );
994
- const customPropertyThemeStyles = selectors.slice(0, -1).reduceRight((declaration, selector2) => {
995
- return `${selector2} { ${declaration} }`;
996
- }, elementThemeStyles);
997
- return themeStyles + " " + customPropertyThemeStyles;
998
- };
999
- var getElementThemeStyles = (styleSelector, selector, themeValues) => {
1000
- const splitGroups = selector.split(",");
1001
- const themeStyles = splitGroups.map((selector2) => {
1002
- const elemSelector = [styleSelector].flat().map((s) => `${selector2} ${s}`);
1003
- return `${selector2}, ${elemSelector} { ${stringify(themeValues)} }`;
1004
- });
1005
- return themeStyles.join(" ");
1006
- };
1007
- function getCustomPropertyThemeValues(themeValues, config) {
1008
- const entries = Object.entries(themeValues).flatMap(([key, value]) => {
1009
- const valueWithCustomPrefixes = getPrefixedCustomPropertyValues(value, config.customProperties);
1010
- return valueWithCustomPrefixes ? [[key, valueWithCustomPrefixes]] : [];
1011
- });
1012
- return Object.fromEntries(entries);
1013
- }
1014
- var CUSTOM_PROP_REGEX = /\(--[^-][\w-]+/g;
1015
- var getPrefixedCustomPropertyValues = (themeValue, customProperties) => {
1016
- const variables = themeValue.match(CUSTOM_PROP_REGEX);
1017
- if (!variables) return null;
1018
- return themeValue.replace(CUSTOM_PROP_REGEX, (m) => {
1019
- const match = m.replace("(", "");
1020
- const tokenProperty3 = Tokenami2.TokenProperty.safeParse(match);
1021
- if (!tokenProperty3.success) return m;
1022
- const parts = Tokenami2.getTokenPropertySplit(tokenProperty3.output);
1023
- const isCustom = Boolean(customProperties?.[parts.alias]);
1024
- if (!isCustom) return m;
1025
- const tokenPrefix = Tokenami2.tokenProperty("");
1026
- const customPrefixTokenValue = tokenProperty3.output.replace(tokenPrefix, CUSTOM_PROP_PREFIX);
1027
- return "(" + customPrefixTokenValue;
1028
- });
1029
- };
1030
1058
  function hashVariantProperty(variant, property) {
1031
1059
  return `--_${Tokenami2.hash(variant + property)}`;
1032
1060
  }
@@ -1048,27 +1076,72 @@ function isChildSelector(selector = "") {
1048
1076
  function getResponsiveSelectorFromConfig(responsiveSelector, tokenamiConfig) {
1049
1077
  return responsiveSelector && tokenamiConfig.responsive?.[responsiveSelector];
1050
1078
  }
1051
- function getPropertyConfigSelector(propertySelector, tokenamiConfig) {
1079
+ function getSelectorFromConfig(propertySelector, tokenamiConfig) {
1052
1080
  const arbitrarySelector = Tokenami2.getArbitrarySelector(propertySelector);
1053
1081
  const configSelector = propertySelector && tokenamiConfig.selectors?.[propertySelector];
1054
1082
  const selector = arbitrarySelector?.replace(/_/g, " ") || configSelector;
1055
1083
  return selector ? Array.isArray(selector) ? selector : [selector] : ["&"];
1056
1084
  }
1085
+ var disableRevertSelectors = ["&::selection", "&::-webkit-scrollbar"];
1057
1086
  function getParsedSelectors(propertySelector, selectorConfig, elementSelectors) {
1058
- if (selectorConfig.toString().indexOf("&") === -1) {
1087
+ const selectors = [];
1088
+ const selectorString = selectorConfig.toString();
1089
+ if (selectorString.indexOf("&") === -1) {
1059
1090
  throw new Error(`Selector '${propertySelector}' must include '&'`);
1060
1091
  }
1061
- const isSelectionVariant = selectorConfig.includes("&::selection");
1062
- return elementSelectors.map((elementSelector) => {
1063
- const isSelectionSelector = isSelectionVariant && elementSelector === DEFAULT_SELECTOR;
1064
- const tkSelector = isSelectionSelector ? `[style*="${propertySelector}_"]` : elementSelector;
1065
- return selectorConfig.map((selector) => selector.replace(/&/g, tkSelector));
1066
- });
1092
+ const isRevertDisabled = disableRevertSelectors.some((s) => selectorString.includes(s));
1093
+ for (const elementSelector of elementSelectors) {
1094
+ const isRevertDisabledSelector = isRevertDisabled && elementSelector === DEFAULT_SELECTOR;
1095
+ const tkSelector = isRevertDisabledSelector ? `[style*="${propertySelector}_"]` : elementSelector;
1096
+ const selectorConfigs = expandSelectorConfigs(selectorConfig);
1097
+ for (const selectorConfig2 of selectorConfigs) {
1098
+ const selector = selectorConfig2.map((selector2) => selector2.replace(/&/g, tkSelector));
1099
+ selectors.push(selector);
1100
+ }
1101
+ }
1102
+ return selectors;
1103
+ }
1104
+ function expandSelectorConfigs(selectorConfig) {
1105
+ const parts = selectorConfig.map(parseSelectorList);
1106
+ let results = [[]];
1107
+ for (const group of parts) {
1108
+ const res = [];
1109
+ for (const existing of results) {
1110
+ for (const value of group) {
1111
+ res.push([...existing, value]);
1112
+ }
1113
+ }
1114
+ results = res;
1115
+ }
1116
+ return results;
1117
+ }
1118
+ function parseSelectorList(selector) {
1119
+ const selectors = [];
1120
+ let currentSelector = "";
1121
+ let depth = 0;
1122
+ for (const [index, char] of selector.split("").entries()) {
1123
+ if (char === "(") depth++;
1124
+ if (char === "[") depth++;
1125
+ if (char === ")") depth--;
1126
+ if (char === "]") depth--;
1127
+ const nextChar = selector[index + 1];
1128
+ if (!nextChar) {
1129
+ currentSelector += char;
1130
+ selectors.push(currentSelector.trim());
1131
+ currentSelector = "";
1132
+ } else if (char === "," && depth === 0) {
1133
+ selectors.push(currentSelector.trim());
1134
+ currentSelector = "";
1135
+ } else {
1136
+ currentSelector += char;
1137
+ }
1138
+ }
1139
+ return selectors;
1067
1140
  }
1068
1141
 
1069
1142
  // package.json
1070
1143
  var package_default = {
1071
- version: "0.0.89"};
1144
+ version: "0.0.91"};
1072
1145
 
1073
1146
  // src/ts-plugin/error-codes.ts
1074
1147
  var INVALID_PROPERTY = 2353;
@@ -1334,9 +1407,12 @@ async function findUsedTokens(cwd, config) {
1334
1407
  tokenProperties = [...tokenProperties, ...tokens.properties];
1335
1408
  tokenValues = [...tokenValues, ...tokens.values];
1336
1409
  for (const composeBlock of composeBlocksContents) {
1337
- const ast = acorn.parse(composeBlock, { ecmaVersion: "latest" });
1338
- const composeBlockStyles = matchBaseComposeBlocks(ast);
1339
- composeBlocks = { ...composeBlocks, ...composeBlockStyles };
1410
+ try {
1411
+ const ast = acorn.parse(composeBlock, { ecmaVersion: "latest" });
1412
+ const composeBlockStyles = matchBaseComposeBlocks(ast);
1413
+ composeBlocks = { ...composeBlocks, ...composeBlockStyles };
1414
+ } catch {
1415
+ }
1340
1416
  }
1341
1417
  if (fileContent.includes(LAYERS.COMPONENTS)) {
1342
1418
  const sheetComposeBlocks = findSheetComposeBlocks(fileContent);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tokenami",
3
- "version": "0.0.90",
3
+ "version": "0.0.92",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -45,8 +45,8 @@
45
45
  },
46
46
  "dependencies": {
47
47
  "@stitches/stringify": "^1.2.8",
48
- "@tokenami/config": "0.0.90",
49
- "@tokenami/ds": "0.0.90",
48
+ "@tokenami/config": "0.0.92",
49
+ "@tokenami/ds": "0.0.92",
50
50
  "acorn": "^8.11.3",
51
51
  "acorn-walk": "^8.3.2",
52
52
  "browserslist": "^4.26.3",
@@ -67,5 +67,5 @@
67
67
  "peerDependencies": {
68
68
  "typescript": ">= 5"
69
69
  },
70
- "gitHead": "d6e7dfc673263649634b95ef9c422b845d53f584"
70
+ "gitHead": "377394b4ba58a7084ce5746ae635eac3de04170d"
71
71
  }