web-mojo 2.1.46

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 (91) hide show
  1. package/LICENSE +198 -0
  2. package/README.md +510 -0
  3. package/dist/admin.cjs.js +2 -0
  4. package/dist/admin.cjs.js.map +1 -0
  5. package/dist/admin.css +621 -0
  6. package/dist/admin.es.js +7973 -0
  7. package/dist/admin.es.js.map +1 -0
  8. package/dist/auth.cjs.js +2 -0
  9. package/dist/auth.cjs.js.map +1 -0
  10. package/dist/auth.css +804 -0
  11. package/dist/auth.es.js +2168 -0
  12. package/dist/auth.es.js.map +1 -0
  13. package/dist/charts.cjs.js +2 -0
  14. package/dist/charts.cjs.js.map +1 -0
  15. package/dist/charts.css +1002 -0
  16. package/dist/charts.es.js +16 -0
  17. package/dist/charts.es.js.map +1 -0
  18. package/dist/chunks/ContextMenu-BrHqj0fn.js +80 -0
  19. package/dist/chunks/ContextMenu-BrHqj0fn.js.map +1 -0
  20. package/dist/chunks/ContextMenu-gEcpSz56.js +2 -0
  21. package/dist/chunks/ContextMenu-gEcpSz56.js.map +1 -0
  22. package/dist/chunks/DataView-DPryYpEW.js +2 -0
  23. package/dist/chunks/DataView-DPryYpEW.js.map +1 -0
  24. package/dist/chunks/DataView-DjZQrpba.js +843 -0
  25. package/dist/chunks/DataView-DjZQrpba.js.map +1 -0
  26. package/dist/chunks/Dialog-BsRx4eg3.js +2 -0
  27. package/dist/chunks/Dialog-BsRx4eg3.js.map +1 -0
  28. package/dist/chunks/Dialog-DSlctbon.js +1377 -0
  29. package/dist/chunks/Dialog-DSlctbon.js.map +1 -0
  30. package/dist/chunks/FilePreviewView-BmFHzK5K.js +5868 -0
  31. package/dist/chunks/FilePreviewView-BmFHzK5K.js.map +1 -0
  32. package/dist/chunks/FilePreviewView-DcdRl_ta.js +2 -0
  33. package/dist/chunks/FilePreviewView-DcdRl_ta.js.map +1 -0
  34. package/dist/chunks/FormView-CmBuwKGD.js +2 -0
  35. package/dist/chunks/FormView-CmBuwKGD.js.map +1 -0
  36. package/dist/chunks/FormView-DqUBMPJ9.js +5054 -0
  37. package/dist/chunks/FormView-DqUBMPJ9.js.map +1 -0
  38. package/dist/chunks/MetricsChart-CM4CI6eA.js +2095 -0
  39. package/dist/chunks/MetricsChart-CM4CI6eA.js.map +1 -0
  40. package/dist/chunks/MetricsChart-CPidSMaN.js +2 -0
  41. package/dist/chunks/MetricsChart-CPidSMaN.js.map +1 -0
  42. package/dist/chunks/PDFViewer-BNQlnS83.js +2 -0
  43. package/dist/chunks/PDFViewer-BNQlnS83.js.map +1 -0
  44. package/dist/chunks/PDFViewer-Dyo-Oeyd.js +946 -0
  45. package/dist/chunks/PDFViewer-Dyo-Oeyd.js.map +1 -0
  46. package/dist/chunks/Page-B524zSQs.js +351 -0
  47. package/dist/chunks/Page-B524zSQs.js.map +1 -0
  48. package/dist/chunks/Page-BFgj0pAA.js +2 -0
  49. package/dist/chunks/Page-BFgj0pAA.js.map +1 -0
  50. package/dist/chunks/TokenManager-BXNva8Jk.js +287 -0
  51. package/dist/chunks/TokenManager-BXNva8Jk.js.map +1 -0
  52. package/dist/chunks/TokenManager-Bzn4guFm.js +2 -0
  53. package/dist/chunks/TokenManager-Bzn4guFm.js.map +1 -0
  54. package/dist/chunks/TopNav-D3I3_25f.js +371 -0
  55. package/dist/chunks/TopNav-D3I3_25f.js.map +1 -0
  56. package/dist/chunks/TopNav-MDjL4kV0.js +2 -0
  57. package/dist/chunks/TopNav-MDjL4kV0.js.map +1 -0
  58. package/dist/chunks/User-BalfYTEF.js +3 -0
  59. package/dist/chunks/User-BalfYTEF.js.map +1 -0
  60. package/dist/chunks/User-DwIT-CTQ.js +1937 -0
  61. package/dist/chunks/User-DwIT-CTQ.js.map +1 -0
  62. package/dist/chunks/WebApp-B6mgbNn2.js +4767 -0
  63. package/dist/chunks/WebApp-B6mgbNn2.js.map +1 -0
  64. package/dist/chunks/WebApp-DqDowtkl.js +2 -0
  65. package/dist/chunks/WebApp-DqDowtkl.js.map +1 -0
  66. package/dist/chunks/WebSocketClient-D6i85jl2.js +2 -0
  67. package/dist/chunks/WebSocketClient-D6i85jl2.js.map +1 -0
  68. package/dist/chunks/WebSocketClient-Dvl3AYx1.js +297 -0
  69. package/dist/chunks/WebSocketClient-Dvl3AYx1.js.map +1 -0
  70. package/dist/core.css +1181 -0
  71. package/dist/css/web-mojo.css +17 -0
  72. package/dist/css-manifest.json +6 -0
  73. package/dist/docit.cjs.js +2 -0
  74. package/dist/docit.cjs.js.map +1 -0
  75. package/dist/docit.es.js +959 -0
  76. package/dist/docit.es.js.map +1 -0
  77. package/dist/index.cjs.js +2 -0
  78. package/dist/index.cjs.js.map +1 -0
  79. package/dist/index.es.js +2681 -0
  80. package/dist/index.es.js.map +1 -0
  81. package/dist/lightbox.cjs.js +2 -0
  82. package/dist/lightbox.cjs.js.map +1 -0
  83. package/dist/lightbox.css +606 -0
  84. package/dist/lightbox.es.js +3737 -0
  85. package/dist/lightbox.es.js.map +1 -0
  86. package/dist/loader.es.js +115 -0
  87. package/dist/loader.umd.js +85 -0
  88. package/dist/portal.css +2446 -0
  89. package/dist/table.css +639 -0
  90. package/dist/toast.css +181 -0
  91. package/package.json +179 -0
