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,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
+ }