bitwrench 2.0.32 → 2.1.1

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 (126) hide show
  1. package/README.md +211 -125
  2. package/dist/bitwrench-bccl.cjs.js +349 -188
  3. package/dist/bitwrench-bccl.cjs.min.js +2 -39
  4. package/dist/bitwrench-bccl.cjs.min.js.gz +0 -0
  5. package/dist/bitwrench-bccl.esm.js +349 -188
  6. package/dist/bitwrench-bccl.esm.min.js +2 -39
  7. package/dist/bitwrench-bccl.esm.min.js.gz +0 -0
  8. package/dist/bitwrench-bccl.umd.js +349 -188
  9. package/dist/bitwrench-bccl.umd.min.js +2 -39
  10. package/dist/bitwrench-bccl.umd.min.js.gz +0 -0
  11. package/dist/bitwrench-code-edit.cjs.js +17 -6
  12. package/dist/bitwrench-code-edit.cjs.min.js +2 -20
  13. package/dist/bitwrench-code-edit.es5.js +8 -3
  14. package/dist/bitwrench-code-edit.es5.min.js +2 -19
  15. package/dist/bitwrench-code-edit.esm.js +17 -6
  16. package/dist/bitwrench-code-edit.esm.min.js +2 -19
  17. package/dist/bitwrench-code-edit.umd.js +17 -6
  18. package/dist/bitwrench-code-edit.umd.min.js +2 -19
  19. package/dist/bitwrench-code-edit.umd.min.js.gz +0 -0
  20. package/dist/bitwrench-debug.js +1 -1
  21. package/dist/bitwrench-debug.min.js +1 -1
  22. package/dist/bitwrench-lean.cjs.js +2492 -1628
  23. package/dist/bitwrench-lean.cjs.min.js +2 -80
  24. package/dist/bitwrench-lean.cjs.min.js.gz +0 -0
  25. package/dist/bitwrench-lean.es5.js +2740 -1838
  26. package/dist/bitwrench-lean.es5.min.js +2 -49
  27. package/dist/bitwrench-lean.es5.min.js.gz +0 -0
  28. package/dist/bitwrench-lean.esm.js +2492 -1628
  29. package/dist/bitwrench-lean.esm.min.js +2 -80
  30. package/dist/bitwrench-lean.esm.min.js.gz +0 -0
  31. package/dist/bitwrench-lean.umd.js +2492 -1628
  32. package/dist/bitwrench-lean.umd.min.js +2 -80
  33. package/dist/bitwrench-lean.umd.min.js.gz +0 -0
  34. package/dist/bitwrench-util-color.cjs.js +251 -0
  35. package/dist/bitwrench-util-color.cjs.min.js +3 -0
  36. package/dist/bitwrench-util-color.es5.js +256 -0
  37. package/dist/bitwrench-util-color.es5.min.js +3 -0
  38. package/dist/bitwrench-util-color.esm.js +241 -0
  39. package/dist/bitwrench-util-color.esm.min.js +3 -0
  40. package/dist/bitwrench-util-color.umd.js +257 -0
  41. package/dist/bitwrench-util-color.umd.min.js +3 -0
  42. package/dist/bitwrench-util-css.cjs.js +2 -1
  43. package/dist/bitwrench-util-css.cjs.min.js +2 -21
  44. package/dist/bitwrench-util-css.es5.js +2 -1
  45. package/dist/bitwrench-util-css.es5.min.js +2 -20
  46. package/dist/bitwrench-util-css.esm.js +2 -1
  47. package/dist/bitwrench-util-css.esm.min.js +1 -19
  48. package/dist/bitwrench-util-css.umd.js +2 -1
  49. package/dist/bitwrench-util-css.umd.min.js +2 -20
  50. package/dist/bitwrench-util-css.umd.min.js.gz +0 -0
  51. package/dist/bitwrench.cjs.js +2826 -1801
  52. package/dist/bitwrench.cjs.min.js +2 -99
  53. package/dist/bitwrench.cjs.min.js.gz +0 -0
  54. package/dist/bitwrench.css +403 -479
  55. package/dist/bitwrench.d.ts +70 -73
  56. package/dist/bitwrench.es5.js +3106 -2020
  57. package/dist/bitwrench.es5.min.js +2 -67
  58. package/dist/bitwrench.es5.min.js.gz +0 -0
  59. package/dist/bitwrench.esm.js +2826 -1801
  60. package/dist/bitwrench.esm.min.js +2 -99
  61. package/dist/bitwrench.esm.min.js.gz +0 -0
  62. package/dist/bitwrench.min.css +1 -1
  63. package/dist/bitwrench.umd.js +2826 -1801
  64. package/dist/bitwrench.umd.min.js +2 -99
  65. package/dist/bitwrench.umd.min.js.gz +0 -0
  66. package/dist/builds.json +222 -134
  67. package/dist/bwserve.cjs.js +289 -282
  68. package/dist/bwserve.d.ts +157 -0
  69. package/dist/bwserve.esm.js +290 -283
  70. package/dist/sri.json +54 -46
  71. package/docs/README.md +6 -3
  72. package/docs/app-patterns.md +7 -6
  73. package/docs/bitwrench-for-wasm.md +53 -54
  74. package/docs/bitwrench-mcp.md +2 -2
  75. package/docs/bitwrench-northstar-principles.md +406 -0
  76. package/docs/bitwrench-taco-schema-discussion.md +2 -2
  77. package/docs/bitwrench_api.md +191 -106
  78. package/docs/bitwrench_typescript_usage.md +5 -5
  79. package/docs/bw-attach.md +29 -75
  80. package/docs/bwserve.md +200 -168
  81. package/docs/cli.md +36 -12
  82. package/docs/component-cheatsheet.md +2 -2
  83. package/docs/component-library.md +4 -4
  84. package/docs/component-lifecycle.md +234 -0
  85. package/docs/drift-lint.md +268 -0
  86. package/docs/framework-translation-table.md +4 -4
  87. package/docs/llm-bitwrench-guide.md +60 -50
  88. package/docs/routing.md +11 -13
  89. package/docs/state-management.md +110 -109
  90. package/docs/taco-format.md +13 -14
  91. package/docs/theming.md +13 -3
  92. package/docs/thinking-in-bitwrench.md +858 -983
  93. package/docs/tutorial-bwserve.md +37 -36
  94. package/docs/tutorial-embedded.md +10 -21
  95. package/docs/tutorial-website.md +2 -2
  96. package/package.json +38 -7
  97. package/readme.html +262 -161
  98. package/src/bitwrench-bccl-entry.js +2 -2
  99. package/src/bitwrench-bccl.js +346 -185
  100. package/src/bitwrench-code-edit.js +16 -5
  101. package/src/bitwrench-color-utils.js +117 -181
  102. package/src/bitwrench-file-ops.js +2 -2
  103. package/src/bitwrench-lean.js +4 -3
  104. package/src/bitwrench-router.js +5 -2
  105. package/src/bitwrench-styles.js +420 -504
  106. package/src/bitwrench-util-color.js +240 -0
  107. package/src/bitwrench-util-css.js +1 -0
  108. package/src/bitwrench-utils.js +4 -0
  109. package/src/bitwrench.d.ts +70 -73
  110. package/src/bitwrench.h +5 -0
  111. package/src/bitwrench.js +1939 -933
  112. package/src/bwserve/attach.js +0 -1
  113. package/src/bwserve/bwclient.js +172 -32
  114. package/src/bwserve/bwshell.js +0 -4
  115. package/src/bwserve/client.js +59 -220
  116. package/src/bwserve/index.js +59 -26
  117. package/src/bwserve.d.ts +157 -0
  118. package/src/bwserve.h +5 -0
  119. package/src/cli/attach.js +12 -75
  120. package/src/cli/convert.js +2 -2
  121. package/src/cli/serve.js +37 -35
  122. package/src/generate-css.js +1 -1
  123. package/src/mcp/knowledge.js +4 -4
  124. package/src/mcp/live.js +21 -13
  125. package/src/mcp/tools.js +0 -1
  126. package/src/version.js +3 -7
@@ -22,7 +22,7 @@
22
22
  * @author M A Chatterjee <deftio [at] deftio [dot] com>
23
23
  */
24
24
 
25
- import { derivePalette, deriveShades, adjustLightness, mixColor, textOnColor, hexToHsl, hslToHex } from './bitwrench-color-utils.js';
25
+ import { derivePalette } from './bitwrench-color-utils.js';
26
26
 
27
27
  // Re-export for use by bitwrench.js
28
28
  export { derivePalette };