package/dist/core.css ADDED
@@ -0,0 +1,1181 @@
1
+ /**
2
+ * MOJO Framework Core Styles
3
+ * Essential utilities and animations for MOJO framework
4
+ * Version: 2.0.0
5
+ *
6
+ * Note: This file contains only core MOJO utilities not provided by Bootstrap 5.
7
+ * Bootstrap 5 is required as a dependency for base styles.
8
+ */
9
+
10
+ /* ========================================================================
11
+ MOJO CSS Custom Properties
12
+ ======================================================================== */
13
+
14
+ :root {
15
+ /* === Core Theme Colors === */
16
+ --bs-primary: #1a73e8;
17
+ --bs-secondary: #5f6368;
18
+ --bs-success: #34a853;
19
+ --bs-info: #4285f4;
20
+ --bs-warning: #fbbc05;
21
+ --bs-danger: #ea4335;
22
+ --bs-light: #f1f3f4;
23
+ --bs-dark: #202124;
24
+
25
+ /* === Subtle Backgrounds === */
26
+ --bs-primary-bg-subtle: #e8f0fe;
27
+ --bs-secondary-bg-subtle: #f1f3f4;
28
+ --bs-success-bg-subtle: #e6f4ea;
29
+ --bs-info-bg-subtle: #e8f0fe;
30
+ --bs-warning-bg-subtle: #fef7e0;
31
+ --bs-danger-bg-subtle: #fce8e6;
32
+
33
+ /* === Subtle Borders === */
34
+ --bs-primary-border-subtle: #aecbfa;
35
+ --bs-secondary-border-subtle: #dadce0;
36
+ --bs-success-border-subtle: #81c995;
37
+ --bs-info-border-subtle: #aecbfa;
38
+ --bs-warning-border-subtle: #fad2cf;
39
+ --bs-danger-border-subtle: #f28b82;
40
+
41
+ /* === Text Emphasis === */
42
+ --bs-primary-text-emphasis: #174ea6;
43
+ --bs-secondary-text-emphasis: #3c4043;
44
+ --bs-success-text-emphasis: #0d652d;
45
+ --bs-info-text-emphasis: #174ea6;
46
+ --bs-warning-text-emphasis: #b06000;
47
+ --bs-danger-text-emphasis: #a50e0e;
48
+
49
+ --bs-btn-hover-bg: #e8f0fe;
50
+ }
51
+
52
+ :root[data-bs-theme="ocean"] {
53
+ --bs-primary: #0077b6;
54
+ --bs-secondary: #90e0ef;
55
+ --bs-success: #00b4d8;
56
+ --bs-info: #48cae4;
57
+ --bs-warning: #ffd166;
58
+ --bs-danger: #ef476f;
59
+ --bs-light: #f1faff;
60
+ --bs-dark: #03045e;
61
+
62
+ --bs-primary-bg-subtle: #caf0f8;
63
+ --bs-secondary-bg-subtle: #e0fbfc;
64
+ --bs-success-bg-subtle: #ade8f4;
65
+ --bs-info-bg-subtle: #caf0f8;
66
+ --bs-warning-bg-subtle: #fff3cd;
67
+ --bs-danger-bg-subtle: #fde2e4;
68
+
69
+ --bs-primary-text-emphasis: #023e8a;
70
+ --bs-success-text-emphasis: #0077b6;
71
+ --bs-danger-text-emphasis: #9d0208;
72
+ }
73
+
74
+ :root[data-bs-theme="sunrise"] {
75
+ --bs-primary: #ff6f00;
76
+ --bs-secondary: #ffb703;
77
+ --bs-success: #fb8500;
78
+ --bs-info: #ffb4a2;
79
+ --bs-warning: #ffd166;
80
+ --bs-danger: #e63946;
81
+ --bs-light: #fff3e6;
82
+ --bs-dark: #432818;
83
+
84
+ --bs-primary-bg-subtle: #fff4e1;
85
+ --bs-secondary-bg-subtle: #fff8dc;
86
+ --bs-success-bg-subtle: #ffe5b4;
87
+ --bs-info-bg-subtle: #ffe0d9;
88
+ --bs-warning-bg-subtle: #fff7d6;
89
+ --bs-danger-bg-subtle: #fddede;
90
+
91
+ --bs-primary-text-emphasis: #9d4b00;
92
+ --bs-success-text-emphasis: #a85d00;
93
+ --bs-danger-text-emphasis: #8d0000;
94
+ }
95
+
96
+ :root[data-bs-theme="forest"] {
97
+ --bs-primary: #2b9348;
98
+ --bs-secondary: #95d5b2;
99
+ --bs-success: #55a630;
100
+ --bs-info: #76c893;
101
+ --bs-warning: #ffba08;
102
+ --bs-danger: #d62828;
103
+ --bs-light: #f0fdf4;
104
+ --bs-dark: #081c15;
105
+
106
+ --bs-primary-bg-subtle: #d8f3dc;
107
+ --bs-secondary-bg-subtle: #e9f5eb;
108
+ --bs-success-bg-subtle: #c7f9cc;
109
+ --bs-info-bg-subtle: #e9fbee;
110
+ --bs-warning-bg-subtle: #fff8e1;
111
+ --bs-danger-bg-subtle: #ffe5e5;
112
+
113
+ --bs-primary-text-emphasis: #1a472a;
114
+ --bs-success-text-emphasis: #2f5233;
115
+ --bs-danger-text-emphasis: #7a1a1a;
116
+ }
117
+
118
+ :root[data-bs-theme="midnight"] {
119
+ --bs-primary: #5a189a;
120
+ --bs-secondary: #7b2cbf;
121
+ --bs-success: #06d6a0;
122
+ --bs-info: #118ab2;
123
+ --bs-warning: #ffd166;
124
+ --bs-danger: #ef476f;
125
+ --bs-light: #f8f9fa;
126
+ --bs-dark: #03071e;
127
+
128
+ --bs-primary-bg-subtle: #e0d4f7;
129
+ --bs-secondary-bg-subtle: #f1e4ff;
130
+ --bs-success-bg-subtle: #d0fdf2;
131
+ --bs-info-bg-subtle: #d0ebff;
132
+ --bs-warning-bg-subtle: #fff3cd;
133
+ --bs-danger-bg-subtle: #fbdde2;
134
+
135
+ --bs-primary-text-emphasis: #240046;
136
+ --bs-success-text-emphasis: #056b53;
137
+ --bs-danger-text-emphasis: #9d001f;
138
+ }
139
+
140
+ :root[data-bs-theme="corporate"] {
141
+ /* Core brand accent */
142
+ --bs-primary: #2a5d9f; /* Corporate blue */
143
+ --bs-secondary: #6c757d; /* Neutral gray */
144
+ --bs-success: #4caf50; /* Green for positive states */
145
+ --bs-info: #17a2b8; /* Teal info */
146
+ --bs-warning: #f0ad4e; /* Amber warning */
147
+ --bs-danger: #dc3545; /* Red for errors */
148
+ --bs-light: #f8f9fa; /* Light background */
149
+ --bs-dark: #212529; /* Dark text/UI */
150
+
151
+ /* Subtle backgrounds */
152
+ --bs-primary-bg-subtle: #e7f0fa;
153
+ --bs-secondary-bg-subtle: #f1f3f5;
154
+ --bs-success-bg-subtle: #eaf6ec;
155
+ --bs-info-bg-subtle: #e6f7fa;
156
+ --bs-warning-bg-subtle: #fff4e0;
157
+ --bs-danger-bg-subtle: #fcebec;
158
+
159
+ /* Subtle borders */
160
+ --bs-primary-border-subtle: #c2d7ed;
161
+ --bs-secondary-border-subtle: #dee2e6;
162
+ --bs-success-border-subtle: #c8e6c9;
163
+ --bs-info-border-subtle: #bde3ea;
164
+ --bs-warning-border-subtle: #ffe0b2;
165
+ --bs-danger-border-subtle: #f5c2c7;
166
+
167
+ /* Text emphasis */
168
+ --bs-primary-text-emphasis: #1d3f6e;
169
+ --bs-secondary-text-emphasis: #495057;
170
+ --bs-success-text-emphasis: #2e7d32;
171
+ --bs-info-text-emphasis: #0d6673;
172
+ --bs-warning-text-emphasis: #a46900;
173
+ --bs-danger-text-emphasis: #8a1c24;
174
+ }
175
+
176
+ :root {
177
+ /* MOJO Framework Colors - Inherit from Bootstrap */
178
+ --mojo-primary: var(--bs-primary);
179
+ --mojo-primary-rgb: var(--bs-primary-rgb);
180
+ --mojo-secondary: var(--bs-secondary);
181
+ --mojo-secondary-rgb: var(--bs-secondary-rgb);
182
+ --mojo-success: var(--bs-success);
183
+ --mojo-success-rgb: var(--bs-success-rgb);
184
+ --mojo-info: var(--bs-info);
185
+ --mojo-info-rgb: var(--bs-info-rgb);
186
+ --mojo-warning: var(--bs-warning);
187
+ --mojo-warning-rgb: var(--bs-warning-rgb);
188
+ --mojo-danger: var(--bs-danger);
189
+ --mojo-danger-rgb: var(--bs-danger-rgb);
190
+ --mojo-light: var(--bs-light);
191
+ --mojo-light-rgb: var(--bs-light-rgb);
192
+ --mojo-dark: var(--bs-dark);
193
+ --mojo-dark-rgb: var(--bs-dark-rgb);
194
+
195
+ /* MOJO Semantic Colors - Use Bootstrap's color system */
196
+ --mojo-body-bg: var(--bs-body-bg);
197
+ --mojo-body-color: var(--bs-body-color);
198
+ --mojo-emphasis-color: var(--bs-emphasis-color);
199
+ --mojo-secondary-color: var(--bs-secondary-color);
200
+ --mojo-tertiary-color: var(--bs-tertiary-color);
201
+
202
+ /* MOJO Background System */
203
+ --mojo-bg-primary: var(--bs-body-bg);
204
+ --mojo-bg-secondary: var(--bs-secondary-bg);
205
+ --mojo-bg-tertiary: var(--bs-tertiary-bg);
206
+
207
+ /* MOJO Border System */
208
+ --mojo-border-color: var(--bs-border-color);
209
+ --mojo-border-color-translucent: var(--bs-border-color-translucent);
210
+
211
+ /* MOJO Interactive States */
212
+ --mojo-hover-bg: var(--bs-secondary-bg);
213
+ --mojo-active-bg: var(--bs-primary);
214
+ --mojo-focus-color: var(--bs-primary);
215
+ --mojo-focus-shadow: 0 0 0 0.25rem rgba(var(--bs-primary-rgb), 0.25);
216
+
217
+ /* MOJO Transition defaults */
218
+ --mojo-transition-fast: 0.15s ease-in-out;
219
+ --mojo-transition-base: 0.2s ease-in-out;
220
+ --mojo-transition-slow: 0.3s ease-in-out;
221
+
222
+ /* MOJO Border radius - Use Bootstrap system */
223
+ --mojo-border-radius-sm: var(--bs-border-radius-sm);
224
+ --mojo-border-radius: var(--bs-border-radius);
225
+ --mojo-border-radius-lg: var(--bs-border-radius-lg);
226
+ --mojo-border-radius-xl: var(--bs-border-radius-xl);
227
+
228
+ /* MOJO Spacing - Use Bootstrap spacing system */
229
+ --mojo-spacer-xs: calc(var(--bs-spacer) * 0.25);
230
+ --mojo-spacer-sm: calc(var(--bs-spacer) * 0.5);
231
+ --mojo-spacer: var(--bs-spacer);
232
+ --mojo-spacer-lg: calc(var(--bs-spacer) * 1.5);
233
+ --mojo-spacer-xl: calc(var(--bs-spacer) * 3);
234
+
235
+ /* MOJO Typography - Use Bootstrap font system */
236
+ --mojo-font-sans-serif: var(--bs-font-sans-serif);
237
+ --mojo-font-monospace: var(--bs-font-monospace);
238
+
239
+ /* MOJO Box Shadows - Use Bootstrap shadow system */
240
+ --mojo-box-shadow-sm: var(--bs-box-shadow-sm);
241
+ --mojo-box-shadow: var(--bs-box-shadow);
242
+ --mojo-box-shadow-lg: var(--bs-box-shadow-lg);
243
+
244
+ /* MOJO Z-index layers - Use Bootstrap z-index system */
245
+ --mojo-zindex-dropdown: var(--bs-zindex-dropdown, 1000);
246
+ --mojo-zindex-sticky: var(--bs-zindex-sticky, 1020);
247
+ --mojo-zindex-fixed: var(--bs-zindex-fixed, 1030);
248
+ --mojo-zindex-modal-backdrop: var(--bs-zindex-modal-backdrop, 1040);
249
+ --mojo-zindex-offcanvas: var(--bs-zindex-offcanvas, 1045);
250
+ --mojo-zindex-modal: var(--bs-zindex-modal, 1050);
251
+ --mojo-zindex-popover: var(--bs-zindex-popover, 1070);
252
+ --mojo-zindex-tooltip: var(--bs-zindex-tooltip, 1080);
253
+ }
254
+
255
+ /* =========================================================
256
+ Primary-driven components (Bootstrap 5.3+)
257
+ Put this AFTER bootstrap.css. Do not scope it.
258
+ Switching themes = only change --bs-primary (and optional subtle vars).
259
+ ========================================================= */
260
+
261
+ /* Buttons (solid) */
262
+ /* =========================================================
263
+ Buttons tied to theme tokens (Bootstrap 5.3+)
264
+ Put AFTER bootstrap.css
265
+ ========================================================= */
266
+
267
+ /* Primary */
268
+ .btn-primary {
269
+ --bs-btn-color: #fff;
270
+ --bs-btn-bg: var(--bs-primary);
271
+ --bs-btn-border-color: var(--bs-primary);
272
+ --bs-btn-hover-color: #fff;
273
+ --bs-btn-hover-bg: color-mix(in srgb, var(--bs-primary) 88%, #000 12%);
274
+ --bs-btn-hover-border-color: color-mix(in srgb, var(--bs-primary) 82%, #000 18%);
275
+ --bs-btn-active-color: #fff;
276
+ --bs-btn-active-bg: color-mix(in srgb, var(--bs-primary) 75%, #000 25%);
277
+ --bs-btn-active-border-color: color-mix(in srgb, var(--bs-primary) 72%, #000 28%);
278
+ --bs-btn-focus-shadow-rgb: var(--bs-primary-rgb, 13, 110, 253);
279
+ }
280
+
281
+ /* Success */
282
+ .btn-success {
283
+ --bs-btn-color: #fff;
284
+ --bs-btn-bg: var(--bs-success);
285
+ --bs-btn-border-color: var(--bs-success);
286
+ --bs-btn-hover-color: #fff;
287
+ --bs-btn-hover-bg: color-mix(in srgb, var(--bs-success) 88%, #000 12%);
288
+ --bs-btn-hover-border-color: color-mix(in srgb, var(--bs-success) 82%, #000 18%);
289
+ --bs-btn-active-color: #fff;
290
+ --bs-btn-active-bg: color-mix(in srgb, var(--bs-success) 75%, #000 25%);
291
+ --bs-btn-active-border-color: color-mix(in srgb, var(--bs-success) 72%, #000 28%);
292
+ --bs-btn-focus-shadow-rgb: var(--bs-success-rgb, 25, 135, 84);
293
+ }
294
+
295
+ /* Danger */
296
+ .btn-danger {
297
+ --bs-btn-color: #fff;
298
+ --bs-btn-bg: var(--bs-danger);
299
+ --bs-btn-border-color: var(--bs-danger);
300
+ --bs-btn-hover-color: #fff;
301
+ --bs-btn-hover-bg: color-mix(in srgb, var(--bs-danger) 88%, #000 12%);
302
+ --bs-btn-hover-border-color: color-mix(in srgb, var(--bs-danger) 82%, #000 18%);
303
+ --bs-btn-active-color: #fff;
304
+ --bs-btn-active-bg: color-mix(in srgb, var(--bs-danger) 75%, #000 25%);
305
+ --bs-btn-active-border-color: color-mix(in srgb, var(--bs-danger) 72%, #000 28%);
306
+ --bs-btn-focus-shadow-rgb: var(--bs-danger-rgb, 220, 53, 69);
307
+ }
308
+
309
+ /* Warning */
310
+ .btn-warning {
311
+ --bs-btn-color: #000;
312
+ --bs-btn-bg: var(--bs-warning);
313
+ --bs-btn-border-color: var(--bs-warning);
314
+ --bs-btn-hover-color: #000;
315
+ --bs-btn-hover-bg: color-mix(in srgb, var(--bs-warning) 88%, #000 12%);
316
+ --bs-btn-hover-border-color: color-mix(in srgb, var(--bs-warning) 82%, #000 18%);
317
+ --bs-btn-active-color: #000;
318
+ --bs-btn-active-bg: color-mix(in srgb, var(--bs-warning) 75%, #000 25%);
319
+ --bs-btn-active-border-color: color-mix(in srgb, var(--bs-warning) 72%, #000 28%);
320
+ --bs-btn-focus-shadow-rgb: var(--bs-warning-rgb, 255, 193, 7);
321
+ }
322
+
323
+ /* Info */
324
+ .btn-info {
325
+ --bs-btn-color: #000;
326
+ --bs-btn-bg: var(--bs-info);
327
+ --bs-btn-border-color: var(--bs-info);
328
+ --bs-btn-hover-color: #000;
329
+ --bs-btn-hover-bg: color-mix(in srgb, var(--bs-info) 88%, #000 12%);
330
+ --bs-btn-hover-border-color: color-mix(in srgb, var(--bs-info) 82%, #000 18%);
331
+ --bs-btn-active-color: #000;
332
+ --bs-btn-active-bg: color-mix(in srgb, var(--bs-info) 75%, #000 25%);
333
+ --bs-btn-active-border-color: color-mix(in srgb, var(--bs-info) 72%, #000 28%);
334
+ --bs-btn-focus-shadow-rgb: var(--bs-info-rgb, 13, 202, 240);
335
+ }
336
+
337
+ /* Secondary */
338
+ .btn-secondary {
339
+ --bs-btn-color: #fff;
340
+ --bs-btn-bg: var(--bs-secondary);
341
+ --bs-btn-border-color: var(--bs-secondary);
342
+ --bs-btn-hover-color: #fff;
343
+ --bs-btn-hover-bg: color-mix(in srgb, var(--bs-secondary) 88%, #000 12%);
344
+ --bs-btn-hover-border-color: color-mix(in srgb, var(--bs-secondary) 82%, #000 18%);
345
+ --bs-btn-active-color: #fff;
346
+ --bs-btn-active-bg: color-mix(in srgb, var(--bs-secondary) 75%, #000 25%);
347
+ --bs-btn-active-border-color: color-mix(in srgb, var(--bs-secondary) 72%, #000 28%);
348
+ --bs-btn-focus-shadow-rgb: var(--bs-secondary-rgb, 108, 117, 125);
349
+ }
350
+
351
+ /* Buttons (outline) */
352
+ .btn-outline-primary {
353
+ --bs-btn-color: var(--bs-primary);
354
+ --bs-btn-border-color: var(--bs-primary);
355
+ --bs-btn-hover-color: #fff;
356
+ --bs-btn-hover-bg: var(--bs-primary);
357
+ --bs-btn-hover-border-color: var(--bs-primary);
358
+ --bs-btn-active-color: #fff;
359
+ --bs-btn-active-bg: color-mix(in srgb, var(--bs-primary) 75%, #000 25%);
360
+ --bs-btn-active-border-color: color-mix(in srgb, var(--bs-primary) 75%, #000 25%);
361
+ --bs-btn-focus-shadow-rgb: var(--bs-primary-rgb, 13, 110, 253);
362
+ }
363
+
364
+ /* Optional: make the plain .btn use primary by default (comment out if you don't want this) */
365
+ /*
366
+ .btn {
367
+ --bs-btn-color: #fff;
368
+ --bs-btn-bg: var(--bs-primary);
369
+ --bs-btn-border-color: var(--bs-primary);
370
+ --bs-btn-hover-color: #fff;
371
+ --bs-btn-hover-bg: color-mix(in srgb, var(--bs-primary) 88%, #000 12%);
372
+ --bs-btn-hover-border-color: color-mix(in srgb, var(--bs-primary) 82%, #000 18%);
373
+ --bs-btn-active-color: #fff;
374
+ --bs-btn-active-bg: color-mix(in srgb, var(--bs-primary) 75%, #000 25%);
375
+ --bs-btn-active-border-color:color-mix(in srgb, var(--bs-primary) 72%, #000 28%);
376
+ --bs-btn-focus-shadow-rgb: var(--bs-primary-rgb, 13,110,253);
377
+ }
378
+ */
379
+
380
+ /* Pagination */
381
+ .pagination {
382
+ --bs-pagination-color: var(--bs-primary);
383
+ --bs-pagination-hover-color: color-mix(in srgb, var(--bs-primary) 85%, #000 15%);
384
+ --bs-pagination-focus-color: var(--bs-primary);
385
+ --bs-pagination-focus-box-shadow: 0 0 0 0.25rem
386
+ color-mix(in srgb, var(--bs-primary) 25%, transparent);
387
+ --bs-pagination-active-color: #fff;
388
+ --bs-pagination-active-bg: var(--bs-primary);
389
+ --bs-pagination-active-border-color: var(--bs-primary);
390
+ --bs-pagination-disabled-color: var(--bs-secondary, #6c757d);
391
+ }
392
+
393
+ /* Badges that use bg-primary */
394
+ .badge.bg-primary {
395
+ --bs-badge-color: #fff;
396
+ --bs-badge-bg: var(--bs-primary);
397
+ }
398
+
399
+ /* Nav pills & tabs */
400
+ .nav-pills {
401
+ --bs-nav-pills-link-active-bg: var(--bs-primary);
402
+ --bs-nav-pills-link-active-color: #fff;
403
+ }
404
+ .nav-tabs {
405
+ --bs-nav-tabs-link-hover-border-color: color-mix(in srgb, var(--bs-primary) 35%, transparent);
406
+ --bs-nav-tabs-link-active-color: var(--bs-primary);
407
+ --bs-nav-tabs-link-active-border-color: var(--bs-primary);
408
+ }
409
+
410
+ .nav-tabs .nav-link {
411
+ color: var(--bs-secondary);
412
+ }
413
+
414
+ .nav-tabs .nav-link.active {
415
+ border-top-color: rgb(26, 115, 232);
416
+ border-right-color: rgb(26, 115, 232);
417
+ border-bottom-color: transparent;
418
+ border-left-color: rgb(26, 115, 232);
419
+ }
420
+
421
+ /* ========================================================================
422
+ TabView Component Styles
423
+ ======================================================================== */
424
+
425
+ /*
426
+ * Style for the 'select' mode dropdown in the TabView component.
427
+ * These styles mimic the appearance of a Bootstrap .form-select element
428
+ * to provide a consistent look and feel with standard form inputs.
429
+ */
430
+ .tab-view-select-style {
431
+ display: inline-flex; /* Use inline-flex to allow the button to size to its content */
432
+ align-items: center; /* Vertically align the label and chevron */
433
+
434
+ /* Mimic Bootstrap .form-select styles for appearance */
435
+ padding: 0.375rem 2.25rem 0.375rem 0.75rem;
436
+ font-size: 1rem;
437
+ font-weight: 400;
438
+ line-height: 1.5;
439
+ color: var(--bs-body-color);
440
+ background-color: var(--bs-body-bg);
441
+ 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='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");
442
+ background-repeat: no-repeat;
443
+ background-position: right 0.75rem center;
444
+ background-size: 16px 12px;
445
+ border-top: 1px solid var(--bs-border-color);
446
+ border-right: 1px solid var(--bs-border-color);
447
+ border-left: 1px solid var(--bs-border-color);
448
+ border-top-left-radius: var(--bs-border-radius);
449
+ border-top-right-radius: var(--bs-border-radius);
450
+ border-bottom-left-radius: 0;
451
+ border-bottom-right-radius: 0;
452
+ transition:
453
+ border-color 0.15s ease-in-out,
454
+ box-shadow 0.15s ease-in-out;
455
+ -webkit-appearance: none;
456
+ -moz-appearance: none;
457
+ appearance: none;
458
+ }
459
+
460
+ /* The .dropdown-toggle class adds its own chevron, which we don't want. */
461
+ /* This rule hides the default Bootstrap chevron so we can use our own background-image version. */
462
+ .tab-view-select-style::after {
463
+ display: none;
464
+ }
465
+
466
+ /* Hover state - slightly darken the border like a real input */
467
+ .tab-view-select-style:hover {
468
+ border-color: var(--bs-secondary-border-subtle);
469
+ }
470
+
471
+ /* Focus state - mimic Bootstrap's standard focus ring */
472
+ .tab-view-select-style:focus {
473
+ border-color: var(--bs-primary);
474
+ outline: 0;
475
+ box-shadow: 0 0 0 0.25rem rgba(var(--bs-primary-rgb), 0.25);
476
+ }
477
+
478
+ /* The text label inside the button */
479
+ .tab-view-select-label {
480
+ overflow: hidden;
481
+ text-overflow: ellipsis;
482
+ white-space: nowrap;
483
+ }
484
+
485
+ /* Alerts (optional, stays tied to primary) */
486
+ .alert-primary {
487
+ --bs-alert-color: var(
488
+ --bs-primary-text-emphasis,
489
+ color-mix(in srgb, var(--bs-primary) 35%, #000)
490
+ );
491
+ --bs-alert-bg: var(--bs-primary-bg-subtle, color-mix(in srgb, var(--bs-primary) 10%, #fff));
492
+ --bs-alert-border-color: var(
493
+ --bs-primary-border-subtle,
494
+ color-mix(in srgb, var(--bs-primary) 25%, #fff)
495
+ );
496
+ }
497
+
498
+ /* Links (so the whole site “feels” primary) */
499
+ :root {
500
+ --bs-link-color: var(--bs-primary);
501
+ --bs-link-hover-color: color-mix(in srgb, var(--bs-primary) 85%, #000 15%);
502
+ }
503
+
504
+ .form-check {
505
+ margin-top: 0.9rem;
506
+ }
507
+
508
+ /* ========================================================================
509
+ MOJO Core Animations
510
+ ======================================================================== */
511
+
512
+ @keyframes mojo-fadeIn {
513
+ from {
514
+ opacity: 0;
515
+ transform: translateY(10px);
516
+ }
517
+ to {
518
+ opacity: 1;
519
+ transform: translateY(0);
520
+ }
521
+ }
522
+
523
+ @keyframes mojo-slideUp {
524
+ from {
525
+ opacity: 0;
526
+ transform: translateY(20px);
527
+ }
528
+ to {
529
+ opacity: 1;
530
+ transform: translateY(0);
531
+ }
532
+ }
533
+
534
+ @keyframes mojo-spin {
535
+ from {
536
+ transform: rotate(0deg);
537
+ }
538
+ to {
539
+ transform: rotate(360deg);
540
+ }
541
+ }
542
+
543
+ @keyframes mojo-pulse {
544
+ 0%,
545
+ 100% {
546
+ opacity: 1;
547
+ }
548
+ 50% {
549
+ opacity: 0.6;
550
+ }
551
+ }
552
+
553
+ @keyframes mojo-bounce {
554
+ 0%,
555
+ 100% {
556
+ transform: translateY(0);
557
+ }
558
+ 50% {
559
+ transform: translateY(-3px);
560
+ }
561
+ }
562
+
563
+ /* ========================================================================
564
+ MOJO Animation Utility Classes
565
+ ======================================================================== */
566
+
567
+ .mojo-fade-in {
568
+ animation: mojo-fadeIn var(--mojo-transition-slow) ease-in-out;
569
+ }
570
+
571
+ .mojo-slide-up {
572
+ animation: mojo-slideUp 0.4s ease-out;
573
+ }
574
+
575
+ .mojo-spin {
576
+ animation: mojo-spin 1s linear infinite;
577
+ display: inline-block;
578
+ }
579
+
580
+ .mojo-pulse {
581
+ animation: mojo-pulse 2s ease-in-out infinite;
582
+ }
583
+
584
+ .mojo-bounce {
585
+ animation: mojo-bounce 0.5s ease-in-out;
586
+ }
587
+
588
+ /* Bootstrap Icons animation enhancement */
589
+ .bi-spin {
590
+ animation: mojo-spin 1s linear infinite;
591
+ display: inline-block;
592
+ }
593
+
594
+ /* ========================================================================
595
+ MOJO Utility Classes
596
+ ======================================================================== */
597
+
598
+ /* Text truncation utilities */
599
+ .mojo-text-truncate-2 {
600
+ display: -webkit-box;
601
+ -webkit-line-clamp: 2;
602
+ -webkit-box-orient: vertical;
603
+ overflow: hidden;
604
+ text-overflow: ellipsis;
605
+ }
606
+
607
+ .mojo-text-truncate-3 {
608
+ display: -webkit-box;
609
+ -webkit-line-clamp: 3;
610
+ -webkit-box-orient: vertical;
611
+ overflow: hidden;
612
+ text-overflow: ellipsis;
613
+ }
614
+
615
+ /* Transition utilities */
616
+ .mojo-transition-fast {
617
+ transition: all var(--mojo-transition-fast);
618
+ }
619
+
620
+ .mojo-transition {
621
+ transition: all var(--mojo-transition-base);
622
+ }
623
+
624
+ .mojo-transition-slow {
625
+ transition: all var(--mojo-transition-slow);
626
+ }
627
+
628
+ /* Transform utilities */
629
+ .mojo-transform-center {
630
+ position: absolute;
631
+ top: 50%;
632
+ left: 50%;
633
+ transform: translate(-50%, -50%);
634
+ }
635
+
636
+ .mojo-transform-center-x {
637
+ position: absolute;
638
+ left: 50%;
639
+ transform: translateX(-50%);
640
+ }
641
+
642
+ .mojo-transform-center-y {
643
+ position: absolute;
644
+ top: 50%;
645
+ transform: translateY(-50%);
646
+ }
647
+
648
+ /* Hover effects */
649
+ .mojo-hover-lift:hover {
650
+ transform: translateY(-2px);
651
+ transition: transform var(--mojo-transition-fast);
652
+ }
653
+
654
+ .mojo-hover-shadow:hover {
655
+ box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
656
+ transition: box-shadow var(--mojo-transition-fast);
657
+ }
658
+
659
+ /* Glass morphism effect */
660
+ .mojo-glass {
661
+ backdrop-filter: blur(10px);
662
+ background: rgba(255, 255, 255, 0.1);
663
+ border: 1px solid rgba(255, 255, 255, 0.2);
664
+ }
665
+
666
+ [data-bs-theme="dark"] .mojo-glass {
667
+ background: rgba(0, 0, 0, 0.2);
668
+ border: 1px solid rgba(255, 255, 255, 0.1);
669
+ }
670
+
671
+ /* ========================================================================
672
+ MOJO Loading States
673
+ ======================================================================== */
674
+
675
+ .mojo-loading {
676
+ pointer-events: none;
677
+ opacity: 0.6;
678
+ position: relative;
679
+ }
680
+
681
+ .mojo-loading::after {
682
+ content: "";
683
+ position: absolute;
684
+ top: 50%;
685
+ left: 50%;
686
+ width: 1rem;
687
+ height: 1rem;
688
+ margin: -0.5rem 0 0 -0.5rem;
689
+ border: 2px solid transparent;
690
+ border-top: 2px solid var(--mojo-primary);
691
+ border-radius: 50%;
692
+ animation: mojo-spin 1s linear infinite;
693
+ z-index: 1;
694
+ }
695
+
696
+ /* ========================================================================
697
+ MOJO Focus States
698
+ ======================================================================== */
699
+
700
+ .mojo-focus-ring:focus {
701
+ outline: none;
702
+ box-shadow: var(--mojo-focus-shadow);
703
+ }
704
+
705
+ .mojo-focus-ring:focus-visible {
706
+ outline: 2px solid var(--mojo-focus-color);
707
+ outline-offset: 2px;
708
+ }
709
+
710
+ /* Extend Bootstrap font sizes smaller than fs-6 */
711
+ .fs-7 {
712
+ font-size: 0.75rem !important; /* ~12px */
713
+ }
714
+ .fs-8 {
715
+ font-size: 0.6875rem !important; /* ~11px */
716
+ }
717
+ .fs-9 {
718
+ font-size: 0.625rem !important; /* ~10px */
719
+ }
720
+ .fs-10 {
721
+ font-size: 0.5625rem !important; /* ~9px */
722
+ }
723
+
724
+ /* ========================================================================
725
+ MOJO Print Utilities
726
+ ======================================================================== */
727
+
728
+ @media print {
729
+ .mojo-print-hide {
730
+ display: none !important;
731
+ }
732
+
733
+ .mojo-print-show {
734
+ display: block !important;
735
+ }
736
+
737
+ .mojo-no-print-shadow {
738
+ box-shadow: none !important;
739
+ }
740
+
741
+ .mojo-no-print-bg {
742
+ background: white !important;
743
+ color: black !important;
744
+ }
745
+ }
746
+
747
+ /* ========================================================================
748
+ MOJO Accessibility Enhancements
749
+ ======================================================================== */
750
+
751
+ /* Screen reader only content */
752
+ .mojo-sr-only {
753
+ position: absolute !important;
754
+ width: 1px !important;
755
+ height: 1px !important;
756
+ padding: 0 !important;
757
+ margin: -1px !important;
758
+ overflow: hidden !important;
759
+ clip: rect(0, 0, 0, 0) !important;
760
+ white-space: nowrap !important;
761
+ border: 0 !important;
762
+ }
763
+
764
+ /* Skip link for accessibility */
765
+ .mojo-skip-link {
766
+ position: absolute;
767
+ top: -40px;
768
+ left: 6px;
769
+ background: var(--mojo-emphasis-color);
770
+ color: var(--mojo-body-bg);
771
+ padding: 8px;
772
+ text-decoration: none;
773
+ z-index: var(--mojo-zindex-tooltip);
774
+ border-radius: var(--mojo-border-radius);
775
+ }
776
+
777
+ .mojo-skip-link:focus {
778
+ top: 6px;
779
+ }
780
+
781
+ /* ========================================================================
782
+ MOJO Reduced Motion Support
783
+ ======================================================================== */
784
+
785
+ @media (prefers-reduced-motion: reduce) {
786
+ .mojo-fade-in,
787
+ .mojo-slide-up,
788
+ .mojo-spin,
789
+ .mojo-pulse,
790
+ .mojo-bounce,
791
+ .bi-spin,
792
+ .mojo-loading::after {
793
+ animation-duration: 0.01ms !important;
794
+ animation-iteration-count: 1 !important;
795
+ }
796
+
797
+ .mojo-transition-fast,
798
+ .mojo-transition,
799
+ .mojo-transition-slow,
800
+ .mojo-hover-lift:hover,
801
+ .mojo-hover-shadow:hover {
802
+ transition: none !important;
803
+ }
804
+ }
805
+
806
+ /* ========================================================================
807
+ MOJO High Contrast Support
808
+ ======================================================================== */
809
+
810
+ @media (prefers-contrast: high) {
811
+ .mojo-glass {
812
+ background: var(--mojo-body-bg);
813
+ border: 2px solid var(--mojo-border-color);
814
+ backdrop-filter: none;
815
+ }
816
+
817
+ .mojo-focus-ring:focus,
818
+ .mojo-focus-ring:focus-visible {
819
+ outline: 3px solid var(--mojo-focus-color);
820
+ outline-offset: 2px;
821
+ box-shadow: 0 0 0 0.5rem rgba(var(--mojo-primary-rgb), 0.5);
822
+ }
823
+ }
824
+
825
+ /* ========================================================================
826
+ MOJO Framework Initialization
827
+ ======================================================================== */
828
+
829
+ /* Ensure MOJO framework is ready */
830
+ .mojo-app {
831
+ min-height: 100vh;
832
+ font-family: var(--mojo-font-sans-serif);
833
+ background-color: var(--mojo-body-bg);
834
+ color: var(--mojo-body-color);
835
+ }
836
+
837
+ .mojo-app.mojo-loading {
838
+ opacity: 0;
839
+ }
840
+
841
+ .mojo-app.mojo-ready {
842
+ opacity: 1;
843
+ transition: opacity var(--mojo-transition-slow);
844
+ }
845
+
846
+ /* MOJO component base class */
847
+ .mojo-component {
848
+ position: relative;
849
+ }
850
+
851
+ .mojo-component.mojo-disabled {
852
+ pointer-events: none;
853
+ opacity: 0.6;
854
+ }
855
+
856
+ /* ========================================================================
857
+ MOJO Debug Helpers (Development Only)
858
+ ======================================================================== */
859
+
860
+ .mojo-debug * {
861
+ outline: 1px solid red !important;
862
+ }
863
+
864
+ .mojo-debug *:hover {
865
+ background: rgba(255, 0, 0, 0.1) !important;
866
+ }
867
+
868
+ /* ========================================================================
869
+ FileDropMixin - Drag and Drop Visual Feedback
870
+ ======================================================================== */
871
+
872
+ .drag-over {
873
+ border-color: var(--bs-primary) !important;
874
+ background-color: var(--bs-primary-bg-subtle) !important;
875
+ transition: all 0.2s ease;
876
+ }
877
+
878
+ .drag-active {
879
+ border-style: dashed !important;
880
+ border-width: 2px !important;
881
+ box-shadow: 0 0 0 0.25rem rgba(var(--bs-primary-rgb), 0.25) !important;
882
+ }
883
+
884
+ /* Combined drag state */
885
+ .drag-over.drag-active {
886
+ transform: scale(1.02);
887
+ box-shadow:
888
+ 0 0 0 0.25rem rgba(var(--bs-primary-rgb), 0.25),
889
+ 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important;
890
+ }
891
+
892
+ /* Dark theme support */
893
+ [data-bs-theme="dark"] .drag-over {
894
+ background-color: rgba(var(--bs-primary-rgb), 0.15) !important;
895
+ }
896
+
897
+ /* Reduced motion support */
898
+ @media (prefers-reduced-motion: reduce) {
899
+ .drag-over,
900
+ .drag-active {
901
+ transition: none !important;
902
+ transform: none !important;
903
+ }
904
+ }
905
+
906
+ /* Hide debug helpers in production */
907
+ @media (min-width: 1px) {
908
+ .mojo-debug {
909
+ display: none;
910
+ }
911
+ }
912
+
913
+ /* Show debug helpers when explicitly enabled */
914
+ .mojo-debug-enabled .mojo-debug {
915
+ display: block !important;
916
+ }
917
+
918
+ /* ========================================
919
+ Image Field Styles
920
+ ======================================== */
921
+
922
+ .image-field-container {
923
+ position: relative;
924
+ display: inline-block;
925
+ border-radius: 0.375rem;
926
+ overflow: hidden;
927
+ }
928
+
929
+ .image-drop-zone {
930
+ position: relative;
931
+ border-radius: 0.375rem;
932
+ transition: all 0.2s ease;
933
+ overflow: hidden;
934
+ }
935
+
936
+ .image-drop-zone.droppable {
937
+ border: 2px dashed var(--bs-border-color);
938
+ }
939
+
940
+ .image-drop-zone.droppable:hover {
941
+ border-color: var(--bs-primary);
942
+ background-color: var(--bs-primary-bg-subtle);
943
+ }
944
+
945
+ /* Drop zone states */
946
+ .image-drop-zone.drag-over {
947
+ border-color: var(--bs-primary) !important;
948
+ background-color: var(--bs-primary-bg-subtle) !important;
949
+ transform: scale(1.02);
950
+ }
951
+
952
+ .image-drop-zone.drag-active {
953
+ border-color: var(--bs-success) !important;
954
+ background-color: var(--bs-success-bg-subtle) !important;
955
+ box-shadow: 0 0 0 3px rgba(var(--bs-success-rgb), 0.25);
956
+ }
957
+
958
+ /* Size variants */
959
+ .image-field-xs {
960
+ width: 48px;
961
+ height: 48px;
962
+ }
963
+
964
+ .image-field-sm {
965
+ width: 96px;
966
+ height: 96px;
967
+ }
968
+
969
+ .image-field-md {
970
+ width: 150px;
971
+ height: 150px;
972
+ }
973
+
974
+ .image-field-lg {
975
+ width: 200px;
976
+ height: 200px;
977
+ }
978
+
979
+ .image-field-xl {
980
+ width: 300px;
981
+ height: 300px;
982
+ }
983
+
984
+ /* Preview images */
985
+ .image-field-container img {
986
+ transition: transform 0.2s ease;
987
+ }
988
+
989
+ .image-field-container:hover img {
990
+ transform: scale(1.05);
991
+ }
992
+
993
+ /* Remove button positioning */
994
+ .image-field-container .btn {
995
+ transition: opacity 0.2s ease;
996
+ }
997
+
998
+ .image-field-container:not(:hover) .btn {
999
+ opacity: 0.6;
1000
+ }
1001
+
1002
+ /* Dark theme adjustments */
1003
+ [data-bs-theme="dark"] .image-drop-zone.droppable {
1004
+ border-color: var(--bs-border-color-translucent);
1005
+ }
1006
+
1007
+ [data-bs-theme="dark"] .image-drop-zone.droppable:hover {
1008
+ border-color: var(--bs-primary);
1009
+ background-color: rgba(var(--bs-primary-rgb), 0.1);
1010
+ }
1011
+
1012
+ /* Responsive adjustments */
1013
+ @media (max-width: 576px) {
1014
+ .image-field-xl {
1015
+ width: 250px;
1016
+ height: 250px;
1017
+ }
1018
+
1019
+ .image-field-lg {
1020
+ width: 180px;
1021
+ height: 180px;
1022
+ }
1023
+ }
1024
+
1025
+ /* Accessibility */
1026
+ .image-drop-zone:focus {
1027
+ outline: 2px solid var(--bs-primary);
1028
+ outline-offset: 2px;
1029
+ }
1030
+
1031
+ /* Reduced motion */
1032
+ @media (prefers-reduced-motion: reduce) {
1033
+ .image-drop-zone,
1034
+ .image-field-container img,
1035
+ .image-field-container .btn {
1036
+ transition: none;
1037
+ }
1038
+
1039
+ .image-drop-zone.drag-over {
1040
+ transform: none;
1041
+ }
1042
+
1043
+ .image-field-container:hover img {
1044
+ transform: none;
1045
+ }
1046
+ }
1047
+
1048
+ /* ========================================================================
1049
+ MOJO Form Groups
1050
+ ======================================================================== */
1051
+
1052
+ .mojo-form-group {
1053
+ margin-bottom: 1rem;
1054
+ }
1055
+
1056
+ .mojo-form-group .h6 {
1057
+ color: var(--bs-secondary);
1058
+ font-weight: 600;
1059
+ margin-bottom: 0.75rem;
1060
+ padding-bottom: 0.25rem;
1061
+ border-bottom: 1px solid var(--bs-border-color);
1062
+ }
1063
+
1064
+ /* Responsive adjustments for form groups */
1065
+ @media (max-width: 767.98px) {
1066
+ .mojo-form-group {
1067
+ padding: 0.75rem;
1068
+ margin-bottom: 0.75rem;
1069
+ }
1070
+ }
1071
+
1072
+ /* ========================================================================
1073
+ MOJO Form Controls
1074
+ ======================================================================== */
1075
+
1076
+ .mojo-form-control {
1077
+ margin-bottom: 1rem;
1078
+ }
1079
+
1080
+ .mojo-form-control .form-label {
1081
+ font-weight: 500;
1082
+ margin-bottom: 0.5rem;
1083
+ color: var(--bs-body-color);
1084
+ }
1085
+
1086
+ .mojo-form-control .form-text {
1087
+ margin-top: 0.25rem;
1088
+ font-size: 0.875rem;
1089
+ color: var(--bs-secondary);
1090
+ }
1091
+
1092
+ .mojo-form-control .invalid-feedback {
1093
+ margin-top: 0.25rem;
1094
+ }
1095
+
1096
+ /* Form check controls (checkboxes, switches, radios) */
1097
+ .mojo-form-control .form-check {
1098
+ margin-bottom: 0;
1099
+ }
1100
+
1101
+ .mojo-form-control .form-check .form-check-label {
1102
+ font-weight: normal;
1103
+ }
1104
+
1105
+ /* Image field specific styling */
1106
+ .mojo-form-control .image-field-container {
1107
+ margin-top: 0.5rem;
1108
+ }
1109
+
1110
+ /* Range slider specific styling */
1111
+ .mojo-form-control input[type="range"] {
1112
+ margin-top: 0.5rem;
1113
+ margin-bottom: 0.5rem;
1114
+ }
1115
+
1116
+ /* Responsive adjustments for form controls */
1117
+ @media (max-width: 767.98px) {
1118
+ .mojo-form-control {
1119
+ margin-bottom: 0.75rem;
1120
+ }
1121
+
1122
+ .mojo-form-control .form-label {
1123
+ margin-bottom: 0.375rem;
1124
+ }
1125
+ }
1126
+
1127
+ /* ==============================================
1128
+ Modal Context Menu Button Styles
1129
+ ============================================== */
1130
+
1131
+ /* Base context menu button - inherits header color by default */
1132
+ .mojo-modal-context-menu-btn {
1133
+ color: inherit !important;
1134
+ border: none;
1135
+ background: transparent;
1136
+ opacity: 0.7;
1137
+ transition: opacity 0.15s ease-in-out;
1138
+ }
1139
+
1140
+ .mojo-modal-context-menu-btn:hover,
1141
+ .mojo-modal-context-menu-btn:focus {
1142
+ color: inherit !important;
1143
+ background: rgba(var(--bs-emphasis-color-rgb), 0.1);
1144
+ opacity: 1;
1145
+ }
1146
+
1147
+ .mojo-modal-context-menu-btn:active {
1148
+ background: rgba(var(--bs-emphasis-color-rgb), 0.2);
1149
+ }
1150
+
1151
+ /* Modal type-specific overrides */
1152
+ .modal.modal-info .mojo-modal-context-menu-btn {
1153
+ color: #ffffff !important;
1154
+ }
1155
+
1156
+ .modal.modal-success .mojo-modal-context-menu-btn {
1157
+ color: #ffffff !important;
1158
+ }
1159
+
1160
+ .modal.modal-warning .mojo-modal-context-menu-btn {
1161
+ color: #000000 !important;
1162
+ }
1163
+
1164
+ .modal.modal-error .mojo-modal-context-menu-btn {
1165
+ color: #ffffff !important;
1166
+ }
1167
+
1168
+ .modal.modal-dark .mojo-modal-context-menu-btn {
1169
+ color: #ffffff !important;
1170
+ }
1171
+
1172
+ /* Dark theme support */
1173
+ [data-bs-theme="dark"] .mojo-modal-context-menu-btn {
1174
+ color: #ffffff !important;
1175
+ }
1176
+
1177
+ /* Ensure proper spacing and alignment */
1178
+ .modal-header .mojo-modal-context-menu-btn {
1179
+ margin-left: auto;
1180
+ margin-right: 0;
1181
+ }