@plumeria/utils 18.2.13 → 18.2.15

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/create.d.ts CHANGED
@@ -4,4 +4,4 @@ export interface StyleRecord {
4
4
  hash: string;
5
5
  sheet: string;
6
6
  }
7
- export declare function getStyleRecords(styleRule: CSSProperties): StyleRecord[];
7
+ export declare function getStyleRecords(styleRule: CSSProperties, weights?: Record<string, number>): StyleRecord[];
package/dist/create.js CHANGED
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getStyleRecords = getStyleRecords;
4
4
  const zss_engine_1 = require("zss-engine");
5
- function getStyleRecords(styleRule) {
5
+ function getStyleRecords(styleRule, weights) {
6
6
  const flat = {};
7
7
  const nonFlat = {};
8
8
  const notNormalize = ':not(#\\#)';
@@ -69,18 +69,21 @@ function getStyleRecords(styleRule) {
69
69
  else {
70
70
  hashSource = { [selector]: hashSource };
71
71
  }
72
- const hash = (0, zss_engine_1.genBase36Hash)(hashSource, 1, 8);
72
+ const key = atRule
73
+ ? `${atRule}:${selector}:${prop}`
74
+ : `${selector}:${prop}`;
75
+ const weight = weights?.[key] ?? 0;
76
+ const hash = (0, zss_engine_1.genBase36Hash)(weight > 0 ? [hashSource, weight] : hashSource, 1, 8);
73
77
  const conditionDepth = 1 + (atRule ? 1 : 0);
74
- const notSuffix = prop.startsWith('--')
75
- ? ''
76
- : notNormalize.repeat(conditionDepth);
78
+ const stateDepth = prop.startsWith('--') ? 0 : conditionDepth;
79
+ const notSuffix = notNormalize.repeat(stateDepth + weight);
77
80
  let sheet = (0, zss_engine_1.transpileAtomic)(prop, value, hash, selector);
78
81
  sheet = sheet.replace(`.${hash}`, `.${hash}${notSuffix}`);
79
82
  if (atRule) {
80
83
  sheet = `${atRule} { ${sheet} }`;
81
84
  }
82
85
  records.push({
83
- key: atRule ? `${atRule}:${selector}:${prop}` : `${selector}:${prop}`,
86
+ key,
84
87
  hash,
85
88
  sheet: sheet + '\n',
86
89
  });
@@ -0,0 +1,6 @@
1
+ import type { CSSProperties } from 'zss-engine';
2
+ export interface StyleSource {
3
+ order: number;
4
+ style: CSSProperties;
5
+ }
6
+ export declare function getStateWeights(sources: StyleSource[]): Record<string, number>;
@@ -0,0 +1,148 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getStateWeights = getStateWeights;
4
+ const zss_engine_1 = require("zss-engine");
5
+ const SHORTHANDS_OF = {};
6
+ for (const [shorthand, longhands] of Object.entries(zss_engine_1.DIRECT_LONGHANDS)) {
7
+ for (const longhand of longhands) {
8
+ (SHORTHANDS_OF[longhand] ??= []).push(shorthand);
9
+ }
10
+ }
11
+ const depthCache = new Map();
12
+ const propertyDepth = (property) => {
13
+ const cached = depthCache.get(property);
14
+ if (cached !== undefined)
15
+ return cached;
16
+ depthCache.set(property, 0);
17
+ let depth = 0;
18
+ for (const shorthand of SHORTHANDS_OF[property] ?? []) {
19
+ depth = Math.max(depth, propertyDepth(shorthand) + 1);
20
+ }
21
+ depthCache.set(property, depth);
22
+ return depth;
23
+ };
24
+ const covers = (shorthand, longhand) => {
25
+ const seen = new Set();
26
+ const queue = [...(zss_engine_1.DIRECT_LONGHANDS[shorthand] ?? [])];
27
+ while (queue.length) {
28
+ const current = queue.shift();
29
+ if (current === longhand)
30
+ return true;
31
+ if (seen.has(current))
32
+ continue;
33
+ seen.add(current);
34
+ queue.push(...(zss_engine_1.DIRECT_LONGHANDS[current] ?? []));
35
+ }
36
+ return false;
37
+ };
38
+ const conflicts = (a, b) => a === b || covers(a, b) || covers(b, a);
39
+ const compare = (a, b) => a[0] - b[0] || a[1] - b[1] || a[2] - b[2];
40
+ const weighted = (base, weight) => [
41
+ base[0] + weight,
42
+ base[1],
43
+ base[2],
44
+ ];
45
+ function getStateWeights(sources) {
46
+ const atoms = [];
47
+ const byKey = new Map();
48
+ const lastOrder = new Map();
49
+ const collect = (selector, style, atRule, order) => {
50
+ const specificity = (0, zss_engine_1.getSpecificity)(selector);
51
+ const pseudoElement = (0, zss_engine_1.getPseudoElement)(selector);
52
+ Object.entries(style).forEach(([prop, value]) => {
53
+ if (typeof value !== 'string' && typeof value !== 'number')
54
+ return;
55
+ const property = (0, zss_engine_1.camelToKebabCase)(prop);
56
+ const conditionDepth = prop.startsWith('--') ? 0 : 1 + (atRule ? 1 : 0);
57
+ const target = `${atRule}|${pseudoElement}`;
58
+ const group = `${target}|${specificity.join(',')}|${property}`;
59
+ const seat = `${group}|${selector}`;
60
+ const key = atRule
61
+ ? `${atRule}:${selector}:${prop}`
62
+ : `${selector}:${prop}`;
63
+ lastOrder.set(seat, Math.max(lastOrder.get(seat) ?? -1, order));
64
+ if (byKey.has(key))
65
+ return;
66
+ const atom = {
67
+ key,
68
+ seat,
69
+ group,
70
+ target,
71
+ property,
72
+ base: [
73
+ conditionDepth + propertyDepth(property) + specificity[0],
74
+ 1 + specificity[1],
75
+ specificity[2],
76
+ ],
77
+ };
78
+ atoms.push(atom);
79
+ byKey.set(key, atom);
80
+ });
81
+ };
82
+ sources.forEach(({ order, style }) => {
83
+ Object.entries(style).forEach(([key, value]) => {
84
+ if (!value || typeof value !== 'object')
85
+ return;
86
+ if ((0, zss_engine_1.isAtRule)(key)) {
87
+ Object.entries(value).forEach(([inner, nested]) => {
88
+ if (nested && typeof nested === 'object') {
89
+ collect(inner, nested, key, order);
90
+ }
91
+ });
92
+ return;
93
+ }
94
+ collect(key, value, '', order);
95
+ });
96
+ });
97
+ const weights = {};
98
+ const groups = new Map();
99
+ atoms.forEach((atom) => {
100
+ const members = groups.get(atom.group);
101
+ if (members)
102
+ members.push(atom);
103
+ else
104
+ groups.set(atom.group, [atom]);
105
+ });
106
+ groups.forEach((members) => {
107
+ if (members.length < 2)
108
+ return;
109
+ const seatOrders = members.map((member) => lastOrder.get(member.seat));
110
+ const ranks = [...new Set(seatOrders)].sort((a, b) => a - b);
111
+ if (ranks.length < 2)
112
+ return;
113
+ members.forEach((member, position) => {
114
+ const rank = ranks.indexOf(seatOrders[position]);
115
+ if (rank > 0)
116
+ weights[member.key] = rank;
117
+ });
118
+ });
119
+ if (Object.keys(weights).length === 0)
120
+ return weights;
121
+ for (let pass = 0; pass < atoms.length; pass++) {
122
+ let repaired = false;
123
+ atoms.forEach((above) => {
124
+ atoms.forEach((below) => {
125
+ if (above === below)
126
+ return;
127
+ if (above.target !== below.target)
128
+ return;
129
+ if (!conflicts(above.property, below.property))
130
+ return;
131
+ if (compare(above.base, below.base) <= 0)
132
+ return;
133
+ const aboveWeight = weights[above.key] ?? 0;
134
+ const post = weighted(above.base, aboveWeight);
135
+ const rival = weighted(below.base, weights[below.key] ?? 0);
136
+ if (compare(post, rival) > 0)
137
+ return;
138
+ const outranksOnRest = compare([0, post[1], post[2]], [0, rival[1], rival[2]]) > 0;
139
+ weights[above.key] =
140
+ aboveWeight + (rival[0] - post[0]) + (outranksOnRest ? 0 : 1);
141
+ repaired = true;
142
+ });
143
+ });
144
+ if (!repaired)
145
+ break;
146
+ }
147
+ return weights;
148
+ }
package/dist/index.d.ts CHANGED
@@ -2,6 +2,10 @@ export type { CSSObject, StaticTable, KeyframesHashTable, ViewTransitionHashTabl
2
2
  export { objectExpressionToObject, collectLocalConsts, traverse, t, getRootIdentifier, extractOndemandStyles, deepMerge, scanAll, getFileDependencies, resolveExport, resolveComponentKey, } from './parser';
3
3
  export type { StyleRecord } from './create';
4
4
  export { getStyleRecords } from './create';
5
+ export type { Specificity } from 'zss-engine';
6
+ export { getSpecificity, getPseudoElement } from 'zss-engine';
7
+ export type { StyleSource } from './escalation';
8
+ export { getStateWeights } from './escalation';
5
9
  export { createTheme } from './createTheme';
6
10
  export { resolveImportPath } from './resolver';
7
11
  export { optimizer } from './optimizer';
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DEFAULT_STYLE_PROP = exports.timedAsync = exports.timed = exports.tally = exports.measure = exports.mark = exports.profiling = exports.collectReferenceIdentifiers = exports.getLeadingCommentLength = exports.processVariants = exports.optimizer = exports.resolveImportPath = exports.createTheme = exports.getStyleRecords = exports.resolveComponentKey = exports.resolveExport = exports.getFileDependencies = exports.scanAll = exports.deepMerge = exports.extractOndemandStyles = exports.getRootIdentifier = exports.t = exports.traverse = exports.collectLocalConsts = exports.objectExpressionToObject = void 0;
3
+ exports.DEFAULT_STYLE_PROP = exports.timedAsync = exports.timed = exports.tally = exports.measure = exports.mark = exports.profiling = exports.collectReferenceIdentifiers = exports.getLeadingCommentLength = exports.processVariants = exports.optimizer = exports.resolveImportPath = exports.createTheme = exports.getStateWeights = exports.getPseudoElement = exports.getSpecificity = exports.getStyleRecords = exports.resolveComponentKey = exports.resolveExport = exports.getFileDependencies = exports.scanAll = exports.deepMerge = exports.extractOndemandStyles = exports.getRootIdentifier = exports.t = exports.traverse = exports.collectLocalConsts = exports.objectExpressionToObject = void 0;
4
4
  var parser_1 = require("./parser");
5
5
  Object.defineProperty(exports, "objectExpressionToObject", { enumerable: true, get: function () { return parser_1.objectExpressionToObject; } });
6
6
  Object.defineProperty(exports, "collectLocalConsts", { enumerable: true, get: function () { return parser_1.collectLocalConsts; } });
@@ -15,6 +15,11 @@ Object.defineProperty(exports, "resolveExport", { enumerable: true, get: functio
15
15
  Object.defineProperty(exports, "resolveComponentKey", { enumerable: true, get: function () { return parser_1.resolveComponentKey; } });
16
16
  var create_1 = require("./create");
17
17
  Object.defineProperty(exports, "getStyleRecords", { enumerable: true, get: function () { return create_1.getStyleRecords; } });
18
+ var zss_engine_1 = require("zss-engine");
19
+ Object.defineProperty(exports, "getSpecificity", { enumerable: true, get: function () { return zss_engine_1.getSpecificity; } });
20
+ Object.defineProperty(exports, "getPseudoElement", { enumerable: true, get: function () { return zss_engine_1.getPseudoElement; } });
21
+ var escalation_1 = require("./escalation");
22
+ Object.defineProperty(exports, "getStateWeights", { enumerable: true, get: function () { return escalation_1.getStateWeights; } });
18
23
  var createTheme_1 = require("./createTheme");
19
24
  Object.defineProperty(exports, "createTheme", { enumerable: true, get: function () { return createTheme_1.createTheme; } });
20
25
  var resolver_1 = require("./resolver");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plumeria/utils",
3
- "version": "18.2.13",
3
+ "version": "18.2.15",
4
4
  "description": "Plumeria Utils",
5
5
  "author": "Refirst 11",
6
6
  "license": "MIT",
@@ -25,7 +25,7 @@
25
25
  "@swc/core": "1.15.47",
26
26
  "lightningcss": "^1.32.0",
27
27
  "postcss": "8.5.25",
28
- "zss-engine": "2.5.0"
28
+ "zss-engine": "2.6.0"
29
29
  },
30
30
  "publishConfig": {
31
31
  "access": "public",