bitwrench 1.2.15 → 2.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/README.md +160 -158
  2. package/bin/bitwrench.js +3 -0
  3. package/dist/bitwrench-code-edit.cjs.js +639 -0
  4. package/dist/bitwrench-code-edit.es5.js +875 -0
  5. package/dist/bitwrench-code-edit.es5.min.js +15 -0
  6. package/dist/bitwrench-code-edit.esm.js +628 -0
  7. package/dist/bitwrench-code-edit.esm.min.js +15 -0
  8. package/dist/bitwrench-code-edit.umd.js +645 -0
  9. package/dist/bitwrench-code-edit.umd.min.js +15 -0
  10. package/dist/bitwrench.cjs.js +6983 -0
  11. package/dist/bitwrench.cjs.min.js +62 -0
  12. package/dist/bitwrench.css +5100 -0
  13. package/dist/bitwrench.es5.js +8446 -0
  14. package/dist/bitwrench.es5.min.js +31 -0
  15. package/dist/bitwrench.esm.js +6981 -0
  16. package/dist/bitwrench.esm.min.js +62 -0
  17. package/dist/bitwrench.umd.js +6989 -0
  18. package/dist/bitwrench.umd.min.js +62 -0
  19. package/dist/builds.json +127 -0
  20. package/dist/sri.json +18 -0
  21. package/package.json +86 -24
  22. package/readme.html +288 -0
  23. package/src/bitwrench-code-edit.js +627 -0
  24. package/src/bitwrench-color-utils.js +311 -0
  25. package/src/bitwrench-component-base.js +736 -0
  26. package/src/bitwrench-components-inline.js +374 -0
  27. package/src/bitwrench-components-v2.js +1879 -0
  28. package/src/bitwrench-components.js +610 -0
  29. package/src/bitwrench-styles.js +3240 -0
  30. package/src/bitwrench.js +3367 -0
  31. package/src/cli/convert.js +205 -0
  32. package/src/cli/index.js +122 -0
  33. package/src/cli/inject.js +55 -0
  34. package/src/cli/layout-default.js +142 -0
  35. package/src/generate-css.js +381 -0
  36. package/src/vendor/quikdown.js +654 -0
  37. package/src/version.js +16 -0
  38. package/.eslintrc.json +0 -27
  39. package/.github/workflows/codeql-analysis.yml +0 -72
  40. package/.travis.yml +0 -34
  41. package/bitwrench.css +0 -92
  42. package/bitwrench.js +0 -3348
  43. package/bitwrench.js_sri.txt +0 -1
  44. package/bitwrench.min.js +0 -1
  45. package/bitwrench.min.js_sri.txt +0 -1
  46. package/bitwrench_ESM.js +0 -3207
  47. package/dev/bitwrench-todo.md +0 -215
  48. package/dev/css-arrows.md +0 -23
  49. package/dev/docStringDev.js +0 -124
  50. package/dev/docStringParseDev.js +0 -171
  51. package/dev/figures.html +0 -37
  52. package/dev/html_gen.js +0 -349
  53. package/dev/htmld.md +0 -250
  54. package/dev/htmldev.html +0 -45
  55. package/dev/index-old.html +0 -87
  56. package/dev/misc-notes.md +0 -21
  57. package/dev/notes.md +0 -2
  58. package/dev/sizes.html +0 -49
  59. package/dev/universal-js-module.js +0 -37
  60. package/examples/example1.html +0 -78
  61. package/examples/example10.html +0 -84
  62. package/examples/example2.html +0 -44
  63. package/examples/example3.html +0 -50
  64. package/examples/example4.html +0 -22
  65. package/examples/example5.html +0 -82
  66. package/examples/example6.html +0 -128
  67. package/examples/example7.html +0 -91
  68. package/examples/example8.html +0 -27
  69. package/examples/example9.html +0 -102
  70. package/icon/bitwrench-dark-tall.png +0 -0
  71. package/icon/bitwrench-dark.png +0 -0
  72. package/icon/bitwrench-icon-lt-grey.png +0 -0
  73. package/icon/bitwrench-icon.vsd +0 -0
  74. package/icon/bitwrench-logo-dark.png +0 -0
  75. package/icon/bitwrench-logo-full.png +0 -0
  76. package/icon/bitwrench-logo-green.png +0 -0
  77. package/icon/bitwrench-logo-grey.png +0 -0
  78. package/icon/bitwrench-logo-white.png +0 -0
  79. package/icon/bitwrench-logos-colors.png +0 -0
  80. package/icon/bitwrench-thick-logo.png +0 -0
  81. package/icon/bitwrench-thick-teal/android-chrome-192x192.png +0 -0
  82. package/icon/bitwrench-thick-teal/android-chrome-512x512.png +0 -0
  83. package/icon/bitwrench-thick-teal/apple-touch-icon.png +0 -0
  84. package/icon/bitwrench-thick-teal/browserconfig.xml +0 -9
  85. package/icon/bitwrench-thick-teal/favicon-16x16.png +0 -0
  86. package/icon/bitwrench-thick-teal/favicon-32x32.png +0 -0
  87. package/icon/bitwrench-thick-teal/favicon.ico +0 -0
  88. package/icon/bitwrench-thick-teal/mstile-144x144.png +0 -0
  89. package/icon/bitwrench-thick-teal/mstile-150x150.png +0 -0
  90. package/icon/bitwrench-thick-teal/mstile-310x150.png +0 -0
  91. package/icon/bitwrench-thick-teal/mstile-310x310.png +0 -0
  92. package/icon/bitwrench-thick-teal/mstile-70x70.png +0 -0
  93. package/icon/bitwrench-thick-teal/site.webmanifest +0 -19
  94. package/icon/bitwrench-thick-teal.ico +0 -0
  95. package/icon/bitwrench-thick-teal.svg +0 -44
  96. package/icon/bitwrench-thick-teal.zip +0 -0
  97. package/icon/favicon-test.html +0 -20
  98. package/icon/logos-test.PNG +0 -0
  99. package/images/bitwrench-512x512.png +0 -0
  100. package/images/bitwrench-logo-med.png +0 -0
  101. package/images/bitwrench-thick-logo.png +0 -0
  102. package/images/bitwrench-thick-logo.svg +0 -64
  103. package/images/bitwrench-thick-teal.ico +0 -0
  104. package/images/favicon.ico +0 -0
  105. package/index.html +0 -256
  106. package/instr_tmp/bitwrench.js +0 -1350
  107. package/karma.conf.js +0 -140
  108. package/makefile +0 -21
  109. package/quick-docs.html +0 -206
  110. package/test/bitwrench_test.js +0 -1255
  111. package/test/karma-test.js +0 -1081
  112. package/tools/bw_deprecatedNames.js +0 -19
  113. package/tools/bwconsole.js +0 -20
  114. package/tools/createSimpleHTMLPage.js +0 -41
  115. package/tools/emitreadme.sh +0 -4
  116. package/tools/export-bw-default-css.js +0 -41
  117. package/tools/umd2ModuleHack.js +0 -32
  118. package/tools/update-bw-package.js +0 -36
  119. package/tools/updatereadme.js +0 -34
