@schemyx/mcp 0.1.2 → 0.1.4

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.
@@ -183,6 +183,8 @@ function createBundle(rootPath, projectType, files) {
183
183
  const nodes = [];
184
184
  const edges = [];
185
185
  const reviewItems = [];
186
+ const componentStyleContext = createComponentStyleContext(files);
187
+ enrichUiElementsWithComponentStyles(files, componentStyleContext);
186
188
  const styleResolutionContext = createStyleResolutionContext(files);
187
189
  for (const file of files) {
188
190
  const fileSource = sourceInfo('core.files', 'high', [`path:${file.relPath}`], file);
@@ -722,6 +724,186 @@ function createBundle(rootPath, projectType, files) {
722
724
  detected: detectProjectFacts(files),
723
725
  };
724
726
  }
727
+ function createComponentStyleContext(files) {
728
+ const byName = new Map();
729
+ const byHelper = new Map();
730
+ for (const file of files) {
731
+ for (const definition of file.componentStyleDefinitions) {
732
+ if (!byName.has(definition.name)) {
733
+ byName.set(definition.name, definition);
734
+ }
735
+ if (definition.styleHelper && !byHelper.has(definition.styleHelper)) {
736
+ byHelper.set(definition.styleHelper, definition);
737
+ }
738
+ }
739
+ }
740
+ return { byName, byHelper };
741
+ }
742
+ function enrichUiElementsWithComponentStyles(files, context) {
743
+ for (const file of files) {
744
+ file.uiElements = file.uiElements.map((element) => enrichUiElementWithComponentStyles(element, context));
745
+ file.uiElements = file.uiElements.map((element) => ({
746
+ ...element,
747
+ childSummary: element.childSummary?.map((child) => enrichUiChildWithComponentStyles(child, context)),
748
+ }));
749
+ file.classReferences = (0, utils_1.unique)([
750
+ ...file.classReferences,
751
+ ...file.uiElements.flatMap((element) => element.classes),
752
+ ...file.uiElements.flatMap((element) => element.defaultClasses ?? []),
753
+ ]).slice(0, 500);
754
+ file.tailwindUtilities = (0, utils_1.unique)([
755
+ ...file.tailwindUtilities,
756
+ ...file.uiElements.flatMap((element) => element.classes),
757
+ ...file.uiElements.flatMap((element) => element.defaultClasses ?? []),
758
+ ]).slice(0, 160);
759
+ }
760
+ }
761
+ function enrichUiElementWithComponentStyles(element, context) {
762
+ const resolved = resolveComponentStyleClasses(element.originalTag, element.styleHelper, element.variants ?? element.styleHelperVariants, context);
763
+ if (!resolved.classes.length) {
764
+ return element;
765
+ }
766
+ const defaultClasses = mergeTailwindConflictClasses([
767
+ ...resolved.defaultClasses,
768
+ ...(element.defaultClasses ?? []),
769
+ ]);
770
+ const classes = mergeTailwindConflictClasses([
771
+ ...resolved.classes,
772
+ ...element.classes,
773
+ ...defaultClasses,
774
+ ]);
775
+ return {
776
+ ...element,
777
+ classes,
778
+ defaultClasses,
779
+ classGroups: (0, extractors_1.groupTailwindClasses)(classes),
780
+ styleHelper: element.styleHelper ?? resolved.styleHelper,
781
+ ...(element.styleHelperVariants ?? resolved.styleHelperVariants
782
+ ? {
783
+ styleHelperVariants: {
784
+ ...(resolved.styleHelperVariants ?? {}),
785
+ ...(element.styleHelperVariants ?? {}),
786
+ },
787
+ }
788
+ : {}),
789
+ };
790
+ }
791
+ function enrichUiChildWithComponentStyles(child, context) {
792
+ const resolved = resolveComponentStyleClasses(child.originalTag, child.styleHelper, child.variants ?? child.styleHelperVariants, context);
793
+ if (!resolved.classes.length) {
794
+ return child;
795
+ }
796
+ const defaultClasses = mergeTailwindConflictClasses([
797
+ ...resolved.defaultClasses,
798
+ ...(child.defaultClasses ?? []),
799
+ ]);
800
+ const classes = mergeTailwindConflictClasses([
801
+ ...resolved.classes,
802
+ ...child.classes,
803
+ ...defaultClasses,
804
+ ]);
805
+ return {
806
+ ...child,
807
+ classes,
808
+ defaultClasses,
809
+ styleHelper: child.styleHelper ?? resolved.styleHelper,
810
+ ...(child.styleHelperVariants ?? resolved.styleHelperVariants
811
+ ? {
812
+ styleHelperVariants: {
813
+ ...(resolved.styleHelperVariants ?? {}),
814
+ ...(child.styleHelperVariants ?? {}),
815
+ },
816
+ }
817
+ : {}),
818
+ };
819
+ }
820
+ function resolveComponentStyleClasses(componentName, styleHelperName, variants, context) {
821
+ const wrapper = componentName ? context.byName.get(componentName) : undefined;
822
+ const helperName = styleHelperName ?? wrapper?.styleHelper;
823
+ const helper = helperName ? context.byName.get(helperName) : undefined;
824
+ const helperClasses = helper
825
+ ? resolveComponentDefinitionClasses(helper, variants)
826
+ : { classes: [], defaultClasses: [] };
827
+ const wrapperClasses = wrapper
828
+ ? resolveComponentDefinitionClasses(wrapper, variants)
829
+ : { classes: [], defaultClasses: [] };
830
+ const normalizedVariants = normalizeVariantRecord(variants);
831
+ return {
832
+ classes: (0, utils_1.unique)([...wrapperClasses.classes, ...helperClasses.classes]),
833
+ defaultClasses: (0, utils_1.unique)([...wrapperClasses.defaultClasses, ...helperClasses.defaultClasses]),
834
+ ...(helperName ? { styleHelper: helperName } : {}),
835
+ ...(Object.keys(normalizedVariants).length ? { styleHelperVariants: normalizedVariants } : {}),
836
+ };
837
+ }
838
+ function resolveComponentDefinitionClasses(definition, variants) {
839
+ const normalizedVariants = normalizeVariantRecord(variants);
840
+ const defaultClasses = new Set(definition.baseClasses);
841
+ const classes = new Set(definition.classes);
842
+ for (const [variantName, variantMap] of Object.entries(definition.variants)) {
843
+ const requestedVariant = normalizedVariants[variantName] ?? definition.defaultVariants[variantName];
844
+ if (requestedVariant && variantMap[requestedVariant]) {
845
+ for (const className of variantMap[requestedVariant]) {
846
+ defaultClasses.add(className);
847
+ classes.add(className);
848
+ }
849
+ }
850
+ }
851
+ return {
852
+ classes: Array.from(classes),
853
+ defaultClasses: Array.from(defaultClasses),
854
+ };
855
+ }
856
+ function normalizeVariantRecord(variants) {
857
+ const normalized = {};
858
+ for (const [key, value] of Object.entries(variants ?? {})) {
859
+ if (typeof value === 'string' && /^[A-Za-z0-9_-]+$/.test(value)) {
860
+ normalized[key] = value;
861
+ }
862
+ }
863
+ return normalized;
864
+ }
865
+ function mergeTailwindConflictClasses(classes) {
866
+ const result = [];
867
+ const keyIndexes = new Map();
868
+ for (const className of classes) {
869
+ const key = tailwindConflictKey(className);
870
+ if (key && keyIndexes.has(key)) {
871
+ result[keyIndexes.get(key)] = className;
872
+ continue;
873
+ }
874
+ if (key) {
875
+ keyIndexes.set(key, result.length);
876
+ }
877
+ result.push(className);
878
+ }
879
+ return (0, utils_1.unique)(result);
880
+ }
881
+ function tailwindConflictKey(className) {
882
+ const segments = className.split(':');
883
+ const base = segments.pop() ?? className;
884
+ const prefix = segments.join(':');
885
+ const keyPrefix = prefix ? `${prefix}|` : '';
886
+ if (/^-?bg-/.test(base)) {
887
+ return `${keyPrefix}bg`;
888
+ }
889
+ if (/^rounded(?:-|$|\[)/.test(base)) {
890
+ const side = base.match(/^rounded(?:-([trbl]|tl|tr|br|bl|s|e|ss|se|ee|es))?(?:-|$|\[)/)?.[1];
891
+ return `${keyPrefix}rounded:${side ?? 'all'}`;
892
+ }
893
+ if (/^border-(?:\[[^\]]+\]|transparent|current|black|white|[a-z]+-\d{2,3}|[a-z][a-z0-9-]*)$/.test(base)) {
894
+ return `${keyPrefix}border-color`;
895
+ }
896
+ if (/^text-(?:\[[^\]]+\]|transparent|current|black|white|foreground|muted-foreground|card-foreground|primary-foreground|secondary-foreground|[a-z]+-\d{2,3})$/.test(base)) {
897
+ return `${keyPrefix}text-color`;
898
+ }
899
+ if (/^text-(?:xs|sm|base|lg|xl|[2-9]xl|\[[^\]]+\])$/.test(base)) {
900
+ return `${keyPrefix}text-size`;
901
+ }
902
+ if (/^shadow(?:-|$|\[)/.test(base)) {
903
+ return `${keyPrefix}shadow`;
904
+ }
905
+ return undefined;
906
+ }
725
907
  function addEntry(entries, usedKeys, entry) {
726
908
  let key = entry.key;
727
909
  if (usedKeys.has(key)) {
@@ -1641,10 +1823,41 @@ function tailwindDeclarationsForClass(className, styleContext) {
1641
1823
  const [, value] = base.match(/^grid-cols-(\d+)$/) ?? [];
1642
1824
  declarations.push(declaration('grid-template-columns', `repeat(${value}, minmax(0, 1fr))`));
1643
1825
  }
1826
+ if (/^grid-cols-\[([^\]]+)\]$/.test(base)) {
1827
+ declarations.push(declaration('grid-template-columns', arbitraryValue(base).replace(/_/g, ' ')));
1828
+ }
1644
1829
  if (/^grid-rows-(\d+)$/.test(base)) {
1645
1830
  const [, value] = base.match(/^grid-rows-(\d+)$/) ?? [];
1646
1831
  declarations.push(declaration('grid-template-rows', `repeat(${value}, minmax(0, 1fr))`));
1647
1832
  }
1833
+ if (/^grid-rows-\[([^\]]+)\]$/.test(base)) {
1834
+ declarations.push(declaration('grid-template-rows', arbitraryValue(base).replace(/_/g, ' ')));
1835
+ }
1836
+ if (base === 'auto-rows-fr') {
1837
+ declarations.push(declaration('grid-auto-rows', 'minmax(0, 1fr)'));
1838
+ }
1839
+ if (/^auto-rows-\[([^\]]+)\]$/.test(base)) {
1840
+ declarations.push(declaration('grid-auto-rows', arbitraryValue(base).replace(/_/g, ' ')));
1841
+ }
1842
+ if (base === 'flex-row')
1843
+ declarations.push(declaration('flex-direction', 'row'));
1844
+ if (base === 'flex-col')
1845
+ declarations.push(declaration('flex-direction', 'column'));
1846
+ if (base === 'flex-wrap')
1847
+ declarations.push(declaration('flex-wrap', 'wrap'));
1848
+ if (base === 'flex-nowrap')
1849
+ declarations.push(declaration('flex-wrap', 'nowrap'));
1850
+ if (base === 'object-cover')
1851
+ declarations.push(declaration('object-fit', 'cover'));
1852
+ if (base === 'object-contain')
1853
+ declarations.push(declaration('object-fit', 'contain'));
1854
+ if (base === 'object-fill')
1855
+ declarations.push(declaration('object-fit', 'fill'));
1856
+ if (base === 'object-center')
1857
+ declarations.push(declaration('object-position', 'center'));
1858
+ if (/^aspect-\[([^\]]+)\]$/.test(base)) {
1859
+ declarations.push(declaration('aspect-ratio', arbitraryValue(base).replace(/_/g, ' ')));
1860
+ }
1648
1861
  if (/^col-span-(\d+)$/.test(base)) {
1649
1862
  const [, value] = base.match(/^col-span-(\d+)$/) ?? [];
1650
1863
  declarations.push(declaration('grid-column', `span ${value} / span ${value}`));
@@ -1876,6 +2089,14 @@ function colorKeywordValue(token) {
1876
2089
  return colors[token];
1877
2090
  }
1878
2091
  function opacityToPercent(value) {
2092
+ const arbitrary = arbitraryTokenValue(value);
2093
+ if (arbitrary) {
2094
+ const numericArbitrary = Number(arbitrary);
2095
+ if (Number.isFinite(numericArbitrary)) {
2096
+ return `${numericArbitrary * 100}%`;
2097
+ }
2098
+ return arbitrary;
2099
+ }
1879
2100
  const numeric = Number(value);
1880
2101
  if (Number.isFinite(numeric)) {
1881
2102
  return `${numeric}%`;
@@ -1904,6 +2125,17 @@ function tailwindNamedSizeValue(token) {
1904
2125
  max: 'max-content',
1905
2126
  fit: 'fit-content',
1906
2127
  prose: '65ch',
2128
+ xs: '20rem',
2129
+ sm: '24rem',
2130
+ md: '28rem',
2131
+ lg: '32rem',
2132
+ xl: '36rem',
2133
+ '2xl': '42rem',
2134
+ '3xl': '48rem',
2135
+ '4xl': '56rem',
2136
+ '5xl': '64rem',
2137
+ '6xl': '72rem',
2138
+ '7xl': '80rem',
1907
2139
  };
1908
2140
  return values[token];
1909
2141
  }
@@ -2391,7 +2623,7 @@ function createUiContract(input) {
2391
2623
  layout: omitEmptyRecord({
2392
2624
  display: filterUiContractClasses(allClasses, (className) => /^(?:flex|inline-flex|grid|inline-grid|block|inline|inline-block|hidden|contents|table)$/.test((0, utils_1.classBase)(className))),
2393
2625
  alignment: filterUiContractClasses(allClasses, (className) => /^(?:items-|justify-|content-|self-|place-)/.test((0, utils_1.classBase)(className))),
2394
- grid: filterUiContractClasses(allClasses, (className) => /^(?:grid|grid-cols-|col-|row-)/.test((0, utils_1.classBase)(className))),
2626
+ grid: filterUiContractClasses(allClasses, (className) => /^(?:grid|grid-cols-|grid-rows-|auto-rows-|auto-cols-|col-|row-)/.test((0, utils_1.classBase)(className))),
2395
2627
  flex: filterUiContractClasses(allClasses, (className) => /^(?:flex|inline-flex|flex-|basis-|grow|shrink)/.test((0, utils_1.classBase)(className))),
2396
2628
  spacing: grouped.spacing ?? [],
2397
2629
  sizing: grouped.sizing ?? [],