@rathnasgala2/template 2.1.0 → 3.0.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/README.md CHANGED
@@ -199,9 +199,9 @@ every page (a scoped decision: navigation/footer text does not flip language
199
199
  page to page); each page's own `<html lang>`/`dir` still reflects that
200
200
  individual page's own content language.
201
201
 
202
- The Light/Dark/System appearance controller (`src/core/internal/appearance/`) is
203
- the only browser bootstrap this renderer emits ("Module absence and CSP
204
- equality"):
202
+ The site script and appearance controller (`src/core/internal/appearance/`) are
203
+ the only browser script this renderer emits ("Module absence and CSP equality").
204
+ Every page is fully readable with JavaScript off; the script only enhances:
205
205
 
206
206
  - **`contract.js`** is the one module every other appearance-related file
207
207
  imports every name/value from: the two fixed root attributes
@@ -209,55 +209,56 @@ equality"):
209
209
  exact-value `"light"`/`"dark"`), the template-internal
210
210
  `data-gala-color-mode-selection` bookkeeping attribute, the three canonical
211
211
  mode values (`light`/`dark`/`system`), the versioned local storage key
212
- (`gala:appearance:color-mode:v1`), the control's `id`, the bootstrap script's
213
- fixed output path/media type and the `color-scheme` meta content — the
214
- contract the published theme styling catalog targets.
215
- - **`controller-markup.js`** renders a native `<select>` (a brief-admitted
216
- pattern; needs no `aria-pressed`/`aria-checked` bookkeeping of its own, unlike
217
- a custom button-group or radio-group would) bound to a visible `<label>`, with
218
- message-catalog labels, inserted into the header's `header-actions` slot. Its
219
- default selected option is always `system`; the bootstrap script's own
220
- `DOMContentLoaded` phase corrects `select.value` to the actual stored/resolved
221
- value once `<body>` exists.
222
- - **`bootstrap-script.js`** is the exact deterministic pre-paint bootstrap
223
- (every literal from `contract.js`, so it and the server-rendered control can
224
- never drift): a synchronous phase, run the instant this blocking,
225
- non-`defer`/non-`async`/non-`module` `<script src>` executes in `<head>` —
226
- before `<body>` is even parsed — that reads the stored selection (falling back
227
- to `system` on a missing/invalid/unreadable value; a `localStorage` read/write
228
- failure is always caught, so a blocked or private-mode session stays fully
229
- usable) and resolves it against `prefers-color-scheme` (`system` resolves to
230
- `light` when unavailable), then applies both root attributes. It never touches
231
- `document.documentElement.style` (no hide-until-ready trick of any kind), no
232
- network, no cookie, no account/tracking identifier, and no storage key other
233
- than its own. A `DOMContentLoaded`-deferred phase wires the control's `change`
234
- event and a live `prefers-color-scheme` subscription that only updates the
235
- resolved attribute while the current selection is still exactly `system` (an
236
- explicit `light`/`dark` choice is never overridden by a later system change).
237
- - `src/core/index.js` writes the bootstrap script into the candidate output
238
- directory and enters it into the manifest as an ordinary `manifestAsset` row
212
+ (`gala:appearance:color-mode:v1`), the toggle button's `id`, the script's
213
+ fixed output path/media type and the `color-scheme` meta content.
214
+ - **`controller-markup.js`** renders one icon `<button>` (hidden until the
215
+ script reveals it) in the header's `header-actions` slot. Its accessible name
216
+ carries the current mode and the three localized labels travel as
217
+ `data-label-*` attributes; which of the three mode icons shows is pure CSS off
218
+ the root selection attribute.
219
+ - **`bootstrap-script.js`** is the exact deterministic script (every literal
220
+ from `contract.js`). Phase 1 runs synchronously the instant this blocking,
221
+ non-`defer`/non-`async`/non-`module` `<script src>` executes in `<head>`: it
222
+ reads the stored selection (falling back to `system`; a `localStorage` failure
223
+ is always caught), resolves it against `prefers-color-scheme` and applies both
224
+ root attributes, subscribes to live system changes (applied only while the
225
+ selection is `system`) and registers the `pageswap`/`pagereveal` listeners
226
+ that name the cover image `gala-cover` so it morphs between a card and its
227
+ article. Phase 2 (`DOMContentLoaded`) runs independent, each-in-its-own-try
228
+ enhancements, every one a no-op when its markup is absent: the colour-mode
229
+ toggle (system, light, dark; a circular reveal through a same-document view
230
+ transition unless reduced motion is requested), the search dialog (lazy
231
+ `fetch` of the `data-search-index` URL, `/` and Ctrl/Cmd+K, arrow keys and
232
+ Enter), code blocks (language label and Copy button, select-text fallback),
233
+ contents highlighting (`IntersectionObserver` on `data-toc`), the share group
234
+ (copy link; bookmark stored under `gala:saved:v1`) and a reading-progress
235
+ fallback where scroll-driven animations are unsupported. It never mutates
236
+ `document.documentElement.style`, uses no cookie and no account identifier,
237
+ and builds all DOM text with `textContent`/`setAttribute`, never HTML from
238
+ fetched data. Localized strings are rendered by the server as `data-*`
239
+ attributes on the `.g-toast` element.
240
+ - The CSP is `connect-src 'self'` (so the script can read the static search
241
+ index) and otherwise unchanged and strict.
242
+ - `src/core/index.js` writes the script into the candidate output directory and
243
+ enters it into the manifest as an ordinary `manifestAsset` row
239
244
  (`{path, byteLength, sha256}` plus its fixed
240
245
  `application/javascript; charset=utf-8` media type), after the Eleventy route
