@vitus-labs/rocketstyle 2.0.0-alpha.26 → 2.0.0-alpha.27

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/lib/index.d.ts CHANGED
@@ -35,6 +35,11 @@ declare const DEFAULT_DIMENSIONS: {
35
35
  readonly propName: "multiple";
36
36
  readonly multi: true;
37
37
  };
38
+ readonly modifiers: {
39
+ readonly propName: "modifier";
40
+ readonly multi: true;
41
+ readonly transform: true;
42
+ };
38
43
  };
39
44
  type DefaultDimensions = typeof DEFAULT_DIMENSIONS;
40
45
  //#endregion
@@ -129,16 +134,17 @@ type ExtractDimensionMulti<T extends DimensionValue> = T extends DimensionValueO
129
134
  type DimensionValuePrimitive = string;
130
135
  type DimensionValueObj = {
131
136
  propName: string;
132
- multi?: boolean;
137
+ multi?: boolean; /** When true, this dimension is evaluated last and its values receive the accumulated theme as argument. */
138
+ transform?: boolean;
133
139
  };
134
140
  type DimensionValue = DimensionValuePrimitive | DimensionValueObj;
135
141
  type Dimensions = Record<string, DimensionValue>;
136
142
  type MultiKeys<T extends Dimensions = Dimensions> = Partial<Record<ExtractDimensionKey<T[keyof T]>, true>>;
137
143
  type DeepPartial<T> = { [K in keyof T]?: T[K] extends ((...args: any[]) => any) ? T[K] : NonNullable<T[K]> extends Record<string, any> ? DeepPartial<NonNullable<T[K]>> | Extract<T[K], null> : T[K] };
138
- type DimensionResult<CT> = Record<string, boolean | null | DeepPartial<CT>>;
139
- type DimensionObj<CT> = DimensionResult<CT>;
140
- type DimensionCb<T, CT> = (theme: T, mode: ThemeModeCallback, css: Css) => DimensionResult<CT>;
141
- type DimensionCallbackParam<T, CT> = DimensionObj<CT> | DimensionCb<T, CT>;
144
+ type DimensionResult<CT, T = any> = Record<string, boolean | null | DeepPartial<CT> | ((theme: CT, appTheme: T, mode: ThemeModeCallback, css: Css) => DeepPartial<CT>)>;
145
+ type DimensionObj<CT, T = any> = DimensionResult<CT, T>;
146
+ type DimensionCb<T, CT> = (theme: T, mode: ThemeModeCallback, css: Css) => DimensionResult<CT, T>;
147
+ type DimensionCallbackParam<T, CT> = DimensionObj<CT, T> | DimensionCb<T, CT>;
142
148
  type TDKP = Record<ExtractDimensionKey<Dimensions[keyof Dimensions]>, Record<string, boolean | never | Record<string, boolean>> | unknown>;
143
149
  type DimensionProps<K extends DimensionValue, D extends Dimensions, P extends CallBackParam, DKP extends TDKP> = { [I in ExtractDimensionKey<D[keyof D]>]: I extends ExtractDimensionKey<K> ? ExtractNullableDimensionKeys<Spread<[DKP[I], NullableKeys<ReturnCbParam<P>>]>> : DKP[I] };
144
150
  type DimensionTypesHelper<DKP extends TDKP> = { [I in keyof DKP]: keyof DKP[I] };
@@ -181,6 +187,7 @@ type InitConfiguration<C, D> = {
181
187
  dimensionKeys: ArrayOfKeys<D>;
182
188
  dimensionValues: ArrayOfValues<D>;
183
189
  multiKeys: MultiKeys;
190
+ transformKeys: Partial<Record<string, true>>;
184
191
  };
185
192
  type Configuration<C = ElementType | unknown, D extends Dimensions = Dimensions> = InitConfiguration<C, D> & {
186
193
  provider?: boolean;
package/lib/index.js CHANGED
@@ -85,6 +85,11 @@ const DEFAULT_DIMENSIONS = {
85
85
  multiple: {
86
86
  propName: "multiple",
87
87
  multi: true
88
+ },
89
+ modifiers: {
90
+ propName: "modifier",
91
+ multi: true,
92
+ transform: true
88
93
  }
89
94
  };
90
95
 
@@ -393,6 +398,12 @@ const getMultipleDimensions = (obj) => getValues(obj).reduce((accumulator, value
393
398
  }
394
399
  return accumulator;
395
400
  }, {});
