diff --git a/site/decodal-site/src/pages/docs/[...slug].astro b/site/decodal-site/src/pages/docs/[...slug].astro
index b998df4..4467a0e 100644
--- a/site/decodal-site/src/pages/docs/[...slug].astro
+++ b/site/decodal-site/src/pages/docs/[...slug].astro
@@ -1,6 +1,8 @@
---
import ManualLayout from '../../layouts/ManualLayout.astro';
import { allDocSlugs, docTitle, renderMarkdown } from '../../lib/docs.js';
+import '@fontsource/ibm-plex-sans-jp/400.css';
+import '@fontsource/ibm-plex-sans-jp/600.css';
export function getStaticPaths() {
return allDocSlugs().map((slug) => ({
diff --git a/site/decodal-site/src/pages/docs/index.astro b/site/decodal-site/src/pages/docs/index.astro
index 9e6d54a..998b5e1 100644
--- a/site/decodal-site/src/pages/docs/index.astro
+++ b/site/decodal-site/src/pages/docs/index.astro
@@ -1,6 +1,8 @@
---
import ManualLayout from '../../layouts/ManualLayout.astro';
import { renderMarkdown } from '../../lib/docs.js';
+import '@fontsource/ibm-plex-sans-jp/400.css';
+import '@fontsource/ibm-plex-sans-jp/600.css';
const html = renderMarkdown('index');
---
diff --git a/site/decodal-site/src/pages/index.astro b/site/decodal-site/src/pages/index.astro
index 3c351af..4405ce8 100644
--- a/site/decodal-site/src/pages/index.astro
+++ b/site/decodal-site/src/pages/index.astro
@@ -1,163 +1,6 @@
---
-import ManualLayout from '../layouts/ManualLayout.astro';
-import { highlightCode } from '../lib/highlight.js';
-
-const example = `let
- Port = Int & >= 1 & <= 65535;
- Service = {
- host = String;
- port = Port default 8080;
- };
-in
-{
- host = "127.0.0.1";
-} as Service;`;
-
-const result = `{
- "host": "127.0.0.1",
- "port": 8080
-}`;
+import HomePage from '../components/HomePage.astro';
+import '@fontsource/ibm-plex-sans-jp/latin-400.css';
+import '@fontsource/ibm-plex-sans-jp/latin-600.css';
---
-
-
-
-
Configuration, constraints, and defaults are values.
-
- Decodal is a small deterministic language for describing, composing, validating, and materializing
- structured data. The same expression can carry concrete data and the range that data must satisfy.
-
-
-
-
-
- Source
- .dcdl
-
-
-
- Runtime
- - Rust · WebAssembly
-
-
-
- Output
- - Validated structured data
-
-
-
-
-
-
- service.dcdl
- DCDL
-
-
-
-
materialize
-
{result}
-
-
-
-
-
-
- One expression system, from abstract range to concrete data.
-
-
-
- &
-
-
Compose without discarding constraints
-
Symmetric composition keeps information from both sides and fails when their ranges cannot overlap.
-
-
-
- as
-
-
Verify that a value is more specific
-
The left side must fit inside the wider range on the right. Wider abstract fields remain available for later materialization.
-
-
-
- //
-
-
Apply an explicit structural patch
-
Right-biased composition replaces the selected structure while preserving unrelated fields.
-
-
-
- default
-
-
Choose a fallback only when materializing
-
A default does not erase the range. It is selected only when no more concrete value has been supplied.
-
-
-
-
-
-
-
- The host owns I/O. Decodal owns evaluation.
-
- Filesystems, Markdown, JSON, network resources, and application globals stay under host control. Decodal
- receives source or structured values and evaluates them with the same rules in production and editor tooling.
-
-
-
- -
- 1
- Host environment
- globals · source · structured imports
-
- -
- 2
- Evaluate
- lazy references · constraints · composition
-
- -
- 3
- Materialize
- defaults · validation · diagnostics
-
- -
- 4
- Application data
- Data · Rust type · JavaScript value
-
-
- Read the embedding guide →
-
-
-
-
- Use only the layer your application needs.
-
-
-
- decodalRust
- Runtime, host embedding, schema derivation, and typed decoding.
- crates.io
-
-
- decodal-wasmJavaScript
- Browser runtime and host-configurable semantic language service.
- JSRnpm
-
-
- decodal-lspRust
- Language Server Protocol with application-defined environments.
- crates.io
-
-
- decodal-codemirrorJavaScript
- CodeMirror 6 syntax, indentation, folding, highlighting, and formatter integration.
- JSRnpm
-
-
- Compare packages and integrations →
-
-
+
diff --git a/site/decodal-site/src/pages/ja/index.astro b/site/decodal-site/src/pages/ja/index.astro
new file mode 100644
index 0000000..464ca8d
--- /dev/null
+++ b/site/decodal-site/src/pages/ja/index.astro
@@ -0,0 +1,6 @@
+---
+import HomePage from '../../components/HomePage.astro';
+import '@fontsource/ibm-plex-sans-jp/400.css';
+import '@fontsource/ibm-plex-sans-jp/600.css';
+---
+
diff --git a/site/decodal-site/src/pages/playground.astro b/site/decodal-site/src/pages/playground.astro
index 7ced138..76641b9 100644
--- a/site/decodal-site/src/pages/playground.astro
+++ b/site/decodal-site/src/pages/playground.astro
@@ -1,5 +1,7 @@
---
import ManualLayout from '../layouts/ManualLayout.astro';
+import '@fontsource/ibm-plex-sans-jp/latin-400.css';
+import '@fontsource/ibm-plex-sans-jp/latin-600.css';
---
diff --git a/site/decodal-site/src/scripts/playground.js b/site/decodal-site/src/scripts/playground.js
index 3f2c2dc..f21db51 100644
--- a/site/decodal-site/src/scripts/playground.js
+++ b/site/decodal-site/src/scripts/playground.js
@@ -36,7 +36,7 @@ const editorTheme = EditorView.theme({
height: '100%',
},
'.cm-scroller': {
- fontFamily: 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace',
+ fontFamily: '"IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace',
fontSize: '13px',
lineHeight: '1.45',
overflow: 'auto',
diff --git a/site/decodal-site/src/style.css b/site/decodal-site/src/style.css
index 9c948a1..6432ce0 100644
--- a/site/decodal-site/src/style.css
+++ b/site/decodal-site/src/style.css
@@ -1,10 +1,10 @@
:root {
color-scheme: light;
- font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
+ font-family: var(--font-ui);
font-synthesis: none;
- --font-ui: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
- --font-code: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace;
+ --font-ui: "IBM Plex Sans JP", ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
+ --font-code: "IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace;
--canvas: #f6f7f8;
--surface: #ffffff;
@@ -524,6 +524,11 @@ main.frontpage {
max-width: 660px;
}
+[lang="ja"] .home-intro h1 {
+ letter-spacing: -0.035em;
+ line-height: 1.15;
+}
+
.home-lead {
color: var(--muted);
font-size: 1.05rem;
@@ -657,6 +662,21 @@ main.frontpage {
margin: 0;
}
+[lang="ja"] .section-heading h2 {
+ letter-spacing: -0.025em;
+ line-height: 1.3;
+}
+
+[lang="ja"] .frontpage .phrased {
+ line-break: strict;
+ overflow-wrap: normal;
+ word-break: keep-all;
+}
+
+[lang="ja"] .frontpage .phrase-unit {
+ white-space: nowrap;
+}
+
.section-heading > p:last-child {
color: var(--muted);
line-height: 1.75;
@@ -1230,7 +1250,7 @@ main.playground {
padding-right: 8px;
}
- .topnav a:last-child {
+ .topnav .source-link {
display: none;
}