bitwrench 2.0.17 → 2.0.19

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 (72) hide show
  1. package/README.md +169 -75
  2. package/dist/bitwrench-bccl.cjs.js +228 -55
  3. package/dist/bitwrench-bccl.cjs.min.js +3 -3
  4. package/dist/bitwrench-bccl.esm.js +228 -55
  5. package/dist/bitwrench-bccl.esm.min.js +3 -3
  6. package/dist/bitwrench-bccl.umd.js +228 -55
  7. package/dist/bitwrench-bccl.umd.min.js +3 -3
  8. package/dist/bitwrench-code-edit.cjs.js +7 -9
  9. package/dist/bitwrench-code-edit.cjs.min.js +5 -7
  10. package/dist/bitwrench-code-edit.es5.js +6 -8
  11. package/dist/bitwrench-code-edit.es5.min.js +5 -7
  12. package/dist/bitwrench-code-edit.esm.js +7 -9
  13. package/dist/bitwrench-code-edit.esm.min.js +5 -7
  14. package/dist/bitwrench-code-edit.umd.js +7 -9
  15. package/dist/bitwrench-code-edit.umd.min.js +5 -7
  16. package/dist/bitwrench-debug.js +268 -0
  17. package/dist/bitwrench-debug.min.js +3 -0
  18. package/dist/bitwrench-lean.cjs.js +1190 -2348
  19. package/dist/bitwrench-lean.cjs.min.js +20 -20
  20. package/dist/bitwrench-lean.es5.js +1285 -2551
  21. package/dist/bitwrench-lean.es5.min.js +18 -18
  22. package/dist/bitwrench-lean.esm.js +1190 -2348
  23. package/dist/bitwrench-lean.esm.min.js +20 -20
  24. package/dist/bitwrench-lean.umd.js +1190 -2348
  25. package/dist/bitwrench-lean.umd.min.js +20 -20
  26. package/dist/bitwrench-util-css.cjs.js +236 -0
  27. package/dist/bitwrench-util-css.cjs.min.js +22 -0
  28. package/dist/bitwrench-util-css.es5.js +414 -0
  29. package/dist/bitwrench-util-css.es5.min.js +21 -0
  30. package/dist/bitwrench-util-css.esm.js +230 -0
  31. package/dist/bitwrench-util-css.esm.min.js +21 -0
  32. package/dist/bitwrench-util-css.umd.js +242 -0
  33. package/dist/bitwrench-util-css.umd.min.js +21 -0
  34. package/dist/bitwrench.cjs.js +1404 -2388
  35. package/dist/bitwrench.cjs.min.js +21 -21
  36. package/dist/bitwrench.css +503 -132
  37. package/dist/bitwrench.es5.js +1588 -2659
  38. package/dist/bitwrench.es5.min.js +19 -19
  39. package/dist/bitwrench.esm.js +1405 -2389
  40. package/dist/bitwrench.esm.min.js +21 -21
  41. package/dist/bitwrench.min.css +1 -1
  42. package/dist/bitwrench.umd.js +1404 -2388
  43. package/dist/bitwrench.umd.min.js +21 -21
  44. package/dist/builds.json +214 -104
  45. package/dist/bwserve.cjs.js +514 -68
  46. package/dist/bwserve.esm.js +513 -69
  47. package/dist/sri.json +46 -36
  48. package/package.json +6 -3
  49. package/readme.html +183 -85
  50. package/src/bitwrench-bccl-entry.js +3 -4
  51. package/src/bitwrench-bccl.js +224 -50
  52. package/src/bitwrench-code-edit.js +6 -8
  53. package/src/bitwrench-color-utils.js +31 -9
  54. package/src/bitwrench-debug.js +245 -0
  55. package/src/bitwrench-esm-entry.js +11 -0
  56. package/src/bitwrench-styles.js +474 -240
  57. package/src/bitwrench-util-css.js +229 -0
  58. package/src/bitwrench.js +689 -2042
  59. package/src/bwserve/attach.js +57 -0
  60. package/src/bwserve/bwclient.js +141 -0
  61. package/src/bwserve/bwshell.js +102 -0
  62. package/src/bwserve/client.js +151 -1
  63. package/src/bwserve/index.js +127 -28
  64. package/src/cli/attach.js +587 -0
  65. package/src/cli/convert.js +2 -5
  66. package/src/cli/index.js +7 -0
  67. package/src/cli/inject.js +1 -1
  68. package/src/cli/serve.js +185 -5
  69. package/src/generate-css.js +11 -4
  70. package/src/vendor/html2canvas.min.js +20 -0
  71. package/src/version.js +3 -3
  72. package/src/bwserve/shell.js +0 -106
