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.
- package/dist/cli.js +323 -247
- 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
|
|
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(
|
|
699
|
-
|
|
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 =
|
|
710
|
-
const selectorConfig =
|
|
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
|
|
714
|
-
const
|
|
715
|
-
const
|
|
716
|
-
const
|
|
717
|
-
const
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
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
|
|
729
|
-
const
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
const
|
|
733
|
-
|
|
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
|
|
748
|
-
const
|
|
749
|
-
|
|
750
|
-
|
|
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 =
|
|
754
|
-
const
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
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
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
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
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
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
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
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
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
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
|
-
|
|
801
|
-
|
|
802
|
-
const
|
|
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,
|
|
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
|
-
|
|
832
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
866
|
-
const hashGridProperty = hashVariantProperty("grid", property);
|
|
1006
|
+
function createGridToggleValue(property) {
|
|
867
1007
|
const gridProperty3 = Tokenami2.gridProperty();
|
|
868
|
-
|
|
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
|
|
876
|
-
|
|
1011
|
+
function createVariantToggleValue(toggleProperty, tokenProperty3) {
|
|
1012
|
+
const basePropertyValue = createBasePropertyValue(tokenProperty3);
|
|
1013
|
+
return `var(${toggleProperty}) ${basePropertyValue};`;
|
|
877
1014
|
}
|
|
878
|
-
function
|
|
879
|
-
const
|
|
880
|
-
|
|
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 =
|
|
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 =
|
|
937
|
-
function
|
|
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 +
|
|
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
|
|
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
|
-
|
|
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
|
|
1062
|
-
|
|
1063
|
-
const
|
|
1064
|
-
const tkSelector =
|
|
1065
|
-
|
|
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.
|
|
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
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
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.
|
|
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.
|
|
49
|
-
"@tokenami/ds": "0.0.
|
|
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": "
|
|
70
|
+
"gitHead": "377394b4ba58a7084ce5746ae635eac3de04170d"
|
|
71
71
|
}
|