ultimate-jekyll-manager 1.6.7 → 1.6.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/CHANGELOG.md +19 -0
- package/CLAUDE.md +8 -0
- package/dist/assets/css/core/_lazy-loading.scss +6 -0
- package/dist/assets/js/core/auth.js +1 -1
- package/dist/defaults/CLAUDE.md +23 -0
- package/docs/test-framework.md +20 -0
- package/docs/themes.md +50 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -14,6 +14,25 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
|
|
14
14
|
- `Fixed` for any bug fixes.
|
|
15
15
|
- `Security` in case of vulnerabilities.
|
|
16
16
|
|
|
17
|
+
---
|
|
18
|
+
## [1.6.9] - 2026-06-08
|
|
19
|
+
|
|
20
|
+
### Added
|
|
21
|
+
|
|
22
|
+
- **Bootstrap-first theming convention.** Added comprehensive guidance to `docs/themes.md` and the default consumer `CLAUDE.md` — themes must restyle Bootstrap classes, not create parallel design systems.
|
|
23
|
+
- **Dev workflow documentation.** Added explicit instructions to `CLAUDE.md` and consumer defaults to check `logs/dev.log` instead of running `npm start`/`npm test` in consumer projects.
|
|
24
|
+
|
|
25
|
+
### Fixed
|
|
26
|
+
|
|
27
|
+
- **Signup metadata failure notification timeout.** Changed dev-only notification from permanent (`timeout: 0`) to 1 second (`timeout: 1000`) so it doesn't block the screen during development.
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
## [1.6.8] - 2026-06-07
|
|
31
|
+
|
|
32
|
+
### Fixed
|
|
33
|
+
|
|
34
|
+
- **Lazy loading animation flash.** Elements with `data-lazy="@class animation-*"` were briefly visible before the IntersectionObserver fired, causing a jarring flash (visible → disappear → fade-in). Added CSS rule to hide these elements from initial paint so they smoothly animate in.
|
|
35
|
+
|
|
17
36
|
---
|
|
18
37
|
## [1.6.5] - 2026-06-04
|
|
19
38
|
|
package/CLAUDE.md
CHANGED
|
@@ -43,6 +43,10 @@ The only things that ARE safe to run inside UJM itself:
|
|
|
43
43
|
4. `npm run build` — production build (`UJ_BUILD_MODE=true`)
|
|
44
44
|
5. `npm run deploy` — build + `npu sync --message='Deploy'`
|
|
45
45
|
6. `npm test` (or `npx mgr test`) — runs framework + project test suites
|
|
46
|
+
- `npx mgr test pages/home` — run a specific test by path (relative to `test/`)
|
|
47
|
+
- `npx mgr test ujm:pages/home` — run only framework tests matching a path
|
|
48
|
+
- `npx mgr test project:custom-test` — run only consumer project tests matching a path
|
|
49
|
+
- Prefix with `TEST_EXTENDED_MODE=true` for tests that hit real external APIs
|
|
46
50
|
|
|
47
51
|
### For Framework Development (This Repository)
|
|
48
52
|
|
|
@@ -154,6 +158,10 @@ Same `{ layer, description, run(ctx) }` contract as EM/BXM. JSON-line reporter p
|
|
|
154
158
|
|
|
155
159
|
Note: `-t` short alias belongs to `translation`. The `test` command uses `--test` flag + `test` positional only. See [docs/cli.md](docs/cli.md) (planned).
|
|
156
160
|
|
|
161
|
+
## Development Workflow
|
|
162
|
+
|
|
163
|
+
- **🚫 NEVER run `npm start` / `npm run build` / `npm test` in a consumer project** unless the user explicitly asks. The user runs the dev server — running it again kills theirs. Instead, **check `logs/dev.log`** after editing files to confirm the watcher recompiled successfully (`Reloading Browsers...` = success; `errored` = fix the error). If editing multiple files, check the log once after the last edit. A change that breaks the build is not a completed change.
|
|
164
|
+
|
|
157
165
|
## File Conventions
|
|
158
166
|
|
|
159
167
|
- **CommonJS** in build-time / Node files (gulp tasks, commands, lib/). **ESM** in `src/index.js` (frontend Manager — webpack-bundled).
|
|
@@ -12,6 +12,12 @@ img[data-lazy] {
|
|
|
12
12
|
height: auto; // Maintain aspect ratio
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
+
// Hide elements with pending animation classes to prevent flash
|
|
16
|
+
// (visible → disappear → fade-in) when IntersectionObserver fires
|
|
17
|
+
[data-lazy*="animation-"] {
|
|
18
|
+
opacity: 0;
|
|
19
|
+
}
|
|
20
|
+
|
|
15
21
|
// Hide video/audio elements until loaded to prevent ugly native controls showing during shimmer
|
|
16
22
|
[data-lazy-load-container].lazy-loading video,
|
|
17
23
|
[data-lazy-load-container].lazy-loading audio {
|
|
@@ -316,7 +316,7 @@ async function sendUserSignupMetadata(account) {
|
|
|
316
316
|
/* @dev-only:start */
|
|
317
317
|
webManager.utilities().showNotification(
|
|
318
318
|
`[DEV] Failed to send signup metadata. Will retry on next page load (flags.signupProcessed is still false).`,
|
|
319
|
-
{ type: 'warning', timeout:
|
|
319
|
+
{ type: 'warning', timeout: 1000 }
|
|
320
320
|
);
|
|
321
321
|
/* @dev-only:end */
|
|
322
322
|
}
|
package/dist/defaults/CLAUDE.md
CHANGED
|
@@ -28,6 +28,9 @@ npm start # dev: clean → setup → bundle exec gulp serve (Jekyll +
|
|
|
28
28
|
npm run build # production build (UJ_BUILD_MODE=true): clean → setup → full gulp pipeline → _site/
|
|
29
29
|
npm run deploy # build → `npu sync --message='Deploy'` (publishes _site/)
|
|
30
30
|
npx mgr test # run framework + project test suites (build / page / boot layers)
|
|
31
|
+
npx mgr test pages/home # run a specific test by path (relative to test/)
|
|
32
|
+
npx mgr test ujm:pages/home # run only framework tests matching a path
|
|
33
|
+
npx mgr test project:custom-test # run only consumer project tests matching a path
|
|
31
34
|
npx mgr audit # HTML validation + spellcheck + optional Lighthouse
|
|
32
35
|
npx mgr install dev # use LOCAL ultimate-jekyll-manager source (to test framework edits)
|
|
33
36
|
npx mgr install live # restore the published ultimate-jekyll-manager from npm
|
|
@@ -35,6 +38,26 @@ npx mgr install live # restore the published ultimate-jekyll-manager from npm
|
|
|
35
38
|
|
|
36
39
|
> Editing the UJM framework source while working here? Run `npx mgr install dev` so this project picks up your uncommitted framework changes (it otherwise uses its installed `node_modules/ultimate-jekyll-manager`). Run `npx mgr install live` to switch back.
|
|
37
40
|
|
|
41
|
+
## 🚨 BOOTSTRAP-FIRST — NEVER reinvent the wheel
|
|
42
|
+
|
|
43
|
+
**UJM is built on Bootstrap 5.** Every page MUST use Bootstrap classes for layout, spacing, typography, buttons, cards, grid, flex, and all standard components. Custom CSS exists ONLY to override how Bootstrap classes LOOK (via theme SCSS), NOT to replace them with parallel classes.
|
|
44
|
+
|
|
45
|
+
- **DO:** Use `.btn .btn-primary`, `.container`, `.row`, `.col-*`, `.d-flex`, `.gap-*`, `.py-5`, `.text-center`, `.card`, `.lead`, `.shadow`, `.rounded-*`, etc.
|
|
46
|
+
- **DO NOT:** Create custom `.my-btn`, `.my-wrap`, `.my-section` classes when Bootstrap already has equivalents. Don't write `padding`, `display: flex`, `gap`, `margin`, `text-align`, `font-weight` in custom CSS when a Bootstrap utility does the same thing.
|
|
47
|
+
- **Theme SCSS overrides appearance:** `.btn { border-radius: 50px; box-shadow: ... }` changes ALL buttons site-wide. You don't need `.lm-btn` — just restyle `.btn`.
|
|
48
|
+
- **Custom CSS is for genuinely novel components only:** animated hero illustrations, grain overlays, marquee strips — things with no Bootstrap equivalent.
|
|
49
|
+
|
|
50
|
+
See `node_modules/ultimate-jekyll-manager/docs/themes.md` for the full "Bootstrap-first" convention.
|
|
51
|
+
|
|
52
|
+
## 🚨 Development workflow — MUST follow
|
|
53
|
+
|
|
54
|
+
- **🚫 NEVER run `npm start`, `npm run build`, or `npm test`** unless the user explicitly asks. Assume the user is already running the dev server. Running these commands kills the user's process and wastes time.
|
|
55
|
+
- **✅ ALWAYS check `logs/dev.log`** after editing source files (SCSS, JS, HTML, config) to confirm the build succeeded. The dev server's gulp watcher recompiles on file change — check the log for errors.
|
|
56
|
+
- Success: `Reloading Browsers...`
|
|
57
|
+
- Failure: `'sass' errored`, `'webpack' errored`, `'build-error'`, `'jekyll' errored`
|
|
58
|
+
- If editing multiple files in a batch, check the log once after the last edit. Wait a few seconds for the watcher to recompile before reading the log.
|
|
59
|
+
- **If the log shows an error, fix it immediately.** A change that breaks the build is not a completed change.
|
|
60
|
+
|
|
38
61
|
## Where things live
|
|
39
62
|
|
|
40
63
|
- `src/_config.yml` — Jekyll config: brand, theme, meta, web_manager (Firebase). `Manager.getConfig('project')` reads this. **`brand.id` + `theme.id` are required.**
|
package/docs/test-framework.md
CHANGED
|
@@ -37,6 +37,26 @@ npx mgr test --reporter json # machine-readable __UJM_TEST__ events
|
|
|
37
37
|
|
|
38
38
|
`npm test` works too — added to consumer `package.json#scripts.test` on `npx mgr setup`.
|
|
39
39
|
|
|
40
|
+
### Filtering tests
|
|
41
|
+
|
|
42
|
+
Pass a path (relative to `test/`) as a positional argument to run specific tests:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
# Run a single test file
|
|
46
|
+
npx mgr test pages/home
|
|
47
|
+
|
|
48
|
+
# Run only UJM framework tests
|
|
49
|
+
npx mgr test ujm:pages/home
|
|
50
|
+
|
|
51
|
+
# Run only consumer project tests
|
|
52
|
+
npx mgr test project:custom-test
|
|
53
|
+
|
|
54
|
+
# Combine with extended mode
|
|
55
|
+
TEST_EXTENDED_MODE=true npx mgr test pages/boot-test
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
The filter matches against the test file path. `ujm:` and `project:` prefixes scope the filter to framework-only or project-only tests respectively. Without a prefix, both are searched.
|
|
59
|
+
|
|
40
60
|
## Layers
|
|
41
61
|
|
|
42
62
|
| Layer | Runs in | Use for |
|
package/docs/themes.md
CHANGED
|
@@ -345,6 +345,56 @@ their own (frozen) text color. Nav/dropdown/footer links already win on specific
|
|
|
345
345
|
|
|
346
346
|
---
|
|
347
347
|
|
|
348
|
+
## 🚨 BOOTSTRAP-FIRST — NEVER reinvent the wheel
|
|
349
|
+
|
|
350
|
+
**This is the #1 theme authoring mistake.** A theme's job is to RESTYLE Bootstrap — not to build a parallel design system alongside it.
|
|
351
|
+
|
|
352
|
+
### The rule
|
|
353
|
+
|
|
354
|
+
Every HTML element must use **Bootstrap classes first**. Custom CSS exists ONLY to override how those Bootstrap classes look (colors, shadows, borders, radii, typography) via the theme's SCSS. You should NEVER:
|
|
355
|
+
|
|
356
|
+
- Invent custom layout classes when Bootstrap grid/flex utilities exist (`.row`, `.col-*`, `.d-flex`, `.gap-*`, `.justify-content-*`, `.align-items-*`, `.text-center`, `.mx-auto`, etc.)
|
|
357
|
+
- Create custom button classes (`.my-btn`, `.lm-btn`) when `.btn .btn-primary`, `.btn .btn-outline-dark`, etc. already exist — restyle `.btn` in theme SCSS instead
|
|
358
|
+
- Create custom spacing/sizing classes when Bootstrap has `p-*`, `m-*`, `w-*`, `rounded-*`, `shadow-*`
|
|
359
|
+
- Create custom text utilities when Bootstrap has `.text-muted`, `.lead`, `.display-*`, `.fw-*`, `.fs-*`
|
|
360
|
+
- Create custom card/container classes when `.card`, `.card-body`, `.container`, `.lh-*` exist
|
|
361
|
+
- Write `position`, `display`, `flex`, `gap`, `padding`, `margin`, `border-radius`, `text-align`, `font-weight`, `font-size` in custom CSS when a Bootstrap utility class does the same thing
|
|
362
|
+
|
|
363
|
+
### What theme CSS IS for
|
|
364
|
+
|
|
365
|
+
- Overriding Bootstrap component appearance: `.btn { border-radius: 50px; box-shadow: ... }` — changes how ALL buttons look
|
|
366
|
+
- Setting design tokens: `$primary`, `$border-radius`, `$font-family-sans-serif` — passed to Bootstrap's `@forward`
|
|
367
|
+
- CSS custom properties for the theme palette: `--lm-accent`, `--lm-ink`, etc.
|
|
368
|
+
- Dark mode overrides via `[data-bs-theme="dark"]` variable remapping
|
|
369
|
+
- Truly novel components with no Bootstrap equivalent (grain overlays, animated hero cards, marquee strips)
|
|
370
|
+
- Mixins/utilities that compose Bootstrap patterns, not replace them
|
|
371
|
+
|
|
372
|
+
### How to check yourself
|
|
373
|
+
|
|
374
|
+
Before writing ANY custom CSS class, ask: "Does Bootstrap already have a class for this?" If yes, use it. If the Bootstrap class doesn't look right, override its appearance in theme SCSS — don't create a parallel class. The HTML should be 90%+ Bootstrap classes with custom classes only for genuinely novel UI patterns.
|
|
375
|
+
|
|
376
|
+
### Anti-pattern example
|
|
377
|
+
|
|
378
|
+
```html
|
|
379
|
+
<!-- BAD: parallel design system -->
|
|
380
|
+
<div class="lm-wrap">
|
|
381
|
+
<div class="lm-section">
|
|
382
|
+
<a class="lm-btn lm-btn-primary">Click</a>
|
|
383
|
+
</div>
|
|
384
|
+
</div>
|
|
385
|
+
|
|
386
|
+
<!-- GOOD: Bootstrap classes, theme restyled -->
|
|
387
|
+
<div class="container">
|
|
388
|
+
<section class="py-5">
|
|
389
|
+
<a class="btn btn-primary">Click</a>
|
|
390
|
+
</section>
|
|
391
|
+
</div>
|
|
392
|
+
```
|
|
393
|
+
|
|
394
|
+
The GOOD version uses zero custom CSS for layout/buttons — the theme's `_buttons.scss` restyled `.btn` and `.btn-primary` to look however it wants. The page `main.scss` only adds styles for genuinely novel components.
|
|
395
|
+
|
|
396
|
+
---
|
|
397
|
+
|
|
348
398
|
## Authoring conventions (both paths)
|
|
349
399
|
|
|
350
400
|
1. **Every token is `!default`** so consumers can override without forking.
|