@@ -0,0 +1,245 @@
1
+ /**
2
+ * bitwrench-debug.js -- Standalone debug toolkit for bitwrench pages.
3
+ *
4
+ * Installs window.bwd with helper functions ported from bwcli attach:
5
+ * bwd.tree(sel, depth) -- print DOM tree to console
6
+ * bwd.listen(sel, event) -- delegated event logging
7
+ * bwd.unlisten(sel, event) -- remove event listener
8
+ * bwd.state(sel?) -- dump stateful elements via console.table
9
+ * bwd.screenshot(sel?) -- capture screenshot via html2canvas
10
+ *
11
+ * NOT bundled into bitwrench core. Load separately via script tag or
12
+ * console paste. Auto-loads bitwrench from CDN if not present.
13
+ *
14
+ * @module bitwrench-debug
15
+ */
16
+ (function() {
17
+ 'use strict';
18
+
19
+ var CDN_BW = 'https://cdn.jsdelivr.net/npm/bitwrench@2/dist/bitwrench.umd.min.js';
20
+ var CDN_H2C = 'https://cdn.jsdelivr.net/npm/html2canvas@1.4.1/dist/html2canvas.min.js';
21
+ var _listeners = {};
22
+
23
+ function _loadScript(url) {
24
+ return new Promise(function(resolve, reject) {
25
+ var s = document.createElement('script');
26
+ s.src = url;
27
+ s.onload = function() { resolve(); };
28
+ s.onerror = function() { reject(new Error('Failed to load ' + url)); };
29
+ document.head.appendChild(s);
30
+ });
31
+ }
32
+
33
+ // -- tree -------------------------------------------------------------------
34
+
35
+ function _walk(el, depth, maxDepth) {
36
+ if (!el || depth > maxDepth) return null;
37
+ var info = { tag: el.tagName ? el.tagName.toLowerCase() : '#text' };
38
+ if (el.id) info.id = el.id;
39
+ if (el.className && typeof el.className === 'string') {
40
+ info.cls = el.className.split(' ').slice(0, 5).join(' ');
41
+ }
42
+ if (el.children && el.children.length > 0 && depth < maxDepth) {
43
+ info.children = [];
44
+ for (var i = 0; i < Math.min(el.children.length, 20); i++) {
45
+ var c = _walk(el.children[i], depth + 1, maxDepth);
46
+ if (c) info.children.push(c);
47
+ }
48
+ }
49
+ return info;
50
+ }
51
+
52
+ function _print(node, indent) {
53
+ if (!node) return;
54
+ var label = node.tag || '?';
55
+ if (node.id) label += '#' + node.id;
56
+ if (node.cls) label += '.' + node.cls.split(' ').join('.');
57
+ console.log(' '.repeat(indent) + label);
58
+ if (node.children) {
59
+ for (var i = 0; i < node.children.length; i++) {
60
+ _print(node.children[i], indent + 1);
61
+ }
62
+ }
63
+ }
64
+
65
+ /**
66
+ * Print an indented DOM tree to the console.
67
+ * @param {string} [sel='body'] - CSS selector for the root element
68
+ * @param {number} [depth=3] - Max depth to walk
69
+ * @returns {object|null} The tree data structure
70
+ */
71
+ function tree(sel, depth) {
72
+ sel = sel || 'body';
73
+ depth = depth || 3;
74
+ var root = document.querySelector(sel);
75
+ if (!root) {
76
+ console.log('(no element found for "' + sel + '")');
77
+ return null;
78
+ }
79
+ var data = _walk(root, 0, depth);
80
+ _print(data, 0);
81
+ return data;
82
+ }
83
+
84
+ // -- listen / unlisten ------------------------------------------------------
85
+
86
+ /**
87
+ * Add a delegated event listener that logs matching events to the console.
88
+ * @param {string} sel - CSS selector to match via closest()
89
+ * @param {string} event - DOM event name (e.g. 'click')
90
+ */
91
+ function listen(sel, event) {
92
+ var key = sel + ':::' + event;
93
+ if (_listeners[key]) {
94
+ console.log('[bwd] already listening for ' + event + ' on ' + sel);
95
+ return;
96
+ }
97
+ var fn = function(e) {
98
+ var el = e.target.closest ? e.target.closest(sel) : null;
99
+ if (!el) return;
100
+ console.log('[bwd] ' + event + ' on ' + sel + ' -> ' +
101
+ el.tagName + (el.id ? '#' + el.id : '') +
102
+ (el.textContent ? ' "' + el.textContent.slice(0, 50).trim() + '"' : ''));
103
+ };
104
+ document.addEventListener(event, fn, true);
105
+ _listeners[key] = { fn: fn, event: event };
106
+ console.log('[bwd] listening for ' + event + ' on ' + sel);
107
+ }
108
+
109
+ /**
110
+ * Remove a previously added delegated event listener.
111
+ * @param {string} sel - CSS selector used in listen()
112
+ * @param {string} event - DOM event name used in listen()
113
+ */
114
+ function unlisten(sel, event) {
115
+ var key = sel + ':::' + event;
116
+ var entry = _listeners[key];
117
+ if (!entry) {
118
+ console.log('[bwd] no listener for ' + event + ' on ' + sel);
119
+ return;
120
+ }
121
+ document.removeEventListener(entry.event, entry.fn, true);
122
+ delete _listeners[key];
123
+ console.log('[bwd] stopped listening for ' + event + ' on ' + sel);
124
+ }
125
+
126
+ // -- state ------------------------------------------------------------------
127
+
128
+ /**
129
+ * Dump all stateful (.bw_lc) elements and their _bw_state via console.table.
130
+ * @param {string} [sel='.bw_lc'] - CSS selector to query
131
+ * @returns {Array} Array of {id, uuid, state} objects
132
+ */
133
+ function state(sel) {
134
+ sel = sel || '.bw_lc';
135
+ var els = document.querySelectorAll(sel);
136
+ var rows = [];
137
+ for (var i = 0; i < els.length; i++) {
138
+ var el = els[i];
139
+ var uuid = '';
140
+ if (typeof window !== 'undefined' && window.bw && window.bw.getUUID) {
141
+ uuid = window.bw.getUUID(el) || '';
142
+ }
143
+ rows.push({
144
+ id: el.id || '',
145
+ uuid: uuid,
146
+ state: el._bw_state || null
147
+ });
148
+ }
149
+ if (rows.length === 0) {
150
+ console.log('[bwd] no stateful elements found for "' + sel + '"');
151
+ } else if (typeof console.table === 'function') {
152
+ console.table(rows);
153
+ } else {
154
+ console.log(rows);
155
+ }
156
+ return rows;
157
+ }
158
+
159
+ // -- screenshot -------------------------------------------------------------
160
+
161
+ /**
162
+ * Capture a screenshot via html2canvas and trigger a download.
163
+ * Loads html2canvas from CDN if not present.
164
+ * @param {string} [sel='body'] - CSS selector for the element to capture
165
+ * @returns {Promise} Resolves when screenshot is saved
166
+ */
167
+ function screenshot(sel) {
168
+ sel = sel || 'body';
169
+ var el = document.querySelector(sel);
170
+ if (!el) {
171
+ console.log('[bwd] no element found for "' + sel + '"');
172
+ return Promise.resolve(null);
173
+ }
174
+
175
+ var p = (typeof window !== 'undefined' && window.html2canvas)
176
+ ? Promise.resolve(window.html2canvas)
177
+ : _loadScript(CDN_H2C).then(function() { return window.html2canvas; });
178
+
179
+ return p.then(function(h2c) {
180
+ console.log('[bwd] capturing ' + sel + ' ...');
181
+ return h2c(el, { useCORS: true });
182
+ }).then(function(canvas) {
183
+ var filename = 'screenshot-' + Date.now() + '.png';
184
+ canvas.toBlob(function(blob) {
185
+ if (typeof window !== 'undefined' && window.bw && window.bw.saveClientFile) {
186
+ window.bw.saveClientFile(filename, blob);
187
+ } else {
188
+ // Fallback: create a download link
189
+ var a = document.createElement('a');
190
+ a.href = URL.createObjectURL(blob);
191
+ a.download = filename;
192
+ a.click();
193
+ URL.revokeObjectURL(a.href);
194
+ }
195
+ console.log('[bwd] saved: ' + filename);
196
+ });
197
+ }).catch(function(err) {
198
+ console.error('[bwd] screenshot failed: ' + err.message);
199
+ });
200
+ }
201
+
202
+ // -- init -------------------------------------------------------------------
203
+
204
+ var bwd = {
205
+ tree: tree,
206
+ listen: listen,
207
+ unlisten: unlisten,
208
+ state: state,
209
+ screenshot: screenshot,
210
+ _listeners: _listeners
211
+ };
212
+
213
+ // Expose for testing in Node (module.exports) or browser (window.bwd)
214
+ if (typeof module !== 'undefined' && module.exports) {
215
+ module.exports = bwd;
216
+ }
217
+ if (typeof window !== 'undefined') {
218
+ window.bwd = bwd;
219
+ }
220
+
221
+ function _printReady() {
222
+ console.log('[bwd] bitwrench debug toolkit ready');
223
+ console.log(' bwd.tree(sel?, depth?) -- print DOM tree');
224
+ console.log(' bwd.listen(sel, event) -- log events');
225
+ console.log(' bwd.unlisten(sel, event) -- stop logging');
226
+ console.log(' bwd.state(sel?) -- dump stateful elements');
227
+ console.log(' bwd.screenshot(sel?) -- capture screenshot');
228
+ }
229
+
230
+ // Auto-load bitwrench from CDN if not present
231
+ if (typeof window !== 'undefined') {
232
+ if (window.bw && window.bw.version) {
233
+ _printReady();
234
+ } else {
235
+ console.log('[bwd] bitwrench not detected, loading from CDN...');
236
+ _loadScript(CDN_BW).then(function() {
237
+ _printReady();
238
+ }).catch(function(err) {
239
+ console.warn('[bwd] could not load bitwrench: ' + err.message);
240
+ console.log('[bwd] toolkit ready (limited -- bw.* not available)');
241
+ console.log(' bwd.tree, bwd.listen, bwd.unlisten still work');
242
+ });
243
+ }
244
+ }
245
+ })();
@@ -0,0 +1,11 @@
1
+ // ESM entry point — adds named exports for tree-shaking.
2
+ // Modern bundlers (Vite, webpack, esbuild) can import individual
3
+ // BCCL components without pulling in the entire library:
4
+ //
5
+ // import bw from 'bitwrench'; // full library
6
+ // import { makeCard, makeButton } from 'bitwrench'; // tree-shakeable
7
+ //
8
+ // UMD/CJS builds use bitwrench.js directly (no named exports).
9
+
10
+ export { default } from './bitwrench.js';
11
+ export * from './bitwrench-bccl.js';