ultimate-jekyll-manager 1.9.7 → 1.9.9
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 +1 -0
- package/dist/defaults/dist/_includes/themes/classy/backend/sections/sidebar.html +2 -2
- package/dist/defaults/dist/_includes/themes/classy/frontend/sections/nav.html +2 -2
- package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/auth/reset.html +1 -1
- package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/auth/signin.html +2 -2
- package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/auth/signup.html +2 -2
- package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/feedback.html +1 -1
- package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/index.html +2 -2
- package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/portal/email-preferences.html +1 -1
- package/dist/defaults/dist/pages/test/libraries/form-manager.html +8 -8
- package/docs/common-mistakes.md +1 -0
- package/docs/jekyll-plugin.md +3 -1
- package/package.json +3 -3
package/CLAUDE.md
CHANGED
|
@@ -193,6 +193,7 @@ All `npm install` calls in CLI commands (`npx mgr i`, `npx mgr setup`) route thr
|
|
|
193
193
|
- **No backwards compatibility** unless explicitly requested.
|
|
194
194
|
- **Don't add `?.` paranoia.** Framework internals (`manager.config`, `manager.webManager`) deref directly. `?.` belongs only on user-supplied config sub-fields, optional return values from regex matches, caught exceptions, and pre-init state.
|
|
195
195
|
- **Use `process.cwd()` (not hardcoded paths) for consumer-project resolution** in gulp tasks + commands. UJM runs inside the consumer's working directory.
|
|
196
|
+
- **All `<img src>` tags MUST have a cachebreaker** — append `?cb={{ site.uj.cache_breaker }}` to image `src` attributes in includes and layouts. This applies to logos, brandmarks, rating images, and any other image rendered via Liquid variables. External third-party URLs (YouTube embeds, analytics pixels, placeholder services) are exempt. `data-lazy="@src"` is handled at the JS layer, not here. See [docs/common-mistakes.md](docs/common-mistakes.md).
|
|
196
197
|
|
|
197
198
|
## Doc-update parity
|
|
198
199
|
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
<a href="{{ logo_href }}" class="d-flex align-items-center text-decoration-none text-body">
|
|
11
11
|
{% iftruthy logo_src %}
|
|
12
12
|
<div class="avatar avatar-md me-2 {{ logo_class }}">
|
|
13
|
-
<img src="{{ logo_src }}" alt="{{ logo_text }} Logo"/>
|
|
13
|
+
<img src="{{ logo_src }}?cb={{ site.uj.cache_breaker }}" alt="{{ logo_text }} Logo"/>
|
|
14
14
|
</div>
|
|
15
15
|
{% endiftruthy %}
|
|
16
16
|
{% iftruthy logo_text %}
|
|
@@ -186,7 +186,7 @@
|
|
|
186
186
|
<h5 class="offcanvas-title d-flex align-items-center" id="mobileSidebarLabel">
|
|
187
187
|
{% iftruthy logo_src %}
|
|
188
188
|
<div class="avatar avatar-md me-2">
|
|
189
|
-
<img src="{{ logo_src }}" alt="{{ logo_text }} Logo"/>
|
|
189
|
+
<img src="{{ logo_src }}?cb={{ site.uj.cache_breaker }}" alt="{{ logo_text }} Logo"/>
|
|
190
190
|
</div>
|
|
191
191
|
{% endiftruthy %}
|
|
192
192
|
{% iftruthy logo_text %}
|
|
@@ -9,10 +9,10 @@
|
|
|
9
9
|
<a class="navbar-brand d-inline-flex align-items-center py-0" href="{{ logo_href }}">
|
|
10
10
|
{% iftruthy logo_src %}
|
|
11
11
|
{% if data.logo.type == 'wordmark' %}
|
|
12
|
-
<img src="{{ logo_src }}" alt="{{ logo_text }} Logo" class="{{ logo_class }}" style="height: 2rem; width: auto;"/>
|
|
12
|
+
<img src="{{ logo_src }}?cb={{ site.uj.cache_breaker }}" alt="{{ logo_text }} Logo" class="{{ logo_class }}" style="height: 2rem; width: auto;"/>
|
|
13
13
|
{% else %}
|
|
14
14
|
<div class="avatar avatar-md me-2 {{ logo_class }}">
|
|
15
|
-
<img src="{{ logo_src }}" alt="{{ logo_text }} Logo"/>
|
|
15
|
+
<img src="{{ logo_src }}?cb={{ site.uj.cache_breaker }}" alt="{{ logo_text }} Logo"/>
|
|
16
16
|
</div>
|
|
17
17
|
{% endif %}
|
|
18
18
|
{% endiftruthy %}
|
|
@@ -33,7 +33,7 @@ layout: themes/[ site.theme.id ]/frontend/core/cover
|
|
|
33
33
|
<input type="email" class="form-control form-control-md" id="email" name="email" placeholder="Enter your email" autocomplete="email" autofocus required>
|
|
34
34
|
</div>
|
|
35
35
|
|
|
36
|
-
<button type="submit" class="btn btn-success _btn-lg w-100 mb-4" data-provider="email"
|
|
36
|
+
<button type="submit" class="btn btn-success _btn-lg w-100 mb-4" data-provider="email">
|
|
37
37
|
{{ initializing_spinner }}
|
|
38
38
|
{% uj_icon "paper-plane", "me-2" %}
|
|
39
39
|
<span class="button-text">Send reset link</span>
|
|
@@ -47,7 +47,7 @@ social_signin:
|
|
|
47
47
|
<!-- Social Login (Optional) -->
|
|
48
48
|
<div class="mb-4">
|
|
49
49
|
{% for provider in page.resolved.social_signin %}
|
|
50
|
-
<button type="submit" class="btn btn-adaptive _btn-lg w-100 mb-3 d-flex align-items-center justify-content-center" data-provider="{{ provider.id }}"
|
|
50
|
+
<button type="submit" class="btn btn-adaptive _btn-lg w-100 mb-3 d-flex align-items-center justify-content-center" data-provider="{{ provider.id }}">
|
|
51
51
|
{{ initializing_spinner }}
|
|
52
52
|
<span class="avatar avatar-xs me-2">
|
|
53
53
|
<img src="{{ provider.logo }}?cb={{ site.uj.cache_breaker }}" class="object-fit-contain" alt="{{ provider.name }} Logo"/>
|
|
@@ -84,7 +84,7 @@ social_signin:
|
|
|
84
84
|
|
|
85
85
|
</div>
|
|
86
86
|
|
|
87
|
-
<button type="submit" class="btn btn-success _btn-lg w-100 mb-2" data-provider="email"
|
|
87
|
+
<button type="submit" class="btn btn-success _btn-lg w-100 mb-2" data-provider="email">
|
|
88
88
|
{{ initializing_spinner }}
|
|
89
89
|
{% uj_icon "arrow-right-to-bracket", "me-2" %}
|
|
90
90
|
<span class="button-text">Sign in</span>
|
|
@@ -47,7 +47,7 @@ social_signup:
|
|
|
47
47
|
<!-- Social Signup (Optional) -->
|
|
48
48
|
<div class="mb-4">
|
|
49
49
|
{% for provider in page.resolved.social_signup %}
|
|
50
|
-
<button type="submit" class="btn btn-adaptive _btn-lg w-100 mb-3 d-flex align-items-center justify-content-center" data-provider="{{ provider.id }}"
|
|
50
|
+
<button type="submit" class="btn btn-adaptive _btn-lg w-100 mb-3 d-flex align-items-center justify-content-center" data-provider="{{ provider.id }}">
|
|
51
51
|
{{ initializing_spinner }}
|
|
52
52
|
<span class="avatar avatar-xs me-2">
|
|
53
53
|
<img src="{{ provider.logo }}?cb={{ site.uj.cache_breaker }}" class="object-fit-contain" alt="{{ provider.name }} Logo"/>
|
|
@@ -114,7 +114,7 @@ social_signup:
|
|
|
114
114
|
<div id="consent-error" class="small mt-2 d-none" style="color: var(--bs-form-invalid-color, var(--bs-danger, #dc3545));"></div>
|
|
115
115
|
</div>
|
|
116
116
|
|
|
117
|
-
<button type="submit" class="btn btn-success _btn-lg w-100 mb-3" data-provider="email"
|
|
117
|
+
<button type="submit" class="btn btn-success _btn-lg w-100 mb-3" data-provider="email">
|
|
118
118
|
{{ initializing_spinner }}
|
|
119
119
|
{% uj_icon "user-plus", "me-2" %}
|
|
120
120
|
<span class="button-text">Create account</span>
|
|
@@ -92,7 +92,7 @@ prerender_icons:
|
|
|
92
92
|
{% for rating in page.resolved.feedback_form.ratings %}
|
|
93
93
|
<div class="col-6 col-sm-3">
|
|
94
94
|
<button type="button" class="feedback-rating-btn w-100 border rounded-3 bg-body text-center" data-rating="{{ rating.id }}">
|
|
95
|
-
<img src="{{ rating.image }}" alt="{{ rating.label }}" class="feedback-rating-img mb-2" width="64" height="64" loading="eager">
|
|
95
|
+
<img src="{{ rating.image }}?cb={{ site.uj.cache_breaker }}" alt="{{ rating.label }}" class="feedback-rating-img mb-2" width="64" height="64" loading="eager">
|
|
96
96
|
<span class="d-block small fw-semibold text-muted">{{ rating.label }}</span>
|
|
97
97
|
</button>
|
|
98
98
|
</div>
|
|
@@ -236,7 +236,7 @@ cta:
|
|
|
236
236
|
autofocus
|
|
237
237
|
>
|
|
238
238
|
{% assign demo_btn_class = demo.options.button.class | default: "btn-adaptive-inverse" %}
|
|
239
|
-
<button type="submit" class="btn {{ demo_btn_class }} btn-lg text-nowrap flex-shrink-0"
|
|
239
|
+
<button type="submit" class="btn {{ demo_btn_class }} btn-lg text-nowrap flex-shrink-0">
|
|
240
240
|
{% iftruthy demo.options.button.icon %}
|
|
241
241
|
{% uj_icon demo.options.button.icon, "me-2" %}
|
|
242
242
|
{% endiftruthy %}
|
|
@@ -305,7 +305,7 @@ cta:
|
|
|
305
305
|
{% endfor %}
|
|
306
306
|
{% assign form_btn_class = demo.options.button.class | default: "btn-adaptive-inverse" %}
|
|
307
307
|
<div class="col-12 {% if demo.options.button.full_width != true %}col-sm-auto{% endif %}">
|
|
308
|
-
<button type="submit" class="btn {{ form_btn_class }} btn-lg w-100 h-100"
|
|
308
|
+
<button type="submit" class="btn {{ form_btn_class }} btn-lg w-100 h-100">
|
|
309
309
|
{% iftruthy demo.options.button.icon %}
|
|
310
310
|
{% uj_icon demo.options.button.icon, "me-2" %}
|
|
311
311
|
{% endiftruthy %}
|
package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/portal/email-preferences.html
CHANGED
|
@@ -87,7 +87,7 @@ prerender_icons:
|
|
|
87
87
|
<input type="text" class="form-control" name="honey" tabindex="-1" autocomplete="off">
|
|
88
88
|
</div>
|
|
89
89
|
|
|
90
|
-
<button type="submit" class="btn btn-danger w-100 mb-4" id="email-preferences-submit"
|
|
90
|
+
<button type="submit" class="btn btn-danger w-100 mb-4" id="email-preferences-submit">
|
|
91
91
|
<span class="button-text">Unsubscribe</span>
|
|
92
92
|
</button>
|
|
93
93
|
</form>
|
|
@@ -95,8 +95,8 @@ meta:
|
|
|
95
95
|
</div>
|
|
96
96
|
</div>
|
|
97
97
|
<div class="d-flex gap-2">
|
|
98
|
-
<button type="submit" data-action="save" class="btn btn-primary"
|
|
99
|
-
<button type="submit" data-action="draft" class="btn btn-outline-secondary"
|
|
98
|
+
<button type="submit" data-action="save" class="btn btn-primary">Save</button>
|
|
99
|
+
<button type="submit" data-action="draft" class="btn btn-outline-secondary">Save as Draft</button>
|
|
100
100
|
<button type="button" id="main-set-data" class="btn btn-outline-info">Set data</button>
|
|
101
101
|
</div>
|
|
102
102
|
</form>
|
|
@@ -139,7 +139,7 @@ meta:
|
|
|
139
139
|
<input type="checkbox" class="form-check-input" id="validation-terms" name="terms" required>
|
|
140
140
|
<label class="form-check-label" for="validation-terms">I agree to the terms (required)</label>
|
|
141
141
|
</div>
|
|
142
|
-
<button type="submit" class="btn btn-primary"
|
|
142
|
+
<button type="submit" class="btn btn-primary">Submit</button>
|
|
143
143
|
</form>
|
|
144
144
|
<div class="mt-2">
|
|
145
145
|
<small class="text-muted" id="validation-status">Status: ready</small>
|
|
@@ -161,7 +161,7 @@ meta:
|
|
|
161
161
|
<label for="contact-message" class="form-label">Message</label>
|
|
162
162
|
<textarea class="form-control" id="contact-message" name="message" rows="2">Hello!</textarea>
|
|
163
163
|
</div>
|
|
164
|
-
<button type="submit" class="btn btn-primary"
|
|
164
|
+
<button type="submit" class="btn btn-primary">Send message</button>
|
|
165
165
|
</form>
|
|
166
166
|
<div class="mt-2">
|
|
167
167
|
<small class="text-muted" id="contact-status">Status: ready</small>
|
|
@@ -183,7 +183,7 @@ meta:
|
|
|
183
183
|
<label for="manual-data" class="form-label">Data</label>
|
|
184
184
|
<input type="text" class="form-control" id="manual-data" name="data">
|
|
185
185
|
</div>
|
|
186
|
-
<button type="submit" class="btn btn-primary"
|
|
186
|
+
<button type="submit" class="btn btn-primary">Submit</button>
|
|
187
187
|
</form>
|
|
188
188
|
<div class="mt-2">
|
|
189
189
|
<small class="text-muted" id="manual-status">Status: initializing</small>
|
|
@@ -251,7 +251,7 @@ meta:
|
|
|
251
251
|
<button type="button" class="btn btn-outline-primary btn-sm groups-filter-btn" data-group="a">Group A</button>
|
|
252
252
|
<button type="button" class="btn btn-outline-success btn-sm groups-filter-btn" data-group="b">Group B</button>
|
|
253
253
|
<button type="button" class="btn btn-outline-info btn-sm groups-filter-btn" data-group='["a", "b"]'>Both (a, b)</button>
|
|
254
|
-
<button type="submit" class="btn btn-primary btn-sm ms-auto"
|
|
254
|
+
<button type="submit" class="btn btn-primary btn-sm ms-auto">Get data</button>
|
|
255
255
|
</div>
|
|
256
256
|
</form>
|
|
257
257
|
<div class="mt-3 d-flex gap-3">
|
|
@@ -292,7 +292,7 @@ meta:
|
|
|
292
292
|
<input type="file" class="form-control mx-auto" style="max-width: 300px;" name="pageFile">
|
|
293
293
|
<p data-file-drop-name class="small mt-2 mb-0 text-muted">No file selected</p>
|
|
294
294
|
</div>
|
|
295
|
-
<button type="submit" class="btn btn-primary"
|
|
295
|
+
<button type="submit" class="btn btn-primary">Submit</button>
|
|
296
296
|
</form>
|
|
297
297
|
<div class="mt-2">
|
|
298
298
|
<small class="text-muted" id="file-drop-status">Status: ready</small>
|
|
@@ -356,7 +356,7 @@ meta:
|
|
|
356
356
|
</div>
|
|
357
357
|
</div>
|
|
358
358
|
<div class="d-flex gap-2">
|
|
359
|
-
<button type="submit" class="btn btn-primary"
|
|
359
|
+
<button type="submit" class="btn btn-primary">
|
|
360
360
|
<span class="button-text">Submit (watch disabled states)</span>
|
|
361
361
|
</button>
|
|
362
362
|
<button type="button" id="snapshot-cycle" class="btn btn-outline-warning">Rapid cycle (5x)</button>
|
package/docs/common-mistakes.md
CHANGED
|
@@ -13,3 +13,4 @@
|
|
|
13
13
|
11. **Using native fetch** — always use `wonderful-fetch` or `authorized-fetch`.
|
|
14
14
|
12. **XSS — unescaped dynamic data in innerHTML** — Use `webManager.utilities().escapeHTML()`. Dynamic URLs in `href`/`src`/`action`/`window.location`/`window.open` ALSO need `webManager.utilities().sanitizeURL()` — `escapeHTML` alone lets `javascript:` execute. See [xss-prevention.md](xss-prevention.md).
|
|
15
15
|
13. **Leaving Liquid `{{ }}` or `{% %}` inside moved JS modules** — Jekyll does NOT process `src/assets/js/**/*.js`. Use `data-*` attribute bridges or `<template>` cloning.
|
|
16
|
+
14. **🚫 `<img src>` without cachebreakers** — every `<img src>` in includes/layouts MUST append `?cb={{ site.uj.cache_breaker }}` to the URL. This applies to logos, brandmarks, rating images — any image rendered via a Liquid variable. Without it, browsers serve stale cached versions indefinitely when the image file changes on the CDN. External third-party URLs are exempt. `data-lazy="@src"` is handled at the JS layer, not in the HTML.
|
package/docs/jekyll-plugin.md
CHANGED
|
@@ -6,7 +6,7 @@ Ultimate Jekyll uses the `jekyll-uj-powertools` gem for custom Liquid functional
|
|
|
6
6
|
|
|
7
7
|
## Available Features
|
|
8
8
|
|
|
9
|
-
- **Filters:** `uj_strip_ads`, `uj_json_escape`, `uj_title_case`, `uj_content_format`, `uj_hash`
|
|
9
|
+
- **Filters:** `uj_strip_ads`, `uj_json_escape`, `uj_title_case`, `uj_content_format`, `uj_hash`, `uj_append_param`, `uj_cachebreak`
|
|
10
10
|
- **Tags:** `iftruthy`, `iffalsy`, `uj_icon`, `uj_logo`, `uj_image`, `uj_member`, `uj_post`, `uj_readtime`, `uj_social`, `uj_translation_url`, `uj_fake_comments`, `uj_language`
|
|
11
11
|
- **Global Variables:** `site.uj.cache_breaker`
|
|
12
12
|
- **Page Variables:** `page.random_id`, `page.extension`, `page.layout_data`, `page.resolved`
|
|
@@ -67,3 +67,5 @@ asset_path: blog/post
|
|
|
67
67
|
```
|
|
68
68
|
|
|
69
69
|
Uses `/assets/css/pages/{{ asset_path }}.bundle.css` instead of deriving from `page.canonical.path`. Useful when multiple pages share assets (e.g., all blog posts). See also [docs/layouts-and-pages.md](layouts-and-pages.md).
|
|
70
|
+
|
|
71
|
+
**⚠️ Only set `asset_path` when sharing a module between pages.** Without it, the loader resolves `<pagePath>/index.js` automatically — that's the correct default for pages whose JS lives at `src/assets/js/pages/<pagePath>/index.js`. Setting `asset_path` overrides this to look for an **exact file** (`<asset_path>.js`), NOT a directory's `index.js`. A wrong `asset_path` fails **silently** — the page renders but the module never loads.
|
package/package.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ultimate-jekyll-manager",
|
|
3
|
-
"version": "1.9.
|
|
3
|
+
"version": "1.9.9",
|
|
4
4
|
"description": "Ultimate Jekyll dependency manager",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"files": [
|
|
7
|
-
"
|
|
7
|
+
"assets/",
|
|
8
8
|
"bin/",
|
|
9
|
+
"dist/",
|
|
9
10
|
"docs/",
|
|
10
|
-
"assets/",
|
|
11
11
|
"CLAUDE.md"
|
|
12
12
|
],
|
|
13
13
|
"exports": {
|