@@ -214,10 +214,14 @@ export function resolveLayout(config) {
214
214
  */
215
215
  function scopeSelector(name, sel) {
216
216
  if (!name) return sel;
217
+ /* c8 ignore next -- scopeSelector never receives comma-separated selectors from internal callers */
217
218
  if (sel.includes(',')) return sel.split(',').map(function(s) { return '.' + name + ' ' + s.trim(); }).join(', ');
218
219
  return '.' + name + ' ' + sel;
219
220
  }
220
221
  var _sx=scopeSelector;
222
+ function _tr(p,m,s){var d=m[s||'fast'];return p.split(',').map(function(x){return x.trim()+' '+d+' '+m.easing;}).join(', ');}
223
+ function _fr(f,sz){return '0 0 0 '+(sz||'0.25rem')+' '+f;}
224
+ function _sf(p){return p.surface||'#fff';}
221
225
 
222
226
  // =========================================================================
223
227
  // Themed CSS generators
@@ -229,7 +233,7 @@ function generateTypographyThemed(scope, palette, layout) {
229
233
  rules[_sx(scope, 'a')] = {
230
234
  'color': palette.primary.base,
231
235
  'text-decoration': 'none',
232
- 'transition': 'color ' + mot.fast + ' ' + mot.easing
236
+ 'transition': _tr('color', mot)
233
237
  };
234
238
  rules[_sx(scope, 'a:hover')] = {
235
239
  'color': palette.tertiary.hover,
@@ -244,25 +248,25 @@ function generateButtons(scope, palette, layout) {
244
248
  var rd = layout.radius;
245
249
 
246
250
  // Base button (only when scoped — unscoped uses defaultStyles)
247
- rules[_sx(scope, '.bw_btn')] = {
251
+ rules[_sx(scope, '.bw_bccl_btn')] = {
248
252
  'padding': sp.btn,
249
253
  'border-radius': rd.btn
250
254
  };
251
- rules[_sx(scope, '.bw_btn:focus-visible')] = {
255
+ rules[_sx(scope, '.bw_bccl_btn:focus-visible')] = {
252
256
  'outline': '2px solid currentColor',
253
257
  'outline-offset': '2px',
254
- 'box-shadow': '0 0 0 3px ' + palette.primary.focus
258
+ 'box-shadow': _fr(palette.primary.focus, '3px')
255
259
  };
256
260
 
257
261
  // Variant colors handled by palette class on component root
258
262
 
259
263
  // Size variants (structural, reuse layout radius)
260
- rules[_sx(scope, '.bw_btn_lg')] = {
264
+ rules[_sx(scope, '.bw_bccl_btn_lg')] = {
261
265
  'padding': '0.625rem 1.5rem',
262
266
  'font-size': '1rem',
263
267
  'border-radius': rd.btn === '50rem' ? '50rem' : (parseInt(rd.btn) + 2) + 'px'
264
268
  };
265
- rules[_sx(scope, '.bw_btn_sm')] = {
269
+ rules[_sx(scope, '.bw_bccl_btn_sm')] = {
266
270
  'padding': '0.25rem 0.75rem',
267
271
  'font-size': '0.8125rem',
268
272
  'border-radius': rd.btn === '50rem' ? '50rem' : (Math.max(parseInt(rd.btn) - 1, 0)) + 'px'
@@ -276,7 +280,7 @@ function generateAlerts(scope, palette, layout) {
276
280
  var sp = layout.spacing;
277
281
  var rd = layout.radius;
278
282
 
279
- rules[_sx(scope, '.bw_alert')] = {
283
+ rules[_sx(scope, '.bw_bccl_alert')] = {
280
284
  'padding': sp.alert,
281
285
  'border-radius': rd.alert
282
286
  };
@@ -295,39 +299,39 @@ function generateCards(scope, palette, layout) {
295
299
 
296
300
  var elev = layout.elevation;
297
301
  var motion = layout.motion;
298
- rules[_sx(scope, '.bw_card')] = {
299
- 'background-color': palette.surface || '#fff',
302
+ rules[_sx(scope, '.bw_bccl_card')] = {
303
+ 'background-color': _sf(palette),
300
304
  'border': '1px solid ' + palette.light.border,
301
305
  'border-radius': rd.card,
302
306
  'box-shadow': elev.sm,
303
- 'transition': 'box-shadow ' + motion.normal + ' ' + motion.easing + ', transform ' + motion.normal + ' ' + motion.easing
307
+ 'transition': _tr('box-shadow,transform', motion, 'normal')
304
308
  };
305
- rules[_sx(scope, '.bw_card:hover')] = {
309
+ rules[_sx(scope, '.bw_bccl_card:hover')] = {
306
310
  'box-shadow': elev.md
307
311
  };
308
- rules[_sx(scope, '.bw_card_hoverable')] = {
309
- 'transition': 'box-shadow ' + motion.slow + ' ' + motion.easing + ', transform ' + motion.slow + ' ' + motion.easing
312
+ rules[_sx(scope, '.bw_bccl_card_hoverable')] = {
313
+ 'transition': _tr('box-shadow,transform', motion, 'slow')
310
314
  };
311
- rules[_sx(scope, '.bw_card_hoverable:hover')] = {
315
+ rules[_sx(scope, '.bw_bccl_card_hoverable:hover')] = {
312
316
  'box-shadow': elev.lg
313
317
  };
314
- rules[_sx(scope, '.bw_card_body')] = {
318
+ rules[_sx(scope, '.bw_bccl_card_body')] = {
315
319
  'padding': sp.card
316
320
  };
317
- rules[_sx(scope, '.bw_card_header')] = {
321
+ rules[_sx(scope, '.bw_bccl_card_header')] = {
318
322
  'padding': sp.card.split(' ').map(function(v) { return (parseFloat(v) * 0.7).toFixed(3).replace(/\.?0+$/, '') + 'rem'; }).join(' '),
319
323
  'background-color': palette.surfaceAlt,
320
324
  'border-bottom': '1px solid ' + palette.light.border
321
325
  };
322
- rules[_sx(scope, '.bw_card_footer')] = {
326
+ rules[_sx(scope, '.bw_bccl_card_footer')] = {
323
327
  'background-color': palette.surfaceAlt,
324
328
  'border-top': '1px solid ' + palette.light.border,
325
329
  'color': palette.secondary.base
326
330
  };
327
- rules[_sx(scope, '.bw_card_title')] = {
331
+ rules[_sx(scope, '.bw_bccl_card_title')] = {
328
332
  'color': palette.dark.base
329
333
  };
330
- rules[_sx(scope, '.bw_card_subtitle')] = {
334
+ rules[_sx(scope, '.bw_bccl_card_subtitle')] = {
331
335
  'color': palette.secondary.base
332
336
  };
333
337
 
@@ -341,57 +345,57 @@ function generateForms(scope, palette, layout) {
341
345
  var sp = layout.spacing;
342
346
  var rd = layout.radius;
343
347
 
344
- rules[_sx(scope, '.bw_form_control')] = {
348
+ rules[_sx(scope, '.bw_bccl_form_control')] = {
345
349
  'padding': sp.input,
346
350
  'border-radius': rd.input,
347
351
  'color': palette.dark.base,
348
- 'background-color': palette.surface || '#fff',
352
+ 'background-color': _sf(palette),
349
353
  'border-color': palette.light.border
350
354
  };
351
- rules[_sx(scope, '.bw_form_control:focus')] = {
355
+ rules[_sx(scope, '.bw_bccl_form_control:focus')] = {
352
356
  'border-color': palette.primary.border,
353
357
  'outline': '2px solid ' + palette.primary.base,
354
358
  'outline-offset': '-1px',
355
- 'box-shadow': '0 0 0 0.25rem ' + palette.primary.focus
359
+ 'box-shadow': _fr(palette.primary.focus)
356
360
  };
357
- rules[_sx(scope, '.bw_form_control::placeholder')] = {
361
+ rules[_sx(scope, '.bw_bccl_form_control::placeholder')] = {
358
362
  'color': palette.secondary.base
359
363
  };
360
- rules[_sx(scope, '.bw_form_label')] = {
364
+ rules[_sx(scope, '.bw_bccl_form_label')] = {
361
365
  'color': palette.dark.base
362
366
  };
363
- rules[_sx(scope, '.bw_form_text')] = {
367
+ rules[_sx(scope, '.bw_bccl_form_text')] = {
364
368
  'color': palette.secondary.base
365
369
  };
366
- rules[_sx(scope, '.bw_form_check_input:checked')] = {
370
+ rules[_sx(scope, '.bw_bccl_form_check_input:checked')] = {
367
371
  'background-color': palette.primary.base,
368
372
  'border-color': palette.primary.base
369
373
  };
370
- rules[_sx(scope, '.bw_form_check_input:focus')] = {
371
- 'box-shadow': '0 0 0 0.25rem ' + palette.primary.focus
374
+ rules[_sx(scope, '.bw_bccl_form_check_input:focus')] = {
375
+ 'box-shadow': _fr(palette.primary.focus)
372
376
  };
373
377
  // Validation states
374
- rules[_sx(scope, '.bw_form_control.bw_is_valid')] = { 'border-color': palette.success.base };
375
- rules[_sx(scope, '.bw_form_control.bw_is_valid:focus')] = {
378
+ rules[_sx(scope, '.bw_bccl_form_control.bw_is_valid')] = { 'border-color': palette.success.base };
379
+ rules[_sx(scope, '.bw_bccl_form_control.bw_is_valid:focus')] = {
376
380
  'border-color': palette.success.base,
377
- 'box-shadow': '0 0 0 0.2rem ' + palette.success.focus
381
+ 'box-shadow': _fr(palette.success.focus, '0.2rem')
378
382
  };
379
- rules[_sx(scope, '.bw_form_control.bw_is_invalid')] = { 'border-color': palette.danger.base };
380
- rules[_sx(scope, '.bw_form_control.bw_is_invalid:focus')] = {
383
+ rules[_sx(scope, '.bw_bccl_form_control.bw_is_invalid')] = { 'border-color': palette.danger.base };
384
+ rules[_sx(scope, '.bw_bccl_form_control.bw_is_invalid:focus')] = {
381
385
  'border-color': palette.danger.base,
382
- 'box-shadow': '0 0 0 0.2rem ' + palette.danger.focus
386
+ 'box-shadow': _fr(palette.danger.focus, '0.2rem')
383
387
  };
384
388
  // Form select
385
- rules[_sx(scope, '.bw_form_select')] = {
389
+ rules[_sx(scope, '.bw_bccl_form_select')] = {
386
390
  'padding': sp.input,
387
391
  'border-radius': rd.input,
388
392
  'color': palette.dark.base,
389
- 'background-color': palette.surface || '#fff',
393
+ 'background-color': _sf(palette),
390
394
  'border-color': palette.light.border
391
395
  };
392
- rules[_sx(scope, '.bw_form_select:focus')] = {
396
+ rules[_sx(scope, '.bw_bccl_form_select:focus')] = {
393
397
  'border-color': palette.primary.border,
394
- 'box-shadow': '0 0 0 0.25rem ' + palette.primary.focus
398
+ 'box-shadow': _fr(palette.primary.focus)
395
399
  };
396
400
 
397
401
  return rules;
@@ -399,41 +403,41 @@ function generateForms(scope, palette, layout) {
399
403
 
400
404
  function generateNavigation(scope, palette, layout) {
401
405
  var rules = {};
402
- rules[_sx(scope, '.bw_navbar')] = {
406
+ rules[_sx(scope, '.bw_bccl_navbar')] = {
403
407
  'background-color': palette.surfaceAlt,
404
408
  'border-bottom-color': palette.light.border
405
409
  };
406
- rules[_sx(scope, '.bw_navbar_brand')] = {
410
+ rules[_sx(scope, '.bw_bccl_navbar_brand')] = {
407
411
  'color': palette.dark.base
408
412
  };
409
- rules[_sx(scope, '.bw_navbar_nav .bw_nav_link')] = {
413
+ rules[_sx(scope, '.bw_bccl_navbar_nav .bw_nav_link')] = {
410
414
  'color': palette.secondary.base,
411
415
  'border-radius': layout.radius.btn,
412
- 'transition': 'color ' + layout.motion.fast + ' ' + layout.motion.easing + ', background-color ' + layout.motion.fast + ' ' + layout.motion.easing
416
+ 'transition': _tr('color,background-color', layout.motion)
413
417
  };
414
- rules[_sx(scope, '.bw_navbar_nav .bw_nav_link:hover')] = {
418
+ rules[_sx(scope, '.bw_bccl_navbar_nav .bw_nav_link:hover')] = {
415
419
  'color': palette.tertiary.base,
416
420
  'background-color': palette.surfaceAlt
417
421
  };
418
- rules[_sx(scope, '.bw_navbar_nav .bw_nav_link.active')] = {
422
+ rules[_sx(scope, '.bw_bccl_navbar_nav .bw_nav_link.active')] = {
419
423
  'color': palette.primary.base,
420
424
  'background-color': palette.primary.focus,
421
425
  'font-weight': '600'
422
426
  };
423
- rules[_sx(scope, '.bw_navbar_dark')] = {
427
+ rules[_sx(scope, '.bw_bccl_navbar_dark')] = {
424
428
  'background-color': palette.dark.base,
425
429
  'border-bottom-color': palette.dark.hover
426
430
  };
427
- rules[_sx(scope, '.bw_navbar_dark .bw_navbar_brand')] = {
431
+ rules[_sx(scope, '.bw_bccl_navbar_dark .bw_bccl_navbar_brand')] = {
428
432
  'color': palette.light.base
429
433
  };
430
- rules[_sx(scope, '.bw_navbar_dark .bw_nav_link')] = {
434
+ rules[_sx(scope, '.bw_bccl_navbar_dark .bw_nav_link')] = {
431
435
  'color': palette.light.border
432
436
  };
433
- rules[_sx(scope, '.bw_navbar_dark .bw_nav_link:hover')] = {
437
+ rules[_sx(scope, '.bw_bccl_navbar_dark .bw_nav_link:hover')] = {
434
438
  'color': palette.light.base
435
439
  };
436
- rules[_sx(scope, '.bw_navbar_dark .bw_nav_link.active')] = {
440
+ rules[_sx(scope, '.bw_bccl_navbar_dark .bw_nav_link.active')] = {
437
441
  'color': palette.light.base,
438
442
  'font-weight': '600'
439
443
  };
@@ -448,35 +452,35 @@ function generateTables(scope, palette, layout) {
448
452
  var rules = {};
449
453
  var sp = layout.spacing;
450
454
 
451
- rules[_sx(scope, '.bw_table')] = {
455
+ rules[_sx(scope, '.bw_bccl_table')] = {
452
456
  'color': palette.dark.base,
453
457
  'border-color': palette.light.border
454
458
  };
455
- rules[_sx(scope, '.bw_table > :not(caption) > * > *')] = {
459
+ rules[_sx(scope, '.bw_bccl_table > :not(caption) > * > *')] = {
456
460
  'padding': sp.cell,
457
461
  'border-bottom-color': palette.light.border
458
462
  };
459
- rules[_sx(scope, '.bw_table > thead > tr > *')] = {
463
+ rules[_sx(scope, '.bw_bccl_table > thead > tr > *')] = {
460
464
  'color': palette.secondary.base,
461
465
  'border-bottom-color': palette.light.border,
462
466
  'background-color': palette.surfaceAlt
463
467
  };
464
- rules[_sx(scope, '.bw_table_striped > tbody > tr:nth-of-type(odd) > *')] = {
468
+ rules[_sx(scope, '.bw_bccl_table_striped > tbody > tr:nth-of-type(odd) > *')] = {
465
469
  'background-color': palette.surfaceAlt
466
470
  };
467
- rules[_sx(scope, '.bw_table_hover > tbody > tr:hover > *')] = {
471
+ rules[_sx(scope, '.bw_bccl_table_hover > tbody > tr:hover > *')] = {
468
472
  'background-color': palette.primary.focus
469
473
  };
470
- rules[_sx(scope, '.bw_table_selectable > tbody > tr')] = {
474
+ rules[_sx(scope, '.bw_bccl_table_selectable > tbody > tr')] = {
471
475
  'cursor': 'pointer'
472
476
  };
473
- rules[_sx(scope, '.bw_table > tbody > tr.bw_table_row_selected > *')] = {
477
+ rules[_sx(scope, '.bw_bccl_table > tbody > tr.bw_bccl_table_row_selected > *')] = {
474
478
  'background-color': palette.primary.light
475
479
  };
476
- rules[_sx(scope, '.bw_table_bordered')] = {
480
+ rules[_sx(scope, '.bw_bccl_table_bordered')] = {
477
481
  'border-color': palette.light.border
478
482
  };
479
- rules[_sx(scope, '.bw_table caption')] = {
483
+ rules[_sx(scope, '.bw_bccl_table caption')] = {
480
484
  'color': palette.secondary.base
481
485
  };
482
486
 
@@ -490,7 +494,7 @@ function generateTabs(scope, palette, layout) {
490
494
  };
491
495
  rules[_sx(scope, '.bw_nav_link')] = {
492
496
  'color': palette.secondary.base,
493
- 'transition': 'color ' + mo.fast + ' ' + mo.easing + ', border-color ' + mo.fast + ' ' + mo.easing + ', background-color ' + mo.fast + ' ' + mo.easing
497
+ 'transition': _tr('color,border-color,background-color', mo)
494
498
  };
495
499
  rules[_sx(scope, '.bw_nav_tabs .bw_nav_link:hover')] = {
496
500
  'color': palette.tertiary.base,
@@ -513,9 +517,9 @@ function generateListGroups(scope, palette, layout) {
513
517
  rules[_sx(scope, '.bw_list_group_item')] = {
514
518
  'padding': sp.cell,
515
519
  'color': palette.dark.base,
516
- 'background-color': palette.surface || '#fff',
520
+ 'background-color': _sf(palette),
517
521
  'border-color': palette.light.border,
518
- 'transition': 'color ' + mo.fast + ' ' + mo.easing + ', background-color ' + mo.fast + ' ' + mo.easing
522
+ 'transition': _tr('color,background-color', mo)
519
523
  };
520
524
  rules[_sx(scope, 'a.bw_list_group_item:hover')] = {
521
525
  'background-color': palette.surfaceAlt,
@@ -528,7 +532,7 @@ function generateListGroups(scope, palette, layout) {
528
532
  };
529
533
  rules[_sx(scope, '.bw_list_group_item.disabled')] = {
530
534
  'color': palette.secondary.base,
531
- 'background-color': palette.surface || '#fff'
535
+ 'background-color': _sf(palette)
532
536
  };
533
537
 
534
538
  return rules;
@@ -546,9 +550,9 @@ function generatePagination(scope, palette, layout) {
546
550
  };
547
551
  rules[_sx(scope, '.bw_page_link')] = {
548
552
  'color': palette.primary.base,
549
- 'background-color': palette.surface || '#fff',
553
+ 'background-color': _sf(palette),
550
554
  'border-color': palette.light.border,
551
- 'transition': 'color ' + mo.fast + ' ' + mo.easing + ', background-color ' + mo.fast + ' ' + mo.easing
555
+ 'transition': _tr('color,background-color', mo)
552
556
  };
553
557
  rules[_sx(scope, '.bw_page_link:hover')] = {
554
558
  'color': palette.primary.hover,
@@ -566,7 +570,7 @@ function generatePagination(scope, palette, layout) {
566
570
  };
567
571
  rules[_sx(scope, '.bw_page_item.bw_disabled .bw_page_link')] = {
568
572
  'color': palette.secondary.base,
569
- 'background-color': palette.surface || '#fff',
573
+ 'background-color': _sf(palette),
570
574
  'border-color': palette.light.border
571
575
  };
572
576
  return rules;
@@ -574,13 +578,13 @@ function generatePagination(scope, palette, layout) {
574
578
 
575
579
  function generateProgress(scope, palette, layout) {
576
580
  var rules = {};
577
- var rd = layout ? layout.radius : { badge: '.375rem' };
578
- rules[_sx(scope, '.bw_progress')] = {
581
+ var rd = layout.radius;
582
+ rules[_sx(scope, '.bw_bccl_progress')] = {
579
583
  'background-color': palette.surfaceAlt,
580
584
  'border-radius': rd.badge,
581
585
  'box-shadow': 'inset 0 1px 2px rgba(0,0,0,.1)'
582
586
  };
583
- rules[_sx(scope, '.bw_progress_bar')] = {
587
+ rules[_sx(scope, '.bw_bccl_progress_bar')] = {
584
588
  'color': palette.primary.textOn,
585
589
  'background-color': palette.primary.base,
586
590
  'border-radius': 'inherit',
@@ -590,7 +594,7 @@ function generateProgress(scope, palette, layout) {
590
594
  return rules;
591
595
  }
592
596
 
593
- // generateHero: removed — palette class with .bw_hero override handles variants
597
+ // generateHero: removed — palette class with .bw_bccl_hero override handles variants
594
598
 
595
599
  // generateUtilityColors: removed — palette classes replace utility colors
596
600
 
@@ -611,23 +615,23 @@ function generateResetThemed(scope, palette) {
611
615
 
612
616
  function generateBreadcrumbThemed(scope, palette, layout) {
613
617
  var rules = {}, mo = layout.motion;
614
- rules[_sx(scope, '.bw_breadcrumb')] = {
618
+ rules[_sx(scope, '.bw_bccl_breadcrumb')] = {
615
619
  'background-color': palette.surfaceAlt,
616
620
  'padding': '0.625rem 1rem',
617
621
  'border-radius': layout.radius.btn
618
622
  };
619
- rules[_sx(scope, '.bw_breadcrumb_item + .bw_breadcrumb_item::before')] = {
623
+ rules[_sx(scope, '.bw_bccl_breadcrumb_item + .bw_bccl_breadcrumb_item::before')] = {
620
624
  'color': palette.secondary.base
621
625
  };
622
- rules[_sx(scope, '.bw_breadcrumb_item a')] = {
626
+ rules[_sx(scope, '.bw_bccl_breadcrumb_item a')] = {
623
627
  'color': palette.tertiary.base,
624
- 'transition': 'color ' + mo.fast + ' ' + mo.easing
628
+ 'transition': _tr('color', mo)
625
629
  };
626
- rules[_sx(scope, '.bw_breadcrumb_item a:hover')] = {
630
+ rules[_sx(scope, '.bw_bccl_breadcrumb_item a:hover')] = {
627
631
  'color': palette.tertiary.hover,
628
632
  'text-decoration': 'underline'
629
633
  };
630
- rules[_sx(scope, '.bw_breadcrumb_item.active')] = {
634
+ rules[_sx(scope, '.bw_bccl_breadcrumb_item.active')] = {
631
635
  'color': palette.dark.base
632
636
  };
633
637
  return rules;
@@ -642,7 +646,7 @@ function generateCloseButtonThemed(scope, palette) {
642
646
  'opacity': '0.5'
643
647
  };
644
648
  rules[_sx(scope, '.bw_close:focus')] = {
645
- 'box-shadow': '0 0 0 0.25rem ' + palette.primary.focus
649
+ 'box-shadow': _fr(palette.primary.focus)
646
650
  };
647
651
  return rules;
648
652
  }
@@ -663,38 +667,38 @@ function generateSectionsThemed(scope, palette) {
663
667
 
664
668
  function generateAccordionThemed(scope, palette, layout) {
665
669
  var rules = {};
666
- var rd = layout ? layout.radius : { card: '8px' };
667
- rules[_sx(scope, '.bw_accordion_item')] = {
668
- 'background-color': palette.surface || '#fff',
670
+ var rd = layout.radius;
671
+ rules[_sx(scope, '.bw_bccl_accordion_item')] = {
672
+ 'background-color': _sf(palette),
669
673
  'border-color': palette.light.border
670
674
  };
671
- rules[_sx(scope, '.bw_accordion_item:first-child')] = {
675
+ rules[_sx(scope, '.bw_bccl_accordion_item:first-child')] = {
672
676
  'border-top-left-radius': rd.card,
673
677
  'border-top-right-radius': rd.card
674
678
  };
675
- rules[_sx(scope, '.bw_accordion_item:last-child')] = {
679
+ rules[_sx(scope, '.bw_bccl_accordion_item:last-child')] = {
676
680
  'border-bottom-left-radius': rd.card,
677
681
  'border-bottom-right-radius': rd.card
678
682
  };
679
- rules[_sx(scope, '.bw_accordion_button')] = {
683
+ rules[_sx(scope, '.bw_bccl_accordion_button')] = {
680
684
  'color': palette.dark.base
681
685
  };
682
- rules[_sx(scope, '.bw_accordion_button:not(.bw_collapsed)')] = {
686
+ rules[_sx(scope, '.bw_bccl_accordion_button:not(.bw_collapsed)')] = {
683
687
  'color': palette.primary.darkText,
684
688
  'background-color': palette.primary.light,
685
689
  'border-left': '3px solid ' + palette.primary.base
686
690
  };
687
- rules[_sx(scope, '.bw_accordion_button:hover')] = {
691
+ rules[_sx(scope, '.bw_bccl_accordion_button:hover')] = {
688
692
  'background-color': palette.surfaceAlt
689
693
  };
690
- rules[_sx(scope, '.bw_accordion_button:not(.bw_collapsed):hover')] = {
694
+ rules[_sx(scope, '.bw_bccl_accordion_button:not(.bw_collapsed):hover')] = {
691
695
  'background-color': palette.primary.base,
692
696
  'color': palette.primary.textOn
693
697
  };
694
- rules[_sx(scope, '.bw_accordion_button:focus-visible')] = {
695
- 'box-shadow': '0 0 0 0.2rem ' + palette.primary.focus
698
+ rules[_sx(scope, '.bw_bccl_accordion_button:focus-visible')] = {
699
+ 'box-shadow': _fr(palette.primary.focus, '0.2rem')
696
700
  };
697
- rules[_sx(scope, '.bw_accordion_body')] = {
701
+ rules[_sx(scope, '.bw_bccl_accordion_body')] = {
698
702
  'border-top': '1px solid ' + palette.light.border,
699
703
  'background-color': palette.surfaceAlt
700
704
  };
@@ -703,21 +707,21 @@ function generateAccordionThemed(scope, palette, layout) {
703
707
 
704
708
  function generateCarouselThemed(scope, palette) {
705
709
  var rules = {};
706
- rules[_sx(scope, '.bw_carousel')] = {
710
+ rules[_sx(scope, '.bw_bccl_carousel')] = {
707
711
  'background-color': palette.surfaceAlt
708
712
  };
709
- rules[_sx(scope, '.bw_carousel_indicator.active')] = {
713
+ rules[_sx(scope, '.bw_bccl_carousel_indicator.active')] = {
710
714
  'background-color': palette.primary.base
711
715
  };
712
- rules[_sx(scope, '.bw_carousel_control')] = {
716
+ rules[_sx(scope, '.bw_bccl_carousel_control')] = {
713
717
  'background-color': palette.dark.base,
714
718
  'color': palette.dark.textOn,
715
719
  'transition': 'background-color 0.15s ease-out'
716
720
  };
717
- rules[_sx(scope, '.bw_carousel_control:hover')] = {
721
+ rules[_sx(scope, '.bw_bccl_carousel_control:hover')] = {
718
722
  'background-color': palette.dark.hover
719
723
  };
720
- rules[_sx(scope, '.bw_carousel_caption')] = {
724
+ rules[_sx(scope, '.bw_bccl_carousel_caption')] = {
721
725
  'background': 'linear-gradient(transparent, ' + palette.dark.base + ')',
722
726
  'color': palette.dark.textOn
723
727
  };
@@ -726,20 +730,20 @@ function generateCarouselThemed(scope, palette) {
726
730
 
727
731
  function generateModalThemed(scope, palette, layout) {
728
732
  var rules = {};
729
- var rd = layout ? layout.radius : { card: '8px' };
730
- rules[_sx(scope, '.bw_modal_content')] = {
731
- 'background-color': palette.surface || '#fff',
733
+ var rd = layout.radius;
734
+ rules[_sx(scope, '.bw_bccl_modal_content')] = {
735
+ 'background-color': _sf(palette),
732
736
  'border-color': palette.light.border,
733
737
  'border-radius': rd.card,
734
738
  'box-shadow': layout.elevation.lg
735
739
  };
736
- rules[_sx(scope, '.bw_modal_header')] = {
740
+ rules[_sx(scope, '.bw_bccl_modal_header')] = {
737
741
  'border-bottom-color': palette.light.border
738
742
  };
739
- rules[_sx(scope, '.bw_modal_footer')] = {
743
+ rules[_sx(scope, '.bw_bccl_modal_footer')] = {
740
744
  'border-top-color': palette.light.border
741
745
  };
742
- rules[_sx(scope, '.bw_modal_title')] = {
746
+ rules[_sx(scope, '.bw_bccl_modal_title')] = {
743
747
  'color': palette.dark.base
744
748
  };
745
749
  return rules;
@@ -747,14 +751,14 @@ function generateModalThemed(scope, palette, layout) {
747
751
 
748
752
  function generateToastThemed(scope, palette, layout) {
749
753
  var rules = {};
750
- var rd = layout ? layout.radius : { card: '8px' };
751
- rules[_sx(scope, '.bw_toast')] = {
752
- 'background-color': palette.surface || '#fff',
754
+ var rd = layout.radius;
755
+ rules[_sx(scope, '.bw_bccl_toast')] = {
756
+ 'background-color': _sf(palette),
753
757
  'border-color': palette.light.border,
754
758
  'border-radius': rd.card,
755
759
  'box-shadow': layout.elevation.lg
756
760
  };
757
- rules[_sx(scope, '.bw_toast_header')] = {
761
+ rules[_sx(scope, '.bw_bccl_toast_header')] = {
758
762
  'border-bottom-color': palette.light.border
759
763
  };
760
764
  // Variant toast borders handled by palette class
@@ -763,25 +767,25 @@ function generateToastThemed(scope, palette, layout) {
763
767
 
764
768
  function generateDropdownThemed(scope, palette, layout) {
765
769
  var rules = {};
766
- var rd = layout ? layout.radius : { card: '8px' };
767
- rules[_sx(scope, '.bw_dropdown_menu')] = {
768
- 'background-color': palette.surface || '#fff',
770
+ var rd = layout.radius;
771
+ rules[_sx(scope, '.bw_bccl_dropdown_menu')] = {
772
+ 'background-color': _sf(palette),
769
773
  'border-color': palette.light.border,
770
774
  'border-radius': rd.card,
771
775
  'box-shadow': layout.elevation.md
772
776
  };
773
- rules[_sx(scope, '.bw_dropdown_item')] = {
777
+ rules[_sx(scope, '.bw_bccl_dropdown_item')] = {
774
778
  'color': palette.dark.base,
775
- 'transition': 'background-color ' + layout.motion.fast + ' ' + layout.motion.easing
779
+ 'transition': _tr('background-color', layout.motion)
776
780
  };
777
- rules[_sx(scope, '.bw_dropdown_item:hover')] = {
781
+ rules[_sx(scope, '.bw_bccl_dropdown_item:hover')] = {
778
782
  'color': palette.dark.hover,
779
783
  'background-color': palette.surfaceAlt
780
784
  };
781
- rules[_sx(scope, '.bw_dropdown_item.disabled')] = {
785
+ rules[_sx(scope, '.bw_bccl_dropdown_item.disabled')] = {
782
786
  'color': palette.secondary.base
783
787
  };
784
- rules[_sx(scope, '.bw_dropdown_divider')] = {
788
+ rules[_sx(scope, '.bw_bccl_dropdown_divider')] = {
785
789
  'border-top-color': palette.light.border
786
790
  };
787
791
  return rules;
@@ -789,19 +793,19 @@ function generateDropdownThemed(scope, palette, layout) {
789
793
 
790
794
  function generateSwitchThemed(scope, palette) {
791
795
  var rules = {};
792
- rules[_sx(scope, '.bw_form_switch .bw_switch_input')] = {
796
+ rules[_sx(scope, '.bw_bccl_form_switch .bw_switch_input')] = {
793
797
  'background-color': palette.secondary.base,
794
798
  'border-color': palette.secondary.base
795
799
  };
796
- rules[_sx(scope, '.bw_form_switch .bw_switch_input:checked')] = {
800
+ rules[_sx(scope, '.bw_bccl_form_switch .bw_switch_input:checked')] = {
797
801
  'background-color': palette.primary.base,
798
802
  'border-color': palette.primary.base
799
803
  };
800
- rules[_sx(scope, '.bw_form_switch .bw_switch_input:focus')] = {
801
- 'box-shadow': '0 0 0 0.25rem ' + palette.primary.focus
804
+ rules[_sx(scope, '.bw_bccl_form_switch .bw_switch_input:focus')] = {
805
+ 'box-shadow': _fr(palette.primary.focus)
802
806
  };
803
- rules[_sx(scope, '.bw_form_switch .bw_switch_input:focus-visible')] = {
804
- 'box-shadow': '0 0 0 0.25rem ' + palette.primary.focus,
807
+ rules[_sx(scope, '.bw_bccl_form_switch .bw_switch_input:focus-visible')] = {
808
+ 'box-shadow': _fr(palette.primary.focus),
805
809
  'outline': 'none'
806
810
  };
807
811
  return rules;
@@ -820,12 +824,12 @@ function generateSkeletonThemed(scope, palette) {
820
824
  function generateStatCardThemed(scope, palette, layout) {
821
825
  var rules = {}, mo = layout.motion, el = layout.elevation, rd = layout.radius;
822
826
  rules[_sx(scope, '.bw_stat_card')] = {
823
- 'background-color': palette.surface || '#fff',
827
+ 'background-color': _sf(palette),
824
828
  'color': palette.dark.base,
825
829
  'border': '1px solid ' + palette.light.border,
826
830
  'border-radius': rd.card,
827
831
  'box-shadow': el.sm,
828
- 'transition': 'box-shadow ' + mo.fast + ' ' + mo.easing + ', transform ' + mo.fast + ' ' + mo.easing
832
+ 'transition': _tr('box-shadow,transform', mo)
829
833
  };
830
834
  rules[_sx(scope, '.bw_stat_card:hover')] = { 'box-shadow': el.md };
831
835
  // Variant border colors handled by palette class
@@ -836,9 +840,9 @@ function generateStatCardThemed(scope, palette, layout) {
836
840
 
837
841
  function generateTimelineThemed(scope, palette) {
838
842
  var rules = {};
839
- rules[_sx(scope, '.bw_timeline::before')] = { 'background-color': palette.light.border };
843
+ rules[_sx(scope, '.bw_bccl_timeline::before')] = { 'background-color': palette.light.border };
840
844
  // Variant marker colors handled by palette class
841
- rules[_sx(scope, '.bw_timeline_date')] = { 'color': palette.secondary.base };
845
+ rules[_sx(scope, '.bw_bccl_timeline_date')] = { 'color': palette.secondary.base };
842
846
  return rules;
843
847
  }
844
848
 
@@ -869,16 +873,16 @@ function generateStepperThemed(scope, palette) {
869
873
 
870
874
  function generateChipInputThemed(scope, palette, layout) {
871
875
  var rules = {};
872
- var rd = layout ? layout.radius : { input: '6px' };
876
+ var rd = layout.radius;
873
877
  rules[_sx(scope, '.bw_chip_input')] = {
874
878
  'border-color': palette.light.border,
875
- 'background-color': palette.surface || '#fff',
879
+ 'background-color': _sf(palette),
876
880
  'color': palette.dark.base,
877
881
  'border-radius': rd.input
878
882
  };
879
883
  rules[_sx(scope, '.bw_chip_input:focus-within')] = {
880
884
  'border-color': palette.primary.base,
881
- 'box-shadow': '0 0 0 0.2rem ' + palette.primary.focus
885
+ 'box-shadow': _fr(palette.primary.focus, '0.2rem')
882
886
  };
883
887
  rules[_sx(scope, '.bw_chip')] = {
884
888
  'background-color': palette.surfaceAlt,
@@ -896,7 +900,7 @@ function generateFileUploadThemed(scope, palette, layout) {
896
900
  rules[_sx(scope, '.bw_file_upload')] = {
897
901
  'border-color': palette.light.border,
898
902
  'background-color': palette.surfaceAlt,
899
- 'transition': 'border-color ' + mo.fast + ' ' + mo.easing + ', background-color ' + mo.fast + ' ' + mo.easing
903
+ 'transition': _tr('border-color,background-color', mo)
900
904
  };
901
905
  rules[_sx(scope, '.bw_file_upload:hover')] = {
902
906
  'border-color': palette.primary.base,
@@ -919,13 +923,13 @@ function generateRangeThemed(scope, palette) {
919
923
  rules[_sx(scope, '.bw_range')] = { 'background-color': palette.light.border };
920
924
  rules[_sx(scope, '.bw_range::-webkit-slider-thumb')] = {
921
925
  'background-color': palette.primary.base,
922
- 'border-color': palette.surface || '#fff',
926
+ 'border-color': _sf(palette),
923
927
  'box-shadow': '0 1px 3px rgba(0,0,0,0.2)',
924
928
  'transition': 'background-color 0.15s ease-out, transform 0.15s ease-out'
925
929
  };
926
930
  rules[_sx(scope, '.bw_range::-moz-range-thumb')] = {
927
931
  'background-color': palette.primary.base,
928
- 'border-color': palette.surface || '#fff',
932
+ 'border-color': _sf(palette),
929
933
  'box-shadow': '0 1px 3px rgba(0,0,0,0.2)'
930
934
  };
931
935
  return rules;
@@ -933,10 +937,10 @@ function generateRangeThemed(scope, palette) {
933
937
 
934
938
  function generateTooltipThemed(scope, palette, layout) {
935
939
  var rules = {}, sp = layout.spacing, rd = layout.radius, el = layout.elevation, mo = layout.motion;
936
- rules[_sx(scope, '.bw_tooltip')] = {
940
+ rules[_sx(scope, '.bw_bccl_tooltip')] = {
937
941
  'background-color': palette.dark.base, 'color': palette.dark.textOn,
938
942
  'padding': sp.input, 'border-radius': rd.badge, 'box-shadow': el.md,
939
- 'transition': 'opacity ' + mo.fast + ' ' + mo.easing + ', transform ' + mo.fast + ' ' + mo.easing
943
+ 'transition': _tr('opacity,transform', mo)
940
944
  };
941
945
  return rules;
942
946
  }
@@ -944,9 +948,9 @@ function generateTooltipThemed(scope, palette, layout) {
944
948
  function generatePopoverThemed(scope, palette, layout) {
945
949
  var rules = {}, sp = layout.spacing, rd = layout.radius, el = layout.elevation, mo = layout.motion;
946
950
  rules[_sx(scope, '.bw_popover')] = {
947
- 'background-color': palette.surface || '#fff', 'color': palette.dark.base,
951
+ 'background-color': _sf(palette), 'color': palette.dark.base,
948
952
  'border': '1px solid ' + palette.light.border, 'border-radius': rd.card, 'box-shadow': el.lg,
949
- 'transition': 'opacity ' + mo.fast + ' ' + mo.easing + ', transform ' + mo.fast + ' ' + mo.easing
953
+ 'transition': _tr('opacity,transform', mo)
950
954
  };
951
955
  rules[_sx(scope, '.bw_popover_header')] = {
952
956
  'background-color': palette.surfaceAlt, 'border-bottom': '1px solid ' + palette.light.border,
@@ -959,11 +963,11 @@ function generatePopoverThemed(scope, palette, layout) {
959
963
  function generateSearchThemed(scope, palette, layout) {
960
964
  var rules = {}, mo = layout.motion;
961
965
  rules[_sx(scope, '.bw_search_input')] = {
962
- 'background-color': palette.surface || '#fff',
966
+ 'background-color': _sf(palette),
963
967
  'color': palette.dark.base
964
968
  };
965
969
  rules[_sx(scope, '.bw_search_clear')] = {
966
- 'transition': 'color ' + mo.fast + ' ' + mo.easing + ', background-color ' + mo.fast + ' ' + mo.easing
970
+ 'transition': _tr('color,background-color', mo)
967
971
  };
968
972
  rules[_sx(scope, '.bw_search_clear:hover')] = { 'color': palette.dark.base };
969
973
  return rules;
@@ -971,9 +975,9 @@ function generateSearchThemed(scope, palette, layout) {
971
975
 
972
976
  function generateCodeDemoThemed(scope, palette, layout) {
973
977
  var rules = {};
974
- var rd = layout ? layout.radius : { card: '0.375rem' };
978
+ var rd = layout.radius;
975
979
  rules[_sx(scope, '.bw_code_demo')] = {
976
- 'background-color': palette.surface || '#fff',
980
+ 'background-color': _sf(palette),
977
981
  'color': palette.dark.base,
978
982
  'border-radius': rd.card
979
983
  };
@@ -1040,14 +1044,14 @@ function generatePaletteClasses(scope, palette) {
1040
1044
  // --- Component-specific overrides ---
1041
1045
 
1042
1046
  // Alerts: light bg, dark text, subtle border
1043
- rules[_sx(scope, '.bw_alert.bw_' + k)] = {
1047
+ rules[_sx(scope, '.bw_bccl_alert.bw_' + k)] = {
1044
1048
  'background-color': s.light,
1045
1049
  'color': s.darkText,
1046
1050
  'border-color': s.border
1047
1051
  };
1048
1052
 
1049
1053
  // Toast: inherit bg, left border accent
1050
- rules[_sx(scope, '.bw_toast.bw_' + k)] = {
1054
+ rules[_sx(scope, '.bw_bccl_toast.bw_' + k)] = {
1051
1055
  'background-color': 'inherit',
1052
1056
  'color': 'inherit',
1053
1057
  'border-left': '4px solid ' + s.base
@@ -1061,14 +1065,14 @@ function generatePaletteClasses(scope, palette) {
1061
1065
  };
1062
1066
 
1063
1067
  // Card accent: left border accent, inherit bg
1064
- rules[_sx(scope, '.bw_card.bw_' + k)] = {
1068
+ rules[_sx(scope, '.bw_bccl_card.bw_' + k)] = {
1065
1069
  'background-color': 'inherit',
1066
1070
  'color': 'inherit',
1067
1071
  'border-left': '4px solid ' + s.base
1068
1072
  };
1069
1073
 
1070
1074
  // Timeline marker: colored dot
1071
- rules[_sx(scope, '.bw_timeline_marker.bw_' + k)] = {
1075
+ rules[_sx(scope, '.bw_bccl_timeline_marker.bw_' + k)] = {
1072
1076
  'box-shadow': '0 0 0 2px ' + s.base
1073
1077
  };
1074
1078
 
@@ -1092,24 +1096,24 @@ function generatePaletteClasses(scope, palette) {
1092
1096
  };
1093
1097
 
1094
1098
  // Outline button: transparent bg, colored border+text, solid on hover
1095
- rules[_sx(scope, '.bw_btn_outline.bw_' + k)] = {
1099
+ rules[_sx(scope, '.bw_bccl_btn_outline.bw_' + k)] = {
1096
1100
  'background-color': 'transparent',
1097
1101
  'color': s.base,
1098
1102
  'border-color': s.base
1099
1103
  };
1100
- rules[_sx(scope, '.bw_btn_outline.bw_' + k + ':hover')] = {
1104
+ rules[_sx(scope, '.bw_bccl_btn_outline.bw_' + k + ':hover')] = {
1101
1105
  'background-color': s.base,
1102
1106
  'color': s.textOn
1103
1107
  };
1104
1108
 
1105
1109
  // Hero: gradient background
1106
- rules[_sx(scope, '.bw_hero.bw_' + k)] = {
1110
+ rules[_sx(scope, '.bw_bccl_hero.bw_' + k)] = {
1107
1111
  'background': 'linear-gradient(135deg, ' + s.base + ' 0%, ' + s.hover + ' 100%)',
1108
1112
  'color': s.textOn
1109
1113
  };
1110
1114
 
1111
1115
  // Progress bar: contrasting text on colored bg
1112
- rules[_sx(scope, '.bw_progress_bar.bw_' + k)] = {
1116
+ rules[_sx(scope, '.bw_bccl_progress_bar.bw_' + k)] = {
1113
1117
  'color': s.textOn
1114
1118
  };
1115
1119
 
@@ -1208,6 +1212,16 @@ export function generateThemedCSS(scopeName, palette, layout) {
1208
1212
  // a generate*Themed() function. That's it.
1209
1213
  // =========================================================================
1210
1214
 
1215
+ // Generate 12-column grid rules for a given class prefix (e.g. 'bw_col', 'bw_col_sm')
1216
+ function _gridCols(prefix) {
1217
+ var r = {};
1218
+ for (var i = 1; i <= 12; i++) {
1219
+ var pct = +(100 * i / 12).toFixed(6) + '%';
1220
+ r['.' + prefix + '_' + i] = { 'flex': '0 0 ' + pct, 'max-width': pct };
1221
+ }
1222
+ return r;
1223
+ }
1224
+
1211
1225
  var structuralRules = {
1212
1226
  // ---- Reset ----
1213
1227
  base: {
@@ -1255,15 +1269,15 @@ var structuralRules = {
1255
1269
 
1256
1270
  // ---- Grid ----
1257
1271
  grid: {
1258
- '.bw_container': {
1272
+ '.bw_bccl_container': {
1259
1273
  'width': '100%', 'padding-right': '0.75rem', 'padding-left': '0.75rem',
1260
1274
  'margin-right': 'auto', 'margin-left': 'auto'
1261
1275
  },
1262
- '@media (min-width: 576px)': { '.bw_container': { 'max-width': '540px' } },
1263
- '@media (min-width: 768px)': { '.bw_container': { 'max-width': '720px' } },
1264
- '@media (min-width: 992px)': { '.bw_container': { 'max-width': '960px' } },
1265
- '@media (min-width: 1200px)': { '.bw_container': { 'max-width': '1140px' } },
1266
- '.bw_container_fluid': {
1276
+ '@media (min-width: 576px)': { '.bw_bccl_container': { 'max-width': '540px' } },
1277
+ '@media (min-width: 768px)': { '.bw_bccl_container': { 'max-width': '720px' } },
1278
+ '@media (min-width: 992px)': { '.bw_bccl_container': { 'max-width': '960px' } },
1279
+ '@media (min-width: 1200px)': { '.bw_bccl_container': { 'max-width': '1140px' } },
1280
+ '.bw_bccl_container_fluid': {
1267
1281
  'width': '100%', 'padding-right': '0.75rem', 'padding-left': '0.75rem',
1268
1282
  'margin-right': 'auto', 'margin-left': 'auto'
1269
1283
  },
@@ -1278,109 +1292,98 @@ var structuralRules = {
1278
1292
  'padding-left': 'calc(var(--bw_gutter_x, 0.75rem) * 0.5)'
1279
1293
  },
1280
1294
  '.bw_col': { 'flex-basis': '0', 'flex-grow': '1', 'max-width': '100%' },
1281
- '.bw_col_1': { 'flex': '0 0 8.333333%', 'max-width': '8.333333%' },
1282
- '.bw_col_2': { 'flex': '0 0 16.666667%', 'max-width': '16.666667%' },
1283
- '.bw_col_3': { 'flex': '0 0 25%', 'max-width': '25%' },
1284
- '.bw_col_4': { 'flex': '0 0 33.333333%', 'max-width': '33.333333%' },
1285
- '.bw_col_5': { 'flex': '0 0 41.666667%', 'max-width': '41.666667%' },
1286
- '.bw_col_6': { 'flex': '0 0 50%', 'max-width': '50%' },
1287
- '.bw_col_7': { 'flex': '0 0 58.333333%', 'max-width': '58.333333%' },
1288
- '.bw_col_8': { 'flex': '0 0 66.666667%', 'max-width': '66.666667%' },
1289
- '.bw_col_9': { 'flex': '0 0 75%', 'max-width': '75%' },
1290
- '.bw_col_10': { 'flex': '0 0 83.333333%', 'max-width': '83.333333%' },
1291
- '.bw_col_11': { 'flex': '0 0 91.666667%', 'max-width': '91.666667%' },
1292
- '.bw_col_12': { 'flex': '0 0 100%', 'max-width': '100%' }
1295
+ ..._gridCols('bw_col')
1293
1296
  },
1294
1297
 
1295
1298
  // ---- Buttons ----
1296
1299
  buttons: {
1297
- '.bw_btn': {
1300
+ '.bw_bccl_btn': {
1298
1301
  'display': 'inline-flex', 'align-items': 'center', 'justify-content': 'center',
1299
1302
  'font-weight': '500', 'line-height': '1.5', 'text-align': 'center',
1300
1303
  'text-decoration': 'none', 'vertical-align': 'middle', 'cursor': 'pointer',
1301
1304
  'user-select': 'none', 'border': '1px solid transparent',
1302
1305
  'font-size': '0.875rem', 'font-family': 'inherit', 'gap': '0.5rem'
1303
1306
  },
1304
- '.bw_btn:hover': { 'text-decoration': 'none', 'transform': 'translateY(-1px)' },
1305
- '.bw_btn:active': { 'transform': 'translateY(0)' },
1306
- '.bw_btn:focus-visible': { 'outline': '2px solid currentColor', 'outline-offset': '2px' },
1307
- '.bw_btn:disabled': { 'opacity': '0.5', 'cursor': 'not-allowed', 'pointer-events': 'none' },
1308
- '.bw_btn_block': { 'display': 'block', 'width': '100%' }
1307
+ '.bw_bccl_btn:hover': { 'text-decoration': 'none', 'transform': 'translateY(-1px)' },
1308
+ '.bw_bccl_btn:active': { 'transform': 'translateY(0)' },
1309
+ '.bw_bccl_btn:focus-visible': { 'outline': '2px solid currentColor', 'outline-offset': '2px' },
1310
+ '.bw_bccl_btn:disabled': { 'opacity': '0.5', 'cursor': 'not-allowed', 'pointer-events': 'none' },
1311
+ '.bw_bccl_btn_block': { 'display': 'block', 'width': '100%' }
1309
1312
  },
1310
1313
 
1311
1314
  // ---- Cards ----
1312
1315
  cards: {
1313
- '.bw_card': {
1316
+ '.bw_bccl_card': {
1314
1317
  'position': 'relative', 'display': 'flex', 'flex-direction': 'column',
1315
1318
  'min-width': '0', 'height': '100%', 'word-wrap': 'break-word',
1316
1319
  'background-clip': 'border-box', 'margin-bottom': '1.5rem', 'overflow': 'hidden'
1317
1320
  },
1318
- '.bw_card_body': { 'flex': '1 1 auto' },
1319
- '.bw_card_body > *:last-child': { 'margin-bottom': '0' },
1320
- '.bw_card_title': { 'margin-bottom': '0.5rem', 'font-size': '1.125rem', 'font-weight': '600', 'line-height': '1.3' },
1321
- '.bw_card_text': { 'margin-bottom': '0', 'font-size': '0.9375rem', 'line-height': '1.6' },
1322
- '.bw_card_header': { 'margin-bottom': '0', 'font-weight': '600', 'font-size': '0.875rem' },
1323
- '.bw_card_footer': { 'font-size': '0.875rem' },
1324
- '.bw_card_hoverable': {},
1325
- '.bw_card_hoverable:hover': { 'transform': 'translateY(-4px)' },
1326
- '.bw_card_img_top': { 'width': '100%' },
1327
- '.bw_card_img_bottom': { 'width': '100%' },
1328
- '.bw_card_img_left': { 'width': '40%', 'object-fit': 'cover' },
1329
- '.bw_card_img_right': { 'width': '40%', 'object-fit': 'cover' },
1330
- '.bw_card_subtitle, .card-subtitle': { 'margin-top': '-0.25rem', 'margin-bottom': '0.5rem', 'font-size': '0.875rem' }
1321
+ '.bw_bccl_card_body': { 'flex': '1 1 auto' },
1322
+ '.bw_bccl_card_body > *:last-child': { 'margin-bottom': '0' },
1323
+ '.bw_bccl_card_title': { 'margin-bottom': '0.5rem', 'font-size': '1.125rem', 'font-weight': '600', 'line-height': '1.3' },
1324
+ '.bw_bccl_card_text': { 'margin-bottom': '0', 'font-size': '0.9375rem', 'line-height': '1.6' },
1325
+ '.bw_bccl_card_header': { 'margin-bottom': '0', 'font-weight': '600', 'font-size': '0.875rem' },
1326
+ '.bw_bccl_card_footer': { 'font-size': '0.875rem' },
1327
+ '.bw_bccl_card_hoverable': {},
1328
+ '.bw_bccl_card_hoverable:hover': { 'transform': 'translateY(-4px)' },
1329
+ '.bw_bccl_card_img_top': { 'width': '100%' },
1330
+ '.bw_bccl_card_img_bottom': { 'width': '100%' },
1331
+ '.bw_bccl_card_img_left': { 'width': '40%', 'object-fit': 'cover' },
1332
+ '.bw_bccl_card_img_right': { 'width': '40%', 'object-fit': 'cover' },
1333
+ '.bw_bccl_card_subtitle, .card-subtitle': { 'margin-top': '-0.25rem', 'margin-bottom': '0.5rem', 'font-size': '0.875rem' }
1331
1334
  },
1332
1335
 
1333
1336
  // ---- Forms ----
1334
1337
  forms: {
1335
- '.bw_form_control': {
1338
+ '.bw_bccl_form_control': {
1336
1339
  'display': 'block', 'width': '100%',
1337
1340
  'font-size': '0.9375rem', 'font-weight': '400', 'line-height': '1.5',
1338
1341
  'background-clip': 'padding-box', 'appearance': 'none',
1339
1342
  'border': '1px solid transparent', 'font-family': 'inherit',
1340
1343
  'transition': 'border-color 0.15s ease-out, box-shadow 0.15s ease-out'
1341
1344
  },
1342
- '.bw_form_control:focus': { 'outline': '2px solid currentColor', 'outline-offset': '-1px' },
1343
- '.bw_form_control::placeholder': { 'opacity': '1' },
1344
- '.bw_form_label': { 'display': 'block', 'margin-bottom': '0.375rem', 'font-size': '0.875rem', 'font-weight': '600' },
1345
- '.bw_form_group': { 'margin-bottom': '1.25rem' },
1346
- '.bw_form_text': { 'margin-top': '0.25rem', 'font-size': '0.8125rem' },
1347
- 'select.bw_form_control': {
1345
+ '.bw_bccl_form_control:focus': { 'outline': '2px solid currentColor', 'outline-offset': '-1px' },
1346
+ '.bw_bccl_form_control::placeholder': { 'opacity': '1' },
1347
+ '.bw_bccl_form_label': { 'display': 'block', 'margin-bottom': '0.375rem', 'font-size': '0.875rem', 'font-weight': '600' },
1348
+ '.bw_bccl_form_group': { 'margin-bottom': '1.25rem' },
1349
+ '.bw_bccl_form_text': { 'margin-top': '0.25rem', 'font-size': '0.8125rem' },
1350
+ 'select.bw_bccl_form_control': {
1348
1351
  'padding-right': '2.25rem',
1349
1352
  'background-image': "url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23666' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\")",
1350
1353
  'background-repeat': 'no-repeat', 'background-position': 'right 0.75rem center',
1351
1354
  'background-size': '16px 12px'
1352
1355
  },
1353
- 'textarea.bw_form_control': { 'min-height': '5rem', 'resize': 'vertical' },
1356
+ 'textarea.bw_bccl_form_control': { 'min-height': '5rem', 'resize': 'vertical' },
1354
1357
  '.bw_valid_feedback': { 'display': 'block', 'font-size': '0.875rem', 'margin-top': '0.25rem' },
1355
1358
  '.bw_invalid_feedback': { 'display': 'block', 'font-size': '0.875rem', 'margin-top': '0.25rem' }
1356
1359
  },
1357
1360
 
1358
1361
  // ---- Form checks ----
1359
1362
  formChecks: {
1360
- '.bw_form_check': { 'display': 'flex', 'align-items': 'center', 'gap': '0.5rem', 'min-height': '1.5rem', 'margin-bottom': '0.25rem' },
1361
- '.bw_form_check_input': { 'width': '1rem', 'height': '1rem', 'margin': '0', 'cursor': 'pointer', 'flex-shrink': '0', 'border-radius': '0.25rem', 'appearance': 'auto' },
1362
- '.bw_form_check_input:disabled': { 'opacity': '0.5', 'cursor': 'not-allowed' },
1363
- '.bw_form_check_label': { 'cursor': 'pointer', 'user-select': 'none', 'font-size': '0.9375rem' }
1363
+ '.bw_bccl_form_check': { 'display': 'flex', 'align-items': 'center', 'gap': '0.5rem', 'min-height': '1.5rem', 'margin-bottom': '0.25rem' },
1364
+ '.bw_bccl_form_check_input': { 'width': '1rem', 'height': '1rem', 'margin': '0', 'cursor': 'pointer', 'flex-shrink': '0', 'border-radius': '0.25rem', 'appearance': 'auto' },
1365
+ '.bw_bccl_form_check_input:disabled': { 'opacity': '0.5', 'cursor': 'not-allowed' },
1366
+ '.bw_bccl_form_check_label': { 'cursor': 'pointer', 'user-select': 'none', 'font-size': '0.9375rem' }
1364
1367
  },
1365
1368
 
1366
1369
  // ---- Navigation ----
1367
1370
  navigation: {
1368
- '.bw_navbar': {
1371
+ '.bw_bccl_navbar': {
1369
1372
  'position': 'relative', 'display': 'flex', 'flex-wrap': 'wrap',
1370
1373
  'align-items': 'center', 'justify-content': 'space-between', 'padding': '0.5rem 1.5rem'
1371
1374
  },
1372
- '.bw_navbar > .bw_container, .bw_navbar > .container': { 'display': 'flex', 'flex-wrap': 'wrap', 'align-items': 'center', 'justify-content': 'space-between' },
1373
- '.bw_navbar_brand': {
1375
+ '.bw_bccl_navbar > .bw_bccl_container, .bw_bccl_navbar > .container': { 'display': 'flex', 'flex-wrap': 'wrap', 'align-items': 'center', 'justify-content': 'space-between' },
1376
+ '.bw_bccl_navbar_brand': {
1374
1377
  'display': 'inline-flex', 'align-items': 'center', 'gap': '0.5rem',
1375
1378
  'padding-top': '0.25rem', 'padding-bottom': '0.25rem', 'margin-right': '1.5rem',
1376
1379
  'font-size': '1.125rem', 'font-weight': '600', 'line-height': 'inherit',
1377
1380
  'white-space': 'nowrap', 'text-decoration': 'none'
1378
1381
  },
1379
- '.bw_navbar_nav': {
1382
+ '.bw_bccl_navbar_nav': {
1380
1383
  'display': 'flex', 'flex-direction': 'row', 'padding-left': '0',
1381
1384
  'margin-bottom': '0', 'list-style': 'none', 'gap': '0.25rem'
1382
1385
  },
1383
- '.bw_navbar_nav .bw_nav_link': {
1386
+ '.bw_bccl_navbar_nav .bw_nav_link': {
1384
1387
  'display': 'block', 'text-decoration': 'none',
1385
1388
  'font-size': '0.875rem', 'font-weight': '500'
1386
1389
  }
@@ -1388,68 +1391,68 @@ var structuralRules = {
1388
1391
 
1389
1392
  // ---- Tables ----
1390
1393
  tables: {
1391
- '.bw_table': {
1394
+ '.bw_bccl_table': {
1392
1395
  'width': '100%', 'margin-bottom': '1.5rem', 'vertical-align': 'top',
1393
1396
  'border-collapse': 'collapse', 'font-size': '0.9375rem', 'line-height': '1.5'
1394
1397
  },
1395
- '.bw_table > :not(caption) > * > *': {
1398
+ '.bw_bccl_table > :not(caption) > * > *': {
1396
1399
  'background-color': 'transparent',
1397
1400
  'border-bottom-width': '1px', 'border-bottom-style': 'solid'
1398
1401
  },
1399
- '.bw_table > tbody': { 'vertical-align': 'inherit' },
1400
- '.bw_table > thead': { 'vertical-align': 'bottom' },
1401
- '.bw_table > thead > tr > *': {
1402
+ '.bw_bccl_table > tbody': { 'vertical-align': 'inherit' },
1403
+ '.bw_bccl_table > thead': { 'vertical-align': 'bottom' },
1404
+ '.bw_bccl_table > thead > tr > *': {
1402
1405
  'font-size': '0.8125rem', 'font-weight': '600',
1403
1406
  'text-transform': 'uppercase', 'letter-spacing': '0.04em',
1404
1407
  'border-bottom-width': '2px'
1405
1408
  },
1406
- '.bw_table caption': { 'font-size': '0.875rem', 'caption-side': 'bottom' },
1407
- '.bw_table_bordered > :not(caption) > * > *': { 'border-width': '1px', 'border-style': 'solid' },
1408
- '.bw_table_selectable > tbody > tr': { 'cursor': 'pointer' },
1409
- '.bw_table > tbody > tr.bw_table_row_selected > *': { 'background-color': 'rgba(0, 102, 102, 0.1)' },
1410
- '.bw_table_responsive': { 'overflow-x': 'auto', '-webkit-overflow-scrolling': 'touch' }
1409
+ '.bw_bccl_table caption': { 'font-size': '0.875rem', 'caption-side': 'bottom' },
1410
+ '.bw_bccl_table_bordered > :not(caption) > * > *': { 'border-width': '1px', 'border-style': 'solid' },
1411
+ '.bw_bccl_table_selectable > tbody > tr': { 'cursor': 'pointer' },
1412
+ '.bw_bccl_table > tbody > tr.bw_bccl_table_row_selected > *': { 'background-color': 'rgba(0, 102, 102, 0.1)' },
1413
+ '.bw_bccl_table_responsive': { 'overflow-x': 'auto', '-webkit-overflow-scrolling': 'touch' }
1411
1414
  },
1412
1415
 
1413
1416
  // ---- Alerts ----
1414
1417
  alerts: {
1415
- '.bw_alert': {
1418
+ '.bw_bccl_alert': {
1416
1419
  'position': 'relative', 'margin-bottom': '1rem',
1417
1420
  'border': '1px solid transparent',
1418
1421
  'font-size': '0.9375rem', 'line-height': '1.6'
1419
1422
  },
1420
- '.bw_alert_heading, .alert-heading': { 'color': 'inherit' },
1421
- '.bw_alert_link, .alert-link': { 'font-weight': '700' },
1422
- '.bw_alert_dismissible': { 'padding-right': '3rem' },
1423
- '.bw_alert_dismissible .btn-close': { 'position': 'absolute', 'top': '0', 'right': '0', 'z-index': '2', 'padding': '1.25rem 1rem' }
1423
+ '.bw_bccl_alert_heading, .alert-heading': { 'color': 'inherit' },
1424
+ '.bw_bccl_alert_link, .alert-link': { 'font-weight': '700' },
1425
+ '.bw_bccl_alert_dismissible': { 'padding-right': '3rem' },
1426
+ '.bw_bccl_alert_dismissible .btn-close': { 'position': 'absolute', 'top': '0', 'right': '0', 'z-index': '2', 'padding': '1.25rem 1rem' }
1424
1427
  },
1425
1428
 
1426
1429
  // ---- Badges ----
1427
1430
  badges: {
1428
- '.bw_badge': {
1431
+ '.bw_bccl_badge': {
1429
1432
  'display': 'inline-block', 'font-size': '0.875rem',
1430
1433
  'font-weight': '600', 'line-height': '1.3', 'text-align': 'center',
1431
1434
  'white-space': 'nowrap', 'vertical-align': 'baseline',
1432
1435
  'padding': '0.35rem 0.65rem', 'border-radius': '0.25rem'
1433
1436
  },
1434
- '.bw_badge:empty': { 'display': 'none' },
1435
- '.bw_badge_sm': { 'font-size': '0.75rem', 'padding': '0.25rem 0.5rem' },
1436
- '.bw_badge_lg': { 'font-size': '1rem', 'padding': '0.5rem 0.875rem' },
1437
- '.bw_badge_pill': { 'border-radius': '50rem' },
1437
+ '.bw_bccl_badge:empty': { 'display': 'none' },
1438
+ '.bw_bccl_badge_sm': { 'font-size': '0.75rem', 'padding': '0.25rem 0.5rem' },
1439
+ '.bw_bccl_badge_lg': { 'font-size': '1rem', 'padding': '0.5rem 0.875rem' },
1440
+ '.bw_bccl_badge_pill': { 'border-radius': '50rem' },
1438
1441
  '.btn .badge': { 'position': 'relative', 'top': '-1px' }
1439
1442
  },
1440
1443
 
1441
1444
  // ---- Progress ----
1442
1445
  progress: {
1443
- '.bw_progress': { 'display': 'flex', 'height': '1.25rem', 'overflow': 'hidden', 'font-size': '.875rem' },
1444
- '.bw_progress_bar': {
1446
+ '.bw_bccl_progress': { 'display': 'flex', 'height': '1.25rem', 'overflow': 'hidden', 'font-size': '.875rem' },
1447
+ '.bw_bccl_progress_bar': {
1445
1448
  'display': 'flex', 'flex-direction': 'column', 'justify-content': 'center',
1446
1449
  'overflow': 'hidden', 'text-align': 'center', 'white-space': 'nowrap', 'font-weight': '600'
1447
1450
  },
1448
- '.bw_progress_bar_striped': {
1451
+ '.bw_bccl_progress_bar_striped': {
1449
1452
  'background-image': 'linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)',
1450
1453
  'background-size': '1rem 1rem'
1451
1454
  },
1452
- '.bw_progress_bar_animated': { 'animation': 'progress-bar-stripes 1s linear infinite' },
1455
+ '.bw_bccl_progress_bar_animated': { 'animation': 'progress-bar-stripes 1s linear infinite' },
1453
1456
  '@keyframes progress-bar-stripes': { '0%': { 'background-position-x': '1rem' } }
1454
1457
  },
1455
1458
 
@@ -1467,9 +1470,9 @@ var structuralRules = {
1467
1470
  '.bw_nav_link:focus-visible': { 'outline': '2px solid currentColor', 'outline-offset': '-2px' },
1468
1471
  '.bw_nav_tabs .bw_nav_link': { 'border': 'none', 'border-bottom': '2px solid transparent', 'border-radius': '0', 'background-color': 'transparent' },
1469
1472
  '.bw_nav_vertical': { 'flex-direction': 'column' },
1470
- '.bw_tab_content': { 'padding': '1.25rem 0' },
1471
- '.bw_tab_pane': { 'display': 'none' },
1472
- '.bw_tab_pane.active': { 'display': 'block' },
1473
+ '.bw_bccl_tab_content': { 'padding': '1.25rem 0' },
1474
+ '.bw_bccl_tab_pane': { 'display': 'none' },
1475
+ '.bw_bccl_tab_pane.active': { 'display': 'block' },
1473
1476
  '.bw_nav_scrollable': { 'flex-wrap': 'nowrap', 'overflow-x': 'auto', '-webkit-overflow-scrolling': 'touch', 'scrollbar-width': 'none' },
1474
1477
  '.bw_nav_scrollable::-webkit-scrollbar': { 'display': 'none' },
1475
1478
  '.bw_nav_scrollable .bw_nav_link': { 'white-space': 'nowrap' }
@@ -1492,7 +1495,7 @@ var structuralRules = {
1492
1495
 
1493
1496
  // ---- Pagination ----
1494
1497
  pagination: {
1495
- '.bw_pagination': { 'display': 'flex', 'padding-left': '0', 'list-style': 'none', 'margin-bottom': '0' },
1498
+ '.bw_bccl_pagination': { 'display': 'flex', 'padding-left': '0', 'list-style': 'none', 'margin-bottom': '0' },
1496
1499
  '.bw_page_item': { 'display': 'list-item', 'list-style': 'none' },
1497
1500
  '.bw_page_link': {
1498
1501
  'position': 'relative', 'display': 'block', 'padding': '0.375rem 0.75rem',
@@ -1506,22 +1509,22 @@ var structuralRules = {
1506
1509
 
1507
1510
  // ---- Breadcrumb ----
1508
1511
  breadcrumb: {
1509
- '.bw_breadcrumb': { 'display': 'flex', 'flex-wrap': 'wrap', 'padding': '0 0', 'margin-bottom': '1rem', 'list-style': 'none' },
1510
- '.bw_breadcrumb_item': { 'display': 'flex' },
1511
- '.bw_breadcrumb_item + .bw_breadcrumb_item': { 'padding-left': '0.5rem' },
1512
- '.bw_breadcrumb_item + .bw_breadcrumb_item::before': { 'float': 'left', 'padding-right': '0.5rem', 'content': '"/"' },
1513
- '.bw_breadcrumb_item a': { 'text-decoration': 'none' },
1514
- '.bw_breadcrumb_item.active': { 'font-weight': '500' }
1512
+ '.bw_bccl_breadcrumb': { 'display': 'flex', 'flex-wrap': 'wrap', 'padding': '0 0', 'margin-bottom': '1rem', 'list-style': 'none' },
1513
+ '.bw_bccl_breadcrumb_item': { 'display': 'flex' },
1514
+ '.bw_bccl_breadcrumb_item + .bw_bccl_breadcrumb_item': { 'padding-left': '0.5rem' },
1515
+ '.bw_bccl_breadcrumb_item + .bw_bccl_breadcrumb_item::before': { 'float': 'left', 'padding-right': '0.5rem', 'content': '"/"' },
1516
+ '.bw_bccl_breadcrumb_item a': { 'text-decoration': 'none' },
1517
+ '.bw_bccl_breadcrumb_item.active': { 'font-weight': '500' }
1515
1518
  },
1516
1519
 
1517
1520
  // ---- Hero ----
1518
1521
  hero: {
1519
- '.bw_hero': { 'position': 'relative', 'overflow': 'hidden' },
1520
- '.bw_hero_overlay': { 'position': 'absolute', 'top': '0', 'left': '0', 'right': '0', 'bottom': '0', 'z-index': '1' },
1521
- '.bw_hero_content': { 'position': 'relative', 'z-index': '2' },
1522
- '.bw_hero_title': { 'font-weight': '300', 'letter-spacing': '-0.05rem', 'color': 'inherit' },
1523
- '.bw_hero_subtitle': { 'color': 'inherit' },
1524
- '.bw_hero_actions': { 'display': 'flex', 'gap': '1rem', 'justify-content': 'center', 'flex-wrap': 'wrap' }
1522
+ '.bw_bccl_hero': { 'position': 'relative', 'overflow': 'hidden' },
1523
+ '.bw_bccl_hero_overlay': { 'position': 'absolute', 'top': '0', 'left': '0', 'right': '0', 'bottom': '0', 'z-index': '1' },
1524
+ '.bw_bccl_hero_content': { 'position': 'relative', 'z-index': '2' },
1525
+ '.bw_bccl_hero_title': { 'font-weight': '300', 'letter-spacing': '-0.05rem', 'color': 'inherit' },
1526
+ '.bw_bccl_hero_subtitle': { 'color': 'inherit' },
1527
+ '.bw_bccl_hero_actions': { 'display': 'flex', 'gap': '1rem', 'justify-content': 'center', 'flex-wrap': 'wrap' }
1525
1528
  },
1526
1529
 
1527
1530
  // ---- Features ----
@@ -1639,136 +1642,136 @@ var structuralRules = {
1639
1642
 
1640
1643
  // ---- Button group ----
1641
1644
  buttonGroup: {
1642
- '.bw_btn_group, .bw_btn_group_vertical': { 'position': 'relative', 'display': 'inline-flex', 'vertical-align': 'middle' },
1643
- '.bw_btn_group > .bw_btn, .bw_btn_group_vertical > .bw_btn': { 'position': 'relative', 'flex': '1 1 auto', 'border-radius': '0', 'margin-left': '-1px' },
1644
- '.bw_btn_group > .bw_btn:first-child': { 'margin-left': '0' },
1645
- '.bw_btn_group > .bw_btn:last-child': {},
1646
- '.bw_btn_group_lg > .bw_btn': { 'padding': '0.625rem 1.5rem', 'font-size': '1rem' },
1647
- '.bw_btn_group_sm > .bw_btn': { 'padding': '0.25rem 0.75rem', 'font-size': '0.8125rem' },
1648
- '.bw_btn_group_vertical': { 'flex-direction': 'column', 'align-items': 'flex-start', 'justify-content': 'center' },
1649
- '.bw_btn_group_vertical > .bw_btn': { 'width': '100%', 'margin-left': '0', 'margin-top': '-1px' },
1650
- '.bw_btn_group_vertical > .bw_btn:first-child': { 'margin-top': '0' },
1651
- '.bw_btn_group_vertical > .bw_btn:last-child': {}
1645
+ '.bw_bccl_btn_group, .bw_bccl_btn_group_vertical': { 'position': 'relative', 'display': 'inline-flex', 'vertical-align': 'middle' },
1646
+ '.bw_bccl_btn_group > .bw_bccl_btn, .bw_bccl_btn_group_vertical > .bw_bccl_btn': { 'position': 'relative', 'flex': '1 1 auto', 'border-radius': '0', 'margin-left': '-1px' },
1647
+ '.bw_bccl_btn_group > .bw_bccl_btn:first-child': { 'margin-left': '0' },
1648
+ '.bw_bccl_btn_group > .bw_bccl_btn:last-child': {},
1649
+ '.bw_bccl_btn_group_lg > .bw_bccl_btn': { 'padding': '0.625rem 1.5rem', 'font-size': '1rem' },
1650
+ '.bw_bccl_btn_group_sm > .bw_bccl_btn': { 'padding': '0.25rem 0.75rem', 'font-size': '0.8125rem' },
1651
+ '.bw_bccl_btn_group_vertical': { 'flex-direction': 'column', 'align-items': 'flex-start', 'justify-content': 'center' },
1652
+ '.bw_bccl_btn_group_vertical > .bw_bccl_btn': { 'width': '100%', 'margin-left': '0', 'margin-top': '-1px' },
1653
+ '.bw_bccl_btn_group_vertical > .bw_bccl_btn:first-child': { 'margin-top': '0' },
1654
+ '.bw_bccl_btn_group_vertical > .bw_bccl_btn:last-child': {}
1652
1655
  },
1653
1656
 
1654
1657
  // ---- Accordion ----
1655
1658
  accordion: {
1656
- '.bw_accordion': { 'overflow': 'hidden' },
1657
- '.bw_accordion_item': { 'border': '1px solid transparent' },
1658
- '.bw_accordion_item + .bw_accordion_item': { 'border-top': '0' },
1659
- '.bw_accordion_header': { 'margin': '0' },
1660
- '.bw_accordion_button': {
1659
+ '.bw_bccl_accordion': { 'overflow': 'hidden' },
1660
+ '.bw_bccl_accordion_item': { 'border': '1px solid transparent' },
1661
+ '.bw_bccl_accordion_item + .bw_bccl_accordion_item': { 'border-top': '0' },
1662
+ '.bw_bccl_accordion_header': { 'margin': '0' },
1663
+ '.bw_bccl_accordion_button': {
1661
1664
  'position': 'relative', 'display': 'flex', 'align-items': 'center', 'width': '100%',
1662
1665
  'padding': '0.875rem 1.25rem',
1663
1666
  'font-size': '1rem', 'font-weight': '500', 'text-align': 'left',
1664
1667
  'background-color': 'transparent', 'border': '0', 'overflow-anchor': 'none', 'cursor': 'pointer',
1665
1668
  'font-family': 'inherit'
1666
1669
  },
1667
- '.bw_accordion_button::after': {
1670
+ '.bw_bccl_accordion_button::after': {
1668
1671
  'flex-shrink': '0', 'width': '1.25rem', 'height': '1.25rem', 'margin-left': 'auto',
1669
1672
  'content': '""',
1670
1673
  'background-image': "url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e\")",
1671
1674
  'background-repeat': 'no-repeat', 'background-size': '1.25rem',
1672
1675
  'transition': 'transform 0.2s ease-out'
1673
1676
  },
1674
- '.bw_accordion_button:not(.bw_collapsed)::after': { 'transform': 'rotate(-180deg)' },
1675
- '.bw_accordion_body': { 'padding': '1rem 1.25rem' },
1676
- '.bw_accordion_collapse': { 'max-height': '0', 'overflow': 'hidden', 'transition': 'max-height 0.3s ease' },
1677
- '.bw_accordion_collapse.bw_collapse_show': { 'max-height': 'none' }
1677
+ '.bw_bccl_accordion_button:not(.bw_collapsed)::after': { 'transform': 'rotate(-180deg)' },
1678
+ '.bw_bccl_accordion_body': { 'padding': '1rem 1.25rem' },
1679
+ '.bw_bccl_accordion_collapse': { 'max-height': '0', 'overflow': 'hidden', 'transition': 'max-height 0.3s ease' },
1680
+ '.bw_bccl_accordion_collapse.bw_collapse_show': { 'max-height': 'none' }
1678
1681
  },
1679
1682
 
1680
1683
  // ---- Carousel ----
1681
1684
  carousel: {
1682
- '.bw_carousel': { 'position': 'relative', 'overflow': 'hidden' },
1683
- '.bw_carousel_track': { 'display': 'flex', 'height': '100%' },
1684
- '.bw_carousel_slide': {
1685
+ '.bw_bccl_carousel': { 'position': 'relative', 'overflow': 'hidden' },
1686
+ '.bw_bccl_carousel_track': { 'display': 'flex', 'height': '100%' },
1687
+ '.bw_bccl_carousel_slide': {
1685
1688
  'min-width': '100%', 'flex-shrink': '0', 'overflow': 'hidden',
1686
1689
  'position': 'relative', 'display': 'flex', 'align-items': 'center', 'justify-content': 'center'
1687
1690
  },
1688
- '.bw_carousel_slide img': { 'width': '100%', 'height': '100%', 'object-fit': 'cover' },
1689
- '.bw_carousel_caption': { 'position': 'absolute', 'bottom': '0', 'left': '0', 'right': '0', 'padding': '0.75rem 1rem', 'font-size': '0.875rem' },
1690
- '.bw_carousel_control': {
1691
+ '.bw_bccl_carousel_slide img': { 'width': '100%', 'height': '100%', 'object-fit': 'cover' },
1692
+ '.bw_bccl_carousel_caption': { 'position': 'absolute', 'bottom': '0', 'left': '0', 'right': '0', 'padding': '0.75rem 1rem', 'font-size': '0.875rem' },
1693
+ '.bw_bccl_carousel_control': {
1691
1694
  'position': 'absolute', 'top': '50%', 'transform': 'translateY(-50%)',
1692
1695
  'width': '40px', 'height': '40px', 'border': 'none', 'border-radius': '50%',
1693
1696
  'cursor': 'pointer', 'display': 'flex', 'align-items': 'center', 'justify-content': 'center',
1694
1697
  'z-index': '2', 'padding': '0'
1695
1698
  },
1696
- '.bw_carousel_control img': { 'width': '20px', 'height': '20px', 'pointer-events': 'none' },
1697
- '.bw_carousel_control:focus-visible': { 'outline': '2px solid currentColor', 'outline-offset': '2px' },
1698
- '.bw_carousel_control_prev': { 'left': '10px' },
1699
- '.bw_carousel_control_next': { 'right': '10px' },
1700
- '.bw_carousel_indicators': {
1699
+ '.bw_bccl_carousel_control img': { 'width': '20px', 'height': '20px', 'pointer-events': 'none' },
1700
+ '.bw_bccl_carousel_control:focus-visible': { 'outline': '2px solid currentColor', 'outline-offset': '2px' },
1701
+ '.bw_bccl_carousel_control_prev': { 'left': '10px' },
1702
+ '.bw_bccl_carousel_control_next': { 'right': '10px' },
1703
+ '.bw_bccl_carousel_indicators': {
1701
1704
  'position': 'absolute', 'bottom': '12px', 'left': '50%', 'transform': 'translateX(-50%)',
1702
1705
  'display': 'flex', 'gap': '6px', 'z-index': '2'
1703
1706
  },
1704
- '.bw_carousel_indicator': {
1707
+ '.bw_bccl_carousel_indicator': {
1705
1708
  'width': '10px', 'height': '10px', 'border-radius': '50%', 'border': '2px solid transparent',
1706
1709
  'padding': '0', 'cursor': 'pointer'
1707
1710
  },
1708
- '.bw_carousel_indicator:hover': { 'opacity': '0.8' }
1711
+ '.bw_bccl_carousel_indicator:hover': { 'opacity': '0.8' }
1709
1712
  },
1710
1713
 
1711
1714
  // ---- Modal ----
1712
1715
  modal: {
1713
- '.bw_modal': {
1716
+ '.bw_bccl_modal': {
1714
1717
  'display': 'flex', 'align-items': 'center', 'justify-content': 'center',
1715
1718
  'position': 'fixed', 'top': '0', 'left': '0', 'width': '100%', 'height': '100%',
1716
1719
  'z-index': '1050', 'overflow-x': 'hidden', 'overflow-y': 'auto',
1717
1720
  'opacity': '0', 'visibility': 'hidden', 'pointer-events': 'none',
1718
1721
  'transition': 'opacity 0.2s ease-out, visibility 0.2s ease-out'
1719
1722
  },
1720
- '.bw_modal.bw_modal_show': { 'opacity': '1', 'visibility': 'visible', 'pointer-events': 'auto' },
1721
- '.bw_modal_dialog': {
1723
+ '.bw_bccl_modal.bw_bccl_modal_show': { 'opacity': '1', 'visibility': 'visible', 'pointer-events': 'auto' },
1724
+ '.bw_bccl_modal_dialog': {
1722
1725
  'position': 'relative', 'width': 'calc(100% - 1rem)', 'max-width': '500px', 'margin': '1.75rem auto',
1723
1726
  'pointer-events': 'none', 'transform': 'translateY(-16px)',
1724
1727
  'transition': 'transform 0.2s ease-out'
1725
1728
  },
1726
- '.bw_modal.bw_modal_show .bw_modal_dialog': { 'transform': 'translateY(0)' },
1727
- '.bw_modal_sm': { 'max-width': '300px' },
1728
- '.bw_modal_lg': { 'max-width': '800px' },
1729
- '.bw_modal_xl': { 'max-width': '1140px' },
1730
- '.bw_modal_content': {
1729
+ '.bw_bccl_modal.bw_bccl_modal_show .bw_bccl_modal_dialog': { 'transform': 'translateY(0)' },
1730
+ '.bw_bccl_modal_sm': { 'max-width': '300px' },
1731
+ '.bw_bccl_modal_lg': { 'max-width': '800px' },
1732
+ '.bw_bccl_modal_xl': { 'max-width': '1140px' },
1733
+ '.bw_bccl_modal_content': {
1731
1734
  'position': 'relative', 'display': 'flex', 'flex-direction': 'column', 'pointer-events': 'auto',
1732
1735
  'background-clip': 'padding-box', 'border': '1px solid transparent', 'outline': '0'
1733
1736
  },
1734
- '.bw_modal_header': { 'display': 'flex', 'align-items': 'center', 'justify-content': 'space-between', 'padding': '1rem 1.25rem', 'border-bottom': '1px solid transparent' },
1735
- '.bw_modal_title': { 'margin': '0', 'font-size': '1.25rem', 'font-weight': '600', 'line-height': '1.3' },
1736
- '.bw_modal_body': { 'position': 'relative', 'flex': '1 1 auto', 'padding': '1rem 1.25rem' },
1737
- '.bw_modal_footer': { 'display': 'flex', 'flex-wrap': 'wrap', 'align-items': 'center', 'justify-content': 'flex-end', 'gap': '0.5rem', 'padding': '0.75rem 1.25rem', 'border-top': '1px solid transparent' }
1737
+ '.bw_bccl_modal_header': { 'display': 'flex', 'align-items': 'center', 'justify-content': 'space-between', 'padding': '1rem 1.25rem', 'border-bottom': '1px solid transparent' },
1738
+ '.bw_bccl_modal_title': { 'margin': '0', 'font-size': '1.25rem', 'font-weight': '600', 'line-height': '1.3' },
1739
+ '.bw_bccl_modal_body': { 'position': 'relative', 'flex': '1 1 auto', 'padding': '1rem 1.25rem' },
1740
+ '.bw_bccl_modal_footer': { 'display': 'flex', 'flex-wrap': 'wrap', 'align-items': 'center', 'justify-content': 'flex-end', 'gap': '0.5rem', 'padding': '0.75rem 1.25rem', 'border-top': '1px solid transparent' }
1738
1741
  },
1739
1742
 
1740
1743
  // ---- Toast ----
1741
1744
  toast: {
1742
- '.bw_toast_container': {
1745
+ '.bw_bccl_toast_container': {
1743
1746
  'position': 'fixed', 'z-index': '1080', 'pointer-events': 'none',
1744
1747
  'display': 'flex', 'flex-direction': 'column', 'gap': '0.5rem', 'padding': '1rem'
1745
1748
  },
1746
- '.bw_toast_container.bw_toast_top_right': { 'top': '0', 'right': '0' },
1747
- '.bw_toast_container.bw_toast_top_left': { 'top': '0', 'left': '0' },
1748
- '.bw_toast_container.bw_toast_bottom_right': { 'bottom': '0', 'right': '0' },
1749
- '.bw_toast_container.bw_toast_bottom_left': { 'bottom': '0', 'left': '0' },
1750
- '.bw_toast_container.bw_toast_top_center': { 'top': '0', 'left': '50%', 'transform': 'translateX(-50%)' },
1751
- '.bw_toast_container.bw_toast_bottom_center': { 'bottom': '0', 'left': '50%', 'transform': 'translateX(-50%)' },
1752
- '.bw_toast': {
1749
+ '.bw_bccl_toast_container.bw_bccl_toast_top_right': { 'top': '0', 'right': '0' },
1750
+ '.bw_bccl_toast_container.bw_bccl_toast_top_left': { 'top': '0', 'left': '0' },
1751
+ '.bw_bccl_toast_container.bw_bccl_toast_bottom_right': { 'bottom': '0', 'right': '0' },
1752
+ '.bw_bccl_toast_container.bw_bccl_toast_bottom_left': { 'bottom': '0', 'left': '0' },
1753
+ '.bw_bccl_toast_container.bw_bccl_toast_top_center': { 'top': '0', 'left': '50%', 'transform': 'translateX(-50%)' },
1754
+ '.bw_bccl_toast_container.bw_bccl_toast_bottom_center': { 'bottom': '0', 'left': '50%', 'transform': 'translateX(-50%)' },
1755
+ '.bw_bccl_toast': {
1753
1756
  'pointer-events': 'auto', 'width': '350px', 'max-width': 'calc(100vw - 2rem)', 'background-clip': 'padding-box',
1754
1757
  'opacity': '0', 'transform': 'translateY(-8px)',
1755
1758
  'transition': 'opacity 0.2s ease-out, transform 0.2s ease-out'
1756
1759
  },
1757
- '.bw_toast.bw_toast_show': { 'opacity': '1', 'transform': 'translateY(0)' },
1758
- '.bw_toast.bw_toast_hiding': { 'opacity': '0', 'transform': 'translateY(-8px)' },
1759
- '.bw_toast_header': { 'display': 'flex', 'align-items': 'center', 'justify-content': 'space-between', 'padding': '0.5rem 0.75rem', 'font-size': '0.875rem', 'border-bottom': '1px solid transparent' },
1760
- '.bw_toast_body': { 'padding': '0.5rem 0.75rem', 'font-size': '0.9375rem' }
1760
+ '.bw_bccl_toast.bw_bccl_toast_show': { 'opacity': '1', 'transform': 'translateY(0)' },
1761
+ '.bw_bccl_toast.bw_bccl_toast_hiding': { 'opacity': '0', 'transform': 'translateY(-8px)' },
1762
+ '.bw_bccl_toast_header': { 'display': 'flex', 'align-items': 'center', 'justify-content': 'space-between', 'padding': '0.5rem 0.75rem', 'font-size': '0.875rem', 'border-bottom': '1px solid transparent' },
1763
+ '.bw_bccl_toast_body': { 'padding': '0.5rem 0.75rem', 'font-size': '0.9375rem' }
1761
1764
  },
1762
1765
 
1763
1766
  // ---- Dropdown ----
1764
1767
  dropdown: {
1765
- '.bw_dropdown': { 'position': 'relative', 'display': 'inline-block' },
1766
- '.bw_dropdown_toggle::after': {
1768
+ '.bw_bccl_dropdown': { 'position': 'relative', 'display': 'inline-block' },
1769
+ '.bw_bccl_dropdown_toggle::after': {
1767
1770
  'display': 'inline-block', 'margin-left': '0.255em', 'vertical-align': '0.255em',
1768
1771
  'content': '""', 'border-top': '0.3em solid', 'border-right': '0.3em solid transparent',
1769
1772
  'border-bottom': '0', 'border-left': '0.3em solid transparent'
1770
1773
  },
1771
- '.bw_dropdown_menu': {
1774
+ '.bw_bccl_dropdown_menu': {
1772
1775
  'position': 'absolute', 'top': '100%', 'left': '0', 'z-index': '1000', 'display': 'block',
1773
1776
  'min-width': '10rem', 'padding': '0.5rem 0', 'margin': '0.125rem 0 0',
1774
1777
  'background-clip': 'padding-box', 'border': '1px solid transparent',
@@ -1776,21 +1779,21 @@ var structuralRules = {
1776
1779
  'transform': 'translateY(-4px)',
1777
1780
  'transition': 'opacity 0.15s ease-out, transform 0.15s ease-out, visibility 0.15s ease-out'
1778
1781
  },
1779
- '.bw_dropdown_menu.bw_dropdown_show': { 'opacity': '1', 'visibility': 'visible', 'pointer-events': 'auto', 'transform': 'translateY(0)' },
1780
- '.bw_dropdown_menu_end': { 'left': 'auto', 'right': '0' },
1781
- '.bw_dropdown_item': {
1782
+ '.bw_bccl_dropdown_menu.bw_bccl_dropdown_show': { 'opacity': '1', 'visibility': 'visible', 'pointer-events': 'auto', 'transform': 'translateY(0)' },
1783
+ '.bw_bccl_dropdown_menu_end': { 'left': 'auto', 'right': '0' },
1784
+ '.bw_bccl_dropdown_item': {
1782
1785
  'display': 'block', 'width': '100%', 'padding': '0.4rem 1rem', 'clear': 'both',
1783
1786
  'font-weight': '400', 'text-align': 'inherit', 'text-decoration': 'none', 'white-space': 'nowrap',
1784
1787
  'background-color': 'transparent', 'border': '0', 'font-size': '0.9375rem', 'cursor': 'pointer'
1785
1788
  },
1786
- '.bw_dropdown_item:focus-visible': { 'outline': '2px solid currentColor', 'outline-offset': '-2px' },
1787
- '.bw_dropdown_divider': { 'height': '0', 'margin': '0.5rem 0', 'overflow': 'hidden', 'opacity': '1' }
1789
+ '.bw_bccl_dropdown_item:focus-visible': { 'outline': '2px solid currentColor', 'outline-offset': '-2px' },
1790
+ '.bw_bccl_dropdown_divider': { 'height': '0', 'margin': '0.5rem 0', 'overflow': 'hidden', 'opacity': '1' }
1788
1791
  },
1789
1792
 
1790
1793
  // ---- Form switch ----
1791
1794
  formSwitch: {
1792
- '.bw_form_switch': { 'padding-left': '2.5em' },
1793
- '.bw_form_switch .bw_switch_input': {
1795
+ '.bw_bccl_form_switch': { 'padding-left': '2.5em' },
1796
+ '.bw_bccl_form_switch .bw_switch_input': {
1794
1797
  'width': '2em', 'height': '1.125em', 'margin-left': '-2.5em', 'border-radius': '2em',
1795
1798
  'appearance': 'none',
1796
1799
  'background-image': "url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba(255,255,255,1)'/%3e%3c/svg%3e\")",
@@ -1798,8 +1801,8 @@ var structuralRules = {
1798
1801
  'background-size': 'contain', 'cursor': 'pointer',
1799
1802
  'transition': 'background-color 0.15s ease-out, background-position 0.15s ease-out, border-color 0.15s ease-out'
1800
1803
  },
1801
- '.bw_form_switch .bw_switch_input:checked': { 'background-position': 'right center' },
1802
- '.bw_form_switch .bw_switch_input:disabled': { 'opacity': '0.5', 'cursor': 'not-allowed' }
1804
+ '.bw_bccl_form_switch .bw_switch_input:checked': { 'background-position': 'right center' },
1805
+ '.bw_bccl_form_switch .bw_switch_input:disabled': { 'opacity': '0.5', 'cursor': 'not-allowed' }
1803
1806
  },
1804
1807
 
1805
1808
  // ---- Skeleton ----
@@ -1841,21 +1844,21 @@ var structuralRules = {
1841
1844
 
1842
1845
  // ---- Tooltip ----
1843
1846
  tooltip: {
1844
- '.bw_tooltip_wrapper': { 'position': 'relative', 'display': 'inline-block' },
1845
- '.bw_tooltip': {
1847
+ '.bw_bccl_tooltip_wrapper': { 'position': 'relative', 'display': 'inline-block' },
1848
+ '.bw_bccl_tooltip': {
1846
1849
  'position': 'absolute', 'z-index': '999',
1847
1850
  'font-size': '0.875rem', 'white-space': 'nowrap', 'max-width': 'min(300px, calc(100vw - 1rem))', 'pointer-events': 'none',
1848
1851
  'opacity': '0', 'visibility': 'hidden'
1849
1852
  },
1850
- '.bw_tooltip.bw_tooltip_show': { 'opacity': '1', 'visibility': 'visible' },
1851
- '.bw_tooltip_top': { 'bottom': '100%', 'left': '50%', 'transform': 'translateX(-50%) translateY(-4px)', 'margin-bottom': '4px' },
1852
- '.bw_tooltip_top.bw_tooltip_show': { 'transform': 'translateX(-50%) translateY(0)' },
1853
- '.bw_tooltip_bottom': { 'top': '100%', 'left': '50%', 'transform': 'translateX(-50%) translateY(4px)', 'margin-top': '4px' },
1854
- '.bw_tooltip_bottom.bw_tooltip_show': { 'transform': 'translateX(-50%) translateY(0)' },
1855
- '.bw_tooltip_left': { 'right': '100%', 'top': '50%', 'transform': 'translateY(-50%) translateX(-4px)', 'margin-right': '4px' },
1856
- '.bw_tooltip_left.bw_tooltip_show': { 'transform': 'translateY(-50%) translateX(0)' },
1857
- '.bw_tooltip_right': { 'left': '100%', 'top': '50%', 'transform': 'translateY(-50%) translateX(4px)', 'margin-left': '4px' },
1858
- '.bw_tooltip_right.bw_tooltip_show': { 'transform': 'translateY(-50%) translateX(0)' }
1853
+ '.bw_bccl_tooltip.bw_bccl_tooltip_show': { 'opacity': '1', 'visibility': 'visible' },
1854
+ '.bw_bccl_tooltip_top': { 'bottom': '100%', 'left': '50%', 'transform': 'translateX(-50%) translateY(-4px)', 'margin-bottom': '4px' },
1855
+ '.bw_bccl_tooltip_top.bw_bccl_tooltip_show': { 'transform': 'translateX(-50%) translateY(0)' },
1856
+ '.bw_bccl_tooltip_bottom': { 'top': '100%', 'left': '50%', 'transform': 'translateX(-50%) translateY(4px)', 'margin-top': '4px' },
1857
+ '.bw_bccl_tooltip_bottom.bw_bccl_tooltip_show': { 'transform': 'translateX(-50%) translateY(0)' },
1858
+ '.bw_bccl_tooltip_left': { 'right': '100%', 'top': '50%', 'transform': 'translateY(-50%) translateX(-4px)', 'margin-right': '4px' },
1859
+ '.bw_bccl_tooltip_left.bw_bccl_tooltip_show': { 'transform': 'translateY(-50%) translateX(0)' },
1860
+ '.bw_bccl_tooltip_right': { 'left': '100%', 'top': '50%', 'transform': 'translateY(-50%) translateX(4px)', 'margin-left': '4px' },
1861
+ '.bw_bccl_tooltip_right.bw_bccl_tooltip_show': { 'transform': 'translateY(-50%) translateX(0)' }
1859
1862
  },
1860
1863
 
1861
1864
  // ---- Popover ----
@@ -1938,18 +1941,18 @@ var structuralRules = {
1938
1941
 
1939
1942
  // ---- Timeline ----
1940
1943
  timeline: {
1941
- '.bw_timeline': { 'position': 'relative', 'padding-left': '2rem' },
1942
- '.bw_timeline::before': {
1944
+ '.bw_bccl_timeline': { 'position': 'relative', 'padding-left': '2rem' },
1945
+ '.bw_bccl_timeline::before': {
1943
1946
  'content': '""', 'position': 'absolute', 'left': '0.5rem', 'top': '0', 'bottom': '0',
1944
1947
  'width': '2px'
1945
1948
  },
1946
- '.bw_timeline_item': { 'position': 'relative', 'padding-bottom': '1.5rem' },
1947
- '.bw_timeline_item:last-child': { 'padding-bottom': '0' },
1948
- '.bw_timeline_marker': { 'position': 'absolute', 'left': '-1.75rem', 'top': '0.25rem', 'width': '0.75rem', 'height': '0.75rem', 'border-radius': '50%' },
1949
- '.bw_timeline_content': { 'padding-left': '0.5rem' },
1950
- '.bw_timeline_date': { 'font-size': '0.75rem', 'margin-bottom': '0.25rem', 'font-weight': '500' },
1951
- '.bw_timeline_title': { 'font-size': '1rem', 'font-weight': '600', 'margin': '0 0 0.25rem 0', 'line-height': '1.3' },
1952
- '.bw_timeline_text': { 'font-size': '0.875rem', 'margin': '0', 'line-height': '1.5' }
1949
+ '.bw_bccl_timeline_item': { 'position': 'relative', 'padding-bottom': '1.5rem' },
1950
+ '.bw_bccl_timeline_item:last-child': { 'padding-bottom': '0' },
1951
+ '.bw_bccl_timeline_marker': { 'position': 'absolute', 'left': '-1.75rem', 'top': '0.25rem', 'width': '0.75rem', 'height': '0.75rem', 'border-radius': '50%' },
1952
+ '.bw_bccl_timeline_content': { 'padding-left': '0.5rem' },
1953
+ '.bw_bccl_timeline_date': { 'font-size': '0.75rem', 'margin-bottom': '0.25rem', 'font-weight': '500' },
1954
+ '.bw_bccl_timeline_title': { 'font-size': '1rem', 'font-weight': '600', 'margin': '0 0 0.25rem 0', 'line-height': '1.3' },
1955
+ '.bw_bccl_timeline_text': { 'font-size': '0.875rem', 'margin': '0', 'line-height': '1.5' }
1953
1956
  },
1954
1957
 
1955
1958
  // ---- Stepper ----
@@ -2001,66 +2004,27 @@ var structuralRules = {
2001
2004
 
2002
2005
  // ---- Responsive ----
2003
2006
  responsive: {
2004
- '@media (min-width: 576px)': {
2005
- '.bw_col_sm_1': { 'flex': '0 0 8.333333%', 'max-width': '8.333333%' },
2006
- '.bw_col_sm_2': { 'flex': '0 0 16.666667%', 'max-width': '16.666667%' },
2007
- '.bw_col_sm_3': { 'flex': '0 0 25%', 'max-width': '25%' },
2008
- '.bw_col_sm_4': { 'flex': '0 0 33.333333%', 'max-width': '33.333333%' },
2009
- '.bw_col_sm_5': { 'flex': '0 0 41.666667%', 'max-width': '41.666667%' },
2010
- '.bw_col_sm_6': { 'flex': '0 0 50%', 'max-width': '50%' },
2011
- '.bw_col_sm_7': { 'flex': '0 0 58.333333%', 'max-width': '58.333333%' },
2012
- '.bw_col_sm_8': { 'flex': '0 0 66.666667%', 'max-width': '66.666667%' },
2013
- '.bw_col_sm_9': { 'flex': '0 0 75%', 'max-width': '75%' },
2014
- '.bw_col_sm_10': { 'flex': '0 0 83.333333%', 'max-width': '83.333333%' },
2015
- '.bw_col_sm_11': { 'flex': '0 0 91.666667%', 'max-width': '91.666667%' },
2016
- '.bw_col_sm_12': { 'flex': '0 0 100%', 'max-width': '100%' }
2017
- },
2018
- '@media (min-width: 768px)': {
2019
- '.bw_col_md_1': { 'flex': '0 0 8.333333%', 'max-width': '8.333333%' },
2020
- '.bw_col_md_2': { 'flex': '0 0 16.666667%', 'max-width': '16.666667%' },
2021
- '.bw_col_md_3': { 'flex': '0 0 25%', 'max-width': '25%' },
2022
- '.bw_col_md_4': { 'flex': '0 0 33.333333%', 'max-width': '33.333333%' },
2023
- '.bw_col_md_5': { 'flex': '0 0 41.666667%', 'max-width': '41.666667%' },
2024
- '.bw_col_md_6': { 'flex': '0 0 50%', 'max-width': '50%' },
2025
- '.bw_col_md_7': { 'flex': '0 0 58.333333%', 'max-width': '58.333333%' },
2026
- '.bw_col_md_8': { 'flex': '0 0 66.666667%', 'max-width': '66.666667%' },
2027
- '.bw_col_md_9': { 'flex': '0 0 75%', 'max-width': '75%' },
2028
- '.bw_col_md_10': { 'flex': '0 0 83.333333%', 'max-width': '83.333333%' },
2029
- '.bw_col_md_11': { 'flex': '0 0 91.666667%', 'max-width': '91.666667%' },
2030
- '.bw_col_md_12': { 'flex': '0 0 100%', 'max-width': '100%' }
2031
- },
2032
- '@media (min-width: 992px)': {
2033
- '.bw_col_lg_1': { 'flex': '0 0 8.333333%', 'max-width': '8.333333%' },
2034
- '.bw_col_lg_2': { 'flex': '0 0 16.666667%', 'max-width': '16.666667%' },
2035
- '.bw_col_lg_3': { 'flex': '0 0 25%', 'max-width': '25%' },
2036
- '.bw_col_lg_4': { 'flex': '0 0 33.333333%', 'max-width': '33.333333%' },
2037
- '.bw_col_lg_5': { 'flex': '0 0 41.666667%', 'max-width': '41.666667%' },
2038
- '.bw_col_lg_6': { 'flex': '0 0 50%', 'max-width': '50%' },
2039
- '.bw_col_lg_7': { 'flex': '0 0 58.333333%', 'max-width': '58.333333%' },
2040
- '.bw_col_lg_8': { 'flex': '0 0 66.666667%', 'max-width': '66.666667%' },
2041
- '.bw_col_lg_9': { 'flex': '0 0 75%', 'max-width': '75%' },
2042
- '.bw_col_lg_10': { 'flex': '0 0 83.333333%', 'max-width': '83.333333%' },
2043
- '.bw_col_lg_11': { 'flex': '0 0 91.666667%', 'max-width': '91.666667%' },
2044
- '.bw_col_lg_12': { 'flex': '0 0 100%', 'max-width': '100%' }
2045
- },
2007
+ '@media (min-width: 576px)': _gridCols('bw_col_sm'),
2008
+ '@media (min-width: 768px)': _gridCols('bw_col_md'),
2009
+ '@media (min-width: 992px)': _gridCols('bw_col_lg'),
2046
2010
  '@media (max-width: 575px)': {
2047
- '.bw_card_img_left, .bw_card-img-left': { 'width': '100%' },
2048
- '.bw_card_img_right, .bw_card-img-right': { 'width': '100%' },
2049
- '.bw_hero, .bw_hero': { 'padding': '2rem 1rem' },
2011
+ '.bw_bccl_card_img_left, .bw_bccl_card-img-left': { 'width': '100%' },
2012
+ '.bw_bccl_card_img_right, .bw_bccl_card-img-right': { 'width': '100%' },
2013
+ '.bw_bccl_hero, .bw_bccl_hero': { 'padding': '2rem 1rem' },
2050
2014
  '.bw_cta_actions, .bw_cta-actions': { 'flex-direction': 'column' },
2051
2015
  '.bw_hstack, .bw_hstack': { 'flex-direction': 'column' },
2052
2016
  '.bw_feature_grid, .bw_feature-grid': { 'grid-template-columns': '1fr' },
2053
- '.bw_modal_dialog': { 'margin': '0.5rem auto' },
2054
- '.bw_modal_lg': { 'max-width': 'calc(100% - 1rem)' },
2055
- '.bw_modal_xl': { 'max-width': 'calc(100% - 1rem)' },
2056
- '.bw_navbar': { 'padding': '0.5rem 0.75rem' },
2057
- '.bw_navbar_brand': { 'margin-right': '0.5rem', 'font-size': '1rem' },
2058
- '.bw_navbar_nav': { 'flex-wrap': 'wrap' },
2059
- '.bw_tooltip': { 'white-space': 'normal' },
2060
- '.bw_table': { 'display': 'block', 'overflow-x': 'auto', '-webkit-overflow-scrolling': 'touch' },
2017
+ '.bw_bccl_modal_dialog': { 'margin': '0.5rem auto' },
2018
+ '.bw_bccl_modal_lg': { 'max-width': 'calc(100% - 1rem)' },
2019
+ '.bw_bccl_modal_xl': { 'max-width': 'calc(100% - 1rem)' },
2020
+ '.bw_bccl_navbar': { 'padding': '0.5rem 0.75rem' },
2021
+ '.bw_bccl_navbar_brand': { 'margin-right': '0.5rem', 'font-size': '1rem' },
2022
+ '.bw_bccl_navbar_nav': { 'flex-wrap': 'wrap' },
2023
+ '.bw_bccl_tooltip': { 'white-space': 'normal' },
2024
+ '.bw_bccl_table': { 'display': 'block', 'overflow-x': 'auto', '-webkit-overflow-scrolling': 'touch' },
2061
2025
  '.bw_col, .bw_col_1, .bw_col_2, .bw_col_3, .bw_col_4, .bw_col_5, .bw_col_6, .bw_col_7, .bw_col_8, .bw_col_9, .bw_col_10, .bw_col_11, .bw_col_12': { 'flex': '0 0 100%', 'max-width': '100%' },
2062
- '.bw_container': { 'padding-right': '0.5rem', 'padding-left': '0.5rem' },
2063
- '.bw_container_fluid': { 'padding-right': '0.5rem', 'padding-left': '0.5rem' }
2026
+ '.bw_bccl_container': { 'padding-right': '0.5rem', 'padding-left': '0.5rem' },
2027
+ '.bw_bccl_container_fluid': { 'padding-right': '0.5rem', 'padding-left': '0.5rem' }
2064
2028
  }
2065
2029
  }
2066
2030
  };
@@ -2082,12 +2046,12 @@ function generateUtilityRules() {
2082
2046
  rules['.bw_ms_' + k] = { 'margin-left': v + ' !important' };
2083
2047
  rules['.bw_me_' + k] = { 'margin-right': v + ' !important' };
2084
2048
  rules['.bw_p_' + k] = { 'padding': v + ' !important' };
2085
- rules['.bw_pt_' + k + ', .pt-' + k] = { 'padding-top': v + ' !important' };
2086
- rules['.bw_pb_' + k + ', .pb-' + k] = { 'padding-bottom': v + ' !important' };
2087
- rules['.bw_ps_' + k + ', .ps-' + k] = { 'padding-left': v + ' !important' };
2088
- rules['.bw_pe_' + k + ', .pe-' + k] = { 'padding-right': v + ' !important' };
2049
+ rules['.bw_pt_' + k] = { 'padding-top': v + ' !important' };
2050
+ rules['.bw_pb_' + k] = { 'padding-bottom': v + ' !important' };
2051
+ rules['.bw_ps_' + k] = { 'padding-left': v + ' !important' };
2052
+ rules['.bw_pe_' + k] = { 'padding-right': v + ' !important' };
2089
2053
  }
2090
- rules['.bw_m_auto, .m-auto'] = { 'margin': 'auto !important' };
2054
+ rules['.bw_m_auto'] = { 'margin': 'auto !important' };
2091
2055
  rules['.bw_py_3'] = { 'padding-top': '1rem !important', 'padding-bottom': '1rem !important' };
2092
2056
  rules['.bw_py_4'] = { 'padding-top': '1.5rem !important', 'padding-bottom': '1.5rem !important' };
2093
2057
  rules['.bw_py_5'] = { 'padding-top': '3rem !important', 'padding-bottom': '3rem !important' };
@@ -2126,6 +2090,10 @@ function generateUtilityRules() {
2126
2090
  rules['.bw_text_lowercase'] = { 'text-transform': 'lowercase' };
2127
2091
  rules['.bw_text_capitalize'] = { 'text-transform': 'capitalize' };
2128
2092
 
2093
+ // White-space
2094
+ rules['.bw_text_wrap'] = { 'white-space': 'normal' };
2095
+ rules['.bw_text_nowrap'] = { 'white-space': 'nowrap' };
2096
+
2129
2097
  // Font size
2130
2098
  rules['.bw_fs_sm'] = { 'font-size': '0.875rem' };
2131
2099
  rules['.bw_fs_base'] = { 'font-size': '1rem' };
@@ -2134,95 +2102,66 @@ function generateUtilityRules() {
2134
2102
 
2135
2103
  // Flexbox
2136
2104
  var jc = { start: 'flex-start', end: 'flex-end', center: 'center', between: 'space-between', around: 'space-around' };
2137
- for (var jk in jc) { rules['.bw_justify_content_' + jk + ', .justify-content-' + jk] = { 'justify-content': jc[jk] }; }
2105
+ for (var jk in jc) { rules['.bw_justify_content_' + jk] = { 'justify-content': jc[jk] }; }
2138
2106
  var ai = { start: 'flex-start', end: 'flex-end', center: 'center' };
2139
- for (var ak in ai) { rules['.bw_align_items_' + ak + ', .align-items-' + ak] = { 'align-items': ai[ak] }; }
2107
+ for (var ak in ai) { rules['.bw_align_items_' + ak] = { 'align-items': ai[ak] }; }
2140
2108
 
2141
2109
  // Borders
2142
2110
  rules['.bw_border'] = { 'border': '1px solid transparent !important' };
2143
2111
  rules['.bw_border_0'] = { 'border': '0 !important' };
2144
- rules['.bw_border_top_0, .border-top-0'] = { 'border-top': '0 !important' };
2145
- rules['.bw_border_end_0, .border-end-0'] = { 'border-right': '0 !important' };
2146
- rules['.bw_border_bottom_0, .border-bottom-0'] = { 'border-bottom': '0 !important' };
2147
- rules['.bw_border_start_0, .border-start-0'] = { 'border-left': '0 !important' };
2112
+ rules['.bw_border_top_0'] = { 'border-top': '0 !important' };
2113
+ rules['.bw_border_end_0'] = { 'border-right': '0 !important' };
2114
+ rules['.bw_border_bottom_0'] = { 'border-bottom': '0 !important' };
2115
+ rules['.bw_border_start_0'] = { 'border-left': '0 !important' };
2148
2116
 
2149
2117
  // Rounded
2150
2118
  rules['.bw_rounded'] = { 'border-radius': '.375rem !important' };
2151
2119
  rules['.bw_rounded_0'] = { 'border-radius': '0 !important' };
2152
- rules['.bw_rounded_1, .rounded-1'] = { 'border-radius': '.25rem !important' };
2153
- rules['.bw_rounded_2, .rounded-2'] = { 'border-radius': '.375rem !important' };
2154
- rules['.bw_rounded_3, .rounded-3'] = { 'border-radius': '.5rem !important' };
2120
+ rules['.bw_rounded_1'] = { 'border-radius': '.25rem !important' };
2121
+ rules['.bw_rounded_2'] = { 'border-radius': '.375rem !important' };
2122
+ rules['.bw_rounded_3'] = { 'border-radius': '.5rem !important' };
2155
2123
  rules['.bw_rounded_circle'] = { 'border-radius': '50% !important' };
2156
- rules['.bw_rounded_pill, .rounded-pill'] = { 'border-radius': '50rem !important' };
2124
+ rules['.bw_rounded_pill'] = { 'border-radius': '50rem !important' };
2157
2125
 
2158
2126
  // Shadows
2159
2127
  rules['.bw_shadow'] = { 'box-shadow': '0 .5rem 1rem rgba(0,0,0,.15) !important' };
2160
2128
  rules['.bw_shadow_sm'] = { 'box-shadow': '0 .125rem .25rem rgba(0,0,0,.075) !important' };
2161
2129
  rules['.bw_shadow_lg'] = { 'box-shadow': '0 1rem 3rem rgba(0,0,0,.175) !important' };
2162
- rules['.bw_shadow_none, .shadow-none'] = { 'box-shadow': 'none !important' };
2130
+ rules['.bw_shadow_none'] = { 'box-shadow': 'none !important' };
2163
2131
 
2164
2132
  // Width/Height
2165
2133
  ['25', '50', '75', '100'].forEach(function(n) {
2166
- rules['.bw_w_' + n + ', .w-' + n] = { 'width': n + '% !important' };
2167
- rules['.bw_h_' + n + ', .h-' + n] = { 'height': n + '% !important' };
2134
+ rules['.bw_w_' + n] = { 'width': n + '% !important' };
2135
+ rules['.bw_h_' + n] = { 'height': n + '% !important' };
2168
2136
  });
2169
- rules['.bw_w_auto, .w-auto'] = { 'width': 'auto !important' };
2170
- rules['.bw_h_auto, .h-auto'] = { 'height': 'auto !important' };
2171
- rules['.bw_mw_100, .mw-100'] = { 'max-width': '100% !important' };
2172
- rules['.bw_mh_100, .mh-100'] = { 'max-height': '100% !important' };
2137
+ rules['.bw_w_auto'] = { 'width': 'auto !important' };
2138
+ rules['.bw_h_auto'] = { 'height': 'auto !important' };
2139
+ rules['.bw_mw_100'] = { 'max-width': '100% !important' };
2140
+ rules['.bw_mh_100'] = { 'max-height': '100% !important' };
2173
2141
 
2174
2142
  // Positioning
2175
2143
  ['static', 'relative', 'absolute', 'fixed', 'sticky'].forEach(function(p) {
2176
- rules['.bw_position_' + p + ', .position-' + p] = { 'position': p + ' !important' };
2144
+ rules['.bw_position_' + p] = { 'position': p + ' !important' };
2177
2145
  });
2178
- rules['.bw_top_0, .top-0'] = { 'top': '0 !important' };
2179
- rules['.bw_top_50, .top-50'] = { 'top': '50% !important' };
2180
- rules['.bw_top_100, .top-100'] = { 'top': '100% !important' };
2181
- rules['.bw_bottom_0, .bottom-0'] = { 'bottom': '0 !important' };
2182
- rules['.bw_bottom_50, .bottom-50'] = { 'bottom': '50% !important' };
2183
- rules['.bw_bottom_100, .bottom-100'] = { 'bottom': '100% !important' };
2184
- rules['.bw_start_0, .start-0'] = { 'left': '0 !important' };
2185
- rules['.bw_start_50, .start-50'] = { 'left': '50% !important' };
2186
- rules['.bw_start_100, .start-100'] = { 'left': '100% !important' };
2187
- rules['.bw_end_0, .end-0'] = { 'right': '0 !important' };
2188
- rules['.bw_end_50, .end-50'] = { 'right': '50% !important' };
2189
- rules['.bw_end_100, .end-100'] = { 'right': '100% !important' };
2190
- rules['.bw_translate_middle, .translate-middle'] = { 'transform': 'translate(-50%, -50%) !important' };
2146
+ rules['.bw_top_0'] = { 'top': '0 !important' };
2147
+ rules['.bw_top_50'] = { 'top': '50% !important' };
2148
+ rules['.bw_top_100'] = { 'top': '100% !important' };
2149
+ rules['.bw_bottom_0'] = { 'bottom': '0 !important' };
2150
+ rules['.bw_bottom_50'] = { 'bottom': '50% !important' };
2151
+ rules['.bw_bottom_100'] = { 'bottom': '100% !important' };
2152
+ rules['.bw_start_0'] = { 'left': '0 !important' };
2153
+ rules['.bw_start_50'] = { 'left': '50% !important' };
2154
+ rules['.bw_start_100'] = { 'left': '100% !important' };
2155
+ rules['.bw_end_0'] = { 'right': '0 !important' };
2156
+ rules['.bw_end_50'] = { 'right': '50% !important' };
2157
+ rules['.bw_end_100'] = { 'right': '100% !important' };
2158
+ rules['.bw_translate_middle'] = { 'transform': 'translate(-50%, -50%) !important' };
2191
2159
 
2192
2160
  // Overflow
2193
2161
  ['auto', 'hidden', 'visible', 'scroll'].forEach(function(o) {
2194
- rules['.bw_overflow_' + o + ', .overflow-' + o] = { 'overflow': o + ' !important' };
2162
+ rules['.bw_overflow_' + o] = { 'overflow': o + ' !important' };
2195
2163
  });
2196
2164
 
2197
- // Typography utilities
2198
- rules['.fs-1'] = { 'font-size': 'calc(1.375rem + 1.5vw) !important' };
2199
- rules['.fs-2'] = { 'font-size': 'calc(1.325rem + .9vw) !important' };
2200
- rules['.fs-3'] = { 'font-size': 'calc(1.3rem + .6vw) !important' };
2201
- rules['.fs-4'] = { 'font-size': 'calc(1.275rem + .3vw) !important' };
2202
- rules['.fs-5'] = { 'font-size': '1.25rem !important' };
2203
- rules['.fs-6'] = { 'font-size': '1rem !important' };
2204
- rules['.fw-light'] = { 'font-weight': '300 !important' };
2205
- rules['.fw-lighter'] = { 'font-weight': 'lighter !important' };
2206
- rules['.fw-normal'] = { 'font-weight': '400 !important' };
2207
- rules['.fw-bold'] = { 'font-weight': '700 !important' };
2208
- rules['.fw-bolder'] = { 'font-weight': 'bolder !important' };
2209
- rules['.fst-italic'] = { 'font-style': 'italic !important' };
2210
- rules['.fst-normal'] = { 'font-style': 'normal !important' };
2211
- rules['.text-decoration-none'] = { 'text-decoration': 'none !important' };
2212
- rules['.text-decoration-underline'] = { 'text-decoration': 'underline !important' };
2213
- rules['.text-decoration-line-through'] = { 'text-decoration': 'line-through !important' };
2214
- rules['.text-lowercase'] = { 'text-transform': 'lowercase !important' };
2215
- rules['.text-uppercase'] = { 'text-transform': 'uppercase !important' };
2216
- rules['.text-capitalize'] = { 'text-transform': 'capitalize !important' };
2217
- rules['.text-wrap'] = { 'white-space': 'normal !important' };
2218
- rules['.text-nowrap'] = { 'white-space': 'nowrap !important' };
2219
-
2220
- // List utilities
2221
- rules['.list-unstyled'] = { 'padding-left': '0', 'list-style': 'none' };
2222
- rules['.list-inline'] = { 'padding-left': '0', 'list-style': 'none' };
2223
- rules['.list-inline-item'] = { 'display': 'inline-block' };
2224
- rules['.list-inline-item:not(:last-child)'] = { 'margin-right': '.5rem' };
2225
-
2226
2165
  // Typography — bw_ prefixed utilities via loops
2227
2166
  var _imp = function(p, v) { var o = {}; o[p] = v + ' !important'; return o; };
2228
2167
  [['fs',{'xs':'0.75rem','sm':'0.875rem','base':'1rem','lg':'1.125rem','xl':'1.25rem','2xl':'1.5rem'},'font-size'],
@@ -2230,6 +2169,12 @@ function generateUtilityRules() {
2230
2169
  ['lh',{tight:'1.25',normal:'1.5',relaxed:'1.75'},'line-height']
2231
2170
  ].forEach(function(d) { for (var dk in d[1]) rules['.bw_'+d[0]+'_'+dk] = _imp(d[2], d[1][dk]); });
2232
2171
 
2172
+ // List utilities
2173
+ rules['.bw_list_unstyled'] = { 'padding-left': '0', 'list-style': 'none' };
2174
+ rules['.bw_list_inline'] = { 'padding-left': '0', 'list-style': 'none' };
2175
+ rules['.bw_list_inline_item'] = { 'display': 'inline-block' };
2176
+ rules['.bw_list_inline_item:not(:last-child)'] = { 'margin-right': '.5rem' };
2177
+
2233
2178
  // Flex utilities
2234
2179
  rules['.bw_flex'] = { 'display': 'flex' };
2235
2180
  rules['.bw_flex_column'] = { 'flex-direction': 'column' };
@@ -2238,24 +2183,24 @@ function generateUtilityRules() {
2238
2183
  for (var gk in spacingValues) rules['.bw_gap_' + gk] = { 'gap': spacingValues[gk] + ' !important' };
2239
2184
 
2240
2185
  // Visibility
2241
- rules['.bw_visible, .visible'] = { 'visibility': 'visible !important' };
2242
- rules['.bw_invisible, .invisible'] = { 'visibility': 'hidden !important' };
2186
+ rules['.bw_visible'] = { 'visibility': 'visible !important' };
2187
+ rules['.bw_invisible'] = { 'visibility': 'hidden !important' };
2243
2188
 
2244
2189
  // User select
2245
2190
  ['all', 'auto', 'none'].forEach(function(u) {
2246
- rules['.bw_user_select_' + u + ', .user-select-' + u] = { 'user-select': u + ' !important' };
2191
+ rules['.bw_user_select_' + u] = { 'user-select': u + ' !important' };
2247
2192
  });
2248
2193
 
2249
2194
  // Pointer events
2250
- rules['.pe-none'] = { 'pointer-events': 'none !important' };
2251
- rules['.pe-auto'] = { 'pointer-events': 'auto !important' };
2195
+ rules['.bw_pe_none'] = { 'pointer-events': 'none !important' };
2196
+ rules['.bw_pe_auto'] = { 'pointer-events': 'auto !important' };
2252
2197
 
2253
2198
  // Opacity
2254
- rules['.opacity-0'] = { 'opacity': '0 !important' };
2255
- rules['.opacity-25'] = { 'opacity': '.25 !important' };
2256
- rules['.opacity-50'] = { 'opacity': '.5 !important' };
2257
- rules['.opacity-75'] = { 'opacity': '.75 !important' };
2258
- rules['.opacity-100'] = { 'opacity': '1 !important' };
2199
+ rules['.bw_opacity_0'] = { 'opacity': '0 !important' };
2200
+ rules['.bw_opacity_25'] = { 'opacity': '.25 !important' };
2201
+ rules['.bw_opacity_50'] = { 'opacity': '.5 !important' };
2202
+ rules['.bw_opacity_75'] = { 'opacity': '.75 !important' };
2203
+ rules['.bw_opacity_100'] = { 'opacity': '1 !important' };
2259
2204
 
2260
2205
  return rules;
2261
2206
  }
@@ -2341,7 +2286,7 @@ export var defaultStyles = Object.assign({}, structuralRules, {
2341
2286
  },
2342
2287
  reset: structuralRules.base,
2343
2288
  enhancedCards: structuralRules.cards,
2344
- tableResponsive: { '.bw_table_responsive': { 'overflow-x': 'auto', '-webkit-overflow-scrolling': 'touch' } },
2289
+ tableResponsive: { '.bw_bccl_table_responsive': { 'overflow-x': 'auto', '-webkit-overflow-scrolling': 'touch' } },
2345
2290
  utilities: generateUtilityRules()
2346
2291
  });
2347
2292
 
@@ -2413,44 +2358,10 @@ export let theme = {
2413
2358
  * @returns {Object} CSS rules object scoped under .bw_theme_alt (+ optional .name)
2414
2359
  */
2415
2360
  export function generateAlternateCSS(name, altPalette, layout) {
2416
- // Generate themed CSS using the same pipeline as primary
2417
2361
  var rawRules = generateThemedCSS('', altPalette, layout);
2418
-
2419
- // Re-scope every selector under .bw_theme_alt (+ optional theme name)
2420
2362
  var altPrefix = name ? '.' + name + '.bw_theme_alt' : '.bw_theme_alt';
2421
- var altRules = {};
2422
-
2423
- for (var sel in rawRules) {
2424
- if (!rawRules.hasOwnProperty(sel)) continue;
2363
+ var altRules = scopeRulesUnder(rawRules, altPrefix);
2425
2364
 
2426
- if (sel.charAt(0) === '@') {
2427
- // @media / @keyframes — recurse into the block
2428
- var innerBlock = rawRules[sel];
2429
- var altInner = {};
2430
- for (var innerSel in innerBlock) {
2431
- if (!innerBlock.hasOwnProperty(innerSel)) continue;
2432
- altInner[altPrefix + ' ' + innerSel] = innerBlock[innerSel];
2433
- }
2434
- altRules[sel] = altInner;
2435
- } else {
2436
- // Regular selector — prefix with alt scope
2437
- // Handle comma-separated selectors
2438
- var parts = sel.split(',');
2439
- var scopedParts = [];
2440
- for (var i = 0; i < parts.length; i++) {
2441
- var s = parts[i].trim();
2442
- // 'body' selector gets special treatment: .bw_theme_alt body
2443
- if (s === 'body' || s.indexOf('body') === 0) {
2444
- scopedParts.push(altPrefix + ' ' + s);
2445
- } else {
2446
- scopedParts.push(altPrefix + ' ' + s);
2447
- }
2448
- }
2449
- altRules[scopedParts.join(', ')] = rawRules[sel];
2450
- }
2451
- }
2452
-
2453
- // Add body-level overrides for the alternate surface
2454
2365
  altRules[altPrefix + ' body, :root' + altPrefix + ' body'] = {
2455
2366
  'color': altPalette.dark.base,
2456
2367
  'background-color': altPalette.light.base
@@ -2468,19 +2379,24 @@ export function generateAlternateCSS(name, altPalette, layout) {
2468
2379
  * for the first segment: `#scope.bw_theme_alt .sel` vs `#scope .sel`
2469
2380
  * @returns {Object} New rules object with scoped selectors
2470
2381
  */
2471
- export function scopeRulesUnder(rules, prefix, compound) {
2382
+ export function scopeRulesUnder(rules, prefix, _compound) {
2472
2383
  var scoped = {};
2473
2384
  for (var sel in rules) {
2474
- if (!rules.hasOwnProperty(sel)) continue;
2385
+ if (!Object.prototype.hasOwnProperty.call(rules, sel)) continue;
2475
2386
  if (sel.charAt(0) === '@') {
2476
- // @media / @keyframes — recurse into the block
2477
2387
  var innerBlock = rules[sel];
2478
- var scopedInner = {};
2479
- for (var innerSel in innerBlock) {
2480
- if (!innerBlock.hasOwnProperty(innerSel)) continue;
2481
- scopedInner[_prefixSelector(innerSel, prefix)] = innerBlock[innerSel];
2388
+ // @keyframes steps (0%, 100%, from, to) are NOT selectors; pass through
2389
+ if (/^@keyframes\s/.test(sel)) {
2390
+ scoped[sel] = innerBlock;
2391
+ } else {
2392
+ // @media — prefix inner selectors
2393
+ var scopedInner = {};
2394
+ for (var innerSel in innerBlock) {
2395
+ if (!Object.prototype.hasOwnProperty.call(innerBlock, innerSel)) continue;
2396
+ scopedInner[_prefixSelector(innerSel, prefix)] = innerBlock[innerSel];
2397
+ }
2398
+ scoped[sel] = scopedInner;
2482
2399
  }
2483
- scoped[sel] = scopedInner;
2484
2400
  } else {
2485
2401
  scoped[_prefixSelector(sel, prefix)] = rules[sel];
2486
2402
  }