241
- listing — exactly like a media derivative — so it is never mistaken for an
242
- HTML route. `src/core/internal/eleventy-render.js`'s skeleton layout carries
243
- the `data-gala-publication-root` attribute, the
246
+ listing, so it is never mistaken for an HTML route.
247
+ `src/core/internal/eleventy-render.js`'s skeleton layout carries the
248
+ `data-gala-publication-root` attribute, the
244
249
  `<meta name="color-scheme" content="light dark">` tag and the one
245
- `<script src>` reference, all fixed literals from `contract.js`, so every
246
- route's `<head>` is still byte-identical (this renderer materializes no module
247
- package/configuration/output/runtime).
248
- - With JavaScript disabled, the control still renders (a native `<select>`,
249
- fully keyboard-operable and usable with no script at all). The resolved root
250
- attribute is server-rendered as the fixed `light` default, so a no-JS reader,
251
- an archival crawler, or a load where the bootstrap script fails still gets a
252
- fully themed page instead of unstyled UA-default HTML; a scripted reader's
253
- phase 1 bootstrap always overwrites this attribute with the reader's real
254
- stored selection/system preference before first paint.
255
- `<meta name="color-scheme">` also carries `prefers-color-scheme` through to
256
- user-agent styling (form controls, scrollbars) independent of any script.
250
+ `<script src>` reference, so every route's `<head>` is still byte-identical.
251
+ - With JavaScript disabled the toggle, search button and share group stay hidden
252
+ (they would do nothing), the contents list, menu and links are plain anchors
253
+ and `<details>`, and the resolved root attribute is server-rendered as the
254
+ fixed `light` default, so a no-JS reader, an archival crawler, or a load where
255
+ the script fails still gets a fully themed page. `<meta name="color-scheme">`
256
+ carries `prefers-color-scheme` through to user-agent styling independent of
257
+ any script.
257
258
 
258
259
  **Authoring a theme:** see [`docs/theme-authoring.md`](docs/theme-authoring.md)
259
260
  for the full guide — how a theme is a delta over the template-owned `gala-base`
260
- layer, the closed 35-token catalog, the closed five-member pseudo-class catalog,
261
+ layer, the closed token catalog, the closed five-member pseudo-class catalog,
261
262
  passive-asset/SVG admission, the `theme.json` digest chain, and `templateRange`.
262
263
  Run `node scripts/scaffold-theme.mjs <directory>` to write a minimal,
263
264
  already-conformant theme package skeleton rather than hand-typing one.
@@ -270,26 +271,27 @@ selected theme package's stylesheets into every generated page:
270
271
  - **`src/core/internal/appearance/styling-contract.js`** is the one reviewed
271
272
  source module `scripts/generate-contracts.mjs` emits the contract from: the
272
273
  ordered five-layer catalog (`gala-base`/`gala-tokens`/`gala-components`/
273
- `gala-utilities`/`gala-print` — contract 2.1.0: `gala-base` is the template's
274
- own layer, carrying the reset/type-scale/focus-ring defaults documented below
274
+ `gala-utilities`/`gala-print` — `gala-base` is the template's own layer,
275
+ carrying the reset/type-scale/focus-ring defaults documented below
275
276
  `internal/appearance/base-layer.js`, always ordered first so a theme's own
276
277
  layers can override it), the publication-root/ resolved-palette selectors, the
277
278
  closed type/class/id/attribute leaf catalogs, a closed five-member
278
279
  pseudo-class catalog (`hover`, `focus-visible`, `active`, `visited`,
279
- `disabled` — contract 2.1.0; see that module's own documentation for why each
280
- is admitted and why the token catalog's `color-focus`/`color-link-visited` had
281
- no reachable application before it), and exactly 64 `publicThemeSlotHooks` —
282
- one per catalog leaf, so every leaf a theme could validly select is a named,
283
- documented hook and no catalog member is orphaned. Every leaf is drawn from
284
- what this renderer actually renders: 28 type-selector hooks (every
285
- landmark/prose/code/control element `internal/skeleton.js`,
280
+ `disabled`; see that module's own documentation for why each is admitted and
281
+ why the token catalog's `color-focus`/`color-link-visited` had no reachable
282
+ application before it), and up to 256 `publicThemeSlotHooks` (contract 3.0.0;
283
+ exactly 178 today) — one per catalog leaf, so every leaf a theme could validly
284
+ select is a named, documented hook and no catalog member is orphaned. Every
285
+ leaf is drawn from what this renderer actually renders: 30 type-selector hooks
286
+ (every landmark/prose/code/control element `internal/skeleton.js`,
286
287
  `internal/page-kinds.js` and the markdown-it CommonMark pipeline can produce),
