ultimate-jekyll-manager 0.0.189 → 0.0.190

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.
package/CLAUDE.md CHANGED
@@ -558,6 +558,70 @@ data-lazy="@type value"
558
558
 
559
559
  **Implementation:** `src/assets/js/core/lazy-loading.js`
560
560
 
561
+ ## Appearance Switching System
562
+
563
+ Ultimate Jekyll supports dark/light/system theme switching with user preference persistence.
564
+
565
+ ### Supported Modes
566
+ - `dark` - Force dark mode
567
+ - `light` - Force light mode
568
+ - `system` - Auto-detect from OS preference (`prefers-color-scheme`)
569
+
570
+ ### JavaScript API
571
+
572
+ ```javascript
573
+ // Get/set preference
574
+ webManager.uj().appearance.get(); // Returns 'dark', 'light', 'system', or null
575
+ webManager.uj().appearance.set('dark'); // Save and apply preference
576
+ webManager.uj().appearance.getResolved(); // Returns actual theme: 'dark' or 'light'
577
+
578
+ // Utilities
579
+ webManager.uj().appearance.toggle(); // Toggle between dark/light
580
+ webManager.uj().appearance.cycle(); // Cycle: dark → light → system → dark
581
+ webManager.uj().appearance.clear(); // Clear saved preference
582
+ ```
583
+
584
+ ### HTML Data Attributes
585
+
586
+ ```html
587
+ <!-- Buttons to set appearance (auto-gets 'active' class) -->
588
+ <button data-appearance-set="light">Light</button>
589
+ <button data-appearance-set="dark">Dark</button>
590
+ <button data-appearance-set="system">System</button>
591
+
592
+ <!-- Display current mode as text -->
593
+ <span data-appearance-current></span>
594
+
595
+ <!-- Show/hide icons based on current mode -->
596
+ <span data-appearance-icon="light" hidden>☀️</span>
597
+ <span data-appearance-icon="dark" hidden>🌙</span>
598
+ <span data-appearance-icon="system" hidden>💻</span>
599
+ ```
600
+
601
+ ### Dropdown Example
602
+
603
+ ```html
604
+ <div class="dropdown">
605
+ <button class="btn dropdown-toggle" data-bs-toggle="dropdown">
606
+ <span data-appearance-icon="light" hidden>{% uj_icon "sun", "fa-md me-2" %}</span>
607
+ <span data-appearance-icon="dark" hidden>{% uj_icon "moon-stars", "fa-md me-2" %}</span>
608
+ <span data-appearance-icon="system" hidden>{% uj_icon "circle-half-stroke", "fa-md me-2" %}</span>
609
+ <span data-appearance-current></span>
610
+ </button>
611
+ <ul class="dropdown-menu">
612
+ <li><a class="dropdown-item" href="#" data-appearance-set="light">Light</a></li>
613
+ <li><a class="dropdown-item" href="#" data-appearance-set="dark">Dark</a></li>
614
+ <li><a class="dropdown-item" href="#" data-appearance-set="system">System</a></li>
615
+ </ul>
616
+ </div>
617
+ ```
618
+
619
+ ### Implementation
620
+ - **Inline script:** `src/defaults/dist/_includes/core/body.html` - Runs immediately to prevent flash
621
+ - **Module:** `src/assets/js/core/appearance.js` - API and UI handling
622
+ - **Storage:** Saved under `_manager.appearance.preference` in localStorage
623
+ - **Test page:** `/test/libraries/appearance`
624
+
561
625
  ## JavaScript Libraries
562
626
 
563
627
  ### WebManager
package/README.md CHANGED
@@ -256,6 +256,35 @@ The `<html>` element has data attributes for JavaScript/CSS targeting:
256
256
  | `data-runtime` | `web`, `extension`, `electron`, `node` |
257
257
  | `aria-busy` | `true` (loading), `false` (ready) |
258
258
 
259
+ ### Appearance Switching
260
+
261
+ Ultimate Jekyll supports dark/light/system theme switching with user preference persistence.
262
+
263
+ **JavaScript API:**
264
+ ```javascript
265
+ webManager.uj().appearance.get(); // Returns 'dark', 'light', 'system', or null
266
+ webManager.uj().appearance.set('dark'); // Save and apply preference
267
+ webManager.uj().appearance.toggle(); // Toggle dark/light
268
+ webManager.uj().appearance.cycle(); // Cycle: dark → light → system
269
+ ```
270
+
271
+ **HTML Dropdown Example:**
272
+ ```html
273
+ <div class="dropdown">
274
+ <button class="btn dropdown-toggle" data-bs-toggle="dropdown">
275
+ <span data-appearance-icon="light" hidden>{% uj_icon "sun" %}</span>
276
+ <span data-appearance-icon="dark" hidden>{% uj_icon "moon-stars" %}</span>
277
+ <span data-appearance-icon="system" hidden>{% uj_icon "circle-half-stroke" %}</span>
278
+ <span data-appearance-current></span>
279
+ </button>
280
+ <ul class="dropdown-menu">
281
+ <li><a href="#" data-appearance-set="light">Light</a></li>
282
+ <li><a href="#" data-appearance-set="dark">Dark</a></li>
283
+ <li><a href="#" data-appearance-set="system">System</a></li>
284
+ </ul>
285
+ </div>
286
+ ```
287
+
259
288
  ### Page Loading Protection System
260
289
 
261
290
  Ultimate Jekyll includes an automatic protection system that prevents users from clicking buttons before JavaScript is fully loaded, eliminating race conditions and errors.
package/TODO.md CHANGED
@@ -8,6 +8,8 @@ NEW TODO
8
8
  - form manager should NOT submit if the button that was clicked is disabled (class or attribute)
9
9
  - GLOBAL FIXES FOR ALL UJM PROJECTS: nav.json should ahve class only not color
