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.
Files changed (119) hide show
  1. package/README.md +160 -158
  2. package/bin/bitwrench.js +3 -0
  3. package/dist/bitwrench-code-edit.cjs.js +639 -0
  4. package/dist/bitwrench-code-edit.es5.js +875 -0
  5. package/dist/bitwrench-code-edit.es5.min.js +15 -0
  6. package/dist/bitwrench-code-edit.esm.js +628 -0
  7. package/dist/bitwrench-code-edit.esm.min.js +15 -0
  8. package/dist/bitwrench-code-edit.umd.js +645 -0
  9. package/dist/bitwrench-code-edit.umd.min.js +15 -0
  10. package/dist/bitwrench.cjs.js +6983 -0
  11. package/dist/bitwrench.cjs.min.js +62 -0
  12. package/dist/bitwrench.css +5100 -0
  13. package/dist/bitwrench.es5.js +8446 -0
  14. package/dist/bitwrench.es5.min.js +31 -0
  15. package/dist/bitwrench.esm.js +6981 -0
  16. package/dist/bitwrench.esm.min.js +62 -0
  17. package/dist/bitwrench.umd.js +6989 -0
  18. package/dist/bitwrench.umd.min.js +62 -0
  19. package/dist/builds.json +127 -0
  20. package/dist/sri.json +18 -0
  21. package/package.json +86 -24
  22. package/readme.html +288 -0
  23. package/src/bitwrench-code-edit.js +627 -0
  24. package/src/bitwrench-color-utils.js +311 -0
  25. package/src/bitwrench-component-base.js +736 -0
  26. package/src/bitwrench-components-inline.js +374 -0
  27. package/src/bitwrench-components-v2.js +1879 -0
  28. package/src/bitwrench-components.js +610 -0
  29. package/src/bitwrench-styles.js +3240 -0
  30. package/src/bitwrench.js +3367 -0
  31. package/src/cli/convert.js +205 -0
  32. package/src/cli/index.js +122 -0
  33. package/src/cli/inject.js +55 -0
  34. package/src/cli/layout-default.js +142 -0
  35. package/src/generate-css.js +381 -0
  36. package/src/vendor/quikdown.js +654 -0
  37. package/src/version.js +16 -0
  38. package/.eslintrc.json +0 -27
  39. package/.github/workflows/codeql-analysis.yml +0 -72
  40. package/.travis.yml +0 -34
  41. package/bitwrench.css +0 -92
  42. package/bitwrench.js +0 -3348
  43. package/bitwrench.js_sri.txt +0 -1
  44. package/bitwrench.min.js +0 -1
  45. package/bitwrench.min.js_sri.txt +0 -1
  46. package/bitwrench_ESM.js +0 -3207
  47. package/dev/bitwrench-todo.md +0 -215
  48. package/dev/css-arrows.md +0 -23
  49. package/dev/docStringDev.js +0 -124
  50. package/dev/docStringParseDev.js +0 -171
  51. package/dev/figures.html +0 -37
  52. package/dev/html_gen.js +0 -349
  53. package/dev/htmld.md +0 -250
  54. package/dev/htmldev.html +0 -45
  55. package/dev/index-old.html +0 -87
  56. package/dev/misc-notes.md +0 -21
  57. package/dev/notes.md +0 -2
  58. package/dev/sizes.html +0 -49
  59. package/dev/universal-js-module.js +0 -37
  60. package/examples/example1.html +0 -78
  61. package/examples/example10.html +0 -84
  62. package/examples/example2.html +0 -44
  63. package/examples/example3.html +0 -50
  64. package/examples/example4.html +0 -22
  65. package/examples/example5.html +0 -82
  66. package/examples/example6.html +0 -128
  67. package/examples/example7.html +0 -91
  68. package/examples/example8.html +0 -27
  69. package/examples/example9.html +0 -102
  70. package/icon/bitwrench-dark-tall.png +0 -0
  71. package/icon/bitwrench-dark.png +0 -0
  72. package/icon/bitwrench-icon-lt-grey.png +0 -0
  73. package/icon/bitwrench-icon.vsd +0 -0
  74. package/icon/bitwrench-logo-dark.png +0 -0
  75. package/icon/bitwrench-logo-full.png +0 -0
  76. package/icon/bitwrench-logo-green.png +0 -0
  77. package/icon/bitwrench-logo-grey.png +0 -0
  78. package/icon/bitwrench-logo-white.png +0 -0
  79. package/icon/bitwrench-logos-colors.png +0 -0
  80. package/icon/bitwrench-thick-logo.png +0 -0
  81. package/icon/bitwrench-thick-teal/android-chrome-192x192.png +0 -0
  82. package/icon/bitwrench-thick-teal/android-chrome-512x512.png +0 -0
  83. package/icon/bitwrench-thick-teal/apple-touch-icon.png +0 -0
  84. package/icon/bitwrench-thick-teal/browserconfig.xml +0 -9
  85. package/icon/bitwrench-thick-teal/favicon-16x16.png +0 -0
  86. package/icon/bitwrench-thick-teal/favicon-32x32.png +0 -0
  87. package/icon/bitwrench-thick-teal/favicon.ico +0 -0
  88. package/icon/bitwrench-thick-teal/mstile-144x144.png +0 -0
  89. package/icon/bitwrench-thick-teal/mstile-150x150.png +0 -0
  90. package/icon/bitwrench-thick-teal/mstile-310x150.png +0 -0
  91. package/icon/bitwrench-thick-teal/mstile-310x310.png +0 -0
  92. package/icon/bitwrench-thick-teal/mstile-70x70.png +0 -0
  93. package/icon/bitwrench-thick-teal/site.webmanifest +0 -19
  94. package/icon/bitwrench-thick-teal.ico +0 -0
  95. package/icon/bitwrench-thick-teal.svg +0 -44
  96. package/icon/bitwrench-thick-teal.zip +0 -0
  97. package/icon/favicon-test.html +0 -20
  98. package/icon/logos-test.PNG +0 -0
  99. package/images/bitwrench-512x512.png +0 -0
  100. package/images/bitwrench-logo-med.png +0 -0
  101. package/images/bitwrench-thick-logo.png +0 -0
  102. package/images/bitwrench-thick-logo.svg +0 -64
  103. package/images/bitwrench-thick-teal.ico +0 -0
  104. package/images/favicon.ico +0 -0
  105. package/index.html +0 -256
  106. package/instr_tmp/bitwrench.js +0 -1350
  107. package/karma.conf.js +0 -140
  108. package/makefile +0 -21
  109. package/quick-docs.html +0 -206
  110. package/test/bitwrench_test.js +0 -1255
  111. package/test/karma-test.js +0 -1081
  112. package/tools/bw_deprecatedNames.js +0 -19
  113. package/tools/bwconsole.js +0 -20
  114. package/tools/createSimpleHTMLPage.js +0 -41
  115. package/tools/emitreadme.sh +0 -4
  116. package/tools/export-bw-default-css.js +0 -41
  117. package/tools/umd2ModuleHack.js +0 -32
  118. package/tools/update-bw-package.js +0 -36
  119. 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
+ }