Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 1 addition & 3 deletions src/_includes/layouts/base.njk
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,9 @@
<button class="nav-toggle" type="button" hidden aria-expanded="false" aria-controls="primary-nav">Menu</button>
<nav id="primary-nav" class="primary-nav" aria-label="Primary navigation">
<a href="/">Awakening</a>
<a href="/start/">Start</a>
<a href="/way/">Start</a>
<a href="/preamble/">Preamble</a>
<a href="/way/">The Way</a>
<a href="/chapters/">Textbook</a>
<a href="/lab/">Article Lab</a>
<a href="/narratives/">Narratives</a>
<a href="/projects/">Projects</a>
<a href="/artifacts/">Artifacts</a>
Expand Down
2 changes: 1 addition & 1 deletion src/articles/article-two.njk
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ permalink: /articles/article-two/
<section class="panel">
<h2>Source boundary</h2>
<p>The text canon lives in <code>wayseer00/main:canon/INTERDEPENDENT_WAY.txt</code>. This page quotes Article Two for orientation, but it does not supersede the canon, correct the canon, or silently smooth its tensions.</p>
<p><a href="https://github.com/wayseer00/main/blob/main/canon/INTERDEPENDENT_WAY.txt">Read the canonical file</a> · <a href="/way/">Explore generated canon-derived units</a> · <a href="/lab/">Open the Article Lab</a></p>
<p><a href="https://github.com/wayseer00/main/blob/main/canon/INTERDEPENDENT_WAY.txt">Read the canonical file</a> · <a href="/way/">Find the Article Lab in the Way tree</a></p>
</section>
<section>
<p class="eyebrow">Speaker A · exact canon excerpt</p>
Expand Down
3 changes: 3 additions & 0 deletions src/assets/css/site.css
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,9 @@ h3 { font-size: clamp(1.2rem, 2vw, 1.55rem); }
.canon-unit-summary { padding: .9rem 1rem; }
.canon-unit-summary:hover { background: rgba(22,33,58,.72); }
.canon-unit > .source-block { margin: 0; border-right: 0; border-bottom: 0; border-left: 0; border-radius: 0; }
.canon-unit-lab { margin: 0; padding: .8rem 1rem; border-top: 1px solid var(--line); }
.canon-unit-lab a { display: inline; padding: 0; border: 0; border-radius: 0; background: none; color: var(--cyan); font-weight: 800; }
.canon-unit-lab a:hover { text-decoration: underline; }
.canon-outline .unit-level-3 { margin-left: clamp(1rem, 3vw, 2.5rem); }
.canon-outline .unit-level-4 { margin-left: clamp(2rem, 6vw, 5rem); }
.canon-outline .unit-level-3 .canon-unit { border-left: .25rem solid var(--violet); }
Expand Down
4 changes: 2 additions & 2 deletions src/home/index.njk
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ permalink: /home/
<p class="eyebrow">Canon · textbook · interpretation · research · implementation · frontier</p>
<h1>A way through complexity without pretending the tension is gone.</h1>
<p class="lede">The Interdependent Way is a dense living text and a constellation of attempts to test, explain, implement, challenge, and preserve it. The Preamble is directly available here; the distributed Interdependency textbook now restores chapters Zero through Seven into one reading sequence.</p>
<div class="actions"><a class="button" href="/preamble/">Read the Preamble</a><a class="button secondary" href="/chapters/">Read the Textbook</a><a class="button secondary" href="/lab/">Enter the Article Lab</a></div>
<div class="actions"><a class="button" href="/way/">Start with the Way tree</a><a class="button secondary" href="/preamble/">Read the Preamble</a><a class="button secondary" href="/chapters/">Read the Textbook</a></div>
</div>
<div class="hero-field" aria-label="Three concentric fields around a thirteenth center"><span></span><strong>12 + 1</strong></div>
</section>
Expand All @@ -23,7 +23,7 @@ permalink: /home/
<p class="eyebrow">Eight rights-article laboratories</p>
<h2>From canon excerpt to public practice</h2>
<p>All eight Rights articles now have a canon-bounded path through exact excerpt, note conversation, reductio ad absurdum, worst and best practices, applications across eleven domains, and a study-only research field with explicit coverage gaps.</p>
<div class="actions"><a class="button" href="/lab/">Open the Article Lab</a><a class="button secondary" href="/articles/">Read publication drafts</a></div>
<div class="actions"><a class="button" href="/way/">Open the Way tree and Article Labs</a><a class="button secondary" href="/articles/">Read publication drafts</a></div>
</section>
<section class="panel">
<p class="eyebrow">Living narratives · fiction under constraint</p>
Expand Down
3 changes: 2 additions & 1 deletion src/lab/index.njk
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ description: A structured conversation between canonical body text, notes, resea
<header class="page-head">
<p class="eyebrow">Interpretation with visible seams</p>
<h1>Article Lab</h1>
<p class="lede">Each Rights article is tested from several directions: the body text and notes remain distinct speakers; reductio ad absurdum exposes destructive overextensions; worst and best practices translate the tension into operations; domain applications test whether the reading survives contact with different kinds of work; study-only research remains visibly bounded.</p>
<p class="lede">The Way tree is the primary Article Lab index. This compatibility view collects the eight developed Rights Article Labs: body text and notes remain distinct speakers; reductio ad absurdum exposes destructive overextensions; practice and domain applications test the reading; study-only research remains visibly bounded.</p>
<div class="actions"><a class="button" href="/way/">Open the Way tree</a></div>
</header>
<section>
<h2>Rights Article laboratories</h2>
Expand Down
2 changes: 1 addition & 1 deletion src/lab/unit.njk
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ title: "Lab: {{ unit.title }}"
{% set claims = research_data.claims | where("article", unit.id) %}
{% set gapMatches = research_data.gaps | where("article", unit.id) %}
{% set gap = gapMatches[0] %}
<nav class="breadcrumb" aria-label="Breadcrumb"><a href="/">Home</a> / <a href="/lab/">Article Lab</a> / {{ unit.title }}</nav>
<nav class="breadcrumb" aria-label="Breadcrumb"><a href="/way/">Start · Way tree</a> / Article Lab / {{ unit.title }}</nav>
<header class="page-head">
<p class="eyebrow">Interpretive laboratory</p>
<h1>{% if lab %}{{ lab.public_title }}{% else %}{{ unit.title }}{% endif %}</h1>
Expand Down
2 changes: 1 addition & 1 deletion src/search/index.njk
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@
layout: layouts/base.njk
title: Search
---
<h1>Search</h1><p>Pagefind assets are built after Eleventy. Without JavaScript, use the browsable indexes: <a href="/way/">Way</a>, <a href="/lab/">Lab</a>, <a href="/projects/">Projects</a>.</p><div id="search"></div><script type="module">import('/pagefind/pagefind-ui.js').then(()=>new PagefindUI({element:'#search',showSubResults:true}));</script>
<h1>Search</h1><p>Pagefind assets are built after Eleventy. Without JavaScript, use the browsable indexes: <a href="/way/">Way tree and Article Labs</a>, <a href="/projects/">Projects</a>.</p><div id="search"></div><script type="module">import('/pagefind/pagefind-ui.js').then(()=>new PagefindUI({element:'#search',showSubResults:true}));</script>
2 changes: 1 addition & 1 deletion src/start.njk
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,5 @@ description: Orientation to The Interdependent Way, its layered source model, pr
---
<header class="page-head"><p class="eyebrow">Orientation before density</p><h1>Start here</h1><p class="lede">The Interdependent Way is simultaneously a canonical text, an interpretive problem, a research program, a public project constellation, and a set of frontier claims. Those layers are related, but they are not interchangeable.</p></header>
<section><h2>How to read this site</h2><div class="grid"><article class="card"><span class="status status-canon">Canon</span><h3>What the source says</h3><p>Exact text and mechanically derived structure. Canon wins whenever a companion reading disagrees.</p></article><article class="card"><span class="status status-interpretation">Interpretation</span><h3>What a reading proposes</h3><p>Orientation, plain-language companions, and tension analysis. Useful scaffolding, always subordinate to source.</p></article><article class="card"><span class="status status-research">Research</span><h3>What studies found</h3><p>Only primary studies and systematic evidence-synthesis studies count. Support, dissent, mixed results, limits, and missing directions are classified by review rather than automated sentiment.</p></article><article class="card"><span class="status status-public">Non-study context</span><h3>What rules or institutions say</h3><p>Legislation, treaties, standards, guidelines, frameworks, and doctrine may matter as context, but they are not science and never count as Research.</p></article><article class="card"><span class="status status-implemented">Implementation</span><h3>What has been built</h3><p>Repositories and artifacts that attempt to embody, test, measure, publish, or challenge part of the work.</p></article><article class="card"><span class="status status-frontier">Frontier</span><h3>What remains unsettled</h3><p>Experimental or incomplete claims remain named without borrowing certainty from neighboring formal work.</p></article><article class="card"><span class="status status-hmmm">hmmm</span><h3>What is honestly unresolved</h3><p>A boundary object that records the missing constraint and preserves a place for continuation.</p></article></div></section>
<section class="panel"><h2>A suggested first path</h2><ol><li>Open <a href="/way/">The Way</a> and choose one section.</li><li>Read its companion page to locate the unit.</li><li>Enter the unit’s <a href="/lab/">Article Lab</a> to see body text and notes treated as separate speakers.</li><li>Open exact source when you are ready to verify wording and provenance.</li><li>Use <a href="/projects/">Projects</a> to see what has actually been implemented.</li></ol></section>
<section class="panel"><h2>A suggested first path</h2><ol><li>Open the <a href="/way/">Way tree</a> and choose one section.</li><li>Expand its title to read the exact canon text.</li><li>Where offered, open that unit’s Article Lab to see body text and notes treated as separate speakers.</li><li>Open exact source when you are ready to verify wording and provenance.</li><li>Use <a href="/projects/">Projects</a> to see what has actually been implemented.</li></ol></section>
<div class="actions"><a class="button" href="/way/">Explore the Way</a><a class="button secondary" href="/projects/">Map the projects</a></div>
2 changes: 1 addition & 1 deletion src/way/index.njk
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,4 @@ title: Explore The Way
description: An expandable map of The Interdependent Way.
---
<header class="page-head"><p class="eyebrow">Canon-derived map</p><h1>Explore The Way</h1><p class="lede">Select a title to display that canon unit's exact text.</p></header>
<ul class="index-list canon-outline">{% for unit in generated.canon.units %}<li class="unit-level-{{ unit.level }}" data-parent-id="{{ unit.parentId or '' }}"><details class="canon-unit" id="{{ unit.routeSlug }}"><summary class="canon-unit-summary"><strong>{{ unit.title }}</strong></summary><pre class="source-block">{{ unit.content }}</pre></details></li>{% endfor %}</ul>
<ul class="index-list canon-outline">{% for unit in generated.canon.units %}{% set labMatches = article_lab | where("unit_id", unit.id) %}<li class="unit-level-{{ unit.level }}" data-parent-id="{{ unit.parentId or '' }}"><details class="canon-unit" id="{{ unit.routeSlug }}"><summary class="canon-unit-summary"><strong>{{ unit.title }}</strong></summary><pre class="source-block">{{ unit.content }}</pre>{% if labMatches.length %}<p class="canon-unit-lab"><a href="/lab/{{ unit.routeSlug }}/">Open Article Lab</a></p>{% endif %}</details></li>{% endfor %}</ul>
2 changes: 2 additions & 0 deletions tests/generated-site.test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,8 @@ test('Way map renders Human consciousness beneath Interdefinables and before Pre
assert.match(way, /<details class="canon-unit"/);
assert.match(way, /<summary class="canon-unit-summary">/);
assert.match(way, /Select a title to display that canon unit's exact text/);
assert.equal((way.match(/class="canon-unit-lab"/g) || []).length, 8);
assert.match(way, /Open Article Lab/);
assert.doesNotMatch(way, /Open unit page|Enter Lab|Source and provenance|tap to read|text open/);
});