10
10
 
11
+ /authentication-required
12
+ * ithink this is leftover from Electron Manager auth system??? but lots on proxifly. need to make a version of it for UJM2.0
11
13
 
12
14
  Make an admin dashboard backend
13
15
 
@@ -1,232 +1,11 @@
1
- // Import the theme entry point
2
- @use './scss/bootstrap.scss' as *;
3
-
4
- // Add any custom code here
5
- // ...
6
-
7
- // Adaptive button that uses light styles in light mode and dark styles in dark mode
8
- .btn-adaptive {
9
- @extend .btn-dark;
10
- }
11
-
12
- [data-bs-theme="dark"] .btn-adaptive {
13
- @extend .btn-light;
14
- }
15
-
16
- // Do the same for btn-outline-light, btn-outline-dark,
17
- .btn-outline-adaptive {
18
- @extend .btn-outline-dark;
19
- }
20
-
21
- [data-bs-theme="dark"] .btn-outline-adaptive {
22
- @extend .btn-outline-light;
23
- }
24
-
25
- // If nav-link is active, give it an underline
26
- .nav-link.active {
27
- text-decoration: underline !important;
28
- }
29
-
30
- // Make a link-muted class that looks like text-muted
31
- .link-muted {
32
- --bs-text-opacity: 1;
33
- color: var(--bs-secondary-color) !important;
34
- text-decoration: none;
35
- transition: opacity 0.15s ease-in-out;
36
-
37
- &:hover,
38
- &:focus {
39
- color: var(--bs-secondary-color) !important;
40
- text-decoration: underline;
41
- opacity: 0.75;
42
- }
43
- }
44
-
45
- // Padding - Extend to p-8
46
- $spacer: 1rem;
47
- @for $i from 6 through 8 {
48
- $size: if($i == 6, 4, if($i == 7, 4.5, 5));
49
-
50
- .p-#{$i} { padding: $spacer * $size !important; }
51
- .pt-#{$i} { padding-top: $spacer * $size !important; }
52
- .pb-#{$i} { padding-bottom: $spacer * $size !important; }
53
- .ps-#{$i} { padding-left: $spacer * $size !important; }
54
- .pe-#{$i} { padding-right: $spacer * $size !important; }
55
- .px-#{$i} {
56
- padding-left: $spacer * $size !important;
57
- padding-right: $spacer * $size !important;
58
- }
59
- .py-#{$i} {
60
- padding-top: $spacer * $size !important;
61
- padding-bottom: $spacer * $size !important;
62
- }
63
- }
64
-
65
- // Avatar sizes map
66
- $avatar-sizes: (
67
- null: 3rem, // default
68
- xs: 1.5rem,
69
- sm: 2rem,
70
- md: 2.5rem,
71
- lg: 3.5rem,
72
- xl: 5rem,
73
- xxl: 7.5rem
74
- );
75
-
76
- // Avatar base styles
77
- .avatar {
78
- display: inline-block;
79
- height: map-get($avatar-sizes, null);
80
- position: relative;
81
- width: map-get($avatar-sizes, null);
82
-
83
- img {
84
- height: 100%;
85
- -o-object-fit: cover;
86
- object-fit: cover;
87
- width: 100%;
88
- }
89
- }
90
-
91
- // Generate avatar size classes
92
- @each $size, $dimension in $avatar-sizes {
93
- @if $size != null {
94
- .avatar-#{$size} {
95
- height: $dimension;
96
- width: $dimension;
97
- }
98
- }
99
- }
100
-
101
- // Soft color utilities for all theme colors
102
- $theme-colors: (
103
- "primary": var(--bs-primary),
104
- "secondary": var(--bs-secondary),
105
- "success": var(--bs-success),
106
- "info": var(--bs-info),
107
- "warning": var(--bs-warning),
108
- "danger": var(--bs-danger),
109
- "light": var(--bs-light),
110
- "dark": var(--bs-dark)
111
- );
112
-
113
- @each $color-name, $color-value in $theme-colors {
114
- // Soft background colors (10% opacity)
115
- .bg-#{$color-name}-soft {
116
- background-color: rgba(var(--bs-#{$color-name}-rgb), 0.5) !important;
117
- }
1
+ // =============================================================================
2
+ // UJ Bootstrap Theme
3
+ // =============================================================================
4
+ // Base Bootstrap theme with universal overrides.
5
+ // All UJ themes that extend Bootstrap inherit these utilities.
118
6
 
119
- // Soft text colors (more vibrant for readability)
120
- .text-#{$color-name}-soft {
121
- color: rgba(var(--bs-#{$color-name}-rgb), 0.8) !important;
122
- }
123
-
124
- // Soft border colors
125
- .border-#{$color-name}-soft {
126
- border-color: rgba(var(--bs-#{$color-name}-rgb), 0.2) !important;
127
- }
128
-
129
- // Soft buttons - background with hover states
130
- .btn-#{$color-name}-soft {
131
- color: var(--bs-#{$color-name});
132
- background-color: rgba(var(--bs-#{$color-name}-rgb), 0.1);
133
- border-color: rgba(var(--bs-#{$color-name}-rgb), 0.1);
134
-
135
- &:hover {
136
- color: var(--bs-#{$color-name});
137
- background-color: rgba(var(--bs-#{$color-name}-rgb), 0.2);
138
- border-color: rgba(var(--bs-#{$color-name}-rgb), 0.2);
139
- }
140
-
141
- &:focus,
142
- &:active,
143
- &.active {
144
- color: var(--bs-#{$color-name});
145
- background-color: rgba(var(--bs-#{$color-name}-rgb), 0.25);
146
- border-color: rgba(var(--bs-#{$color-name}-rgb), 0.25);
147
- box-shadow: 0 0 0 0.25rem rgba(var(--bs-#{$color-name}-rgb), 0.15);
148
- }
149
-
150
- &:disabled,
151
- &.disabled {
152
- color: rgba(var(--bs-#{$color-name}-rgb), 0.5);
153
- background-color: rgba(var(--bs-#{$color-name}-rgb), 0.05);
154
- border-color: rgba(var(--bs-#{$color-name}-rgb), 0.05);
155
- }
156
- }
157
-
158
- // Soft outline buttons
159
- .btn-outline-#{$color-name}-soft {
160
- color: var(--bs-#{$color-name});
161
- background-color: transparent;
162
- border-color: rgba(var(--bs-#{$color-name}-rgb), 0.3);
163
-
164
- &:hover {
165
- color: var(--bs-#{$color-name});
166
- background-color: rgba(var(--bs-#{$color-name}-rgb), 0.1);
167
- border-color: rgba(var(--bs-#{$color-name}-rgb), 0.4);
168
- }
169
-
170
- &:focus,
171
- &:active,
172
- &.active {
173
- color: var(--bs-#{$color-name});
174
- background-color: rgba(var(--bs-#{$color-name}-rgb), 0.15);
175
- border-color: rgba(var(--bs-#{$color-name}-rgb), 0.5);
176
- box-shadow: 0 0 0 0.25rem rgba(var(--bs-#{$color-name}-rgb), 0.15);
177
- }
178
- }
179
-
180
- // Soft badges
181
- .badge-#{$color-name}-soft {
182
- color: var(--bs-#{$color-name});
183
- background-color: rgba(var(--bs-#{$color-name}-rgb), 0.1);
184
- }
185
-
186
- // Soft alerts
187
- .alert-#{$color-name}-soft {
188
- color: var(--bs-#{$color-name});
189
- background-color: rgba(var(--bs-#{$color-name}-rgb), 0.1);
190
- border-color: rgba(var(--bs-#{$color-name}-rgb), 0.2);
191
-
192
- .alert-link {
193
- color: var(--bs-#{$color-name});
194
- text-decoration: underline;
195
- }
196
- }
197
- }
198
-
199
- /* Blog post card image height only - using Bootstrap's object-fit-cover class */
200
- .blog-post-card-image {
201
- height: 240px;
202
- width: 100%;
203
- }
204
-
205
- @media (max-width: 991.98px) {
206
- .blog-post-card-image {
207
- height: 240px;
208
- }
209
- }
210
-
211
- @media (max-width: 575.98px) {
212
- .blog-post-card-image {
213
- height: 200px;
214
- }
215
- }
216
-
217
- /* Blog post image height only - using Bootstrap's object-fit-cover class */
218
- .blog-post-image {
219
- max-height: 480px;
220
- width: 100%;
221
- }
7
+ // Import Bootstrap
8
+ @use './scss/bootstrap.scss' as *;
222
9
 
223
- @media (max-width: 991.98px) {
224
- .blog-post-image {
225
- max-height: 360px;
226
- }
227
- }
228
- @media (max-width: 575.98px) {
229
- .blog-post-image {
230
- max-height: 240px;
231
- }
232
- }
10
+ // Import UJ universal overrides
11
+ @use './overrides' as *;
@@ -0,0 +1,21 @@
1
+ // =============================================================================
2
+ // Accordion Enhancements
3
+ // =============================================================================
4
+ // Theme-aware accordion icons (plus/minus style).
5
+ // These are universal utilities available to all UJ themes.
6
+
7
+ // ============================================
8
+ // Light Mode Accordion Icons
9
+ // ============================================
10
+ .accordion-button::after {
11
+ --bs-accordion-btn-icon: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 448 512' fill='%23212529'%3E%3Cpath d='M256 80c0-17.7-14.3-32-32-32s-32 14.3-32 32l0 144L48 224c-17.7 0-32 14.3-32 32s14.3 32 32 32l144 0 0 144c0 17.7 14.3 32 32 32s32-14.3 32-32l0-144 144 0c17.7 0 32-14.3 32-32s-14.3-32-32-32l-144 0 0-144z'/%3E%3C/svg%3E");
12
+ --bs-accordion-btn-active-icon: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 448 512' fill='%23212529'%3E%3Cpath d='M432 256c0 17.7-14.3 32-32 32L48 288c-17.7 0-32-14.3-32-32s14.3-32 32-32l352 0c17.7 0 32 14.3 32 32z'/%3E%3C/svg%3E");
13
+ }
14
+
15
+ // ============================================
16
+ // Dark Mode Accordion Icons
17
+ // ============================================
18
+ [data-bs-theme="dark"] .accordion-button::after {
19
+ --bs-accordion-btn-icon: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 448 512' fill='%23ffffff'%3E%3Cpath d='M256 80c0-17.7-14.3-32-32-32s-32 14.3-32 32l0 144L48 224c-17.7 0-32 14.3-32 32s14.3 32 32 32l144 0 0 144c0 17.7 14.3 32 32 32s32-14.3 32-32l0-144 144 0c17.7 0 32-14.3 32-32s-14.3-32-32-32l-144 0 0-144z'/%3E%3C/svg%3E");
20
+ --bs-accordion-btn-active-icon: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 448 512' fill='%23ffffff'%3E%3Cpath d='M432 256c0 17.7-14.3 32-32 32L48 288c-17.7 0-32-14.3-32-32s14.3-32 32-32l352 0c17.7 0 32 14.3 32 32z'/%3E%3C/svg%3E");
21
+ }
@@ -1,6 +1,21 @@
1
- // Classy Avatar Components
2
- // Circular profile images with responsive sizing
3
- // Uses $avatar-sizes map from config
1
+ // =============================================================================
2
+ // Avatar Components
3
+ // =============================================================================
4
+ // Circular profile images with responsive sizing.
5
+ // These are universal utilities available to all UJ themes.
6
+
7
+ // ============================================
8
+ // Avatar Size Map
9
+ // ============================================
10
+ $avatar-sizes: (
11
+ null: 3rem, // default
12
+ xs: 1.5rem,
13
+ sm: 2rem,
14
+ md: 2.5rem,
15
+ lg: 3.5rem,
16
+ xl: 5rem,
17
+ xxl: 7.5rem
18
+ ) !default;
4
19
 
5
20
  // ============================================
6
21
  // Base Avatar Styles
@@ -0,0 +1,45 @@
1
+ // =============================================================================
2
+ // Blog Image Sizing
3
+ // =============================================================================
4
+ // Default blog post image dimensions.
5
+ // These are universal utilities available to all UJ themes.
6
+
7
+ // ============================================
8
+ // Blog Post Card Image
9
+ // ============================================
10
+ .blog-post-card-image {
11
+ height: 240px;
12
+ width: 100%;
13
+ }
14
+
15
+ @media (max-width: 991.98px) {
16
+ .blog-post-card-image {
17
+ height: 240px;
18
+ }
19
+ }
20
+
21
+ @media (max-width: 575.98px) {
22
+ .blog-post-card-image {
23
+ height: 200px;
24
+ }
25
+ }
26
+
27
+ // ============================================
28
+ // Blog Post Image
29
+ // ============================================
30
+ .blog-post-image {
31
+ max-height: 480px;
32
+ width: 100%;
33
+ }
34
+
35
+ @media (max-width: 991.98px) {
36
+ .blog-post-image {
37
+ max-height: 360px;
38
+ }
39
+ }
40
+
41
+ @media (max-width: 575.98px) {
42
+ .blog-post-image {
43
+ max-height: 240px;
44
+ }
45
+ }
@@ -0,0 +1,122 @@
1
+ // =============================================================================
2
+ // Adaptive Theme Buttons
3
+ // =============================================================================
4
+ // Buttons that automatically flip between light/dark styles based on theme.
5
+ // These are universal utilities available to all UJ themes.
6
+ // Note: Cannot use @extend with Bootstrap classes due to module scoping,
7
+ // so we use CSS custom properties directly.
8
+
9
+ // ============================================
10
+ // Button Style Mixins (DRY)
11
+ // ============================================
12
+ @mixin btn-dark-styles {
13
+ --bs-btn-color: #fff;
14
+ --bs-btn-bg: var(--bs-dark);
15
+ --bs-btn-border-color: var(--bs-dark);
16
+ --bs-btn-hover-color: #fff;
17
+ --bs-btn-hover-bg: #1c1c1c;
18
+ --bs-btn-hover-border-color: #1a1a1a;
19
+ --bs-btn-focus-shadow-rgb: 66, 70, 73;
20
+ --bs-btn-active-color: #fff;
21
+ --bs-btn-active-bg: #1a1a1a;
22
+ --bs-btn-active-border-color: #181818;
23
+ --bs-btn-disabled-color: #fff;
24
+ --bs-btn-disabled-bg: var(--bs-dark);
25
+ --bs-btn-disabled-border-color: var(--bs-dark);
26
+ }
27
+
28
+ @mixin btn-light-styles {
29
+ --bs-btn-color: #000;
30
+ --bs-btn-bg: var(--bs-light);
31
+ --bs-btn-border-color: var(--bs-light);
32
+ --bs-btn-hover-color: #000;
33
+ --bs-btn-hover-bg: #e9ecef;
34
+ --bs-btn-hover-border-color: #e2e6ea;
35
+ --bs-btn-focus-shadow-rgb: 211, 212, 213;
36
+ --bs-btn-active-color: #000;
37
+ --bs-btn-active-bg: #e2e6ea;
38
+ --bs-btn-active-border-color: #dae0e5;
39
+ --bs-btn-disabled-color: #000;
40
+ --bs-btn-disabled-bg: var(--bs-light);
41
+ --bs-btn-disabled-border-color: var(--bs-light);
42
+ }
43
+
44
+ @mixin btn-outline-dark-styles {
45
+ --bs-btn-color: var(--bs-dark);
46
+ --bs-btn-border-color: var(--bs-dark);
47
+ --bs-btn-hover-color: #fff;
48
+ --bs-btn-hover-bg: var(--bs-dark);
49
+ --bs-btn-hover-border-color: var(--bs-dark);
50
+ --bs-btn-focus-shadow-rgb: 33, 37, 41;
51
+ --bs-btn-active-color: #fff;
52
+ --bs-btn-active-bg: var(--bs-dark);
53
+ --bs-btn-active-border-color: var(--bs-dark);
54
+ --bs-btn-disabled-color: var(--bs-dark);
55
+ --bs-btn-disabled-border-color: var(--bs-dark);
56
+ }
57
+
58
+ @mixin btn-outline-light-styles {
59
+ --bs-btn-color: var(--bs-light);
60
+ --bs-btn-border-color: var(--bs-light);
61
+ --bs-btn-hover-color: #000;
62
+ --bs-btn-hover-bg: var(--bs-light);
63
+ --bs-btn-hover-border-color: var(--bs-light);
64
+ --bs-btn-focus-shadow-rgb: 248, 249, 250;
65
+ --bs-btn-active-color: #000;
66
+ --bs-btn-active-bg: var(--bs-light);
67
+ --bs-btn-active-border-color: var(--bs-light);
68
+ --bs-btn-disabled-color: var(--bs-light);
69
+ --bs-btn-disabled-border-color: var(--bs-light);
70
+ }
71
+
72
+ // ============================================
73
+ // Solid Adaptive Buttons
74
+ // ============================================
75
+ // Dark button in light mode, light button in dark mode
76
+ .btn-adaptive {
77
+ @include btn-dark-styles;
78
+ }
79
+
80
+ [data-bs-theme="dark"] .btn-adaptive {
81
+ @include btn-light-styles;
82
+ }
83
+
84
+ // ============================================
85
+ // Outline Adaptive Buttons
86
+ // ============================================
87
+ .btn-outline-adaptive {
88
+ @include btn-outline-dark-styles;
89
+ }
90
+
91
+ [data-bs-theme="dark"] .btn-outline-adaptive {
92
+ @include btn-outline-light-styles;
93
+ }
94
+
95
+ // ============================================
96
+ // Inverse Adaptive Buttons
97
+ // ============================================
98
+ // The opposite of adaptive - light in light mode, dark in dark mode
99
+ .btn-adaptive-inverse {
100
+ @include btn-light-styles;
101
+ }
102
+
103
+ [data-bs-theme="dark"] .btn-adaptive-inverse {
104
+ @include btn-dark-styles;
105
+ }
106
+
107
+ .btn-outline-adaptive-inverse {
108
+ @include btn-outline-light-styles;
109
+ }
110
+
111
+ [data-bs-theme="dark"] .btn-outline-adaptive-inverse {
112
+ @include btn-outline-dark-styles;
113
+ }
114
+
115
+ // ============================================
116
+ // Ghost Button
117
+ // ============================================
118
+ // Transparent background, no shadow - useful for subtle actions
119
+ .btn-ghost {
120
+ background: transparent;
121
+ box-shadow: none;
122
+ }
@@ -0,0 +1,13 @@
1
+ // =============================================================================
2
+ // Cursor Utilities
3
+ // =============================================================================
4
+ // Cursor style utilities for interactive elements.
5
+ // These are universal utilities available to all UJ themes.
6
+
7
+ .cursor-default { cursor: default !important; }
8
+ .cursor-pointer { cursor: pointer !important; }
9
+ .cursor-help { cursor: help !important; }
10
+ .cursor-move { cursor: move !important; }
11
+ .cursor-grab { cursor: grab !important; }
12
+ .cursor-not-allowed { cursor: not-allowed !important; }
13
+ .cursor-crosshair { cursor: crosshair !important; }
@@ -0,0 +1,29 @@
1
+ // =============================================================================
2
+ // UJ Bootstrap Overrides - Index
3
+ // =============================================================================
4
+ // Universal utilities and components that extend Bootstrap.
5
+ // All themes inheriting from Bootstrap will get these automatically.
6
+
7
+ // Buttons
8
+ @use 'buttons-adaptive';
9
+
10
+ // Colors
11
+ @use 'soft-colors';
12
+
13
+ // Components
14
+ @use 'avatars';
15
+ @use 'accordion';
16
+ @use 'spinners';
17
+
18
+ // Spacing & Layout
19
+ @use 'spacing-extended';
20
+
21
+ // Typography
22
+ @use 'typography-utilities';
23
+
24
+ // Utilities
25
+ @use 'cursor-utilities';
26
+ @use 'links';
27
+
28
+ // Blog
29
+ @use 'blog-images';
@@ -0,0 +1,31 @@
1
+ // =============================================================================
2
+ // Link Utilities
3
+ // =============================================================================
4
+ // Custom link styles and variations.
5
+ // These are universal utilities available to all UJ themes.
6
+
7
+ // ============================================
8
+ // Muted Link Style
9
+ // ============================================
10
+ // A link that looks like muted text but has hover effects
11
+ .link-muted {
12
+ --bs-text-opacity: 1;
13
+ color: var(--bs-secondary-color) !important;
14
+ text-decoration: none;
15
+ transition: opacity 0.15s ease-in-out;
16
+
17
+ &:hover,
18
+ &:focus {
19
+ color: var(--bs-secondary-color) !important;
20
+ text-decoration: underline;
21
+ opacity: 0.75;
22
+ }
23
+ }
24
+
25
+ // ============================================
26
+ // Active Nav Link Underline
27
+ // ============================================
28
+ // Adds underline to active nav links for better visibility
29
+ .nav-link.active {
30
+ text-decoration: underline !important;
31
+ }
@@ -1,11 +1,18 @@
1
- // Classy Soft Color Utilities
2
- // Transparent color variations for all Bootstrap theme colors
3
- // Uses Bootstrap's $theme-colors map which is available via config
1
+ // =============================================================================
2
+ // Soft Color Utilities
3
+ // =============================================================================
4
+ // Transparent color variations for all Bootstrap theme colors.
5
+ // These are universal utilities available to all UJ themes.
6
+
7
+ // ============================================
8
+ // Theme Colors (local definition for loop)
9
+ // ============================================
10
+ $_theme-color-names: "primary", "secondary", "success", "info", "warning", "danger", "light", "dark";
4
11
 
5
12
  // ============================================
6
13
  // Soft Color Generation Loop
7
14
  // ============================================
8
- @each $color-name, $color-value in $theme-colors {
15
+ @each $color-name in $_theme-color-names {
9
16
  // Soft background colors (50% opacity)
10
17
  .bg-#{$color-name}-soft {
11
18
  background-color: rgba(var(--bs-#{$color-name}-rgb), 0.5) !important;
@@ -0,0 +1,74 @@
1
+ // =============================================================================
2
+ // Extended Spacing Utilities
3
+ // =============================================================================
4
+ // Additional spacing utilities beyond Bootstrap's defaults.
5
+ // These are universal utilities available to all UJ themes.
6
+
7
+ // ============================================
8
+ // Spacer (local definition - matches Bootstrap default)
9
+ // ============================================
10
+ $_spacer: 1rem;
11
+
12
+ // ============================================
13
+ // Extended Padding & Margin Classes (6-10)
14
+ // ============================================
15
+ // Size mapping: 6=4rem, 7=5rem, 8=6rem, 9=8rem, 10=10rem
16
+ @for $i from 6 through 10 {
17
+ $size: if($i == 6, 4, if($i == 7, 5, if($i == 8, 6, if($i == 9, 8, 10))));
18
+
19
+ // Padding
20
+ .p-#{$i} { padding: $_spacer * $size !important; }
21
+ .pt-#{$i} { padding-top: $_spacer * $size !important; }
22
+ .pb-#{$i} { padding-bottom: $_spacer * $size !important; }
23
+ .ps-#{$i} { padding-left: $_spacer * $size !important; }
24
+ .pe-#{$i} { padding-right: $_spacer * $size !important; }
25
+ .px-#{$i} {
26
+ padding-left: $_spacer * $size !important;
27
+ padding-right: $_spacer * $size !important;
28
+ }
29
+ .py-#{$i} {
30
+ padding-top: $_spacer * $size !important;
31
+ padding-bottom: $_spacer * $size !important;
32
+ }
33
+
34
+ // Margin
35
+ .m-#{$i} { margin: $_spacer * $size !important; }
36
+ .mt-#{$i} { margin-top: $_spacer * $size !important; }
37
+ .mb-#{$i} { margin-bottom: $_spacer * $size !important; }
38
+ .ms-#{$i} { margin-left: $_spacer * $size !important; }
39
+ .me-#{$i} { margin-right: $_spacer * $size !important; }
40
+ .mx-#{$i} {
41
+ margin-left: $_spacer * $size !important;
42
+ margin-right: $_spacer * $size !important;
43
+ }
44
+ .my-#{$i} {
45
+ margin-top: $_spacer * $size !important;
46
+ margin-bottom: $_spacer * $size !important;
47
+ }
48
+ }
49
+
50
+ // ============================================
51
+ // Viewport Height Utilities
52
+ // ============================================
53
+ .vh-50 { height: 50vh !important; }
54
+ .vh-75 { height: 75vh !important; }
55
+ .vh-80 { height: 80vh !important; }
56
+ .vh-90 { height: 90vh !important; }
57
+ .vh-100 { height: 100vh !important; }
58
+
59
+ // Min-Height utilities using viewport height (vh) units
60
+ .min-vh-50 { min-height: 50vh !important; }
61
+ .min-vh-75 { min-height: 75vh !important; }
62
+ .min-vh-80 { min-height: 80vh !important; }
63
+ .min-vh-90 { min-height: 90vh !important; }
64
+ .min-vh-100 { min-height: 100vh !important; }
65
+
66
+ // ============================================
67
+ // Max Width Utilities (Bootstrap Breakpoints)
68
+ // ============================================
69
+ // Max width utility classes based on Bootstrap grid breakpoints
70
+ .mw-sm { max-width: 576px !important; }
71
+ .mw-md { max-width: 768px !important; }
72
+ .mw-lg { max-width: 992px !important; }
73
+ .mw-xl { max-width: 1200px !important; }
74
+ .mw-xxl { max-width: 1400px !important; }
@@ -1,5 +1,8 @@
1
- // Classy Spinner Components
2
- // Custom spinner size variants for Bootstrap spinners
1
+ // =============================================================================
2
+ // Extended Spinner Sizes
3
+ // =============================================================================
4
+ // Large spinner variants for Bootstrap spinners.
5
+ // These are universal utilities available to all UJ themes.
3
6
 
4
7
  // ============================================
5
8
  // Large Spinner - Border Variant
@@ -16,4 +19,4 @@
16
19
  .spinner-grow-lg {
17
20
  --bs-spinner-width: 3rem;
18
21
  --bs-spinner-height: 3rem;
19
- }
22
+ }
@@ -0,0 +1,40 @@
1
+ // =============================================================================
2
+ // Typography Utilities
3
+ // =============================================================================
4
+ // Font weight, letter spacing, and line height utilities.
5
+ // These are universal utilities available to all UJ themes.
6
+
7
+ // ============================================
8
+ // Font Weight Utilities
9
+ // ============================================
10
+ .fw-300 { font-weight: 300 !important; }
11
+ .fw-400 { font-weight: 400 !important; }
12
+ .fw-500 { font-weight: 500 !important; }
13
+ .fw-600 { font-weight: 600 !important; }
14
+ .fw-700 { font-weight: 700 !important; }
15
+ .fw-800 { font-weight: 800 !important; }
16
+ .fw-900 { font-weight: 900 !important; }
17
+
18
+ // ============================================
19
+ // Letter Spacing Utilities
20
+ // ============================================
21
+ .ls-tighter { letter-spacing: -0.04em !important; }
22
+ .ls-tight { letter-spacing: -0.02em !important; }
23
+ .ls-normal { letter-spacing: 0 !important; }
24
+ .ls-wide { letter-spacing: 0.02em !important; }
25
+ .ls-wider { letter-spacing: 0.04em !important; }
26
+
27
+ // ============================================
28
+ // Line Height Utilities
29
+ // ============================================
30
+ .lh-1 { line-height: 1 !important; }
31
+ .lh-tight { line-height: 1.2 !important; }
32
+ .lh-normal { line-height: 1.6 !important; }
33
+ .lh-relaxed { line-height: 1.8 !important; }
34
+ .lh-loose { line-height: 2 !important; }
35
+
36
+ // ============================================
37
+ // Text Decoration Utilities
38
+ // ============================================
39
+ .text-decoration-dotted { text-decoration-style: dotted !important; }
40
+ .text-decoration-dashed { text-decoration-style: dashed !important; }
@@ -1,5 +1,6 @@
1
1
  // Import the theme entry point
2
- import bootstrap from '../bootstrap/js/index.umd.js';
2
+ // __main_assets__ is a webpack alias that resolves to UJM's dist/assets
3
+ import bootstrap from '__main_assets__/themes/bootstrap/js/index.umd.js';
3
4
  import { ready as domReady } from 'web-manager/modules/dom.js';
4
5
 
5
6
  // Make Bootstrap available globally
@@ -9,8 +9,6 @@
9
9
  @import 'css/base/animations';
10
10
  @import 'css/base/backgrounds';
11
11
  @import 'css/base/borders';
12
- @import 'css/base/soft-colors';
13
- @import 'css/base/spacing';
14
12
  @import 'css/base/typography';
15
13
  @import 'css/base/utilities';
16
14
 
@@ -22,13 +20,14 @@
22
20
 
23
21
  // Import component styles
24
22
  @import 'css/components/accordion';
25
- @import 'css/components/avatars';
26
23
  @import 'css/components/badges';
27
24
  @import 'css/components/buttons';
28
25
  @import 'css/components/cards';
29
26
  @import 'css/components/carousel';
30
27
  @import 'css/components/forms';
31
- @import 'css/components/links';
32
28
  @import 'css/components/infinite-scroll';
33
- @import 'css/components/spinners';
34
29
  @import 'css/components/text';
30
+
31
+ // Import universal Bootstrap overrides (shared across all UJ themes)
32
+ // Must come AFTER Bootstrap is loaded via config to use @extend
33
+ @import '../bootstrap/overrides';
@@ -110,37 +110,6 @@ h6, .h6 {
110
110
  line-height: 1.6;
111
111
  }
112
112
 
113
-
114
-
115
- // ============================================
116
- // Font Weight Utilities
117
- // ============================================
118
- .fw-300 { font-weight: 300 !important; }
119
- .fw-400 { font-weight: 400 !important; }
120
- .fw-500 { font-weight: 500 !important; }
121
- .fw-600 { font-weight: 600 !important; }
122
- .fw-700 { font-weight: 700 !important; }
123
- .fw-800 { font-weight: 800 !important; }
124
- .fw-900 { font-weight: 900 !important; }
125
-
126
- // ============================================
127
- // Letter Spacing
128
- // ============================================
129
- .ls-tight { letter-spacing: -0.02em !important; }
130
- .ls-tighter { letter-spacing: -0.04em !important; }
131
- .ls-normal { letter-spacing: 0 !important; }
132
- .ls-wide { letter-spacing: 0.02em !important; }
133
- .ls-wider { letter-spacing: 0.04em !important; }
134
-
135
- // ============================================
136
- // Line Height Utilities
137
- // ============================================
138
- .lh-1 { line-height: 1 !important; }
139
- .lh-tight { line-height: 1.2 !important; }
140
- .lh-normal { line-height: 1.6 !important; }
141
- .lh-relaxed { line-height: 1.8 !important; }
142
- .lh-loose { line-height: 2 !important; }
143
-
144
113
  // ============================================
145
114
  // Code Blocks
146
115
  // ============================================
@@ -2,7 +2,7 @@
2
2
  // Custom helper classes and theme-specific utilities
3
3
 
4
4
  // ============================================
5
- // Shadow Utilities
5
+ // Shadow Utilities (Classy-specific)
6
6
  // ============================================
7
7
  .shadow-xs { box-shadow: $classy-shadow-xs !important; }
8
8
  .shadow-sm { box-shadow: $classy-shadow-sm !important; }
@@ -13,16 +13,3 @@
13
13
  .shadow-glow { box-shadow: $classy-shadow-glow !important; }
14
14
  .shadow-none { box-shadow: none !important; }
15
15
 
16
-
17
- // ============================================
18
- // Cursor Utilities
19
- // ============================================
20
- .cursor-default { cursor: default !important; }
21
- .cursor-pointer { cursor: pointer !important; }
22
- .cursor-help { cursor: help !important; }
23
- .cursor-move { cursor: move !important; }
24
- .cursor-grab { cursor: grab !important; }
25
- .cursor-not-allowed { cursor: not-allowed !important; }
26
- .cursor-crosshair { cursor: crosshair !important; }
27
- // .cursor-wait { cursor: wait !important; }
28
-
@@ -208,78 +208,6 @@
208
208
  }
209
209
  }
210
210
 
211
- // ============================================
212
- // Ghost Button
213
- // ============================================
214
- .btn-ghost {
215
- background: transparent;
216
- box-shadow: none;
217
- }
218
-
219
- // ============================================
220
- // Soft Buttons
221
- // ============================================
222
- .btn-soft-primary {
223
- background: rgba($primary, 0.1);
224
- color: $primary;
225
-
226
- &:hover {
227
- background: rgba($primary, 0.2);
228
- color: $primary;
229
- box-shadow: $classy-shadow-md;
230
- }
231
- }
232
-
233
- .btn-soft-secondary {
234
- background: rgba($secondary, 0.1);
235
- color: $secondary;
236
-
237
- &:hover {
238
- background: rgba($secondary, 0.2);
239
- color: $secondary;
240
- }
241
- }
242
-
243
- .btn-soft-success {
244
- background: rgba($success, 0.1);
245
- color: $success;
246
-
247
- &:hover {
248
- background: rgba($success, 0.2);
249
- color: $success;
250
- }
251
- }
252
-
253
- .btn-soft-danger {
254
- background: rgba($danger, 0.1);
255
- color: $danger;
256
-
257
- &:hover {
258
- background: rgba($danger, 0.2);
259
- color: $danger;
260
- }
261
- }
262
-
263
- .btn-soft-warning {
264
- background: rgba($warning, 0.1);
265
- color: $warning;
266
-
267
- &:hover {
268
- background: rgba($warning, 0.2);
269
- color: $warning;
270
- }
271
- }
272
-
273
- .btn-soft-info {
274
- background: rgba($info, 0.1);
275
- color: $info;
276
-
277
- &:hover {
278
- background: rgba($info, 0.2);
279
- color: $info;
280
- }
281
- }
282
-
283
211
  // ============================================
284
212
  // Button Groups
285
213
  // ============================================
@@ -311,67 +239,6 @@
311
239
  }
312
240
  }
313
241
 
314
- // ============================================
315
- // Adaptive Theme Buttons
316
- // ============================================
317
- .btn-adaptive {
318
- @extend .btn-dark;
319
- }
320
-
321
- [data-bs-theme="dark"] .btn-adaptive {
322
- @extend .btn-light;
323
- }
324
-
325
- .btn-outline-adaptive {
326
- @extend .btn-outline-dark;
327
- color: var(--bs-body-color) !important;
328
-
329
- &:hover {
330
- color: white !important;
331
- }
332
-
333
- &.active,
334
- &:active {
335
- background: $dark !important;
336
- border-color: $dark !important;
337
- color: white !important;
338
- }
339
- }
340
-
341
- [data-bs-theme="dark"] .btn-outline-adaptive {
342
- @extend .btn-outline-light;
343
- color: var(--bs-body-color) !important;
344
-
345
- &:hover {
346
- color: $dark !important;
347
- }
348
-
349
- &.active,
350
- &:active {
351
- background: $light !important;
352
- border-color: $light !important;
353
- color: $dark !important;
354
- }
355
- }
356
-
357
- // ============================================
358
- // Adaptive Inverse Buttons
359
- // ============================================
360
- .btn-adaptive-inverse {
361
- @extend .btn-light;
362
- }
363
-
364
- [data-bs-theme="dark"] .btn-adaptive-inverse {
365
- @extend .btn-dark;
366
- }
367
- .btn-outline-adaptive-inverse {
368
- @extend .btn-outline-light;
369
- }
370
-
371
- [data-bs-theme="dark"] .btn-outline-adaptive-inverse {
372
- @extend .btn-outline-dark;
373
- }
374
-
375
242
  // ============================================
376
243
  // Gradient Rainbow Button
377
244
  // ============================================
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ultimate-jekyll-manager",
3
- "version": "0.0.189",
3
+ "version": "0.0.190",
4
4
  "description": "Ultimate Jekyll dependency manager",
5
5
  "main": "dist/index.js",
6
6
  "exports": {
@@ -1,68 +0,0 @@
1
- // Classy Extended Spacing
2
- // Additional spacing utilities beyond Bootstrap's defaults
3
- // Uses Bootstrap's $spacer variable which is available via config
4
-
5
- // ============================================
6
- // Extended Padding Classes
7
- // ============================================
8
- @for $i from 6 through 10 {
9
- $size: if($i == 6, 4, if($i == 7, 5, if($i == 8, 6, if($i == 9, 8, 10))));
10
-
11
- .p-#{$i} { padding: $spacer * $size !important; }
12
- .pt-#{$i} { padding-top: $spacer * $size !important; }
13
- .pb-#{$i} { padding-bottom: $spacer * $size !important; }
14
- .ps-#{$i} { padding-left: $spacer * $size !important; }
15
- .pe-#{$i} { padding-right: $spacer * $size !important; }
16
- .px-#{$i} {
17
- padding-left: $spacer * $size !important;
18
- padding-right: $spacer * $size !important;
19
- }
20
- .py-#{$i} {
21
- padding-top: $spacer * $size !important;
22
- padding-bottom: $spacer * $size !important;
23
- }
24
- }
25
-
26
- // ============================================
27
- // VH classes
28
- // ============================================
29
- // Height utilities using viewport height (vh) units
30
- .vh-50 { height: 50vh !important; }
31
- .vh-75 { height: 75vh !important; }
32
- .vh-80 { height: 80vh !important; }
33
- .vh-90 { height: 90vh !important; }
34
- .vh-100 { height: 100vh !important; }
35
-
36
- // Min-Height utilities using viewport height (vh) units
37
- .min-vh-50 { min-height: 50vh !important; }
38
- .min-vh-75 { min-height: 75vh !important; }
39
- .min-vh-80 { min-height: 80vh !important; }
40
- .min-vh-90 { min-height: 90vh !important; }
41
- .min-vh-100 { min-height: 100vh !important; }
42
-
43
- // ============================================
44
- // Max Width Utilities (Bootstrap Breakpoints)
45
- // ============================================
46
- // Max width utility classes based on Bootstrap grid breakpoints
47
- // Usage: mw-sm, mw-md, mw-lg, mw-xl, mw-xxl
48
- // These set the max-width to match Bootstrap's container breakpoints
49
-
50
- .mw-sm {
51
- max-width: 576px !important;
52
- }
53
-
54
- .mw-md {
55
- max-width: 768px !important;
56
- }
57
-
58
- .mw-lg {
59
- max-width: 992px !important;
60
- }
61
-
62
- .mw-xl {
63
- max-width: 1200px !important;
64
- }
65
-
66
- .mw-xxl {
67
- max-width: 1400px !important;
68
- }
@@ -1,19 +0,0 @@
1
- // Classy Link Components
2
- // Custom link styles and variations
3
-
4
- // ============================================
5
- // Muted Link Style
6
- // ============================================
7
- .link-muted {
8
- --bs-text-opacity: 1;
9
- color: var(--bs-secondary-color) !important;
10
- text-decoration: none;
11
- transition: opacity 0.15s ease-in-out;
12
-
13
- &:hover,
14
- &:focus {
15
- color: var(--bs-secondary-color) !important;
16
- text-decoration: underline;
17
- opacity: 0.75;
18
- }
19
- }