clava 0.4.2 → 0.6.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.
package/dist/index.js CHANGED
@@ -75,7 +75,7 @@ function warnRefineLimit({ runState, creationFrame, unstableChanges }) {
75
75
  if (process.env.NODE_ENV === "production") return;
76
76
  if (runState.warned) return;
77
77
  runState.warned = true;
78
- let message = "Clava: Maximum refine iterations exceeded. This can happen when a refine callback calls setVariants or setDefaultVariants, but one of the variants changes on every run.";
78
+ let message = "Clava: Maximum refine iterations exceeded. This can happen when a computed default variant or refine callback changes one of the variants on every run.";
79
79
  if (unstableChanges && unstableChanges.size > 0) {
80
80
  message += `\nVariant(s) that did not stabilize: ${Array.from(unstableChanges.keys()).join(", ")}.`;
81
81
  message += `\nLatest variant changes before warning: ${formatVariantChanges(unstableChanges)}.`;
@@ -350,6 +350,23 @@ function mergeVariants(target, source, skipKeys) {
350
350
  }
351
351
  return changed;
352
352
  }
353
+ function mergeProtectedIntoBase(baseResolved, protectedVariants) {
354
+ if (!protectedVariants) return baseResolved;
355
+ let hasProtected = false;
356
+ for (const key in protectedVariants) {
357
+ if (!Object.hasOwn(protectedVariants, key)) continue;
358
+ hasProtected = true;
359
+ break;
360
+ }
361
+ if (!hasProtected) return baseResolved;
362
+ const resolved = {};
363
+ Object.assign(resolved, baseResolved);
364
+ for (const key in protectedVariants) {
365
+ if (!Object.hasOwn(protectedVariants, key)) continue;
366
+ resolved[key] = protectedVariants[key];
367
+ }
368
+ return resolved;
369
+ }
353
370
  function getComponentMeta(component) {
354
371
  return component[META_KEY];
355
372
  }
@@ -419,21 +436,11 @@ function collectVariantKeys(config) {
419
436
  }
420
437
  return Array.from(keys);
421
438
  }
422
- function isVariantDisabled(config, key) {
423
- return config.variants?.[key] === null;
424
- }
425
439
  function getVariantValueKey(value) {
426
440
  if (typeof value === "string") return value;
427
441
  if (typeof value === "number") return String(value);
428
442
  if (typeof value === "boolean") return String(value);
429
443
  }
