bitwrench 2.0.14 → 2.0.16

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 (61) hide show
  1. package/README.md +57 -21
  2. package/dist/bitwrench-bccl.cjs.js +3746 -0
  3. package/dist/bitwrench-bccl.cjs.min.js +40 -0
  4. package/dist/bitwrench-bccl.esm.js +3741 -0
  5. package/dist/bitwrench-bccl.esm.min.js +40 -0
  6. package/dist/bitwrench-bccl.umd.js +3752 -0
  7. package/dist/bitwrench-bccl.umd.min.js +40 -0
  8. package/dist/bitwrench-code-edit.cjs.js +99 -49
  9. package/dist/bitwrench-code-edit.cjs.min.js +23 -0
  10. package/dist/bitwrench-code-edit.es5.js +79 -16
  11. package/dist/bitwrench-code-edit.es5.min.js +9 -2
  12. package/dist/bitwrench-code-edit.esm.js +99 -49
  13. package/dist/bitwrench-code-edit.esm.min.js +9 -2
  14. package/dist/bitwrench-code-edit.umd.js +99 -49
  15. package/dist/bitwrench-code-edit.umd.min.js +9 -2
  16. package/dist/bitwrench-lean.cjs.js +4923 -3248
  17. package/dist/bitwrench-lean.cjs.min.js +35 -6
  18. package/dist/bitwrench-lean.es5.js +6325 -4580
  19. package/dist/bitwrench-lean.es5.min.js +32 -3
  20. package/dist/bitwrench-lean.esm.js +4923 -3248
  21. package/dist/bitwrench-lean.esm.min.js +35 -6
  22. package/dist/bitwrench-lean.umd.js +4923 -3248
  23. package/dist/bitwrench-lean.umd.min.js +35 -6
  24. package/dist/bitwrench.cjs.js +5082 -3667
  25. package/dist/bitwrench.cjs.min.js +38 -8
  26. package/dist/bitwrench.css +2289 -6034
  27. package/dist/bitwrench.es5.js +6862 -5346
  28. package/dist/bitwrench.es5.min.js +34 -5
  29. package/dist/bitwrench.esm.js +5082 -3667
  30. package/dist/bitwrench.esm.min.js +38 -8
  31. package/dist/bitwrench.min.css +1 -0
  32. package/dist/bitwrench.umd.js +5082 -3667
  33. package/dist/bitwrench.umd.min.js +38 -8
  34. package/dist/builds.json +184 -74
  35. package/dist/bwserve.cjs.js +646 -0
  36. package/dist/bwserve.esm.js +638 -0
  37. package/dist/sri.json +36 -26
  38. package/package.json +23 -6
  39. package/readme.html +71 -32
  40. package/src/bitwrench-bccl-entry.js +72 -0
  41. package/src/{bitwrench-components-v2.js → bitwrench-bccl.js} +396 -647
  42. package/src/bitwrench-code-edit.js +98 -48
  43. package/src/bitwrench-color-utils.js +24 -18
  44. package/src/bitwrench-components-stub.js +4 -1
  45. package/src/bitwrench-file-ops.js +180 -0
  46. package/src/bitwrench-lean.js +2 -2
  47. package/src/bitwrench-styles.js +1287 -4029
  48. package/src/bitwrench-utils.js +458 -0
  49. package/src/bitwrench.js +2070 -1292
  50. package/src/bwserve/client.js +182 -0
  51. package/src/bwserve/index.js +352 -0
  52. package/src/bwserve/shell.js +103 -0
  53. package/src/cli/index.js +36 -15
  54. package/src/cli/layout-default.js +18 -18
  55. package/src/cli/serve.js +325 -0
  56. package/src/generate-css.js +73 -53
  57. package/src/version.js +3 -3
  58. package/src/bitwrench-component-base.js +0 -736
  59. package/src/bitwrench-components-inline.js +0 -374
  60. package/src/bitwrench-components.js +0 -610
  61. /package/bin/{bitwrench.js → bwcli.js} +0 -0
