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.
Files changed (87) hide show
  1. package/.claude/scheduled_tasks.lock +1 -0
  2. package/CHANGELOG.md +68 -1
  3. package/CLAUDE.md +36 -15
  4. package/README.md +4 -2
  5. package/TODO-AUTH-TESTING.md +1 -1
  6. package/dist/assets/js/libs/form-manager.js +4 -1
  7. package/dist/assets/js/pages/payment/confirmation/index.js +9 -0
  8. package/dist/assets/themes/newsflash/README.md +58 -0
  9. package/dist/assets/themes/newsflash/_config.scss +138 -0
  10. package/dist/assets/themes/newsflash/_theme.js +27 -0
  11. package/dist/assets/themes/newsflash/_theme.scss +37 -0
  12. package/dist/assets/themes/newsflash/css/base/_mixins.scss +50 -0
  13. package/dist/assets/themes/newsflash/css/base/_root.scss +134 -0
  14. package/dist/assets/themes/newsflash/css/base/_typography.scss +49 -0
  15. package/dist/assets/themes/newsflash/css/base/_utilities.scss +58 -0
  16. package/dist/assets/themes/newsflash/css/components/_badges.scss +65 -0
  17. package/dist/assets/themes/newsflash/css/components/_buttons.scss +139 -0
  18. package/dist/assets/themes/newsflash/css/components/_cards.scss +52 -0
  19. package/dist/assets/themes/newsflash/css/components/_editorial.scss +182 -0
  20. package/dist/assets/themes/newsflash/css/components/_forms.scss +75 -0
  21. package/dist/assets/themes/newsflash/css/components/_infinite-scroll.scss +102 -0
  22. package/dist/assets/themes/newsflash/css/components/_panels.scss +91 -0
  23. package/dist/assets/themes/newsflash/css/components/_ticker.scss +70 -0
  24. package/dist/assets/themes/newsflash/css/layout/_general.scss +264 -0
  25. package/dist/assets/themes/newsflash/css/layout/_navigation.scss +164 -0
  26. package/dist/assets/themes/newsflash/js/initialize-tooltips.js +20 -0
  27. package/dist/assets/themes/newsflash/js/masthead-scroll.js +29 -0
  28. package/dist/assets/themes/newsflash/pages/404/index.scss +27 -0
  29. package/dist/assets/themes/newsflash/pages/about/index.scss +70 -0
  30. package/dist/assets/themes/newsflash/pages/blog/index.scss +17 -0
  31. package/dist/assets/themes/newsflash/pages/blog/post.js +29 -0
  32. package/dist/assets/themes/newsflash/pages/blog/post.scss +164 -0
  33. package/dist/assets/themes/newsflash/pages/index.scss +159 -0
  34. package/dist/assets/themes/newsflash/pages/pricing/index.scss +194 -0
  35. package/dist/assets/themes/newsflash/pages/test/libraries/layers/index.js +9 -0
  36. package/dist/assets/themes/newsflash/pages/test/libraries/layers/index.scss +7 -0
  37. package/dist/commands/blogify.js +6 -3
  38. package/dist/commands/test.js +34 -5
  39. package/dist/defaults/CLAUDE.md +17 -4
  40. package/dist/defaults/dist/_includes/core/pricing/resolve-plan.html +59 -0
  41. package/dist/defaults/dist/_includes/themes/classy/frontend/sections/footer.html +20 -3
  42. package/dist/defaults/dist/_layouts/themes/classy/admin/core/minimal-viewport-locked.html +1 -1
  43. package/dist/defaults/dist/_layouts/themes/classy/admin/core/minimal.html +1 -1
  44. package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/pricing.html +5 -40
  45. package/dist/defaults/dist/_layouts/themes/neobrutalism/frontend/pages/pricing.html +33 -34
  46. package/dist/defaults/dist/_layouts/themes/newsflash/frontend/core/base.html +61 -0
  47. package/dist/defaults/dist/_layouts/themes/newsflash/frontend/pages/404.html +86 -0
  48. package/dist/defaults/dist/_layouts/themes/newsflash/frontend/pages/about.html +353 -0
  49. package/dist/defaults/dist/_layouts/themes/newsflash/frontend/pages/blog/categories/category.html +105 -0
  50. package/dist/defaults/dist/_layouts/themes/newsflash/frontend/pages/blog/categories/index.html +93 -0
  51. package/dist/defaults/dist/_layouts/themes/newsflash/frontend/pages/blog/index.html +373 -0
  52. package/dist/defaults/dist/_layouts/themes/newsflash/frontend/pages/blog/post.html +289 -0
  53. package/dist/defaults/dist/_layouts/themes/newsflash/frontend/pages/blog/tags/index.html +90 -0
  54. package/dist/defaults/dist/_layouts/themes/newsflash/frontend/pages/blog/tags/tag.html +107 -0
  55. package/dist/defaults/dist/_layouts/themes/newsflash/frontend/pages/contact.html +340 -0
  56. package/dist/defaults/dist/_layouts/themes/newsflash/frontend/pages/index.html +522 -0
  57. package/dist/defaults/dist/_layouts/themes/newsflash/frontend/pages/pricing.html +485 -0
  58. package/dist/defaults/dist/_layouts/themes/newsflash/frontend/pages/team/index.html +207 -0
  59. package/dist/defaults/dist/_layouts/themes/newsflash/frontend/pages/team/member.html +134 -0
  60. package/dist/defaults/test/README.md +4 -0
  61. package/dist/gulp/tasks/jekyll.js +4 -2
  62. package/dist/test/runner.js +50 -3
  63. package/dist/test/suites/build/attach-log-file.test.js +102 -0
  64. package/dist/test/suites/build/theme-contract.test.js +173 -0
  65. package/dist/test/utils/extended-mode-warning.js +13 -0
  66. package/dist/utils/attach-log-file.js +70 -43
  67. package/docs/appearance.md +1 -0
  68. package/docs/assets.md +9 -0
  69. package/docs/audit.md +27 -7
  70. package/docs/build-system.md +57 -0
  71. package/docs/common-mistakes.md +15 -0
  72. package/docs/{project-structure.md → directory-structure.md} +1 -1
  73. package/docs/environment-detection.md +1 -1
  74. package/docs/javascript-libraries.md +38 -1
  75. package/docs/layouts-and-pages.md +146 -0
  76. package/docs/local-development.md +1 -8
  77. package/docs/logging.md +30 -0
  78. package/docs/migration.md +131 -0
  79. package/docs/no-inline-scripts.md +304 -0
  80. package/docs/purgecss.md +164 -0
  81. package/docs/seo.md +131 -4
  82. package/docs/templating.md +23 -0
  83. package/docs/test-boot-layer.md +1 -1
  84. package/docs/test-framework.md +56 -8
  85. package/docs/themes.md +254 -13
  86. package/logs/test.log +111 -0
  87. package/package.json +1 -1