Expand Down
10 changes: 8 additions & 2 deletions tests/site-contract.test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,19 @@ test('base layout remains readable without javascript and exposes the textbook a
assert.match(layout, /<main id="content"/);
assert.match(layout, /href="\/chapters\/"/);
assert.match(layout, /href="\/narratives\/"/);
assert.match(layout, /<a href="\/way\/">Start<\/a>/);
assert.doesNotMatch(layout, />The Way<\/a>/);
assert.doesNotMatch(layout, />Article Lab<\/a>/);
assert.doesNotMatch(layout, /fetch\(/);
});

test('Way map disclosures contain only a title and exact canon text', async () => {
test('Way tree disclosures contain exact canon text and only reviewed Article Lab links', async () => {
const way = await readFile('src/way/index.njk', 'utf8');
assert.match(way, /<details class="canon-unit"/);
assert.match(way, /<summary class="canon-unit-summary"><strong>{{ unit\.title }}<\/strong><\/summary>/);
assert.match(way, /<pre class="source-block">{{ unit\.content }}<\/pre>/);
assert.match(way, /article_lab \| where\("unit_id", unit\.id\)/);
assert.match(way, /href="\/lab\/{{ unit\.routeSlug }}\/">Open Article Lab<\/a>/);
assert.doesNotMatch(way, /Open unit page|Enter Lab|Source and provenance|tap to read|text open/);
assert.doesNotMatch(way, /<script/i);
});
Expand All @@ -42,7 +47,8 @@ test('Awakening owns the static public threshold and routes inward', async () =>
assert.match(splash, /href="\/preamble\/"/);
assert.match(splash, /href="\/home\/"/);
assert.match(home, /permalink: \/home\//);
assert.match(home, /href="\/lab\/"/);
assert.match(home, /href="\/way\/"/);
assert.doesNotMatch(home, /href="\/lab\/"/);
});

test('distributed textbook routes are data-backed and source-bound', async () => {
Expand Down
29 changes: 19 additions & 10 deletions tests/site.spec.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -62,9 +62,15 @@ test('the knowledge-system home links to Awakening, Preamble, and the distribute
await page.goto('/home/');
await expect(page.locator('a.brand')).toHaveAttribute('href', '/home/');
await expect(page.locator('nav[aria-label="Primary navigation"] a[href="/"]', { hasText: 'Awakening' })).toBeVisible();
const startLink = page.locator('nav[aria-label="Primary navigation"] a[href="/way/"]', { hasText: 'Start' });
await expect(startLink).toBeVisible();
await expect(page.locator('nav[aria-label="Primary navigation"] a', { hasText: 'The Way' })).toHaveCount(0);
await expect(page.locator('nav[aria-label="Primary navigation"] a[href="/preamble/"]', { hasText: 'Preamble' })).toBeVisible();
await expect(page.locator('nav[aria-label="Primary navigation"] a[href="/chapters/"]', { hasText: 'Textbook' })).toBeVisible();
await expect(page.locator('main a[href="/chapters/"]').first()).toBeVisible();
await startLink.click();
await expect(page).toHaveURL(/\/way\/$/);
await expect(page.locator('details.canon-unit').first()).toBeVisible();
});

test('chapters zero through seven are indexed, source-bound, and sequentially navigable', async ({ page }) => {
Expand Down Expand Up @@ -94,16 +100,19 @@ test('all eight rights articles are reachable from the article index', async ({

test('clicking a Way row reveals its bounded canon text without leaving the tree', async ({ page }) => {
await page.goto('/way/');
const articleFive = page.locator('details.canon-unit', { has: page.locator('summary', { hasText: 'Article Five' }) }).first();
const sourceBlock = articleFive.locator('.source-block');
await expect(articleFive).not.toHaveAttribute('open', '');
await expect(page.locator('.canon-unit-lab a')).toHaveCount(articleLab.length);
const article = page.locator('details.canon-unit', { has: page.locator(`a[href="${labRoutes[0].route}"]`) }).first();
const sourceBlock = article.locator('.source-block');
const labLink = article.locator(`a[href="${labRoutes[0].route}"]`);
await expect(article).not.toHaveAttribute('open', '');
await expect(sourceBlock).not.toBeVisible();
await articleFive.locator('summary').click();
await expect(articleFive).toHaveAttribute('open', '');
await expect(labLink).not.toBeVisible();
await article.locator('summary').click();
await expect(article).toHaveAttribute('open', '');
await expect(sourceBlock).toBeVisible();
await expect(sourceBlock).toContainText('Article Five');
await expect(sourceBlock).toContainText('Article One');
expect((await sourceBlock.textContent())?.trim().length).toBeGreaterThan(100);
await expect(articleFive.locator('a')).toHaveCount(0);
await expect(labLink).toBeVisible();
await expect(page).toHaveURL(/\/way\/$/);
});

Expand All @@ -119,9 +128,9 @@ test('living narratives keep fiction and adulthood boundaries visible', async ({
await expect(page.locator('.hmmm')).toContainText('Neither adulthood, interdependence, physical maturity, nor a Political Circle has been declared complete');
});

test('all eight Rights Article Labs are indexed and expose the shared contact structure', async ({ page }) => {
await page.goto('/lab/');
for (const record of labRoutes) await expect(page.locator(`a[href="${record.route}"]`)).toBeVisible();
test('all eight Rights Article Labs are linked from the Way tree and expose the shared contact structure', async ({ page }) => {
await page.goto('/way/');
for (const record of labRoutes) await expect(page.locator(`a[href="${record.route}"]`)).toHaveCount(1);

await page.goto(labRoutes[0].route);
await expect(page.locator('body')).toContainText('Reductio ad absurdum');
Expand Down
Loading