bitwrench 1.2.15 → 2.0.7
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/README.md +160 -158
- package/bin/bitwrench.js +3 -0
- package/dist/bitwrench-code-edit.cjs.js +639 -0
- package/dist/bitwrench-code-edit.es5.js +875 -0
- package/dist/bitwrench-code-edit.es5.min.js +15 -0
- package/dist/bitwrench-code-edit.esm.js +628 -0
- package/dist/bitwrench-code-edit.esm.min.js +15 -0
- package/dist/bitwrench-code-edit.umd.js +645 -0
- package/dist/bitwrench-code-edit.umd.min.js +15 -0
- package/dist/bitwrench.cjs.js +6983 -0
- package/dist/bitwrench.cjs.min.js +62 -0
- package/dist/bitwrench.css +5100 -0
- package/dist/bitwrench.es5.js +8446 -0
- package/dist/bitwrench.es5.min.js +31 -0
- package/dist/bitwrench.esm.js +6981 -0
- package/dist/bitwrench.esm.min.js +62 -0
- package/dist/bitwrench.umd.js +6989 -0
- package/dist/bitwrench.umd.min.js +62 -0
- package/dist/builds.json +127 -0
- package/dist/sri.json +18 -0
- package/package.json +86 -24
- package/readme.html +288 -0
- package/src/bitwrench-code-edit.js +627 -0
- package/src/bitwrench-color-utils.js +311 -0
- package/src/bitwrench-component-base.js +736 -0
- package/src/bitwrench-components-inline.js +374 -0
- package/src/bitwrench-components-v2.js +1879 -0
- package/src/bitwrench-components.js +610 -0
- package/src/bitwrench-styles.js +3240 -0
- package/src/bitwrench.js +3367 -0
- package/src/cli/convert.js +205 -0
- package/src/cli/index.js +122 -0
- package/src/cli/inject.js +55 -0
- package/src/cli/layout-default.js +142 -0
- package/src/generate-css.js +381 -0
- package/src/vendor/quikdown.js +654 -0
- package/src/version.js +16 -0
- package/.eslintrc.json +0 -27
- package/.github/workflows/codeql-analysis.yml +0 -72
- package/.travis.yml +0 -34
- package/bitwrench.css +0 -92
- package/bitwrench.js +0 -3348
- package/bitwrench.js_sri.txt +0 -1
- package/bitwrench.min.js +0 -1
- package/bitwrench.min.js_sri.txt +0 -1
- package/bitwrench_ESM.js +0 -3207
- package/dev/bitwrench-todo.md +0 -215
- package/dev/css-arrows.md +0 -23
- package/dev/docStringDev.js +0 -124
- package/dev/docStringParseDev.js +0 -171
- package/dev/figures.html +0 -37
- package/dev/html_gen.js +0 -349
- package/dev/htmld.md +0 -250
- package/dev/htmldev.html +0 -45
- package/dev/index-old.html +0 -87
- package/dev/misc-notes.md +0 -21
- package/dev/notes.md +0 -2
- package/dev/sizes.html +0 -49
- package/dev/universal-js-module.js +0 -37
- package/examples/example1.html +0 -78
- package/examples/example10.html +0 -84
- package/examples/example2.html +0 -44
- package/examples/example3.html +0 -50
- package/examples/example4.html +0 -22
- package/examples/example5.html +0 -82
- package/examples/example6.html +0 -128
- package/examples/example7.html +0 -91
- package/examples/example8.html +0 -27
- package/examples/example9.html +0 -102
- package/icon/bitwrench-dark-tall.png +0 -0
- package/icon/bitwrench-dark.png +0 -0
- package/icon/bitwrench-icon-lt-grey.png +0 -0
- package/icon/bitwrench-icon.vsd +0 -0
- package/icon/bitwrench-logo-dark.png +0 -0
- package/icon/bitwrench-logo-full.png +0 -0
- package/icon/bitwrench-logo-green.png +0 -0
- package/icon/bitwrench-logo-grey.png +0 -0
- package/icon/bitwrench-logo-white.png +0 -0
- package/icon/bitwrench-logos-colors.png +0 -0
- package/icon/bitwrench-thick-logo.png +0 -0
- package/icon/bitwrench-thick-teal/android-chrome-192x192.png +0 -0
- package/icon/bitwrench-thick-teal/android-chrome-512x512.png +0 -0
- package/icon/bitwrench-thick-teal/apple-touch-icon.png +0 -0
- package/icon/bitwrench-thick-teal/browserconfig.xml +0 -9
- package/icon/bitwrench-thick-teal/favicon-16x16.png +0 -0
- package/icon/bitwrench-thick-teal/favicon-32x32.png +0 -0
- package/icon/bitwrench-thick-teal/favicon.ico +0 -0
- package/icon/bitwrench-thick-teal/mstile-144x144.png +0 -0
- package/icon/bitwrench-thick-teal/mstile-150x150.png +0 -0
- package/icon/bitwrench-thick-teal/mstile-310x150.png +0 -0
- package/icon/bitwrench-thick-teal/mstile-310x310.png +0 -0
- package/icon/bitwrench-thick-teal/mstile-70x70.png +0 -0
- package/icon/bitwrench-thick-teal/site.webmanifest +0 -19
- package/icon/bitwrench-thick-teal.ico +0 -0
- package/icon/bitwrench-thick-teal.svg +0 -44
- package/icon/bitwrench-thick-teal.zip +0 -0
- package/icon/favicon-test.html +0 -20
- package/icon/logos-test.PNG +0 -0
- package/images/bitwrench-512x512.png +0 -0
- package/images/bitwrench-logo-med.png +0 -0
- package/images/bitwrench-thick-logo.png +0 -0
- package/images/bitwrench-thick-logo.svg +0 -64
- package/images/bitwrench-thick-teal.ico +0 -0
- package/images/favicon.ico +0 -0
- package/index.html +0 -256
- package/instr_tmp/bitwrench.js +0 -1350
- package/karma.conf.js +0 -140
- package/makefile +0 -21
- package/quick-docs.html +0 -206
- package/test/bitwrench_test.js +0 -1255
- package/test/karma-test.js +0 -1081
- package/tools/bw_deprecatedNames.js +0 -19
- package/tools/bwconsole.js +0 -20
- package/tools/createSimpleHTMLPage.js +0 -41
- package/tools/emitreadme.sh +0 -4
- package/tools/export-bw-default-css.js +0 -41
- package/tools/umd2ModuleHack.js +0 -32
- package/tools/update-bw-package.js +0 -36
- package/tools/updatereadme.js +0 -34
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bitwrench Color Utilities
|
|
3
|
+
*
|
|
4
|
+
* Standalone color math helpers used by both bitwrench.js and bitwrench-styles.js.
|
|
5
|
+
* Extracted to avoid circular dependencies. bitwrench.js re-exports these as
|
|
6
|
+
* bw.colorParse, bw.colorRgbToHsl, etc.
|
|
7
|
+
*
|
|
8
|
+
* @module bitwrench-color-utils
|
|
9
|
+
* @license BSD-2-Clause
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Clamp a value between min and max.
|
|
14
|
+
* @param {number} val
|
|
15
|
+
* @param {number} min
|
|
16
|
+
* @param {number} max
|
|
17
|
+
* @returns {number}
|
|
18
|
+
*/
|
|
19
|
+
export function clip(val, min, max) {
|
|
20
|
+
return Math.max(min, Math.min(max, val));
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Parse a CSS color string to [r, g, b, a, "rgb"].
|
|
25
|
+
* Handles #hex, rgb(), rgba(), hsl(), hsla(), and bitwrench color arrays.
|
|
26
|
+
* @param {string|Array} s - Color string or array
|
|
27
|
+
* @param {number} [defAlpha=255] - Default alpha
|
|
28
|
+
* @returns {Array} [r, g, b, a, "rgb"]
|
|
29
|
+
*/
|
|
30
|
+
export function colorParse(s, defAlpha) {
|
|
31
|
+
if (defAlpha === undefined) defAlpha = 255;
|
|
32
|
+
var r = [0, 0, 0, defAlpha, "rgb"];
|
|
33
|
+
|
|
34
|
+
if (Array.isArray(s)) {
|
|
35
|
+
var df = [0, 0, 0, 255, "rgb"];
|
|
36
|
+
for (var p = 0; p < s.length && p < df.length; p++) {
|
|
37
|
+
df[p] = s[p];
|
|
38
|
+
}
|
|
39
|
+
return df;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
s = String(s).replace(/\s/g, "");
|
|
43
|
+
|
|
44
|
+
if (s[0] === "#") {
|
|
45
|
+
var hex = s.slice(1);
|
|
46
|
+
if (hex.length === 3 || hex.length === 4) {
|
|
47
|
+
for (var i = 0; i < hex.length; i++) {
|
|
48
|
+
r[i] = parseInt(hex[i] + hex[i], 16);
|
|
49
|
+
}
|
|
50
|
+
} else if (hex.length === 6 || hex.length === 8) {
|
|
51
|
+
for (var j = 0; j < hex.length; j += 2) {
|
|
52
|
+
r[j / 2] = parseInt(hex.substring(j, j + 2), 16);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
} else {
|
|
56
|
+
var match = s.match(/^(rgb|hsl)a?\(([^)]+)\)$/i);
|
|
57
|
+
if (match) {
|
|
58
|
+
var type = match[1].toLowerCase();
|
|
59
|
+
var values = match[2].split(",").map(function(v) { return parseFloat(v); });
|
|
60
|
+
|
|
61
|
+
if (type === "rgb") {
|
|
62
|
+
r[0] = values[0] || 0;
|
|
63
|
+
r[1] = values[1] || 0;
|
|
64
|
+
r[2] = values[2] || 0;
|
|
65
|
+
r[3] = values[3] !== undefined ? values[3] * 255 : defAlpha;
|
|
66
|
+
r[4] = "rgb";
|
|
67
|
+
} else if (type === "hsl") {
|
|
68
|
+
var rgb = colorHslToRgb(values[0] || 0, values[1] || 0, values[2] || 0,
|
|
69
|
+
values[3] !== undefined ? values[3] * 255 : defAlpha);
|
|
70
|
+
return rgb;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return r;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Convert RGB to HSL.
|
|
80
|
+
* @param {number|Array} r - Red 0-255, or [r,g,b,a] array
|
|
81
|
+
* @param {number} [g] - Green 0-255
|
|
82
|
+
* @param {number} [b] - Blue 0-255
|
|
83
|
+
* @param {number} [a=255] - Alpha 0-255
|
|
84
|
+
* @param {boolean} [rnd=true] - Round results
|
|
85
|
+
* @returns {Array} [h, s, l, a, "hsl"]
|
|
86
|
+
*/
|
|
87
|
+
export function colorRgbToHsl(r, g, b, a, rnd) {
|
|
88
|
+
if (a === undefined) a = 255;
|
|
89
|
+
if (rnd === undefined) rnd = true;
|
|
90
|
+
if (Array.isArray(r)) {
|
|
91
|
+
g = r[1]; b = r[2]; a = r[3] !== undefined ? r[3] : 255; r = r[0];
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
r /= 255;
|
|
95
|
+
g /= 255;
|
|
96
|
+
b /= 255;
|
|
97
|
+
|
|
98
|
+
var max = Math.max(r, g, b);
|
|
99
|
+
var min = Math.min(r, g, b);
|
|
100
|
+
var h, s, l = (max + min) / 2;
|
|
101
|
+
|
|
102
|
+
if (max === min) {
|
|
103
|
+
h = s = 0;
|
|
104
|
+
} else {
|
|
105
|
+
var d = max - min;
|
|
106
|
+
s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
|
|
107
|
+
|
|
108
|
+
switch (max) {
|
|
109
|
+
case r: h = ((g - b) / d + (g < b ? 6 : 0)) / 6; break;
|
|
110
|
+
case g: h = ((b - r) / d + 2) / 6; break;
|
|
111
|
+
case b: h = ((r - g) / d + 4) / 6; break;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
h *= 360;
|
|
116
|
+
s *= 100;
|
|
117
|
+
l *= 100;
|
|
118
|
+
|
|
119
|
+
if (rnd) {
|
|
120
|
+
h = Math.round(h);
|
|
121
|
+
s = Math.round(s);
|
|
122
|
+
l = Math.round(l);
|
|
123
|
+
a = Math.round(a);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
return [h, s, l, a, "hsl"];
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Convert HSL to RGB.
|
|
131
|
+
* @param {number|Array} h - Hue 0-360, or [h,s,l,a] array
|
|
132
|
+
* @param {number} [s] - Saturation 0-100
|
|
133
|
+
* @param {number} [l] - Lightness 0-100
|
|
134
|
+
* @param {number} [a=255] - Alpha 0-255
|
|
135
|
+
* @param {boolean} [rnd=true] - Round results
|
|
136
|
+
* @returns {Array} [r, g, b, a, "rgb"]
|
|
137
|
+
*/
|
|
138
|
+
export function colorHslToRgb(h, s, l, a, rnd) {
|
|
139
|
+
if (a === undefined) a = 255;
|
|
140
|
+
if (rnd === undefined) rnd = true;
|
|
141
|
+
if (Array.isArray(h)) {
|
|
142
|
+
s = h[1]; l = h[2]; a = h[3] !== undefined ? h[3] : 255; h = h[0];
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
var hNorm = h / 360;
|
|
146
|
+
var sNorm = s / 100;
|
|
147
|
+
var lNorm = l / 100;
|
|
148
|
+
|
|
149
|
+
var r, g, b;
|
|
150
|
+
|
|
151
|
+
if (sNorm === 0) {
|
|
152
|
+
r = g = b = lNorm * 255;
|
|
153
|
+
} else {
|
|
154
|
+
var hue2rgb = function(p, q, t) {
|
|
155
|
+
if (t < 0) t += 1;
|
|
156
|
+
if (t > 1) t -= 1;
|
|
157
|
+
if (t < 1/6) return p + (q - p) * 6 * t;
|
|
158
|
+
if (t < 1/2) return q;
|
|
159
|
+
if (t < 2/3) return p + (q - p) * (2/3 - t) * 6;
|
|
160
|
+
return p;
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
var q = lNorm < 0.5 ? lNorm * (1 + sNorm) : lNorm + sNorm - lNorm * sNorm;
|
|
164
|
+
var p = 2 * lNorm - q;
|
|
165
|
+
|
|
166
|
+
r = hue2rgb(p, q, hNorm + 1/3) * 255;
|
|
167
|
+
g = hue2rgb(p, q, hNorm) * 255;
|
|
168
|
+
b = hue2rgb(p, q, hNorm - 1/3) * 255;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
if (rnd) {
|
|
172
|
+
r = Math.round(r);
|
|
173
|
+
g = Math.round(g);
|
|
174
|
+
b = Math.round(b);
|
|
175
|
+
a = Math.round(a);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
return [r, g, b, a, "rgb"];
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// =========================================================================
|
|
182
|
+
// New theme derivation helpers
|
|
183
|
+
// =========================================================================
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* Convert hex color to HSL array [h, s, l].
|
|
187
|
+
* @param {string} hex - Hex color e.g. '#006666'
|
|
188
|
+
* @returns {Array} [h, s, l] where h=0-360, s=0-100, l=0-100
|
|
189
|
+
*/
|
|
190
|
+
export function hexToHsl(hex) {
|
|
191
|
+
var rgb = colorParse(hex);
|
|
192
|
+
var hsl = colorRgbToHsl(rgb[0], rgb[1], rgb[2], 255, false);
|
|
193
|
+
return [hsl[0], hsl[1], hsl[2]];
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Convert HSL array to hex color string.
|
|
198
|
+
* @param {Array} hsl - [h, s, l] where h=0-360, s=0-100, l=0-100
|
|
199
|
+
* @returns {string} Hex color e.g. '#006666'
|
|
200
|
+
*/
|
|
201
|
+
export function hslToHex(hsl) {
|
|
202
|
+
var rgb = colorHslToRgb(hsl[0], hsl[1], hsl[2], 255, true);
|
|
203
|
+
return '#' +
|
|
204
|
+
('0' + rgb[0].toString(16)).slice(-2) +
|
|
205
|
+
('0' + rgb[1].toString(16)).slice(-2) +
|
|
206
|
+
('0' + rgb[2].toString(16)).slice(-2);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Adjust lightness of a hex color by a percentage amount.
|
|
211
|
+
* Positive = lighten, negative = darken.
|
|
212
|
+
* @param {string} hex - Hex color
|
|
213
|
+
* @param {number} amount - Lightness change in percentage points (-100 to 100)
|
|
214
|
+
* @returns {string} Adjusted hex color
|
|
215
|
+
*/
|
|
216
|
+
export function adjustLightness(hex, amount) {
|
|
217
|
+
var hsl = hexToHsl(hex);
|
|
218
|
+
hsl[2] = clip(hsl[2] + amount, 0, 100);
|
|
219
|
+
return hslToHex(hsl);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Mix two hex colors via RGB linear interpolation.
|
|
224
|
+
* @param {string} hex1 - First hex color
|
|
225
|
+
* @param {string} hex2 - Second hex color (e.g. '#ffffff' for tinting)
|
|
226
|
+
* @param {number} ratio - 0 = all hex1, 1 = all hex2
|
|
227
|
+
* @returns {string} Mixed hex color
|
|
228
|
+
*/
|
|
229
|
+
export function mixColor(hex1, hex2, ratio) {
|
|
230
|
+
var c1 = colorParse(hex1);
|
|
231
|
+
var c2 = colorParse(hex2);
|
|
232
|
+
var r = Math.round(c1[0] + (c2[0] - c1[0]) * ratio);
|
|
233
|
+
var g = Math.round(c1[1] + (c2[1] - c1[1]) * ratio);
|
|
234
|
+
var b = Math.round(c1[2] + (c2[2] - c1[2]) * ratio);
|
|
235
|
+
return '#' +
|
|
236
|
+
('0' + r.toString(16)).slice(-2) +
|
|
237
|
+
('0' + g.toString(16)).slice(-2) +
|
|
238
|
+
('0' + b.toString(16)).slice(-2);
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* Compute WCAG 2.0 relative luminance of a hex color.
|
|
243
|
+
* @param {string} hex - Hex color
|
|
244
|
+
* @returns {number} Relative luminance 0-1
|
|
245
|
+
*/
|
|
246
|
+
export function relativeLuminance(hex) {
|
|
247
|
+
var rgb = colorParse(hex);
|
|
248
|
+
var vals = [rgb[0] / 255, rgb[1] / 255, rgb[2] / 255].map(function(v) {
|
|
249
|
+
return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);
|
|
250
|
+
});
|
|
251
|
+
return 0.2126 * vals[0] + 0.7152 * vals[1] + 0.0722 * vals[2];
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* Return '#fff' or '#000' for readable text on a given background color.
|
|
256
|
+
* Uses WCAG luminance threshold.
|
|
257
|
+
* @param {string} hex - Background hex color
|
|
258
|
+
* @returns {string} '#fff' or '#000'
|
|
259
|
+
*/
|
|
260
|
+
export function textOnColor(hex) {
|
|
261
|
+
return relativeLuminance(hex) > 0.179 ? '#000' : '#fff';
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* Derive a full shade palette for a single semantic color.
|
|
266
|
+
* @param {string} hex - Base color hex
|
|
267
|
+
* @returns {Object} { base, hover, active, light, darkText, border, focus, textOn }
|
|
268
|
+
*/
|
|
269
|
+
export function deriveShades(hex) {
|
|
270
|
+
var rgb = colorParse(hex);
|
|
271
|
+
return {
|
|
272
|
+
base: hex,
|
|
273
|
+
hover: adjustLightness(hex, -10),
|
|
274
|
+
active: adjustLightness(hex, -15),
|
|
275
|
+
light: mixColor(hex, '#ffffff', 0.85),
|
|
276
|
+
darkText: adjustLightness(hex, -40),
|
|
277
|
+
border: mixColor(hex, '#ffffff', 0.60),
|
|
278
|
+
focus: 'rgba(' + rgb[0] + ',' + rgb[1] + ',' + rgb[2] + ',0.25)',
|
|
279
|
+
textOn: textOnColor(hex)
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
/**
|
|
284
|
+
* Derive complete palette from a theme config object.
|
|
285
|
+
* @param {Object} config - Theme config with primary, secondary, tertiary, etc.
|
|
286
|
+
* @returns {Object} Full palette with shades for all 8 semantic colors + tertiary
|
|
287
|
+
*/
|
|
288
|
+
export function derivePalette(config) {
|
|
289
|
+
var defaults = {
|
|
290
|
+
success: '#198754',
|
|
291
|
+
danger: '#dc3545',
|
|
292
|
+
warning: '#ffc107',
|
|
293
|
+
info: '#0dcaf0',
|
|
294
|
+
light: '#f8f9fa',
|
|
295
|
+
dark: '#212529'
|
|
296
|
+
};
|
|
297
|
+
|
|
298
|
+
var palette = {
|
|
299
|
+
primary: deriveShades(config.primary),
|
|
300
|
+
secondary: deriveShades(config.secondary),
|
|
301
|
+
tertiary: deriveShades(config.tertiary),
|
|
302
|
+
success: deriveShades(config.success || defaults.success),
|
|
303
|
+
danger: deriveShades(config.danger || defaults.danger),
|
|
304
|
+
warning: deriveShades(config.warning || defaults.warning),
|
|
305
|
+
info: deriveShades(config.info || defaults.info),
|
|
306
|
+
light: deriveShades(config.light || defaults.light),
|
|
307
|
+
dark: deriveShades(config.dark || defaults.dark)
|
|
308
|
+
};
|
|
309
|
+
|
|
310
|
+
return palette;
|
|
311
|
+
}
|