@@ -0,0 +1,264 @@
1
+ // Newsflash Theme — General Layout
2
+ // Section rhythm, footer, shadow utilities, and overrides for the
3
+ // gradient/accent classes the shared (Classy-derived) layouts emit. The goal:
4
+ // inherited pages (auth, account, team, feedback…) render as flat editorial
5
+ // paper-and-ink — no layout override needed.
6
+
7
+ // ============================================
8
+ // Section rhythm
9
+ // ============================================
10
+ // Shared layouts rely on the theme to provide vertical section padding.
11
+ // The masthead is sticky (in-flow), so no first-section navbar offset is
12
+ // needed — content starts right under the bar.
13
+ section {
14
+ padding-top: clamp(3rem, 6vw, 5rem);
15
+ padding-bottom: clamp(3rem, 6vw, 5rem);
16
+ }
17
+
18
+ // ============================================
19
+ // Gradient neutralization — inherited markup goes flat editorial
20
+ // ============================================
21
+ .bg-gradient-rainbow,
22
+ .gradient-animated,
23
+ .gradient-grain {
24
+ background-image: none !important;
25
+ animation: none !important;
26
+ }
27
+
28
+ // Hero sections ship as .bg-gradient-rainbow with light text; flatten to a
29
+ // paper-2 well closed by an ink rule, and pull the text back to ink.
30
+ section.bg-gradient-rainbow {
31
+ background-color: var(--nf-paper-2) !important;
32
+ color: var(--bs-body-color) !important;
33
+ border-radius: 0 !important;
34
+ border-bottom: var(--nf-border);
35
+ box-shadow: none !important;
36
+
37
+ .text-light,
38
+ &.text-light,
39
+ h1, h2, h3, .lead,
40
+ p {
41
+ color: var(--bs-body-color) !important;
42
+ }
43
+
44
+ // The hero tagline becomes a vermilion kicker line
45
+ .text-uppercase {
46
+ color: var(--bs-primary) !important;
47
+ font-weight: 800;
48
+ letter-spacing: 0.14em;
49
+ opacity: 1 !important;
50
+ }
51
+ }
52
+
53
+ // Gradient-clipped text → solid italic serif vermilion
54
+ .text-gradient-rainbow {
55
+ background: none !important;
56
+ -webkit-background-clip: initial !important;
57
+ background-clip: initial !important;
58
+ -webkit-text-fill-color: currentColor !important;
59
+ color: var(--bs-primary) !important;
60
+ font-family: $nf-font-display;
61
+ font-style: italic;
62
+ }
63
+
64
+ // Decorative gradient borders → hairline ink
65
+ .border-gradient-rainbow {
66
+ border-image: none !important;
67
+ border-color: var(--nf-line) !important;
68
+ }
69
+
70
+ // Glassy panels → framed paper
71
+ .bg-glassy,
72
+ .card.bg-glassy {
73
+ background: var(--bs-card-bg) !important;
74
+ backdrop-filter: none !important;
75
+ -webkit-backdrop-filter: none !important;
76
+ @include nf-border();
77
+ }
78
+
79
+ // Gradient promo/CTA cards (newsletter bands on inherited blog pages) →
80
+ // solid vermilion signup slab with ink frame + hard offset shadow.
81
+ .card.bg-gradient,
82
+ .card.bg-primary {
83
+ background-image: none !important;
84
+ background-color: var(--bs-primary) !important;
85
+ color: #fff !important;
86
+ @include nf-border();
87
+ box-shadow: var(--nf-shadow-hard-hover) !important;
88
+ }
89
+
90
+ // ============================================
91
+ // Shadow utilities → editorial pop (soft depth; frames carry the ink)
92
+ // ============================================
93
+ .shadow-sm { box-shadow: 0 8px 20px -14px rgba(23, 19, 16, 0.35) !important; }
94
+ .shadow { box-shadow: var(--nf-shadow-pop) !important; }
95
+ .shadow-lg { box-shadow: var(--nf-shadow-pop) !important; }
96
+
97
+ // Cards that ship with .border-0 (e.g. the auth card) lose the frame; give it
98
+ // back on elevated cards so the ink outline + pop shadow read as one object.
99
+ .card.border-0.shadow-sm,
100
+ .card.border-0.shadow,
101
+ .card.border-0.shadow-lg {
102
+ @include nf-border();
103
+ }
104
+
105
+ // ============================================
106
+ // Rules — hr reads as a soft editorial divider
107
+ // ============================================
108
+ hr {
109
+ border-top: 1px solid var(--nf-line);
110
+ opacity: 1;
111
+ }
112
+
113
+ // ============================================
114
+ // Footer — the ink slab that closes every page
115
+ // ============================================
116
+ // The shared footer include ships a .bg-body-secondary utility (!important,
117
+ // specificity 0,1,0) — the ink slab needs !important AND the class-qualified
118
+ // selector to beat it (a bare `footer` ties on !important and loses on
119
+ // specificity).
120
+ footer,
121
+ footer.bg-body-secondary {
122
+ background: var(--nf-panel-bg) !important;
123
+ }
124
+
125
+ footer {
126
+ color: var(--nf-panel-color);
127
+
128
+ h1, h2, h3, h4, h5, h6,
129
+ .h1, .h2, .h3, .h4, .h5, .h6 {
130
+ color: var(--nf-panel-color);
131
+ }
132
+
133
+ a {
134
+ color: var(--nf-panel-color);
135
+ opacity: 0.78;
136
+ text-decoration: none;
137
+ transition: $nf-transition;
138
+
139
+ &:hover {
140
+ opacity: 1;
141
+ color: var(--nf-volt);
142
+ }
143
+ }
144
+
145
+ // The inherited (classy) footer brand row ships an avatar + .h5 wordmark;
146
+ // render it as the masthead echo instead — wordmark-only, oversized serif —
147
+ // and keep the description to a column measure.
148
+ .h5 {
149
+ font-family: $nf-font-display;
150
+ font-size: clamp(1.6rem, 2.4vw, 2.1rem);
151
+
152
+ .avatar { display: none; }
153
+ }
154
+
155
+ p { max-width: 24em; }
156
+
157
+ // Inherited links carry .link-muted / .text-body utilities (!important
158
+ // color) — repaint with panel color so they read on the ink slab.
159
+ .text-body { color: var(--nf-panel-color) !important; }
160
+
161
+ .link-muted {
162
+ color: var(--nf-panel-color) !important;
163
+
164
+ &:hover,
165
+ &:focus {
166
+ color: var(--nf-volt) !important;
167
+ text-decoration: none;
168
+ opacity: 1;
169
+ }
170
+ }
171
+
172
+ // Muted footer text keeps panel contrast (utilities would go ink-soft)
173
+ .text-muted,
174
+ .text-body-secondary {
175
+ color: var(--nf-panel-color) !important;
176
+ opacity: 0.6;
177
+ }
178
+
179
+ // Volt uppercase column heads (the editorial footer's section labels).
180
+ // !important on weight: the inherited column heads carry .fw-semibold.
181
+ h6, .h6 {
182
+ font-family: $font-family-sans-serif;
183
+ font-size: 0.72rem;
184
+ font-weight: 800 !important;
185
+ letter-spacing: 0.14em;
186
+ text-transform: uppercase;
187
+ color: var(--nf-volt);
188
+ }
189
+
190
+ // Rules + dividers read as faint panel-color lines on the ink slab
191
+ hr,
192
+ .border-top {
193
+ border-top-color: color-mix(in srgb, var(--nf-panel-color) 18%, transparent) !important;
194
+ }
195
+
196
+ // Outline buttons (language/appearance pickers) carry the panel color — the
197
+ // global ghost-button rule paints body ink, which vanishes on the slab.
198
+ // Doubled attribute + footer scope (0,2,1) beats the global doubled rule.
199
+ [class*="btn-outline-"][class*="btn-outline-"] {
200
+ color: var(--nf-panel-color);
201
+ border-color: color-mix(in srgb, var(--nf-panel-color) 55%, transparent);
202
+ opacity: 1;
203
+ --bs-btn-hover-bg: var(--nf-panel-color);
204
+ --bs-btn-hover-color: var(--nf-panel-bg);
205
+
206
+ &:hover {
207
+ color: var(--nf-panel-bg);
208
+ background: var(--nf-panel-color);
209
+ border-color: var(--nf-panel-color);
210
+ }
211
+ }
212
+ }
213
+
214
+ // ============================================
215
+ // Alerts, accordions, modals — framed paper panels
216
+ // ============================================
217
+ .alert {
218
+ @include nf-border();
219
+ border-radius: var(--bs-border-radius-lg);
220
+ }
221
+
222
+ .accordion-item {
223
+ @include nf-border();
224
+ background: var(--bs-card-bg);
225
+
226
+ // Bootstrap strips the top border on stacked items; ours are framed
227
+ // objects, so force the full frame back on every item.
228
+ &:not(:first-of-type) {
229
+ border-top: var(--nf-border) !important;
230
+ }
231
+ }
232
+
233
+ .accordion-button {
234
+ font-family: $nf-font-display;
235
+ font-weight: 600;
236
+ background: var(--bs-card-bg);
237
+ color: var(--bs-body-color);
238
+
239
+ &:not(.collapsed) {
240
+ background: var(--nf-volt);
241
+ color: var(--nf-volt-ink);
242
+ box-shadow: none;
243
+ }
244
+
245
+ &:focus {
246
+ box-shadow: none;
247
+ border-color: var(--nf-border-color);
248
+ }
249
+ }
250
+
251
+ .modal-content,
252
+ .toast,
253
+ .offcanvas {
254
+ background: var(--bs-card-bg);
255
+ @include nf-border();
256
+ @include nf-shadow-pop();
257
+ }
258
+
259
+ // Back-to-top / floating action buttons stay on-brand
260
+ .btn-back-to-top {
261
+ border-radius: 50rem;
262
+ @include nf-border();
263
+ @include nf-shadow-hard();
264
+ }
@@ -0,0 +1,164 @@
1
+ // Newsflash Theme — Navigation
2
+ // The inherited nav markup (.navbar-wrapper > .navbar.navbar-floating) is a
3
+ // floating glass pill in Classy. Here it becomes the MASTHEAD: a sticky,
4
+ // blurred-paper bar closed by a hairline ink rule, serif brand on the left,
5
+ // uppercase pill links in the middle. The ticker (in base.html) sits above it
6
+ // in-flow and scrolls away; the masthead stays.
7
+
8
+ .navbar-wrapper {
9
+ position: sticky;
10
+ top: 0;
11
+ left: 0;
12
+ right: 0;
13
+ z-index: 1030;
14
+
15
+ .navbar {
16
+ width: 100%;
17
+ max-width: 100%;
18
+ margin: 0;
19
+ padding-left: clamp(1rem, 4vw, 3rem);
20
+ padding-right: clamp(1rem, 4vw, 3rem);
21
+ }
22
+ }
23
+
24
+ .navbar.navbar-floating {
25
+ border-radius: 0;
26
+ padding-top: 0.75rem;
27
+ padding-bottom: 0.75rem;
28
+ background: var(--nf-paper-translucent) !important;
29
+ backdrop-filter: blur(12px);
30
+ -webkit-backdrop-filter: blur(12px);
31
+ border: 0;
32
+ border-bottom: var(--nf-border);
33
+ transition: box-shadow 0.25s ease;
34
+
35
+ // Soft shadow only once scrolled (set by js/masthead-scroll.js)
36
+ &.scrolled {
37
+ box-shadow: 0 8px 24px -16px rgba(23, 19, 16, 0.4);
38
+ }
39
+
40
+ .container,
41
+ .container-fluid {
42
+ padding: 0;
43
+ }
44
+ }
45
+
46
+ // Brand: the serif masthead title
47
+ .navbar-brand {
48
+ font-family: $nf-font-display;
49
+ font-optical-sizing: auto;
50
+ font-weight: 600;
51
+ font-size: 1.5rem;
52
+ letter-spacing: -0.02em;
53
+
54
+ .brand-logo { height: 32px; width: auto; margin-right: 0.5rem; }
55
+ }
56
+
57
+ // Nav links: uppercase grotesk pills. Hover fills ink; active fills vermilion.
58
+ .navbar-nav .nav-link {
59
+ font-weight: 700;
60
+ font-size: 0.82rem;
61
+ text-transform: uppercase;
62
+ letter-spacing: 0.05em;
63
+ padding: 0.55rem 0.9rem;
64
+ margin: 0 0.1rem;
65
+ border-radius: 50rem;
66
+ color: var(--bs-body-color);
67
+ transition: $nf-transition;
68
+
69
+ // Hover + active need !important on color: the nav include puts Bootstrap's
70
+ // .text-body utility (!important) on every link, which otherwise wins and
71
+ // leaves ink text on the ink hover fill (unreadable).
72
+ &:hover {
73
+ background: var(--nf-ink);
74
+ color: var(--nf-paper) !important;
75
+ }
76
+
77
+ // Active = vermilion pill.
78
+ &.active,
79
+ &.active.text-body {
80
+ background: var(--nf-accent-interactive) !important;
81
+ color: var(--nf-accent-interactive-ink) !important;
82
+ }
83
+ }
84
+
85
+ // Mobile toggle: a pill ink-framed button
86
+ .navbar-toggler {
87
+ border-radius: 50rem;
88
+ padding: 0.35rem 0.6rem;
89
+ background: transparent;
90
+ @include nf-border();
91
+ transition: $nf-transition;
92
+
93
+ &:hover { background: var(--nf-paper-2); }
94
+ &:focus { box-shadow: 0 0 0 3px var(--nf-volt); }
95
+
96
+ .navbar-toggler-icon {
97
+ width: 1.25em;
98
+ height: 1.25em;
99
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%2823,19,16,1%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2.5' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");
100
+ }
101
+
102
+ [data-bs-theme="dark"] & .navbar-toggler-icon {
103
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28242,232,217,1%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2.5' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");
104
+ }
105
+ }
106
+
107
+ // Mobile collapsed menu becomes a framed paper drawer
108
+ @media (max-width: 991.98px) {
109
+ .navbar-collapse {
110
+ margin-top: 0.75rem;
111
+ padding: 0.85rem;
112
+ background: var(--bs-card-bg);
113
+ border-radius: var(--bs-border-radius-lg);
114
+ @include nf-border();
115
+ @include nf-shadow-pop();
116
+ }
117
+ }
118
+
119
+ // ============================================
120
+ // Dropdown menus — framed paper panels
121
+ // ============================================
122
+ // Doubled selector: page bundles re-emit Bootstrap's .dropdown-menu AFTER the
123
+ // main bundle, and its `--bs-dropdown-padding-x: 0` strips the inset — the
124
+ // highlighted item pills end up pressed edge-to-edge against the panel.
125
+ .dropdown-menu.dropdown-menu {
126
+ background: var(--bs-card-bg);
127
+ border-radius: var(--bs-border-radius);
128
+ @include nf-border();
129
+ @include nf-shadow-pop();
130
+ padding: 0.4rem;
131
+ margin-top: 0.6rem;
132
+
133
+ .dropdown-item {
134
+ border-radius: 50rem;
135
+ font-weight: 600;
136
+ padding: 0.5rem 0.9rem;
137
+ color: var(--bs-body-color);
138
+
139
+ // !important: dropdown items (account dropdown, nav dropdowns) carry
140
+ // text-color utilities from the shared includes — same trap as nav links.
141
+ &:hover,
142
+ &:focus {
143
+ background: var(--nf-ink);
144
+ color: var(--nf-paper) !important;
145
+
146
+ // Child text spans with their own utility colors flip with the item
147
+ [class*="text-"] {
148
+ color: inherit !important;
149
+ }
150
+ }
151
+
152
+ &.active,
153
+ &:active {
154
+ background: var(--nf-accent-interactive);
155
+ color: var(--nf-accent-interactive-ink) !important;
156
+ }
157
+ }
158
+
159
+ .dropdown-divider {
160
+ border-top: 1px solid var(--nf-line);
161
+ opacity: 1;
162
+ margin: 0.4rem 0;
163
+ }
164
+ }
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Initialize Bootstrap Tooltips
3
+ * Finds all elements with data-bs-toggle="tooltip" and initializes them
4
+ */
5
+ export default function initializeTooltips() {
6
+ const $tooltipTriggers = document.querySelectorAll('[data-bs-toggle="tooltip"]');
7
+
8
+ // If no tooltips found, exit early
9
+ if ($tooltipTriggers.length === 0) {
10
+ return;
11
+ }
12
+
13
+ // Log the number of tooltips being initialized
14
+ console.log(`Initializing ${$tooltipTriggers.length} tooltips`);
15
+
16
+ // Initialize each tooltip
17
+ $tooltipTriggers.forEach(($el) => {
18
+ new bootstrap.Tooltip($el);
19
+ });
20
+ }
@@ -0,0 +1,29 @@
1
+ // Masthead scroll effect for the Newsflash theme.
2
+ // Toggles a `.scrolled` class on the sticky masthead once the page is scrolled
3
+ // past a threshold; the SCSS turns that into a soft shadow under the bar.
4
+ // Threshold is configurable via the data-nf-scroll-threshold attribute on the navbar.
5
+ export default function setupMastheadScroll() {
6
+ const $navbar = document.querySelector('.navbar-floating');
7
+ if (!$navbar) {
8
+ return;
9
+ }
10
+
11
+ const threshold = parseInt($navbar.dataset.nfScrollThreshold, 10) || 8;
12
+
13
+ let ticking = false;
14
+ function update() {
15
+ $navbar.classList.toggle('scrolled', window.scrollY > threshold);
16
+ ticking = false;
17
+ }
18
+
19
+ function onScroll() {
20
+ if (!ticking) {
21
+ ticking = true;
22
+ window.requestAnimationFrame(update);
23
+ }
24
+ }
25
+
26
+ // Initial state + listener
27
+ update();
28
+ window.addEventListener('scroll', onScroll, { passive: true });
29
+ }
@@ -0,0 +1,27 @@
1
+ // Newsflash Theme — 404 page-specific CSS
2
+ // The "correction notice" treatment for
3
+ // (_layouts/themes/newsflash/frontend/pages/404.html).
4
+ // Compiles standalone, so it pulls in the theme tokens + mixins via loadPaths.
5
+ @use 'config' as *;
6
+ @import 'css/base/mixins';
7
+
8
+ // Oversized stroked serif numerals
9
+ .error-code {
10
+ font-family: $nf-font-display;
11
+ font-style: italic;
12
+ font-weight: 900;
13
+ font-size: clamp(5rem, 16vw, 8rem);
14
+ line-height: 1;
15
+ color: transparent;
16
+ -webkit-text-stroke: 2px var(--nf-ink);
17
+ }
18
+
19
+ // The rotated "Correction" chip pinned to the notice
20
+ .error-stamp {
21
+ position: absolute;
22
+ top: -0.85rem;
23
+ left: 50%;
24
+ transform: translateX(-50%) rotate(-3deg);
25
+ z-index: 1;
26
+ white-space: nowrap;
27
+ }
@@ -0,0 +1,70 @@
1
+ // Newsflash Theme — About page-specific CSS
2
+ // The editorial timeline for
3
+ // (_layouts/themes/newsflash/frontend/pages/about.html).
4
+ // Compiles standalone, so it pulls in the theme tokens + mixins via loadPaths.
5
+ @use 'config' as *;
6
+ @import 'css/base/mixins';
7
+
8
+ // Single-rail editorial timeline: an ink rule down the left, volt year chips
9
+ // hanging on it, entries stepping down the page.
10
+ .timeline {
11
+ position: relative;
12
+ padding-left: 1.5rem;
13
+ border-left: var(--nf-border);
14
+ }
15
+
16
+ .timeline-item {
17
+ position: relative;
18
+ display: flex;
19
+ flex-direction: column;
20
+ align-items: flex-start;
21
+ gap: 0.6rem;
22
+ padding-bottom: 2.25rem;
23
+
24
+ &:last-child {
25
+ padding-bottom: 0;
26
+ }
27
+
28
+ // The rule marker — a vermilion dot pinned to the rail
29
+ &::before {
30
+ content: "";
31
+ position: absolute;
32
+ left: calc(-1.5rem - 5.75px); // centers the dot on the 1.5px rail
33
+ top: 0.45rem;
34
+ width: 10px;
35
+ height: 10px;
36
+ border-radius: 50%;
37
+ background: var(--bs-primary);
38
+ border: var(--nf-border);
39
+ }
40
+ }
41
+
42
+ .timeline-year {
43
+ transform: rotate(-2deg);
44
+ }
45
+
46
+ // ============================================
47
+ // Reader quotes — letters to the editor
48
+ // ============================================
49
+ .quote-card {
50
+ &::before {
51
+ content: "\201C";
52
+ display: block;
53
+ font-family: $nf-font-display;
54
+ font-weight: 900;
55
+ font-size: 3rem;
56
+ line-height: 0.5;
57
+ color: var(--bs-primary);
58
+ margin-bottom: 0.5rem;
59
+ }
60
+
61
+ p {
62
+ font-family: $nf-font-display;
63
+ font-optical-sizing: auto;
64
+ font-style: italic;
65
+ font-weight: 550;
66
+ font-size: 1.15rem;
67
+ letter-spacing: -0.01em;
68
+ line-height: 1.45;
69
+ }
70
+ }
@@ -0,0 +1,17 @@
1
+ // Newsflash Theme — Blog index page-specific CSS
2
+ // Small accents for the newspaper front page
3
+ // (_layouts/themes/newsflash/frontend/pages/blog/index.html).
4
+ // Compiles standalone, so it pulls in the theme tokens + mixins via loadPaths.
5
+ @use 'config' as *;
6
+ @import 'css/base/mixins';
7
+
8
+ // The lead-story splash stays planted — only its framed image zooms
9
+ .story-card--lead {
10
+ &:hover {
11
+ transform: none;
12
+ }
13
+
14
+ .art-frame {
15
+ aspect-ratio: 16 / 10;
16
+ }
17
+ }
@@ -0,0 +1,29 @@
1
+ // Newsflash Theme — Blog post page JS (the #theme layer)
2
+ // Drives the reading-progress bar: fills the fixed top rule as the reader
3
+ // scrolls through the page. NOTE: flat file shape — the post layout sets
4
+ // `asset_path: blog/post`, so this loads as pages/blog/post.js.
5
+ export default ({ manager, options }) => {
6
+ const $bar = document.querySelector('.reading-progress > span');
7
+ if (!$bar) {
8
+ return;
9
+ }
10
+
11
+ let ticking = false;
12
+ function update() {
13
+ const $doc = document.documentElement;
14
+ const progress = $doc.scrollTop / ($doc.scrollHeight - $doc.clientHeight);
15
+ $bar.style.transform = `scaleX(${Math.min(Math.max(progress, 0), 1)})`;
16
+ ticking = false;
17
+ }
18
+
19
+ function onScroll() {
20
+ if (!ticking) {
21
+ ticking = true;
22
+ window.requestAnimationFrame(update);
23
+ }
24
+ }
25
+
26
+ // Initial state + listener
27
+ update();
28
+ window.addEventListener('scroll', onScroll, { passive: true });
29
+ };