@adia-ai/web-modules 0.4.0 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +15 -0
- package/README.md +29 -15
- package/index.js +1 -0
- package/package.json +5 -2
- package/simple/index.js +2 -0
- package/simple/simple-content/simple-content.a2ui.json +67 -0
- package/simple/simple-content/simple-content.css +29 -0
- package/simple/simple-content/simple-content.examples.html +13 -0
- package/simple/simple-content/simple-content.html +42 -0
- package/simple/simple-content/simple-content.yaml +54 -0
- package/simple/simple-hero/simple-hero.a2ui.json +76 -0
- package/simple/simple-hero/simple-hero.css +45 -0
- package/simple/simple-hero/simple-hero.examples.html +33 -0
- package/simple/simple-hero/simple-hero.html +42 -0
- package/simple/simple-hero/simple-hero.yaml +57 -0
- package/simple/simple-shell/simple-shell.a2ui.json +87 -0
- package/simple/simple-shell/simple-shell.css +40 -0
- package/simple/simple-shell/simple-shell.examples.html +42 -0
- package/simple/simple-shell/simple-shell.html +42 -0
- package/simple/simple-shell/simple-shell.js +47 -0
- package/simple/simple-shell/simple-shell.test.js +83 -0
- package/simple/simple-shell/simple-shell.yaml +78 -0
package/CHANGELOG.md
CHANGED
|
@@ -11,6 +11,21 @@ Built from `@adia-ai/web-components` primitives.
|
|
|
11
11
|
|
|
12
12
|
_No pending changes._
|
|
13
13
|
|
|
14
|
+
## [0.4.1] - 2026-05-10
|
|
15
|
+
|
|
16
|
+
### Added
|
|
17
|
+
|
|
18
|
+
- **simple cluster — 4th bespoke shell family** per ADR-0023. Minimal shell for marketing / landing / error pages:
|
|
19
|
+
- `<simple-shell>` (host) — behavior-only orchestrator. 2 reflected attributes: `[centered]` (vertical center), `[full-bleed]` (drops max-width).
|
|
20
|
+
- `<simple-content>` (CSS-only) — article body container with token-correct vertical rhythm.
|
|
21
|
+
- `<simple-hero>` (CSS-only) — optional top strip with 3 named slots (`heading`, `lede`, `actions`).
|
|
22
|
+
- Subpath export: `@adia-ai/web-modules/simple`.
|
|
23
|
+
- 10 unit tests for `<simple-shell>`.
|
|
24
|
+
|
|
25
|
+
### Changed
|
|
26
|
+
|
|
27
|
+
- Catalog count: 118 → 121 yamls (+3 from simple cluster children).
|
|
28
|
+
|
|
14
29
|
## [0.4.0] - 2026-05-10
|
|
15
30
|
|
|
16
31
|
**⚠️ BREAKING** — first non-patch release in the 0.x line. Closes the ADR-0023 arc per [ADR-0024](../../.brain/adrs/0024-legacy-shell-shapes-retired.md). All 6 in-repo consumers migrated in v0.3.6; this release retires the legacy authoring shapes from the shell hosts.
|
package/README.md
CHANGED
|
@@ -5,6 +5,10 @@ Composite custom elements built from
|
|
|
5
5
|
into clusters by use case; each cluster ships as a subpath export so
|
|
6
6
|
consumers install only what they need.
|
|
7
7
|
|
|
8
|
+
Each cluster carries a **shell host** (behavior-only orchestrator) plus
|
|
9
|
+
a **family of bespoke shell-tier children** (cluster-namespaced custom
|
|
10
|
+
elements with state-as-attribute semantics) per [ADR-0023](../../.brain/adrs/0023-bespoke-shell-tier-children.md). The bespoke vocabulary is the only recognized authoring shape since v0.4.0 ([ADR-0024](../../.brain/adrs/0024-legacy-shell-shapes-retired.md)).
|
|
11
|
+
|
|
8
12
|
> The patterns directory lived inside `@adia-ai/web-components` as
|
|
9
13
|
> `patterns/` until this package was extracted (see
|
|
10
14
|
> [ADR-0012](../../.brain/adrs/0012-three-tier-architecture-modules.md)).
|
|
@@ -13,16 +17,17 @@ consumers install only what they need.
|
|
|
13
17
|
|
|
14
18
|
## Clusters
|
|
15
19
|
|
|
16
|
-
| Cluster |
|
|
17
|
-
|
|
18
|
-
| `shell` | `<admin-shell>` (
|
|
19
|
-
| `chat` | `<chat-shell>` | Conversational surface — messages,
|
|
20
|
-
| `editor` | `<editor-shell>` |
|
|
21
|
-
| `runtime` | `<gen-root>`, `<a2ui-root>` | Render roots that turn JSON or gen-UI intents into live DOM. |
|
|
20
|
+
| Cluster | Host | Bespoke children | What's inside |
|
|
21
|
+
|---|---|---|---|
|
|
22
|
+
| `shell` | `<admin-shell>` | `<admin-sidebar>`, `<admin-command>` (JS-bearing); `<admin-content>`, `<admin-topbar>`, `<admin-statusbar>`, `<admin-scroll>`, `<admin-page>`, `<admin-page-header>`, `<admin-page-body>` (CSS-only); 9 children total | Admin-shell composition: sidebars, command palette, page chrome. Resize/collapse/persistence on `<admin-sidebar>`; Cmd+K palette on `<admin-command>`. |
|
|
23
|
+
| `chat` | `<chat-shell>` | `<chat-thread>`, `<chat-composer>`, `<chat-sidebar>` (JS-bearing); `<chat-empty>`, `<chat-header>`, `<chat-status>` (CSS-only); 6 children total | Conversational surface — streaming messages, composer with `[disabled]` propagation, scroll-to-bottom thread, `[streaming]` reflected. |
|
|
24
|
+
| `editor` | `<editor-shell>` | `<editor-toolbar>`, `<editor-canvas>`, `<editor-sidebar>` (JS-bearing); `<editor-statusbar>`, `<editor-canvas-empty>` (CSS-only); 5 children total | Design-tool surface — toolbar with `[full-screen]`, central canvas with `[focused]`/`[empty]`, sidebar wraps `<pane-ui resizable>` for delegation. |
|
|
25
|
+
| `runtime` | `<gen-root>`, `<a2ui-root>` | — | Render roots that turn JSON or gen-UI intents into live DOM. |
|
|
22
26
|
|
|
23
27
|
Future clusters on the strategic horizon: `data` (kanban, filters,
|
|
24
|
-
table-toolbar), `agent` (agent-trace, reasoning panels)
|
|
25
|
-
|
|
28
|
+
table-toolbar), `agent` (agent-trace, reasoning panels).
|
|
29
|
+
|
|
30
|
+
See [`bespoke-shell-children` skill](../../.agents/skills/bespoke-shell-children/SKILL.md) for the canonical decomposition recipe used by all three families.
|
|
26
31
|
|
|
27
32
|
## Quick start
|
|
28
33
|
|
|
@@ -35,17 +40,26 @@ table-toolbar), `agent` (agent-trace, reasoning panels), `admin`
|
|
|
35
40
|
|
|
36
41
|
<script type="module">
|
|
37
42
|
import '@adia-ai/web-components'; // primitives + nav family
|
|
38
|
-
import '@adia-ai/web-modules/shell'; // admin-shell
|
|
39
|
-
import '@adia-ai/web-modules/chat'; //
|
|
40
|
-
import '@adia-ai/web-modules/
|
|
43
|
+
import '@adia-ai/web-modules/shell'; // admin-shell + bespoke children
|
|
44
|
+
import '@adia-ai/web-modules/chat'; // chat-shell + bespoke children
|
|
45
|
+
import '@adia-ai/web-modules/editor'; // editor-shell + bespoke children
|
|
46
|
+
import '@adia-ai/web-modules/runtime'; // gen-root, a2ui-root
|
|
41
47
|
</script>
|
|
42
48
|
|
|
49
|
+
<!-- Bespoke shape (canonical since v0.4.0): -->
|
|
43
50
|
<admin-shell mode="rounded">
|
|
44
|
-
<
|
|
45
|
-
<header-ui
|
|
46
|
-
|
|
47
|
-
|
|
51
|
+
<admin-sidebar slot="leading" resizable collapsible>
|
|
52
|
+
<header-ui>
|
|
53
|
+
<span slot="heading">App</span>
|
|
54
|
+
</header-ui>
|
|
55
|
+
<section-ui>
|
|
56
|
+
<nav-ui>…</nav-ui>
|
|
57
|
+
</section-ui>
|
|
58
|
+
</admin-sidebar>
|
|
48
59
|
<main>…</main>
|
|
60
|
+
<admin-command>
|
|
61
|
+
<command-ui placeholder="Search..."></command-ui>
|
|
62
|
+
</admin-command>
|
|
49
63
|
</admin-shell>
|
|
50
64
|
```
|
|
51
65
|
|
package/index.js
CHANGED
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adia-ai/web-modules",
|
|
3
|
-
"version": "0.4.
|
|
4
|
-
"description": "AdiaUI composite custom elements
|
|
3
|
+
"version": "0.4.1",
|
|
4
|
+
"description": "AdiaUI composite custom elements — shell, chat, editor, runtime clusters built from @adia-ai/web-components primitives. Subpath exports per cluster.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
7
7
|
".": "./index.js",
|
|
@@ -11,6 +11,8 @@
|
|
|
11
11
|
"./chat/*": "./chat/*/*.js",
|
|
12
12
|
"./editor": "./editor/index.js",
|
|
13
13
|
"./editor/*": "./editor/*/*.js",
|
|
14
|
+
"./simple": "./simple/index.js",
|
|
15
|
+
"./simple/*": "./simple/*/*.js",
|
|
14
16
|
"./runtime": "./runtime/index.js",
|
|
15
17
|
"./runtime/*": "./runtime/*/*.js",
|
|
16
18
|
"./package.json": "./package.json"
|
|
@@ -19,6 +21,7 @@
|
|
|
19
21
|
"shell/",
|
|
20
22
|
"chat/",
|
|
21
23
|
"editor/",
|
|
24
|
+
"simple/",
|
|
22
25
|
"runtime/",
|
|
23
26
|
"index.js",
|
|
24
27
|
"README.md",
|
package/simple/index.js
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://adiaui.dev/a2ui/v0_9/components/SimpleContent.json",
|
|
4
|
+
"title": "SimpleContent",
|
|
5
|
+
"description": "Module-tier article-body container. CSS-only — no JS, no state.\nSits inside <simple-shell> as the main content surface with\ntoken-correct vertical rhythm and prose-friendly max-width.\n\nCompanion to <simple-hero> (optional top strip) per ADR-0023\nbespoke shell-tier children.\n",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"allOf": [
|
|
8
|
+
{
|
|
9
|
+
"$ref": "common_types.json#/$defs/ComponentCommon"
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
"$ref": "common_types.json#/$defs/CatalogComponentCommon"
|
|
13
|
+
}
|
|
14
|
+
],
|
|
15
|
+
"properties": {
|
|
16
|
+
"component": {
|
|
17
|
+
"const": "SimpleContent"
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
"required": [
|
|
21
|
+
"component"
|
|
22
|
+
],
|
|
23
|
+
"unevaluatedProperties": false,
|
|
24
|
+
"x-adiaui": {
|
|
25
|
+
"anti_patterns": [],
|
|
26
|
+
"category": "shells",
|
|
27
|
+
"events": {},
|
|
28
|
+
"examples": [],
|
|
29
|
+
"keywords": [
|
|
30
|
+
"simple-content",
|
|
31
|
+
"article",
|
|
32
|
+
"body",
|
|
33
|
+
"prose",
|
|
34
|
+
"main-content",
|
|
35
|
+
"landing-body",
|
|
36
|
+
"marketing-body"
|
|
37
|
+
],
|
|
38
|
+
"name": "SimpleContent",
|
|
39
|
+
"related": [
|
|
40
|
+
"SimpleShell",
|
|
41
|
+
"SimpleHero"
|
|
42
|
+
],
|
|
43
|
+
"slots": {
|
|
44
|
+
"default": {
|
|
45
|
+
"description": "Article body content — prose, code blocks, illustrations. Authors compose freely; <simple-content> provides only the container with sensible defaults (vertical rhythm, max-width, typography token application)."
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
"states": [
|
|
49
|
+
{
|
|
50
|
+
"description": "Default, visible.",
|
|
51
|
+
"name": "idle"
|
|
52
|
+
}
|
|
53
|
+
],
|
|
54
|
+
"synonyms": {
|
|
55
|
+
"simple-content": [
|
|
56
|
+
"page-content",
|
|
57
|
+
"article-body",
|
|
58
|
+
"prose-container",
|
|
59
|
+
"main-body"
|
|
60
|
+
]
|
|
61
|
+
},
|
|
62
|
+
"tag": "simple-content",
|
|
63
|
+
"tokens": {},
|
|
64
|
+
"traits": [],
|
|
65
|
+
"version": 1
|
|
66
|
+
}
|
|
67
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/* ═══════════════════════════════════════════════════════════════
|
|
2
|
+
simple-content — Article body container
|
|
3
|
+
|
|
4
|
+
CSS-only structural child of <simple-shell>. Provides token-correct
|
|
5
|
+
vertical rhythm + prose-friendly max-width for article body content.
|
|
6
|
+
═══════════════════════════════════════════════════════════════ */
|
|
7
|
+
|
|
8
|
+
@scope (simple-content) {
|
|
9
|
+
:scope {
|
|
10
|
+
display: flex;
|
|
11
|
+
flex-direction: column;
|
|
12
|
+
gap: var(--a-density-4, 1.5rem);
|
|
13
|
+
width: 100%;
|
|
14
|
+
color: var(--a-text);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/* Typographic rhythm for prose children */
|
|
18
|
+
:scope > h1,
|
|
19
|
+
:scope > h2,
|
|
20
|
+
:scope > h3 {
|
|
21
|
+
margin: 0;
|
|
22
|
+
color: var(--a-text-heading, var(--a-text));
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
:scope > p {
|
|
26
|
+
margin: 0;
|
|
27
|
+
line-height: var(--a-line-height-prose, 1.6);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
<h1>simple-content — article body container</h1>
|
|
2
|
+
|
|
3
|
+
<p>CSS-only structural child of <code><simple-shell></code>. Provides vertical rhythm and prose-friendly max-width.</p>
|
|
4
|
+
|
|
5
|
+
<simple-shell style="border: 1px solid var(--a-border); border-radius: var(--a-radius-3); min-height: 50dvh;">
|
|
6
|
+
<simple-content>
|
|
7
|
+
<h1>Article body</h1>
|
|
8
|
+
<p>simple-content is the main article surface. It applies token-correct vertical rhythm (the gap between children uses <code>--a-density-4</code>) and uses prose typography for paragraphs and headings.</p>
|
|
9
|
+
<h2>Section heading</h2>
|
|
10
|
+
<p>Headings cascade naturally. h1 / h2 / h3 receive heading colors via <code>--a-text-heading</code>.</p>
|
|
11
|
+
<p>Body paragraphs use a prose line-height (<code>--a-line-height-prose</code>) for comfortable reading.</p>
|
|
12
|
+
</simple-content>
|
|
13
|
+
</simple-shell>
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en" data-theme="auto">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
|
+
<title>Simple Content — AdiaUI</title>
|
|
7
|
+
|
|
8
|
+
<link rel="stylesheet" href="../../../web-components/styles/resets.css">
|
|
9
|
+
<link rel="stylesheet" href="../../../web-components/styles/tokens.css">
|
|
10
|
+
<link rel="stylesheet" href="../simple-shell/simple-shell.css">
|
|
11
|
+
<link rel="stylesheet" href="../simple-content/simple-content.css">
|
|
12
|
+
<link rel="stylesheet" href="../simple-hero/simple-hero.css">
|
|
13
|
+
<link rel="stylesheet" href="../../../web-components/components/button/button.css">
|
|
14
|
+
|
|
15
|
+
<script type="module" src="../simple-shell/simple-shell.js"></script>
|
|
16
|
+
<script type="module" src="../../../web-components/components/button/button.js"></script>
|
|
17
|
+
|
|
18
|
+
<style>
|
|
19
|
+
:where(html, body) { margin: 0; min-height: 100vh; background: var(--a-bg); color: var(--a-fg); font-family: var(--a-font); }
|
|
20
|
+
main { max-width: 960px; margin-inline: auto; padding: var(--a-space-6) var(--a-space-5); }
|
|
21
|
+
</style>
|
|
22
|
+
</head>
|
|
23
|
+
<body>
|
|
24
|
+
|
|
25
|
+
<main id="demo-root">
|
|
26
|
+
<p>Loading examples…</p>
|
|
27
|
+
</main>
|
|
28
|
+
|
|
29
|
+
<script type="module">
|
|
30
|
+
const root = document.getElementById('demo-root');
|
|
31
|
+
try {
|
|
32
|
+
const res = await fetch('./simple-content.examples.html');
|
|
33
|
+
if (!res.ok) throw new Error(`fetch failed (${res.status})`);
|
|
34
|
+
root.innerHTML = await res.text();
|
|
35
|
+
} catch (err) {
|
|
36
|
+
root.innerHTML = `<p style="color:var(--a-danger-strong);">Failed to load simple-content.examples.html — ${err.message}</p>`;
|
|
37
|
+
console.error('[simple-content.html]', err);
|
|
38
|
+
}
|
|
39
|
+
</script>
|
|
40
|
+
|
|
41
|
+
</body>
|
|
42
|
+
</html>
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# Edit this file; run `npm run build:components` to regenerate a2ui.json.
|
|
2
|
+
$schema: ../../../../scripts/schemas/component.yaml.schema.json
|
|
3
|
+
name: SimpleContent
|
|
4
|
+
tag: simple-content
|
|
5
|
+
component: SimpleContent
|
|
6
|
+
category: shells
|
|
7
|
+
version: 1
|
|
8
|
+
description: |
|
|
9
|
+
Module-tier article-body container. CSS-only — no JS, no state.
|
|
10
|
+
Sits inside <simple-shell> as the main content surface with
|
|
11
|
+
token-correct vertical rhythm and prose-friendly max-width.
|
|
12
|
+
|
|
13
|
+
Companion to <simple-hero> (optional top strip) per ADR-0023
|
|
14
|
+
bespoke shell-tier children.
|
|
15
|
+
|
|
16
|
+
props: {}
|
|
17
|
+
|
|
18
|
+
events: {}
|
|
19
|
+
|
|
20
|
+
slots:
|
|
21
|
+
default:
|
|
22
|
+
description: >-
|
|
23
|
+
Article body content — prose, code blocks, illustrations.
|
|
24
|
+
Authors compose freely; <simple-content> provides only the
|
|
25
|
+
container with sensible defaults (vertical rhythm, max-width,
|
|
26
|
+
typography token application).
|
|
27
|
+
|
|
28
|
+
states:
|
|
29
|
+
- name: idle
|
|
30
|
+
description: Default, visible.
|
|
31
|
+
|
|
32
|
+
traits: []
|
|
33
|
+
|
|
34
|
+
a2ui:
|
|
35
|
+
rules:
|
|
36
|
+
- >-
|
|
37
|
+
simple-content is the article surface inside simple-shell. Use
|
|
38
|
+
for primary page body. Sibling to <simple-hero> (optional).
|
|
39
|
+
|
|
40
|
+
keywords:
|
|
41
|
+
- simple-content
|
|
42
|
+
- article
|
|
43
|
+
- body
|
|
44
|
+
- prose
|
|
45
|
+
- main-content
|
|
46
|
+
- landing-body
|
|
47
|
+
- marketing-body
|
|
48
|
+
|
|
49
|
+
synonyms:
|
|
50
|
+
simple-content: [page-content, article-body, prose-container, main-body]
|
|
51
|
+
|
|
52
|
+
related:
|
|
53
|
+
- SimpleShell
|
|
54
|
+
- SimpleHero
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://adiaui.dev/a2ui/v0_9/components/SimpleHero.json",
|
|
4
|
+
"title": "SimpleHero",
|
|
5
|
+
"description": "Module-tier hero strip for the top of marketing / landing / error\npages. CSS-only — no JS, no state. Three named slots (heading, lede,\nactions) carry the canonical hero composition.\n\nSits inside <simple-shell> above <simple-content>. Companion to\n<simple-content> per ADR-0023 bespoke shell-tier children.\n",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"allOf": [
|
|
8
|
+
{
|
|
9
|
+
"$ref": "common_types.json#/$defs/ComponentCommon"
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
"$ref": "common_types.json#/$defs/CatalogComponentCommon"
|
|
13
|
+
}
|
|
14
|
+
],
|
|
15
|
+
"properties": {
|
|
16
|
+
"component": {
|
|
17
|
+
"const": "SimpleHero"
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
"required": [
|
|
21
|
+
"component"
|
|
22
|
+
],
|
|
23
|
+
"unevaluatedProperties": false,
|
|
24
|
+
"x-adiaui": {
|
|
25
|
+
"anti_patterns": [],
|
|
26
|
+
"category": "shells",
|
|
27
|
+
"events": {},
|
|
28
|
+
"examples": [],
|
|
29
|
+
"keywords": [
|
|
30
|
+
"simple-hero",
|
|
31
|
+
"hero",
|
|
32
|
+
"splash",
|
|
33
|
+
"landing-hero",
|
|
34
|
+
"marketing-hero",
|
|
35
|
+
"intro",
|
|
36
|
+
"page-title"
|
|
37
|
+
],
|
|
38
|
+
"name": "SimpleHero",
|
|
39
|
+
"related": [
|
|
40
|
+
"SimpleShell",
|
|
41
|
+
"SimpleContent"
|
|
42
|
+
],
|
|
43
|
+
"slots": {
|
|
44
|
+
"default": {
|
|
45
|
+
"description": "Optional inline content if the named slots are insufficient."
|
|
46
|
+
},
|
|
47
|
+
"actions": {
|
|
48
|
+
"description": "Action row (button-ui, link-ui) for primary CTAs."
|
|
49
|
+
},
|
|
50
|
+
"heading": {
|
|
51
|
+
"description": "Large display heading (h1) — the page title."
|
|
52
|
+
},
|
|
53
|
+
"lede": {
|
|
54
|
+
"description": "Lead paragraph below heading — short summary or CTA tagline."
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
"states": [
|
|
58
|
+
{
|
|
59
|
+
"description": "Default, visible.",
|
|
60
|
+
"name": "idle"
|
|
61
|
+
}
|
|
62
|
+
],
|
|
63
|
+
"synonyms": {
|
|
64
|
+
"simple-hero": [
|
|
65
|
+
"page-hero",
|
|
66
|
+
"splash-hero",
|
|
67
|
+
"landing-hero",
|
|
68
|
+
"intro-strip"
|
|
69
|
+
]
|
|
70
|
+
},
|
|
71
|
+
"tag": "simple-hero",
|
|
72
|
+
"tokens": {},
|
|
73
|
+
"traits": [],
|
|
74
|
+
"version": 1
|
|
75
|
+
}
|
|
76
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/* ═══════════════════════════════════════════════════════════════
|
|
2
|
+
simple-hero — Optional top strip for landing / error / splash pages
|
|
3
|
+
|
|
4
|
+
CSS-only. Three named slots (heading, lede, actions) compose the
|
|
5
|
+
canonical hero layout. Authors can omit any slot.
|
|
6
|
+
═══════════════════════════════════════════════════════════════ */
|
|
7
|
+
|
|
8
|
+
@scope (simple-hero) {
|
|
9
|
+
:scope {
|
|
10
|
+
display: flex;
|
|
11
|
+
flex-direction: column;
|
|
12
|
+
align-items: center;
|
|
13
|
+
text-align: center;
|
|
14
|
+
gap: var(--a-density-3, 1rem);
|
|
15
|
+
width: 100%;
|
|
16
|
+
padding-block: var(--a-density-6, 3rem);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/* Heading slot — large display size */
|
|
20
|
+
:scope [slot="heading"] {
|
|
21
|
+
margin: 0;
|
|
22
|
+
font-size: var(--a-font-size-display, 2.5rem);
|
|
23
|
+
line-height: var(--a-line-height-tight, 1.2);
|
|
24
|
+
color: var(--a-text-heading, var(--a-text));
|
|
25
|
+
font-weight: var(--a-font-weight-bold, 600);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/* Lede slot — muted, larger than body */
|
|
29
|
+
:scope [slot="lede"] {
|
|
30
|
+
margin: 0;
|
|
31
|
+
font-size: var(--a-font-size-lede, 1.25rem);
|
|
32
|
+
line-height: var(--a-line-height-prose, 1.5);
|
|
33
|
+
color: var(--a-text-muted);
|
|
34
|
+
max-width: 42rem;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/* Actions slot — flex row */
|
|
38
|
+
:scope [slot="actions"] {
|
|
39
|
+
display: flex;
|
|
40
|
+
flex-wrap: wrap;
|
|
41
|
+
gap: var(--a-density-2, 0.75rem);
|
|
42
|
+
justify-content: center;
|
|
43
|
+
margin-top: var(--a-density-2, 0.75rem);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
<h1>simple-hero — hero strip for landing / error / splash pages</h1>
|
|
2
|
+
|
|
3
|
+
<p>CSS-only. Three named slots: heading, lede, actions. Authors can omit any slot.</p>
|
|
4
|
+
|
|
5
|
+
<h2>All three slots</h2>
|
|
6
|
+
|
|
7
|
+
<simple-shell style="border: 1px solid var(--a-border); border-radius: var(--a-radius-3); min-height: 50dvh;">
|
|
8
|
+
<simple-hero>
|
|
9
|
+
<h1 slot="heading">Build with AdiaUI</h1>
|
|
10
|
+
<p slot="lede">Zero dependencies. Production-ready primitives. LLM-native generative UI.</p>
|
|
11
|
+
<div slot="actions">
|
|
12
|
+
<button-ui variant="solid" color="accent">Get started</button-ui>
|
|
13
|
+
<button-ui variant="outline">Read the docs</button-ui>
|
|
14
|
+
</div>
|
|
15
|
+
</simple-hero>
|
|
16
|
+
</simple-shell>
|
|
17
|
+
|
|
18
|
+
<h2>Heading + lede only</h2>
|
|
19
|
+
|
|
20
|
+
<simple-shell style="border: 1px solid var(--a-border); border-radius: var(--a-radius-3); min-height: 40dvh;">
|
|
21
|
+
<simple-hero>
|
|
22
|
+
<h1 slot="heading">Thank you</h1>
|
|
23
|
+
<p slot="lede">Your message has been received. We'll get back to you within 24 hours.</p>
|
|
24
|
+
</simple-hero>
|
|
25
|
+
</simple-shell>
|
|
26
|
+
|
|
27
|
+
<h2>Heading only — minimal error page</h2>
|
|
28
|
+
|
|
29
|
+
<simple-shell centered style="border: 1px solid var(--a-border); border-radius: var(--a-radius-3); min-height: 30dvh;">
|
|
30
|
+
<simple-hero>
|
|
31
|
+
<h1 slot="heading">Maintenance in progress</h1>
|
|
32
|
+
</simple-hero>
|
|
33
|
+
</simple-shell>
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en" data-theme="auto">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
|
+
<title>Simple Hero — AdiaUI</title>
|
|
7
|
+
|
|
8
|
+
<link rel="stylesheet" href="../../../web-components/styles/resets.css">
|
|
9
|
+
<link rel="stylesheet" href="../../../web-components/styles/tokens.css">
|
|
10
|
+
<link rel="stylesheet" href="../simple-shell/simple-shell.css">
|
|
11
|
+
<link rel="stylesheet" href="../simple-content/simple-content.css">
|
|
12
|
+
<link rel="stylesheet" href="../simple-hero/simple-hero.css">
|
|
13
|
+
<link rel="stylesheet" href="../../../web-components/components/button/button.css">
|
|
14
|
+
|
|
15
|
+
<script type="module" src="../simple-shell/simple-shell.js"></script>
|
|
16
|
+
<script type="module" src="../../../web-components/components/button/button.js"></script>
|
|
17
|
+
|
|
18
|
+
<style>
|
|
19
|
+
:where(html, body) { margin: 0; min-height: 100vh; background: var(--a-bg); color: var(--a-fg); font-family: var(--a-font); }
|
|
20
|
+
main { max-width: 960px; margin-inline: auto; padding: var(--a-space-6) var(--a-space-5); }
|
|
21
|
+
</style>
|
|
22
|
+
</head>
|
|
23
|
+
<body>
|
|
24
|
+
|
|
25
|
+
<main id="demo-root">
|
|
26
|
+
<p>Loading examples…</p>
|
|
27
|
+
</main>
|
|
28
|
+
|
|
29
|
+
<script type="module">
|
|
30
|
+
const root = document.getElementById('demo-root');
|
|
31
|
+
try {
|
|
32
|
+
const res = await fetch('./simple-hero.examples.html');
|
|
33
|
+
if (!res.ok) throw new Error(`fetch failed (${res.status})`);
|
|
34
|
+
root.innerHTML = await res.text();
|
|
35
|
+
} catch (err) {
|
|
36
|
+
root.innerHTML = `<p style="color:var(--a-danger-strong);">Failed to load simple-hero.examples.html — ${err.message}</p>`;
|
|
37
|
+
console.error('[simple-hero.html]', err);
|
|
38
|
+
}
|
|
39
|
+
</script>
|
|
40
|
+
|
|
41
|
+
</body>
|
|
42
|
+
</html>
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Edit this file; run `npm run build:components` to regenerate a2ui.json.
|
|
2
|
+
$schema: ../../../../scripts/schemas/component.yaml.schema.json
|
|
3
|
+
name: SimpleHero
|
|
4
|
+
tag: simple-hero
|
|
5
|
+
component: SimpleHero
|
|
6
|
+
category: shells
|
|
7
|
+
version: 1
|
|
8
|
+
description: |
|
|
9
|
+
Module-tier hero strip for the top of marketing / landing / error
|
|
10
|
+
pages. CSS-only — no JS, no state. Three named slots (heading, lede,
|
|
11
|
+
actions) carry the canonical hero composition.
|
|
12
|
+
|
|
13
|
+
Sits inside <simple-shell> above <simple-content>. Companion to
|
|
14
|
+
<simple-content> per ADR-0023 bespoke shell-tier children.
|
|
15
|
+
|
|
16
|
+
props: {}
|
|
17
|
+
|
|
18
|
+
events: {}
|
|
19
|
+
|
|
20
|
+
slots:
|
|
21
|
+
heading:
|
|
22
|
+
description: Large display heading (h1) — the page title.
|
|
23
|
+
lede:
|
|
24
|
+
description: Lead paragraph below heading — short summary or CTA tagline.
|
|
25
|
+
actions:
|
|
26
|
+
description: Action row (button-ui, link-ui) for primary CTAs.
|
|
27
|
+
default:
|
|
28
|
+
description: Optional inline content if the named slots are insufficient.
|
|
29
|
+
|
|
30
|
+
states:
|
|
31
|
+
- name: idle
|
|
32
|
+
description: Default, visible.
|
|
33
|
+
|
|
34
|
+
traits: []
|
|
35
|
+
|
|
36
|
+
a2ui:
|
|
37
|
+
rules:
|
|
38
|
+
- >-
|
|
39
|
+
simple-hero is the optional top strip inside simple-shell. Use
|
|
40
|
+
for marketing splashes, error-page reassurance text, or single-
|
|
41
|
+
flow page intros. Always followed by <simple-content> for body.
|
|
42
|
+
|
|
43
|
+
keywords:
|
|
44
|
+
- simple-hero
|
|
45
|
+
- hero
|
|
46
|
+
- splash
|
|
47
|
+
- landing-hero
|
|
48
|
+
- marketing-hero
|
|
49
|
+
- intro
|
|
50
|
+
- page-title
|
|
51
|
+
|
|
52
|
+
synonyms:
|
|
53
|
+
simple-hero: [page-hero, splash-hero, landing-hero, intro-strip]
|
|
54
|
+
|
|
55
|
+
related:
|
|
56
|
+
- SimpleShell
|
|
57
|
+
- SimpleContent
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://adiaui.dev/a2ui/v0_9/components/SimpleShell.json",
|
|
4
|
+
"title": "SimpleShell",
|
|
5
|
+
"description": "Module-tier minimal shell for marketing / landing / error pages.\nBehavior-only orchestrator with two reflected attributes — [centered]\nfor vertical centering, [full-bleed] for dropping the max-width\nconstraint.\n\nThe 4th cluster in the bespoke shell family per ADR-0023, designed\ndeliberately small (1 host + 2 CSS-only children) to demonstrate\nthe pattern works without ceremony for thin clusters.\n\nUse cases: marketing splashes, error pages (404 / 500 / maintenance),\nthank-you pages, single-card flows (sign-in, password reset).\n",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"allOf": [
|
|
8
|
+
{
|
|
9
|
+
"$ref": "common_types.json#/$defs/ComponentCommon"
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
"$ref": "common_types.json#/$defs/CatalogComponentCommon"
|
|
13
|
+
}
|
|
14
|
+
],
|
|
15
|
+
"properties": {
|
|
16
|
+
"centered": {
|
|
17
|
+
"description": "Reflected — vertically centers content in viewport.",
|
|
18
|
+
"type": "boolean",
|
|
19
|
+
"default": false
|
|
20
|
+
},
|
|
21
|
+
"component": {
|
|
22
|
+
"const": "SimpleShell"
|
|
23
|
+
},
|
|
24
|
+
"full-bleed": {
|
|
25
|
+
"description": "Reflected — drops the default max-width so content fills full viewport.",
|
|
26
|
+
"type": "boolean",
|
|
27
|
+
"default": false
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"required": [
|
|
31
|
+
"component"
|
|
32
|
+
],
|
|
33
|
+
"unevaluatedProperties": false,
|
|
34
|
+
"x-adiaui": {
|
|
35
|
+
"anti_patterns": [],
|
|
36
|
+
"category": "shells",
|
|
37
|
+
"events": {},
|
|
38
|
+
"examples": [],
|
|
39
|
+
"keywords": [
|
|
40
|
+
"simple-shell",
|
|
41
|
+
"landing",
|
|
42
|
+
"marketing",
|
|
43
|
+
"error-page",
|
|
44
|
+
"splash",
|
|
45
|
+
"confirmation",
|
|
46
|
+
"minimal-shell"
|
|
47
|
+
],
|
|
48
|
+
"name": "SimpleShell",
|
|
49
|
+
"related": [
|
|
50
|
+
"SimpleHero",
|
|
51
|
+
"SimpleContent",
|
|
52
|
+
"AdminShell"
|
|
53
|
+
],
|
|
54
|
+
"slots": {
|
|
55
|
+
"default": {
|
|
56
|
+
"description": "Bespoke children (<simple-hero>, <simple-content>) compose here. The author owns layout order."
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
"states": [
|
|
60
|
+
{
|
|
61
|
+
"description": "Default layout — top-aligned, max-width container.",
|
|
62
|
+
"name": "idle"
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"description": "When [centered] is set — vertically centers the content stack.",
|
|
66
|
+
"name": "centered"
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"description": "When [full-bleed] is set — drops max-width so content fills the viewport.",
|
|
70
|
+
"name": "full-bleed"
|
|
71
|
+
}
|
|
72
|
+
],
|
|
73
|
+
"synonyms": {
|
|
74
|
+
"simple-shell": [
|
|
75
|
+
"marketing-shell",
|
|
76
|
+
"landing-shell",
|
|
77
|
+
"minimal-shell",
|
|
78
|
+
"splash-shell",
|
|
79
|
+
"error-shell"
|
|
80
|
+
]
|
|
81
|
+
},
|
|
82
|
+
"tag": "simple-shell",
|
|
83
|
+
"tokens": {},
|
|
84
|
+
"traits": [],
|
|
85
|
+
"version": 1
|
|
86
|
+
}
|
|
87
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/* ═══════════════════════════════════════════════════════════════
|
|
2
|
+
simple-shell — Module CSS (minimal shell for marketing / landing / error pages)
|
|
3
|
+
|
|
4
|
+
Single-file CSS — simple-shell is deliberately minimal so all rules
|
|
5
|
+
live here rather than fanning out into layered files. If complexity
|
|
6
|
+
grows, split into css/simple-shell.{tokens,layout,bespoke}.css per
|
|
7
|
+
admin/chat/editor convention.
|
|
8
|
+
═══════════════════════════════════════════════════════════════ */
|
|
9
|
+
|
|
10
|
+
@scope (simple-shell) {
|
|
11
|
+
:scope {
|
|
12
|
+
display: flex;
|
|
13
|
+
flex-direction: column;
|
|
14
|
+
align-items: center;
|
|
15
|
+
box-sizing: border-box;
|
|
16
|
+
min-height: 100dvh;
|
|
17
|
+
width: 100%;
|
|
18
|
+
padding-inline: var(--a-density-4, 1.5rem);
|
|
19
|
+
padding-block: var(--a-density-6, 3rem);
|
|
20
|
+
gap: var(--a-density-4, 1.5rem);
|
|
21
|
+
background: var(--a-canvas-1);
|
|
22
|
+
color: var(--a-text);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/* Vertically center when [centered] */
|
|
26
|
+
:scope[centered] {
|
|
27
|
+
justify-content: center;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/* Children width: bounded by content max-width by default */
|
|
31
|
+
:scope > * {
|
|
32
|
+
width: 100%;
|
|
33
|
+
max-width: var(--a-content-max-width, 56rem);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/* Full-bleed drops the max-width on children */
|
|
37
|
+
:scope[full-bleed] > * {
|
|
38
|
+
max-width: none;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
<h1>simple-shell — minimal shell for marketing / landing / error pages</h1>
|
|
2
|
+
|
|
3
|
+
<p>The 4th cluster in the bespoke shell family per ADR-0023. Designed deliberately small (1 host + 2 CSS-only children) to demonstrate the pattern works for thin clusters without ceremony.</p>
|
|
4
|
+
|
|
5
|
+
<h2>Default — top-aligned with hero + content</h2>
|
|
6
|
+
|
|
7
|
+
<simple-shell style="border: 1px solid var(--a-border); border-radius: var(--a-radius-3); min-height: 60dvh; padding-block: var(--a-density-4);">
|
|
8
|
+
<simple-hero>
|
|
9
|
+
<h1 slot="heading">Welcome to AdiaUI</h1>
|
|
10
|
+
<p slot="lede">A zero-dependency vanilla JS web component library for modern interfaces.</p>
|
|
11
|
+
<div slot="actions">
|
|
12
|
+
<button-ui variant="solid" color="accent">Get started</button-ui>
|
|
13
|
+
<button-ui variant="ghost">View on GitHub</button-ui>
|
|
14
|
+
</div>
|
|
15
|
+
</simple-hero>
|
|
16
|
+
<simple-content>
|
|
17
|
+
<h2>Quick example</h2>
|
|
18
|
+
<p>Drop primitives into any HTML page — no build tools needed.</p>
|
|
19
|
+
<p>Components are framework-agnostic. Use them in vanilla HTML, React, Vue, Svelte, or anywhere else.</p>
|
|
20
|
+
</simple-content>
|
|
21
|
+
</simple-shell>
|
|
22
|
+
|
|
23
|
+
<h2>[centered] — vertically centered content</h2>
|
|
24
|
+
|
|
25
|
+
<simple-shell centered style="border: 1px solid var(--a-border); border-radius: var(--a-radius-3); min-height: 60dvh;">
|
|
26
|
+
<simple-hero>
|
|
27
|
+
<h1 slot="heading">404 — Page Not Found</h1>
|
|
28
|
+
<p slot="lede">The page you're looking for doesn't exist or has been moved.</p>
|
|
29
|
+
<div slot="actions">
|
|
30
|
+
<button-ui variant="solid" color="accent">Back to home</button-ui>
|
|
31
|
+
</div>
|
|
32
|
+
</simple-hero>
|
|
33
|
+
</simple-shell>
|
|
34
|
+
|
|
35
|
+
<h2>[full-bleed] — drops the max-width constraint</h2>
|
|
36
|
+
|
|
37
|
+
<simple-shell full-bleed style="border: 1px solid var(--a-border); border-radius: var(--a-radius-3); min-height: 40dvh; background: var(--a-canvas-0);">
|
|
38
|
+
<simple-content>
|
|
39
|
+
<h2>Full-bleed content</h2>
|
|
40
|
+
<p>When [full-bleed] is set, children stretch to the viewport width instead of being bounded by the default max-width (~56rem). Use for hero sections that want edge-to-edge background, or marketing pages with full-width imagery.</p>
|
|
41
|
+
</simple-content>
|
|
42
|
+
</simple-shell>
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en" data-theme="auto">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
|
+
<title>Simple Shell — AdiaUI</title>
|
|
7
|
+
|
|
8
|
+
<link rel="stylesheet" href="../../../web-components/styles/resets.css">
|
|
9
|
+
<link rel="stylesheet" href="../../../web-components/styles/tokens.css">
|
|
10
|
+
<link rel="stylesheet" href="../simple-shell/simple-shell.css">
|
|
11
|
+
<link rel="stylesheet" href="../simple-content/simple-content.css">
|
|
12
|
+
<link rel="stylesheet" href="../simple-hero/simple-hero.css">
|
|
13
|
+
<link rel="stylesheet" href="../../../web-components/components/button/button.css">
|
|
14
|
+
|
|
15
|
+
<script type="module" src="../simple-shell/simple-shell.js"></script>
|
|
16
|
+
<script type="module" src="../../../web-components/components/button/button.js"></script>
|
|
17
|
+
|
|
18
|
+
<style>
|
|
19
|
+
:where(html, body) { margin: 0; min-height: 100vh; background: var(--a-bg); color: var(--a-fg); font-family: var(--a-font); }
|
|
20
|
+
main { max-width: 960px; margin-inline: auto; padding: var(--a-space-6) var(--a-space-5); }
|
|
21
|
+
</style>
|
|
22
|
+
</head>
|
|
23
|
+
<body>
|
|
24
|
+
|
|
25
|
+
<main id="demo-root">
|
|
26
|
+
<p>Loading examples…</p>
|
|
27
|
+
</main>
|
|
28
|
+
|
|
29
|
+
<script type="module">
|
|
30
|
+
const root = document.getElementById('demo-root');
|
|
31
|
+
try {
|
|
32
|
+
const res = await fetch('./simple-shell.examples.html');
|
|
33
|
+
if (!res.ok) throw new Error(`fetch failed (${res.status})`);
|
|
34
|
+
root.innerHTML = await res.text();
|
|
35
|
+
} catch (err) {
|
|
36
|
+
root.innerHTML = `<p style="color:var(--a-danger-strong);">Failed to load simple-shell.examples.html — ${err.message}</p>`;
|
|
37
|
+
console.error('[simple-shell.html]', err);
|
|
38
|
+
}
|
|
39
|
+
</script>
|
|
40
|
+
|
|
41
|
+
</body>
|
|
42
|
+
</html>
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { UIElement } from '../../../web-components/core/element.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* <simple-shell> — Minimal shell for marketing / landing / error pages.
|
|
5
|
+
*
|
|
6
|
+
* Behavior-only orchestrator. Reflects `[centered]` (vertical center)
|
|
7
|
+
* and `[full-bleed]` (drops max-width). No sidebars, no chrome bars,
|
|
8
|
+
* no command palette — deliberately minimal.
|
|
9
|
+
*
|
|
10
|
+
* Structure (bespoke shape, canonical since v0.4.1):
|
|
11
|
+
*
|
|
12
|
+
* <simple-shell centered>
|
|
13
|
+
* <simple-hero>
|
|
14
|
+
* <h1 slot="heading">Welcome</h1>
|
|
15
|
+
* <p slot="lede">Get started in seconds.</p>
|
|
16
|
+
* <div slot="actions"><button-ui>Sign up</button-ui></div>
|
|
17
|
+
* </simple-hero>
|
|
18
|
+
* <simple-content>
|
|
19
|
+
* <p>Body content goes here.</p>
|
|
20
|
+
* </simple-content>
|
|
21
|
+
* </simple-shell>
|
|
22
|
+
*
|
|
23
|
+
* Use cases:
|
|
24
|
+
* - Marketing splash pages
|
|
25
|
+
* - Error pages (404, 500, maintenance)
|
|
26
|
+
* - "Thank you" / confirmation pages
|
|
27
|
+
* - Single-card flows (sign-in, password reset)
|
|
28
|
+
*
|
|
29
|
+
* Per ADR-0023 + ADR-0024, simple-shell is the 4th cluster in the
|
|
30
|
+
* bespoke-shell-children family (after admin/chat/editor). Designed
|
|
31
|
+
* deliberately small to prove the pattern works for thin clusters
|
|
32
|
+
* without ceremony.
|
|
33
|
+
*/
|
|
34
|
+
class SimpleShell extends UIElement {
|
|
35
|
+
static properties = {
|
|
36
|
+
centered: { type: Boolean, default: false, reflect: true },
|
|
37
|
+
'full-bleed': { type: Boolean, default: false, reflect: true },
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
static template = () => null;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
if (!customElements.get('simple-shell')) {
|
|
44
|
+
customElements.define('simple-shell', SimpleShell);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export { SimpleShell };
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach } from 'vitest';
|
|
2
|
+
import '../../../web-components/core/element.js';
|
|
3
|
+
import './simple-shell.js';
|
|
4
|
+
|
|
5
|
+
const tick = () => new Promise((r) => queueMicrotask(r));
|
|
6
|
+
|
|
7
|
+
function mount(html) {
|
|
8
|
+
const wrap = document.createElement('div');
|
|
9
|
+
wrap.innerHTML = html;
|
|
10
|
+
document.body.appendChild(wrap);
|
|
11
|
+
return wrap.firstElementChild;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
beforeEach(() => {
|
|
15
|
+
document.body.innerHTML = '';
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
describe('simple-shell', () => {
|
|
19
|
+
it('registers simple-shell as a custom element', () => {
|
|
20
|
+
expect(customElements.get('simple-shell')).toBeDefined();
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it('defaults to centered=false and full-bleed=false', () => {
|
|
24
|
+
const el = mount('<simple-shell></simple-shell>');
|
|
25
|
+
expect(el.hasAttribute('centered')).toBe(false);
|
|
26
|
+
expect(el.hasAttribute('full-bleed')).toBe(false);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it('honors initial [centered] attribute on connect', () => {
|
|
30
|
+
const el = mount('<simple-shell centered></simple-shell>');
|
|
31
|
+
expect(el.centered).toBe(true);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it('honors initial [full-bleed] attribute on connect', () => {
|
|
35
|
+
const el = mount('<simple-shell full-bleed></simple-shell>');
|
|
36
|
+
expect(el['full-bleed']).toBe(true);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it('reflects [centered] via property assignment', async () => {
|
|
40
|
+
const el = mount('<simple-shell></simple-shell>');
|
|
41
|
+
el.centered = true;
|
|
42
|
+
await tick();
|
|
43
|
+
expect(el.hasAttribute('centered')).toBe(true);
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
it('reflects [full-bleed] via property assignment', async () => {
|
|
47
|
+
const el = mount('<simple-shell></simple-shell>');
|
|
48
|
+
el['full-bleed'] = true;
|
|
49
|
+
await tick();
|
|
50
|
+
expect(el.hasAttribute('full-bleed')).toBe(true);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
it('removes [centered] when set to false', async () => {
|
|
54
|
+
const el = mount('<simple-shell centered></simple-shell>');
|
|
55
|
+
el.centered = false;
|
|
56
|
+
await tick();
|
|
57
|
+
expect(el.hasAttribute('centered')).toBe(false);
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
it('stamps no HTML (behavior-only orchestrator)', () => {
|
|
61
|
+
const el = mount('<simple-shell></simple-shell>');
|
|
62
|
+
// Empty content + nothing stamped by the host
|
|
63
|
+
expect(el.children.length).toBe(0);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
it('preserves authored slotted children', () => {
|
|
67
|
+
const el = mount(`
|
|
68
|
+
<simple-shell>
|
|
69
|
+
<simple-hero><h1 slot="heading">Hello</h1></simple-hero>
|
|
70
|
+
<simple-content><p>Body</p></simple-content>
|
|
71
|
+
</simple-shell>
|
|
72
|
+
`);
|
|
73
|
+
expect(el.querySelector('simple-hero')).toBeTruthy();
|
|
74
|
+
expect(el.querySelector('simple-content')).toBeTruthy();
|
|
75
|
+
expect(el.querySelector('[slot="heading"]')).toBeTruthy();
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
it('supports both [centered] and [full-bleed] simultaneously', () => {
|
|
79
|
+
const el = mount('<simple-shell centered full-bleed></simple-shell>');
|
|
80
|
+
expect(el.centered).toBe(true);
|
|
81
|
+
expect(el['full-bleed']).toBe(true);
|
|
82
|
+
});
|
|
83
|
+
});
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# Edit this file; run `npm run build:components` to regenerate a2ui.json.
|
|
2
|
+
$schema: ../../../../scripts/schemas/component.yaml.schema.json
|
|
3
|
+
name: SimpleShell
|
|
4
|
+
tag: simple-shell
|
|
5
|
+
component: SimpleShell
|
|
6
|
+
category: shells
|
|
7
|
+
version: 1
|
|
8
|
+
description: |
|
|
9
|
+
Module-tier minimal shell for marketing / landing / error pages.
|
|
10
|
+
Behavior-only orchestrator with two reflected attributes — [centered]
|
|
11
|
+
for vertical centering, [full-bleed] for dropping the max-width
|
|
12
|
+
constraint.
|
|
13
|
+
|
|
14
|
+
The 4th cluster in the bespoke shell family per ADR-0023, designed
|
|
15
|
+
deliberately small (1 host + 2 CSS-only children) to demonstrate
|
|
16
|
+
the pattern works without ceremony for thin clusters.
|
|
17
|
+
|
|
18
|
+
Use cases: marketing splashes, error pages (404 / 500 / maintenance),
|
|
19
|
+
thank-you pages, single-card flows (sign-in, password reset).
|
|
20
|
+
|
|
21
|
+
props:
|
|
22
|
+
centered:
|
|
23
|
+
description: Reflected — vertically centers content in viewport.
|
|
24
|
+
type: boolean
|
|
25
|
+
default: false
|
|
26
|
+
reflect: true
|
|
27
|
+
full-bleed:
|
|
28
|
+
description: Reflected — drops the default max-width so content fills full viewport.
|
|
29
|
+
type: boolean
|
|
30
|
+
default: false
|
|
31
|
+
reflect: true
|
|
32
|
+
|
|
33
|
+
events: {}
|
|
34
|
+
|
|
35
|
+
slots:
|
|
36
|
+
default:
|
|
37
|
+
description: >-
|
|
38
|
+
Bespoke children (<simple-hero>, <simple-content>) compose here.
|
|
39
|
+
The author owns layout order.
|
|
40
|
+
|
|
41
|
+
states:
|
|
42
|
+
- name: idle
|
|
43
|
+
description: Default layout — top-aligned, max-width container.
|
|
44
|
+
- name: centered
|
|
45
|
+
description: When [centered] is set — vertically centers the content stack.
|
|
46
|
+
- name: full-bleed
|
|
47
|
+
description: When [full-bleed] is set — drops max-width so content fills the viewport.
|
|
48
|
+
|
|
49
|
+
traits: []
|
|
50
|
+
|
|
51
|
+
a2ui:
|
|
52
|
+
rules:
|
|
53
|
+
- >-
|
|
54
|
+
simple-shell is the bespoke shell for thin / minimal page surfaces.
|
|
55
|
+
Use when the page has no nav rail, no chrome bars, no command
|
|
56
|
+
palette. For full app surfaces use admin-shell; for chat surfaces
|
|
57
|
+
use chat-shell; for design tools use editor-shell.
|
|
58
|
+
- >-
|
|
59
|
+
Compose with <simple-hero> (optional top hero strip) and
|
|
60
|
+
<simple-content> (main article body). Both are CSS-only structural
|
|
61
|
+
children — no JS, no state.
|
|
62
|
+
|
|
63
|
+
keywords:
|
|
64
|
+
- simple-shell
|
|
65
|
+
- landing
|
|
66
|
+
- marketing
|
|
67
|
+
- error-page
|
|
68
|
+
- splash
|
|
69
|
+
- confirmation
|
|
70
|
+
- minimal-shell
|
|
71
|
+
|
|
72
|
+
synonyms:
|
|
73
|
+
simple-shell: [marketing-shell, landing-shell, minimal-shell, splash-shell, error-shell]
|
|
74
|
+
|
|
75
|
+
related:
|
|
76
|
+
- SimpleHero
|
|
77
|
+
- SimpleContent
|
|
78
|
+
- AdminShell
|