bitwrench 2.0.14 → 2.0.15

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 (45) hide show
  1. package/dist/bitwrench-code-edit.cjs.js +46 -46
  2. package/dist/bitwrench-code-edit.cjs.min.js +16 -0
  3. package/dist/bitwrench-code-edit.es5.js +8 -8
  4. package/dist/bitwrench-code-edit.es5.min.js +2 -2
  5. package/dist/bitwrench-code-edit.esm.js +46 -46
  6. package/dist/bitwrench-code-edit.esm.min.js +2 -2
  7. package/dist/bitwrench-code-edit.umd.js +46 -46
  8. package/dist/bitwrench-code-edit.umd.min.js +2 -2
  9. package/dist/bitwrench-lean.cjs.js +4551 -3272
  10. package/dist/bitwrench-lean.cjs.min.js +35 -6
  11. package/dist/bitwrench-lean.es5.js +5747 -4414
  12. package/dist/bitwrench-lean.es5.min.js +32 -3
  13. package/dist/bitwrench-lean.esm.js +4551 -3272
  14. package/dist/bitwrench-lean.esm.min.js +35 -6
  15. package/dist/bitwrench-lean.umd.js +4551 -3272
  16. package/dist/bitwrench-lean.umd.min.js +35 -6
  17. package/dist/bitwrench.cjs.js +4739 -3720
  18. package/dist/bitwrench.cjs.min.js +38 -8
  19. package/dist/bitwrench.css +2253 -6041
  20. package/dist/bitwrench.es5.js +6234 -5130
  21. package/dist/bitwrench.es5.min.js +34 -5
  22. package/dist/bitwrench.esm.js +4739 -3720
  23. package/dist/bitwrench.esm.min.js +38 -8
  24. package/dist/bitwrench.min.css +1 -0
  25. package/dist/bitwrench.umd.js +4739 -3720
  26. package/dist/bitwrench.umd.min.js +38 -8
  27. package/dist/builds.json +89 -67
  28. package/dist/sri.json +28 -26
  29. package/package.json +7 -5
  30. package/readme.html +10 -10
  31. package/src/{bitwrench-components-v2.js → bitwrench-bccl.js} +396 -647
  32. package/src/bitwrench-code-edit.js +45 -45
  33. package/src/bitwrench-color-utils.js +25 -18
  34. package/src/bitwrench-components-stub.js +4 -1
  35. package/src/bitwrench-file-ops.js +180 -0
  36. package/src/bitwrench-lean.js +2 -2
  37. package/src/bitwrench-styles.js +1275 -4029
  38. package/src/bitwrench-utils.js +458 -0
  39. package/src/bitwrench.js +1686 -1293
  40. package/src/cli/layout-default.js +18 -18
  41. package/src/generate-css.js +73 -53
  42. package/src/version.js +3 -3
  43. package/src/bitwrench-component-base.js +0 -736
  44. package/src/bitwrench-components-inline.js +0 -374
  45. package/src/bitwrench-components.js +0 -610
@@ -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
- };