430
- function isVariantValueDisabled(config, key, value) {
431
- const valueKey = getVariantValueKey(value);
432
- if (valueKey == null) return false;
433
- const variant = config.variants?.[key];
434
- if (!isRecordObject(variant)) return false;
435
- return variant[valueKey] === null;
436
- }
437
444
  function collectDisabledVariantKeys(config) {
438
445
  const keys = /* @__PURE__ */ new Set();
439
446
  if (!config.variants) return keys;
@@ -614,6 +621,9 @@ function create({ transformClass = (className) => className } = {}) {
614
621
  }
615
622
  const variantEntryCount = variantEntryNames.length;
616
623
  const functionVariantCount = functionVariantNames.length;
624
+ const computedDefaultNames = [];
625
+ const computedDefaultFns = [];
626
+ const defaultVariants = config.defaultVariants;
617
627
  const staticDefaults = {};
618
628
  if (extend) for (const ext of extend) {
619
629
  const meta = getComponentMeta(ext);
@@ -625,7 +635,21 @@ function create({ transformClass = (className) => className } = {}) {
625
635
  if (!isRecordObject(variantDef)) continue;
626
636
  if (Object.hasOwn(variantDef, "false") && staticDefaults[name] === void 0) staticDefaults[name] = false;
627
637
  }
628
- if (config.defaultVariants) Object.assign(staticDefaults, config.defaultVariants);
638
+ if (defaultVariants) for (const name in defaultVariants) {
639
+ if (!Object.hasOwn(defaultVariants, name)) continue;
640
+ const value = defaultVariants[name];
641
+ if (typeof value === "function") {
642
+ computedDefaultNames.push(name);
643
+ computedDefaultFns.push(value);
644
+ continue;
645
+ }
646
+ if (value === void 0) {
647
+ Reflect.deleteProperty(staticDefaults, name);
648
+ continue;
649
+ }
650
+ staticDefaults[name] = value;
651
+ }
652
+ const computedDefaultCount = computedDefaultNames.length;
629
653
  if (hasAnyDisabled) for (const key in staticDefaults) {
630
654
  if (!Object.hasOwn(staticDefaults, key)) continue;
631
655
  if (disabledVariantKeys.has(key)) {
@@ -654,14 +678,19 @@ function create({ transformClass = (className) => className } = {}) {
654
678
  } else extBaseClassesArr.push(meta.baseClass);
655
679
  }
656
680
  const extCount = extMetas.length;
681
+ const inheritedComputedDefaultKeys = /* @__PURE__ */ new Set();
682
+ for (let i = 0; i < extCount; i++) {
683
+ const keys = extMetas[i].computedDefaultKeys;
684
+ for (const key of keys) inheritedComputedDefaultKeys.add(key);
685
+ }
657
686
  const extMetasWithRefine = [];
658
687
  for (let i = 0; i < extCount; i++) {
659
688
  const meta = extMetas[i];
660
- if (meta.resolveDefaults) extMetasWithRefine.push(meta);
689
+ if (meta.resolveRefine) extMetasWithRefine.push(meta);
661
690
  }
662
691
  const extMetasWithRefineCount = extMetasWithRefine.length;
663
692
  const shouldCollectChangedVariants = extMetasWithRefineCount > 0;
664
- const creationFrame = !!refine || extMetasWithRefineCount > 0 ? captureCreationFrame(cv) : void 0;
693
+ const creationFrame = !!refine || computedDefaultCount > 0 || extMetasWithRefineCount > 0 ? captureCreationFrame(cv) : void 0;
665
694
  const functionVariantKeys = /* @__PURE__ */ new Set();
666
695
  for (let i = 0; i < extCount; i++) {
667
696
  const fnKeys = extMetas[i].functionVariantKeys;
@@ -672,6 +701,8 @@ function create({ transformClass = (className) => className } = {}) {
672
701
  }
673
702
  for (let i = 0; i < functionVariantCount; i++) functionVariantKeys.add(functionVariantNames[i]);
674
703
  for (let i = 0; i < variantEntryCount; i++) functionVariantKeys.delete(variantEntryNames[i]);
704
+ const computedDefaultKeys = new Set(inheritedComputedDefaultKeys);
705
+ for (let i = 0; i < computedDefaultCount; i++) computedDefaultKeys.add(computedDefaultNames[i]);
675
706
  let staticVariantsOverridingExtFn = null;
676
707
  if (variantEntryCount > 0 && extCount > 0) for (let i = 0; i < variantEntryCount; i++) {
677
708
  const name = variantEntryNames[i];
@@ -705,64 +736,42 @@ function create({ transformClass = (className) => className } = {}) {
705
736
  out[key] = value;
706
737
  }
707
738
  }
708
- const resolveDefaultsFn = refine || extMetasWithRefineCount > 0 ? (childDefaults, userProps = EMPTY_DEFAULTS) => {
709
- const resolvedVariants = {};
710
- Object.assign(resolvedVariants, staticDefaults);
711
- for (const key in childDefaults) {
712
- if (!Object.hasOwn(childDefaults, key)) continue;
713
- const v = childDefaults[key];
714
- if (v === void 0) continue;
715
- resolvedVariants[key] = v;
716
- }
717
- for (const key in userProps) {
718
- if (!Object.hasOwn(userProps, key)) continue;
719
- const v = userProps[key];
720
- if (v === void 0) continue;
721
- resolvedVariants[key] = v;
739
+ const isOwnDisabledValue = (key, value) => {
740
+ if (disabledVariantKeys.has(key)) return true;
741
+ if (hasDisabledVariantValues) {
742
+ const valueKey = getVariantValueKey(value);
743
+ if (valueKey != null && disabledVariantValues[key]?.has(valueKey)) return true;
722
744
  }
723
- const refineDefaults = {};
724
- for (let i = 0; i < extMetasWithRefineCount; i++) {
725
- const extDefaults = extMetasWithRefine[i].resolveDefaults(childDefaults, userProps);
726
- for (const k in extDefaults) {
727
- if (!Object.hasOwn(extDefaults, k)) continue;
728
- refineDefaults[k] = extDefaults[k];
745
+ return false;
746
+ };
747
+ const filterOwnDisabledVariants = (input, fallback) => {
748
+ if (!hasAnyDisabled) return input;
749
+ let hasOwnDisabledValue = false;
750
+ for (const key in input) {
751
+ if (!Object.hasOwn(input, key)) continue;
752
+ const value = input[key];
753
+ if (isOwnDisabledValue(key, value)) {
754
+ hasOwnDisabledValue = true;
755
+ break;
729
756
  }
730
757
  }
731
- if (refine) {
732
- const ownVariants = {};
733
- for (let i = 0; i < variantKeysLength; i++) {
734
- const k = variantKeys[i];
735
- if (Object.hasOwn(resolvedVariants, k)) ownVariants[k] = resolvedVariants[k];
758
+ if (!hasOwnDisabledValue) return input;
759
+ const filtered = {};
760
+ for (const key in input) {
761
+ if (!Object.hasOwn(input, key)) continue;
762
+ const value = input[key];
763
+ if (!isOwnDisabledValue(key, value)) {
764
+ filtered[key] = value;
765
+ continue;
736
766
  }
737
- refine({
738
- variants: ownVariants,
739
- setVariants: noop,
740
- setDefaultVariants: (newDefaults) => {
741
- for (const key in newDefaults) {
742
- if (!Object.hasOwn(newDefaults, key)) continue;
743
- const value = newDefaults[key];
744
- if (userProps[key] !== void 0) continue;
745
- if (isVariantDisabled(config, key)) continue;
746
- if (isVariantValueDisabled(config, key, value)) continue;
747
- refineDefaults[key] = value;
748
- }
749
- },
750
- addClass: noop,
751
- addStyle: noop
752
- });
767
+ const fallbackValue = fallback[key];
768
+ if (fallbackValue !== void 0 && !isOwnDisabledValue(key, fallbackValue)) filtered[key] = fallbackValue;
753
769
  }
754
- return refineDefaults;
755
- } : null;
770
+ return filtered;
771
+ };
756
772
  function resolveVariantsHot(propsVariants) {
757
773
  const defaults = {};
758
774
  Object.assign(defaults, staticDefaults);
759
- for (let i = 0; i < extMetasWithRefineCount; i++) {
760
- const extDefaults = extMetasWithRefine[i].resolveDefaults(defaults, propsVariants);
761
- for (const k in extDefaults) {
762
- if (!Object.hasOwn(extDefaults, k)) continue;
763
- defaults[k] = extDefaults[k];
764
- }
765
- }
766
775
  for (const k in propsVariants) {
767
776
  if (!Object.hasOwn(propsVariants, k)) continue;
768
777
  const v = propsVariants[k];
@@ -774,7 +783,67 @@ function create({ transformClass = (className) => className } = {}) {
774
783
  filterDisabledInto(defaults, result);
775
784
  return result;
776
785
  }
777
- const runRefineContext = (resolved, userVariantProps, filterOwnVariants, collectOutput, protectedVariants, pendingProtectedVariants, protectedVariantKeys) => {
786
+ const runComputedDefaults = (resolved, defaultResolved, userVariantProps, filterOwnVariants, protectedVariantKeys) => {
787
+ if (computedDefaultCount === 0) return {
788
+ workingResolved: resolved,
789
+ changedVariants: null
790
+ };
791
+ let ownVariants = filterOwnVariants ? null : resolved;
792
+ const getOwnVariants = () => {
793
+ if (ownVariants) return ownVariants;
794
+ const filteredVariants = {};
795
+ for (let i = 0; i < variantKeysLength; i++) {
796
+ const key = variantKeys[i];
797
+ if (Object.hasOwn(resolved, key)) filteredVariants[key] = resolved[key];
798
+ }
799
+ ownVariants = filteredVariants;
800
+ return filteredVariants;
801
+ };
802
+ let updatedVariants = null;
803
+ let changedVariants = null;
804
+ const ensureUpdated = () => {
805
+ if (updatedVariants) return updatedVariants;
806
+ const updated = {};
807
+ Object.assign(updated, resolved);
808
+ updatedVariants = updated;
809
+ return updated;
810
+ };
811
+ for (let i = 0; i < computedDefaultCount; i++) {
812
+ const key = computedDefaultNames[i];
813
+ if (Object.hasOwn(userVariantProps, key)) {
814
+ if (userVariantProps[key] !== void 0) continue;
815
+ }
816
+ if (protectedVariantKeys?.has(key)) continue;
817
+ const variantSnapshot = getOwnVariants();
818
+ const defaultValue = inheritedComputedDefaultKeys.has(key) ? variantSnapshot[key] : defaultResolved[key];
819
+ const value = computedDefaultFns[i](defaultValue, variantSnapshot);
820
+ if (hasAnyDisabled) {
821
+ if (disabledVariantKeys.has(key)) continue;
822
+ const valueKey = getVariantValueKey(value);
823
+ if (valueKey != null && disabledVariantValues[key]?.has(valueKey)) continue;
824
+ }
825
+ if (value === void 0) {
826
+ if (!Object.hasOwn(variantSnapshot, key)) continue;
827
+ if (shouldCollectChangedVariants) {
828
+ changedVariants ??= {};
829
+ changedVariants[key] = value;
830
+ }
831
+ Reflect.deleteProperty(ensureUpdated(), key);
832
+ continue;
833
+ }
834
+ if (Object.is(variantSnapshot[key], value)) continue;
835
+ if (shouldCollectChangedVariants) {
836
+ changedVariants ??= {};
837
+ changedVariants[key] = value;
838
+ }
839
+ ensureUpdated()[key] = value;
840
+ }
841
+ return {
842
+ workingResolved: updatedVariants ?? resolved,
843
+ changedVariants
844
+ };
845
+ };
846
+ const runRefineContext = (resolved, userVariantProps, filterOwnVariants, collectOutput, applyVariantUpdates, protectedVariants, pendingProtectedVariants, protectedVariantKeys) => {
778
847
  let workingResolved = resolved;
779
848
  let cClasses = null;
780
849
  let cStyle = null;
@@ -815,6 +884,7 @@ function create({ transformClass = (className) => className } = {}) {
815
884
  const result = refine({
816
885
  variants: ownVariants,
817
886
  setVariants: (newVariants) => {
887
+ if (!applyVariantUpdates) return;
818
888
  if (!hasAnyDisabled) {
819
889
  for (const key in newVariants) {
820
890
  if (!Object.hasOwn(newVariants, key)) continue;
@@ -838,23 +908,6 @@ function create({ transformClass = (className) => className } = {}) {
838
908
  ensureUpdated()[key] = value;
839
909
  }
840
910
  },
841
- setDefaultVariants: (newDefaults) => {
842
- for (const key in newDefaults) {
843
- if (!Object.hasOwn(newDefaults, key)) continue;
844
- if (userVariantProps[key] !== void 0) continue;
845
- if (protectedVariantKeys?.has(key)) continue;
846
- const value = newDefaults[key];
847
- if (hasAnyDisabled) {
848
- if (disabledVariantKeys.has(key)) continue;
849
- const valueKey = getVariantValueKey(value);
850
- if (valueKey != null && disabledVariantValues[key]?.has(valueKey)) continue;
851
- }
852
- if (Object.is(getCurrentVariantValue(key), value)) continue;
853
- setChangedVariant(key, value);
854
- if (pendingProtectedVariants) pendingProtectedVariants[key] = value;
855
- ensureUpdated()[key] = value;
856
- }
857
- },
858
911
  addClass: (className) => {
859
912
  localCClasses?.push(className);
860
913
  },
@@ -892,18 +945,11 @@ function create({ transformClass = (className) => className } = {}) {
892
945
  style: cStyle
893
946
  };
894
947
  };
895
- const computeOnce = (resolved, userVariantProps, skipKeys, skipValues, classesOut, styleOut, runState, protectedVariants, pendingProtectedVariants, protectedVariantKeys) => {
948
+ const computeOnce = (resolved, userVariantProps, skipKeys, skipValues, classesOut, styleOut, runState, protectedVariants, pendingProtectedVariants, protectedVariantKeys, defaultResolved = resolved, renderOnly = false) => {
896
949
  let workingResolved = resolved;
897
950
  let cClasses = null;
898
951
  let cStyle = null;
899
952
  let changedVariants = null;
900
- if (refine) {
901
- const refineResult = runRefineContext(resolved, userVariantProps, true, true, protectedVariants, pendingProtectedVariants, protectedVariantKeys);
902
- workingResolved = refineResult.workingResolved;
903
- cClasses = refineResult.classes;
904
- cStyle = refineResult.style;
905
- changedVariants = refineResult.changedVariants;
906
- }
907
953
  if (hasExtend) {
908
954
  let extSkipKeys;
909
955
  if (skipKeys === null) extSkipKeys = staticExtSkipKeys;
@@ -931,15 +977,31 @@ function create({ transformClass = (className) => className } = {}) {
931
977
  for (let i = 0; i < extCount; i++) {
932
978
  if (hasIsolatedExt && extIsolated[i]) {
933
979
  const extClasses = [];
934
- workingResolved = extMetas[i].compute(workingResolved, extUserVariantProps, extSkipKeys, extSkipVals, extClasses, styleOut, runState, protectedVariants, pendingProtectedVariants, protectedVariantKeys);
980
+ workingResolved = extMetas[i].compute(workingResolved, extUserVariantProps, extSkipKeys, extSkipVals, extClasses, styleOut, runState, protectedVariants, pendingProtectedVariants, protectedVariantKeys, defaultResolved, renderOnly);
935
981
  if (extClasses.length > 0) {
936
982
  const joined = clsx(extClasses);
937
983
  if (joined.length > 0) classesOut.push(extMetas[i].transformClass(joined));
938
984
  }
939
- } else workingResolved = extMetas[i].compute(workingResolved, extUserVariantProps, extSkipKeys, extSkipVals, classesOut, styleOut, runState, protectedVariants, pendingProtectedVariants, protectedVariantKeys);
985
+ } else workingResolved = extMetas[i].compute(workingResolved, extUserVariantProps, extSkipKeys, extSkipVals, classesOut, styleOut, runState, protectedVariants, pendingProtectedVariants, protectedVariantKeys, defaultResolved, renderOnly);
986
+ workingResolved = filterOwnDisabledVariants(workingResolved, defaultResolved);
940
987
  if (protectedVariants && extMetasWithRefineCount > 0) Object.assign(extUserVariantProps, protectedVariants);
941
988
  }
942
989
  }
990
+ if (!renderOnly && computedDefaultCount > 0) {
991
+ const computedResult = runComputedDefaults(workingResolved, defaultResolved, userVariantProps, true, protectedVariantKeys);
992
+ workingResolved = computedResult.workingResolved;
993
+ changedVariants = computedResult.changedVariants;
994
+ }
995
+ if (refine) {
996
+ const refineResult = runRefineContext(workingResolved, userVariantProps, true, true, !renderOnly, protectedVariants, pendingProtectedVariants, protectedVariantKeys);
997
+ workingResolved = refineResult.workingResolved;
998
+ cClasses = refineResult.classes;
999
+ cStyle = refineResult.style;
1000
+ if (refineResult.changedVariants) {
1001
+ changedVariants ??= {};
1002
+ Object.assign(changedVariants, refineResult.changedVariants);
1003
+ }
1004
+ }
943
1005
  if (hasBaseStyle) Object.assign(styleOut, baseStyle);
944
1006
  const ownSkipKeys = skipKeys;
945
1007
  const ownSkipValues = skipValues;
@@ -982,7 +1044,8 @@ function create({ transformClass = (className) => className } = {}) {
982
1044
  if (cStyle) Object.assign(styleOut, cStyle);
983
1045
  return workingResolved;
984
1046
  };
985
- const compute = !refine && extMetasWithRefineCount === 0 ? computeOnce : (resolved, userVariantProps, skipKeys, skipValues, classesOut, styleOut, runState, protectedVariants, pendingProtectedVariants, protectedVariantKeys) => {
1047
+ const compute = !refine && computedDefaultCount === 0 && extMetasWithRefineCount === 0 ? computeOnce : (resolved, userVariantProps, skipKeys, skipValues, classesOut, styleOut, runState, protectedVariants, pendingProtectedVariants, protectedVariantKeys, incomingDefaultResolved = resolved, renderOnly = false) => {
1048
+ if (renderOnly) return computeOnce(resolved, userVariantProps, skipKeys, skipValues, classesOut, styleOut, runState, protectedVariants, pendingProtectedVariants, protectedVariantKeys, incomingDefaultResolved, true);
986
1049
  runState ??= { remaining: MAX_REFINE_RUNS };
987
1050
  protectedVariants ??= {};
988
1051
  protectedVariantKeys ??= /* @__PURE__ */ new Set();
@@ -1004,12 +1067,19 @@ function create({ transformClass = (className) => className } = {}) {
1004
1067
  const nextPendingProtectedVariants = {};
1005
1068
  const nextClasses = useDirectOutput ? classesOut : [];
1006
1069
  const nextStyle = useDirectOutput ? styleOut : {};
1007
- const nextResolved = computeOnce(workingResolved, userVariantProps, skipKeys, skipValues, nextClasses, nextStyle, runState, protectedVariants, nextPendingProtectedVariants, protectedVariantKeys);
1070
+ const defaultResolved = mergeProtectedIntoBase(incomingDefaultResolved, protectedVariants);
1071
+ const nextResolved = computeOnce(workingResolved, userVariantProps, skipKeys, skipValues, nextClasses, nextStyle, runState, protectedVariants, nextPendingProtectedVariants, protectedVariantKeys, defaultResolved);
1008
1072
  let protectedChanged;
1009
1073
  if (pendingProtectedVariants) protectedChanged = mergeVariants(pendingProtectedVariants, nextPendingProtectedVariants, protectedVariantKeys);
1010
1074
  else protectedChanged = mergeVariants(protectedVariants, nextPendingProtectedVariants, protectedVariantKeys);
1011
1075
  if (!protectedChanged && (nextResolved === workingResolved || areVariantsEqual(workingResolved, nextResolved))) {
1012
- if (!useDirectOutput) {
1076
+ if (nextResolved !== workingResolved) {
1077
+ if (useDirectOutput) {
1078
+ classesOut.length = classCount;
1079
+ for (const key in styleOut) if (Object.hasOwn(styleOut, key)) Reflect.deleteProperty(styleOut, key);
1080
+ }
1081
+ computeOnce(nextResolved, userVariantProps, skipKeys, skipValues, classesOut, styleOut, runState, protectedVariants, null, protectedVariantKeys, defaultResolved, true);
1082
+ } else if (!useDirectOutput) {
1013
1083
  for (let i = 0; i < nextClasses.length; i++) classesOut.push(nextClasses[i]);
1014
1084
  Object.assign(styleOut, nextStyle);
1015
1085
  }
@@ -1046,26 +1116,35 @@ function create({ transformClass = (className) => className } = {}) {
1046
1116
  Object.assign(styleOut, lastStyle);
1047
1117
  return workingResolved;
1048
1118
  };
1049
- const resolveRefineOnce = (resolved, userVariantProps, filterOwnVariants = true, runState, protectedVariants, pendingProtectedVariants, protectedVariantKeys) => {
1119
+ const resolveRefineOnce = (resolved, userVariantProps, filterOwnVariants = true, runState, protectedVariants, pendingProtectedVariants, protectedVariantKeys, defaultResolved = resolved) => {
1050
1120
  let workingResolved = resolved;
1051
1121
  let changedVariants = null;
1052
- if (refine) {
1053
- const refineResult = runRefineContext(resolved, userVariantProps, filterOwnVariants, false, protectedVariants, pendingProtectedVariants, protectedVariantKeys);
1054
- workingResolved = refineResult.workingResolved;
1055
- changedVariants = refineResult.changedVariants;
1056
- }
1057
1122
  if (extMetasWithRefineCount > 0) {
1058
1123
  const extUserVariantProps = getExtUserVariantProps(userVariantProps, protectedVariants ?? null, changedVariants);
1059
1124
  for (let i = 0; i < extMetasWithRefineCount; i++) {
1060
1125
  const resolveRefine = extMetasWithRefine[i].resolveRefine;
1061
1126
  if (!resolveRefine) continue;
1062
- workingResolved = resolveRefine(workingResolved, extUserVariantProps, true, runState, protectedVariants, pendingProtectedVariants, protectedVariantKeys);
1127
+ workingResolved = resolveRefine(workingResolved, extUserVariantProps, true, runState, protectedVariants, pendingProtectedVariants, protectedVariantKeys, defaultResolved);
1128
+ workingResolved = filterOwnDisabledVariants(workingResolved, defaultResolved);
1063
1129
  if (protectedVariants) Object.assign(extUserVariantProps, protectedVariants);
1064
1130
  }
1065
1131
  }
1132
+ if (computedDefaultCount > 0) {
1133
+ const computedResult = runComputedDefaults(workingResolved, defaultResolved, userVariantProps, filterOwnVariants, protectedVariantKeys);
1134
+ workingResolved = computedResult.workingResolved;
1135
+ changedVariants = computedResult.changedVariants;
1136
+ }
1137
+ if (refine) {
1138
+ const refineResult = runRefineContext(workingResolved, userVariantProps, filterOwnVariants, false, true, protectedVariants, pendingProtectedVariants, protectedVariantKeys);
1139
+ workingResolved = refineResult.workingResolved;
1140
+ if (refineResult.changedVariants) {
1141
+ changedVariants ??= {};
1142
+ Object.assign(changedVariants, refineResult.changedVariants);
1143
+ }
1144
+ }
1066
1145
  return workingResolved;
1067
1146
  };
1068
- const resolveRefine = refine || extMetasWithRefineCount > 0 ? (resolved, userVariantProps, filterOwnVariants = true, runState, protectedVariants, pendingProtectedVariants, protectedVariantKeys) => {
1147
+ const resolveRefine = refine || computedDefaultCount > 0 || extMetasWithRefineCount > 0 ? (resolved, userVariantProps, filterOwnVariants = true, runState, protectedVariants, pendingProtectedVariants, protectedVariantKeys, incomingDefaultResolved = resolved) => {
1069
1148
  runState ??= { remaining: MAX_REFINE_RUNS };
1070
1149
  protectedVariants ??= {};
1071
1150
  protectedVariantKeys ??= /* @__PURE__ */ new Set();
@@ -1075,7 +1154,8 @@ function create({ transformClass = (className) => className } = {}) {
1075
1154
  while (runState.remaining > 0) {
1076
1155
  runState.remaining -= 1;
1077
1156
  const nextPendingProtectedVariants = {};
1078
- const nextResolved = resolveRefineOnce(workingResolved, userVariantProps, filterOwnVariants, runState, protectedVariants, nextPendingProtectedVariants, protectedVariantKeys);
1157
+ const defaultResolved = mergeProtectedIntoBase(incomingDefaultResolved, protectedVariants);
1158
+ const nextResolved = resolveRefineOnce(workingResolved, userVariantProps, filterOwnVariants, runState, protectedVariants, nextPendingProtectedVariants, protectedVariantKeys, defaultResolved);
1079
1159
  let protectedChanged;
1080
1160
  if (pendingProtectedVariants) protectedChanged = mergeVariants(pendingProtectedVariants, nextPendingProtectedVariants, protectedVariantKeys);
1081
1161
  else protectedChanged = mergeVariants(protectedVariants, nextPendingProtectedVariants, protectedVariantKeys);
@@ -1102,19 +1182,12 @@ function create({ transformClass = (className) => className } = {}) {
1102
1182
  let resolved = {};
1103
1183
  Object.assign(resolved, staticDefaults);
1104
1184
  let userVariantProps;
1105
- if (extMetasWithRefineCount > 0) {
1185
+ if (refine || computedDefaultCount > 0 || extMetasWithRefineCount > 0) {
1106
1186
  const variantProps = {};
1107
1187
  for (let i = 0; i < variantKeysLength; i++) {
1108
1188
  const key = variantKeys[i];
1109
1189
  if (Object.hasOwn(propsRecord, key)) variantProps[key] = propsRecord[key];
1110
1190
  }
1111
- for (let i = 0; i < extMetasWithRefineCount; i++) {
1112
- const extDefaults = extMetasWithRefine[i].resolveDefaults(resolved, variantProps);
1113
- for (const k in extDefaults) {
1114
- if (!Object.hasOwn(extDefaults, k)) continue;
1115
- resolved[k] = extDefaults[k];
1116
- }
1117
- }
1118
1191
  for (const k in variantProps) {
1119
1192
  if (!Object.hasOwn(variantProps, k)) continue;
1120
1193
  const v = variantProps[k];
@@ -1173,11 +1246,11 @@ function create({ transformClass = (className) => className } = {}) {
1173
1246
  const meta = {
1174
1247
  baseClass: computedBaseClass,
1175
1248
  staticDefaults,
1176
- resolveDefaults: resolveDefaultsFn,
1177
1249
  compute,
1178
1250
  resolveRefine,
1179
1251
  transformClass,
1180
- functionVariantKeys
1252
+ functionVariantKeys,
1253
+ computedDefaultKeys
1181
1254
  };
1182
1255
  const initComponent = (c, propKeys, style) => {
1183
1256
  c.class = classFn;
@@ -1244,7 +1317,6 @@ function create({ transformClass = (className) => className } = {}) {
1244
1317
  cx
1245
1318
  };
1246
1319
  }
1247
- function noop() {}
1248
1320
  const { cv, cx } = create();
1249
1321
  //#endregion
1250
1322
  export { create, cv, cx, splitProps };