287
- 15 class-selector hooks (the base Prism `.token` class plus one
288
+ 127 class-selector hooks (112 `g-*` component classes, grouped by component in
289
+ `COMPONENT_CLASS_GROUPS`, plus the base Prism `.token` class and one
288
290
  `.language-<grammar>` hook per admitted highlight grammar — fine-grained
289
291
  per-token-kind classes are a documented scope exclusion), 2 id-selector hooks
290
- (`#main-content`, the appearance `<select>`'s fixed id) and 19 attribute-value
291
- hooks (one per `data-gala-slot` value, one per the `data-gala-page-kind`
292
- value). `catalogDigest` is
292
+ (`#main-content`, the appearance toggle button's fixed id) and 19
293
+ attribute-value hooks (one per `data-gala-slot` value, one per the
294
+ `data-gala-page-kind` value). `catalogDigest` is
293
295
  `SHA256(UTF8("GALA-TEMPLATE-STYLING-CONTRACT-V2\0") || JCS(...))`, matching
294
296
  the same domain-separated digest construction and the digest profile
295
297
  `@rathnasgala2/schemas`' own internal `templateStylingContract` profile uses
@@ -354,6 +356,13 @@ allowlist: raster formats are admitted directly, and SVG is admitted only after
354
356
  in scope and expected** (TPL-H6 decision): this sanitizer is what makes a
355
357
  theme-declared SVG icon mark safe to publish.
356
358
 
359
+ - **`baseUrl` path prefix (2.2.0).** `buildInput.baseUrl` may carry a path (a
360
+ GitHub project site, `https://owner.github.io/g9/`); it is not origin-only.
361
+ `internal/route.js#derivePublicBasePath(baseUrl, basePath)` joins that path
362
+ with `basePath` into the one public base path every emitted URL uses (route
363
+ and asset hrefs, the appearance script, stylesheet links, canonical/`og:url`,
364
+ feed, sitemap and search-index URLs). Output file paths still use `basePath`
365
+ alone, because the artifact is deployed at the hosting site root.
357
366
  - **basePath fix (LOCAL-7 follow-up; independent-review finding B2).** Before
358
367
  theme integration existed, the appearance bootstrap script's `<script src>`
359
368
  and the social-image `og:image`/`twitter:image` URL were both root-absolute,
@@ -458,6 +467,33 @@ brief sits on top of the page kinds above:
458
467
  `build-input:2.0.0` has no translation/locale-variant linkage between distinct
459
468
  `content[]` records (see `internal/seo.js`'s module documentation), so no
460
469
  `<link rel="alternate" hreflang="...">` is ever emitted by this renderer.
470
+ - **Search and assistant discovery** (3.0.0, unpublished). Every page carries
471
+ one `<script type="application/ld+json">` data block
472
+ (`internal/ structured-data.js`: `WebSite` + `Blog` on the home page,
473
+ `BlogPosting` + `BreadcrumbList` on articles, `CollectionPage` on tag, series
474
+ and archive pages, `ProfilePage` on authors; no `SearchAction`, because the
475
+ site search has no results URL). It is data, never executed, so "exactly one
476
+ executable script per page" still holds. Article pages add
477
+ `article:published_time`, `article:modified_time`, `article:author`,
478
+ `article:tag`, and every `og:image` carries width, height and alt. `<title>`
479
+ is `<Page> | <Publication>` (home: `<Publication> – <tagline>`, at most 60
480
+ characters); every indexable page has a meta description. Every `<img>` has
481
+ `width` and `height` from the media pipeline; the article cover and the home
482
+ hero are `fetchpriority="high"`, all other images
483
+ `loading="lazy" decoding="async"`. Feeds carry the full sanitized body
484
+ (`content:encoded` in RSS, `<content type="html">` in Atom), authors and
485
+ categories. Author pages live at `/authors/<name-slug>` (the id when two names
486
+ collide).
487
+ - **`robots.txt`, `llms.txt`, `llms-full.txt`** (`internal/robots.js`,
488
+ `internal/llms.js`). `robots.txt` allows all crawlers and names the absolute
489
+ sitemap; `publication.crawlers.ai: "block"` (read defensively, absent means
490
+ allow) adds `Disallow: /` groups for the 15 known AI crawlers. It is always
491
+ written at the output root: **only a robots.txt at the host root is honoured
492
+ by crawlers**, so a site served from a path (for example a GitHub project
493
+ site) must have the same file at its host root. `llms.txt` follows llmstxt.org
494
+ (`# title`, `> description`, `## Articles`, `## Series`, `## Optional`);
495
+ `llms-full.txt` is every published article as plain text. Unlisted content is
496
+ excluded from both.
461
497
  - **`404.html`**: the `error` page kind's pure `renderErrorPageBody`, now
462
498
  actually wired into `renderPublication` at the fixed `errorDocumentKey`
463
499
  (`internal/route.js#errorDocumentPath`) — `404.html` at the root, or
@@ -1 +1 @@
1
- {"contentSecurityPolicy":"default-src 'none'; base-uri 'none'; object-src 'none'; frame-ancestors 'none'; form-action 'none'; script-src 'self'; style-src 'self'; img-src 'self'; font-src 'self'; connect-src 'none'; media-src 'self'; manifest-src 'self'; worker-src 'none'","contentSecurityPolicyHeaderOnlyDirectives":["frame-ancestors 'none'"],"contentSecurityPolicyMeta":"default-src 'none'; base-uri 'none'; object-src 'none'; form-action 'none'; script-src 'self'; style-src 'self'; img-src 'self'; font-src 'self'; connect-src 'none'; media-src 'self'; manifest-src 'self'; worker-src 'none'","highlighter":{"grammars":["bash","css","diff","java","javascript","json","jsx","markdown","markup","python","sql","tsx","typescript","yaml"],"package":"@11ty/eleventy-plugin-syntaxhighlight","tokenClasses":["atrule","attr-equals","attr-name","attr-value","bold","boolean","builtin","cdata","char","class-name","comment","constant","content","coord","deleted","deleted-sign","doctype","entity","for-or-select","function","function-variable","important","inserted","inserted-sign","interpolation","interpolation-punctuation","italic","key","keyword","namespace","null","number","operator","prefix","prolog","property","punctuation","regex","rule","selector","shebang","string","symbol","tag","template-punctuation","template-string","title","token","url","variable"],"version":"5.0.2"},"markdownIt":{"options":{"html":false,"linkify":false,"typographer":false},"package":"markdown-it","version":"14.3.1"},"name":"gala-render-policy","sanitizer":{"allowedAttributes":{"a":["href","rel"],"code":["class"],"h1":["id"],"h2":["id"],"h3":["id"],"h4":["id"],"h5":["id"],"h6":["id"],"img":["src","alt"],"ol":["start"],"pre":["class"],"span":["class"]},"allowedTags":["p","br","hr","h1","h2","h3","h4","h5","h6","ul","ol","li","blockquote","pre","code","strong","em","b","i","u","s","del","ins","sub","sup","mark","small","wbr","a","img","table","thead","tbody","tr","th","td","dl","dt","dd","figure","figcaption","span"],"allowedUrlSchemes":["https","http","mailto"],"package":"sanitize-html","version":"2.17.7"},"version":"2.0.0"}
1
+ {"contentSecurityPolicy":"default-src 'none'; base-uri 'none'; object-src 'none'; frame-ancestors 'none'; form-action 'none'; script-src 'self'; style-src 'self'; img-src 'self'; font-src 'self'; connect-src 'self'; media-src 'self'; manifest-src 'self'; worker-src 'none'","contentSecurityPolicyHeaderOnlyDirectives":["frame-ancestors 'none'"],"contentSecurityPolicyMeta":"default-src 'none'; base-uri 'none'; object-src 'none'; form-action 'none'; script-src 'self'; style-src 'self'; img-src 'self'; font-src 'self'; connect-src 'self'; media-src 'self'; manifest-src 'self'; worker-src 'none'","highlighter":{"grammars":["bash","css","diff","java","javascript","json","jsx","markdown","markup","python","sql","tsx","typescript","yaml"],"package":"@11ty/eleventy-plugin-syntaxhighlight","tokenClasses":["atrule","attr-equals","attr-name","attr-value","bold","boolean","builtin","cdata","char","class-name","comment","constant","content","coord","deleted","deleted-sign","doctype","entity","for-or-select","function","function-variable","important","inserted","inserted-sign","interpolation","interpolation-punctuation","italic","key","keyword","namespace","null","number","operator","prefix","prolog","property","punctuation","regex","rule","selector","shebang","string","symbol","tag","template-punctuation","template-string","title","token","url","variable"],"version":"5.0.2"},"markdownIt":{"options":{"html":false,"linkify":false,"typographer":false},"package":"markdown-it","version":"14.3.1"},"name":"gala-render-policy","sanitizer":{"allowedAttributes":{"a":["href","rel"],"code":["class"],"h1":["id"],"h2":["id"],"h3":["id"],"h4":["id"],"h5":["id"],"h6":["id"],"img":["src","alt"],"ol":["start"],"pre":["class"],"span":["class"]},"allowedTags":["p","br","hr","h1","h2","h3","h4","h5","h6","ul","ol","li","blockquote","pre","code","strong","em","b","i","u","s","del","ins","sub","sup","mark","small","wbr","a","img","table","thead","tbody","tr","th","td","dl","dt","dd","figure","figcaption","span"],"allowedUrlSchemes":["https","http","mailto"],"package":"sanitize-html","version":"2.17.7"},"version":"2.0.0"}
@@ -1 +1 @@
1
- {"attributes":[{"match":"exact-value","name":"data-gala-page-kind","role":"semantic","values":["archive","article","author","error","index","page","profile","series","tag"]},{"match":"exact-value","name":"data-gala-resolved-color-mode","role":"state","values":["dark","light"]},{"match":"exact-value","name":"data-gala-slot","role":"semantic","values":["account-intent","article-end","article-footer-ad","article-preamble","conversation","edition-selector","footer-auxiliary","footer-profile","header-actions","newsletter"]},{"match":"presence","name":"data-gala-publication-root","role":"root","values":[]}],"catalogDigest":"sha256:4aca7e9794bddfb2c3afd22f4efd078e7dcf69dde9d62ce52d28cec19aef8b91","classSelectors":["language-bash","language-css","language-diff","language-java","language-javascript","language-json","language-jsx","language-markdown","language-markup","language-python","language-sql","language-tsx","language-typescript","language-yaml","token"],"combinators":[" "," > "," + "," ~ "],"composition":{"compoundOrder":["type","id","class","attribute","pseudo-class","pseudo-element"],"functionalPseudoKeywordArguments":["even","odd"],"functionalSelectorArguments":"compound-only","maximumFunctionalDepth":1,"nthExpressionProfile":"gala-positive-an-plus-b-v2","rootScope":"first-compound-required"},"contractVersion":"2.1.0","functionalPseudos":["is","where","not","nth-child","nth-last-child"],"idSelectors":["gala-appearance-color-mode","main-content"],"orderedLayers":["gala-base","gala-tokens","gala-components","gala-utilities","gala-print"],"profile":"gala-template-styling-contract-v2","pseudoClasses":["active","disabled","focus-visible","hover","visited"],"pseudoElements":["after","before","marker","selection"],"publicThemeSlotHooks":[{"hookId":"code-block","selectorAtom":"pre"},{"hookId":"code-inline","selectorAtom":"code"},{"hookId":"code-language-bash","selectorAtom":".language-bash"},{"hookId":"code-language-css","selectorAtom":".language-css"},{"hookId":"code-language-diff","selectorAtom":".language-diff"},{"hookId":"code-language-java","selectorAtom":".language-java"},{"hookId":"code-language-javascript","selectorAtom":".language-javascript"},{"hookId":"code-language-json","selectorAtom":".language-json"},{"hookId":"code-language-jsx","selectorAtom":".language-jsx"},{"hookId":"code-language-markdown","selectorAtom":".language-markdown"},{"hookId":"code-language-markup","selectorAtom":".language-markup"},{"hookId":"code-language-python","selectorAtom":".language-python"},{"hookId":"code-language-sql","selectorAtom":".language-sql"},{"hookId":"code-language-tsx","selectorAtom":".language-tsx"},{"hookId":"code-language-typescript","selectorAtom":".language-typescript"},{"hookId":"code-language-yaml","selectorAtom":".language-yaml"},{"hookId":"code-token","selectorAtom":".token"},{"hookId":"content-article","selectorAtom":"article"},{"hookId":"control-appearance-select","selectorAtom":"#gala-appearance-color-mode"},{"hookId":"control-label","selectorAtom":"label"},{"hookId":"control-option","selectorAtom":"option"},{"hookId":"control-select","selectorAtom":"select"},{"hookId":"heading-1","selectorAtom":"h1"},{"hookId":"heading-2","selectorAtom":"h2"},{"hookId":"heading-3","selectorAtom":"h3"},{"hookId":"heading-4","selectorAtom":"h4"},{"hookId":"heading-5","selectorAtom":"h5"},{"hookId":"heading-6","selectorAtom":"h6"},{"hookId":"landmark-footer","selectorAtom":"footer"},{"hookId":"landmark-header","selectorAtom":"header"},{"hookId":"landmark-main","selectorAtom":"main"},{"hookId":"landmark-main-content","selectorAtom":"#main-content"},{"hookId":"landmark-navigation","selectorAtom":"nav"},{"hookId":"media-image","selectorAtom":"img"},{"hookId":"page-archive","selectorAtom":"[data-gala-page-kind=\"archive\"]"},{"hookId":"page-article","selectorAtom":"[data-gala-page-kind=\"article\"]"},{"hookId":"page-author","selectorAtom":"[data-gala-page-kind=\"author\"]"},{"hookId":"page-error","selectorAtom":"[data-gala-page-kind=\"error\"]"},{"hookId":"page-index","selectorAtom":"[data-gala-page-kind=\"index\"]"},{"hookId":"page-page","selectorAtom":"[data-gala-page-kind=\"page\"]"},{"hookId":"page-profile","selectorAtom":"[data-gala-page-kind=\"profile\"]"},{"hookId":"page-series","selectorAtom":"[data-gala-page-kind=\"series\"]"},{"hookId":"page-tag","selectorAtom":"[data-gala-page-kind=\"tag\"]"},{"hookId":"prose-blockquote","selectorAtom":"blockquote"},{"hookId":"prose-divider","selectorAtom":"hr"},{"hookId":"prose-emphasis","selectorAtom":"em"},{"hookId":"prose-link","selectorAtom":"a"},{"hookId":"prose-list-item","selectorAtom":"li"},{"hookId":"prose-list-ordered","selectorAtom":"ol"},{"hookId":"prose-list-unordered","selectorAtom":"ul"},{"hookId":"prose-paragraph","selectorAtom":"p"},{"hookId":"prose-span","selectorAtom":"span"},{"hookId":"prose-strong","selectorAtom":"strong"},{"hookId":"prose-time","selectorAtom":"time"},{"hookId":"slot-account-intent","selectorAtom":"[data-gala-slot=\"account-intent\"]"},{"hookId":"slot-article-end","selectorAtom":"[data-gala-slot=\"article-end\"]"},{"hookId":"slot-article-footer-ad","selectorAtom":"[data-gala-slot=\"article-footer-ad\"]"},{"hookId":"slot-article-preamble","selectorAtom":"[data-gala-slot=\"article-preamble\"]"},{"hookId":"slot-conversation","selectorAtom":"[data-gala-slot=\"conversation\"]"},{"hookId":"slot-edition-selector","selectorAtom":"[data-gala-slot=\"edition-selector\"]"},{"hookId":"slot-footer-auxiliary","selectorAtom":"[data-gala-slot=\"footer-auxiliary\"]"},{"hookId":"slot-footer-profile","selectorAtom":"[data-gala-slot=\"footer-profile\"]"},{"hookId":"slot-header-actions","selectorAtom":"[data-gala-slot=\"header-actions\"]"},{"hookId":"slot-newsletter","selectorAtom":"[data-gala-slot=\"newsletter\"]"}],"publicationRootSelector":"[data-gala-publication-root]","resolvedPaletteSelectors":{"dark":"[data-gala-publication-root][data-gala-resolved-color-mode=\"dark\"]","light":"[data-gala-publication-root][data-gala-resolved-color-mode=\"light\"]"},"stylesheetLayers":{"components":"gala-components","print":"gala-print","tokens":"gala-tokens","utilities":"gala-utilities"},"templatePackage":"@rathnasgala2/template","templateVersion":"2.1.0","typeSelectors":["a","article","blockquote","code","em","footer","h1","h2","h3","h4","h5","h6","header","hr","img","label","li","main","nav","ol","option","p","pre","select","span","strong","time","ul"]}
1
+ {"attributes":[{"match":"exact-value","name":"data-gala-page-kind","role":"semantic","values":["archive","article","author","error","index","page","profile","series","tag"]},{"match":"exact-value","name":"data-gala-resolved-color-mode","role":"state","values":["dark","light"]},{"match":"exact-value","name":"data-gala-slot","role":"semantic","values":["account-intent","article-end","article-footer-ad","article-preamble","conversation","edition-selector","footer-auxiliary","footer-profile","header-actions","newsletter"]},{"match":"presence","name":"data-gala-publication-root","role":"root","values":[]}],"catalogDigest":"sha256:a10fecf6d43e4392312158f15b66d55a9e2bd3c7816a0747eb2084735d336de5","classSelectors":["g-actions","g-article","g-article-cover","g-article-foot","g-article-grid","g-article-head","g-article-labels","g-article-meta","g-author-bio","g-author-card","g-author-name","g-avatar","g-badge","g-brand","g-brand-name","g-brand-tag","g-brand-text","g-btn","g-byline","g-byline-text","g-card","g-card-body","g-card-excerpt","g-card-foot","g-card-link","g-card-media","g-card-placeholder","g-card-row","g-card-top","g-chip","g-codebar","g-codebar-lang","g-codeblock","g-copy","g-copy-done","g-copy-idle","g-crumbs","g-dek","g-dot","g-eyebrow","g-footer","g-footer-about","g-footer-base","g-footer-brand","g-footer-col","g-footer-grid","g-grid","g-header","g-header-row","g-hero","g-hero-body","g-hero-media","g-icon","g-icon-btn","g-kbd","g-label","g-list","g-main","g-mark","g-menu","g-meta","g-mode-dark","g-mode-icon","g-mode-light","g-mode-system","g-more","g-nav","g-newsletter","g-pager","g-pager-link","g-pager-next","g-pagination","g-panel","g-panel-copy","g-pill","g-pill-count","g-pills","g-progress","g-prose","g-search","g-search-box","g-search-btn","g-search-empty","g-search-hit","g-search-hit-meta","g-search-hit-text","g-search-hit-title","g-search-input","g-search-results","g-section","g-section-head","g-series-box","g-series-card","g-series-here","g-series-list","g-series-n","g-series-tag","g-share","g-skip","g-social","g-sr","g-tag","g-tags","g-toast","g-toc","g-toc-list","g-toc-mobile","g-topic-head","g-topic-hero","g-topic-icon","g-topic-strip","g-wrap","language-bash","language-css","language-diff","language-java","language-javascript","language-json","language-jsx","language-markdown","language-markup","language-python","language-sql","language-tsx","language-typescript","language-yaml","token"],"combinators":[" "," > "," + "," ~ "],"composition":{"compoundOrder":["type","id","class","attribute","pseudo-class","pseudo-element"],"functionalPseudoKeywordArguments":["even","odd"],"functionalSelectorArguments":"compound-only","maximumFunctionalDepth":1,"nthExpressionProfile":"gala-positive-an-plus-b-v2","rootScope":"first-compound-required"},"contractVersion":"3.0.0","functionalPseudos":["is","where","not","nth-child","nth-last-child"],"idSelectors":["gala-appearance-color-mode","main-content"],"orderedLayers":["gala-base","gala-tokens","gala-components","gala-utilities","gala-print"],"profile":"gala-template-styling-contract-v2","pseudoClasses":["active","disabled","focus-visible","hover","visited"],"pseudoElements":["after","before","marker","selection"],"publicThemeSlotHooks":[{"hookId":"code-block","selectorAtom":"pre"},{"hookId":"code-inline","selectorAtom":"code"},{"hookId":"code-language-bash","selectorAtom":".language-bash"},{"hookId":"code-language-css","selectorAtom":".language-css"},{"hookId":"code-language-diff","selectorAtom":".language-diff"},{"hookId":"code-language-java","selectorAtom":".language-java"},{"hookId":"code-language-javascript","selectorAtom":".language-javascript"},{"hookId":"code-language-json","selectorAtom":".language-json"},{"hookId":"code-language-jsx","selectorAtom":".language-jsx"},{"hookId":"code-language-markdown","selectorAtom":".language-markdown"},{"hookId":"code-language-markup","selectorAtom":".language-markup"},{"hookId":"code-language-python","selectorAtom":".language-python"},{"hookId":"code-language-sql","selectorAtom":".language-sql"},{"hookId":"code-language-tsx","selectorAtom":".language-tsx"},{"hookId":"code-language-typescript","selectorAtom":".language-typescript"},{"hookId":"code-language-yaml","selectorAtom":".language-yaml"},{"hookId":"code-token","selectorAtom":".token"},{"hookId":"content-article","selectorAtom":"article"},{"hookId":"control-appearance-toggle","selectorAtom":"#gala-appearance-color-mode"},{"hookId":"control-button","selectorAtom":"button"},{"hookId":"disclosure-details","selectorAtom":"details"},{"hookId":"disclosure-summary","selectorAtom":"summary"},{"hookId":"heading-1","selectorAtom":"h1"},{"hookId":"heading-2","selectorAtom":"h2"},{"hookId":"heading-3","selectorAtom":"h3"},{"hookId":"heading-4","selectorAtom":"h4"},{"hookId":"heading-5","selectorAtom":"h5"},{"hookId":"heading-6","selectorAtom":"h6"},{"hookId":"landmark-footer","selectorAtom":"footer"},{"hookId":"landmark-header","selectorAtom":"header"},{"hookId":"landmark-main","selectorAtom":"main"},{"hookId":"landmark-main-content","selectorAtom":"#main-content"},{"hookId":"landmark-navigation","selectorAtom":"nav"},{"hookId":"landmark-section","selectorAtom":"section"},{"hookId":"media-figure","selectorAtom":"figure"},{"hookId":"media-image","selectorAtom":"img"},{"hookId":"page-archive","selectorAtom":"[data-gala-page-kind=\"archive\"]"},{"hookId":"page-article","selectorAtom":"[data-gala-page-kind=\"article\"]"},{"hookId":"page-author","selectorAtom":"[data-gala-page-kind=\"author\"]"},{"hookId":"page-error","selectorAtom":"[data-gala-page-kind=\"error\"]"},{"hookId":"page-index","selectorAtom":"[data-gala-page-kind=\"index\"]"},{"hookId":"page-page","selectorAtom":"[data-gala-page-kind=\"page\"]"},{"hookId":"page-profile","selectorAtom":"[data-gala-page-kind=\"profile\"]"},{"hookId":"page-series","selectorAtom":"[data-gala-page-kind=\"series\"]"},{"hookId":"page-tag","selectorAtom":"[data-gala-page-kind=\"tag\"]"},{"hookId":"prose-blockquote","selectorAtom":"blockquote"},{"hookId":"prose-divider","selectorAtom":"hr"},{"hookId":"prose-emphasis","selectorAtom":"em"},{"hookId":"prose-link","selectorAtom":"a"},{"hookId":"prose-list-item","selectorAtom":"li"},{"hookId":"prose-list-ordered","selectorAtom":"ol"},{"hookId":"prose-list-unordered","selectorAtom":"ul"},{"hookId":"prose-paragraph","selectorAtom":"p"},{"hookId":"prose-span","selectorAtom":"span"},{"hookId":"prose-strong","selectorAtom":"strong"},{"hookId":"prose-time","selectorAtom":"time"},{"hookId":"slot-account-intent","selectorAtom":"[data-gala-slot=\"account-intent\"]"},{"hookId":"slot-article-end","selectorAtom":"[data-gala-slot=\"article-end\"]"},{"hookId":"slot-article-footer-ad","selectorAtom":"[data-gala-slot=\"article-footer-ad\"]"},{"hookId":"slot-article-preamble","selectorAtom":"[data-gala-slot=\"article-preamble\"]"},{"hookId":"slot-conversation","selectorAtom":"[data-gala-slot=\"conversation\"]"},{"hookId":"slot-edition-selector","selectorAtom":"[data-gala-slot=\"edition-selector\"]"},{"hookId":"slot-footer-auxiliary","selectorAtom":"[data-gala-slot=\"footer-auxiliary\"]"},{"hookId":"slot-footer-profile","selectorAtom":"[data-gala-slot=\"footer-profile\"]"},{"hookId":"slot-header-actions","selectorAtom":"[data-gala-slot=\"header-actions\"]"},{"hookId":"slot-newsletter","selectorAtom":"[data-gala-slot=\"newsletter\"]"},{"hookId":"ui-actions","selectorAtom":".g-actions"},{"hookId":"ui-article","selectorAtom":".g-article"},{"hookId":"ui-article-cover","selectorAtom":".g-article-cover"},{"hookId":"ui-article-foot","selectorAtom":".g-article-foot"},{"hookId":"ui-article-grid","selectorAtom":".g-article-grid"},{"hookId":"ui-article-head","selectorAtom":".g-article-head"},{"hookId":"ui-article-labels","selectorAtom":".g-article-labels"},{"hookId":"ui-article-meta","selectorAtom":".g-article-meta"},{"hookId":"ui-author-bio","selectorAtom":".g-author-bio"},{"hookId":"ui-author-card","selectorAtom":".g-author-card"},{"hookId":"ui-author-name","selectorAtom":".g-author-name"},{"hookId":"ui-avatar","selectorAtom":".g-avatar"},{"hookId":"ui-badge","selectorAtom":".g-badge"},{"hookId":"ui-brand","selectorAtom":".g-brand"},{"hookId":"ui-brand-name","selectorAtom":".g-brand-name"},{"hookId":"ui-brand-tag","selectorAtom":".g-brand-tag"},{"hookId":"ui-brand-text","selectorAtom":".g-brand-text"},{"hookId":"ui-btn","selectorAtom":".g-btn"},{"hookId":"ui-byline","selectorAtom":".g-byline"},{"hookId":"ui-byline-text","selectorAtom":".g-byline-text"},{"hookId":"ui-card","selectorAtom":".g-card"},{"hookId":"ui-card-body","selectorAtom":".g-card-body"},{"hookId":"ui-card-excerpt","selectorAtom":".g-card-excerpt"},{"hookId":"ui-card-foot","selectorAtom":".g-card-foot"},{"hookId":"ui-card-link","selectorAtom":".g-card-link"},{"hookId":"ui-card-media","selectorAtom":".g-card-media"},{"hookId":"ui-card-placeholder","selectorAtom":".g-card-placeholder"},{"hookId":"ui-card-row","selectorAtom":".g-card-row"},{"hookId":"ui-card-top","selectorAtom":".g-card-top"},{"hookId":"ui-chip","selectorAtom":".g-chip"},{"hookId":"ui-codebar","selectorAtom":".g-codebar"},{"hookId":"ui-codebar-lang","selectorAtom":".g-codebar-lang"},{"hookId":"ui-codeblock","selectorAtom":".g-codeblock"},{"hookId":"ui-copy","selectorAtom":".g-copy"},{"hookId":"ui-copy-done","selectorAtom":".g-copy-done"},{"hookId":"ui-copy-idle","selectorAtom":".g-copy-idle"},{"hookId":"ui-crumbs","selectorAtom":".g-crumbs"},{"hookId":"ui-dek","selectorAtom":".g-dek"},{"hookId":"ui-dot","selectorAtom":".g-dot"},{"hookId":"ui-eyebrow","selectorAtom":".g-eyebrow"},{"hookId":"ui-footer","selectorAtom":".g-footer"},{"hookId":"ui-footer-about","selectorAtom":".g-footer-about"},{"hookId":"ui-footer-base","selectorAtom":".g-footer-base"},{"hookId":"ui-footer-brand","selectorAtom":".g-footer-brand"},{"hookId":"ui-footer-col","selectorAtom":".g-footer-col"},{"hookId":"ui-footer-grid","selectorAtom":".g-footer-grid"},{"hookId":"ui-grid","selectorAtom":".g-grid"},{"hookId":"ui-header","selectorAtom":".g-header"},{"hookId":"ui-header-row","selectorAtom":".g-header-row"},{"hookId":"ui-hero","selectorAtom":".g-hero"},{"hookId":"ui-hero-body","selectorAtom":".g-hero-body"},{"hookId":"ui-hero-media","selectorAtom":".g-hero-media"},{"hookId":"ui-icon","selectorAtom":".g-icon"},{"hookId":"ui-icon-btn","selectorAtom":".g-icon-btn"},{"hookId":"ui-kbd","selectorAtom":".g-kbd"},{"hookId":"ui-label","selectorAtom":".g-label"},{"hookId":"ui-list","selectorAtom":".g-list"},{"hookId":"ui-main","selectorAtom":".g-main"},{"hookId":"ui-mark","selectorAtom":".g-mark"},{"hookId":"ui-menu","selectorAtom":".g-menu"},{"hookId":"ui-meta","selectorAtom":".g-meta"},{"hookId":"ui-mode-dark","selectorAtom":".g-mode-dark"},{"hookId":"ui-mode-icon","selectorAtom":".g-mode-icon"},{"hookId":"ui-mode-light","selectorAtom":".g-mode-light"},{"hookId":"ui-mode-system","selectorAtom":".g-mode-system"},{"hookId":"ui-more","selectorAtom":".g-more"},{"hookId":"ui-nav","selectorAtom":".g-nav"},{"hookId":"ui-newsletter","selectorAtom":".g-newsletter"},{"hookId":"ui-pager","selectorAtom":".g-pager"},{"hookId":"ui-pager-link","selectorAtom":".g-pager-link"},{"hookId":"ui-pager-next","selectorAtom":".g-pager-next"},{"hookId":"ui-pagination","selectorAtom":".g-pagination"},{"hookId":"ui-panel","selectorAtom":".g-panel"},{"hookId":"ui-panel-copy","selectorAtom":".g-panel-copy"},{"hookId":"ui-pill","selectorAtom":".g-pill"},{"hookId":"ui-pill-count","selectorAtom":".g-pill-count"},{"hookId":"ui-pills","selectorAtom":".g-pills"},{"hookId":"ui-progress","selectorAtom":".g-progress"},{"hookId":"ui-prose","selectorAtom":".g-prose"},{"hookId":"ui-search","selectorAtom":".g-search"},{"hookId":"ui-search-box","selectorAtom":".g-search-box"},{"hookId":"ui-search-btn","selectorAtom":".g-search-btn"},{"hookId":"ui-search-empty","selectorAtom":".g-search-empty"},{"hookId":"ui-search-hit","selectorAtom":".g-search-hit"},{"hookId":"ui-search-hit-meta","selectorAtom":".g-search-hit-meta"},{"hookId":"ui-search-hit-text","selectorAtom":".g-search-hit-text"},{"hookId":"ui-search-hit-title","selectorAtom":".g-search-hit-title"},{"hookId":"ui-search-input","selectorAtom":".g-search-input"},{"hookId":"ui-search-results","selectorAtom":".g-search-results"},{"hookId":"ui-section","selectorAtom":".g-section"},{"hookId":"ui-section-head","selectorAtom":".g-section-head"},{"hookId":"ui-series-box","selectorAtom":".g-series-box"},{"hookId":"ui-series-card","selectorAtom":".g-series-card"},{"hookId":"ui-series-here","selectorAtom":".g-series-here"},{"hookId":"ui-series-list","selectorAtom":".g-series-list"},{"hookId":"ui-series-n","selectorAtom":".g-series-n"},{"hookId":"ui-series-tag","selectorAtom":".g-series-tag"},{"hookId":"ui-share","selectorAtom":".g-share"},{"hookId":"ui-skip","selectorAtom":".g-skip"},{"hookId":"ui-social","selectorAtom":".g-social"},{"hookId":"ui-sr","selectorAtom":".g-sr"},{"hookId":"ui-tag","selectorAtom":".g-tag"},{"hookId":"ui-tags","selectorAtom":".g-tags"},{"hookId":"ui-toast","selectorAtom":".g-toast"},{"hookId":"ui-toc","selectorAtom":".g-toc"},{"hookId":"ui-toc-list","selectorAtom":".g-toc-list"},{"hookId":"ui-toc-mobile","selectorAtom":".g-toc-mobile"},{"hookId":"ui-topic-head","selectorAtom":".g-topic-head"},{"hookId":"ui-topic-hero","selectorAtom":".g-topic-hero"},{"hookId":"ui-topic-icon","selectorAtom":".g-topic-icon"},{"hookId":"ui-topic-strip","selectorAtom":".g-topic-strip"},{"hookId":"ui-wrap","selectorAtom":".g-wrap"}],"publicationRootSelector":"[data-gala-publication-root]","resolvedPaletteSelectors":{"dark":"[data-gala-publication-root][data-gala-resolved-color-mode=\"dark\"]","light":"[data-gala-publication-root][data-gala-resolved-color-mode=\"light\"]"},"stylesheetLayers":{"components":"gala-components","print":"gala-print","tokens":"gala-tokens","utilities":"gala-utilities"},"templatePackage":"@rathnasgala2/template","templateVersion":"3.0.0","typeSelectors":["a","article","blockquote","button","code","details","em","figure","footer","h1","h2","h3","h4","h5","h6","header","hr","img","li","main","nav","ol","p","pre","section","span","strong","summary","time","ul"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rathnasgala2/template",
3
- "version": "2.1.0",
3
+ "version": "3.0.0",
4
4
  "description": "Deterministic Eleventy-backed static publication renderer for Galascribe portable repositories.",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",
@@ -65,7 +65,7 @@
65
65
  "workflows:check": "node scripts/check-workflow-pins.mjs",
66
66
  "workflows:drift": "node scripts/check-workflow-drift.mjs",
67
67
  "schema-pin:check": "node scripts/check-no-local-schema-pin.mjs",
68
- "audit": "npm audit --audit-level=high",
68
+ "audit": "node scripts/npm-audit.mjs",
69
69
  "verify": "npm run format:check && npm run lint && npm run typecheck && npm run architecture && npm run duplication && npm run contracts:check && npm run schema-pin:check && npm test && npm run licenses:check && npm run sbom:check && npm run workflows:check && npm run audit"
70
70
  },
71
71
  "dependencies": {