@elastic/eui-theme-common 8.0.0 → 9.0.0-snapshot.1776170631053
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/cjs/global_styling/functions/math.d.ts +5 -0
- package/lib/cjs/global_styling/functions/math.js +134 -1
- package/lib/cjs/global_styling/functions/math.test.js +73 -0
- package/lib/cjs/global_styling/variables/buttons.d.ts +2 -0
- package/lib/cjs/global_styling/variables/colors.d.ts +7 -0
- package/lib/esm/global_styling/functions/math.d.ts +5 -0
- package/lib/esm/global_styling/functions/math.js +116 -1
- package/lib/esm/global_styling/functions/math.test.js +45 -0
- package/lib/esm/global_styling/variables/buttons.d.ts +2 -0
- package/lib/esm/global_styling/variables/colors.d.ts +7 -0
- package/package.json +4 -2
|
@@ -6,6 +6,11 @@
|
|
|
6
6
|
* mathWithUnits('4px', (x) => x / 2) = '2px';
|
|
7
7
|
* mathWithUnits(euiTheme.size.xs, (x) => x + 2) = '6px';
|
|
8
8
|
* mathWithUnits([euiTheme.size.l, euiTheme.size.s], (x, y) => x - y) = '16px';
|
|
9
|
+
*
|
|
10
|
+
* When any input contains a CSS var() reference, the callback is probed with
|
|
11
|
+
* test values to determine its linear coefficients, and an equivalent calc()
|
|
12
|
+
* expression is emitted instead:
|
|
13
|
+
* mathWithUnits('var(--size)', (x) => x / 2) = 'calc(var(--size) / 2)';
|
|
9
14
|
*/
|
|
10
15
|
declare type ValueTypes = string | number | undefined;
|
|
11
16
|
export declare const mathWithUnits: (values: ValueTypes | ValueTypes[], callback: (...args: number[]) => number, unit?: string) => string;
|
|
@@ -5,6 +5,12 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
value: true
|
|
6
6
|
});
|
|
7
7
|
exports.mathWithUnits = void 0;
|
|
8
|
+
function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
|
|
9
|
+
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
10
|
+
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
11
|
+
function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
|
|
12
|
+
function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
|
|
13
|
+
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
8
14
|
function _wrapRegExp() { _wrapRegExp = function _wrapRegExp(e, r) { return new BabelRegExp(e, void 0, r); }; var e = RegExp.prototype, r = new WeakMap(); function BabelRegExp(e, t, p) { var o = RegExp(e, t); return r.set(o, p || r.get(e)), _setPrototypeOf(o, BabelRegExp.prototype); } function buildGroups(e, t) { var p = r.get(t); return Object.keys(p).reduce(function (r, t) { var o = p[t]; if ("number" == typeof o) r[t] = e[o];else { for (var i = 0; void 0 === e[o[i]] && i + 1 < o.length;) i++; r[t] = e[o[i]]; } return r; }, Object.create(null)); } return _inherits(BabelRegExp, RegExp), BabelRegExp.prototype.exec = function (r) { var t = e.exec.call(this, r); if (t) { t.groups = buildGroups(t, this); var p = t.indices; p && (p.groups = buildGroups(p, this)); } return t; }, BabelRegExp.prototype[Symbol.replace] = function (t, p) { if ("string" == typeof p) { var o = r.get(this); return e[Symbol.replace].call(this, t, p.replace(/\$<([^>]+)>/g, function (e, r) { var t = o[r]; return "$" + (Array.isArray(t) ? t.join("$") : t); })); } if ("function" == typeof p) { var i = this; return e[Symbol.replace].call(this, t, function () { var e = arguments; return "object" != _typeof(e[e.length - 1]) && (e = [].slice.call(e)).push(buildGroups(e, i)), p.apply(this, e); }); } return e[Symbol.replace].call(this, t, p); }, _wrapRegExp.apply(this, arguments); }
|
|
9
15
|
function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); }
|
|
10
16
|
function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); }
|
|
@@ -24,12 +30,35 @@ function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf
|
|
|
24
30
|
* mathWithUnits('4px', (x) => x / 2) = '2px';
|
|
25
31
|
* mathWithUnits(euiTheme.size.xs, (x) => x + 2) = '6px';
|
|
26
32
|
* mathWithUnits([euiTheme.size.l, euiTheme.size.s], (x, y) => x - y) = '16px';
|
|
33
|
+
*
|
|
34
|
+
* When any input contains a CSS var() reference, the callback is probed with
|
|
35
|
+
* test values to determine its linear coefficients, and an equivalent calc()
|
|
36
|
+
* expression is emitted instead:
|
|
37
|
+
* mathWithUnits('var(--size)', (x) => x / 2) = 'calc(var(--size) / 2)';
|
|
27
38
|
*/
|
|
28
39
|
// Unfortunately, this is the CSSProperties[] type used for several euiTheme vars
|
|
29
40
|
|
|
41
|
+
// --- Temporary perf instrumentation ---
|
|
42
|
+
var _callCount = 0;
|
|
43
|
+
var _totalTime = 0;
|
|
44
|
+
// --- End instrumentation ---
|
|
45
|
+
|
|
30
46
|
var mathWithUnits = exports.mathWithUnits = function mathWithUnits(values, callback) {
|
|
31
47
|
var unit = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
|
|
48
|
+
var _t0 = performance.now();
|
|
49
|
+
_callCount++;
|
|
32
50
|
if (!Array.isArray(values)) values = [values];
|
|
51
|
+
|
|
52
|
+
// When any value is a CSS var() reference, emit a calc() expression
|
|
53
|
+
// instead of evaluating the callback in JS
|
|
54
|
+
if (values.some(function (v) {
|
|
55
|
+
return typeof v === 'string' && v.includes('var(');
|
|
56
|
+
})) {
|
|
57
|
+
var _elapsed2 = performance.now() - _t0;
|
|
58
|
+
_totalTime += _elapsed2;
|
|
59
|
+
console.log("mathWithUnits #".concat(_callCount, " (var path): ").concat(_elapsed2.toFixed(3), "ms | total: ").concat(_totalTime.toFixed(3), "ms"), values);
|
|
60
|
+
return _emitCalcForVars(values, callback, unit);
|
|
61
|
+
}
|
|
33
62
|
var foundNumericValues = [];
|
|
34
63
|
var foundUnit = '';
|
|
35
64
|
values.forEach(function (value) {
|
|
@@ -59,5 +88,109 @@ var mathWithUnits = exports.mathWithUnits = function mathWithUnits(values, callb
|
|
|
59
88
|
throw new Error('Invalid value type - pass a string or number');
|
|
60
89
|
}
|
|
61
90
|
});
|
|
62
|
-
|
|
91
|
+
var _result = "".concat(callback.apply(void 0, foundNumericValues)).concat(unit || foundUnit);
|
|
92
|
+
var _elapsed = performance.now() - _t0;
|
|
93
|
+
_totalTime += _elapsed;
|
|
94
|
+
console.log("mathWithUnits #".concat(_callCount, ": ").concat(_elapsed.toFixed(3), "ms | total: ").concat(_totalTime.toFixed(3), "ms"), values, '->', _result);
|
|
95
|
+
return _result;
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* When CSS var() references are present, probe the callback with test values
|
|
100
|
+
* to determine its linear coefficients, then emit an equivalent calc() expression.
|
|
101
|
+
*
|
|
102
|
+
* Only the var() positions are probed (at 0 vs 1). Literal values (numbers and
|
|
103
|
+
* parseable CSS strings) are fixed at their actual numeric values during probing,
|
|
104
|
+
* so callbacks like `(x, y) => x * y` work correctly when one arg is a literal.
|
|
105
|
+
*
|
|
106
|
+
* Assumes the callback is linear *in the var() arguments*.
|
|
107
|
+
*/
|
|
108
|
+
var _emitCalcForVars = function _emitCalcForVars(values, callback, overrideUnit) {
|
|
109
|
+
var n = values.length;
|
|
110
|
+
|
|
111
|
+
// Classify each value: is it a var() ref or a literal we can parse?
|
|
112
|
+
var isVar = [];
|
|
113
|
+
var baselineArgs = []; // Actual numeric values for literals, 0 for var refs
|
|
114
|
+
var cssUnit = overrideUnit;
|
|
115
|
+
for (var i = 0; i < n; i++) {
|
|
116
|
+
var v = values[i];
|
|
117
|
+
if (typeof v === 'string' && v.includes('var(')) {
|
|
118
|
+
isVar.push(true);
|
|
119
|
+
baselineArgs.push(0);
|
|
120
|
+
} else if (typeof v === 'number') {
|
|
121
|
+
isVar.push(false);
|
|
122
|
+
baselineArgs.push(v);
|
|
123
|
+
} else if (typeof v === 'string') {
|
|
124
|
+
isVar.push(false);
|
|
125
|
+
var match = /(-?[\d.]+)(%|[a-zA-Z]*)/.exec(v);
|
|
126
|
+
baselineArgs.push(Number(match === null || match === void 0 ? void 0 : match[1]) || 0);
|
|
127
|
+
if (!cssUnit && match !== null && match !== void 0 && match[2]) {
|
|
128
|
+
cssUnit = match[2];
|
|
129
|
+
}
|
|
130
|
+
} else {
|
|
131
|
+
isVar.push(false);
|
|
132
|
+
baselineArgs.push(0);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
if (!cssUnit) cssUnit = 'px';
|
|
136
|
+
|
|
137
|
+
// Probe: fix literal positions at their actual values,
|
|
138
|
+
// probe each var() position at 0 (baseline) then 1 to determine its coefficient
|
|
139
|
+
var constant = _preciseRound(callback.apply(void 0, baselineArgs));
|
|
140
|
+
var varIndices = [];
|
|
141
|
+
var coefficients = [];
|
|
142
|
+
for (var _i = 0; _i < n; _i++) {
|
|
143
|
+
if (!isVar[_i]) continue;
|
|
144
|
+
varIndices.push(_i);
|
|
145
|
+
var probe = [].concat(baselineArgs);
|
|
146
|
+
probe[_i] = 1;
|
|
147
|
+
coefficients.push(_preciseRound(callback.apply(void 0, _toConsumableArray(probe)) - constant));
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// Build calc() expression — only var() positions appear as variable terms
|
|
151
|
+
var varTerms = [];
|
|
152
|
+
for (var j = 0; j < varIndices.length; j++) {
|
|
153
|
+
var coeff = coefficients[j];
|
|
154
|
+
if (coeff === 0) continue;
|
|
155
|
+
var valueStr = String(values[varIndices[j]]);
|
|
156
|
+
if (varTerms.length === 0) {
|
|
157
|
+
varTerms.push(_formatTerm(coeff, valueStr));
|
|
158
|
+
} else if (coeff > 0) {
|
|
159
|
+
varTerms.push("+ ".concat(_formatTerm(coeff, valueStr)));
|
|
160
|
+
} else {
|
|
161
|
+
varTerms.push("- ".concat(_formatTerm(Math.abs(coeff), valueStr)));
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// If no var() terms contribute (callback ignores its input), return the constant directly
|
|
166
|
+
if (varTerms.length === 0) {
|
|
167
|
+
return constant === 0 ? "0".concat(cssUnit) : "".concat(constant).concat(cssUnit);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// Append constant if non-zero
|
|
171
|
+
if (constant !== 0) {
|
|
172
|
+
var cStr = "".concat(Math.abs(constant)).concat(cssUnit);
|
|
173
|
+
varTerms.push(constant > 0 ? "+ ".concat(cStr) : "- ".concat(cStr));
|
|
174
|
+
}
|
|
175
|
+
return "calc(".concat(varTerms.join(' '), ")");
|
|
176
|
+
};
|
|
177
|
+
|
|
178
|
+
/** Format a coefficient × value term for calc(). Coefficient may be negative for first terms. */
|
|
179
|
+
var _formatTerm = function _formatTerm(coeff, value) {
|
|
180
|
+
var absCoeff = Math.abs(coeff);
|
|
181
|
+
if (absCoeff === 1) {
|
|
182
|
+
return coeff < 0 ? "".concat(value, " * -1") : value;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// Use division for readability when coefficient is a simple reciprocal
|
|
186
|
+
var reciprocal = 1 / absCoeff;
|
|
187
|
+
if (Number.isInteger(reciprocal) && reciprocal > 1) {
|
|
188
|
+
return "".concat(value, " / ").concat(coeff < 0 ? -reciprocal : reciprocal);
|
|
189
|
+
}
|
|
190
|
+
return "".concat(coeff, " * ").concat(value);
|
|
191
|
+
};
|
|
192
|
+
|
|
193
|
+
/** Round to avoid floating-point artifacts from callback probing */
|
|
194
|
+
var _preciseRound = function _preciseRound(n) {
|
|
195
|
+
return Math.round(n * 1e10) / 1e10;
|
|
63
196
|
};
|
|
@@ -73,6 +73,79 @@ describe('mathWithUnits', function () {
|
|
|
73
73
|
}, 'px')).toEqual('10px');
|
|
74
74
|
});
|
|
75
75
|
});
|
|
76
|
+
describe('CSS var() references emit calc() expressions', function () {
|
|
77
|
+
test('single var with multiplication', function () {
|
|
78
|
+
expect((0, _math.mathWithUnits)('var(--size)', function (x) {
|
|
79
|
+
return x * 2;
|
|
80
|
+
})).toEqual('calc(2 * var(--size))');
|
|
81
|
+
});
|
|
82
|
+
test('single var with division', function () {
|
|
83
|
+
expect((0, _math.mathWithUnits)('var(--size)', function (x) {
|
|
84
|
+
return x / 2;
|
|
85
|
+
})).toEqual('calc(var(--size) / 2)');
|
|
86
|
+
});
|
|
87
|
+
test('single var with fractional multiplication', function () {
|
|
88
|
+
expect((0, _math.mathWithUnits)('var(--size)', function (x) {
|
|
89
|
+
return x * 0.75;
|
|
90
|
+
})).toEqual('calc(0.75 * var(--size))');
|
|
91
|
+
});
|
|
92
|
+
test('single var with addition', function () {
|
|
93
|
+
expect((0, _math.mathWithUnits)('var(--size)', function (x) {
|
|
94
|
+
return x + 2;
|
|
95
|
+
})).toEqual('calc(var(--size) + 2px)');
|
|
96
|
+
});
|
|
97
|
+
test('single var with negative division', function () {
|
|
98
|
+
expect((0, _math.mathWithUnits)('var(--size)', function (x) {
|
|
99
|
+
return x / -2;
|
|
100
|
+
})).toEqual('calc(var(--size) / -2)');
|
|
101
|
+
});
|
|
102
|
+
test('single var identity', function () {
|
|
103
|
+
expect((0, _math.mathWithUnits)('var(--size)', function (x) {
|
|
104
|
+
return x;
|
|
105
|
+
})).toEqual('calc(var(--size))');
|
|
106
|
+
});
|
|
107
|
+
test('multiple vars with subtraction', function () {
|
|
108
|
+
expect((0, _math.mathWithUnits)(['var(--a)', 'var(--b)'], function (x, y) {
|
|
109
|
+
return x - y;
|
|
110
|
+
})).toEqual('calc(var(--a) - var(--b))');
|
|
111
|
+
});
|
|
112
|
+
test('multiple vars with complex linear', function () {
|
|
113
|
+
expect((0, _math.mathWithUnits)(['var(--a)', 'var(--b)'], function (x, y) {
|
|
114
|
+
return x - 3 * y;
|
|
115
|
+
})).toEqual('calc(var(--a) - 3 * var(--b))');
|
|
116
|
+
});
|
|
117
|
+
test('mixed var and literal', function () {
|
|
118
|
+
expect((0, _math.mathWithUnits)(['var(--a)', '4px'], function (x, y) {
|
|
119
|
+
return x + y;
|
|
120
|
+
})).toEqual('calc(var(--a) + 4px)');
|
|
121
|
+
});
|
|
122
|
+
test('unit detection from literal input', function () {
|
|
123
|
+
expect((0, _math.mathWithUnits)(['var(--a)', '2rem'], function (x, y) {
|
|
124
|
+
return x + y;
|
|
125
|
+
})).toEqual('calc(var(--a) + 2rem)');
|
|
126
|
+
});
|
|
127
|
+
test('override unit is respected', function () {
|
|
128
|
+
expect((0, _math.mathWithUnits)('var(--size)', function (x) {
|
|
129
|
+
return x + 4;
|
|
130
|
+
}, '%')).toEqual('calc(var(--size) + 4%)');
|
|
131
|
+
});
|
|
132
|
+
test('constant-only result', function () {
|
|
133
|
+
expect((0, _math.mathWithUnits)('var(--size)', function (_x) {
|
|
134
|
+
return 16;
|
|
135
|
+
})).toEqual('16px');
|
|
136
|
+
});
|
|
137
|
+
test('var mixed with number input — multiplication', function () {
|
|
138
|
+
expect((0, _math.mathWithUnits)(['var(--size)', 3], function (x, y) {
|
|
139
|
+
return x * y;
|
|
140
|
+
})).toEqual('calc(3 * var(--size))');
|
|
141
|
+
});
|
|
142
|
+
test('var mixed with number input — addition with closure', function () {
|
|
143
|
+
var base = 16;
|
|
144
|
+
expect((0, _math.mathWithUnits)('var(--size)', function (x) {
|
|
145
|
+
return x + base;
|
|
146
|
+
})).toEqual('calc(var(--size) + 16px)');
|
|
147
|
+
});
|
|
148
|
+
});
|
|
76
149
|
describe('weird edge cases', function () {
|
|
77
150
|
it('throws on undefined', function () {
|
|
78
151
|
expect(function () {
|
|
@@ -18,6 +18,7 @@ export declare type _EuiThemeButtonColors = {
|
|
|
18
18
|
backgroundWarningHover: ColorModeSwitch;
|
|
19
19
|
backgroundRiskHover: ColorModeSwitch;
|
|
20
20
|
backgroundDangerHover: ColorModeSwitch;
|
|
21
|
+
backgroundAssistanceHover: ColorModeSwitch;
|
|
21
22
|
backgroundTextHover: ColorModeSwitch;
|
|
22
23
|
backgroundPrimaryActive: ColorModeSwitch;
|
|
23
24
|
backgroundAccentActive: ColorModeSwitch;
|
|
@@ -46,6 +47,7 @@ export declare type _EuiThemeButtonColors = {
|
|
|
46
47
|
backgroundFilledWarningHover: ColorModeSwitch;
|
|
47
48
|
backgroundFilledRiskHover: ColorModeSwitch;
|
|
48
49
|
backgroundFilledDangerHover: ColorModeSwitch;
|
|
50
|
+
backgroundFilledAssistanceHover: ColorModeSwitch;
|
|
49
51
|
backgroundFilledTextHover: ColorModeSwitch;
|
|
50
52
|
backgroundFilledPrimaryActive: ColorModeSwitch;
|
|
51
53
|
backgroundFilledAccentActive: ColorModeSwitch;
|
|
@@ -65,6 +65,7 @@ export declare type _EuiThemeBrandTextColors = {
|
|
|
65
65
|
textWarning: ColorModeSwitch;
|
|
66
66
|
textRisk: ColorModeSwitch;
|
|
67
67
|
textDanger: ColorModeSwitch;
|
|
68
|
+
textAssistance: ColorModeSwitch;
|
|
68
69
|
};
|
|
69
70
|
export declare type _EuiThemeShadeColors = {
|
|
70
71
|
/**
|
|
@@ -167,6 +168,7 @@ export declare type _EuiThemeBackgroundColors = {
|
|
|
167
168
|
backgroundBaseWarning: ColorModeSwitch;
|
|
168
169
|
backgroundBaseRisk: ColorModeSwitch;
|
|
169
170
|
backgroundBaseDanger: ColorModeSwitch;
|
|
171
|
+
backgroundBaseAssistance: ColorModeSwitch;
|
|
170
172
|
backgroundBaseSubdued: ColorModeSwitch;
|
|
171
173
|
backgroundBasePlain: ColorModeSwitch;
|
|
172
174
|
backgroundBaseDisabled: ColorModeSwitch;
|
|
@@ -174,6 +176,7 @@ export declare type _EuiThemeBackgroundColors = {
|
|
|
174
176
|
backgroundBaseFormsPrepend: ColorModeSwitch;
|
|
175
177
|
backgroundBaseFormsControlDisabled: ColorModeSwitch;
|
|
176
178
|
backgroundBaseInteractiveHover: ColorModeSwitch;
|
|
179
|
+
backgroundBaseInteractiveHoverAssistance: ColorModeSwitch;
|
|
177
180
|
backgroundBaseInteractiveSelect: ColorModeSwitch;
|
|
178
181
|
backgroundBaseInteractiveSelectHover: ColorModeSwitch;
|
|
179
182
|
backgroundBaseInteractiveOverlay: ColorModeSwitch;
|
|
@@ -187,6 +190,7 @@ export declare type _EuiThemeBackgroundColors = {
|
|
|
187
190
|
backgroundLightWarning: ColorModeSwitch;
|
|
188
191
|
backgroundLightRisk: ColorModeSwitch;
|
|
189
192
|
backgroundLightDanger: ColorModeSwitch;
|
|
193
|
+
backgroundLightAssistance: ColorModeSwitch;
|
|
190
194
|
backgroundLightText: ColorModeSwitch;
|
|
191
195
|
backgroundFilledPrimary: ColorModeSwitch;
|
|
192
196
|
backgroundFilledAccent: ColorModeSwitch;
|
|
@@ -196,6 +200,7 @@ export declare type _EuiThemeBackgroundColors = {
|
|
|
196
200
|
backgroundFilledWarning: ColorModeSwitch;
|
|
197
201
|
backgroundFilledRisk: ColorModeSwitch;
|
|
198
202
|
backgroundFilledDanger: ColorModeSwitch;
|
|
203
|
+
backgroundFilledAssistance: ColorModeSwitch;
|
|
199
204
|
backgroundFilledText: ColorModeSwitch;
|
|
200
205
|
};
|
|
201
206
|
/** TODO: remove once usages are re-mapped */
|
|
@@ -234,6 +239,7 @@ export declare type _EuiThemeBorderColors = {
|
|
|
234
239
|
borderBaseWarning: ColorModeSwitch;
|
|
235
240
|
borderBaseRisk: ColorModeSwitch;
|
|
236
241
|
borderBaseDanger: ColorModeSwitch;
|
|
242
|
+
borderBaseAssistance: ColorModeSwitch;
|
|
237
243
|
borderBasePlain: ColorModeSwitch;
|
|
238
244
|
borderBaseSubdued: ColorModeSwitch;
|
|
239
245
|
borderBaseProminent: ColorModeSwitch;
|
|
@@ -255,6 +261,7 @@ export declare type _EuiThemeBorderColors = {
|
|
|
255
261
|
borderStrongWarning: ColorModeSwitch;
|
|
256
262
|
borderStrongRisk: ColorModeSwitch;
|
|
257
263
|
borderStrongDanger: ColorModeSwitch;
|
|
264
|
+
borderStrongAssistance: ColorModeSwitch;
|
|
258
265
|
borderStrongText: ColorModeSwitch;
|
|
259
266
|
};
|
|
260
267
|
export declare type _EuiThemeVisColors = {
|
|
@@ -6,6 +6,11 @@
|
|
|
6
6
|
* mathWithUnits('4px', (x) => x / 2) = '2px';
|
|
7
7
|
* mathWithUnits(euiTheme.size.xs, (x) => x + 2) = '6px';
|
|
8
8
|
* mathWithUnits([euiTheme.size.l, euiTheme.size.s], (x, y) => x - y) = '16px';
|
|
9
|
+
*
|
|
10
|
+
* When any input contains a CSS var() reference, the callback is probed with
|
|
11
|
+
* test values to determine its linear coefficients, and an equivalent calc()
|
|
12
|
+
* expression is emitted instead:
|
|
13
|
+
* mathWithUnits('var(--size)', (x) => x / 2) = 'calc(var(--size) / 2)';
|
|
9
14
|
*/
|
|
10
15
|
declare type ValueTypes = string | number | undefined;
|
|
11
16
|
export declare const mathWithUnits: (values: ValueTypes | ValueTypes[], callback: (...args: number[]) => number, unit?: string) => string;
|
|
@@ -5,12 +5,26 @@
|
|
|
5
5
|
* in compliance with, at your election, the Elastic License 2.0 or the Server
|
|
6
6
|
* Side Public License, v 1.
|
|
7
7
|
*/
|
|
8
|
+
// --- Temporary perf instrumentation ---
|
|
9
|
+
let _callCount = 0;
|
|
10
|
+
let _totalTime = 0;
|
|
11
|
+
// --- End instrumentation ---
|
|
8
12
|
export const mathWithUnits = (values, // Can accept a single input or array of inputs
|
|
9
13
|
callback, // Can be multiplication, division, addition, etc.
|
|
10
14
|
unit = '' // Optional: allow specifying an override unit to return
|
|
11
15
|
) => {
|
|
16
|
+
const _t0 = performance.now();
|
|
17
|
+
_callCount++;
|
|
12
18
|
if (!Array.isArray(values))
|
|
13
19
|
values = [values];
|
|
20
|
+
// When any value is a CSS var() reference, emit a calc() expression
|
|
21
|
+
// instead of evaluating the callback in JS
|
|
22
|
+
if (values.some((v) => typeof v === 'string' && v.includes('var('))) {
|
|
23
|
+
const _elapsed = performance.now() - _t0;
|
|
24
|
+
_totalTime += _elapsed;
|
|
25
|
+
console.log(`mathWithUnits #${_callCount} (var path): ${_elapsed.toFixed(3)}ms | total: ${_totalTime.toFixed(3)}ms`, values);
|
|
26
|
+
return _emitCalcForVars(values, callback, unit);
|
|
27
|
+
}
|
|
14
28
|
const foundNumericValues = [];
|
|
15
29
|
let foundUnit = '';
|
|
16
30
|
values.forEach((value) => {
|
|
@@ -40,5 +54,106 @@ unit = '' // Optional: allow specifying an override unit to return
|
|
|
40
54
|
throw new Error('Invalid value type - pass a string or number');
|
|
41
55
|
}
|
|
42
56
|
});
|
|
43
|
-
|
|
57
|
+
const _result = `${callback(...foundNumericValues)}${unit || foundUnit}`;
|
|
58
|
+
const _elapsed = performance.now() - _t0;
|
|
59
|
+
_totalTime += _elapsed;
|
|
60
|
+
console.log(`mathWithUnits #${_callCount}: ${_elapsed.toFixed(3)}ms | total: ${_totalTime.toFixed(3)}ms`, values, '->', _result);
|
|
61
|
+
return _result;
|
|
44
62
|
};
|
|
63
|
+
/**
|
|
64
|
+
* When CSS var() references are present, probe the callback with test values
|
|
65
|
+
* to determine its linear coefficients, then emit an equivalent calc() expression.
|
|
66
|
+
*
|
|
67
|
+
* Only the var() positions are probed (at 0 vs 1). Literal values (numbers and
|
|
68
|
+
* parseable CSS strings) are fixed at their actual numeric values during probing,
|
|
69
|
+
* so callbacks like `(x, y) => x * y` work correctly when one arg is a literal.
|
|
70
|
+
*
|
|
71
|
+
* Assumes the callback is linear *in the var() arguments*.
|
|
72
|
+
*/
|
|
73
|
+
const _emitCalcForVars = (values, callback, overrideUnit) => {
|
|
74
|
+
const n = values.length;
|
|
75
|
+
// Classify each value: is it a var() ref or a literal we can parse?
|
|
76
|
+
const isVar = [];
|
|
77
|
+
const baselineArgs = []; // Actual numeric values for literals, 0 for var refs
|
|
78
|
+
let cssUnit = overrideUnit;
|
|
79
|
+
for (let i = 0; i < n; i++) {
|
|
80
|
+
const v = values[i];
|
|
81
|
+
if (typeof v === 'string' && v.includes('var(')) {
|
|
82
|
+
isVar.push(true);
|
|
83
|
+
baselineArgs.push(0);
|
|
84
|
+
}
|
|
85
|
+
else if (typeof v === 'number') {
|
|
86
|
+
isVar.push(false);
|
|
87
|
+
baselineArgs.push(v);
|
|
88
|
+
}
|
|
89
|
+
else if (typeof v === 'string') {
|
|
90
|
+
isVar.push(false);
|
|
91
|
+
const match = /(-?[\d.]+)(%|[a-zA-Z]*)/.exec(v);
|
|
92
|
+
baselineArgs.push(Number(match?.[1]) || 0);
|
|
93
|
+
if (!cssUnit && match?.[2]) {
|
|
94
|
+
cssUnit = match[2];
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
isVar.push(false);
|
|
99
|
+
baselineArgs.push(0);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
if (!cssUnit)
|
|
103
|
+
cssUnit = 'px';
|
|
104
|
+
// Probe: fix literal positions at their actual values,
|
|
105
|
+
// probe each var() position at 0 (baseline) then 1 to determine its coefficient
|
|
106
|
+
const constant = _preciseRound(callback(...baselineArgs));
|
|
107
|
+
const varIndices = [];
|
|
108
|
+
const coefficients = [];
|
|
109
|
+
for (let i = 0; i < n; i++) {
|
|
110
|
+
if (!isVar[i])
|
|
111
|
+
continue;
|
|
112
|
+
varIndices.push(i);
|
|
113
|
+
const probe = [...baselineArgs];
|
|
114
|
+
probe[i] = 1;
|
|
115
|
+
coefficients.push(_preciseRound(callback(...probe) - constant));
|
|
116
|
+
}
|
|
117
|
+
// Build calc() expression — only var() positions appear as variable terms
|
|
118
|
+
const varTerms = [];
|
|
119
|
+
for (let j = 0; j < varIndices.length; j++) {
|
|
120
|
+
const coeff = coefficients[j];
|
|
121
|
+
if (coeff === 0)
|
|
122
|
+
continue;
|
|
123
|
+
const valueStr = String(values[varIndices[j]]);
|
|
124
|
+
if (varTerms.length === 0) {
|
|
125
|
+
varTerms.push(_formatTerm(coeff, valueStr));
|
|
126
|
+
}
|
|
127
|
+
else if (coeff > 0) {
|
|
128
|
+
varTerms.push(`+ ${_formatTerm(coeff, valueStr)}`);
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
varTerms.push(`- ${_formatTerm(Math.abs(coeff), valueStr)}`);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
// If no var() terms contribute (callback ignores its input), return the constant directly
|
|
135
|
+
if (varTerms.length === 0) {
|
|
136
|
+
return constant === 0 ? `0${cssUnit}` : `${constant}${cssUnit}`;
|
|
137
|
+
}
|
|
138
|
+
// Append constant if non-zero
|
|
139
|
+
if (constant !== 0) {
|
|
140
|
+
const cStr = `${Math.abs(constant)}${cssUnit}`;
|
|
141
|
+
varTerms.push(constant > 0 ? `+ ${cStr}` : `- ${cStr}`);
|
|
142
|
+
}
|
|
143
|
+
return `calc(${varTerms.join(' ')})`;
|
|
144
|
+
};
|
|
145
|
+
/** Format a coefficient × value term for calc(). Coefficient may be negative for first terms. */
|
|
146
|
+
const _formatTerm = (coeff, value) => {
|
|
147
|
+
const absCoeff = Math.abs(coeff);
|
|
148
|
+
if (absCoeff === 1) {
|
|
149
|
+
return coeff < 0 ? `${value} * -1` : value;
|
|
150
|
+
}
|
|
151
|
+
// Use division for readability when coefficient is a simple reciprocal
|
|
152
|
+
const reciprocal = 1 / absCoeff;
|
|
153
|
+
if (Number.isInteger(reciprocal) && reciprocal > 1) {
|
|
154
|
+
return `${value} / ${coeff < 0 ? -reciprocal : reciprocal}`;
|
|
155
|
+
}
|
|
156
|
+
return `${coeff} * ${value}`;
|
|
157
|
+
};
|
|
158
|
+
/** Round to avoid floating-point artifacts from callback probing */
|
|
159
|
+
const _preciseRound = (n) => Math.round(n * 1e10) / 1e10;
|
|
@@ -46,6 +46,51 @@ describe('mathWithUnits', () => {
|
|
|
46
46
|
expect(mathWithUnits(['50%', '5rem'], (x, y) => x / y, 'px')).toEqual('10px');
|
|
47
47
|
});
|
|
48
48
|
});
|
|
49
|
+
describe('CSS var() references emit calc() expressions', () => {
|
|
50
|
+
test('single var with multiplication', () => {
|
|
51
|
+
expect(mathWithUnits('var(--size)', (x) => x * 2)).toEqual('calc(2 * var(--size))');
|
|
52
|
+
});
|
|
53
|
+
test('single var with division', () => {
|
|
54
|
+
expect(mathWithUnits('var(--size)', (x) => x / 2)).toEqual('calc(var(--size) / 2)');
|
|
55
|
+
});
|
|
56
|
+
test('single var with fractional multiplication', () => {
|
|
57
|
+
expect(mathWithUnits('var(--size)', (x) => x * 0.75)).toEqual('calc(0.75 * var(--size))');
|
|
58
|
+
});
|
|
59
|
+
test('single var with addition', () => {
|
|
60
|
+
expect(mathWithUnits('var(--size)', (x) => x + 2)).toEqual('calc(var(--size) + 2px)');
|
|
61
|
+
});
|
|
62
|
+
test('single var with negative division', () => {
|
|
63
|
+
expect(mathWithUnits('var(--size)', (x) => x / -2)).toEqual('calc(var(--size) / -2)');
|
|
64
|
+
});
|
|
65
|
+
test('single var identity', () => {
|
|
66
|
+
expect(mathWithUnits('var(--size)', (x) => x)).toEqual('calc(var(--size))');
|
|
67
|
+
});
|
|
68
|
+
test('multiple vars with subtraction', () => {
|
|
69
|
+
expect(mathWithUnits(['var(--a)', 'var(--b)'], (x, y) => x - y)).toEqual('calc(var(--a) - var(--b))');
|
|
70
|
+
});
|
|
71
|
+
test('multiple vars with complex linear', () => {
|
|
72
|
+
expect(mathWithUnits(['var(--a)', 'var(--b)'], (x, y) => x - 3 * y)).toEqual('calc(var(--a) - 3 * var(--b))');
|
|
73
|
+
});
|
|
74
|
+
test('mixed var and literal', () => {
|
|
75
|
+
expect(mathWithUnits(['var(--a)', '4px'], (x, y) => x + y)).toEqual('calc(var(--a) + 4px)');
|
|
76
|
+
});
|
|
77
|
+
test('unit detection from literal input', () => {
|
|
78
|
+
expect(mathWithUnits(['var(--a)', '2rem'], (x, y) => x + y)).toEqual('calc(var(--a) + 2rem)');
|
|
79
|
+
});
|
|
80
|
+
test('override unit is respected', () => {
|
|
81
|
+
expect(mathWithUnits('var(--size)', (x) => x + 4, '%')).toEqual('calc(var(--size) + 4%)');
|
|
82
|
+
});
|
|
83
|
+
test('constant-only result', () => {
|
|
84
|
+
expect(mathWithUnits('var(--size)', (_x) => 16)).toEqual('16px');
|
|
85
|
+
});
|
|
86
|
+
test('var mixed with number input — multiplication', () => {
|
|
87
|
+
expect(mathWithUnits(['var(--size)', 3], (x, y) => x * y)).toEqual('calc(3 * var(--size))');
|
|
88
|
+
});
|
|
89
|
+
test('var mixed with number input — addition with closure', () => {
|
|
90
|
+
const base = 16;
|
|
91
|
+
expect(mathWithUnits('var(--size)', (x) => x + base)).toEqual('calc(var(--size) + 16px)');
|
|
92
|
+
});
|
|
93
|
+
});
|
|
49
94
|
describe('weird edge cases', () => {
|
|
50
95
|
it('throws on undefined', () => {
|
|
51
96
|
expect(() => mathWithUnits(undefined, (x) => x * 3)).toThrow('Invalid value type');
|
|
@@ -18,6 +18,7 @@ export declare type _EuiThemeButtonColors = {
|
|
|
18
18
|
backgroundWarningHover: ColorModeSwitch;
|
|
19
19
|
backgroundRiskHover: ColorModeSwitch;
|
|
20
20
|
backgroundDangerHover: ColorModeSwitch;
|
|
21
|
+
backgroundAssistanceHover: ColorModeSwitch;
|
|
21
22
|
backgroundTextHover: ColorModeSwitch;
|
|
22
23
|
backgroundPrimaryActive: ColorModeSwitch;
|
|
23
24
|
backgroundAccentActive: ColorModeSwitch;
|
|
@@ -46,6 +47,7 @@ export declare type _EuiThemeButtonColors = {
|
|
|
46
47
|
backgroundFilledWarningHover: ColorModeSwitch;
|
|
47
48
|
backgroundFilledRiskHover: ColorModeSwitch;
|
|
48
49
|
backgroundFilledDangerHover: ColorModeSwitch;
|
|
50
|
+
backgroundFilledAssistanceHover: ColorModeSwitch;
|
|
49
51
|
backgroundFilledTextHover: ColorModeSwitch;
|
|
50
52
|
backgroundFilledPrimaryActive: ColorModeSwitch;
|
|
51
53
|
backgroundFilledAccentActive: ColorModeSwitch;
|
|
@@ -65,6 +65,7 @@ export declare type _EuiThemeBrandTextColors = {
|
|
|
65
65
|
textWarning: ColorModeSwitch;
|
|
66
66
|
textRisk: ColorModeSwitch;
|
|
67
67
|
textDanger: ColorModeSwitch;
|
|
68
|
+
textAssistance: ColorModeSwitch;
|
|
68
69
|
};
|
|
69
70
|
export declare type _EuiThemeShadeColors = {
|
|
70
71
|
/**
|
|
@@ -167,6 +168,7 @@ export declare type _EuiThemeBackgroundColors = {
|
|
|
167
168
|
backgroundBaseWarning: ColorModeSwitch;
|
|
168
169
|
backgroundBaseRisk: ColorModeSwitch;
|
|
169
170
|
backgroundBaseDanger: ColorModeSwitch;
|
|
171
|
+
backgroundBaseAssistance: ColorModeSwitch;
|
|
170
172
|
backgroundBaseSubdued: ColorModeSwitch;
|
|
171
173
|
backgroundBasePlain: ColorModeSwitch;
|
|
172
174
|
backgroundBaseDisabled: ColorModeSwitch;
|
|
@@ -174,6 +176,7 @@ export declare type _EuiThemeBackgroundColors = {
|
|
|
174
176
|
backgroundBaseFormsPrepend: ColorModeSwitch;
|
|
175
177
|
backgroundBaseFormsControlDisabled: ColorModeSwitch;
|
|
176
178
|
backgroundBaseInteractiveHover: ColorModeSwitch;
|
|
179
|
+
backgroundBaseInteractiveHoverAssistance: ColorModeSwitch;
|
|
177
180
|
backgroundBaseInteractiveSelect: ColorModeSwitch;
|
|
178
181
|
backgroundBaseInteractiveSelectHover: ColorModeSwitch;
|
|
179
182
|
backgroundBaseInteractiveOverlay: ColorModeSwitch;
|
|
@@ -187,6 +190,7 @@ export declare type _EuiThemeBackgroundColors = {
|
|
|
187
190
|
backgroundLightWarning: ColorModeSwitch;
|
|
188
191
|
backgroundLightRisk: ColorModeSwitch;
|
|
189
192
|
backgroundLightDanger: ColorModeSwitch;
|
|
193
|
+
backgroundLightAssistance: ColorModeSwitch;
|
|
190
194
|
backgroundLightText: ColorModeSwitch;
|
|
191
195
|
backgroundFilledPrimary: ColorModeSwitch;
|
|
192
196
|
backgroundFilledAccent: ColorModeSwitch;
|
|
@@ -196,6 +200,7 @@ export declare type _EuiThemeBackgroundColors = {
|
|
|
196
200
|
backgroundFilledWarning: ColorModeSwitch;
|
|
197
201
|
backgroundFilledRisk: ColorModeSwitch;
|
|
198
202
|
backgroundFilledDanger: ColorModeSwitch;
|
|
203
|
+
backgroundFilledAssistance: ColorModeSwitch;
|
|
199
204
|
backgroundFilledText: ColorModeSwitch;
|
|
200
205
|
};
|
|
201
206
|
/** TODO: remove once usages are re-mapped */
|
|
@@ -234,6 +239,7 @@ export declare type _EuiThemeBorderColors = {
|
|
|
234
239
|
borderBaseWarning: ColorModeSwitch;
|
|
235
240
|
borderBaseRisk: ColorModeSwitch;
|
|
236
241
|
borderBaseDanger: ColorModeSwitch;
|
|
242
|
+
borderBaseAssistance: ColorModeSwitch;
|
|
237
243
|
borderBasePlain: ColorModeSwitch;
|
|
238
244
|
borderBaseSubdued: ColorModeSwitch;
|
|
239
245
|
borderBaseProminent: ColorModeSwitch;
|
|
@@ -255,6 +261,7 @@ export declare type _EuiThemeBorderColors = {
|
|
|
255
261
|
borderStrongWarning: ColorModeSwitch;
|
|
256
262
|
borderStrongRisk: ColorModeSwitch;
|
|
257
263
|
borderStrongDanger: ColorModeSwitch;
|
|
264
|
+
borderStrongAssistance: ColorModeSwitch;
|
|
258
265
|
borderStrongText: ColorModeSwitch;
|
|
259
266
|
};
|
|
260
267
|
export declare type _EuiThemeVisColors = {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elastic/eui-theme-common",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "9.0.0-snapshot.1776170631053",
|
|
4
4
|
"description": "EUI theme common",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE.txt",
|
|
6
6
|
"scripts": {
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
"build:compile:cjs": "NODE_ENV=production NO_COREJS_POLYFILL=true babel src --out-dir=lib/cjs --extensions .js,.ts,.tsx",
|
|
11
11
|
"build:types": "NODE_ENV=production tsc --project tsconfig.types.json",
|
|
12
12
|
"build-pack": "yarn build && npm pack",
|
|
13
|
+
"watch": "node ../../scripts/watch-eui.js --package @elastic/eui-theme-common",
|
|
13
14
|
"lint": "yarn tsc --noEmit && yarn lint-es && yarn lint-sass",
|
|
14
15
|
"lint-es": "eslint --cache src/**/*.ts --max-warnings 0",
|
|
15
16
|
"lint-sass": "yarn stylelint \"**/*.scss\" --quiet-deprecation-warnings",
|
|
@@ -82,5 +83,6 @@
|
|
|
82
83
|
],
|
|
83
84
|
"installConfig": {
|
|
84
85
|
"hoistingLimits": "workspaces"
|
|
85
|
-
}
|
|
86
|
+
},
|
|
87
|
+
"stableVersion": "9.0.0"
|
|
86
88
|
}
|