401
+ const getTransformDimensions = (obj) => getValues(obj).reduce((accumulator, value) => {
402
+ if (typeof value === "object") {
403
+ if (value.transform === true) accumulator[value.propName] = true;
404
+ }
405
+ return accumulator;
406
+ }, {});
396
407
 
397
408
  //#endregion
398
409
  //#region src/utils/statics.ts
@@ -442,15 +453,21 @@ const getDimensionThemes = (theme, options) => {
442
453
  return acc;
443
454
  }, result);
444
455
  };
445
- const getTheme = ({ rocketstate, themes, baseTheme }) => {
456
+ const getTheme = ({ rocketstate, themes, baseTheme, transformKeys, appTheme }) => {
446
457
  let finalTheme = { ...baseTheme };
458
+ const deferredTransforms = [];
447
459
  Object.entries(rocketstate).forEach(([key, value]) => {
448
460
  const keyTheme = themes[key];
449
- if (Array.isArray(value)) value.forEach((item) => {
450
- finalTheme = merge({}, finalTheme, keyTheme[item]);
451
- });
452
- else finalTheme = merge({}, finalTheme, keyTheme[value]);
461
+ const isTransform = transformKeys?.[key];
462
+ const mergeValue = (item) => {
463
+ const val = keyTheme[item];
464
+ if (isTransform && typeof val === "function") deferredTransforms.push(val);
465
+ else finalTheme = merge({}, finalTheme, val);
466
+ };
467
+ if (Array.isArray(value)) value.forEach(mergeValue);
468
+ else mergeValue(value);
453
469
  });
470
+ for (const transform of deferredTransforms) finalTheme = merge({}, finalTheme, transform(finalTheme, appTheme ?? {}, themeModeCallback, config.css));
454
471
  return finalTheme;
455
472
  };
456
473
  const getThemeByMode = (object, mode) => Object.keys(object).reduce((acc, key) => {
@@ -556,11 +573,14 @@ const rocketComponent = (options) => {
556
573
  const rocketstyle = useMemo(() => getTheme({
557
574
  rocketstate,
558
575
  themes: currentModeThemes,
559
- baseTheme: currentModeBaseTheme
576
+ baseTheme: currentModeBaseTheme,
577
+ transformKeys: options.transformKeys,
578
+ appTheme: theme
560
579
  }), [
561
580
  rsKey,
562
581
  currentModeThemes,
563
- currentModeBaseTheme
582
+ currentModeBaseTheme,
583
+ theme
564
584
  ]);
565
585
  const finalProps = {
566
586
  ...omit(mergeProps, [
@@ -672,6 +692,7 @@ const rocketstyle = ({ dimensions = DEFAULT_DIMENSIONS, useBooleans = true } = {
672
692
  dimensionKeys: getKeys(dimensions),
673
693
  dimensionValues: getDimensionsValues(dimensions),
674
694
  multiKeys: getMultipleDimensions(dimensions),
695
+ transformKeys: getTransformDimensions(dimensions),
675
696
  styled: true
676
697
  });
677
698
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vitus-labs/rocketstyle",
3
- "version": "2.0.0-alpha.26",
3
+ "version": "2.0.0-alpha.27",
4
4
  "license": "MIT",
5
5
  "author": "Vit Bokisch <vit@bokisch.cz>",
6
6
  "maintainers": [
@@ -64,16 +64,16 @@
64
64
  "version": "node ../../scripts/sync-peer-deps.mjs"
65
65
  },
66
66
  "peerDependencies": {
67
- "@vitus-labs/core": "2.0.0-alpha.25",
67
+ "@vitus-labs/core": "2.0.0-alpha.26",
68
68
  "react": ">= 19"
69
69
  },
70
70
  "devDependencies": {
71
- "@vitus-labs/core": "2.0.0-alpha.26",
72
- "@vitus-labs/elements": "2.0.0-alpha.26",
71
+ "@vitus-labs/core": "2.0.0-alpha.27",
72
+ "@vitus-labs/elements": "2.0.0-alpha.27",
73
73
  "@vitus-labs/tools-rolldown": "1.9.1-alpha.19",
74
74
  "@vitus-labs/tools-storybook": "1.9.1-alpha.19",
75
75
  "@vitus-labs/tools-typescript": "1.9.1-alpha.19",
76
- "@vitus-labs/unistyle": "2.0.0-alpha.26"
76
+ "@vitus-labs/unistyle": "2.0.0-alpha.27"
77
77
  },
78
- "gitHead": "69d22f18b093f86a0bee235356ef3064f90c2d40"
78
+ "gitHead": "6230c7b4eb1f8fe52bd47275cf72cdcab706cb45"
79
79
  }