@@ -0,0 +1,3240 @@
1
+ /**
2
+ * Bitwrench v2 Default Styles
3
+ *
4
+ * CSS-in-JS style definitions providing a complete, Bootstrap-inspired
5
+ * design system. Styles are defined as nested JavaScript objects that
6
+ * bw.css() converts to CSS strings and bw.injectCSS() injects into the DOM.
7
+ *
8
+ * The module exports:
9
+ * - {@link defaultStyles} - All style categories as a structured object
10
+ * - {@link getAllStyles} - Merges all categories into a flat CSS rules object
11
+ * - {@link theme} - Design token configuration (colors, breakpoints, spacing, typography)
12
+ * - {@link generateThemedCSS} - Generate scoped themed CSS from a palette
13
+ * - {@link derivePalette} - Re-export from color-utils for convenience
14
+ *
15
+ * Style categories: root (CSS variables), reset, typography, grid, buttons,
16
+ * cards, forms, navigation, tables, alerts, badges, progress, tabs, listGroups,
17
+ * pagination, breadcrumb, hero, features, enhancedCards, sections, cta,
18
+ * utilities, responsive.
19
+ *
20
+ * @module bitwrench-styles
21
+ * @license BSD-2-Clause
22
+ * @author M A Chatterjee <deftio [at] deftio [dot] com>
23
+ */
24
+
25
+ import { derivePalette, deriveShades, adjustLightness, mixColor, textOnColor, hexToHsl, hslToHex } from './bitwrench-color-utils.js';
26
+
27
+ // Re-export for use by bitwrench.js
28
+ export { derivePalette };
29
+
30
+ // =========================================================================
31
+ // Layout presets
32
+ // =========================================================================
33
+
34
+ export var SPACING_PRESETS = {
35
+ compact: { btn: '0.3rem 0.8rem', card: '0.875rem 1rem', alert: '0.625rem 1rem', cell: '0.5rem 0.75rem', input: '0.375rem 0.7rem' },
36
+ normal: { btn: '0.5rem 1.125rem', card: '1.25rem 1.5rem', alert: '0.875rem 1.25rem', cell: '0.75rem 1rem', input: '0.5rem 0.875rem' },
37
+ spacious: { btn: '0.75rem 1.5rem', card: '1.75rem 2rem', alert: '1.125rem 1.5rem', cell: '1rem 1.25rem', input: '0.75rem 1.125rem' }
38
+ };
39
+
40
+ export var RADIUS_PRESETS = {
41
+ none: { btn: '0', card: '0', badge: '0', alert: '0', input: '0' },
42
+ sm: { btn: '4px', card: '4px', badge: '.25rem', alert: '4px', input: '4px' },
43
+ md: { btn: '6px', card: '8px', badge: '.375rem', alert: '8px', input: '6px' },
44
+ lg: { btn: '10px', card: '12px', badge: '.5rem', alert: '12px', input: '10px' },
45
+ pill: { btn: '50rem', card: '1rem', badge: '50rem', alert: '1rem', input: '50rem' }
46
+ };
47
+
48
+ /**
49
+ * Default palette config — matches existing hardcoded colors
50
+ */
51
+ export var DEFAULT_PALETTE_CONFIG = {
52
+ primary: '#006666',
53
+ secondary: '#6c757d',
54
+ tertiary: '#006666',
55
+ success: '#198754',
56
+ danger: '#dc3545',
57
+ warning: '#ffc107',
58
+ info: '#0dcaf0',
59
+ light: '#f8f9fa',
60
+ dark: '#212529'
61
+ };
62
+
63
+ /**
64
+ * Built-in theme presets — named color combinations
65
+ * Each preset provides primary, secondary, and tertiary seed colors.
66
+ */
67
+ export var THEME_PRESETS = {
68
+ teal: { primary: '#006666', secondary: '#6c757d', tertiary: '#006666', label: 'Teal', desc: 'The signature bitwrench palette — professional teal and neutral gray.' },
69
+ ocean: { primary: '#0077b6', secondary: '#90e0ef', tertiary: '#00b4d8', label: 'Ocean', desc: 'Cool blues and teals for a calm, professional look.' },
70
+ sunset: { primary: '#e76f51', secondary: '#264653', tertiary: '#e9c46a', label: 'Sunset', desc: 'Warm oranges and deep earth tones for a bold feel.' },
71
+ forest: { primary: '#2d6a4f', secondary: '#95d5b2', tertiary: '#52b788', label: 'Forest', desc: 'Natural greens for an organic, earthy vibe.' },
72
+ slate: { primary: '#343a40', secondary: '#adb5bd', tertiary: '#6c757d', label: 'Slate', desc: 'Elegant grays for a minimal, modern interface.' },
73
+ rose: { primary: '#e11d48', secondary: '#fda4af', tertiary: '#fb7185', label: 'Rose', desc: 'Vibrant pinks and reds for a bold, energetic design.' },
74
+ indigo: { primary: '#4f46e5', secondary: '#a5b4fc', tertiary: '#818cf8', label: 'Indigo', desc: 'Deep purples and soft lavenders for a creative palette.' },
75
+ amber: { primary: '#d97706', secondary: '#fbbf24', tertiary: '#f59e0b', label: 'Amber', desc: 'Warm golds and yellows for a sunny, welcoming feel.' },
76
+ emerald: { primary: '#059669', secondary: '#6ee7b7', tertiary: '#34d399', label: 'Emerald', desc: 'Bright greens and mints for a fresh, modern look.' },
77
+ nord: { primary: '#5e81ac', secondary: '#88c0d0', tertiary: '#81a1c1', label: 'Nord', desc: 'Muted arctic blues inspired by the Nord color scheme.' },
78
+ coral: { primary: '#ef6461', secondary: '#4a7c7e', tertiary: '#e8a87c', label: 'Coral', desc: 'Warm coral and teal for a balanced, approachable design.' },
79
+ midnight: { primary: '#1e3a5f', secondary: '#7c8db5', tertiary: '#3d5a80', label: 'Midnight', desc: 'Deep navy and steel blue for a sophisticated, authoritative feel.' }
80
+ };
81
+
82
+ /**
83
+ * Resolve layout config to spacing + radius objects
84
+ * @param {Object} config - { spacing, radius, fontSize }
85
+ * @returns {Object} { spacing, radius, fontSize }
86
+ */
87
+ export function resolveLayout(config) {
88
+ var sp = (config && config.spacing) || 'normal';
89
+ var rd = (config && config.radius) || 'md';
90
+ var fs = (config && config.fontSize) || 1.0;
91
+ return {
92
+ spacing: typeof sp === 'string' ? (SPACING_PRESETS[sp] || SPACING_PRESETS.normal) : sp,
93
+ radius: typeof rd === 'string' ? (RADIUS_PRESETS[rd] || RADIUS_PRESETS.md) : rd,
94
+ fontSize: fs
95
+ };
96
+ }
97
+
98
+ // =========================================================================
99
+ // Scoping helper
100
+ // =========================================================================
101
+
102
+ /**
103
+ * Prefix a CSS selector with a scope class name.
104
+ * @param {string} name - Scope class (e.g. 'ocean'). Empty = no scoping.
105
+ * @param {string} sel - CSS selector(s)
106
+ * @returns {string} Scoped selector
107
+ */
108
+ function scopeSelector(name, sel) {
109
+ if (!name) return sel;
110
+ if (sel.includes(',')) return sel.split(',').map(function(s) { return '.' + name + ' ' + s.trim(); }).join(', ');
111
+ return '.' + name + ' ' + sel;
112
+ }
113
+
114
+ // =========================================================================
115
+ // Themed CSS generators
116
+ // =========================================================================
117
+
118
+ function generateTypographyThemed(scope, palette) {
119
+ var rules = {};
120
+ rules[scopeSelector(scope, 'a')] = {
121
+ 'color': palette.primary.base,
122
+ 'text-decoration': 'none',
123
+ 'transition': 'color 0.15s'
124
+ };
125
+ rules[scopeSelector(scope, 'a:hover')] = {
126
+ 'color': palette.primary.hover,
127
+ 'text-decoration': 'underline'
128
+ };
129
+ return rules;
130
+ }
131
+
132
+ function generateButtons(scope, palette, layout) {
133
+ var rules = {};
134
+ var sp = layout.spacing;
135
+ var rd = layout.radius;
136
+
137
+ // Base button (only when scoped — unscoped uses defaultStyles)
138
+ rules[scopeSelector(scope, '.bw-btn')] = {
139
+ 'padding': sp.btn,
140
+ 'border-radius': rd.btn
141
+ };
142
+ rules[scopeSelector(scope, '.bw-btn:focus-visible')] = {
143
+ 'outline': '0',
144
+ 'box-shadow': '0 0 0 3px ' + palette.primary.focus
145
+ };
146
+
147
+ // Variants
148
+ var variants = ['primary', 'secondary', 'success', 'danger', 'warning', 'info', 'light', 'dark'];
149
+ variants.forEach(function(v) {
150
+ var p = palette[v];
151
+ rules[scopeSelector(scope, '.bw-btn-' + v)] = {
152
+ 'color': p.textOn,
153
+ 'background-color': p.base,
154
+ 'border-color': p.base
155
+ };
156
+ rules[scopeSelector(scope, '.bw-btn-' + v + ':hover')] = {
157
+ 'color': p.textOn,
158
+ 'background-color': p.hover,
159
+ 'border-color': p.active
160
+ };
161
+ // Outline
162
+ rules[scopeSelector(scope, '.bw-btn-outline-' + v)] = {
163
+ 'color': p.base,
164
+ 'border-color': p.base,
165
+ 'background-color': 'transparent'
166
+ };
167
+ rules[scopeSelector(scope, '.bw-btn-outline-' + v + ':hover')] = {
168
+ 'color': p.textOn,
169
+ 'background-color': p.base,
170
+ 'border-color': p.base
171
+ };
172
+ });
173
+
174
+ // Size variants (structural, reuse layout radius)
175
+ rules[scopeSelector(scope, '.bw-btn-lg')] = {
176
+ 'padding': '0.625rem 1.5rem',
177
+ 'font-size': '1rem',
178
+ 'border-radius': rd.btn === '50rem' ? '50rem' : (parseInt(rd.btn) + 2) + 'px'
179
+ };
180
+ rules[scopeSelector(scope, '.bw-btn-sm')] = {
181
+ 'padding': '0.25rem 0.75rem',
182
+ 'font-size': '0.8125rem',
183
+ 'border-radius': rd.btn === '50rem' ? '50rem' : (Math.max(parseInt(rd.btn) - 1, 0)) + 'px'
184
+ };
185
+
186
+ return rules;
187
+ }
188
+
189
+ function generateAlerts(scope, palette, layout) {
190
+ var rules = {};
191
+ var sp = layout.spacing;
192
+ var rd = layout.radius;
193
+
194
+ rules[scopeSelector(scope, '.bw-alert')] = {
195
+ 'padding': sp.alert,
196
+ 'border-radius': rd.alert
197
+ };
198
+
199
+ var variants = ['primary', 'secondary', 'success', 'danger', 'warning', 'info', 'light', 'dark'];
200
+ variants.forEach(function(v) {
201
+ var p = palette[v];
202
+ rules[scopeSelector(scope, '.bw-alert-' + v)] = {
203
+ 'color': p.darkText,
204
+ 'background-color': p.light,
205
+ 'border-color': p.border
206
+ };
207
+ rules[scopeSelector(scope, '.bw-alert-' + v + ' .alert-link')] = {
208
+ 'color': adjustLightness(p.darkText, -10)
209
+ };
210
+ });
211
+
212
+ return rules;
213
+ }
214
+
215
+ function generateBadges(scope, palette) {
216
+ var rules = {};
217
+ var variants = ['primary', 'secondary', 'success', 'danger', 'warning', 'info', 'light', 'dark'];
218
+ variants.forEach(function(v) {
219
+ var p = palette[v];
220
+ rules[scopeSelector(scope, '.bw-badge-' + v)] = {
221
+ 'color': p.textOn,
222
+ 'background-color': p.base
223
+ };
224
+ });
225
+ return rules;
226
+ }
227
+
228
+ function generateCards(scope, palette, layout) {
229
+ var rules = {};
230
+ var sp = layout.spacing;
231
+ var rd = layout.radius;
232
+
233
+ rules[scopeSelector(scope, '.bw-card')] = {
234
+ 'background-color': '#fff',
235
+ 'border': '1px solid ' + palette.light.border,
236
+ 'border-radius': rd.card,
237
+ 'box-shadow': '0 1px 3px rgba(0,0,0,.06), 0 1px 2px rgba(0,0,0,.04)'
238
+ };
239
+ rules[scopeSelector(scope, '.bw-card:hover')] = {
240
+ 'box-shadow': '0 4px 12px rgba(0,0,0,.1), 0 2px 4px rgba(0,0,0,.06)'
241
+ };
242
+ rules[scopeSelector(scope, '.bw-card-body')] = {
243
+ 'padding': sp.card
244
+ };
245
+ rules[scopeSelector(scope, '.bw-card-header')] = {
246
+ 'padding': sp.card.split(' ').map(function(v) { return (parseFloat(v) * 0.7).toFixed(3).replace(/\.?0+$/, '') + 'rem'; }).join(' '),
247
+ 'background-color': palette.light.light,
248
+ 'border-bottom': '1px solid ' + palette.light.border
249
+ };
250
+ rules[scopeSelector(scope, '.bw-card-footer')] = {
251
+ 'background-color': palette.light.light,
252
+ 'border-top': '1px solid ' + palette.light.border,
253
+ 'color': palette.secondary.base
254
+ };
255
+ rules[scopeSelector(scope, '.bw-card-title')] = {
256
+ 'color': palette.dark.base
257
+ };
258
+ rules[scopeSelector(scope, '.bw-card-subtitle')] = {
259
+ 'color': palette.secondary.base
260
+ };
261
+
262
+ // Card variant accent borders
263
+ var variants = ['primary', 'secondary', 'success', 'danger', 'warning', 'info', 'light', 'dark'];
264
+ variants.forEach(function(v) {
265
+ rules[scopeSelector(scope, '.bw-card-' + v)] = {
266
+ 'border-left': '4px solid ' + palette[v].base
267
+ };
268
+ });
269
+
270
+ return rules;
271
+ }
272
+
273
+ function generateForms(scope, palette, layout) {
274
+ var rules = {};
275
+ var sp = layout.spacing;
276
+ var rd = layout.radius;
277
+
278
+ rules[scopeSelector(scope, '.bw-form-control')] = {
279
+ 'padding': sp.input,
280
+ 'border-radius': rd.input,
281
+ 'color': palette.dark.base,
282
+ 'background-color': '#fff',
283
+ 'border-color': palette.light.border
284
+ };
285
+ rules[scopeSelector(scope, '.bw-form-control:focus')] = {
286
+ 'border-color': palette.primary.border,
287
+ 'box-shadow': '0 0 0 0.25rem ' + palette.primary.focus
288
+ };
289
+ rules[scopeSelector(scope, '.bw-form-control::placeholder')] = {
290
+ 'color': palette.secondary.base
291
+ };
292
+ rules[scopeSelector(scope, '.bw-form-label')] = {
293
+ 'color': palette.dark.base
294
+ };
295
+ rules[scopeSelector(scope, '.bw-form-text')] = {
296
+ 'color': palette.secondary.base
297
+ };
298
+ rules[scopeSelector(scope, '.bw-form-check-input:checked')] = {
299
+ 'background-color': palette.primary.base,
300
+ 'border-color': palette.primary.base
301
+ };
302
+ rules[scopeSelector(scope, '.bw-form-check-input:focus')] = {
303
+ 'box-shadow': '0 0 0 0.25rem ' + palette.primary.focus
304
+ };
305
+
306
+ return rules;
307
+ }
308
+
309
+ function generateNavigation(scope, palette) {
310
+ var rules = {};
311
+ rules[scopeSelector(scope, '.bw-navbar')] = {
312
+ 'background-color': palette.light.light,
313
+ 'border-bottom-color': palette.light.border
314
+ };
315
+ rules[scopeSelector(scope, '.bw-navbar-brand')] = {
316
+ 'color': palette.dark.base
317
+ };
318
+ rules[scopeSelector(scope, '.bw-navbar-nav .bw-nav-link')] = {
319
+ 'color': palette.secondary.base
320
+ };
321
+ rules[scopeSelector(scope, '.bw-navbar-nav .bw-nav-link:hover')] = {
322
+ 'color': palette.dark.base
323
+ };
324
+ rules[scopeSelector(scope, '.bw-navbar-nav .bw-nav-link.active')] = {
325
+ 'color': palette.primary.base,
326
+ 'background-color': palette.primary.focus
327
+ };
328
+ rules[scopeSelector(scope, '.bw-navbar-dark')] = {
329
+ 'background-color': palette.dark.base,
330
+ 'border-bottom-color': palette.dark.hover
331
+ };
332
+ rules[scopeSelector(scope, '.bw-navbar-dark .bw-navbar-brand')] = {
333
+ 'color': palette.light.base
334
+ };
335
+ rules[scopeSelector(scope, '.bw-navbar-dark .bw-nav-link')] = {
336
+ 'color': 'rgba(255,255,255,.65)'
337
+ };
338
+ rules[scopeSelector(scope, '.bw-navbar-dark .bw-nav-link:hover')] = {
339
+ 'color': '#fff'
340
+ };
341
+ rules[scopeSelector(scope, '.bw-navbar-dark .bw-nav-link.active')] = {
342
+ 'color': '#fff',
343
+ 'font-weight': '600'
344
+ };
345
+ rules[scopeSelector(scope, '.bw-nav-pills .bw-nav-link.active')] = {
346
+ 'color': palette.primary.textOn,
347
+ 'background-color': palette.primary.base
348
+ };
349
+ return rules;
350
+ }
351
+
352
+ function generateTables(scope, palette, layout) {
353
+ var rules = {};
354
+ var sp = layout.spacing;
355
+
356
+ rules[scopeSelector(scope, '.bw-table')] = {
357
+ 'color': palette.dark.base,
358
+ 'border-color': palette.light.border
359
+ };
360
+ rules[scopeSelector(scope, '.bw-table > :not(caption) > * > *')] = {
361
+ 'padding': sp.cell,
362
+ 'border-bottom-color': palette.light.border
363
+ };
364
+ rules[scopeSelector(scope, '.bw-table > thead > tr > *')] = {
365
+ 'color': palette.secondary.base,
366
+ 'border-bottom-color': palette.light.border,
367
+ 'background-color': palette.light.light
368
+ };
369
+ rules[scopeSelector(scope, '.bw-table-striped > tbody > tr:nth-of-type(odd) > *')] = {
370
+ 'background-color': 'rgba(0, 0, 0, 0.025)'
371
+ };
372
+ rules[scopeSelector(scope, '.bw-table-hover > tbody > tr:hover > *')] = {
373
+ 'background-color': palette.primary.focus
374
+ };
375
+ rules[scopeSelector(scope, '.bw-table-bordered')] = {
376
+ 'border-color': palette.light.border
377
+ };
378
+ rules[scopeSelector(scope, '.bw-table caption')] = {
379
+ 'color': palette.secondary.base
380
+ };
381
+
382
+ return rules;
383
+ }
384
+
385
+ function generateTabs(scope, palette) {
386
+ var rules = {};
387
+ rules[scopeSelector(scope, '.bw-nav-tabs')] = {
388
+ 'border-bottom-color': palette.light.border
389
+ };
390
+ rules[scopeSelector(scope, '.bw-nav-link')] = {
391
+ 'color': palette.secondary.base
392
+ };
393
+ rules[scopeSelector(scope, '.bw-nav-tabs .bw-nav-link:hover')] = {
394
+ 'color': palette.dark.base,
395
+ 'border-bottom-color': palette.light.border
396
+ };
397
+ rules[scopeSelector(scope, '.bw-nav-tabs .bw-nav-link.active')] = {
398
+ 'color': palette.primary.base,
399
+ 'border-bottom': '2px solid ' + palette.primary.base
400
+ };
401
+ return rules;
402
+ }
403
+
404
+ function generateListGroups(scope, palette, layout) {
405
+ var rules = {};
406
+ var sp = layout.spacing;
407
+
408
+ rules[scopeSelector(scope, '.bw-list-group-item')] = {
409
+ 'padding': sp.cell,
410
+ 'color': palette.dark.base,
411
+ 'background-color': '#fff',
412
+ 'border-color': palette.light.border
413
+ };
414
+ rules[scopeSelector(scope, 'a.bw-list-group-item:hover')] = {
415
+ 'background-color': palette.light.light,
416
+ 'color': palette.dark.hover
417
+ };
418
+ rules[scopeSelector(scope, '.bw-list-group-item.active')] = {
419
+ 'color': palette.primary.textOn,
420
+ 'background-color': palette.primary.base,
421
+ 'border-color': palette.primary.base
422
+ };
423
+ rules[scopeSelector(scope, '.bw-list-group-item.disabled')] = {
424
+ 'color': palette.secondary.base,
425
+ 'background-color': '#fff'
426
+ };
427
+
428
+ return rules;
429
+ }
430
+
431
+ function generatePagination(scope, palette) {
432
+ var rules = {};
433
+ rules[scopeSelector(scope, '.bw-page-link')] = {
434
+ 'color': palette.primary.base,
435
+ 'background-color': '#fff',
436
+ 'border-color': palette.light.border
437
+ };
438
+ rules[scopeSelector(scope, '.bw-page-link:hover')] = {
439
+ 'color': palette.primary.hover,
440
+ 'background-color': palette.light.light,
441
+ 'border-color': palette.light.border
442
+ };
443
+ rules[scopeSelector(scope, '.bw-page-link:focus')] = {
444
+ 'box-shadow': '0 0 0 0.25rem ' + palette.primary.focus
445
+ };
446
+ rules[scopeSelector(scope, '.bw-page-item.bw-active .bw-page-link')] = {
447
+ 'color': palette.primary.textOn,
448
+ 'background-color': palette.primary.base,
449
+ 'border-color': palette.primary.base
450
+ };
451
+ rules[scopeSelector(scope, '.bw-page-item.bw-disabled .bw-page-link')] = {
452
+ 'color': palette.secondary.base,
453
+ 'background-color': '#fff',
454
+ 'border-color': palette.light.border
455
+ };
456
+ return rules;
457
+ }
458
+
459
+ function generateProgress(scope, palette) {
460
+ var rules = {};
461
+ rules[scopeSelector(scope, '.bw-progress')] = {
462
+ 'background-color': palette.light.light,
463
+ 'box-shadow': 'inset 0 1px 2px rgba(0,0,0,.1)'
464
+ };
465
+ rules[scopeSelector(scope, '.bw-progress-bar')] = {
466
+ 'color': '#fff',
467
+ 'background-color': palette.primary.base,
468
+ 'box-shadow': 'inset 0 -1px 0 rgba(0,0,0,.15)'
469
+ };
470
+ // Variant progress bars
471
+ var variants = ['primary', 'secondary', 'success', 'danger', 'warning', 'info'];
472
+ variants.forEach(function(v) {
473
+ rules[scopeSelector(scope, '.bw-progress-bar-' + v)] = {
474
+ 'background-color': palette[v].base
475
+ };
476
+ });
477
+ return rules;
478
+ }
479
+
480
+ function generateHero(scope, palette) {
481
+ var rules = {};
482
+ rules[scopeSelector(scope, '.bw-hero-primary')] = {
483
+ 'background': 'linear-gradient(135deg, ' + palette.primary.base + ' 0%, ' + palette.primary.hover + ' 100%)',
484
+ 'color': palette.primary.textOn
485
+ };
486
+ rules[scopeSelector(scope, '.bw-hero-secondary')] = {
487
+ 'background': 'linear-gradient(135deg, ' + palette.secondary.base + ' 0%, ' + palette.secondary.hover + ' 100%)',
488
+ 'color': palette.secondary.textOn
489
+ };
490
+ rules[scopeSelector(scope, '.bw-hero-dark')] = {
491
+ 'background': 'linear-gradient(135deg, ' + palette.dark.base + ' 0%, ' + palette.dark.hover + ' 100%)',
492
+ 'color': palette.dark.textOn
493
+ };
494
+ return rules;
495
+ }
496
+
497
+ function generateUtilityColors(scope, palette) {
498
+ var rules = {};
499
+ var variants = ['primary', 'secondary', 'success', 'danger', 'warning', 'info', 'light', 'dark'];
500
+ variants.forEach(function(v) {
501
+ var p = palette[v];
502
+ rules[scopeSelector(scope, '.bw-text-' + v)] = { 'color': p.base };
503
+ rules[scopeSelector(scope, '.bw-bg-' + v)] = { 'background-color': p.base };
504
+ });
505
+ return rules;
506
+ }
507
+
508
+ function generateResetThemed(scope, palette) {
509
+ var rules = {};
510
+ rules[scopeSelector(scope, 'body')] = {
511
+ 'color': palette.dark.base,
512
+ 'background-color': '#f5f5f5'
513
+ };
514
+ return rules;
515
+ }
516
+
517
+ function generateBreadcrumbThemed(scope, palette) {
518
+ var rules = {};
519
+ rules[scopeSelector(scope, '.bw-breadcrumb-item + .bw-breadcrumb-item::before')] = {
520
+ 'color': palette.secondary.base
521
+ };
522
+ rules[scopeSelector(scope, '.bw-breadcrumb-item.active')] = {
523
+ 'color': palette.secondary.base
524
+ };
525
+ return rules;
526
+ }
527
+
528
+ function generateSpinnerThemed(scope, palette) {
529
+ var rules = {};
530
+ var variants = ['primary', 'secondary', 'success', 'danger', 'warning', 'info', 'light', 'dark'];
531
+ variants.forEach(function(v) {
532
+ rules[scopeSelector(scope, '.bw-spinner-border.bw-text-' + v)] = { 'color': palette[v].base };
533
+ rules[scopeSelector(scope, '.bw-spinner-grow.bw-text-' + v)] = { 'color': palette[v].base };
534
+ });
535
+ return rules;
536
+ }
537
+
538
+ function generateCloseButtonThemed(scope, palette) {
539
+ var rules = {};
540
+ rules[scopeSelector(scope, '.bw-close')] = {
541
+ 'color': palette.dark.base,
542
+ 'opacity': '0.5'
543
+ };
544
+ rules[scopeSelector(scope, '.bw-close:focus')] = {
545
+ 'box-shadow': '0 0 0 0.25rem ' + palette.primary.focus
546
+ };
547
+ return rules;
548
+ }
549
+
550
+ function generateSectionsThemed(scope, palette) {
551
+ var rules = {};
552
+ rules[scopeSelector(scope, '.bw-section-subtitle')] = {
553
+ 'color': palette.secondary.base
554
+ };
555
+ rules[scopeSelector(scope, '.bw-feature-description')] = {
556
+ 'color': palette.secondary.base
557
+ };
558
+ rules[scopeSelector(scope, '.bw-cta-description')] = {
559
+ 'color': palette.secondary.base
560
+ };
561
+ return rules;
562
+ }
563
+
564
+ /**
565
+ * Generate all themed CSS rules from a palette and layout.
566
+ * Returns a flat CSS rules object (selector → declarations).
567
+ *
568
+ * @param {string} scopeName - CSS scope class ('' for global)
569
+ * @param {Object} palette - From derivePalette()
570
+ * @param {Object} layout - From resolveLayout()
571
+ * @returns {Object} CSS rules object
572
+ */
573
+ export function generateThemedCSS(scopeName, palette, layout) {
574
+ return Object.assign({},
575
+ generateResetThemed(scopeName, palette),
576
+ generateTypographyThemed(scopeName, palette),
577
+ generateButtons(scopeName, palette, layout),
578
+ generateAlerts(scopeName, palette, layout),
579
+ generateBadges(scopeName, palette),
580
+ generateCards(scopeName, palette, layout),
581
+ generateForms(scopeName, palette, layout),
582
+ generateNavigation(scopeName, palette),
583
+ generateTables(scopeName, palette, layout),
584
+ generateTabs(scopeName, palette),
585
+ generateListGroups(scopeName, palette, layout),
586
+ generatePagination(scopeName, palette),
587
+ generateProgress(scopeName, palette),
588
+ generateHero(scopeName, palette),
589
+ generateBreadcrumbThemed(scopeName, palette),
590
+ generateSpinnerThemed(scopeName, palette),
591
+ generateCloseButtonThemed(scopeName, palette),
592
+ generateSectionsThemed(scopeName, palette),
593
+ generateUtilityColors(scopeName, palette)
594
+ );
595
+ }
596
+
597
+ // =========================================================================
598
+ // Static structural styles (unchanged, color-independent)
599
+ // =========================================================================
600
+
601
+ /**
602
+ * Complete default style definitions organized by component category
603
+ *
604
+ * Each property is a style category containing CSS rule objects.
605
+ * Pass individual categories to bw.css() or use getAllStyles() to
606
+ * get everything merged into a single flat object.
607
+ *
608
+ * @type {Object}
609
+ */
610
+ export const defaultStyles = {
611
+ /**
612
+ * CSS custom properties (variables) on :root
613
+ */
614
+ root: {
615
+ ':root': {
616
+ '--bw-blue': '#006666',
617
+ '--bw-indigo': '#6610f2',
618
+ '--bw-purple': '#6f42c1',
619
+ '--bw-pink': '#d63384',
620
+ '--bw-red': '#dc3545',
621
+ '--bw-orange': '#fd7e14',
622
+ '--bw-yellow': '#ffc107',
623
+ '--bw-green': '#198754',
624
+ '--bw-teal': '#20c997',
625
+ '--bw-cyan': '#0dcaf0',
626
+ '--bw-black': '#000',
627
+ '--bw-white': '#fff',
628
+ '--bw-gray': '#6c757d',
629
+ '--bw-gray-dark': '#343a40',
630
+ '--bw-gray-100': '#f8f9fa',
631
+ '--bw-gray-200': '#e9ecef',
632
+ '--bw-gray-300': '#dee2e6',
633
+ '--bw-gray-400': '#ced4da',
634
+ '--bw-gray-500': '#adb5bd',
635
+ '--bw-gray-600': '#6c757d',
636
+ '--bw-gray-700': '#495057',
637
+ '--bw-gray-800': '#343a40',
638
+ '--bw-gray-900': '#212529',
639
+ '--bw-primary': '#006666',
640
+ '--bw-secondary': '#6c757d',
641
+ '--bw-success': '#198754',
642
+ '--bw-info': '#0dcaf0',
643
+ '--bw-warning': '#ffc107',
644
+ '--bw-danger': '#dc3545',
645
+ '--bw-light': '#f8f9fa',
646
+ '--bw-dark': '#212529',
647
+ '--bw-font-sans-serif': 'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif',
648
+ '--bw-font-monospace': '"SF Mono", Monaco, "Cascadia Code", "Roboto Mono", Consolas, "Liberation Mono", "Courier New", monospace',
649
+ '--bw-body-font-family': 'var(--bw-font-sans-serif)',
650
+ '--bw-body-font-size': '1rem',
651
+ '--bw-body-font-weight': '400',
652
+ '--bw-body-line-height': '1.5',
653
+ '--bw-body-color': '#212529',
654
+ '--bw-body-bg': '#fff',
655
+ '--bw-border-width': '1px',
656
+ '--bw-border-style': 'solid',
657
+ '--bw-border-color': '#dee2e6',
658
+ '--bw-border-radius': '.375rem',
659
+ '--bw-border-radius-sm': '.25rem',
660
+ '--bw-border-radius-lg': '.5rem',
661
+ '--bw-border-radius-xl': '1rem',
662
+ '--bw-border-radius-2xl': '2rem',
663
+ '--bw-border-radius-pill': '50rem',
664
+ '--bw-box-shadow': '0 .5rem 1rem rgba(0, 0, 0, .15)',
665
+ '--bw-box-shadow-sm': '0 .125rem .25rem rgba(0, 0, 0, .075)',
666
+ '--bw-box-shadow-lg': '0 1rem 3rem rgba(0, 0, 0, .175)',
667
+ '--bw-box-shadow-inset': 'inset 0 1px 2px rgba(0, 0, 0, .075)'
668
+ }
669
+ },
670
+ /**
671
+ * CSS reset and base element styles
672
+ */
673
+ reset: {
674
+ '*': {
675
+ 'box-sizing': 'border-box',
676
+ 'margin': '0',
677
+ 'padding': '0'
678
+ },
679
+ 'html': {
680
+ 'font-size': '16px',
681
+ 'line-height': '1.5',
682
+ '-webkit-text-size-adjust': '100%',
683
+ '-webkit-font-smoothing': 'antialiased',
684
+ '-moz-osx-font-smoothing': 'grayscale'
685
+ },
686
+ 'body': {
687
+ 'font-family': 'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif',
688
+ 'font-size': '1rem',
689
+ 'font-weight': '400',
690
+ 'line-height': '1.6',
691
+ 'color': '#1a1a1a',
692
+ 'background-color': '#f5f5f5',
693
+ 'margin': '0',
694
+ 'padding': '0',
695
+ '-webkit-font-smoothing': 'antialiased',
696
+ '-moz-osx-font-smoothing': 'grayscale'
697
+ },
698
+ // Standard page layout
699
+ '.bw-page': {
700
+ 'min-height': '100vh',
701
+ 'display': 'flex',
702
+ 'flex-direction': 'column'
703
+ },
704
+ '.bw-page-content': {
705
+ 'flex': '1',
706
+ 'padding': '2rem 0'
707
+ },
708
+ 'main': {
709
+ 'display': 'block'
710
+ },
711
+ 'hr': {
712
+ 'box-sizing': 'content-box',
713
+ 'height': '0',
714
+ 'overflow': 'visible',
715
+ 'margin': '1rem 0',
716
+ 'color': 'inherit',
717
+ 'background-color': 'currentColor',
718
+ 'border': '0',
719
+ 'opacity': '.25'
720
+ },
721
+ 'hr:not([size])': {
722
+ 'height': '1px'
723
+ }
724
+ },
725
+
726
+ /**
727
+ * Typography styles for headings, paragraphs, links, and small text
728
+ */
729
+ typography: {
730
+ 'h1, h2, h3, h4, h5, h6': {
731
+ 'margin-top': '0',
732
+ 'margin-bottom': '.5rem',
733
+ 'font-weight': '600',
734
+ 'line-height': '1.25',
735
+ 'letter-spacing': '-0.01em',
736
+ 'color': '#1a1a1a'
737
+ },
738
+ 'h1': {
739
+ 'font-size': 'calc(1.375rem + 1.5vw)'
740
+ },
741
+ '@media (min-width: 1200px)': {
742
+ 'h1': { 'font-size': '2.5rem' }
743
+ },
744
+ 'h2': {
745
+ 'font-size': 'calc(1.325rem + .9vw)'
746
+ },
747
+ '@media (min-width: 1200px)': {
748
+ 'h2': { 'font-size': '2rem' }
749
+ },
750
+ 'h3': {
751
+ 'font-size': 'calc(1.3rem + .6vw)'
752
+ },
753
+ '@media (min-width: 1200px)': {
754
+ 'h3': { 'font-size': '1.75rem' }
755
+ },
756
+ 'h4': {
757
+ 'font-size': 'calc(1.275rem + .3vw)'
758
+ },
759
+ '@media (min-width: 1200px)': {
760
+ 'h4': { 'font-size': '1.5rem' }
761
+ },
762
+ 'h5': { 'font-size': '1.25rem' },
763
+ 'h6': { 'font-size': '1rem' },
764
+
765
+ 'p': {
766
+ 'margin-top': '0',
767
+ 'margin-bottom': '1rem'
768
+ },
769
+
770
+ 'small': {
771
+ 'font-size': '0.875rem'
772
+ },
773
+
774
+ 'a': {
775
+ 'color': '#006666',
776
+ 'text-decoration': 'none',
777
+ 'transition': 'color 0.15s'
778
+ },
779
+ 'a:hover': {
780
+ 'color': '#004d4d',
781
+ 'text-decoration': 'underline'
782
+ }
783
+ },
784
+
785
+ /**
786
+ * 12-column flexbox grid system
787
+ */
788
+ grid: {
789
+ '.bw-container': {
790
+ 'width': '100%',
791
+ 'padding-right': '0.75rem',
792
+ 'padding-left': '0.75rem',
793
+ 'margin-right': 'auto',
794
+ 'margin-left': 'auto'
795
+ },
796
+ '@media (min-width: 576px)': {
797
+ '.bw-container': { 'max-width': '540px' }
798
+ },
799
+ '@media (min-width: 768px)': {
800
+ '.bw-container': { 'max-width': '720px' }
801
+ },
802
+ '@media (min-width: 992px)': {
803
+ '.bw-container': { 'max-width': '960px' }
804
+ },
805
+ '@media (min-width: 1200px)': {
806
+ '.bw-container': { 'max-width': '1140px' }
807
+ },
808
+ '.bw-container-fluid': {
809
+ 'width': '100%',
810
+ 'padding-right': '15px',
811
+ 'padding-left': '15px',
812
+ 'margin-right': 'auto',
813
+ 'margin-left': 'auto'
814
+ },
815
+
816
+ '.bw-row': {
817
+ 'display': 'flex',
818
+ 'flex-wrap': 'wrap',
819
+ 'margin-right': 'calc(var(--bw-gutter-x, 0.75rem) * -0.5)',
820
+ 'margin-left': 'calc(var(--bw-gutter-x, 0.75rem) * -0.5)'
821
+ },
822
+
823
+ // Column system
824
+ '.col, [class*="col-"]': {
825
+ 'position': 'relative',
826
+ 'width': '100%',
827
+ 'padding-right': 'calc(var(--bw-gutter-x, 0.75rem) * 0.5)',
828
+ 'padding-left': 'calc(var(--bw-gutter-x, 0.75rem) * 0.5)'
829
+ },
830
+ '.bw-col': {
831
+ 'flex': '1 0 0%'
832
+ },
833
+ '.bw-col': {
834
+ 'flex-basis': '0',
835
+ 'flex-grow': '1',
836
+ 'max-width': '100%'
837
+ },
838
+
839
+ // Column sizes
840
+ '.bw-col-1': { 'flex': '0 0 8.333333%', 'max-width': '8.333333%' },
841
+ '.bw-col-2': { 'flex': '0 0 16.666667%', 'max-width': '16.666667%' },
842
+ '.bw-col-3': { 'flex': '0 0 25%', 'max-width': '25%' },
843
+ '.bw-col-4': { 'flex': '0 0 33.333333%', 'max-width': '33.333333%' },
844
+ '.bw-col-5': { 'flex': '0 0 41.666667%', 'max-width': '41.666667%' },
845
+ '.bw-col-6': { 'flex': '0 0 50%', 'max-width': '50%' },
846
+ '.bw-col-7': { 'flex': '0 0 58.333333%', 'max-width': '58.333333%' },
847
+ '.bw-col-8': { 'flex': '0 0 66.666667%', 'max-width': '66.666667%' },
848
+ '.bw-col-9': { 'flex': '0 0 75%', 'max-width': '75%' },
849
+ '.bw-col-10': { 'flex': '0 0 83.333333%', 'max-width': '83.333333%' },
850
+ '.bw-col-11': { 'flex': '0 0 91.666667%', 'max-width': '91.666667%' },
851
+ '.bw-col-12': { 'flex': '0 0 100%', 'max-width': '100%' }
852
+ },
853
+
854
+ /**
855
+ * Button styles - all variants, sizes, outlines, and states
856
+ */
857
+ buttons: {
858
+ '.bw-btn': {
859
+ 'display': 'inline-flex',
860
+ 'align-items': 'center',
861
+ 'justify-content': 'center',
862
+ 'font-weight': '500',
863
+ 'line-height': '1.5',
864
+ 'color': '#1a1a1a',
865
+ 'text-align': 'center',
866
+ 'text-decoration': 'none',
867
+ 'vertical-align': 'middle',
868
+ 'cursor': 'pointer',
869
+ 'user-select': 'none',
870
+ 'background-color': 'transparent',
871
+ 'border': '1px solid transparent',
872
+ 'padding': '0.5rem 1.125rem',
873
+ 'font-size': '0.875rem',
874
+ 'font-family': 'inherit',
875
+ 'border-radius': '6px',
876
+ 'transition': 'all 0.15s cubic-bezier(0.4, 0, 0.2, 1)',
877
+ 'box-shadow': '0 1px 2px rgba(0,0,0,.05)',
878
+ 'gap': '0.5rem'
879
+ },
880
+ '.bw-btn:hover': {
881
+ 'text-decoration': 'none',
882
+ 'transform': 'translateY(-1px)',
883
+ 'box-shadow': '0 4px 6px rgba(0,0,0,.07)'
884
+ },
885
+ '.bw-btn:active': {
886
+ 'transform': 'translateY(0)',
887
+ 'box-shadow': '0 1px 2px rgba(0,0,0,.05)'
888
+ },
889
+ '.bw-btn:focus-visible': {
890
+ 'outline': '0',
891
+ 'box-shadow': '0 0 0 3px rgba(0, 102, 102, 0.3)'
892
+ },
893
+ '.bw-btn:disabled': {
894
+ 'opacity': '0.5',
895
+ 'cursor': 'not-allowed',
896
+ 'pointer-events': 'none'
897
+ },
898
+
899
+ // Button variants
900
+ '.bw-btn-primary': {
901
+ 'color': '#fff',
902
+ 'background-color': '#006666',
903
+ 'border-color': '#006666'
904
+ },
905
+ '.bw-btn-primary:hover': {
906
+ 'color': '#fff',
907
+ 'background-color': '#005555',
908
+ 'border-color': '#004d4d'
909
+ },
910
+
911
+ '.bw-btn-secondary': {
912
+ 'color': '#fff',
913
+ 'background-color': '#6c757d',
914
+ 'border-color': '#6c757d'
915
+ },
916
+ '.bw-btn-secondary:hover': {
917
+ 'color': '#fff',
918
+ 'background-color': '#5c636a',
919
+ 'border-color': '#565e64'
920
+ },
921
+
922
+ '.bw-btn-success': {
923
+ 'color': '#fff',
924
+ 'background-color': '#198754',
925
+ 'border-color': '#198754'
926
+ },
927
+ '.bw-btn-success:hover': {
928
+ 'color': '#fff',
929
+ 'background-color': '#157347',
930
+ 'border-color': '#146c43'
931
+ },
932
+
933
+ '.bw-btn-danger': {
934
+ 'color': '#fff',
935
+ 'background-color': '#dc3545',
936
+ 'border-color': '#dc3545'
937
+ },
938
+ '.bw-btn-danger:hover': {
939
+ 'color': '#fff',
940
+ 'background-color': '#bb2d3b',
941
+ 'border-color': '#b02a37'
942
+ },
943
+
944
+ '.bw-btn-warning': {
945
+ 'color': '#000',
946
+ 'background-color': '#ffc107',
947
+ 'border-color': '#ffc107'
948
+ },
949
+ '.bw-btn-warning:hover': {
950
+ 'color': '#000',
951
+ 'background-color': '#ffca2c',
952
+ 'border-color': '#ffc720'
953
+ },
954
+
955
+ '.bw-btn-info': {
956
+ 'color': '#000',
957
+ 'background-color': '#0dcaf0',
958
+ 'border-color': '#0dcaf0'
959
+ },
960
+ '.bw-btn-info:hover': {
961
+ 'color': '#000',
962
+ 'background-color': '#31d2f2',
963
+ 'border-color': '#25cff2'
964
+ },
965
+
966
+ '.bw-btn-light': {
967
+ 'color': '#000',
968
+ 'background-color': '#f8f9fa',
969
+ 'border-color': '#f8f9fa'
970
+ },
971
+ '.bw-btn-light:hover': {
972
+ 'color': '#000',
973
+ 'background-color': '#f9fafb',
974
+ 'border-color': '#f9fafb'
975
+ },
976
+
977
+ '.bw-btn-dark': {
978
+ 'color': '#fff',
979
+ 'background-color': '#212529',
980
+ 'border-color': '#212529'
981
+ },
982
+ '.bw-btn-dark:hover': {
983
+ 'color': '#fff',
984
+ 'background-color': '#1c1f23',
985
+ 'border-color': '#1a1e21'
986
+ },
987
+
988
+ // Outline variants
989
+ '.bw-btn-outline-primary': {
990
+ 'color': '#006666',
991
+ 'border-color': '#006666',
992
+ 'background-color': 'transparent'
993
+ },
994
+ '.bw-btn-outline-primary:hover': {
995
+ 'color': '#fff',
996
+ 'background-color': '#006666',
997
+ 'border-color': '#006666'
998
+ },
999
+
1000
+ '.bw-btn-outline-secondary': {
1001
+ 'color': '#6c757d',
1002
+ 'border-color': '#6c757d',
1003
+ 'background-color': 'transparent'
1004
+ },
1005
+ '.bw-btn-outline-secondary:hover': {
1006
+ 'color': '#fff',
1007
+ 'background-color': '#6c757d',
1008
+ 'border-color': '#6c757d'
1009
+ },
1010
+
1011
+ '.bw-btn-outline-success': {
1012
+ 'color': '#198754',
1013
+ 'border-color': '#198754',
1014
+ 'background-color': 'transparent'
1015
+ },
1016
+ '.bw-btn-outline-success:hover': {
1017
+ 'color': '#fff',
1018
+ 'background-color': '#198754',
1019
+ 'border-color': '#198754'
1020
+ },
1021
+
1022
+ '.bw-btn-outline-danger': {
1023
+ 'color': '#dc3545',
1024
+ 'border-color': '#dc3545',
1025
+ 'background-color': 'transparent'
1026
+ },
1027
+ '.bw-btn-outline-danger:hover': {
1028
+ 'color': '#fff',
1029
+ 'background-color': '#dc3545',
1030
+ 'border-color': '#dc3545'
1031
+ },
1032
+
1033
+ '.bw-btn-outline-warning': {
1034
+ 'color': '#ffc107',
1035
+ 'border-color': '#ffc107',
1036
+ 'background-color': 'transparent'
1037
+ },
1038
+ '.bw-btn-outline-warning:hover': {
1039
+ 'color': '#000',
1040
+ 'background-color': '#ffc107',
1041
+ 'border-color': '#ffc107'
1042
+ },
1043
+
1044
+ '.bw-btn-outline-info': {
1045
+ 'color': '#0dcaf0',
1046
+ 'border-color': '#0dcaf0',
1047
+ 'background-color': 'transparent'
1048
+ },
1049
+ '.bw-btn-outline-info:hover': {
1050
+ 'color': '#000',
1051
+ 'background-color': '#0dcaf0',
1052
+ 'border-color': '#0dcaf0'
1053
+ },
1054
+
1055
+ '.bw-btn-outline-light': {
1056
+ 'color': '#f8f9fa',
1057
+ 'border-color': '#f8f9fa',
1058
+ 'background-color': 'transparent'
1059
+ },
1060
+ '.bw-btn-outline-light:hover': {
1061
+ 'color': '#000',
1062
+ 'background-color': '#f8f9fa',
1063
+ 'border-color': '#f8f9fa'
1064
+ },
1065
+
1066
+ '.bw-btn-outline-dark': {
1067
+ 'color': '#212529',
1068
+ 'border-color': '#212529',
1069
+ 'background-color': 'transparent'
1070
+ },
1071
+ '.bw-btn-outline-dark:hover': {
1072
+ 'color': '#fff',
1073
+ 'background-color': '#212529',
1074
+ 'border-color': '#212529'
1075
+ },
1076
+
1077
+ // Button sizes
1078
+ '.bw-btn-lg': {
1079
+ 'padding': '0.625rem 1.5rem',
1080
+ 'font-size': '1rem',
1081
+ 'border-radius': '8px'
1082
+ },
1083
+ '.bw-btn-sm': {
1084
+ 'padding': '0.25rem 0.75rem',
1085
+ 'font-size': '0.8125rem',
1086
+ 'border-radius': '5px'
1087
+ }
1088
+ },
1089
+
1090
+ /**
1091
+ * Card component styles
1092
+ */
1093
+ cards: {
1094
+ '.bw-card': {
1095
+ 'position': 'relative',
1096
+ 'display': 'flex',
1097
+ 'flex-direction': 'column',
1098
+ 'min-width': '0',
1099
+ 'height': '100%',
1100
+ 'word-wrap': 'break-word',
1101
+ 'background-color': '#fff',
1102
+ 'background-clip': 'border-box',
1103
+ 'border': '1px solid #e5e5e5',
1104
+ 'border-radius': '8px',
1105
+ 'box-shadow': '0 1px 3px rgba(0,0,0,.06), 0 1px 2px rgba(0,0,0,.04)',
1106
+ 'transition': 'box-shadow 0.2s cubic-bezier(0.4,0,0.2,1), transform 0.2s cubic-bezier(0.4,0,0.2,1)',
1107
+ 'margin-bottom': '1.5rem',
1108
+ 'overflow': 'hidden'
1109
+ },
1110
+ '.bw-card:hover': {
1111
+ 'box-shadow': '0 4px 12px rgba(0,0,0,.1), 0 2px 4px rgba(0,0,0,.06)',
1112
+ 'transform': 'translateY(-2px)'
1113
+ },
1114
+ '.bw-card-body': {
1115
+ 'flex': '1 1 auto',
1116
+ 'padding': '1.25rem 1.5rem'
1117
+ },
1118
+ '.bw-card-body > *:last-child': {
1119
+ 'margin-bottom': '0'
1120
+ },
1121
+ '.bw-card-title': {
1122
+ 'margin-bottom': '0.5rem',
1123
+ 'font-size': '1.125rem',
1124
+ 'font-weight': '600',
1125
+ 'line-height': '1.3',
1126
+ 'color': '#1a1a1a'
1127
+ },
1128
+ '.bw-card-text': {
1129
+ 'margin-bottom': '0',
1130
+ 'color': '#555',
1131
+ 'font-size': '0.9375rem',
1132
+ 'line-height': '1.6'
1133
+ },
1134
+ '.bw-card-header': {
1135
+ 'padding': '0.875rem 1.5rem',
1136
+ 'margin-bottom': '0',
1137
+ 'background-color': '#fafafa',
1138
+ 'border-bottom': '1px solid #e5e5e5',
1139
+ 'font-weight': '600',
1140
+ 'font-size': '0.875rem'
1141
+ },
1142
+ '.bw-card-footer': {
1143
+ 'padding': '0.75rem 1.5rem',
1144
+ 'background-color': '#fafafa',
1145
+ 'border-top': '1px solid #e5e5e5',
1146
+ 'font-size': '0.875rem',
1147
+ 'color': '#777'
1148
+ },
1149
+ '.bw-card-primary': { 'border-left': '4px solid #006666' },
1150
+ '.bw-card-secondary': { 'border-left': '4px solid #6c757d' },
1151
+ '.bw-card-success': { 'border-left': '4px solid #198754' },
1152
+ '.bw-card-danger': { 'border-left': '4px solid #dc3545' },
1153
+ '.bw-card-warning': { 'border-left': '4px solid #ffc107' },
1154
+ '.bw-card-info': { 'border-left': '4px solid #0dcaf0' },
1155
+ '.bw-card-light': { 'border-left': '4px solid #f8f9fa' },
1156
+ '.bw-card-dark': { 'border-left': '4px solid #212529' },
1157
+ },
1158
+
1159
+ /**
1160
+ * Form control styles
1161
+ */
1162
+ forms: {
1163
+ '.bw-form-control': {
1164
+ 'display': 'block',
1165
+ 'width': '100%',
1166
+ 'padding': '0.5rem 0.875rem',
1167
+ 'font-size': '0.9375rem',
1168
+ 'font-weight': '400',
1169
+ 'line-height': '1.5',
1170
+ 'color': '#1a1a1a',
1171
+ 'background-color': '#fff',
1172
+ 'background-clip': 'padding-box',
1173
+ 'border': '1px solid #ccc',
1174
+ 'appearance': 'none',
1175
+ 'border-radius': '6px',
1176
+ 'transition': 'border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out',
1177
+ 'font-family': 'inherit'
1178
+ },
1179
+ '.bw-form-control:focus': {
1180
+ 'color': '#1a1a1a',
1181
+ 'background-color': '#fff',
1182
+ 'border-color': '#80cccc',
1183
+ 'outline': '0',
1184
+ 'box-shadow': '0 0 0 0.25rem rgba(0, 102, 102, 0.25)'
1185
+ },
1186
+ '.bw-form-control::placeholder': {
1187
+ 'color': '#999',
1188
+ 'opacity': '1'
1189
+ },
1190
+ '.bw-form-label': {
1191
+ 'display': 'block',
1192
+ 'margin-bottom': '0.375rem',
1193
+ 'font-size': '0.875rem',
1194
+ 'font-weight': '600',
1195
+ 'color': '#333'
1196
+ },
1197
+ '.bw-form-group': {
1198
+ 'margin-bottom': '1.25rem'
1199
+ },
1200
+ '.bw-form-text': {
1201
+ 'margin-top': '0.25rem',
1202
+ 'font-size': '0.8125rem',
1203
+ 'color': '#777'
1204
+ },
1205
+ 'select.bw-form-control': {
1206
+ 'padding-right': '2.25rem',
1207
+ '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\")",
1208
+ 'background-repeat': 'no-repeat',
1209
+ 'background-position': 'right 0.75rem center',
1210
+ 'background-size': '16px 12px'
1211
+ },
1212
+ 'textarea.bw-form-control': {
1213
+ 'min-height': '5rem',
1214
+ 'resize': 'vertical'
1215
+ }
1216
+ },
1217
+
1218
+ /**
1219
+ * Navbar and navigation link styles
1220
+ */
1221
+ navigation: {
1222
+ '.bw-navbar': {
1223
+ 'position': 'relative',
1224
+ 'display': 'flex',
1225
+ 'flex-wrap': 'wrap',
1226
+ 'align-items': 'center',
1227
+ 'justify-content': 'space-between',
1228
+ 'padding': '0.5rem 1.5rem',
1229
+ 'background-color': '#fafafa',
1230
+ 'border-bottom': '1px solid #e5e5e5'
1231
+ },
1232
+ '.bw-navbar > .container': {
1233
+ 'display': 'flex',
1234
+ 'flex-wrap': 'wrap',
1235
+ 'align-items': 'center',
1236
+ 'justify-content': 'space-between'
1237
+ },
1238
+ '.bw-navbar-dark': {
1239
+ 'background-color': '#1a1a1a',
1240
+ 'border-bottom-color': '#333'
1241
+ },
1242
+ '.bw-navbar-dark .bw-navbar-brand': {
1243
+ 'color': '#fff'
1244
+ },
1245
+ '.bw-navbar-dark .bw-nav-link': {
1246
+ 'color': 'rgba(255,255,255,.65)'
1247
+ },
1248
+ '.bw-navbar-dark .bw-nav-link:hover': {
1249
+ 'color': '#fff'
1250
+ },
1251
+ '.bw-navbar-dark .bw-nav-link.active': {
1252
+ 'color': '#fff',
1253
+ 'font-weight': '600'
1254
+ },
1255
+ '.bw-navbar-brand': {
1256
+ 'display': 'inline-flex',
1257
+ 'align-items': 'center',
1258
+ 'gap': '0.5rem',
1259
+ 'padding-top': '0.25rem',
1260
+ 'padding-bottom': '0.25rem',
1261
+ 'margin-right': '1.5rem',
1262
+ 'font-size': '1.125rem',
1263
+ 'font-weight': '600',
1264
+ 'line-height': 'inherit',
1265
+ 'white-space': 'nowrap',
1266
+ 'text-decoration': 'none',
1267
+ 'color': '#1a1a1a'
1268
+ },
1269
+ '.bw-navbar-nav': {
1270
+ 'display': 'flex',
1271
+ 'flex-direction': 'row',
1272
+ 'padding-left': '0',
1273
+ 'margin-bottom': '0',
1274
+ 'list-style': 'none',
1275
+ 'gap': '0.25rem'
1276
+ },
1277
+ '.bw-navbar-nav .bw-nav-link': {
1278
+ 'display': 'block',
1279
+ 'padding': '0.5rem 0.875rem',
1280
+ 'color': '#555',
1281
+ 'text-decoration': 'none',
1282
+ 'font-size': '0.875rem',
1283
+ 'font-weight': '500',
1284
+ 'border-radius': '6px',
1285
+ 'transition': 'color 0.15s, background-color 0.15s'
1286
+ },
1287
+ '.bw-navbar-nav .bw-nav-link:hover': {
1288
+ 'color': '#1a1a1a',
1289
+ 'background-color': 'rgba(0,0,0,.04)'
1290
+ },
1291
+ '.bw-navbar-nav .bw-nav-link.active': {
1292
+ 'color': '#006666',
1293
+ 'font-weight': '600',
1294
+ 'background-color': 'rgba(0, 102, 102, 0.06)'
1295
+ }
1296
+ },
1297
+
1298
+ /**
1299
+ * Table styles with striped and hover variants
1300
+ */
1301
+ tables: {
1302
+ '.bw-table': {
1303
+ 'width': '100%',
1304
+ 'margin-bottom': '1.5rem',
1305
+ 'color': '#1a1a1a',
1306
+ 'vertical-align': 'top',
1307
+ 'border-color': '#e0e0e0',
1308
+ 'border-collapse': 'collapse',
1309
+ 'font-size': '0.9375rem',
1310
+ 'line-height': '1.5'
1311
+ },
1312
+ '.bw-table > :not(caption) > * > *': {
1313
+ 'padding': '0.75rem 1rem',
1314
+ 'background-color': 'transparent',
1315
+ 'border-bottom': '1px solid #e0e0e0'
1316
+ },
1317
+ '.bw-table > tbody': {
1318
+ 'vertical-align': 'inherit'
1319
+ },
1320
+ '.bw-table > thead': {
1321
+ 'vertical-align': 'bottom'
1322
+ },
1323
+ '.bw-table > thead > tr > *': {
1324
+ 'padding': '0.625rem 1rem',
1325
+ 'font-size': '0.8125rem',
1326
+ 'font-weight': '600',
1327
+ 'text-transform': 'uppercase',
1328
+ 'letter-spacing': '0.04em',
1329
+ 'color': '#555',
1330
+ 'border-bottom': '2px solid #ccc',
1331
+ 'background-color': '#f8f8f8'
1332
+ },
1333
+ '.bw-table-striped > tbody > tr:nth-of-type(odd) > *': {
1334
+ 'background-color': 'rgba(0, 0, 0, 0.025)'
1335
+ },
1336
+ '.bw-table-hover > tbody > tr:hover > *': {
1337
+ 'background-color': 'rgba(0, 102, 102, 0.05)'
1338
+ },
1339
+ '.bw-table-bordered': {
1340
+ 'border': '1px solid #e0e0e0'
1341
+ },
1342
+ '.bw-table-bordered > :not(caption) > * > *': {
1343
+ 'border': '1px solid #e0e0e0'
1344
+ },
1345
+ '.bw-table caption': {
1346
+ 'padding': '0.5rem 1rem',
1347
+ 'font-size': '0.875rem',
1348
+ 'color': '#777',
1349
+ 'caption-side': 'bottom'
1350
+ }
1351
+ },
1352
+
1353
+ /**
1354
+ * Alert/notification styles for all color variants
1355
+ */
1356
+ alerts: {
1357
+ '.bw-alert': {
1358
+ 'position': 'relative',
1359
+ 'padding': '0.875rem 1.25rem',
1360
+ 'margin-bottom': '1rem',
1361
+ 'border': '1px solid transparent',
1362
+ 'border-radius': '8px',
1363
+ 'font-size': '0.9375rem',
1364
+ 'line-height': '1.6'
1365
+ },
1366
+ '.bw-alert-heading, .alert-heading': {
1367
+ 'color': 'inherit'
1368
+ },
1369
+ '.bw-alert-link, .alert-link': {
1370
+ 'font-weight': '700'
1371
+ },
1372
+ '.bw-alert-dismissible': {
1373
+ 'padding-right': '3rem'
1374
+ },
1375
+ '.bw-alert-dismissible .btn-close': {
1376
+ 'position': 'absolute',
1377
+ 'top': '0',
1378
+ 'right': '0',
1379
+ 'z-index': '2',
1380
+ 'padding': '1.25rem 1rem'
1381
+ },
1382
+ '.bw-alert-primary': {
1383
+ 'color': '#004d4d',
1384
+ 'background-color': '#e0f2f1',
1385
+ 'border-color': '#b2dfdb'
1386
+ },
1387
+ '.bw-alert-primary .alert-link': {
1388
+ 'color': '#003d3d'
1389
+ },
1390
+ '.bw-alert-secondary': {
1391
+ 'color': '#41464b',
1392
+ 'background-color': '#e2e3e5',
1393
+ 'border-color': '#d3d6d8'
1394
+ },
1395
+ '.bw-alert-secondary .alert-link': {
1396
+ 'color': '#34383c'
1397
+ },
1398
+ '.bw-alert-success': {
1399
+ 'color': '#0f5132',
1400
+ 'background-color': '#d1e7dd',
1401
+ 'border-color': '#badbcc'
1402
+ },
1403
+ '.bw-alert-success .alert-link': {
1404
+ 'color': '#0c4128'
1405
+ },
1406
+ '.bw-alert-info': {
1407
+ 'color': '#055160',
1408
+ 'background-color': '#cff4fc',
1409
+ 'border-color': '#b6effb'
1410
+ },
1411
+ '.bw-alert-info .alert-link': {
1412
+ 'color': '#04414d'
1413
+ },
1414
+ '.bw-alert-warning': {
1415
+ 'color': '#664d03',
1416
+ 'background-color': '#fff3cd',
1417
+ 'border-color': '#ffecb5'
1418
+ },
1419
+ '.bw-alert-warning .alert-link': {
1420
+ 'color': '#523e02'
1421
+ },
1422
+ '.bw-alert-danger': {
1423
+ 'color': '#842029',
1424
+ 'background-color': '#f8d7da',
1425
+ 'border-color': '#f5c2c7'
1426
+ },
1427
+ '.bw-alert-danger .alert-link': {
1428
+ 'color': '#6a1a21'
1429
+ },
1430
+ '.bw-alert-light': {
1431
+ 'color': '#636464',
1432
+ 'background-color': '#fefefe',
1433
+ 'border-color': '#fdfdfe'
1434
+ },
1435
+ '.bw-alert-light .alert-link': {
1436
+ 'color': '#4f5050'
1437
+ },
1438
+ '.bw-alert-dark': {
1439
+ 'color': '#141619',
1440
+ 'background-color': '#d3d3d4',
1441
+ 'border-color': '#bcbebf'
1442
+ },
1443
+ '.bw-alert-dark .alert-link': {
1444
+ 'color': '#101214'
1445
+ }
1446
+ },
1447
+
1448
+ /**
1449
+ * Inline badge/label styles
1450
+ */
1451
+ badges: {
1452
+ '.bw-badge': {
1453
+ 'display': 'inline-block',
1454
+ 'padding': '.35em .65em',
1455
+ 'font-size': '.75em',
1456
+ 'font-weight': '700',
1457
+ 'line-height': '1',
1458
+ 'color': '#fff',
1459
+ 'text-align': 'center',
1460
+ 'white-space': 'nowrap',
1461
+ 'vertical-align': 'baseline',
1462
+ 'border-radius': '.375rem'
1463
+ },
1464
+ '.bw-badge:empty': {
1465
+ 'display': 'none'
1466
+ },
1467
+ '.bw-badge-pill': {
1468
+ 'border-radius': '50rem'
1469
+ },
1470
+ '.btn .badge': {
1471
+ 'position': 'relative',
1472
+ 'top': '-1px'
1473
+ },
1474
+ '.bw-badge-primary': {
1475
+ 'color': '#fff',
1476
+ 'background-color': '#006666'
1477
+ },
1478
+ '.bw-badge-secondary': {
1479
+ 'color': '#fff',
1480
+ 'background-color': '#6c757d'
1481
+ },
1482
+ '.bw-badge-success': {
1483
+ 'color': '#fff',
1484
+ 'background-color': '#198754'
1485
+ },
1486
+ '.bw-badge-info': {
1487
+ 'color': '#000',
1488
+ 'background-color': '#0dcaf0'
1489
+ },
1490
+ '.bw-badge-warning': {
1491
+ 'color': '#000',
1492
+ 'background-color': '#ffc107'
1493
+ },
1494
+ '.bw-badge-danger': {
1495
+ 'color': '#fff',
1496
+ 'background-color': '#dc3545'
1497
+ },
1498
+ '.bw-badge-light': {
1499
+ 'color': '#000',
1500
+ 'background-color': '#f8f9fa'
1501
+ },
1502
+ '.bw-badge-dark': {
1503
+ 'color': '#fff',
1504
+ 'background-color': '#212529'
1505
+ }
1506
+ },
1507
+
1508
+ /**
1509
+ * Progress bar styles
1510
+ */
1511
+ progress: {
1512
+ '.bw-progress': {
1513
+ 'display': 'flex',
1514
+ 'height': '1.25rem',
1515
+ 'overflow': 'hidden',
1516
+ 'font-size': '.875rem',
1517
+ 'background-color': '#e9ecef',
1518
+ 'border-radius': '.5rem',
1519
+ 'box-shadow': 'inset 0 1px 2px rgba(0,0,0,.1)'
1520
+ },
1521
+ '.bw-progress-bar': {
1522
+ 'display': 'flex',
1523
+ 'flex-direction': 'column',
1524
+ 'justify-content': 'center',
1525
+ 'overflow': 'hidden',
1526
+ 'color': '#fff',
1527
+ 'text-align': 'center',
1528
+ 'white-space': 'nowrap',
1529
+ 'background-color': '#006666',
1530
+ 'transition': 'width .6s ease',
1531
+ 'box-shadow': 'inset 0 -1px 0 rgba(0,0,0,.15)',
1532
+ 'font-weight': '600'
1533
+ },
1534
+ '.bw-progress-bar-striped': {
1535
+ '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)',
1536
+ 'background-size': '1rem 1rem'
1537
+ },
1538
+ '.bw-progress-bar-animated': {
1539
+ 'animation': 'progress-bar-stripes 1s linear infinite'
1540
+ },
1541
+ '@keyframes progress-bar-stripes': {
1542
+ '0%': { 'background-position-x': '1rem' }
1543
+ },
1544
+ '.bw-progress-bar-primary': { 'background-color': '#006666' },
1545
+ '.bw-progress-bar-secondary': { 'background-color': '#6c757d' },
1546
+ '.bw-progress-bar-success': { 'background-color': '#198754' },
1547
+ '.bw-progress-bar-danger': { 'background-color': '#dc3545' },
1548
+ '.bw-progress-bar-warning': { 'background-color': '#ffc107' },
1549
+ '.bw-progress-bar-info': { 'background-color': '#0dcaf0' }
1550
+ },
1551
+
1552
+ /**
1553
+ * Tab navigation styles
1554
+ */
1555
+ tabs: {
1556
+ '.bw-nav': {
1557
+ 'display': 'flex',
1558
+ 'flex-wrap': 'wrap',
1559
+ 'padding-left': '0',
1560
+ 'margin-bottom': '0',
1561
+ 'list-style': 'none',
1562
+ 'gap': '0'
1563
+ },
1564
+ '.bw-nav-tabs': {
1565
+ 'border-bottom': '2px solid #e5e5e5'
1566
+ },
1567
+ '.bw-nav-pills .bw-nav-link': {
1568
+ 'border-radius': '6px'
1569
+ },
1570
+ '.bw-nav-pills .bw-nav-link.active': {
1571
+ 'color': '#fff',
1572
+ 'background-color': '#006666'
1573
+ },
1574
+ '.bw-nav-vertical': {
1575
+ 'flex-direction': 'column'
1576
+ },
1577
+ '.bw-nav-item': {
1578
+ 'display': 'block'
1579
+ },
1580
+ '.bw-nav-tabs .bw-nav-item': {
1581
+ 'margin-bottom': '-2px'
1582
+ },
1583
+ '.bw-nav-link': {
1584
+ 'display': 'block',
1585
+ 'padding': '0.625rem 1rem',
1586
+ 'font-size': '0.875rem',
1587
+ 'font-weight': '500',
1588
+ 'color': '#777',
1589
+ 'text-decoration': 'none',
1590
+ 'cursor': 'pointer',
1591
+ 'border': 'none',
1592
+ 'background': 'transparent',
1593
+ 'transition': 'color 0.15s, border-color 0.15s',
1594
+ 'font-family': 'inherit'
1595
+ },
1596
+ '.bw-nav-tabs .bw-nav-link': {
1597
+ 'border': 'none',
1598
+ 'border-bottom': '2px solid transparent',
1599
+ 'border-radius': '0',
1600
+ 'background-color': 'transparent'
1601
+ },
1602
+ '.bw-nav-tabs .bw-nav-link:hover': {
1603
+ 'color': '#1a1a1a',
1604
+ 'border-bottom-color': '#ccc'
1605
+ },
1606
+ '.bw-nav-tabs .bw-nav-link.active': {
1607
+ 'color': '#006666',
1608
+ 'background-color': 'transparent',
1609
+ 'border-bottom': '2px solid #006666',
1610
+ 'font-weight': '600'
1611
+ },
1612
+ '.bw-tab-content': {
1613
+ 'padding': '1.25rem 0'
1614
+ },
1615
+ '.bw-tab-pane': {
1616
+ 'display': 'none'
1617
+ },
1618
+ '.bw-tab-pane.active': {
1619
+ 'display': 'block'
1620
+ }
1621
+ },
1622
+
1623
+ /**
1624
+ * List group styles
1625
+ */
1626
+ listGroups: {
1627
+ '.bw-list-group': {
1628
+ 'display': 'flex',
1629
+ 'flex-direction': 'column',
1630
+ 'padding-left': '0',
1631
+ 'margin-bottom': '0',
1632
+ 'border-radius': '0.375rem'
1633
+ },
1634
+ '.bw-list-group-item': {
1635
+ 'position': 'relative',
1636
+ 'display': 'block',
1637
+ 'padding': '0.75rem 1.25rem',
1638
+ 'color': '#1a1a1a',
1639
+ 'text-decoration': 'none',
1640
+ 'background-color': '#fff',
1641
+ 'border': '1px solid #e5e5e5',
1642
+ 'font-size': '0.9375rem'
1643
+ },
1644
+ '.bw-list-group-item:first-child': {
1645
+ 'border-top-left-radius': 'inherit',
1646
+ 'border-top-right-radius': 'inherit'
1647
+ },
1648
+ '.bw-list-group-item:last-child': {
1649
+ 'border-bottom-right-radius': 'inherit',
1650
+ 'border-bottom-left-radius': 'inherit'
1651
+ },
1652
+ '.bw-list-group-item + .bw-list-group-item': {
1653
+ 'border-top-width': '0'
1654
+ },
1655
+ '.bw-list-group-item.active': {
1656
+ 'z-index': '2',
1657
+ 'color': '#fff',
1658
+ 'background-color': '#006666',
1659
+ 'border-color': '#006666'
1660
+ },
1661
+ '.bw-list-group-item.disabled': {
1662
+ 'color': '#6c757d',
1663
+ 'pointer-events': 'none',
1664
+ 'background-color': '#fff'
1665
+ },
1666
+ 'a.bw-list-group-item': {
1667
+ 'cursor': 'pointer'
1668
+ },
1669
+ 'a.bw-list-group-item:hover': {
1670
+ 'z-index': '1',
1671
+ 'color': '#495057',
1672
+ 'text-decoration': 'none',
1673
+ 'background-color': '#f8f9fa'
1674
+ },
1675
+ '.bw-list-group-flush': {
1676
+ 'border-radius': '0'
1677
+ },
1678
+ '.bw-list-group-flush > .bw-list-group-item': {
1679
+ 'border-width': '0 0 1px',
1680
+ 'border-radius': '0'
1681
+ },
1682
+ '.bw-list-group-flush > .bw-list-group-item:last-child': {
1683
+ 'border-bottom-width': '0'
1684
+ }
1685
+ },
1686
+
1687
+ /**
1688
+ * Pagination control styles
1689
+ */
1690
+ pagination: {
1691
+ '.bw-pagination': {
1692
+ 'display': 'flex',
1693
+ 'padding-left': '0',
1694
+ 'list-style': 'none',
1695
+ 'margin-bottom': '0'
1696
+ },
1697
+ '.bw-page-item': {
1698
+ 'display': 'list-item',
1699
+ 'list-style': 'none'
1700
+ },
1701
+ '.bw-page-link': {
1702
+ 'position': 'relative',
1703
+ 'display': 'block',
1704
+ 'padding': '0.375rem 0.75rem',
1705
+ 'margin-left': '-1px',
1706
+ 'line-height': '1.25',
1707
+ 'color': '#006666',
1708
+ 'text-decoration': 'none',
1709
+ 'background-color': '#fff',
1710
+ 'border': '1px solid #dee2e6',
1711
+ 'transition': 'color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out'
1712
+ },
1713
+ '.bw-page-link:hover': {
1714
+ 'z-index': '2',
1715
+ 'color': '#004d4d',
1716
+ 'background-color': '#e9ecef',
1717
+ 'border-color': '#dee2e6'
1718
+ },
1719
+ '.bw-page-link:focus': {
1720
+ 'z-index': '3',
1721
+ 'color': '#004d4d',
1722
+ 'background-color': '#e9ecef',
1723
+ 'outline': '0',
1724
+ 'box-shadow': '0 0 0 0.25rem rgba(0, 102, 102, 0.25)'
1725
+ },
1726
+ '.bw-page-item:first-child .bw-page-link': {
1727
+ 'margin-left': '0',
1728
+ 'border-top-left-radius': '0.375rem',
1729
+ 'border-bottom-left-radius': '0.375rem'
1730
+ },
1731
+ '.bw-page-item:last-child .bw-page-link': {
1732
+ 'border-top-right-radius': '0.375rem',
1733
+ 'border-bottom-right-radius': '0.375rem'
1734
+ },
1735
+ '.bw-page-item.bw-active .bw-page-link': {
1736
+ 'z-index': '3',
1737
+ 'color': '#fff',
1738
+ 'background-color': '#006666',
1739
+ 'border-color': '#006666'
1740
+ },
1741
+ '.bw-page-item.bw-disabled .bw-page-link': {
1742
+ 'color': '#6c757d',
1743
+ 'pointer-events': 'none',
1744
+ 'background-color': '#fff',
1745
+ 'border-color': '#dee2e6'
1746
+ }
1747
+ },
1748
+
1749
+ /**
1750
+ * Breadcrumb navigation styles
1751
+ */
1752
+ breadcrumb: {
1753
+ '.bw-breadcrumb': {
1754
+ 'display': 'flex',
1755
+ 'flex-wrap': 'wrap',
1756
+ 'padding': '0 0',
1757
+ 'margin-bottom': '1rem',
1758
+ 'list-style': 'none',
1759
+ 'background-color': 'transparent'
1760
+ },
1761
+ '.bw-breadcrumb-item': {
1762
+ 'display': 'flex'
1763
+ },
1764
+ '.bw-breadcrumb-item + .bw-breadcrumb-item': {
1765
+ 'padding-left': '0.5rem'
1766
+ },
1767
+ '.bw-breadcrumb-item + .bw-breadcrumb-item::before': {
1768
+ 'float': 'left',
1769
+ 'padding-right': '0.5rem',
1770
+ 'color': '#6c757d',
1771
+ 'content': '"/"'
1772
+ },
1773
+ '.bw-breadcrumb-item.active': {
1774
+ 'color': '#6c757d'
1775
+ }
1776
+ },
1777
+
1778
+ /**
1779
+ * Hero section styles
1780
+ */
1781
+ hero: {
1782
+ '.bw-hero': {
1783
+ 'position': 'relative',
1784
+ 'overflow': 'hidden'
1785
+ },
1786
+ '.bw-hero-primary': {
1787
+ 'background': 'linear-gradient(135deg, #006666 0%, #004d4d 100%)',
1788
+ 'color': '#fff'
1789
+ },
1790
+ '.bw-hero-secondary': {
1791
+ 'background': 'linear-gradient(135deg, #6c757d 0%, #5a6268 100%)',
1792
+ 'color': '#fff'
1793
+ },
1794
+ '.bw-hero-light': {
1795
+ 'background': '#f8f9fa',
1796
+ 'color': '#212529'
1797
+ },
1798
+ '.bw-hero-dark': {
1799
+ 'background': 'linear-gradient(135deg, #212529 0%, #16181b 100%)',
1800
+ 'color': '#fff'
1801
+ },
1802
+ '.bw-hero-overlay': {
1803
+ 'position': 'absolute',
1804
+ 'top': '0',
1805
+ 'left': '0',
1806
+ 'right': '0',
1807
+ 'bottom': '0',
1808
+ 'background': 'rgba(0,0,0,0.5)',
1809
+ 'z-index': '1'
1810
+ },
1811
+ '.bw-hero-content': {
1812
+ 'position': 'relative',
1813
+ 'z-index': '2'
1814
+ },
1815
+ '.bw-hero-title': {
1816
+ 'font-weight': '300',
1817
+ 'letter-spacing': '-0.05rem'
1818
+ },
1819
+ '.bw-display-4': {
1820
+ 'font-size': 'calc(1.475rem + 2.7vw)',
1821
+ 'font-weight': '300',
1822
+ 'line-height': '1.2'
1823
+ },
1824
+ '@media (min-width: 1200px)': {
1825
+ '.bw-display-4': { 'font-size': '3.5rem' }
1826
+ },
1827
+ '.bw-lead': {
1828
+ 'font-size': '1.25rem',
1829
+ 'font-weight': '300'
1830
+ },
1831
+ '.bw-hero-actions': {
1832
+ 'display': 'flex',
1833
+ 'gap': '1rem',
1834
+ 'justify-content': 'center',
1835
+ 'flex-wrap': 'wrap'
1836
+ },
1837
+ '.bw-py-3': { 'padding-top': '1rem !important', 'padding-bottom': '1rem !important' },
1838
+ '.bw-py-4': { 'padding-top': '1.5rem !important', 'padding-bottom': '1.5rem !important' },
1839
+ '.bw-py-5': { 'padding-top': '3rem !important', 'padding-bottom': '3rem !important' },
1840
+ '.bw-py-6': { 'padding-top': '4rem !important', 'padding-bottom': '4rem !important' }
1841
+ },
1842
+
1843
+ /**
1844
+ * Feature grid item styles
1845
+ */
1846
+ features: {
1847
+ '.bw-feature': {
1848
+ 'padding': '1rem'
1849
+ },
1850
+ '.bw-feature-icon': {
1851
+ 'display': 'inline-block',
1852
+ 'margin-bottom': '1rem'
1853
+ },
1854
+ '.bw-feature-title': {
1855
+ 'margin-bottom': '0.5rem'
1856
+ },
1857
+ '.bw-feature-description': {
1858
+ 'color': '#6c757d',
1859
+ 'font-size': '0.9375rem',
1860
+ 'line-height': '1.6'
1861
+ },
1862
+ '.bw-feature-grid': {
1863
+ 'width': '100%'
1864
+ },
1865
+ '.bw-g-4': {
1866
+ '--bw-gutter-x': '1.5rem',
1867
+ '--bw-gutter-y': '1.5rem'
1868
+ }
1869
+ },
1870
+
1871
+ /**
1872
+ * Enhanced card styles
1873
+ */
1874
+ enhancedCards: {
1875
+ '.bw-card-hoverable': {
1876
+ 'transition': 'all 0.3s cubic-bezier(0.4, 0, 0.2, 1)'
1877
+ },
1878
+ '.bw-card-hoverable:hover': {
1879
+ 'transform': 'translateY(-4px)',
1880
+ 'box-shadow': '0 1rem 2rem rgba(0,0,0,.15)'
1881
+ },
1882
+ '.bw-card-img-top': {
1883
+ 'width': '100%',
1884
+ 'border-top-left-radius': '7px',
1885
+ 'border-top-right-radius': '7px'
1886
+ },
1887
+ '.bw-card-img-bottom': {
1888
+ 'width': '100%',
1889
+ 'border-bottom-left-radius': '7px',
1890
+ 'border-bottom-right-radius': '7px'
1891
+ },
1892
+ '.bw-card-img-left': {
1893
+ 'width': '40%',
1894
+ 'object-fit': 'cover'
1895
+ },
1896
+ '.bw-card-img-right': {
1897
+ 'width': '40%',
1898
+ 'object-fit': 'cover'
1899
+ },
1900
+ '.bw-card-subtitle, .card-subtitle': {
1901
+ 'margin-top': '-0.25rem',
1902
+ 'margin-bottom': '0.5rem',
1903
+ 'color': '#777',
1904
+ 'font-size': '0.875rem'
1905
+ },
1906
+ '.bw-h5': {
1907
+ 'font-size': '1.25rem'
1908
+ },
1909
+ '.bw-h6': {
1910
+ 'font-size': '1rem'
1911
+ }
1912
+ },
1913
+
1914
+ /**
1915
+ * Page section styles
1916
+ */
1917
+ sections: {
1918
+ '.bw-section': {
1919
+ 'position': 'relative'
1920
+ },
1921
+ '.bw-section-header': {
1922
+ 'margin-bottom': '3rem'
1923
+ },
1924
+ '.bw-section-title': {
1925
+ 'margin-bottom': '1rem',
1926
+ 'font-weight': '300',
1927
+ 'font-size': 'calc(1.325rem + .9vw)'
1928
+ },
1929
+ '@media (min-width: 1200px)': {
1930
+ '.bw-section-title': { 'font-size': '2rem' }
1931
+ },
1932
+ '.bw-section-subtitle': {
1933
+ 'font-size': '1.125rem',
1934
+ 'color': '#6c757d'
1935
+ }
1936
+ },
1937
+
1938
+ /**
1939
+ * Call-to-action section styles
1940
+ */
1941
+ cta: {
1942
+ '.bw-cta': {
1943
+ 'position': 'relative'
1944
+ },
1945
+ '.bw-cta-content': {
1946
+ 'max-width': '48rem',
1947
+ 'margin': '0 auto'
1948
+ },
1949
+ '.bw-cta-title': {
1950
+ 'font-weight': '300'
1951
+ },
1952
+ '.bw-cta-actions': {
1953
+ 'display': 'flex',
1954
+ 'gap': '1rem',
1955
+ 'justify-content': 'center',
1956
+ 'flex-wrap': 'wrap'
1957
+ },
1958
+ '.bw-cta-description': {
1959
+ 'font-size': '1.125rem',
1960
+ 'color': '#6c757d',
1961
+ 'max-width': '36rem',
1962
+ 'margin-left': 'auto',
1963
+ 'margin-right': 'auto'
1964
+ }
1965
+ },
1966
+
1967
+ /**
1968
+ * Form check (checkbox/radio) styles
1969
+ */
1970
+ formChecks: {
1971
+ '.bw-form-check': {
1972
+ 'display': 'flex',
1973
+ 'align-items': 'center',
1974
+ 'gap': '0.5rem',
1975
+ 'min-height': '1.5rem',
1976
+ 'margin-bottom': '0.25rem'
1977
+ },
1978
+ '.bw-form-check-input': {
1979
+ 'width': '1rem',
1980
+ 'height': '1rem',
1981
+ 'margin': '0',
1982
+ 'cursor': 'pointer',
1983
+ 'flex-shrink': '0',
1984
+ 'border': '1px solid #adb5bd',
1985
+ 'border-radius': '0.25rem',
1986
+ 'appearance': 'auto'
1987
+ },
1988
+ '.bw-form-check-input:checked': {
1989
+ 'background-color': '#006666',
1990
+ 'border-color': '#006666'
1991
+ },
1992
+ '.bw-form-check-input:focus': {
1993
+ 'outline': '0',
1994
+ 'box-shadow': '0 0 0 0.25rem rgba(0, 102, 102, 0.25)'
1995
+ },
1996
+ '.bw-form-check-input:disabled': {
1997
+ 'opacity': '0.5',
1998
+ 'cursor': 'not-allowed'
1999
+ },
2000
+ '.bw-form-check-label': {
2001
+ 'cursor': 'pointer',
2002
+ 'user-select': 'none',
2003
+ 'font-size': '0.9375rem'
2004
+ }
2005
+ },
2006
+
2007
+ /**
2008
+ * Spinner/loading indicator styles
2009
+ */
2010
+ spinner: {
2011
+ '.bw-spinner-border': {
2012
+ 'display': 'inline-block',
2013
+ 'width': '2rem',
2014
+ 'height': '2rem',
2015
+ 'vertical-align': '-0.125em',
2016
+ 'border': '0.25em solid currentcolor',
2017
+ 'border-right-color': 'transparent',
2018
+ 'border-radius': '50%',
2019
+ 'animation': 'bw-spinner-border 0.75s linear infinite'
2020
+ },
2021
+ '.bw-spinner-border-sm': {
2022
+ 'width': '1rem',
2023
+ 'height': '1rem',
2024
+ 'border-width': '0.2em'
2025
+ },
2026
+ '.bw-spinner-border-lg': {
2027
+ 'width': '3rem',
2028
+ 'height': '3rem',
2029
+ 'border-width': '0.3em'
2030
+ },
2031
+ '.bw-spinner-grow': {
2032
+ 'display': 'inline-block',
2033
+ 'width': '2rem',
2034
+ 'height': '2rem',
2035
+ 'vertical-align': '-0.125em',
2036
+ 'background-color': 'currentcolor',
2037
+ 'border-radius': '50%',
2038
+ 'opacity': '0',
2039
+ 'animation': 'bw-spinner-grow 0.75s linear infinite'
2040
+ },
2041
+ '.bw-spinner-grow-sm': {
2042
+ 'width': '1rem',
2043
+ 'height': '1rem'
2044
+ },
2045
+ '.bw-spinner-grow-lg': {
2046
+ 'width': '3rem',
2047
+ 'height': '3rem'
2048
+ },
2049
+ '.bw-spinner-grow-md': {},
2050
+ '.bw-spinner-border-md': {},
2051
+ '@keyframes bw-spinner-border': {
2052
+ '100%': { 'transform': 'rotate(360deg)' }
2053
+ },
2054
+ '@keyframes bw-spinner-grow': {
2055
+ '0%': { 'transform': 'scale(0)' },
2056
+ '50%': { 'opacity': '1', 'transform': 'none' }
2057
+ },
2058
+ '.bw-visually-hidden': {
2059
+ 'position': 'absolute',
2060
+ 'width': '1px',
2061
+ 'height': '1px',
2062
+ 'padding': '0',
2063
+ 'margin': '-1px',
2064
+ 'overflow': 'hidden',
2065
+ 'clip': 'rect(0, 0, 0, 0)',
2066
+ 'white-space': 'nowrap',
2067
+ 'border': '0'
2068
+ }
2069
+ },
2070
+
2071
+ /**
2072
+ * Close button styles
2073
+ */
2074
+ closeButton: {
2075
+ '.bw-close': {
2076
+ 'display': 'inline-flex',
2077
+ 'align-items': 'center',
2078
+ 'justify-content': 'center',
2079
+ 'width': '1.5rem',
2080
+ 'height': '1.5rem',
2081
+ 'padding': '0',
2082
+ 'font-size': '1.25rem',
2083
+ 'font-weight': '700',
2084
+ 'line-height': '1',
2085
+ 'color': '#000',
2086
+ 'background': 'transparent',
2087
+ 'border': '0',
2088
+ 'border-radius': '0.25rem',
2089
+ 'opacity': '0.5',
2090
+ 'cursor': 'pointer'
2091
+ },
2092
+ '.bw-close:hover': {
2093
+ 'opacity': '0.75'
2094
+ },
2095
+ '.bw-close:focus': {
2096
+ 'opacity': '1',
2097
+ 'outline': '0',
2098
+ 'box-shadow': '0 0 0 0.25rem rgba(0, 102, 102, 0.25)'
2099
+ }
2100
+ },
2101
+
2102
+ /**
2103
+ * Stack layout styles
2104
+ */
2105
+ stacks: {
2106
+ '.bw-vstack': {
2107
+ 'display': 'flex',
2108
+ 'flex-direction': 'column'
2109
+ },
2110
+ '.bw-hstack': {
2111
+ 'display': 'flex',
2112
+ 'flex-direction': 'row',
2113
+ 'align-items': 'center'
2114
+ },
2115
+ '.bw-gap-0': { 'gap': '0' },
2116
+ '.bw-gap-1': { 'gap': '0.25rem' },
2117
+ '.bw-gap-2': { 'gap': '0.5rem' },
2118
+ '.bw-gap-3': { 'gap': '1rem' },
2119
+ '.bw-gap-4': { 'gap': '1.5rem' },
2120
+ '.bw-gap-5': { 'gap': '3rem' }
2121
+ },
2122
+
2123
+ /**
2124
+ * Table responsive wrapper
2125
+ */
2126
+ tableResponsive: {
2127
+ '.bw-table-responsive': {
2128
+ 'overflow-x': 'auto',
2129
+ '-webkit-overflow-scrolling': 'touch'
2130
+ }
2131
+ },
2132
+
2133
+ /**
2134
+ * Grid offset classes
2135
+ */
2136
+ offsets: {
2137
+ '.bw-offset-1': { 'margin-left': '8.333333%' },
2138
+ '.bw-offset-2': { 'margin-left': '16.666667%' },
2139
+ '.bw-offset-3': { 'margin-left': '25%' },
2140
+ '.bw-offset-4': { 'margin-left': '33.333333%' },
2141
+ '.bw-offset-5': { 'margin-left': '41.666667%' },
2142
+ '.bw-offset-6': { 'margin-left': '50%' },
2143
+ '.bw-offset-7': { 'margin-left': '58.333333%' },
2144
+ '.bw-offset-8': { 'margin-left': '66.666667%' },
2145
+ '.bw-offset-9': { 'margin-left': '75%' },
2146
+ '.bw-offset-10': { 'margin-left': '83.333333%' },
2147
+ '.bw-offset-11': { 'margin-left': '91.666667%' }
2148
+ },
2149
+
2150
+ /**
2151
+ * Code demo styles
2152
+ */
2153
+ codeDemo: {
2154
+ '.bw-code-demo': {
2155
+ 'margin-bottom': '2rem'
2156
+ },
2157
+ '.bw-copy-btn': {
2158
+ 'position': 'absolute',
2159
+ 'top': '0.5rem',
2160
+ 'right': '0.5rem',
2161
+ 'padding': '0.25rem 0.625rem',
2162
+ 'font-size': '0.6875rem',
2163
+ 'background': 'rgba(255,255,255,0.12)',
2164
+ 'color': '#aaa',
2165
+ 'border': '1px solid rgba(255,255,255,0.15)',
2166
+ 'border-radius': '4px',
2167
+ 'cursor': 'pointer',
2168
+ 'font-family': 'inherit',
2169
+ 'transition': 'all 0.15s'
2170
+ },
2171
+ '.bw-copy-btn:hover': {
2172
+ 'background': 'rgba(255,255,255,0.2)',
2173
+ 'color': '#fff'
2174
+ }
2175
+ },
2176
+
2177
+ /**
2178
+ * Utility classes
2179
+ */
2180
+ utilities: {
2181
+ // Spacing
2182
+ '.bw-m-0': { 'margin': '0 !important' },
2183
+ '.bw-m-1': { 'margin': '.25rem !important' },
2184
+ '.bw-m-2': { 'margin': '.5rem !important' },
2185
+ '.bw-m-3': { 'margin': '1rem !important' },
2186
+ '.bw-m-4': { 'margin': '1.5rem !important' },
2187
+ '.bw-m-5': { 'margin': '3rem !important' },
2188
+ '.bw-m-auto, .m-auto': { 'margin': 'auto !important' },
2189
+
2190
+ '.bw-mt-0': { 'margin-top': '0 !important' },
2191
+ '.bw-mt-1': { 'margin-top': '.25rem !important' },
2192
+ '.bw-mt-2': { 'margin-top': '.5rem !important' },
2193
+ '.bw-mt-3': { 'margin-top': '1rem !important' },
2194
+ '.bw-mt-4': { 'margin-top': '1.5rem !important' },
2195
+ '.bw-mt-5': { 'margin-top': '3rem !important' },
2196
+
2197
+ '.bw-mb-0': { 'margin-bottom': '0 !important' },
2198
+ '.bw-mb-1': { 'margin-bottom': '.25rem !important' },
2199
+ '.bw-mb-2': { 'margin-bottom': '.5rem !important' },
2200
+ '.bw-mb-3': { 'margin-bottom': '1rem !important' },
2201
+ '.bw-mb-4': { 'margin-bottom': '1.5rem !important' },
2202
+ '.bw-mb-5': { 'margin-bottom': '3rem !important' },
2203
+
2204
+ '.bw-ms-0': { 'margin-left': '0 !important' },
2205
+ '.bw-ms-1': { 'margin-left': '.25rem !important' },
2206
+ '.bw-ms-2': { 'margin-left': '.5rem !important' },
2207
+ '.bw-ms-3': { 'margin-left': '1rem !important' },
2208
+ '.bw-ms-4': { 'margin-left': '1.5rem !important' },
2209
+ '.bw-ms-5': { 'margin-left': '3rem !important' },
2210
+
2211
+ '.bw-me-0': { 'margin-right': '0 !important' },
2212
+ '.bw-me-1': { 'margin-right': '.25rem !important' },
2213
+ '.bw-me-2': { 'margin-right': '.5rem !important' },
2214
+ '.bw-me-3': { 'margin-right': '1rem !important' },
2215
+ '.bw-me-4': { 'margin-right': '1.5rem !important' },
2216
+ '.bw-me-5': { 'margin-right': '3rem !important' },
2217
+
2218
+ '.bw-p-0': { 'padding': '0 !important' },
2219
+ '.bw-p-1': { 'padding': '.25rem !important' },
2220
+ '.bw-p-2': { 'padding': '.5rem !important' },
2221
+ '.bw-p-3': { 'padding': '1rem !important' },
2222
+ '.bw-p-4': { 'padding': '1.5rem !important' },
2223
+ '.bw-p-5': { 'padding': '3rem !important' },
2224
+
2225
+ '.bw-pt-0, .pt-0': { 'padding-top': '0 !important' },
2226
+ '.bw-pt-1, .pt-1': { 'padding-top': '.25rem !important' },
2227
+ '.bw-pt-2, .pt-2': { 'padding-top': '.5rem !important' },
2228
+ '.bw-pt-3, .pt-3': { 'padding-top': '1rem !important' },
2229
+ '.bw-pt-4, .pt-4': { 'padding-top': '1.5rem !important' },
2230
+ '.bw-pt-5, .pt-5': { 'padding-top': '3rem !important' },
2231
+
2232
+ '.bw-pb-0, .pb-0': { 'padding-bottom': '0 !important' },
2233
+ '.bw-pb-1, .pb-1': { 'padding-bottom': '.25rem !important' },
2234
+ '.bw-pb-2, .pb-2': { 'padding-bottom': '.5rem !important' },
2235
+ '.bw-pb-3, .pb-3': { 'padding-bottom': '1rem !important' },
2236
+ '.bw-pb-4, .pb-4': { 'padding-bottom': '1.5rem !important' },
2237
+ '.bw-pb-5, .pb-5': { 'padding-bottom': '3rem !important' },
2238
+
2239
+ '.bw-ps-0, .ps-0': { 'padding-left': '0 !important' },
2240
+ '.bw-ps-1, .ps-1': { 'padding-left': '.25rem !important' },
2241
+ '.bw-ps-2, .ps-2': { 'padding-left': '.5rem !important' },
2242
+ '.bw-ps-3, .ps-3': { 'padding-left': '1rem !important' },
2243
+ '.bw-ps-4, .ps-4': { 'padding-left': '1.5rem !important' },
2244
+ '.bw-ps-5, .ps-5': { 'padding-left': '3rem !important' },
2245
+
2246
+ '.bw-pe-0, .pe-0': { 'padding-right': '0 !important' },
2247
+ '.bw-pe-1, .pe-1': { 'padding-right': '.25rem !important' },
2248
+ '.bw-pe-2, .pe-2': { 'padding-right': '.5rem !important' },
2249
+ '.bw-pe-3, .pe-3': { 'padding-right': '1rem !important' },
2250
+ '.bw-pe-4, .pe-4': { 'padding-right': '1.5rem !important' },
2251
+ '.bw-pe-5, .pe-5': { 'padding-right': '3rem !important' },
2252
+
2253
+ // Text alignment
2254
+ '.bw-text-left': { 'text-align': 'left' },
2255
+ '.bw-text-right': { 'text-align': 'right' },
2256
+ '.bw-text-center': { 'text-align': 'center' },
2257
+
2258
+ // Display
2259
+ '.bw-d-none': { 'display': 'none' },
2260
+ '.bw-d-block': { 'display': 'block' },
2261
+ '.bw-d-inline': { 'display': 'inline' },
2262
+ '.bw-d-inline-block': { 'display': 'inline-block' },
2263
+ '.bw-d-flex': { 'display': 'flex' },
2264
+
2265
+ // Flexbox
2266
+ '.bw-justify-content-start, .justify-content-start': { 'justify-content': 'flex-start' },
2267
+ '.bw-justify-content-end, .justify-content-end': { 'justify-content': 'flex-end' },
2268
+ '.bw-justify-content-center, .justify-content-center': { 'justify-content': 'center' },
2269
+ '.bw-justify-content-between, .justify-content-between': { 'justify-content': 'space-between' },
2270
+ '.bw-justify-content-around, .justify-content-around': { 'justify-content': 'space-around' },
2271
+
2272
+ '.bw-align-items-start, .align-items-start': { 'align-items': 'flex-start' },
2273
+ '.bw-align-items-end, .align-items-end': { 'align-items': 'flex-end' },
2274
+ '.bw-align-items-center, .align-items-center': { 'align-items': 'center' },
2275
+
2276
+ // Colors
2277
+ '.bw-text-primary': { 'color': '#006666' },
2278
+ '.bw-text-secondary': { 'color': '#6c757d' },
2279
+ '.bw-text-success': { 'color': '#198754' },
2280
+ '.bw-text-danger': { 'color': '#dc3545' },
2281
+ '.bw-text-warning': { 'color': '#ffc107' },
2282
+ '.bw-text-info': { 'color': '#0dcaf0' },
2283
+ '.bw-text-light': { 'color': '#f8f9fa' },
2284
+ '.bw-text-dark': { 'color': '#212529' },
2285
+ '.bw-text-muted': { 'color': '#6c757d' },
2286
+
2287
+ '.bw-bg-primary': { 'background-color': '#006666' },
2288
+ '.bw-bg-secondary': { 'background-color': '#6c757d' },
2289
+ '.bw-bg-success': { 'background-color': '#198754' },
2290
+ '.bw-bg-danger': { 'background-color': '#dc3545' },
2291
+ '.bw-bg-warning': { 'background-color': '#ffc107' },
2292
+ '.bw-bg-info': { 'background-color': '#0dcaf0' },
2293
+ '.bw-bg-light': { 'background-color': '#f8f9fa' },
2294
+ '.bw-bg-dark': { 'background-color': '#212529' },
2295
+
2296
+ // Borders
2297
+ '.bw-border': { 'border': '1px solid #dee2e6 !important' },
2298
+ '.bw-border-0': { 'border': '0 !important' },
2299
+ '.bw-border-top-0, .border-top-0': { 'border-top': '0 !important' },
2300
+ '.bw-border-end-0, .border-end-0': { 'border-right': '0 !important' },
2301
+ '.bw-border-bottom-0, .border-bottom-0': { 'border-bottom': '0 !important' },
2302
+ '.bw-border-start-0, .border-start-0': { 'border-left': '0 !important' },
2303
+
2304
+ '.bw-rounded': { 'border-radius': '.375rem !important' },
2305
+ '.bw-rounded-0': { 'border-radius': '0 !important' },
2306
+ '.bw-rounded-1, .rounded-1': { 'border-radius': '.25rem !important' },
2307
+ '.bw-rounded-2, .rounded-2': { 'border-radius': '.375rem !important' },
2308
+ '.bw-rounded-3, .rounded-3': { 'border-radius': '.5rem !important' },
2309
+ '.bw-rounded-circle': { 'border-radius': '50% !important' },
2310
+ '.bw-rounded-pill, .rounded-pill': { 'border-radius': '50rem !important' },
2311
+
2312
+ // Shadows
2313
+ '.bw-shadow': { 'box-shadow': '0 .5rem 1rem rgba(0,0,0,.15) !important' },
2314
+ '.bw-shadow-sm': { 'box-shadow': '0 .125rem .25rem rgba(0,0,0,.075) !important' },
2315
+ '.bw-shadow-lg': { 'box-shadow': '0 1rem 3rem rgba(0,0,0,.175) !important' },
2316
+ '.bw-shadow-none, .shadow-none': { 'box-shadow': 'none !important' },
2317
+
2318
+ // Width/Height
2319
+ '.bw-w-25, .w-25': { 'width': '25% !important' },
2320
+ '.bw-w-50, .w-50': { 'width': '50% !important' },
2321
+ '.bw-w-75, .w-75': { 'width': '75% !important' },
2322
+ '.bw-w-100, .w-100': { 'width': '100% !important' },
2323
+ '.bw-w-auto, .w-auto': { 'width': 'auto !important' },
2324
+
2325
+ '.bw-h-25, .h-25': { 'height': '25% !important' },
2326
+ '.bw-h-50, .h-50': { 'height': '50% !important' },
2327
+ '.bw-h-75, .h-75': { 'height': '75% !important' },
2328
+ '.bw-h-100, .h-100': { 'height': '100% !important' },
2329
+ '.bw-h-auto, .h-auto': { 'height': 'auto !important' },
2330
+
2331
+ '.bw-mw-100, .mw-100': { 'max-width': '100% !important' },
2332
+ '.bw-mh-100, .mh-100': { 'max-height': '100% !important' },
2333
+
2334
+ // Positioning
2335
+ '.bw-position-static, .position-static': { 'position': 'static !important' },
2336
+ '.bw-position-relative, .position-relative': { 'position': 'relative !important' },
2337
+ '.bw-position-absolute, .position-absolute': { 'position': 'absolute !important' },
2338
+ '.bw-position-fixed, .position-fixed': { 'position': 'fixed !important' },
2339
+ '.bw-position-sticky, .position-sticky': { 'position': 'sticky !important' },
2340
+
2341
+ '.bw-top-0, .top-0': { 'top': '0 !important' },
2342
+ '.bw-top-50, .top-50': { 'top': '50% !important' },
2343
+ '.bw-top-100, .top-100': { 'top': '100% !important' },
2344
+ '.bw-bottom-0, .bottom-0': { 'bottom': '0 !important' },
2345
+ '.bw-bottom-50, .bottom-50': { 'bottom': '50% !important' },
2346
+ '.bw-bottom-100, .bottom-100': { 'bottom': '100% !important' },
2347
+ '.bw-start-0, .start-0': { 'left': '0 !important' },
2348
+ '.bw-start-50, .start-50': { 'left': '50% !important' },
2349
+ '.bw-start-100, .start-100': { 'left': '100% !important' },
2350
+ '.bw-end-0, .end-0': { 'right': '0 !important' },
2351
+ '.bw-end-50, .end-50': { 'right': '50% !important' },
2352
+ '.bw-end-100, .end-100': { 'right': '100% !important' },
2353
+
2354
+ '.translate-middle': { 'transform': 'translate(-50%, -50%) !important' },
2355
+
2356
+ // Overflow
2357
+ '.bw-overflow-auto, .overflow-auto': { 'overflow': 'auto !important' },
2358
+ '.bw-overflow-hidden, .overflow-hidden': { 'overflow': 'hidden !important' },
2359
+ '.bw-overflow-visible, .overflow-visible': { 'overflow': 'visible !important' },
2360
+ '.bw-overflow-scroll, .overflow-scroll': { 'overflow': 'scroll !important' },
2361
+
2362
+ // Typography utilities
2363
+ '.fs-1': { 'font-size': 'calc(1.375rem + 1.5vw) !important' },
2364
+ '.fs-2': { 'font-size': 'calc(1.325rem + .9vw) !important' },
2365
+ '.fs-3': { 'font-size': 'calc(1.3rem + .6vw) !important' },
2366
+ '.fs-4': { 'font-size': 'calc(1.275rem + .3vw) !important' },
2367
+ '.fs-5': { 'font-size': '1.25rem !important' },
2368
+ '.fs-6': { 'font-size': '1rem !important' },
2369
+
2370
+ '.fw-light': { 'font-weight': '300 !important' },
2371
+ '.fw-lighter': { 'font-weight': 'lighter !important' },
2372
+ '.fw-normal': { 'font-weight': '400 !important' },
2373
+ '.fw-bold': { 'font-weight': '700 !important' },
2374
+ '.fw-bolder': { 'font-weight': 'bolder !important' },
2375
+
2376
+ '.fst-italic': { 'font-style': 'italic !important' },
2377
+ '.fst-normal': { 'font-style': 'normal !important' },
2378
+
2379
+ '.text-decoration-none': { 'text-decoration': 'none !important' },
2380
+ '.text-decoration-underline': { 'text-decoration': 'underline !important' },
2381
+ '.text-decoration-line-through': { 'text-decoration': 'line-through !important' },
2382
+
2383
+ '.text-lowercase': { 'text-transform': 'lowercase !important' },
2384
+ '.text-uppercase': { 'text-transform': 'uppercase !important' },
2385
+ '.text-capitalize': { 'text-transform': 'capitalize !important' },
2386
+
2387
+ '.text-wrap': { 'white-space': 'normal !important' },
2388
+ '.text-nowrap': { 'white-space': 'nowrap !important' },
2389
+
2390
+ // List utilities
2391
+ '.list-unstyled': {
2392
+ 'padding-left': '0',
2393
+ 'list-style': 'none'
2394
+ },
2395
+
2396
+ '.list-inline': {
2397
+ 'padding-left': '0',
2398
+ 'list-style': 'none'
2399
+ },
2400
+
2401
+ '.list-inline-item': {
2402
+ 'display': 'inline-block'
2403
+ },
2404
+
2405
+ '.list-inline-item:not(:last-child)': {
2406
+ 'margin-right': '.5rem'
2407
+ },
2408
+
2409
+ // Visibility
2410
+ '.bw-visible, .visible': { 'visibility': 'visible !important' },
2411
+ '.bw-invisible, .invisible': { 'visibility': 'hidden !important' },
2412
+
2413
+ // User select
2414
+ '.bw-user-select-all, .user-select-all': { 'user-select': 'all !important' },
2415
+ '.bw-user-select-auto, .user-select-auto': { 'user-select': 'auto !important' },
2416
+ '.bw-user-select-none, .user-select-none': { 'user-select': 'none !important' },
2417
+
2418
+ // Pointer events
2419
+ '.pe-none': { 'pointer-events': 'none !important' },
2420
+ '.pe-auto': { 'pointer-events': 'auto !important' },
2421
+
2422
+ // Opacity
2423
+ '.opacity-0': { 'opacity': '0 !important' },
2424
+ '.opacity-25': { 'opacity': '.25 !important' },
2425
+ '.opacity-50': { 'opacity': '.5 !important' },
2426
+ '.opacity-75': { 'opacity': '.75 !important' },
2427
+ '.opacity-100': { 'opacity': '1 !important' }
2428
+ },
2429
+
2430
+ /**
2431
+ * Responsive grid columns
2432
+ */
2433
+ responsive: {
2434
+ '@media (min-width: 576px)': {
2435
+ '.bw-col-sm-1': { 'flex': '0 0 8.333333%', 'max-width': '8.333333%' },
2436
+ '.bw-col-sm-2': { 'flex': '0 0 16.666667%', 'max-width': '16.666667%' },
2437
+ '.bw-col-sm-3': { 'flex': '0 0 25%', 'max-width': '25%' },
2438
+ '.bw-col-sm-4': { 'flex': '0 0 33.333333%', 'max-width': '33.333333%' },
2439
+ '.bw-col-sm-5': { 'flex': '0 0 41.666667%', 'max-width': '41.666667%' },
2440
+ '.bw-col-sm-6': { 'flex': '0 0 50%', 'max-width': '50%' },
2441
+ '.bw-col-sm-7': { 'flex': '0 0 58.333333%', 'max-width': '58.333333%' },
2442
+ '.bw-col-sm-8': { 'flex': '0 0 66.666667%', 'max-width': '66.666667%' },
2443
+ '.bw-col-sm-9': { 'flex': '0 0 75%', 'max-width': '75%' },
2444
+ '.bw-col-sm-10': { 'flex': '0 0 83.333333%', 'max-width': '83.333333%' },
2445
+ '.bw-col-sm-11': { 'flex': '0 0 91.666667%', 'max-width': '91.666667%' },
2446
+ '.bw-col-sm-12': { 'flex': '0 0 100%', 'max-width': '100%' }
2447
+ },
2448
+ '@media (min-width: 768px)': {
2449
+ '.bw-col-md-1': { 'flex': '0 0 8.333333%', 'max-width': '8.333333%' },
2450
+ '.bw-col-md-2': { 'flex': '0 0 16.666667%', 'max-width': '16.666667%' },
2451
+ '.bw-col-md-3': { 'flex': '0 0 25%', 'max-width': '25%' },
2452
+ '.bw-col-md-4': { 'flex': '0 0 33.333333%', 'max-width': '33.333333%' },
2453
+ '.bw-col-md-5': { 'flex': '0 0 41.666667%', 'max-width': '41.666667%' },
2454
+ '.bw-col-md-6': { 'flex': '0 0 50%', 'max-width': '50%' },
2455
+ '.bw-col-md-7': { 'flex': '0 0 58.333333%', 'max-width': '58.333333%' },
2456
+ '.bw-col-md-8': { 'flex': '0 0 66.666667%', 'max-width': '66.666667%' },
2457
+ '.bw-col-md-9': { 'flex': '0 0 75%', 'max-width': '75%' },
2458
+ '.bw-col-md-10': { 'flex': '0 0 83.333333%', 'max-width': '83.333333%' },
2459
+ '.bw-col-md-11': { 'flex': '0 0 91.666667%', 'max-width': '91.666667%' },
2460
+ '.bw-col-md-12': { 'flex': '0 0 100%', 'max-width': '100%' }
2461
+ },
2462
+ '@media (min-width: 992px)': {
2463
+ '.bw-col-lg-1': { 'flex': '0 0 8.333333%', 'max-width': '8.333333%' },
2464
+ '.bw-col-lg-2': { 'flex': '0 0 16.666667%', 'max-width': '16.666667%' },
2465
+ '.bw-col-lg-3': { 'flex': '0 0 25%', 'max-width': '25%' },
2466
+ '.bw-col-lg-4': { 'flex': '0 0 33.333333%', 'max-width': '33.333333%' },
2467
+ '.bw-col-lg-5': { 'flex': '0 0 41.666667%', 'max-width': '41.666667%' },
2468
+ '.bw-col-lg-6': { 'flex': '0 0 50%', 'max-width': '50%' },
2469
+ '.bw-col-lg-7': { 'flex': '0 0 58.333333%', 'max-width': '58.333333%' },
2470
+ '.bw-col-lg-8': { 'flex': '0 0 66.666667%', 'max-width': '66.666667%' },
2471
+ '.bw-col-lg-9': { 'flex': '0 0 75%', 'max-width': '75%' },
2472
+ '.bw-col-lg-10': { 'flex': '0 0 83.333333%', 'max-width': '83.333333%' },
2473
+ '.bw-col-lg-11': { 'flex': '0 0 91.666667%', 'max-width': '91.666667%' },
2474
+ '.bw-col-lg-12': { 'flex': '0 0 100%', 'max-width': '100%' }
2475
+ },
2476
+ '@media (max-width: 575px)': {
2477
+ '.bw-card-img-left, .bw_card-img-left': { 'width': '100%' },
2478
+ '.bw-card-img-right, .bw_card-img-right': { 'width': '100%' },
2479
+ '.bw-hero, .bw_hero': { 'padding': '2rem 1rem' },
2480
+ '.bw-cta-actions, .bw_cta-actions': { 'flex-direction': 'column' },
2481
+ '.bw-hstack, .bw_hstack': { 'flex-direction': 'column' },
2482
+ '.bw-feature-grid, .bw_feature-grid': { 'grid-template-columns': '1fr' }
2483
+ }
2484
+ }
2485
+ };
2486
+
2487
+ // =========================================================================
2488
+ // Structural styles — color-independent layout/behavior CSS
2489
+ // =========================================================================
2490
+
2491
+ /**
2492
+ * Structural styles contain only layout, sizing, spacing, and behavior
2493
+ * properties. No colors, backgrounds, shadows, or border-colors.
2494
+ * These never change with themes.
2495
+ *
2496
+ * @returns {Object} CSS rules object
2497
+ */
2498
+ export function getStructuralStyles() {
2499
+ var rules = {};
2500
+
2501
+ // Reset (structural portion)
2502
+ rules['*'] = { 'box-sizing': 'border-box', 'margin': '0', 'padding': '0' };
2503
+ rules['html'] = {
2504
+ 'font-size': '16px', 'line-height': '1.5',
2505
+ '-webkit-text-size-adjust': '100%',
2506
+ '-webkit-font-smoothing': 'antialiased',
2507
+ '-moz-osx-font-smoothing': 'grayscale'
2508
+ };
2509
+ rules['body'] = {
2510
+ 'font-family': 'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif',
2511
+ 'font-size': '1rem', 'font-weight': '400', 'line-height': '1.6',
2512
+ 'margin': '0', 'padding': '0',
2513
+ '-webkit-font-smoothing': 'antialiased',
2514
+ '-moz-osx-font-smoothing': 'grayscale'
2515
+ };
2516
+ rules['.bw-page'] = { 'min-height': '100vh', 'display': 'flex', 'flex-direction': 'column' };
2517
+ rules['.bw-page-content'] = { 'flex': '1', 'padding': '2rem 0' };
2518
+ rules['main'] = { 'display': 'block' };
2519
+ rules['hr'] = { 'box-sizing': 'content-box', 'height': '0', 'overflow': 'visible', 'margin': '1rem 0', 'border': '0' };
2520
+ rules['hr:not([size])'] = { 'height': '1px' };
2521
+
2522
+ // Typography (structural)
2523
+ rules['h1, h2, h3, h4, h5, h6'] = {
2524
+ 'margin-top': '0', 'margin-bottom': '.5rem', 'font-weight': '600',
2525
+ 'line-height': '1.25', 'letter-spacing': '-0.01em'
2526
+ };
2527
+ rules['h1'] = { 'font-size': 'calc(1.375rem + 1.5vw)' };
2528
+ rules['h2'] = { 'font-size': 'calc(1.325rem + .9vw)' };
2529
+ rules['h3'] = { 'font-size': 'calc(1.3rem + .6vw)' };
2530
+ rules['h4'] = { 'font-size': 'calc(1.275rem + .3vw)' };
2531
+ rules['h5'] = { 'font-size': '1.25rem' };
2532
+ rules['h6'] = { 'font-size': '1rem' };
2533
+ rules['p'] = { 'margin-top': '0', 'margin-bottom': '1rem' };
2534
+ rules['small'] = { 'font-size': '0.875rem' };
2535
+ rules['a'] = { 'text-decoration': 'none', 'transition': 'color 0.15s' };
2536
+
2537
+ // Grid (all structural)
2538
+ Object.assign(rules, defaultStyles.grid);
2539
+
2540
+ // Button (structural)
2541
+ rules['.bw-btn'] = {
2542
+ 'display': 'inline-flex', 'align-items': 'center', 'justify-content': 'center',
2543
+ 'font-weight': '500', 'line-height': '1.5', 'text-align': 'center',
2544
+ 'text-decoration': 'none', 'vertical-align': 'middle', 'cursor': 'pointer',
2545
+ 'user-select': 'none', 'border': '1px solid transparent',
2546
+ 'padding': '0.5rem 1.125rem', 'font-size': '0.875rem', 'font-family': 'inherit',
2547
+ 'border-radius': '6px', 'transition': 'all 0.15s cubic-bezier(0.4, 0, 0.2, 1)',
2548
+ 'gap': '0.5rem'
2549
+ };
2550
+ rules['.bw-btn:hover'] = { 'text-decoration': 'none', 'transform': 'translateY(-1px)' };
2551
+ rules['.bw-btn:active'] = { 'transform': 'translateY(0)' };
2552
+ rules['.bw-btn:focus-visible'] = { 'outline': '0' };
2553
+ rules['.bw-btn:disabled'] = { 'opacity': '0.5', 'cursor': 'not-allowed', 'pointer-events': 'none' };
2554
+ rules['.bw-btn-lg'] = { 'padding': '0.625rem 1.5rem', 'font-size': '1rem', 'border-radius': '8px' };
2555
+ rules['.bw-btn-sm'] = { 'padding': '0.25rem 0.75rem', 'font-size': '0.8125rem', 'border-radius': '5px' };
2556
+
2557
+ // Card (structural)
2558
+ rules['.bw-card'] = {
2559
+ 'position': 'relative', 'display': 'flex', 'flex-direction': 'column',
2560
+ 'min-width': '0', 'height': '100%', 'word-wrap': 'break-word',
2561
+ 'background-clip': 'border-box', 'border': '1px solid transparent',
2562
+ 'border-radius': '8px', 'transition': 'box-shadow 0.2s cubic-bezier(0.4,0,0.2,1), transform 0.2s cubic-bezier(0.4,0,0.2,1)',
2563
+ 'margin-bottom': '1.5rem', 'overflow': 'hidden'
2564
+ };
2565
+ rules['.bw-card-body'] = { 'flex': '1 1 auto', 'padding': '1.25rem 1.5rem' };
2566
+ rules['.bw-card-body > *:last-child'] = { 'margin-bottom': '0' };
2567
+ rules['.bw-card-title'] = { 'margin-bottom': '0.5rem', 'font-size': '1.125rem', 'font-weight': '600', 'line-height': '1.3' };
2568
+ rules['.bw-card-text'] = { 'margin-bottom': '0', 'font-size': '0.9375rem', 'line-height': '1.6' };
2569
+ rules['.bw-card-header'] = { 'padding': '0.875rem 1.5rem', 'margin-bottom': '0', 'font-weight': '600', 'font-size': '0.875rem' };
2570
+ rules['.bw-card-footer'] = { 'padding': '0.75rem 1.5rem', 'font-size': '0.875rem' };
2571
+ rules['.bw-card-hoverable'] = { 'transition': 'all 0.3s cubic-bezier(0.4, 0, 0.2, 1)' };
2572
+ rules['.bw-card-img-top'] = { 'width': '100%', 'border-top-left-radius': '7px', 'border-top-right-radius': '7px' };
2573
+ rules['.bw-card-img-bottom'] = { 'width': '100%', 'border-bottom-left-radius': '7px', 'border-bottom-right-radius': '7px' };
2574
+ rules['.bw-card-img-left'] = { 'width': '40%', 'object-fit': 'cover' };
2575
+ rules['.bw-card-img-right'] = { 'width': '40%', 'object-fit': 'cover' };
2576
+ rules['.bw-card-subtitle'] = { 'margin-top': '-0.25rem', 'margin-bottom': '0.5rem', 'font-size': '0.875rem' };
2577
+
2578
+ // Forms (structural)
2579
+ rules['.bw-form-control'] = {
2580
+ 'display': 'block', 'width': '100%', 'padding': '0.5rem 0.875rem',
2581
+ 'font-size': '0.9375rem', 'font-weight': '400', 'line-height': '1.5',
2582
+ 'background-clip': 'padding-box', 'appearance': 'none',
2583
+ 'border': '1px solid transparent', 'border-radius': '6px',
2584
+ 'transition': 'border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out',
2585
+ 'font-family': 'inherit'
2586
+ };
2587
+ rules['.bw-form-control:focus'] = { 'outline': '0' };
2588
+ rules['.bw-form-control::placeholder'] = { 'opacity': '1' };
2589
+ rules['.bw-form-label'] = { 'display': 'block', 'margin-bottom': '0.375rem', 'font-size': '0.875rem', 'font-weight': '600' };
2590
+ rules['.bw-form-group'] = { 'margin-bottom': '1.25rem' };
2591
+ rules['.bw-form-text'] = { 'margin-top': '0.25rem', 'font-size': '0.8125rem' };
2592
+ rules['select.bw-form-control'] = {
2593
+ 'padding-right': '2.25rem',
2594
+ 'background-repeat': 'no-repeat', 'background-position': 'right 0.75rem center',
2595
+ 'background-size': '16px 12px'
2596
+ };
2597
+ rules['textarea.bw-form-control'] = { 'min-height': '5rem', 'resize': 'vertical' };
2598
+
2599
+ // Form checks (structural)
2600
+ Object.assign(rules, {
2601
+ '.bw-form-check': { 'display': 'flex', 'align-items': 'center', 'gap': '0.5rem', 'min-height': '1.5rem', 'margin-bottom': '0.25rem' },
2602
+ '.bw-form-check-input': { 'width': '1rem', 'height': '1rem', 'margin': '0', 'cursor': 'pointer', 'flex-shrink': '0', 'border-radius': '0.25rem', 'appearance': 'auto' },
2603
+ '.bw-form-check-input:disabled': { 'opacity': '0.5', 'cursor': 'not-allowed' },
2604
+ '.bw-form-check-label': { 'cursor': 'pointer', 'user-select': 'none', 'font-size': '0.9375rem' }
2605
+ });
2606
+
2607
+ // Navigation (structural)
2608
+ rules['.bw-navbar'] = {
2609
+ 'position': 'relative', 'display': 'flex', 'flex-wrap': 'wrap',
2610
+ 'align-items': 'center', 'justify-content': 'space-between', 'padding': '0.5rem 1.5rem'
2611
+ };
2612
+ rules['.bw-navbar > .container'] = { 'display': 'flex', 'flex-wrap': 'wrap', 'align-items': 'center', 'justify-content': 'space-between' };
2613
+ rules['.bw-navbar-brand'] = {
2614
+ 'display': 'inline-flex', 'align-items': 'center', 'gap': '0.5rem',
2615
+ 'padding-top': '0.25rem', 'padding-bottom': '0.25rem', 'margin-right': '1.5rem',
2616
+ 'font-size': '1.125rem', 'font-weight': '600', 'line-height': 'inherit',
2617
+ 'white-space': 'nowrap', 'text-decoration': 'none'
2618
+ };
2619
+ rules['.bw-navbar-nav'] = {
2620
+ 'display': 'flex', 'flex-direction': 'row', 'padding-left': '0',
2621
+ 'margin-bottom': '0', 'list-style': 'none', 'gap': '0.25rem'
2622
+ };
2623
+ rules['.bw-navbar-nav .bw-nav-link'] = {
2624
+ 'display': 'block', 'padding': '0.5rem 0.875rem', 'text-decoration': 'none',
2625
+ 'font-size': '0.875rem', 'font-weight': '500', 'border-radius': '6px',
2626
+ 'transition': 'color 0.15s, background-color 0.15s'
2627
+ };
2628
+
2629
+ // Tables (structural)
2630
+ rules['.bw-table'] = {
2631
+ 'width': '100%', 'margin-bottom': '1.5rem', 'vertical-align': 'top',
2632
+ 'border-collapse': 'collapse', 'font-size': '0.9375rem', 'line-height': '1.5'
2633
+ };
2634
+ rules['.bw-table > :not(caption) > * > *'] = { 'padding': '0.75rem 1rem' };
2635
+ rules['.bw-table > tbody'] = { 'vertical-align': 'inherit' };
2636
+ rules['.bw-table > thead'] = { 'vertical-align': 'bottom' };
2637
+ rules['.bw-table > thead > tr > *'] = {
2638
+ 'padding': '0.625rem 1rem', 'font-size': '0.8125rem', 'font-weight': '600',
2639
+ 'text-transform': 'uppercase', 'letter-spacing': '0.04em'
2640
+ };
2641
+ rules['.bw-table caption'] = { 'padding': '0.5rem 1rem', 'font-size': '0.875rem', 'caption-side': 'bottom' };
2642
+ rules['.bw-table-responsive'] = { 'overflow-x': 'auto', '-webkit-overflow-scrolling': 'touch' };
2643
+
2644
+ // Alerts (structural)
2645
+ rules['.bw-alert'] = {
2646
+ 'position': 'relative', 'padding': '0.875rem 1.25rem', 'margin-bottom': '1rem',
2647
+ 'border': '1px solid transparent', 'border-radius': '8px',
2648
+ 'font-size': '0.9375rem', 'line-height': '1.6'
2649
+ };
2650
+ rules['.bw-alert-heading, .alert-heading'] = { 'color': 'inherit' };
2651
+ rules['.bw-alert-link, .alert-link'] = { 'font-weight': '700' };
2652
+ rules['.bw-alert-dismissible'] = { 'padding-right': '3rem' };
2653
+ rules['.bw-alert-dismissible .btn-close'] = { 'position': 'absolute', 'top': '0', 'right': '0', 'z-index': '2', 'padding': '1.25rem 1rem' };
2654
+
2655
+ // Badges (structural)
2656
+ rules['.bw-badge'] = {
2657
+ 'display': 'inline-block', 'padding': '.35em .65em', 'font-size': '.75em',
2658
+ 'font-weight': '700', 'line-height': '1', 'text-align': 'center',
2659
+ 'white-space': 'nowrap', 'vertical-align': 'baseline', 'border-radius': '.375rem'
2660
+ };
2661
+ rules['.bw-badge:empty'] = { 'display': 'none' };
2662
+ rules['.bw-badge-pill'] = { 'border-radius': '50rem' };
2663
+
2664
+ // Progress (structural)
2665
+ rules['.bw-progress'] = { 'display': 'flex', 'height': '1.25rem', 'overflow': 'hidden', 'font-size': '.875rem', 'border-radius': '.5rem' };
2666
+ rules['.bw-progress-bar'] = {
2667
+ 'display': 'flex', 'flex-direction': 'column', 'justify-content': 'center',
2668
+ 'overflow': 'hidden', 'text-align': 'center', 'white-space': 'nowrap',
2669
+ 'transition': 'width .6s ease', 'font-weight': '600'
2670
+ };
2671
+ rules['.bw-progress-bar-striped'] = {
2672
+ '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)',
2673
+ 'background-size': '1rem 1rem'
2674
+ };
2675
+ rules['.bw-progress-bar-animated'] = { 'animation': 'progress-bar-stripes 1s linear infinite' };
2676
+ rules['@keyframes progress-bar-stripes'] = { '0%': { 'background-position-x': '1rem' } };
2677
+
2678
+ // Tabs (structural)
2679
+ rules['.bw-nav'] = { 'display': 'flex', 'flex-wrap': 'wrap', 'padding-left': '0', 'margin-bottom': '0', 'list-style': 'none', 'gap': '0' };
2680
+ rules['.bw-nav-item'] = { 'display': 'block' };
2681
+ rules['.bw-nav-tabs .bw-nav-item'] = { 'margin-bottom': '-2px' };
2682
+ rules['.bw-nav-link'] = {
2683
+ 'display': 'block', 'padding': '0.625rem 1rem', 'font-size': '0.875rem',
2684
+ 'font-weight': '500', 'text-decoration': 'none', 'cursor': 'pointer',
2685
+ 'border': 'none', 'background': 'transparent',
2686
+ 'transition': 'color 0.15s, border-color 0.15s', 'font-family': 'inherit'
2687
+ };
2688
+ rules['.bw-nav-tabs .bw-nav-link'] = { 'border': 'none', 'border-bottom': '2px solid transparent', 'border-radius': '0', 'background-color': 'transparent' };
2689
+ rules['.bw-nav-pills .bw-nav-link'] = { 'border-radius': '6px' };
2690
+ rules['.bw-nav-vertical'] = { 'flex-direction': 'column' };
2691
+ rules['.bw-tab-content'] = { 'padding': '1.25rem 0' };
2692
+ rules['.bw-tab-pane'] = { 'display': 'none' };
2693
+ rules['.bw-tab-pane.active'] = { 'display': 'block' };
2694
+
2695
+ // List groups (structural)
2696
+ rules['.bw-list-group'] = { 'display': 'flex', 'flex-direction': 'column', 'padding-left': '0', 'margin-bottom': '0', 'border-radius': '0.375rem' };
2697
+ rules['.bw-list-group-item'] = { 'position': 'relative', 'display': 'block', 'padding': '0.75rem 1.25rem', 'text-decoration': 'none', 'font-size': '0.9375rem' };
2698
+ rules['.bw-list-group-item:first-child'] = { 'border-top-left-radius': 'inherit', 'border-top-right-radius': 'inherit' };
2699
+ rules['.bw-list-group-item:last-child'] = { 'border-bottom-right-radius': 'inherit', 'border-bottom-left-radius': 'inherit' };
2700
+ rules['.bw-list-group-item + .bw-list-group-item'] = { 'border-top-width': '0' };
2701
+ rules['.bw-list-group-item.disabled'] = { 'pointer-events': 'none' };
2702
+ rules['a.bw-list-group-item'] = { 'cursor': 'pointer' };
2703
+ rules['.bw-list-group-flush'] = { 'border-radius': '0' };
2704
+ rules['.bw-list-group-flush > .bw-list-group-item'] = { 'border-width': '0 0 1px', 'border-radius': '0' };
2705
+ rules['.bw-list-group-flush > .bw-list-group-item:last-child'] = { 'border-bottom-width': '0' };
2706
+
2707
+ // Pagination (structural)
2708
+ rules['.bw-pagination'] = { 'display': 'flex', 'padding-left': '0', 'list-style': 'none', 'margin-bottom': '0' };
2709
+ rules['.bw-page-item'] = { 'display': 'list-item', 'list-style': 'none' };
2710
+ rules['.bw-page-link'] = {
2711
+ 'position': 'relative', 'display': 'block', 'padding': '0.375rem 0.75rem',
2712
+ 'margin-left': '-1px', 'line-height': '1.25', 'text-decoration': 'none',
2713
+ 'transition': 'color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out'
2714
+ };
2715
+ rules['.bw-page-item:first-child .bw-page-link'] = { 'margin-left': '0', 'border-top-left-radius': '0.375rem', 'border-bottom-left-radius': '0.375rem' };
2716
+ rules['.bw-page-item:last-child .bw-page-link'] = { 'border-top-right-radius': '0.375rem', 'border-bottom-right-radius': '0.375rem' };
2717
+
2718
+ // Breadcrumb (structural)
2719
+ rules['.bw-breadcrumb'] = { 'display': 'flex', 'flex-wrap': 'wrap', 'padding': '0 0', 'margin-bottom': '1rem', 'list-style': 'none' };
2720
+ rules['.bw-breadcrumb-item'] = { 'display': 'flex' };
2721
+ rules['.bw-breadcrumb-item + .bw-breadcrumb-item'] = { 'padding-left': '0.5rem' };
2722
+ rules['.bw-breadcrumb-item + .bw-breadcrumb-item::before'] = { 'float': 'left', 'padding-right': '0.5rem', 'content': '"/"' };
2723
+
2724
+ // Hero (structural)
2725
+ rules['.bw-hero'] = { 'position': 'relative', 'overflow': 'hidden' };
2726
+ rules['.bw-hero-overlay'] = { 'position': 'absolute', 'top': '0', 'left': '0', 'right': '0', 'bottom': '0', 'z-index': '1' };
2727
+ rules['.bw-hero-content'] = { 'position': 'relative', 'z-index': '2' };
2728
+ rules['.bw-hero-title'] = { 'font-weight': '300', 'letter-spacing': '-0.05rem' };
2729
+ rules['.bw-hero-actions'] = { 'display': 'flex', 'gap': '1rem', 'justify-content': 'center', 'flex-wrap': 'wrap' };
2730
+ rules['.bw-display-4'] = { 'font-size': 'calc(1.475rem + 2.7vw)', 'font-weight': '300', 'line-height': '1.2' };
2731
+ rules['.bw-lead'] = { 'font-size': '1.25rem', 'font-weight': '300' };
2732
+
2733
+ // Features (structural)
2734
+ rules['.bw-feature'] = { 'padding': '1rem' };
2735
+ rules['.bw-feature-icon'] = { 'display': 'inline-block', 'margin-bottom': '1rem' };
2736
+ rules['.bw-feature-title'] = { 'margin-bottom': '0.5rem' };
2737
+ rules['.bw-feature-grid'] = { 'width': '100%' };
2738
+ rules['.bw-g-4'] = { '--bw-gutter-x': '1.5rem', '--bw-gutter-y': '1.5rem' };
2739
+
2740
+ // Sections (structural)
2741
+ rules['.bw-section'] = { 'position': 'relative' };
2742
+ rules['.bw-section-header'] = { 'margin-bottom': '3rem' };
2743
+ rules['.bw-section-title'] = { 'margin-bottom': '1rem', 'font-weight': '300', 'font-size': 'calc(1.325rem + .9vw)' };
2744
+
2745
+ // CTA (structural)
2746
+ rules['.bw-cta'] = { 'position': 'relative' };
2747
+ rules['.bw-cta-content'] = { 'max-width': '48rem', 'margin': '0 auto' };
2748
+ rules['.bw-cta-title'] = { 'font-weight': '300' };
2749
+ rules['.bw-cta-actions'] = { 'display': 'flex', 'gap': '1rem', 'justify-content': 'center', 'flex-wrap': 'wrap' };
2750
+
2751
+ // Spinner (structural)
2752
+ rules['.bw-spinner-border'] = {
2753
+ 'display': 'inline-block', 'width': '2rem', 'height': '2rem',
2754
+ 'vertical-align': '-0.125em', 'border': '0.25em solid currentcolor',
2755
+ 'border-right-color': 'transparent', 'border-radius': '50%',
2756
+ 'animation': 'bw-spinner-border 0.75s linear infinite'
2757
+ };
2758
+ rules['.bw-spinner-border-sm'] = { 'width': '1rem', 'height': '1rem', 'border-width': '0.2em' };
2759
+ rules['.bw-spinner-border-lg'] = { 'width': '3rem', 'height': '3rem', 'border-width': '0.3em' };
2760
+ rules['.bw-spinner-grow'] = {
2761
+ 'display': 'inline-block', 'width': '2rem', 'height': '2rem',
2762
+ 'vertical-align': '-0.125em', 'border-radius': '50%', 'opacity': '0',
2763
+ 'animation': 'bw-spinner-grow 0.75s linear infinite'
2764
+ };
2765
+ rules['.bw-spinner-grow-sm'] = { 'width': '1rem', 'height': '1rem' };
2766
+ rules['.bw-spinner-grow-lg'] = { 'width': '3rem', 'height': '3rem' };
2767
+ rules['@keyframes bw-spinner-border'] = { '100%': { 'transform': 'rotate(360deg)' } };
2768
+ rules['@keyframes bw-spinner-grow'] = { '0%': { 'transform': 'scale(0)' }, '50%': { 'opacity': '1', 'transform': 'none' } };
2769
+ rules['.bw-visually-hidden'] = {
2770
+ 'position': 'absolute', 'width': '1px', 'height': '1px', 'padding': '0',
2771
+ 'margin': '-1px', 'overflow': 'hidden', 'clip': 'rect(0, 0, 0, 0)',
2772
+ 'white-space': 'nowrap', 'border': '0'
2773
+ };
2774
+
2775
+ // Close button (structural)
2776
+ rules['.bw-close'] = {
2777
+ 'display': 'inline-flex', 'align-items': 'center', 'justify-content': 'center',
2778
+ 'width': '1.5rem', 'height': '1.5rem', 'padding': '0',
2779
+ 'font-size': '1.25rem', 'font-weight': '700', 'line-height': '1',
2780
+ 'background': 'transparent', 'border': '0', 'border-radius': '0.25rem',
2781
+ 'cursor': 'pointer'
2782
+ };
2783
+
2784
+ // Stacks (structural)
2785
+ rules['.bw-vstack'] = { 'display': 'flex', 'flex-direction': 'column' };
2786
+ rules['.bw-hstack'] = { 'display': 'flex', 'flex-direction': 'row', 'align-items': 'center' };
2787
+ rules['.bw-gap-0'] = { 'gap': '0' };
2788
+ rules['.bw-gap-1'] = { 'gap': '0.25rem' };
2789
+ rules['.bw-gap-2'] = { 'gap': '0.5rem' };
2790
+ rules['.bw-gap-3'] = { 'gap': '1rem' };
2791
+ rules['.bw-gap-4'] = { 'gap': '1.5rem' };
2792
+ rules['.bw-gap-5'] = { 'gap': '3rem' };
2793
+
2794
+ // Offsets (structural)
2795
+ for (var i = 1; i <= 11; i++) {
2796
+ rules['.bw-offset-' + i] = { 'margin-left': ((i / 12) * 100).toFixed(6).replace(/\.?0+$/, '') + '%' };
2797
+ }
2798
+
2799
+ // Code demo (structural)
2800
+ rules['.bw-code-demo'] = { 'margin-bottom': '2rem' };
2801
+
2802
+ // Spacing utilities (structural)
2803
+ var spacingValues = { '0': '0', '1': '.25rem', '2': '.5rem', '3': '1rem', '4': '1.5rem', '5': '3rem' };
2804
+ for (var k in spacingValues) {
2805
+ var v = spacingValues[k];
2806
+ rules['.bw-m-' + k] = { 'margin': v + ' !important' };
2807
+ rules['.bw-mt-' + k] = { 'margin-top': v + ' !important' };
2808
+ rules['.bw-mb-' + k] = { 'margin-bottom': v + ' !important' };
2809
+ rules['.bw-ms-' + k] = { 'margin-left': v + ' !important' };
2810
+ rules['.bw-me-' + k] = { 'margin-right': v + ' !important' };
2811
+ rules['.bw-p-' + k] = { 'padding': v + ' !important' };
2812
+ rules['.bw-pt-' + k + ', .pt-' + k] = { 'padding-top': v + ' !important' };
2813
+ rules['.bw-pb-' + k + ', .pb-' + k] = { 'padding-bottom': v + ' !important' };
2814
+ rules['.bw-ps-' + k + ', .ps-' + k] = { 'padding-left': v + ' !important' };
2815
+ rules['.bw-pe-' + k + ', .pe-' + k] = { 'padding-right': v + ' !important' };
2816
+ }
2817
+ rules['.bw-m-auto, .m-auto'] = { 'margin': 'auto !important' };
2818
+ rules['.bw-py-3'] = { 'padding-top': '1rem !important', 'padding-bottom': '1rem !important' };
2819
+ rules['.bw-py-4'] = { 'padding-top': '1.5rem !important', 'padding-bottom': '1.5rem !important' };
2820
+ rules['.bw-py-5'] = { 'padding-top': '3rem !important', 'padding-bottom': '3rem !important' };
2821
+ rules['.bw-py-6'] = { 'padding-top': '4rem !important', 'padding-bottom': '4rem !important' };
2822
+
2823
+ // Display utilities (structural)
2824
+ rules['.bw-d-none'] = { 'display': 'none' };
2825
+ rules['.bw-d-block'] = { 'display': 'block' };
2826
+ rules['.bw-d-inline'] = { 'display': 'inline' };
2827
+ rules['.bw-d-inline-block'] = { 'display': 'inline-block' };
2828
+ rules['.bw-d-flex'] = { 'display': 'flex' };
2829
+ rules['.bw-text-left'] = { 'text-align': 'left' };
2830
+ rules['.bw-text-right'] = { 'text-align': 'right' };
2831
+ rules['.bw-text-center'] = { 'text-align': 'center' };
2832
+
2833
+ // Flexbox utilities (structural)
2834
+ var jc = { start: 'flex-start', end: 'flex-end', center: 'center', between: 'space-between', around: 'space-around' };
2835
+ for (var jk in jc) {
2836
+ rules['.bw-justify-content-' + jk + ', .justify-content-' + jk] = { 'justify-content': jc[jk] };
2837
+ }
2838
+ var ai = { start: 'flex-start', end: 'flex-end', center: 'center' };
2839
+ for (var ak in ai) {
2840
+ rules['.bw-align-items-' + ak + ', .align-items-' + ak] = { 'align-items': ai[ak] };
2841
+ }
2842
+
2843
+ // Size utilities (structural)
2844
+ ['25', '50', '75', '100'].forEach(function(n) {
2845
+ rules['.bw-w-' + n + ', .w-' + n] = { 'width': n + '% !important' };
2846
+ rules['.bw-h-' + n + ', .h-' + n] = { 'height': n + '% !important' };
2847
+ });
2848
+ rules['.bw-w-auto, .w-auto'] = { 'width': 'auto !important' };
2849
+ rules['.bw-h-auto, .h-auto'] = { 'height': 'auto !important' };
2850
+ rules['.bw-mw-100, .mw-100'] = { 'max-width': '100% !important' };
2851
+ rules['.bw-mh-100, .mh-100'] = { 'max-height': '100% !important' };
2852
+
2853
+ // Position utilities (structural)
2854
+ ['static', 'relative', 'absolute', 'fixed', 'sticky'].forEach(function(p) {
2855
+ rules['.bw-position-' + p + ', .position-' + p] = { 'position': p + ' !important' };
2856
+ });
2857
+ rules['.bw-translate-middle, .translate-middle'] = { 'transform': 'translate(-50%, -50%) !important' };
2858
+
2859
+ // Overflow utilities (structural)
2860
+ ['auto', 'hidden', 'visible', 'scroll'].forEach(function(o) {
2861
+ rules['.bw-overflow-' + o + ', .overflow-' + o] = { 'overflow': o + ' !important' };
2862
+ });
2863
+
2864
+ // Visibility utilities (structural)
2865
+ rules['.bw-visible, .visible'] = { 'visibility': 'visible !important' };
2866
+ rules['.bw-invisible, .invisible'] = { 'visibility': 'hidden !important' };
2867
+
2868
+ // User select utilities (structural)
2869
+ ['all', 'auto', 'none'].forEach(function(u) {
2870
+ rules['.bw-user-select-' + u + ', .user-select-' + u] = { 'user-select': u + ' !important' };
2871
+ });
2872
+
2873
+ // Pointer events
2874
+ rules['.pe-none'] = { 'pointer-events': 'none !important' };
2875
+ rules['.pe-auto'] = { 'pointer-events': 'auto !important' };
2876
+
2877
+ // Typography utilities (structural)
2878
+ rules['.fw-light'] = { 'font-weight': '300 !important' };
2879
+ rules['.fw-lighter'] = { 'font-weight': 'lighter !important' };
2880
+ rules['.fw-normal'] = { 'font-weight': '400 !important' };
2881
+ rules['.fw-bold'] = { 'font-weight': '700 !important' };
2882
+ rules['.fw-bolder'] = { 'font-weight': 'bolder !important' };
2883
+ rules['.fst-italic'] = { 'font-style': 'italic !important' };
2884
+ rules['.fst-normal'] = { 'font-style': 'normal !important' };
2885
+ rules['.text-decoration-none'] = { 'text-decoration': 'none !important' };
2886
+ rules['.text-decoration-underline'] = { 'text-decoration': 'underline !important' };
2887
+ rules['.text-decoration-line-through'] = { 'text-decoration': 'line-through !important' };
2888
+ rules['.text-lowercase'] = { 'text-transform': 'lowercase !important' };
2889
+ rules['.text-uppercase'] = { 'text-transform': 'uppercase !important' };
2890
+ rules['.text-capitalize'] = { 'text-transform': 'capitalize !important' };
2891
+ rules['.text-wrap'] = { 'white-space': 'normal !important' };
2892
+ rules['.text-nowrap'] = { 'white-space': 'nowrap !important' };
2893
+
2894
+ // Font-size utilities (structural)
2895
+ rules['.fs-1'] = { 'font-size': 'calc(1.375rem + 1.5vw) !important' };
2896
+ rules['.fs-2'] = { 'font-size': 'calc(1.325rem + .9vw) !important' };
2897
+ rules['.fs-3'] = { 'font-size': 'calc(1.3rem + .6vw) !important' };
2898
+ rules['.fs-4'] = { 'font-size': 'calc(1.275rem + .3vw) !important' };
2899
+ rules['.fs-5'] = { 'font-size': '1.25rem !important' };
2900
+ rules['.fs-6'] = { 'font-size': '1rem !important' };
2901
+
2902
+ // List utilities (structural)
2903
+ rules['.list-unstyled'] = { 'padding-left': '0', 'list-style': 'none' };
2904
+ rules['.list-inline'] = { 'padding-left': '0', 'list-style': 'none' };
2905
+ rules['.list-inline-item'] = { 'display': 'inline-block' };
2906
+ rules['.list-inline-item:not(:last-child)'] = { 'margin-right': '.5rem' };
2907
+
2908
+ // Opacity utilities (structural)
2909
+ rules['.opacity-0'] = { 'opacity': '0 !important' };
2910
+ rules['.opacity-25'] = { 'opacity': '.25 !important' };
2911
+ rules['.opacity-50'] = { 'opacity': '.5 !important' };
2912
+ rules['.opacity-75'] = { 'opacity': '.75 !important' };
2913
+ rules['.opacity-100'] = { 'opacity': '1 !important' };
2914
+
2915
+ // Responsive grid
2916
+ Object.assign(rules, defaultStyles.responsive);
2917
+
2918
+ return addUnderscoreAliases(rules);
2919
+ }
2920
+
2921
+ // =========================================================================
2922
+ // getAllStyles — backwards compatible
2923
+ // =========================================================================
2924
+
2925
+ /**
2926
+ * Add underscore aliases for all bw- selectors
2927
+ * @param {Object} rules - CSS rules object
2928
+ * @returns {Object} - Rules with underscore aliases added
2929
+ */
2930
+ export function addUnderscoreAliases(rules) {
2931
+ const result = {};
2932
+ for (const [selector, styles] of Object.entries(rules)) {
2933
+ result[selector] = styles;
2934
+ if (selector.includes('.bw-')) {
2935
+ const underscoreSelector = selector.replace(/\.bw-/g, '.bw_');
2936
+ result[underscoreSelector] = styles;
2937
+ }
2938
+ }
2939
+ return result;
2940
+ }
2941
+
2942
+ export function getAllStyles() {
2943
+ const merged = Object.assign({},
2944
+ defaultStyles.root,
2945
+ defaultStyles.reset,
2946
+ defaultStyles.typography,
2947
+ defaultStyles.grid,
2948
+ defaultStyles.buttons,
2949
+ defaultStyles.cards,
2950
+ defaultStyles.forms,
2951
+ defaultStyles.formChecks,
2952
+ defaultStyles.navigation,
2953
+ defaultStyles.tables,
2954
+ defaultStyles.tableResponsive,
2955
+ defaultStyles.alerts,
2956
+ defaultStyles.badges,
2957
+ defaultStyles.progress,
2958
+ defaultStyles.tabs,
2959
+ defaultStyles.listGroups,
2960
+ defaultStyles.pagination,
2961
+ defaultStyles.breadcrumb,
2962
+ defaultStyles.hero,
2963
+ defaultStyles.features,
2964
+ defaultStyles.enhancedCards,
2965
+ defaultStyles.sections,
2966
+ defaultStyles.cta,
2967
+ defaultStyles.spinner,
2968
+ defaultStyles.closeButton,
2969
+ defaultStyles.stacks,
2970
+ defaultStyles.offsets,
2971
+ defaultStyles.codeDemo,
2972
+ defaultStyles.utilities,
2973
+ defaultStyles.responsive
2974
+ );
2975
+ return addUnderscoreAliases(merged);
2976
+ }
2977
+
2978
+ // =========================================================================
2979
+ // Theme tokens (backwards compatible)
2980
+ // =========================================================================
2981
+
2982
+ export let theme = {
2983
+ colors: {
2984
+ primary: '#006666',
2985
+ secondary: '#6c757d',
2986
+ success: '#198754',
2987
+ danger: '#dc3545',
2988
+ warning: '#ffc107',
2989
+ info: '#0dcaf0',
2990
+ light: '#f8f9fa',
2991
+ dark: '#212529',
2992
+ white: '#fff',
2993
+ black: '#000'
2994
+ },
2995
+ breakpoints: {
2996
+ xs: 0,
2997
+ sm: 576,
2998
+ md: 768,
2999
+ lg: 992,
3000
+ xl: 1200,
3001
+ xxl: 1400
3002
+ },
3003
+ spacing: {
3004
+ 0: '0',
3005
+ 1: '0.25rem',
3006
+ 2: '0.5rem',
3007
+ 3: '1rem',
3008
+ 4: '1.5rem',
3009
+ 5: '3rem'
3010
+ },
3011
+ typography: {
3012
+ fontFamily: 'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif',
3013
+ fontSize: {
3014
+ xs: '0.75rem',
3015
+ sm: '0.875rem',
3016
+ base: '1rem',
3017
+ lg: '1.125rem',
3018
+ xl: '1.25rem',
3019
+ '2xl': '1.5rem',
3020
+ '3xl': '1.875rem',
3021
+ '4xl': '2.25rem',
3022
+ '5xl': '3rem'
3023
+ }
3024
+ },
3025
+ darkMode: false
3026
+ };
3027
+
3028
+ export const darkModeColors = {
3029
+ '--bw-body-color': '#e9ecef',
3030
+ '--bw-body-bg': '#1a1a2e',
3031
+ '--bw-border-color': '#495057',
3032
+ '--bw-gray-100': '#212529',
3033
+ '--bw-gray-200': '#343a40',
3034
+ '--bw-gray-300': '#495057',
3035
+ '--bw-gray-800': '#e9ecef',
3036
+ '--bw-gray-900': '#f8f9fa'
3037
+ };
3038
+
3039
+ /**
3040
+ * Generate theme-aware dark mode CSS from a palette.
3041
+ * Derives dark variants from the palette colors instead of using hardcoded values.
3042
+ *
3043
+ * @param {Object} palette - From derivePalette()
3044
+ * @returns {Object} CSS rules object for dark mode
3045
+ */
3046
+ export function generateDarkModeCSS(palette) {
3047
+ var darkBg = adjustLightness(palette.primary.base, -15);
3048
+ var darkBgHsl = hexToHsl(darkBg);
3049
+ // Make it very dark (lightness 8-12%)
3050
+ var bodyBg = hslToHex([darkBgHsl[0], Math.min(darkBgHsl[1], 30), 10]);
3051
+ var surfaceBg = hslToHex([darkBgHsl[0], Math.min(darkBgHsl[1], 25), 15]);
3052
+ var textColor = adjustLightness(palette.light.base, 5);
3053
+ var borderColor = hslToHex([darkBgHsl[0], Math.min(darkBgHsl[1], 15), 30]);
3054
+
3055
+ return {
3056
+ ':root.bw-dark': {
3057
+ '--bw-body-color': textColor,
3058
+ '--bw-body-bg': bodyBg
3059
+ },
3060
+ '.bw-dark body, :root.bw-dark body': {
3061
+ 'color': textColor,
3062
+ 'background-color': bodyBg
3063
+ },
3064
+ '.bw-dark .bw-card': {
3065
+ 'background-color': surfaceBg,
3066
+ 'border-color': borderColor,
3067
+ 'color': textColor
3068
+ },
3069
+ '.bw-dark .bw-card-header': {
3070
+ 'background-color': bodyBg,
3071
+ 'border-bottom-color': borderColor,
3072
+ 'color': textColor
3073
+ },
3074
+ '.bw-dark .bw-card-footer': {
3075
+ 'background-color': bodyBg,
3076
+ 'border-top-color': borderColor,
3077
+ 'color': textColor
3078
+ },
3079
+ '.bw-dark .bw-card-title': {
3080
+ 'color': textColor
3081
+ },
3082
+ '.bw-dark .bw-navbar': {
3083
+ 'background-color': surfaceBg,
3084
+ 'border-bottom-color': borderColor
3085
+ },
3086
+ '.bw-dark .bw-navbar-brand': {
3087
+ 'color': textColor
3088
+ },
3089
+ '.bw-dark .bw-navbar-nav .bw-nav-link': {
3090
+ 'color': adjustLightness(textColor, -15)
3091
+ },
3092
+ '.bw-dark .bw-navbar-nav .bw-nav-link:hover': {
3093
+ 'color': textColor
3094
+ },
3095
+ '.bw-dark .bw-form-control': {
3096
+ 'background-color': surfaceBg,
3097
+ 'border-color': borderColor,
3098
+ 'color': textColor
3099
+ },
3100
+ '.bw-dark .bw-form-label': {
3101
+ 'color': textColor
3102
+ },
3103
+ '.bw-dark .bw-form-text': {
3104
+ 'color': adjustLightness(textColor, -20)
3105
+ },
3106
+ '.bw-dark .bw-table': {
3107
+ 'color': textColor
3108
+ },
3109
+ '.bw-dark .bw-table > :not(caption) > * > *': {
3110
+ 'border-bottom-color': borderColor
3111
+ },
3112
+ '.bw-dark .bw-table > thead > tr > *': {
3113
+ 'background-color': bodyBg,
3114
+ 'color': adjustLightness(textColor, -10),
3115
+ 'border-bottom-color': borderColor
3116
+ },
3117
+ '.bw-dark .bw-table-striped > tbody > tr:nth-of-type(odd) > *': {
3118
+ 'background-color': 'rgba(255, 255, 255, 0.05)'
3119
+ },
3120
+ '.bw-dark .bw-alert': {
3121
+ 'border-color': borderColor
3122
+ },
3123
+ '.bw-dark .bw-list-group-item': {
3124
+ 'background-color': surfaceBg,
3125
+ 'border-color': borderColor,
3126
+ 'color': textColor
3127
+ },
3128
+ '.bw-dark .bw-badge': {
3129
+ 'color': textColor
3130
+ },
3131
+ '.bw-dark .bw-nav-tabs': {
3132
+ 'border-bottom-color': borderColor
3133
+ },
3134
+ '.bw-dark .bw-nav-link': {
3135
+ 'color': adjustLightness(textColor, -15)
3136
+ },
3137
+ '.bw-dark .bw-nav-tabs .bw-nav-link:hover': {
3138
+ 'color': textColor,
3139
+ 'border-bottom-color': borderColor
3140
+ },
3141
+ '.bw-dark .bw-pagination .bw-page-link': {
3142
+ 'background-color': surfaceBg,
3143
+ 'border-color': borderColor,
3144
+ 'color': textColor
3145
+ },
3146
+ '.bw-dark .bw-breadcrumb-item + .bw-breadcrumb-item::before': {
3147
+ 'color': adjustLightness(textColor, -20)
3148
+ },
3149
+ '.bw-dark .bw-breadcrumb-item.active': {
3150
+ 'color': adjustLightness(textColor, -10)
3151
+ },
3152
+ '.bw-dark .bw-hero-light': {
3153
+ 'background': surfaceBg,
3154
+ 'color': textColor
3155
+ },
3156
+ '.bw-dark .bw-progress': {
3157
+ 'background-color': surfaceBg
3158
+ },
3159
+ '.bw-dark .bw-section-subtitle': {
3160
+ 'color': adjustLightness(textColor, -15)
3161
+ },
3162
+ '.bw-dark .bw-close': {
3163
+ 'color': textColor
3164
+ },
3165
+ '.bw-dark h1, .bw-dark h2, .bw-dark h3, .bw-dark h4, .bw-dark h5, .bw-dark h6': {
3166
+ 'color': textColor
3167
+ },
3168
+ '@media (prefers-color-scheme: dark)': {
3169
+ ':root.bw-auto-dark body': {
3170
+ 'color': textColor,
3171
+ 'background-color': bodyBg
3172
+ }
3173
+ }
3174
+ };
3175
+ }
3176
+
3177
+ export function getDarkModeStyles() {
3178
+ return {
3179
+ ':root.bw-dark': {
3180
+ '--bw-body-color': '#e9ecef',
3181
+ '--bw-body-bg': '#1a1a2e'
3182
+ },
3183
+ '.bw-dark body, :root.bw-dark body': {
3184
+ 'color': '#e9ecef',
3185
+ 'background-color': '#1a1a2e'
3186
+ },
3187
+ '.bw-dark .bw-card': {
3188
+ 'background-color': '#16213e',
3189
+ 'border-color': '#495057',
3190
+ 'color': '#e9ecef'
3191
+ },
3192
+ '.bw-dark .bw-navbar': {
3193
+ 'background-color': '#0f3460'
3194
+ },
3195
+ '.bw-dark .bw-form-control': {
3196
+ 'background-color': '#16213e',
3197
+ 'border-color': '#495057',
3198
+ 'color': '#e9ecef'
3199
+ },
3200
+ '.bw-dark .bw-table': {
3201
+ 'color': '#e9ecef'
3202
+ },
3203
+ '.bw-dark .bw-table > :not(caption) > * > *': {
3204
+ 'border-bottom-color': '#495057'
3205
+ },
3206
+ '.bw-dark .bw-table-striped > tbody > tr:nth-of-type(odd) > *': {
3207
+ 'background-color': 'rgba(255, 255, 255, 0.05)'
3208
+ },
3209
+ '.bw-dark .bw-alert': {
3210
+ 'border-color': '#495057'
3211
+ },
3212
+ '.bw-dark .bw-list-group-item': {
3213
+ 'background-color': '#16213e',
3214
+ 'border-color': '#495057',
3215
+ 'color': '#e9ecef'
3216
+ },
3217
+ '@media (prefers-color-scheme: dark)': {
3218
+ ':root.bw-auto-dark body': {
3219
+ 'color': '#e9ecef',
3220
+ 'background-color': '#1a1a2e'
3221
+ }
3222
+ }
3223
+ };
3224
+ }
3225
+
3226
+ export function deepMerge(target, source) {
3227
+ for (const key of Object.keys(source)) {
3228
+ if (source[key] && typeof source[key] === 'object' && !Array.isArray(source[key])
3229
+ && target[key] && typeof target[key] === 'object' && !Array.isArray(target[key])) {
3230
+ deepMerge(target[key], source[key]);
3231
+ } else {
3232
+ target[key] = source[key];
3233
+ }
3234
+ }
3235
+ return target;
3236
+ }
3237
+
3238
+ export function updateTheme(overrides) {
3239
+ deepMerge(theme, overrides);
3240
+ }