ultimate-jekyll-manager 1.7.1 → 1.8.0
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/scheduled_tasks.lock +1 -0
- package/CHANGELOG.md +68 -1
- package/CLAUDE.md +36 -15
- package/README.md +4 -2
- package/TODO-AUTH-TESTING.md +1 -1
- package/dist/assets/js/libs/form-manager.js +4 -1
- package/dist/assets/js/pages/payment/confirmation/index.js +9 -0
- package/dist/assets/themes/newsflash/README.md +58 -0
- package/dist/assets/themes/newsflash/_config.scss +138 -0
- package/dist/assets/themes/newsflash/_theme.js +27 -0
- package/dist/assets/themes/newsflash/_theme.scss +37 -0
- package/dist/assets/themes/newsflash/css/base/_mixins.scss +50 -0
- package/dist/assets/themes/newsflash/css/base/_root.scss +134 -0
- package/dist/assets/themes/newsflash/css/base/_typography.scss +49 -0
- package/dist/assets/themes/newsflash/css/base/_utilities.scss +58 -0
- package/dist/assets/themes/newsflash/css/components/_badges.scss +65 -0
- package/dist/assets/themes/newsflash/css/components/_buttons.scss +139 -0
- package/dist/assets/themes/newsflash/css/components/_cards.scss +52 -0
- package/dist/assets/themes/newsflash/css/components/_editorial.scss +182 -0
- package/dist/assets/themes/newsflash/css/components/_forms.scss +75 -0
- package/dist/assets/themes/newsflash/css/components/_infinite-scroll.scss +102 -0
- package/dist/assets/themes/newsflash/css/components/_panels.scss +91 -0
- package/dist/assets/themes/newsflash/css/components/_ticker.scss +70 -0
- package/dist/assets/themes/newsflash/css/layout/_general.scss +264 -0
- package/dist/assets/themes/newsflash/css/layout/_navigation.scss +164 -0
- package/dist/assets/themes/newsflash/js/initialize-tooltips.js +20 -0
- package/dist/assets/themes/newsflash/js/masthead-scroll.js +29 -0
- package/dist/assets/themes/newsflash/pages/404/index.scss +27 -0
- package/dist/assets/themes/newsflash/pages/about/index.scss +70 -0
- package/dist/assets/themes/newsflash/pages/blog/index.scss +17 -0
- package/dist/assets/themes/newsflash/pages/blog/post.js +29 -0
- package/dist/assets/themes/newsflash/pages/blog/post.scss +164 -0
- package/dist/assets/themes/newsflash/pages/index.scss +159 -0
- package/dist/assets/themes/newsflash/pages/pricing/index.scss +194 -0
- package/dist/assets/themes/newsflash/pages/test/libraries/layers/index.js +9 -0
- package/dist/assets/themes/newsflash/pages/test/libraries/layers/index.scss +7 -0
- package/dist/commands/blogify.js +6 -3
- package/dist/commands/test.js +34 -5
- package/dist/defaults/CLAUDE.md +17 -4
- package/dist/defaults/dist/_includes/core/pricing/resolve-plan.html +59 -0
- package/dist/defaults/dist/_includes/themes/classy/frontend/sections/footer.html +20 -3
- package/dist/defaults/dist/_layouts/themes/classy/admin/core/minimal-viewport-locked.html +1 -1
- package/dist/defaults/dist/_layouts/themes/classy/admin/core/minimal.html +1 -1
- package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/pricing.html +5 -40
- package/dist/defaults/dist/_layouts/themes/neobrutalism/frontend/pages/pricing.html +33 -34
- package/dist/defaults/dist/_layouts/themes/newsflash/frontend/core/base.html +61 -0
- package/dist/defaults/dist/_layouts/themes/newsflash/frontend/pages/404.html +86 -0
- package/dist/defaults/dist/_layouts/themes/newsflash/frontend/pages/about.html +353 -0
- package/dist/defaults/dist/_layouts/themes/newsflash/frontend/pages/blog/categories/category.html +105 -0
- package/dist/defaults/dist/_layouts/themes/newsflash/frontend/pages/blog/categories/index.html +93 -0
- package/dist/defaults/dist/_layouts/themes/newsflash/frontend/pages/blog/index.html +373 -0
- package/dist/defaults/dist/_layouts/themes/newsflash/frontend/pages/blog/post.html +289 -0
- package/dist/defaults/dist/_layouts/themes/newsflash/frontend/pages/blog/tags/index.html +90 -0
- package/dist/defaults/dist/_layouts/themes/newsflash/frontend/pages/blog/tags/tag.html +107 -0
- package/dist/defaults/dist/_layouts/themes/newsflash/frontend/pages/contact.html +340 -0
- package/dist/defaults/dist/_layouts/themes/newsflash/frontend/pages/index.html +522 -0
- package/dist/defaults/dist/_layouts/themes/newsflash/frontend/pages/pricing.html +485 -0
- package/dist/defaults/dist/_layouts/themes/newsflash/frontend/pages/team/index.html +207 -0
- package/dist/defaults/dist/_layouts/themes/newsflash/frontend/pages/team/member.html +134 -0
- package/dist/defaults/test/README.md +4 -0
- package/dist/gulp/tasks/jekyll.js +4 -2
- package/dist/test/runner.js +50 -3
- package/dist/test/suites/build/attach-log-file.test.js +102 -0
- package/dist/test/suites/build/theme-contract.test.js +173 -0
- package/dist/test/utils/extended-mode-warning.js +13 -0
- package/dist/utils/attach-log-file.js +70 -43
- package/docs/appearance.md +1 -0
- package/docs/assets.md +9 -0
- package/docs/audit.md +27 -7
- package/docs/build-system.md +57 -0
- package/docs/common-mistakes.md +15 -0
- package/docs/{project-structure.md → directory-structure.md} +1 -1
- package/docs/environment-detection.md +1 -1
- package/docs/javascript-libraries.md +38 -1
- package/docs/layouts-and-pages.md +146 -0
- package/docs/local-development.md +1 -8
- package/docs/logging.md +30 -0
- package/docs/migration.md +131 -0
- package/docs/no-inline-scripts.md +304 -0
- package/docs/purgecss.md +164 -0
- package/docs/seo.md +131 -4
- package/docs/templating.md +23 -0
- package/docs/test-boot-layer.md +1 -1
- package/docs/test-framework.md +56 -8
- package/docs/themes.md +254 -13
- package/logs/test.log +111 -0
- package/package.json +1 -1
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
// Newsflash Theme — Editorial Primitives
|
|
2
|
+
// The cross-page newsroom vocabulary: kickers, section heads with rules, and
|
|
3
|
+
// framed images. Genuinely novel UI (no Bootstrap equivalent) → universal
|
|
4
|
+
// semantic class names other themes are free to style their own way.
|
|
5
|
+
|
|
6
|
+
// ============================================
|
|
7
|
+
// Kicker — the uppercase vermilion micro-label above headlines
|
|
8
|
+
// ============================================
|
|
9
|
+
.kicker {
|
|
10
|
+
display: inline-flex;
|
|
11
|
+
align-items: center;
|
|
12
|
+
gap: 0.5em;
|
|
13
|
+
font-family: $font-family-sans-serif;
|
|
14
|
+
font-size: 0.72rem;
|
|
15
|
+
font-weight: 800;
|
|
16
|
+
letter-spacing: 0.14em;
|
|
17
|
+
text-transform: uppercase;
|
|
18
|
+
color: var(--bs-primary);
|
|
19
|
+
|
|
20
|
+
&::before {
|
|
21
|
+
content: "";
|
|
22
|
+
width: 7px;
|
|
23
|
+
height: 7px;
|
|
24
|
+
background: currentColor;
|
|
25
|
+
border-radius: 50%;
|
|
26
|
+
flex: none;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// ============================================
|
|
31
|
+
// Section head — uppercase label + full-width ink rule (+ optional link)
|
|
32
|
+
// ============================================
|
|
33
|
+
.section-head {
|
|
34
|
+
display: flex;
|
|
35
|
+
align-items: baseline;
|
|
36
|
+
gap: 1.25rem;
|
|
37
|
+
margin-bottom: 1.75rem;
|
|
38
|
+
|
|
39
|
+
h2, h3, .h2, .h3 {
|
|
40
|
+
font-family: $font-family-sans-serif;
|
|
41
|
+
font-size: 1.05rem;
|
|
42
|
+
font-weight: 800;
|
|
43
|
+
letter-spacing: 0.12em;
|
|
44
|
+
text-transform: uppercase;
|
|
45
|
+
line-height: 1;
|
|
46
|
+
margin: 0;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
.rule {
|
|
50
|
+
flex: 1;
|
|
51
|
+
height: var(--nf-border-width);
|
|
52
|
+
background: var(--nf-border-color);
|
|
53
|
+
align-self: center;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
a {
|
|
57
|
+
font-size: 0.82rem;
|
|
58
|
+
font-weight: 700;
|
|
59
|
+
color: var(--bs-primary);
|
|
60
|
+
text-decoration: none;
|
|
61
|
+
white-space: nowrap;
|
|
62
|
+
|
|
63
|
+
&:hover {
|
|
64
|
+
text-decoration: underline;
|
|
65
|
+
text-underline-offset: 0.2em;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// ============================================
|
|
71
|
+
// Art frame — the framed editorial image
|
|
72
|
+
// ============================================
|
|
73
|
+
// Hairline ink border + radius; images zoom slowly when the parent
|
|
74
|
+
// link/card is hovered (rule lives in _cards.scss).
|
|
75
|
+
.art-frame {
|
|
76
|
+
border: var(--nf-border);
|
|
77
|
+
border-radius: var(--bs-border-radius-lg);
|
|
78
|
+
overflow: hidden;
|
|
79
|
+
background: var(--nf-paper-2);
|
|
80
|
+
|
|
81
|
+
// uj_post image-tags render as <picture><img>. The wrapper must fill the
|
|
82
|
+
// frame or the img's percentage height resolves against the auto-height
|
|
83
|
+
// picture instead — leaving a blank strip inside the frame.
|
|
84
|
+
picture {
|
|
85
|
+
display: block;
|
|
86
|
+
width: 100%;
|
|
87
|
+
height: 100%;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
img {
|
|
91
|
+
width: 100%;
|
|
92
|
+
height: 100%;
|
|
93
|
+
object-fit: cover;
|
|
94
|
+
display: block;
|
|
95
|
+
transition: transform 0.6s cubic-bezier(0.22, 1, 0.36, 1);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
@media (prefers-reduced-motion: reduce) {
|
|
100
|
+
.art-frame img { transition: none; }
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// ============================================
|
|
104
|
+
// Headline links outside cards (feed rows, hero) — same grow-rule affordance
|
|
105
|
+
// ============================================
|
|
106
|
+
.headline-link {
|
|
107
|
+
color: inherit;
|
|
108
|
+
text-decoration: none;
|
|
109
|
+
@include nf-underline-grow();
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// ============================================
|
|
113
|
+
// Story card — a whole-tile link to an article (home, blog index, read-next)
|
|
114
|
+
// ============================================
|
|
115
|
+
// Framed image + kicker + serif headline + byline meta. The tile lifts and
|
|
116
|
+
// its framed image zooms on hover.
|
|
117
|
+
.story-card {
|
|
118
|
+
display: block;
|
|
119
|
+
color: inherit;
|
|
120
|
+
text-decoration: none;
|
|
121
|
+
transition: $nf-transition;
|
|
122
|
+
|
|
123
|
+
&:hover {
|
|
124
|
+
color: inherit;
|
|
125
|
+
transform: translateY(-5px);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
&:hover .art-frame img {
|
|
129
|
+
transform: scale(1.04);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
h2, h3, .h4, .h5 {
|
|
133
|
+
font-optical-sizing: auto;
|
|
134
|
+
letter-spacing: -0.012em;
|
|
135
|
+
line-height: 1.22;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
.art-frame {
|
|
139
|
+
aspect-ratio: 16 / 10;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// ============================================
|
|
144
|
+
// Feed item — an editorial list row (thumb/number + headline + dek)
|
|
145
|
+
// ============================================
|
|
146
|
+
.feed-item {
|
|
147
|
+
display: grid;
|
|
148
|
+
grid-template-columns: 200px 1fr;
|
|
149
|
+
gap: 1.5rem;
|
|
150
|
+
align-items: center;
|
|
151
|
+
padding: 1.6rem 0;
|
|
152
|
+
border-bottom: 1.5px dashed var(--nf-line);
|
|
153
|
+
color: inherit;
|
|
154
|
+
text-decoration: none;
|
|
155
|
+
|
|
156
|
+
&:first-child { padding-top: 0; }
|
|
157
|
+
&:last-child { border-bottom: 0; }
|
|
158
|
+
|
|
159
|
+
.art-frame {
|
|
160
|
+
aspect-ratio: 1 / 1;
|
|
161
|
+
border-radius: var(--bs-border-radius);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
a.feed-item:hover {
|
|
166
|
+
color: inherit;
|
|
167
|
+
|
|
168
|
+
.art-frame img {
|
|
169
|
+
transform: scale(1.04);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
@media (max-width: 767.98px) {
|
|
174
|
+
.feed-item {
|
|
175
|
+
grid-template-columns: 1fr;
|
|
176
|
+
gap: 0.9rem;
|
|
177
|
+
|
|
178
|
+
.art-frame {
|
|
179
|
+
aspect-ratio: 16 / 9;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
// Newsflash Theme — Forms
|
|
2
|
+
// Pill inputs framed in ink with a volt focus ring — the newsletter-signup
|
|
3
|
+
// look applied to every form control.
|
|
4
|
+
|
|
5
|
+
.form-control,
|
|
6
|
+
.form-select {
|
|
7
|
+
background-color: var(--bs-body-bg);
|
|
8
|
+
border: var(--nf-border);
|
|
9
|
+
color: var(--bs-body-color);
|
|
10
|
+
border-radius: 50rem;
|
|
11
|
+
font-weight: 500;
|
|
12
|
+
padding: 0.6rem 1.1rem;
|
|
13
|
+
transition: $nf-transition;
|
|
14
|
+
|
|
15
|
+
&::placeholder {
|
|
16
|
+
color: var(--bs-secondary-color);
|
|
17
|
+
opacity: 0.8;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
&:focus {
|
|
21
|
+
background-color: var(--bs-body-bg);
|
|
22
|
+
border-color: var(--nf-border-color);
|
|
23
|
+
color: var(--bs-body-color);
|
|
24
|
+
box-shadow: 0 0 0 3px var(--nf-volt);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// Multiline fields keep the editorial frame radius (a pill textarea is silly)
|
|
29
|
+
textarea.form-control {
|
|
30
|
+
border-radius: var(--bs-border-radius);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// Checks + radios: ink frames, vermilion when checked
|
|
34
|
+
.form-check-input {
|
|
35
|
+
border: var(--nf-border);
|
|
36
|
+
background-color: var(--bs-body-bg);
|
|
37
|
+
|
|
38
|
+
&:checked {
|
|
39
|
+
background-color: var(--bs-primary);
|
|
40
|
+
border-color: var(--nf-border-color);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
&:focus {
|
|
44
|
+
border-color: var(--nf-border-color);
|
|
45
|
+
box-shadow: 0 0 0 3px var(--nf-volt);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Switches keep the pill but pick up the ink frame
|
|
50
|
+
.form-switch .form-check-input {
|
|
51
|
+
border-radius: 50rem;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Labels read as compact editorial labels
|
|
55
|
+
.form-label {
|
|
56
|
+
font-weight: 700;
|
|
57
|
+
font-size: 0.85rem;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Input groups: joined pill — round only the outer corners
|
|
61
|
+
.input-group {
|
|
62
|
+
> .form-control:not(:last-child),
|
|
63
|
+
> .form-select:not(:last-child) {
|
|
64
|
+
border-top-right-radius: 0;
|
|
65
|
+
border-bottom-right-radius: 0;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
> .btn:last-child {
|
|
69
|
+
border-top-right-radius: 50rem;
|
|
70
|
+
border-bottom-right-radius: 50rem;
|
|
71
|
+
border-top-left-radius: 0;
|
|
72
|
+
border-bottom-left-radius: 0;
|
|
73
|
+
box-shadow: none; // joined controls share one frame; no floating shadow
|
|
74
|
+
}
|
|
75
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
// Newsflash Theme — Infinite Scroll
|
|
2
|
+
// Structural marquee used by the shared layouts (trusted-by logo strip,
|
|
3
|
+
// testimonial scroll). Mostly layout/animation (theme-agnostic); cosmetic
|
|
4
|
+
// bits are tuned to the editorial look (framed cards, paper fade edges).
|
|
5
|
+
// NOTE: this is structural behavior the inherited Classy layouts depend on —
|
|
6
|
+
// see docs/themes.md "Structural vs visual components".
|
|
7
|
+
|
|
8
|
+
.infinite-scroll-wrapper {
|
|
9
|
+
position: relative;
|
|
10
|
+
width: 100vw;
|
|
11
|
+
margin-left: calc(-50vw + 50%);
|
|
12
|
+
overflow: hidden;
|
|
13
|
+
|
|
14
|
+
&.infinite-scroll-fade-edges {
|
|
15
|
+
&::before,
|
|
16
|
+
&::after {
|
|
17
|
+
content: '';
|
|
18
|
+
position: absolute;
|
|
19
|
+
top: 0;
|
|
20
|
+
bottom: 0;
|
|
21
|
+
width: 100px;
|
|
22
|
+
z-index: 10;
|
|
23
|
+
pointer-events: none;
|
|
24
|
+
}
|
|
25
|
+
&::before { left: 0; background: linear-gradient(to right, var(--bs-body-bg), transparent); }
|
|
26
|
+
&::after { right: 0; background: linear-gradient(to left, var(--bs-body-bg), transparent); }
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
.infinite-scroll-track {
|
|
31
|
+
display: flex;
|
|
32
|
+
width: fit-content;
|
|
33
|
+
animation: infinite-scroll var(--infinite-scroll-duration, 30s) linear infinite;
|
|
34
|
+
|
|
35
|
+
&:hover { animation-play-state: paused; }
|
|
36
|
+
|
|
37
|
+
&.gap-sm { gap: 1rem; }
|
|
38
|
+
&.gap-md { gap: 1.5rem; }
|
|
39
|
+
&.gap-lg { gap: 2rem; }
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
.infinite-scroll-item { flex-shrink: 0; }
|
|
43
|
+
|
|
44
|
+
@keyframes infinite-scroll {
|
|
45
|
+
0% { transform: translateX(0); }
|
|
46
|
+
100% { transform: translateX(var(--infinite-scroll-distance, -50%)); }
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
@media (prefers-reduced-motion: reduce) {
|
|
50
|
+
.infinite-scroll-track { animation: none; }
|
|
51
|
+
.infinite-scroll-wrapper { overflow-x: auto; }
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Logo items — quiet ink-tinted marks that wake on hover
|
|
55
|
+
.infinite-scroll-item--logo {
|
|
56
|
+
padding: 0 3rem;
|
|
57
|
+
display: flex;
|
|
58
|
+
align-items: center;
|
|
59
|
+
height: 60px;
|
|
60
|
+
|
|
61
|
+
img, svg {
|
|
62
|
+
height: 40px;
|
|
63
|
+
width: auto;
|
|
64
|
+
max-width: 150px;
|
|
65
|
+
opacity: 0.65;
|
|
66
|
+
transition: $nf-transition;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
&:hover img,
|
|
70
|
+
&:hover svg {
|
|
71
|
+
opacity: 1;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// Card items (testimonials) — framed paper, pop on hover
|
|
76
|
+
.infinite-scroll-item--card {
|
|
77
|
+
width: 320px;
|
|
78
|
+
padding: 0.5rem 0.5rem 1.5rem 0; // room for the pop shadow
|
|
79
|
+
|
|
80
|
+
.card {
|
|
81
|
+
height: 100%;
|
|
82
|
+
|
|
83
|
+
&:hover {
|
|
84
|
+
@include nf-shadow-pop();
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
@media (max-width: 768px) {
|
|
90
|
+
.infinite-scroll-wrapper.infinite-scroll-fade-edges {
|
|
91
|
+
&::before,
|
|
92
|
+
&::after { width: 50px; }
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
.infinite-scroll-item--logo {
|
|
96
|
+
padding: 0 2rem;
|
|
97
|
+
height: 50px;
|
|
98
|
+
img, svg { height: 30px; }
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
.infinite-scroll-item--card { width: 280px; }
|
|
102
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
// Newsflash Theme — Shared Panels & Numerals
|
|
2
|
+
// Cross-page editorial set pieces: the dark "big read" CTA band (home,
|
|
3
|
+
// pricing, about) and the stroked serif numerals (stats strips, step
|
|
4
|
+
// numbers). Universal semantic class names — no theme prefixes.
|
|
5
|
+
|
|
6
|
+
// ============================================
|
|
7
|
+
// CTA panel — the dark big-read band
|
|
8
|
+
// ============================================
|
|
9
|
+
.cta-panel {
|
|
10
|
+
background: var(--nf-panel-bg);
|
|
11
|
+
color: var(--nf-panel-color);
|
|
12
|
+
border-radius: calc(#{$nf-radius} + 8px);
|
|
13
|
+
padding: clamp(2.5rem, 6vw, 4rem);
|
|
14
|
+
position: relative;
|
|
15
|
+
overflow: hidden;
|
|
16
|
+
|
|
17
|
+
.kicker {
|
|
18
|
+
color: var(--nf-volt);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
.text-accent {
|
|
22
|
+
color: var(--nf-volt);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
.cta-title {
|
|
27
|
+
font-style: italic;
|
|
28
|
+
font-weight: 550;
|
|
29
|
+
font-size: clamp(2rem, 3.6vw, 3.2rem);
|
|
30
|
+
letter-spacing: -0.015em;
|
|
31
|
+
line-height: 1.1;
|
|
32
|
+
margin: 0.75rem 0;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
.cta-desc {
|
|
36
|
+
color: var(--nf-panel-color);
|
|
37
|
+
opacity: 0.72;
|
|
38
|
+
max-width: 36em;
|
|
39
|
+
margin-bottom: 1.75rem;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Spinning vermilion ring field — the band's decorative flourish
|
|
43
|
+
.cta-rings {
|
|
44
|
+
position: absolute;
|
|
45
|
+
right: -120px;
|
|
46
|
+
top: 50%;
|
|
47
|
+
width: 520px;
|
|
48
|
+
aspect-ratio: 1;
|
|
49
|
+
border-radius: 50%;
|
|
50
|
+
background: repeating-radial-gradient(circle, var(--nf-vermilion) 0 2px, transparent 2px 34px);
|
|
51
|
+
opacity: 0.7;
|
|
52
|
+
transform: translateY(-50%);
|
|
53
|
+
animation: cta-rings-spin 60s linear infinite;
|
|
54
|
+
pointer-events: none;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
@keyframes cta-rings-spin {
|
|
58
|
+
to { transform: translateY(-50%) rotate(360deg); }
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
@media (max-width: 991.98px) {
|
|
62
|
+
.cta-rings { opacity: 0.3; }
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
@media (prefers-reduced-motion: reduce) {
|
|
66
|
+
.cta-rings { animation: none; }
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// ============================================
|
|
70
|
+
// Feature icon chip — round accent badge for desk cards (features, values,
|
|
71
|
+
// contact methods)
|
|
72
|
+
// ============================================
|
|
73
|
+
.feature-icon {
|
|
74
|
+
width: 3rem;
|
|
75
|
+
height: 3rem;
|
|
76
|
+
flex: none;
|
|
77
|
+
border: var(--nf-border);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// ============================================
|
|
81
|
+
// Stroked numerals — stats strips, oversized counters
|
|
82
|
+
// ============================================
|
|
83
|
+
.stat-num {
|
|
84
|
+
font-family: $nf-font-display;
|
|
85
|
+
font-style: italic;
|
|
86
|
+
font-weight: 800;
|
|
87
|
+
font-size: clamp(2.6rem, 5vw, 3.6rem);
|
|
88
|
+
line-height: 1.1;
|
|
89
|
+
color: transparent;
|
|
90
|
+
-webkit-text-stroke: 1.5px var(--nf-ink);
|
|
91
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
// Newsflash Theme — News Ticker
|
|
2
|
+
// The signature strip above the masthead: an ink bar marquee-scrolling the
|
|
3
|
+
// latest headlines with a pulsing live dot. Pure CSS animation — the track
|
|
4
|
+
// content is duplicated once in the layout, so -50% loops seamlessly.
|
|
5
|
+
// Genuinely novel UI (no Bootstrap equivalent) → universal semantic classes.
|
|
6
|
+
|
|
7
|
+
.ticker {
|
|
8
|
+
background: var(--nf-panel-bg);
|
|
9
|
+
color: var(--nf-panel-color);
|
|
10
|
+
overflow: hidden;
|
|
11
|
+
white-space: nowrap;
|
|
12
|
+
font-size: 0.78rem;
|
|
13
|
+
font-weight: 600;
|
|
14
|
+
letter-spacing: 0.03em;
|
|
15
|
+
|
|
16
|
+
a {
|
|
17
|
+
color: inherit;
|
|
18
|
+
text-decoration: none;
|
|
19
|
+
|
|
20
|
+
&:hover {
|
|
21
|
+
color: var(--nf-volt);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
.ticker-track {
|
|
27
|
+
display: inline-flex;
|
|
28
|
+
padding: 0.55em 0;
|
|
29
|
+
animation: ticker-scroll 36s linear infinite;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
.ticker:hover .ticker-track {
|
|
33
|
+
animation-play-state: paused;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
.ticker-item {
|
|
37
|
+
display: inline-flex;
|
|
38
|
+
align-items: center;
|
|
39
|
+
gap: 0.6em;
|
|
40
|
+
padding: 0 1.6em;
|
|
41
|
+
|
|
42
|
+
// Bolt separators render via {% uj_icon %} — keep them volt
|
|
43
|
+
svg, i {
|
|
44
|
+
color: var(--nf-volt);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
.live-dot {
|
|
49
|
+
width: 7px;
|
|
50
|
+
height: 7px;
|
|
51
|
+
border-radius: 50%;
|
|
52
|
+
flex: none;
|
|
53
|
+
background: var(--nf-vermilion);
|
|
54
|
+
animation: live-pulse 1.4s ease-in-out infinite;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
@keyframes ticker-scroll {
|
|
58
|
+
to { transform: translateX(-50%); }
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
@keyframes live-pulse {
|
|
62
|
+
0%, 100% { opacity: 1; transform: scale(1); }
|
|
63
|
+
50% { opacity: 0.45; transform: scale(0.8); }
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
@media (prefers-reduced-motion: reduce) {
|
|
67
|
+
.ticker-track { animation: none; }
|
|
68
|
+
.live-dot { animation: none; }
|
|
69
|
+
.ticker { overflow-x: auto; }
|
|
70
|
+
}
|