@@ -1,610 +0,0 @@
1
- /**
2
- * Bitwrench v2 Component Library
3
- * Reusable UI components using TACO format
4
- */
5
-
6
- // Navigation Components
7
- export const Navbar = ({ brand, brandHref = '#', dark = true, items = [] }) => ({
8
- t: 'nav',
9
- a: { class: `navbar ${dark ? 'navbar-dark bg-dark' : 'navbar-light bg-light'}` },
10
- c: {
11
- t: 'div',
12
- a: { class: 'container' },
13
- c: [
14
- {
15
- t: 'a',
16
- a: { href: brandHref, class: 'navbar-brand' },
17
- c: brand
18
- },
19
- items.length > 0 && {
20
- t: 'div',
21
- a: { class: 'navbar-nav ms-auto' },
22
- c: items.map(item => ({
23
- t: 'a',
24
- a: {
25
- href: item.href || '#',
26
- class: `nav-link ${item.active ? 'active' : ''}`
27
- },
28
- c: item.text
29
- }))
30
- }
31
- ].filter(Boolean)
32
- }
33
- });
34
-
35
- // Layout Components
36
- export const Container = ({ fluid = false, children }) => ({
37
- t: 'div',
38
- a: { class: fluid ? 'container-fluid' : 'container' },
39
- c: children
40
- });
41
-
42
- export const Row = ({ children, class: className = '' }) => ({
43
- t: 'div',
44
- a: { class: `row ${className}`.trim() },
45
- c: children
46
- });
47
-
48
- export const Col = ({ size, sm, md, lg, xl, children, class: className = '' }) => {
49
- const classes = ['col'];
50
-
51
- if (size) classes.push(`col-${size}`);
52
- if (sm) classes.push(`col-sm-${sm}`);
53
- if (md) classes.push(`col-md-${md}`);
54
- if (lg) classes.push(`col-lg-${lg}`);
55
- if (xl) classes.push(`col-xl-${xl}`);
56
-
57
- if (classes.length === 1 && !size) classes[0] = 'col';
58
-
59
- return {
60
- t: 'div',
61
- a: { class: `${classes.join(' ')} ${className}`.trim() },
62
- c: children
63
- };
64
- };
65
-
66
- // Card Components
67
- export const Card = ({
68
- header,
69
- title,
70
- subtitle,
71
- text,
72
- footer,
73
- children,
74
- class: className = '',
75
- shadow = false
76
- }) => ({
77
- t: 'div',
78
- a: { class: `card ${shadow ? 'shadow' : ''} ${className}`.trim() },
79
- c: [
80
- header && {
81
- t: 'div',
82
- a: { class: 'card-header' },
83
- c: header
84
- },
85
- {
86
- t: 'div',
87
- a: { class: 'card-body' },
88
- c: children || [
89
- title && { t: 'h5', a: { class: 'card-title' }, c: title },
90
- subtitle && { t: 'h6', a: { class: 'card-subtitle mb-2 text-muted' }, c: subtitle },
91
- text && { t: 'p', a: { class: 'card-text' }, c: text }
92
- ].filter(Boolean)
93
- },
94
- footer && {
95
- t: 'div',
96
- a: { class: 'card-footer' },
97
- c: footer
98
- }
99
- ].filter(Boolean)
100
- });
101
-
102
- // Button Components
103
- export const Button = ({
104
- variant = 'primary',
105
- size,
106
- block = false,
107
- disabled = false,
108
- onClick,
109
- children,
110
- type = 'button',
111
- class: className = ''
112
- }) => ({
113
- t: 'button',
114
- a: {
115
- type,
116
- class: [
117
- 'btn',
118
- `btn-${variant}`,
119
- size && `btn-${size}`,
120
- block && 'btn-block w-100',
121
- className
122
- ].filter(Boolean).join(' '),
123
- disabled,
124
- onclick: onClick
125
- },
126
- c: children
127
- });
128
-
129
- export const ButtonGroup = ({ children, size, vertical = false }) => ({
130
- t: 'div',
131
- a: {
132
- class: [
133
- vertical ? 'btn-group-vertical' : 'btn-group',
134
- size && `btn-group-${size}`
135
- ].filter(Boolean).join(' '),
136
- role: 'group'
137
- },
138
- c: children
139
- });
140
-
141
- // Alert Components
142
- export const Alert = ({ variant = 'primary', dismissible = false, children, onClose }) => ({
143
- t: 'div',
144
- a: {
145
- class: `alert alert-${variant} ${dismissible ? 'alert-dismissible fade show' : ''}`.trim(),
146
- role: 'alert'
147
- },
148
- c: [
149
- children,
150
- dismissible && {
151
- t: 'button',
152
- a: {
153
- type: 'button',
154
- class: 'btn-close',
155
- onclick: onClose || function(e) { e.target.closest('.alert').remove(); }
156
- }
157
- }
158
- ].filter(Boolean)
159
- });
160
-
161
- // Badge Components
162
- export const Badge = ({ variant = 'primary', pill = false, children }) => ({
163
- t: 'span',
164
- a: { class: `badge badge-${variant} ${pill ? 'rounded-pill' : ''}`.trim() },
165
- c: children
166
- });
167
-
168
- // Progress Components
169
- export const Progress = ({ value = 0, max = 100, height, striped = false, animated = false }) => ({
170
- t: 'div',
171
- a: {
172
- class: 'progress',
173
- style: height ? { height: `${height}px` } : undefined
174
- },
175
- c: {
176
- t: 'div',
177
- a: {
178
- class: [
179
- 'progress-bar',
180
- striped && 'progress-bar-striped',
181
- animated && 'progress-bar-animated'
182
- ].filter(Boolean).join(' '),
183
- role: 'progressbar',
184
- style: { width: `${(value / max) * 100}%` },
185
- 'aria-valuenow': value,
186
- 'aria-valuemin': 0,
187
- 'aria-valuemax': max
188
- },
189
- c: `${Math.round((value / max) * 100)}%`
190
- }
191
- });
192
-
193
- // Form Components
194
- export const FormGroup = ({ label, children, id }) => ({
195
- t: 'div',
196
- a: { class: 'mb-3' },
197
- c: [
198
- label && {
199
- t: 'label',
200
- a: { class: 'form-label', for: id },
201
- c: label
202
- },
203
- children
204
- ].filter(Boolean)
205
- });
206
-
207
- export const Input = ({
208
- type = 'text',
209
- value,
210
- placeholder,
211
- disabled = false,
212
- readonly = false,
213
- id,
214
- name,
215
- onChange,
216
- class: className = ''
217
- }) => ({
218
- t: 'input',
219
- a: {
220
- type,
221
- class: `form-control ${className}`.trim(),
222
- value,
223
- placeholder,
224
- disabled,
225
- readonly,
226
- id,
227
- name,
228
- oninput: onChange
229
- }
230
- });
231
-
232
- export const Select = ({
233
- options = [],
234
- value,
235
- disabled = false,
236
- id,
237
- name,
238
- onChange,
239
- placeholder,
240
- class: className = ''
241
- }) => ({
242
- t: 'select',
243
- a: {
244
- class: `form-control ${className}`.trim(),
245
- value,
246
- disabled,
247
- id,
248
- name,
249
- onchange: onChange
250
- },
251
- c: [
252
- placeholder && { t: 'option', a: { value: '' }, c: placeholder },
253
- ...options.map(opt => ({
254
- t: 'option',
255
- a: {
256
- value: opt.value,
257
- selected: opt.value === value
258
- },
259
- c: opt.label || opt.value
260
- }))
261
- ]
262
- });
263
-
264
- export const Textarea = ({
265
- value,
266
- placeholder,
267
- rows = 3,
268
- disabled = false,
269
- readonly = false,
270
- id,
271
- name,
272
- onChange,
273
- class: className = ''
274
- }) => ({
275
- t: 'textarea',
276
- a: {
277
- class: `form-control ${className}`.trim(),
278
- rows,
279
- placeholder,
280
- disabled,
281
- readonly,
282
- id,
283
- name,
284
- oninput: onChange
285
- },
286
- c: value
287
- });
288
-
289
- export const Checkbox = ({
290
- label,
291
- checked = false,
292
- disabled = false,
293
- id,
294
- name,
295
- onChange,
296
- inline = false
297
- }) => ({
298
- t: 'div',
299
- a: { class: `form-check ${inline ? 'form-check-inline' : ''}`.trim() },
300
- c: [
301
- {
302
- t: 'input',
303
- a: {
304
- type: 'checkbox',
305
- class: 'form-check-input',
306
- checked,
307
- disabled,
308
- id,
309
- name,
310
- onchange: onChange
311
- }
312
- },
313
- label && {
314
- t: 'label',
315
- a: { class: 'form-check-label', for: id },
316
- c: label
317
- }
318
- ].filter(Boolean)
319
- });
320
-
321
- export const Radio = ({
322
- label,
323
- value,
324
- checked = false,
325
- disabled = false,
326
- id,
327
- name,
328
- onChange,
329
- inline = false
330
- }) => ({
331
- t: 'div',
332
- a: { class: `form-check ${inline ? 'form-check-inline' : ''}`.trim() },
333
- c: [
334
- {
335
- t: 'input',
336
- a: {
337
- type: 'radio',
338
- class: 'form-check-input',
339
- value,
340
- checked,
341
- disabled,
342
- id,
343
- name,
344
- onchange: onChange
345
- }
346
- },
347
- label && {
348
- t: 'label',
349
- a: { class: 'form-check-label', for: id },
350
- c: label
351
- }
352
- ].filter(Boolean)
353
- });
354
-
355
- // Table Components
356
- export const Table = ({
357
- data = [],
358
- columns = [],
359
- striped = true,
360
- hover = true,
361
- bordered = false,
362
- small = false,
363
- responsive = true,
364
- sortable = false,
365
- onSort
366
- }) => {
367
- const table = {
368
- t: 'table',
369
- a: {
370
- class: [
371
- 'table',
372
- striped && 'table-striped',
373
- hover && 'table-hover',
374
- bordered && 'table-bordered',
375
- small && 'table-sm'
376
- ].filter(Boolean).join(' ')
377
- },
378
- c: [
379
- columns.length > 0 && {
380
- t: 'thead',
381
- c: {
382
- t: 'tr',
383
- c: columns.map((col, idx) => ({
384
- t: 'th',
385
- a: {
386
- scope: 'col',
387
- style: sortable && col.sortable !== false ? { cursor: 'pointer' } : undefined,
388
- onclick: sortable && col.sortable !== false && onSort ? () => onSort(col.key || idx) : undefined
389
- },
390
- c: [
391
- col.label || col,
392
- sortable && col.sortable !== false && {
393
- t: 'span',
394
- a: { class: 'ms-1' },
395
- c: '↕'
396
- }
397
- ].filter(Boolean)
398
- }))
399
- }
400
- },
401
- {
402
- t: 'tbody',
403
- c: data.map(row => ({
404
- t: 'tr',
405
- c: columns.length > 0
406
- ? columns.map(col => ({
407
- t: 'td',
408
- c: col.render ? col.render(row[col.key], row) : row[col.key]
409
- }))
410
- : (Array.isArray(row) ? row : Object.values(row)).map(cell => ({
411
- t: 'td',
412
- c: cell
413
- }))
414
- }))
415
- }
416
- ].filter(Boolean)
417
- };
418
-
419
- return responsive ? {
420
- t: 'div',
421
- a: { class: 'table-responsive' },
422
- c: table
423
- } : table;
424
- };
425
-
426
- // List Group Components
427
- export const ListGroup = ({ items = [], flush = false, numbered = false }) => ({
428
- t: numbered ? 'ol' : 'ul',
429
- a: { class: `list-group ${flush ? 'list-group-flush' : ''} ${numbered ? 'list-group-numbered' : ''}`.trim() },
430
- c: items.map(item => ({
431
- t: 'li',
432
- a: {
433
- class: [
434
- 'list-group-item',
435
- item.active && 'active',
436
- item.disabled && 'disabled',
437
- item.variant && `list-group-item-${item.variant}`
438
- ].filter(Boolean).join(' ')
439
- },
440
- c: item.content || item
441
- }))
442
- });
443
-
444
- // Modal Components (simplified for now)
445
- export const Modal = ({ title, body, footer, show = false, onClose }) => ({
446
- t: 'div',
447
- a: {
448
- class: `modal ${show ? 'd-block' : 'd-none'}`,
449
- style: show ? { backgroundColor: 'rgba(0,0,0,0.5)' } : undefined,
450
- onclick: (e) => {
451
- if (e.target.classList.contains('modal') && onClose) onClose();
452
- }
453
- },
454
- c: {
455
- t: 'div',
456
- a: { class: 'modal-dialog' },
457
- c: {
458
- t: 'div',
459
- a: { class: 'modal-content' },
460
- c: [
461
- {
462
- t: 'div',
463
- a: { class: 'modal-header' },
464
- c: [
465
- { t: 'h5', a: { class: 'modal-title' }, c: title },
466
- {
467
- t: 'button',
468
- a: {
469
- type: 'button',
470
- class: 'btn-close',
471
- onclick: onClose
472
- }
473
- }
474
- ]
475
- },
476
- {
477
- t: 'div',
478
- a: { class: 'modal-body' },
479
- c: body
480
- },
481
- footer && {
482
- t: 'div',
483
- a: { class: 'modal-footer' },
484
- c: footer
485
- }
486
- ].filter(Boolean)
487
- }
488
- }
489
- });
490
-
491
- // Spacing utility
492
- export const Spacer = ({ size = 3 }) => ({
493
- t: 'div',
494
- a: { class: `mb-${size}` }
495
- });
496
-
497
- // Page Layout Components
498
- export const PageHeader = ({ title, subtitle, breadcrumb }) => ({
499
- t: 'div',
500
- a: { class: 'page-header mb-4' },
501
- c: [
502
- breadcrumb && {
503
- t: 'nav',
504
- a: { 'aria-label': 'breadcrumb' },
505
- c: {
506
- t: 'ol',
507
- a: { class: 'breadcrumb' },
508
- c: breadcrumb.map((item, idx) => ({
509
- t: 'li',
510
- a: {
511
- class: `breadcrumb-item ${idx === breadcrumb.length - 1 ? 'active' : ''}`,
512
- 'aria-current': idx === breadcrumb.length - 1 ? 'page' : undefined
513
- },
514
- c: item.href && idx !== breadcrumb.length - 1 ? {
515
- t: 'a',
516
- a: { href: item.href },
517
- c: item.text
518
- } : item.text || item
519
- }))
520
- }
521
- },
522
- {
523
- t: 'h1',
524
- a: { class: 'display-4' },
525
- c: title
526
- },
527
- subtitle && {
528
- t: 'p',
529
- a: { class: 'lead' },
530
- c: subtitle
531
- }
532
- ].filter(Boolean)
533
- });
534
-
535
- // Stat Card for dashboards
536
- export const StatCard = ({ title, value, change, icon, variant = 'primary' }) => ({
537
- t: 'div',
538
- a: { class: 'card' },
539
- c: {
540
- t: 'div',
541
- a: { class: 'card-body' },
542
- c: [
543
- {
544
- t: 'div',
545
- a: { class: 'd-flex justify-content-between align-items-center' },
546
- c: [
547
- {
548
- t: 'div',
549
- c: [
550
- { t: 'h6', a: { class: 'text-muted mb-2' }, c: title },
551
- { t: 'h2', a: { class: 'mb-0' }, c: value },
552
- change && {
553
- t: 'small',
554
- a: {
555
- class: `text-${change > 0 ? 'success' : 'danger'}`
556
- },
557
- c: `${change > 0 ? '↑' : '↓'} ${Math.abs(change)}%`
558
- }
559
- ].filter(Boolean)
560
- },
561
- icon && {
562
- t: 'div',
563
- a: {
564
- class: `text-${variant}`,
565
- style: { fontSize: '3rem', opacity: 0.3 }
566
- },
567
- c: icon
568
- }
569
- ].filter(Boolean)
570
- }
571
- ]
572
- }
573
- });
574
-
575
- // Export all components
576
- export default {
577
- // Layout
578
- Navbar,
579
- Container,
580
- Row,
581
- Col,
582
- PageHeader,
583
- Spacer,
584
-
585
- // Components
586
- Card,
587
- Button,
588
- ButtonGroup,
589
- Alert,
590
- Badge,
591
- Progress,
592
-
593
- // Forms
594
- FormGroup,
595
- Input,
596
- Select,
597
- Textarea,
598
- Checkbox,
599
- Radio,
600
-
601
- // Data
602
- Table,
603
- ListGroup,
604
-
605
- // Overlays
606
- Modal,
607
-
608
- // Dashboard
609
- StatCard
610
- };
File without changes