@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 +95 -59
- package/contracts/render-policy.jcs +1 -1
- package/contracts/theme-styling-contract.jcs +1 -1
- package/package.json +2 -2
- package/src/core/index.js +209 -60
- package/src/core/internal/appearance/base-layer.js +711 -137
- package/src/core/internal/appearance/bootstrap-script.js +570 -83
- package/src/core/internal/appearance/contract.js +6 -5
- package/src/core/internal/appearance/controller-markup.js +46 -55
- package/src/core/internal/appearance/minify-script.js +69 -0
- package/src/core/internal/appearance/styling-contract.js +199 -17
- package/src/core/internal/chrome.js +199 -0
- package/src/core/internal/components.js +379 -0
- package/src/core/internal/eleventy-render.js +13 -4
- package/src/core/internal/feeds.js +79 -8
- package/src/core/internal/icons.js +52 -0
- package/src/core/internal/llms.js +252 -0
- package/src/core/internal/media/pipeline.js +32 -17
- package/src/core/internal/messages.js +104 -0
- package/src/core/internal/page-kinds.js +922 -293
- package/src/core/internal/render-policy-content.js +2 -2
- package/src/core/internal/robots.js +78 -0
- package/src/core/internal/route-labels.js +31 -0
- package/src/core/internal/route.js +42 -0
- package/src/core/internal/search-index.js +5 -2
- package/src/core/internal/seo.js +57 -2
- package/src/core/internal/sitemap.js +5 -4
- package/src/core/internal/skeleton.js +73 -132
- package/src/core/internal/structured-data.js +247 -0
- package/src/core/internal/theme-assets.js +21 -2
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
|
|
203
|
-
the only browser
|
|
204
|
-
|
|
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
|
|
213
|
-
fixed output path/media type and the `color-scheme` meta content
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
`
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
`
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
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
|
|
242
|
-
|
|
243
|
-
|
|
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,
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
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
|
|
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` —
|
|
274
|
-
|
|
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
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
one per catalog leaf, so every leaf a theme could validly
|
|
283
|
-
documented hook and no catalog member is orphaned. Every
|
|
284
|
-
what this renderer actually renders:
|
|
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
|
-
|
|
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
|
|
291
|
-
hooks (one per `data-gala-slot` value, one per the
|
|
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 '
|
|
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": "
|
|
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
|
|
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": {
|