anentrypoint-design 0.0.455 → 0.0.457
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/dist/247420.css +28 -3
- package/dist/247420.js +110 -27
- package/dist/index.html +86 -3
- package/package.json +1 -1
- package/src/css/app-shell/hero-content.css +22 -2
- package/src/css/app-shell/topbar.css +6 -1
- package/src/page-html/client-script.js +62 -1
- package/src/page-html/page-styles.js +23 -1
package/dist/index.html
CHANGED
|
@@ -76,7 +76,13 @@
|
|
|
76
76
|
a.row:hover .ds-row-arrow { opacity: 1 }
|
|
77
77
|
/* hero stat strip — all badges as a wrapping inline rhythm, not one empty panel */
|
|
78
78
|
.ds-hero-stats { display: flex; flex-wrap: wrap; gap: var(--space-3, 16px) var(--space-5, 32px); margin-top: var(--space-2, 8px) }
|
|
79
|
-
.ds-hero-stat
|
|
79
|
+
/* hero-content.css's .ds-hero-stat is styled for a vertical stacked list
|
|
80
|
+
(border-bottom row divider, meant to read top-to-bottom); this page renders
|
|
81
|
+
badges in a horizontal row instead (.ds-hero-stats above), where that same
|
|
82
|
+
border reads as an underlined tab strip -- an affordance for a set of
|
|
83
|
+
plain, non-interactive metadata chips. Reset both inherited properties so a
|
|
84
|
+
row of badges never borrows tab-bar chrome it did not opt into. */
|
|
85
|
+
.ds-hero-stat { display: flex; align-items: baseline; gap: var(--space-2, 8px); border-bottom: none !important; padding-bottom: 0 !important }
|
|
80
86
|
.ds-hero-stat-n { font-family: var(--ff-body); font-weight: 700; font-size: var(--fs-lg, 18px); color: var(--fg) }
|
|
81
87
|
.ds-hero-stat-l { font-size: var(--fs-sm, 15px); color: var(--fg-3) }
|
|
82
88
|
/* accent sits on its own line, muted, so it reads as a distinct aside instead
|
|
@@ -93,8 +99,24 @@ a.row:hover .ds-row-arrow { opacity: 1 }
|
|
|
93
99
|
.ds-feature-title { font-weight: 600; font-size: var(--fs-lg, 18px); color: var(--fg) }
|
|
94
100
|
.ds-feature-desc { font-size: var(--fs-sm, 15px); color: var(--fg-2); line-height: 1.5; overflow-wrap: anywhere }
|
|
95
101
|
.ds-feature-benefit { font-style: italic; font-size: var(--fs-sm, 15px); color: var(--fg-3); margin-top: var(--space-1, 4px) }
|
|
102
|
+
/* Real closing content instead of the page simply stopping after its last
|
|
103
|
+
panel — a tonal divider line, a copyright string, and the same external
|
|
104
|
+
links the topbar already carries (footer.js reuses data.navItems, so this
|
|
105
|
+
is never invented content). Sits inside .app-stage's own grid gap like
|
|
106
|
+
every other block, no extra margin needed. */
|
|
107
|
+
.ds-page-footer {
|
|
108
|
+
display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between;
|
|
109
|
+
gap: var(--space-3, 16px);
|
|
110
|
+
padding-top: var(--space-5, 32px);
|
|
111
|
+
margin-top: var(--space-3, 16px);
|
|
112
|
+
border-top: 1px solid var(--rule, var(--bg-3));
|
|
113
|
+
color: var(--fg-3); font-size: var(--fs-sm, 15px);
|
|
114
|
+
}
|
|
115
|
+
.ds-page-footer-links { display: flex; gap: var(--space-4, 24px) }
|
|
116
|
+
.ds-page-footer-links a { color: var(--fg-3) }
|
|
117
|
+
.ds-page-footer-links a:hover { color: var(--fg) }
|
|
96
118
|
</style>
|
|
97
|
-
<script id="__site__" type="application/json">{"title":"design","slug":"index","siteName":"design","navItems":[["247420","https://247420.xyz"],["GitHub","https://github.com/AnEntrypoint"]],"theme":"auto","hero":{"heading":"design","subheading":"the 247420 design system","body":"shadcn-neutral. oversized display type, a grayscale accent, print texture inert. every 247420 surface runs on it.","badges":[{"label":"design-system"},{"label":"tokens"},{"label":"web"}],"ctas":[{"label":"GitHub","href":"https://github.com/AnEntrypoint/design","primary":true},{"label":"247420","href":"https://247420.xyz"}]},"sections":[],"examples":[{"label":"index shell","desc":"full navigation shell with tabs, filters, and row interactions.","href":"./index.html"},{"label":"homepage kit","desc":"hero + works layout and updated readable type scale.","href":"./ui_kits/homepage/"},{"label":"project page kit","desc":"overview, install, receipt, and changelog template.","href":"./ui_kits/project_page/"},{"label":"docs kit","desc":"technical documentation layout with sidebar and prose.","href":"./ui_kits/docs/"},{"label":"blog kit","desc":"long-form writing layout tuned for readability.","href":"./ui_kits/blog/"},{"label":"chat kit","desc":"message thread + composer with pill bubbles and room sidebar.","href":"./ui_kits/chat/"},{"label":"aicat kit","desc":"ai assistant with cat persona — ascii portrait + mood face.","href":"./ui_kits/aicat/"},{"label":"slide deck","desc":"16:9 deck stage with improved presenter controls text.","href":"./slides/"},{"label":"dashboard kit","desc":"kpis, tables, receipts, changelog — operations surface.","href":"./ui_kits/dashboard/"},{"label":"terminal kit","desc":"cli prompt, command lines, log viewer.","href":"./ui_kits/terminal/"},{"label":"settings kit","desc":"sectioned forms, toggles, segmented buttons, save bar.","href":"./ui_kits/settings/"},{"label":"signin kit","desc":"auth panel, providers, magic link.","href":"./ui_kits/signin/"},{"label":"search kit","desc":"query bar, faceted filters, ranked results.","href":"./ui_kits/search/"},{"label":"404 kit","desc":"empty-state hero with suggested routes.","href":"./ui_kits/error_404/"},{"label":"gallery kit","desc":"visual grid + lightbox over tonal cards.","href":"./ui_kits/gallery/"},{"label":"preview samples","desc":"design previews and component samples.","href":"./preview/buttons.html"}],"bodyHtml":"","sidebar":{"sections":[{"group":"open","items":[{"glyph":"+","label":"open","href":"./ui_kits/homepage/"}]},{"group":"bins","items":[{"label":"everything","href":"#all","count":23,"active":true},{"label":"pinned","href":"#kits","count":5},{"label":"shipped","href":"#previews","count":12},{"label":"drafts","href":"#decks","count":6}]},{"group":"labels","items":[{"label":"ui kits","href":"#kits","count":4},{"label":"decks","href":"#decks","count":1},{"label":"previews","href":"#previews","count":20},{"label":"docs","href":"#docs","count":3}]},{"group":"more","items":[{"label":"readme","href":"https://github.com/AnEntrypoint/design/blob/main/README.md"},{"label":"skill","href":"https://github.com/AnEntrypoint/design/blob/main/SKILL.md"},{"label":"tokens","href":"https://github.com/AnEntrypoint/design/blob/main/colors_and_type.css"},{"label":"source","href":"https://github.com/AnEntrypoint/design"}]}]},"marquee":{"items":["open source","design tokens","buildless components","zero raw color literals"],"sep":"/"},"panels":[{"id":"kits","title":"ui kits","count":"14 surfaces","items":[{"code":"","title":"homepage","sub":"marquee + works grid","meta":"open ->","href":"./ui_kits/homepage/"},{"code":"","title":"project page","sub":"hero receipt install changelog","meta":"open ->","href":"./ui_kits/project_page/"},{"code":"","title":"docs","sub":"long-form prose chrome","meta":"open ->","href":"./ui_kits/docs/"},{"code":"","title":"blog","sub":"dated index + reading view","meta":"open ->","href":"./ui_kits/blog/"},{"code":"","title":"chat","sub":"message thread + composer","meta":"open ->","href":"./ui_kits/chat/"},{"code":"","title":"aicat","sub":"ai assistant with cat persona","meta":"open ->","href":"./ui_kits/aicat/"},{"code":"","title":"file browser","sub":"rails by file type drop preview","meta":"open ->","href":"./ui_kits/file_browser/"},{"code":"","title":"dashboard","sub":"kpis tables receipts changelog","meta":"open ->","href":"./ui_kits/dashboard/"},{"code":"","title":"terminal","sub":"cli prompt command lines log view","meta":"open ->","href":"./ui_kits/terminal/"},{"code":"","title":"settings","sub":"sectioned forms toggles save bar","meta":"open ->","href":"./ui_kits/settings/"},{"code":"","title":"signin","sub":"auth providers magic link","meta":"open ->","href":"./ui_kits/signin/"},{"code":"","title":"search","sub":"topbar query faceted filters rows","meta":"open ->","href":"./ui_kits/search/"},{"code":"","title":"404","sub":"empty-state hero suggested routes","meta":"open ->","href":"./ui_kits/error_404/"},{"code":"","title":"gallery","sub":"visual grid tonal cards lightbox","meta":"open ->","href":"./ui_kits/gallery/"}]},{"id":"file_browser","title":"file browser","count":"primitives","items":[{"code":"fb","title":"file_browser kit","sub":"drop, list, preview, dialogs","meta":"open kit","href":"./ui_kits/file_browser/"},{"code":"fb","title":"FileRow","sub":"rail icon name meta","meta":"preview","href":"./preview/file-row.html"},{"code":"fb","title":"FileGrid","sub":"stack of rows in a panel","meta":"preview","href":"./preview/file-grid.html"},{"code":"fb","title":"DropZone","sub":"tonal upload target","meta":"preview","href":"./preview/dropzone.html"},{"code":"fb","title":"FileViewer","sub":"modal preview keyed head","meta":"preview","href":"./preview/file-viewer.html"},{"code":"fb","title":"FileToolbar","sub":"actions breadcrumb upload","meta":"preview","href":"./preview/file-toolbar.html"},{"code":"fb","title":"fsbrowse","sub":"Express + busboy backend","meta":"source","href":"https://github.com/AnEntrypoint/fsbrowse"}]},{"id":"desktop_os","title":"desktop os shell","count":"in-page wm","items":[{"code":"os","title":"createDesktopShell","sub":"menubar apps launcher taskbar window manager","meta":"shell.js","href":"https://github.com/AnEntrypoint/design/blob/main/src/desktop/shell.js"},{"code":"os","title":"icons set","sub":"svg glyphs for menubar + taskbar","meta":"icons.js","href":"https://github.com/AnEntrypoint/design/blob/main/src/desktop/icons.js"},{"code":"os","title":"theme.css","sub":"os chrome tokens menubar launcher wm","meta":"theme.css","href":"https://github.com/AnEntrypoint/design/blob/main/src/desktop/theme.css"},{"code":"os","title":"import path","sub":"anentrypoint-design/desktop","meta":"exports","href":"https://github.com/AnEntrypoint/design/blob/main/package.json"}]},{"id":"web_components","title":"web components","count":"1 element","items":[{"code":"wc","title":"\u003cds-chat>","sub":"auto-registers when the sdk loads in a browser","meta":"ds-chat.js","href":"https://github.com/AnEntrypoint/design/blob/main/src/web-components/ds-chat.js"},{"code":"wc","title":"registerChatElement","sub":"manual register helper","meta":"source","href":"https://github.com/AnEntrypoint/design/blob/main/src/index.js"}]},{"id":"api_exports","title":"public api","count":"sdk surface","items":[{"code":"api","title":"h / applyDiff","sub":"webjsx createElement + diff","meta":"index.js","href":"https://github.com/AnEntrypoint/design/blob/main/src/index.js"},{"code":"api","title":"installStyles / scope","sub":"ds-247420 css scope + bootstrap","meta":"styles.js","href":"https://github.com/AnEntrypoint/design/blob/main/src/styles.js"},{"code":"api","title":"loadCss","sub":"fetch the bundled css string","meta":"styles.js","href":"https://github.com/AnEntrypoint/design/blob/main/src/styles.js"},{"code":"api","title":"mount / mountKit","sub":"ds shell + ui_kit bootstrap","meta":"bootstrap.js","href":"https://github.com/AnEntrypoint/design/blob/main/src/bootstrap.js"},{"code":"api","title":"registerDeckStage / getDeckStage","sub":"16:9 deck stage api","meta":"deck-stage.js","href":"https://github.com/AnEntrypoint/design/blob/main/src/deck-stage.js"},{"code":"api","title":"renderMarkdown","sub":"marked v15 + dompurify lazy stack","meta":"markdown.js","href":"https://github.com/AnEntrypoint/design/blob/main/src/markdown.js"},{"code":"api","title":"ensurePrism / highlightAllUnder","sub":"prism core + per-language","meta":"highlight.js","href":"https://github.com/AnEntrypoint/design/blob/main/src/highlight.js"},{"code":"api","title":"renderPageHtml","sub":"static page html template","meta":"page-html.js","href":"https://github.com/AnEntrypoint/design/blob/main/src/page-html.js"},{"code":"api","title":"components / motion / debug","sub":"namespaces from the default export","meta":"components.js","href":"https://github.com/AnEntrypoint/design/blob/main/src/components.js"}]},{"id":"decks","title":"decks","count":1,"items":[{"code":"","title":"deck template","sub":"16:9 stage with auto-fit","meta":"open ->","href":"./slides/"}]},{"id":"docs","title":"docs","count":3,"items":[{"code":"md","title":"readme","sub":"overview, manifesto, conventions","meta":"open ->","href":"https://github.com/AnEntrypoint/design/blob/main/README.md"},{"code":"md","title":"skill","sub":"authoring rules for the agent","meta":"open ->","href":"https://github.com/AnEntrypoint/design/blob/main/SKILL.md"},{"code":"css","title":"tokens","sub":"colors, type, panel surface tokens","meta":"open ->","href":"https://github.com/AnEntrypoint/design/blob/main/colors_and_type.css"}]},{"id":"features","title":"why design","count":4,"items":[{"code":"","title":"layered surfaces","sub":"panel-on-panel rhythm; loud content sits inside quiet chrome.","meta":"panel-row.css","href":"https://github.com/AnEntrypoint/design/blob/main/src/css/app-shell/panel-row.css"},{"code":"","title":"monospace labels","sub":"mono only for codes/labels/CLI; sans for everything legible.","meta":"colors_and_type.css","href":"https://github.com/AnEntrypoint/design/blob/main/colors_and_type.css"},{"code":"","title":"indicator rails","sub":"color-coded inset rails for category separation, never borders.","meta":"panel-row.css","href":"https://github.com/AnEntrypoint/design/blob/main/src/css/app-shell/panel-row.css#L126"},{"code":"","title":"tokens-only","sub":"every surface, type ramp, accent driven by --panel-* / --fs-* tokens.","meta":"colors_and_type.css","href":"https://github.com/AnEntrypoint/design/blob/main/colors_and_type.css"}]},{"id":"previews","title":"previews","count":25,"items":[{"code":"","title":"buttons","sub":"preview · buttons.html","meta":"open ->","href":"./preview/buttons.html"},{"code":"","title":"colors core","sub":"preview · colors-core.html","meta":"open ->","href":"./preview/colors-core.html"},{"code":"","title":"colors lore","sub":"preview · colors-lore.html","meta":"open ->","href":"./preview/colors-lore.html"},{"code":"","title":"colors semantic","sub":"preview · colors-semantic.html","meta":"open ->","href":"./preview/colors-semantic.html"},{"code":"","title":"dateline","sub":"preview · dateline.html","meta":"open ->","href":"./preview/dateline.html"},{"code":"","title":"dropzone","sub":"preview · dropzone.html","meta":"open ->","href":"./preview/dropzone.html"},{"code":"","title":"file grid","sub":"preview · file-grid.html","meta":"open ->","href":"./preview/file-grid.html"},{"code":"","title":"file row","sub":"preview · file-row.html","meta":"open ->","href":"./preview/file-row.html"},{"code":"","title":"file toolbar","sub":"preview · file-toolbar.html","meta":"open ->","href":"./preview/file-toolbar.html"},{"code":"","title":"file viewer","sub":"preview · file-viewer.html","meta":"open ->","href":"./preview/file-viewer.html"},{"code":"","title":"header","sub":"preview · header.html","meta":"open ->","href":"./preview/header.html"},{"code":"","title":"icons unicode","sub":"preview · icons-unicode.html","meta":"open ->","href":"./preview/icons-unicode.html"},{"code":"","title":"index row","sub":"preview · index-row.html","meta":"open ->","href":"./preview/index-row.html"},{"code":"","title":"inputs","sub":"preview · inputs.html","meta":"open ->","href":"./preview/inputs.html"},{"code":"","title":"manifesto","sub":"preview · manifesto.html","meta":"open ->","href":"./preview/manifesto.html"},{"code":"","title":"rules","sub":"preview · rules.html","meta":"open ->","href":"./preview/rules.html"},{"code":"","title":"spacing","sub":"preview · spacing.html","meta":"open ->","href":"./preview/spacing.html"},{"code":"","title":"stamps","sub":"preview · stamps.html","meta":"open ->","href":"./preview/stamps.html"},{"code":"","title":"stamps lore","sub":"preview · stamps-lore.html","meta":"open ->","href":"./preview/stamps-lore.html"},{"code":"","title":"theme ink","sub":"preview · theme-ink.html","meta":"open ->","href":"./preview/theme-ink.html"},{"code":"","title":"type display","sub":"preview · type-display.html","meta":"open ->","href":"./preview/type-display.html"},{"code":"","title":"type mono","sub":"preview · type-mono.html","meta":"open ->","href":"./preview/type-mono.html"},{"code":"","title":"type prose","sub":"preview · type-prose.html","meta":"open ->","href":"./preview/type-prose.html"},{"code":"","title":"type scale","sub":"preview · type-scale.html","meta":"open ->","href":"./preview/type-scale.html"},{"code":"","title":"wordmarks","sub":"preview · wordmarks.html","meta":"open ->","href":"./preview/wordmarks.html"}]}],"quickstart":{"heading":"quick start","lines":[{"kind":"cmt","text":"# install via importmap (no bundler)"},{"kind":"cmd","text":"\u003cscript type='importmap'>{\"imports\":{\"anentrypoint-design\":\"https://unpkg.com/anentrypoint-design@latest/dist/247420.js\"}}\u003c/script>"},{"kind":"cmt","text":"# or clone the source"},{"kind":"cmd","text":"git clone https://github.com/AnEntrypoint/design.git"}]},"statusLeft":["main","utf-8","lf"],"statusRight":["247420 · mmxxvi","probably emerging"]}</script>
|
|
119
|
+
<script id="__site__" type="application/json">{"title":"design","slug":"index","siteName":"design","navItems":[["247420","https://247420.xyz"],["AnEntrypoint ->","https://github.com/AnEntrypoint"]],"theme":"auto","hero":{"heading":"design","subheading":"the 247420 design system","body":"14 kit surfaces, zero raw color literals, one importmap script tag to install. every panel, row, and form control in this system reads its color, radius, and spacing from a single token file — swap the tokens and every surface built on them changes with it.","badges":[{"label":"design-system"},{"label":"tokens"},{"label":"web"}],"ctas":[{"label":"GitHub","href":"https://github.com/AnEntrypoint/design","primary":true},{"label":"247420","href":"https://247420.xyz"}]},"sections":[],"examples":[{"label":"index shell","desc":"full navigation shell with tabs, filters, and row interactions.","href":"./index.html"},{"label":"homepage kit","desc":"hero + works layout and updated readable type scale.","href":"./ui_kits/homepage/"},{"label":"project page kit","desc":"overview, install, receipt, and changelog template.","href":"./ui_kits/project_page/"},{"label":"docs kit","desc":"technical documentation layout with sidebar and prose.","href":"./ui_kits/docs/"},{"label":"blog kit","desc":"long-form writing layout tuned for readability.","href":"./ui_kits/blog/"},{"label":"chat kit","desc":"message thread + composer with pill bubbles and room sidebar.","href":"./ui_kits/chat/"},{"label":"aicat kit","desc":"ai assistant with cat persona — ascii portrait + mood face.","href":"./ui_kits/aicat/"},{"label":"slide deck","desc":"16:9 deck stage with improved presenter controls text.","href":"./slides/"},{"label":"dashboard kit","desc":"kpis, tables, receipts, changelog — operations surface.","href":"./ui_kits/dashboard/"},{"label":"terminal kit","desc":"cli prompt, command lines, log viewer.","href":"./ui_kits/terminal/"},{"label":"settings kit","desc":"sectioned forms, toggles, segmented buttons, save bar.","href":"./ui_kits/settings/"},{"label":"signin kit","desc":"auth panel, providers, magic link.","href":"./ui_kits/signin/"},{"label":"search kit","desc":"query bar, faceted filters, ranked results.","href":"./ui_kits/search/"},{"label":"404 kit","desc":"empty-state hero with suggested routes.","href":"./ui_kits/error_404/"},{"label":"gallery kit","desc":"visual grid + lightbox over tonal cards.","href":"./ui_kits/gallery/"},{"label":"preview samples","desc":"design previews and component samples.","href":"./preview/buttons.html"}],"bodyHtml":"","sidebar":{"sections":[{"group":"open","items":[{"glyph":"+","label":"open","href":"./ui_kits/homepage/"}]},{"group":"bins","items":[{"label":"everything","href":"#all","active":true,"count":43},{"label":"pinned","href":"#kits","count":14},{"label":"shipped","href":"#previews","count":25},{"label":"drafts","href":"#decks","count":1}]},{"group":"labels","items":[{"label":"ui kits","href":"#kits","count":14},{"label":"decks","href":"#decks","count":1},{"label":"previews","href":"#previews","count":25},{"label":"docs","href":"#docs","count":3}]},{"group":"more","items":[{"label":"readme","href":"https://github.com/AnEntrypoint/design/blob/main/README.md"},{"label":"skill","href":"https://github.com/AnEntrypoint/design/blob/main/SKILL.md"},{"label":"tokens","href":"https://github.com/AnEntrypoint/design/blob/main/colors_and_type.css"},{"label":"source","href":"https://github.com/AnEntrypoint/design"}]}]},"marquee":{"items":["open source","design tokens","buildless components","zero raw color literals"],"sep":"/"},"panels":[{"id":"kits","title":"ui kits","count":"14 surfaces","items":[{"code":"","title":"homepage","sub":"marquee + works grid","meta":"open ->","href":"./ui_kits/homepage/"},{"code":"","title":"project page","sub":"hero receipt install changelog","meta":"open ->","href":"./ui_kits/project_page/"},{"code":"","title":"docs","sub":"long-form prose chrome","meta":"open ->","href":"./ui_kits/docs/"},{"code":"","title":"blog","sub":"dated index + reading view","meta":"open ->","href":"./ui_kits/blog/"},{"code":"","title":"chat","sub":"message thread + composer","meta":"open ->","href":"./ui_kits/chat/"},{"code":"","title":"aicat","sub":"ai assistant with cat persona","meta":"open ->","href":"./ui_kits/aicat/"},{"code":"","title":"file browser","sub":"rails by file type drop preview","meta":"open ->","href":"./ui_kits/file_browser/"},{"code":"","title":"dashboard","sub":"kpis tables receipts changelog","meta":"open ->","href":"./ui_kits/dashboard/"},{"code":"","title":"terminal","sub":"cli prompt command lines log view","meta":"open ->","href":"./ui_kits/terminal/"},{"code":"","title":"settings","sub":"sectioned forms toggles save bar","meta":"open ->","href":"./ui_kits/settings/"},{"code":"","title":"signin","sub":"auth providers magic link","meta":"open ->","href":"./ui_kits/signin/"},{"code":"","title":"search","sub":"topbar query faceted filters rows","meta":"open ->","href":"./ui_kits/search/"},{"code":"","title":"404","sub":"empty-state hero suggested routes","meta":"open ->","href":"./ui_kits/error_404/"},{"code":"","title":"gallery","sub":"visual grid tonal cards lightbox","meta":"open ->","href":"./ui_kits/gallery/"}]},{"id":"file_browser","title":"file browser","count":"primitives","items":[{"code":"fb","title":"file_browser kit","sub":"drop, list, preview, dialogs","meta":"open kit","href":"./ui_kits/file_browser/"},{"code":"fb","title":"FileRow","sub":"rail icon name meta","meta":"preview","href":"./preview/file-row.html"},{"code":"fb","title":"FileGrid","sub":"stack of rows in a panel","meta":"preview","href":"./preview/file-grid.html"},{"code":"fb","title":"DropZone","sub":"tonal upload target","meta":"preview","href":"./preview/dropzone.html"},{"code":"fb","title":"FileViewer","sub":"modal preview keyed head","meta":"preview","href":"./preview/file-viewer.html"},{"code":"fb","title":"FileToolbar","sub":"actions breadcrumb upload","meta":"preview","href":"./preview/file-toolbar.html"},{"code":"fb","title":"fsbrowse","sub":"Express + busboy backend","meta":"source","href":"https://github.com/AnEntrypoint/fsbrowse"}]},{"id":"desktop_os","title":"desktop os shell","count":"in-page wm","items":[{"code":"os","title":"createDesktopShell","sub":"menubar apps launcher taskbar window manager","meta":"shell.js","href":"https://github.com/AnEntrypoint/design/blob/main/src/desktop/shell.js"},{"code":"os","title":"icons set","sub":"svg glyphs for menubar + taskbar","meta":"icons.js","href":"https://github.com/AnEntrypoint/design/blob/main/src/desktop/icons.js"},{"code":"os","title":"theme.css","sub":"os chrome tokens menubar launcher wm","meta":"theme.css","href":"https://github.com/AnEntrypoint/design/blob/main/src/desktop/theme.css"},{"code":"os","title":"import path","sub":"anentrypoint-design/desktop","meta":"exports","href":"https://github.com/AnEntrypoint/design/blob/main/package.json"}]},{"id":"web_components","title":"web components","count":"1 element","items":[{"code":"wc","title":"\u003cds-chat>","sub":"auto-registers when the sdk loads in a browser","meta":"ds-chat.js","href":"https://github.com/AnEntrypoint/design/blob/main/src/web-components/ds-chat.js"},{"code":"wc","title":"registerChatElement","sub":"manual register helper","meta":"source","href":"https://github.com/AnEntrypoint/design/blob/main/src/index.js"}]},{"id":"api_exports","title":"public api","count":"sdk surface","items":[{"code":"api","title":"h / applyDiff","sub":"webjsx createElement + diff","meta":"index.js","href":"https://github.com/AnEntrypoint/design/blob/main/src/index.js"},{"code":"api","title":"installStyles / scope","sub":"ds-247420 css scope + bootstrap","meta":"styles.js","href":"https://github.com/AnEntrypoint/design/blob/main/src/styles.js"},{"code":"api","title":"loadCss","sub":"fetch the bundled css string","meta":"styles.js","href":"https://github.com/AnEntrypoint/design/blob/main/src/styles.js"},{"code":"api","title":"mount / mountKit","sub":"ds shell + ui_kit bootstrap","meta":"bootstrap.js","href":"https://github.com/AnEntrypoint/design/blob/main/src/bootstrap.js"},{"code":"api","title":"registerDeckStage / getDeckStage","sub":"16:9 deck stage api","meta":"deck-stage.js","href":"https://github.com/AnEntrypoint/design/blob/main/src/deck-stage.js"},{"code":"api","title":"renderMarkdown","sub":"marked v15 + dompurify lazy stack","meta":"markdown.js","href":"https://github.com/AnEntrypoint/design/blob/main/src/markdown.js"},{"code":"api","title":"ensurePrism / highlightAllUnder","sub":"prism core + per-language","meta":"highlight.js","href":"https://github.com/AnEntrypoint/design/blob/main/src/highlight.js"},{"code":"api","title":"renderPageHtml","sub":"static page html template","meta":"page-html.js","href":"https://github.com/AnEntrypoint/design/blob/main/src/page-html.js"},{"code":"api","title":"components / motion / debug","sub":"namespaces from the default export","meta":"components.js","href":"https://github.com/AnEntrypoint/design/blob/main/src/components.js"}]},{"id":"decks","title":"decks","count":1,"items":[{"code":"","title":"deck template","sub":"16:9 stage with auto-fit","meta":"open ->","href":"./slides/"}]},{"id":"docs","title":"docs","count":3,"items":[{"code":"md","title":"readme","sub":"overview, manifesto, conventions","meta":"open ->","href":"https://github.com/AnEntrypoint/design/blob/main/README.md"},{"code":"md","title":"skill","sub":"authoring rules for the agent","meta":"open ->","href":"https://github.com/AnEntrypoint/design/blob/main/SKILL.md"},{"code":"css","title":"tokens","sub":"colors, type, panel surface tokens","meta":"open ->","href":"https://github.com/AnEntrypoint/design/blob/main/colors_and_type.css"}]},{"id":"features","title":"why design","count":4,"items":[{"code":"","title":"layered surfaces","sub":"panel-on-panel rhythm; loud content sits inside quiet chrome.","meta":"panel-row.css","href":"https://github.com/AnEntrypoint/design/blob/main/src/css/app-shell/panel-row.css"},{"code":"","title":"monospace labels","sub":"mono only for codes/labels/CLI; sans for everything legible.","meta":"colors_and_type.css","href":"https://github.com/AnEntrypoint/design/blob/main/colors_and_type.css"},{"code":"","title":"indicator rails","sub":"color-coded inset rails for category separation, never borders.","meta":"panel-row.css","href":"https://github.com/AnEntrypoint/design/blob/main/src/css/app-shell/panel-row.css#L126"},{"code":"","title":"tokens-only","sub":"every surface, type ramp, accent driven by --panel-* / --fs-* tokens.","meta":"colors_and_type.css","href":"https://github.com/AnEntrypoint/design/blob/main/colors_and_type.css"}]},{"id":"previews","title":"previews","count":25,"items":[{"code":"","title":"buttons","sub":"preview · buttons.html","meta":"open ->","href":"./preview/buttons.html"},{"code":"","title":"colors core","sub":"preview · colors-core.html","meta":"open ->","href":"./preview/colors-core.html"},{"code":"","title":"colors lore","sub":"preview · colors-lore.html","meta":"open ->","href":"./preview/colors-lore.html"},{"code":"","title":"colors semantic","sub":"preview · colors-semantic.html","meta":"open ->","href":"./preview/colors-semantic.html"},{"code":"","title":"dateline","sub":"preview · dateline.html","meta":"open ->","href":"./preview/dateline.html"},{"code":"","title":"dropzone","sub":"preview · dropzone.html","meta":"open ->","href":"./preview/dropzone.html"},{"code":"","title":"file grid","sub":"preview · file-grid.html","meta":"open ->","href":"./preview/file-grid.html"},{"code":"","title":"file row","sub":"preview · file-row.html","meta":"open ->","href":"./preview/file-row.html"},{"code":"","title":"file toolbar","sub":"preview · file-toolbar.html","meta":"open ->","href":"./preview/file-toolbar.html"},{"code":"","title":"file viewer","sub":"preview · file-viewer.html","meta":"open ->","href":"./preview/file-viewer.html"},{"code":"","title":"header","sub":"preview · header.html","meta":"open ->","href":"./preview/header.html"},{"code":"","title":"icons unicode","sub":"preview · icons-unicode.html","meta":"open ->","href":"./preview/icons-unicode.html"},{"code":"","title":"index row","sub":"preview · index-row.html","meta":"open ->","href":"./preview/index-row.html"},{"code":"","title":"inputs","sub":"preview · inputs.html","meta":"open ->","href":"./preview/inputs.html"},{"code":"","title":"manifesto","sub":"preview · manifesto.html","meta":"open ->","href":"./preview/manifesto.html"},{"code":"","title":"rules","sub":"preview · rules.html","meta":"open ->","href":"./preview/rules.html"},{"code":"","title":"spacing","sub":"preview · spacing.html","meta":"open ->","href":"./preview/spacing.html"},{"code":"","title":"stamps","sub":"preview · stamps.html","meta":"open ->","href":"./preview/stamps.html"},{"code":"","title":"stamps lore","sub":"preview · stamps-lore.html","meta":"open ->","href":"./preview/stamps-lore.html"},{"code":"","title":"theme ink","sub":"preview · theme-ink.html","meta":"open ->","href":"./preview/theme-ink.html"},{"code":"","title":"type display","sub":"preview · type-display.html","meta":"open ->","href":"./preview/type-display.html"},{"code":"","title":"type mono","sub":"preview · type-mono.html","meta":"open ->","href":"./preview/type-mono.html"},{"code":"","title":"type prose","sub":"preview · type-prose.html","meta":"open ->","href":"./preview/type-prose.html"},{"code":"","title":"type scale","sub":"preview · type-scale.html","meta":"open ->","href":"./preview/type-scale.html"},{"code":"","title":"wordmarks","sub":"preview · wordmarks.html","meta":"open ->","href":"./preview/wordmarks.html"}]}],"quickstart":{"heading":"quick start","lines":[{"kind":"cmt","text":"# install via importmap (no bundler)"},{"kind":"cmd","text":"\u003cscript type='importmap'>{\"imports\":{\"anentrypoint-design\":\"https://unpkg.com/anentrypoint-design@latest/dist/247420.js\"}}\u003c/script>"},{"kind":"cmt","text":"# or clone the source"},{"kind":"cmd","text":"git clone https://github.com/AnEntrypoint/design.git"}]},"statusLeft":["main","utf-8","lf"],"statusRight":["anentrypoint-design@latest","14 kits"]}</script>
|
|
98
120
|
<style>html,body{margin:0;padding:0}body{background:var(--bg,#F6F5F1);color:var(--fg,#131318);font-family:var(--ff-body,system-ui,sans-serif)}</style>
|
|
99
121
|
</head>
|
|
100
122
|
<body>
|
|
@@ -183,6 +205,39 @@ function marqueeNode(marquee) {
|
|
|
183
205
|
return C.Marquee ? C.Marquee({ items: marquee.items, sep: marquee.sep || '/' }) : null;
|
|
184
206
|
}
|
|
185
207
|
|
|
208
|
+
let __copyResetTimer = null;
|
|
209
|
+
function copyQuickstart(text, btnEl) {
|
|
210
|
+
const done = (ok) => {
|
|
211
|
+
if (!btnEl) return;
|
|
212
|
+
btnEl.textContent = ok ? 'copied' : 'copy failed';
|
|
213
|
+
clearTimeout(__copyResetTimer);
|
|
214
|
+
__copyResetTimer = setTimeout(() => { btnEl.textContent = 'copy'; }, 1600);
|
|
215
|
+
};
|
|
216
|
+
if (navigator.clipboard && navigator.clipboard.writeText) {
|
|
217
|
+
navigator.clipboard.writeText(text).then(() => done(true), () => copyViaTextarea(text, done));
|
|
218
|
+
} else {
|
|
219
|
+
copyViaTextarea(text, done);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
// Fallback for non-secure contexts / browsers without navigator.clipboard:
|
|
223
|
+
// a hidden textarea + document.execCommand('copy'), the standard shim.
|
|
224
|
+
function copyViaTextarea(text, done) {
|
|
225
|
+
try {
|
|
226
|
+
const ta = document.createElement('textarea');
|
|
227
|
+
ta.value = text;
|
|
228
|
+
ta.style.position = 'fixed';
|
|
229
|
+
ta.style.opacity = '0';
|
|
230
|
+
document.body.appendChild(ta);
|
|
231
|
+
ta.focus();
|
|
232
|
+
ta.select();
|
|
233
|
+
const ok = document.execCommand('copy');
|
|
234
|
+
document.body.removeChild(ta);
|
|
235
|
+
done(ok);
|
|
236
|
+
} catch (_e) {
|
|
237
|
+
done(false);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
|
|
186
241
|
function quickstartNode(quickstart) {
|
|
187
242
|
if (!quickstart || !Array.isArray(quickstart.lines) || !quickstart.lines.length) return null;
|
|
188
243
|
// A single .cli wrapper holding .ds-cli-row/.ds-cli-comment children, not
|
|
@@ -196,7 +251,19 @@ function quickstartNode(quickstart) {
|
|
|
196
251
|
: h('div', { key: 'q' + i, class: 'ds-cli-row' },
|
|
197
252
|
h('span', { class: 'prompt' }, '$'),
|
|
198
253
|
h('span', { class: 'cmd' }, l.text)));
|
|
199
|
-
|
|
254
|
+
// Copy the whole snippet (comment lines included) as one paste-ready block,
|
|
255
|
+
// not just the command lines -- a reader copying "the quick start" expects
|
|
256
|
+
// what they see, not a silently filtered subset.
|
|
257
|
+
const fullText = quickstart.lines.map((l) => l.text).join('\n');
|
|
258
|
+
const copyBtn = h('button', {
|
|
259
|
+
type: 'button', class: 'copy ds-quickstart-copy',
|
|
260
|
+
'aria-label': 'copy quick start snippet',
|
|
261
|
+
onclick: (e) => copyQuickstart(fullText, e.currentTarget),
|
|
262
|
+
}, 'copy');
|
|
263
|
+
return C.Panel({
|
|
264
|
+
title: quickstart.heading || 'quick start',
|
|
265
|
+
children: h('div', { class: 'cli ds-quickstart-cli' }, h('div', { class: 'ds-cli-block' }, ...lineNodes), copyBtn),
|
|
266
|
+
});
|
|
200
267
|
}
|
|
201
268
|
|
|
202
269
|
function sideNode(sidebar) {
|
|
@@ -227,6 +294,21 @@ function __md(md) {
|
|
|
227
294
|
|
|
228
295
|
const bodyNode = data.bodyHtml ? C.Section({ children: h('div', { class: 'page-body', innerHTML: data.bodyHtml }) }) : null;
|
|
229
296
|
|
|
297
|
+
// A real closing block: the page previously just stopped after its last
|
|
298
|
+
// panel, leaving nothing but the app-stage's own bottom padding as unexplained
|
|
299
|
+
// empty space. Reuses data already on the page (nav links, siteName, year) —
|
|
300
|
+
// no invented content.
|
|
301
|
+
function footerNode() {
|
|
302
|
+
const year = new Date().getFullYear();
|
|
303
|
+
const links = (data.navItems || []).filter(([, href]) => /^https?:/.test(String(href)));
|
|
304
|
+
return h('footer', { class: 'ds-page-footer' },
|
|
305
|
+
h('span', { class: 'ds-page-footer-copy' }, String(year) + ' · ' + data.siteName),
|
|
306
|
+
links.length ? h('nav', { class: 'ds-page-footer-links', 'aria-label': 'footer' },
|
|
307
|
+
...links.map(([label, href], i) => h('a', { key: i, href }, String(label).replace(' ->', '')))
|
|
308
|
+
) : null,
|
|
309
|
+
);
|
|
310
|
+
}
|
|
311
|
+
|
|
230
312
|
function tierNode(tier, children) {
|
|
231
313
|
const kids = children.filter(Boolean);
|
|
232
314
|
if (!kids.length) return null;
|
|
@@ -264,6 +346,7 @@ const mainChildren = [
|
|
|
264
346
|
...tierNodes,
|
|
265
347
|
...leftoverPanels,
|
|
266
348
|
bodyNode,
|
|
349
|
+
footerNode(),
|
|
267
350
|
].filter(Boolean);
|
|
268
351
|
|
|
269
352
|
mount(document.getElementById('app'), () => C.AppShell({
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "anentrypoint-design",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.457",
|
|
4
4
|
"description": "247420 design system SDK — webjsx + modified ripple-ui, single-file ESM bundle for reproducible use of the AnEntrypoint design.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/247420.js",
|
|
@@ -217,13 +217,33 @@
|
|
|
217
217
|
padding: 3px 0;
|
|
218
218
|
}
|
|
219
219
|
.ds-cli-row .prompt { color: var(--green-2); flex: 0 0 auto; user-select: none; }
|
|
220
|
-
|
|
220
|
+
/* `overflow-wrap: break-word` only breaks a token when it genuinely cannot
|
|
221
|
+
fit the line at all (last resort); `word-break: break-word` (its
|
|
222
|
+
predecessor here) breaks ANY overflowing token eagerly, which is what
|
|
223
|
+
split "anentrypoint-design" mid-identifier inside the importmap JSON line.
|
|
224
|
+
`min-width: 0` lets the flex child actually shrink to trigger wrapping
|
|
225
|
+
instead of pushing the panel wider. */
|
|
226
|
+
.ds-cli-row .cmd { flex: 1 1 auto; min-width: 0; white-space: pre-wrap; overflow-wrap: break-word; word-break: normal; color: var(--paper); }
|
|
221
227
|
.ds-cli-comment {
|
|
222
228
|
color: var(--fg-3);
|
|
223
229
|
font-family: var(--ff-mono); font-size: var(--fs-tiny); line-height: 1.6;
|
|
224
|
-
padding: 3px 0; white-space: pre-wrap;
|
|
230
|
+
padding: 3px 0; white-space: pre-wrap; overflow-wrap: break-word; word-break: normal;
|
|
225
231
|
}
|
|
226
232
|
|
|
233
|
+
/* Quickstart copy button: sits below the multi-line block (Install's inline
|
|
234
|
+
copy button assumes a single-line row with room beside it; the stacked
|
|
235
|
+
quickstart block has no such side room). */
|
|
236
|
+
.ds-quickstart-cli { flex-direction: column; align-items: stretch; gap: var(--space-2); }
|
|
237
|
+
.ds-quickstart-copy {
|
|
238
|
+
align-self: flex-end;
|
|
239
|
+
padding: 8px 16px; background: transparent; color: var(--paper);
|
|
240
|
+
font-family: var(--ff-mono); font-size: var(--fs-tiny); text-transform: uppercase; letter-spacing: var(--tr-caps);
|
|
241
|
+
cursor: pointer; box-shadow: inset 0 0 0 1px var(--rule-strong);
|
|
242
|
+
border-radius: var(--r-pill); border: none;
|
|
243
|
+
}
|
|
244
|
+
.ds-quickstart-copy:hover { background: var(--fg-3); }
|
|
245
|
+
.ds-quickstart-copy:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); }
|
|
246
|
+
|
|
227
247
|
/* ============================================================
|
|
228
248
|
Receipt — key/value table
|
|
229
249
|
============================================================ */
|
|
@@ -155,7 +155,12 @@ body.canvas-host { background: transparent !important; }
|
|
|
155
155
|
.app-crumb .leaf { color: var(--fg); font-weight: 600; }
|
|
156
156
|
.app-crumb .crumb-right { margin-left: auto; color: var(--fg-3); }
|
|
157
157
|
|
|
158
|
-
.app-
|
|
158
|
+
/* The shell is the grid cell (.app-body's fixed sidebar column); it must own
|
|
159
|
+
its own scroll, not just size to content, because .app-body's row track is
|
|
160
|
+
`minmax(0, 1fr)` — a real height the sidebar can overflow once bins +
|
|
161
|
+
labels + more exceed it. Without this the extra rows were silently chopped
|
|
162
|
+
at the viewport edge with no way to reach them. */
|
|
163
|
+
.app-side-shell { background: var(--bg); overflow-y: auto; min-height: 0; }
|
|
159
164
|
.app-body { display: grid; grid-template-columns: var(--sidebar-width) minmax(0, 1fr); grid-template-rows: minmax(0, 1fr); align-items: stretch; align-content: stretch; flex: 1; min-height: 0; }
|
|
160
165
|
.app-body.no-side { grid-template-columns: minmax(0, 1fr); }
|
|
161
166
|
/* When there is no sidebar, the empty side-shell must not occupy a grid row,
|
|
@@ -91,6 +91,39 @@ function marqueeNode(marquee) {
|
|
|
91
91
|
return C.Marquee ? C.Marquee({ items: marquee.items, sep: marquee.sep || '/' }) : null;
|
|
92
92
|
}
|
|
93
93
|
|
|
94
|
+
let __copyResetTimer = null;
|
|
95
|
+
function copyQuickstart(text, btnEl) {
|
|
96
|
+
const done = (ok) => {
|
|
97
|
+
if (!btnEl) return;
|
|
98
|
+
btnEl.textContent = ok ? 'copied' : 'copy failed';
|
|
99
|
+
clearTimeout(__copyResetTimer);
|
|
100
|
+
__copyResetTimer = setTimeout(() => { btnEl.textContent = 'copy'; }, 1600);
|
|
101
|
+
};
|
|
102
|
+
if (navigator.clipboard && navigator.clipboard.writeText) {
|
|
103
|
+
navigator.clipboard.writeText(text).then(() => done(true), () => copyViaTextarea(text, done));
|
|
104
|
+
} else {
|
|
105
|
+
copyViaTextarea(text, done);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// Fallback for non-secure contexts / browsers without navigator.clipboard:
|
|
109
|
+
// a hidden textarea + document.execCommand('copy'), the standard shim.
|
|
110
|
+
function copyViaTextarea(text, done) {
|
|
111
|
+
try {
|
|
112
|
+
const ta = document.createElement('textarea');
|
|
113
|
+
ta.value = text;
|
|
114
|
+
ta.style.position = 'fixed';
|
|
115
|
+
ta.style.opacity = '0';
|
|
116
|
+
document.body.appendChild(ta);
|
|
117
|
+
ta.focus();
|
|
118
|
+
ta.select();
|
|
119
|
+
const ok = document.execCommand('copy');
|
|
120
|
+
document.body.removeChild(ta);
|
|
121
|
+
done(ok);
|
|
122
|
+
} catch (_e) {
|
|
123
|
+
done(false);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
94
127
|
function quickstartNode(quickstart) {
|
|
95
128
|
if (!quickstart || !Array.isArray(quickstart.lines) || !quickstart.lines.length) return null;
|
|
96
129
|
// A single .cli wrapper holding .ds-cli-row/.ds-cli-comment children, not
|
|
@@ -104,7 +137,19 @@ function quickstartNode(quickstart) {
|
|
|
104
137
|
: h('div', { key: 'q' + i, class: 'ds-cli-row' },
|
|
105
138
|
h('span', { class: 'prompt' }, '$'),
|
|
106
139
|
h('span', { class: 'cmd' }, l.text)));
|
|
107
|
-
|
|
140
|
+
// Copy the whole snippet (comment lines included) as one paste-ready block,
|
|
141
|
+
// not just the command lines -- a reader copying "the quick start" expects
|
|
142
|
+
// what they see, not a silently filtered subset.
|
|
143
|
+
const fullText = quickstart.lines.map((l) => l.text).join('\\n');
|
|
144
|
+
const copyBtn = h('button', {
|
|
145
|
+
type: 'button', class: 'copy ds-quickstart-copy',
|
|
146
|
+
'aria-label': 'copy quick start snippet',
|
|
147
|
+
onclick: (e) => copyQuickstart(fullText, e.currentTarget),
|
|
148
|
+
}, 'copy');
|
|
149
|
+
return C.Panel({
|
|
150
|
+
title: quickstart.heading || 'quick start',
|
|
151
|
+
children: h('div', { class: 'cli ds-quickstart-cli' }, h('div', { class: 'ds-cli-block' }, ...lineNodes), copyBtn),
|
|
152
|
+
});
|
|
108
153
|
}
|
|
109
154
|
|
|
110
155
|
function sideNode(sidebar) {
|
|
@@ -135,6 +180,21 @@ function __md(md) {
|
|
|
135
180
|
|
|
136
181
|
const bodyNode = data.bodyHtml ? C.Section({ children: h('div', { class: 'page-body', innerHTML: data.bodyHtml }) }) : null;
|
|
137
182
|
|
|
183
|
+
// A real closing block: the page previously just stopped after its last
|
|
184
|
+
// panel, leaving nothing but the app-stage's own bottom padding as unexplained
|
|
185
|
+
// empty space. Reuses data already on the page (nav links, siteName, year) —
|
|
186
|
+
// no invented content.
|
|
187
|
+
function footerNode() {
|
|
188
|
+
const year = new Date().getFullYear();
|
|
189
|
+
const links = (data.navItems || []).filter(([, href]) => /^https?:/.test(String(href)));
|
|
190
|
+
return h('footer', { class: 'ds-page-footer' },
|
|
191
|
+
h('span', { class: 'ds-page-footer-copy' }, String(year) + ' · ' + data.siteName),
|
|
192
|
+
links.length ? h('nav', { class: 'ds-page-footer-links', 'aria-label': 'footer' },
|
|
193
|
+
...links.map(([label, href], i) => h('a', { key: i, href }, String(label).replace(' ->', '')))
|
|
194
|
+
) : null,
|
|
195
|
+
);
|
|
196
|
+
}
|
|
197
|
+
|
|
138
198
|
function tierNode(tier, children) {
|
|
139
199
|
const kids = children.filter(Boolean);
|
|
140
200
|
if (!kids.length) return null;
|
|
@@ -172,6 +232,7 @@ const mainChildren = [
|
|
|
172
232
|
...tierNodes,
|
|
173
233
|
...leftoverPanels,
|
|
174
234
|
bodyNode,
|
|
235
|
+
footerNode(),
|
|
175
236
|
].filter(Boolean);
|
|
176
237
|
|
|
177
238
|
mount(document.getElementById('app'), () => C.AppShell({
|
|
@@ -51,7 +51,13 @@ export const PAGE_INLINE_STYLES = `
|
|
|
51
51
|
a.row:hover .ds-row-arrow { opacity: 1 }
|
|
52
52
|
/* hero stat strip — all badges as a wrapping inline rhythm, not one empty panel */
|
|
53
53
|
.ds-hero-stats { display: flex; flex-wrap: wrap; gap: var(--space-3, 16px) var(--space-5, 32px); margin-top: var(--space-2, 8px) }
|
|
54
|
-
.ds-hero-stat
|
|
54
|
+
/* hero-content.css's .ds-hero-stat is styled for a vertical stacked list
|
|
55
|
+
(border-bottom row divider, meant to read top-to-bottom); this page renders
|
|
56
|
+
badges in a horizontal row instead (.ds-hero-stats above), where that same
|
|
57
|
+
border reads as an underlined tab strip -- an affordance for a set of
|
|
58
|
+
plain, non-interactive metadata chips. Reset both inherited properties so a
|
|
59
|
+
row of badges never borrows tab-bar chrome it did not opt into. */
|
|
60
|
+
.ds-hero-stat { display: flex; align-items: baseline; gap: var(--space-2, 8px); border-bottom: none !important; padding-bottom: 0 !important }
|
|
55
61
|
.ds-hero-stat-n { font-family: var(--ff-body); font-weight: 700; font-size: var(--fs-lg, 18px); color: var(--fg) }
|
|
56
62
|
.ds-hero-stat-l { font-size: var(--fs-sm, 15px); color: var(--fg-3) }
|
|
57
63
|
/* accent sits on its own line, muted, so it reads as a distinct aside instead
|
|
@@ -68,4 +74,20 @@ a.row:hover .ds-row-arrow { opacity: 1 }
|
|
|
68
74
|
.ds-feature-title { font-weight: 600; font-size: var(--fs-lg, 18px); color: var(--fg) }
|
|
69
75
|
.ds-feature-desc { font-size: var(--fs-sm, 15px); color: var(--fg-2); line-height: 1.5; overflow-wrap: anywhere }
|
|
70
76
|
.ds-feature-benefit { font-style: italic; font-size: var(--fs-sm, 15px); color: var(--fg-3); margin-top: var(--space-1, 4px) }
|
|
77
|
+
/* Real closing content instead of the page simply stopping after its last
|
|
78
|
+
panel — a tonal divider line, a copyright string, and the same external
|
|
79
|
+
links the topbar already carries (footer.js reuses data.navItems, so this
|
|
80
|
+
is never invented content). Sits inside .app-stage's own grid gap like
|
|
81
|
+
every other block, no extra margin needed. */
|
|
82
|
+
.ds-page-footer {
|
|
83
|
+
display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between;
|
|
84
|
+
gap: var(--space-3, 16px);
|
|
85
|
+
padding-top: var(--space-5, 32px);
|
|
86
|
+
margin-top: var(--space-3, 16px);
|
|
87
|
+
border-top: 1px solid var(--rule, var(--bg-3));
|
|
88
|
+
color: var(--fg-3); font-size: var(--fs-sm, 15px);
|
|
89
|
+
}
|
|
90
|
+
.ds-page-footer-links { display: flex; gap: var(--space-4, 24px) }
|
|
91
|
+
.ds-page-footer-links a { color: var(--fg-3) }
|
|
92
|
+
.ds-page-footer-links a:hover { color: var(--fg) }
|
|
71
93
|
`.trim();
|