From f0c15e4d21e04d0908c982b01c3f265de7e78ca0 Mon Sep 17 00:00:00 2001 From: "Jonathan D.A. Jewell" <6759885+hyperpolymath@users.noreply.github.com> Date: Thu, 30 Apr 2026 15:30:19 +0100 Subject: [PATCH 1/3] feat(stdlib): add fs_*/env_args/format builtins + my-cli argv forwarding Six new stdlib builtins for tooling workloads: - fs_write_file / fs_read_file / fs_create_dir_all / fs_exists - env_args (host-supplied with std::env::args().skip(1) fallback) - format (positional {} substitution, {{ }} escapes) Plus PROGRAM_ARGS OnceLock + pub fn set_program_args, and my-cli's Run subcommand grows a trailing_var_arg field forwarded to set_program_args. Validated by an end-to-end run of an out-of-tree scaffold tool against six idaptik-port component repos. See PR body for details and open design questions. Co-Authored-By: Claude Opus 4.7 (1M context) --- crates/my-cli/src/main.rs | 12 ++- crates/my-lang/src/stdlib.rs | 203 +++++++++++++++++++++++++++++++++++ 2 files changed, 213 insertions(+), 2 deletions(-) diff --git a/crates/my-cli/src/main.rs b/crates/my-cli/src/main.rs index 7e20002..2a44b3c 100644 --- a/crates/my-cli/src/main.rs +++ b/crates/my-cli/src/main.rs @@ -19,7 +19,12 @@ struct Cli { #[derive(Subcommand)] enum Commands { /// Run a My Language file with the interpreter - Run { file: PathBuf }, + Run { + file: PathBuf, + /// Args passed to the program (visible to env_args()). Use `--` to separate. + #[arg(trailing_var_arg = true, allow_hyphen_values = true)] + args: Vec, + }, /// Parse a file and show the AST Parse { @@ -61,7 +66,10 @@ fn main() -> Result<()> { let cli = Cli::parse(); match cli.command { - Commands::Run { file } => run_file(&file), + Commands::Run { file, args } => { + my_lang::stdlib::set_program_args(args); + run_file(&file) + } Commands::Parse { file, output } => parse_file(&file, &output), Commands::DumpSexpr { file } => parse_file(&file, "sexpr"), Commands::Lex { file } => lex_file(&file), diff --git a/crates/my-lang/src/stdlib.rs b/crates/my-lang/src/stdlib.rs index d4ac575..7820621 100644 --- a/crates/my-lang/src/stdlib.rs +++ b/crates/my-lang/src/stdlib.rs @@ -5,6 +5,19 @@ use crate::interpreter::{NativeFunction, RuntimeError, Value}; use std::collections::HashMap; +use std::sync::OnceLock; + +/// Program argv forwarded by the host (e.g. my-cli's `Run` command). +/// When set, `env_args()` returns these instead of `std::env::args().skip(1)`. +/// This lets `my run script.my -- --flag value` propagate `--flag value` to +/// the program without my-cli's clap consuming it. +static PROGRAM_ARGS: OnceLock> = OnceLock::new(); + +/// Set the program argv visible to `env_args()`. Idempotent (first call wins). +/// Hosts (my-cli, embedders) call this before running a program. +pub fn set_program_args(args: Vec) { + let _ = PROGRAM_ARGS.set(args); +} /// Register all standard library functions into an environment pub fn register_stdlib(define: &mut impl FnMut(String, Value)) { @@ -25,6 +38,12 @@ pub fn register_stdlib(define: &mut impl FnMut(String, Value)) { // Utility Functions register_utility_functions(define); + + // File System Functions (added 2026-04-30 per idaptik-port stdlib PR) + register_fs_functions(define); + + // Environment Extras (env_args; complements existing env(name)) + register_env_extras(define); } // ============================================================================ @@ -363,6 +382,63 @@ fn register_string_functions(define: &mut impl FnMut(String, Value)) { }, }), ); + + // format(template, args) - positional {} substitution; {{ and }} escape + define( + "format".to_string(), + Value::NativeFunction(NativeFunction { + name: "format".to_string(), + arity: 2, + func: |args| { + let template = match &args[0] { + Value::String(s) => s.clone(), + _ => { + return Err(RuntimeError::TypeError { + expected: "string".to_string(), + got: format!("{:?}", args[0]), + }) + } + }; + let values = match &args[1] { + Value::Array(a) => a.clone(), + _ => { + return Err(RuntimeError::TypeError { + expected: "array".to_string(), + got: format!("{:?}", args[1]), + }) + } + }; + let mut result = String::new(); + let mut chars = template.chars().peekable(); + let mut idx = 0usize; + while let Some(c) = chars.next() { + if c == '{' && chars.peek() == Some(&'{') { + chars.next(); + result.push('{'); + } else if c == '{' && chars.peek() == Some(&'}') { + chars.next(); + if idx >= values.len() { + return Err(RuntimeError::Custom(format!( + "format: not enough args for placeholder #{}", + idx + ))); + } + match &values[idx] { + Value::String(s) => result.push_str(s), + v => result.push_str(&format!("{}", v)), + } + idx += 1; + } else if c == '}' && chars.peek() == Some(&'}') { + chars.next(); + result.push('}'); + } else { + result.push(c); + } + } + Ok(Value::String(result)) + }, + }), + ); } // ============================================================================ @@ -1293,6 +1369,125 @@ fn register_utility_functions(define: &mut impl FnMut(String, Value)) { ); } +// ============================================================================ +// FILE SYSTEM FUNCTIONS +// ============================================================================ + +fn register_fs_functions(define: &mut impl FnMut(String, Value)) { + // fs_write_file(path, content) - write content to path; auto-create parent dirs + define( + "fs_write_file".to_string(), + Value::NativeFunction(NativeFunction { + name: "fs_write_file".to_string(), + arity: 2, + func: |args| { + let (path, content) = match (&args[0], &args[1]) { + (Value::String(p), Value::String(c)) => (p.clone(), c.clone()), + _ => { + return Err(RuntimeError::TypeError { + expected: "string, string".to_string(), + got: format!("{:?}, {:?}", args[0], args[1]), + }) + } + }; + if let Some(parent) = std::path::Path::new(&path).parent() { + if !parent.as_os_str().is_empty() && !parent.exists() { + std::fs::create_dir_all(parent).map_err(|e| { + RuntimeError::Custom(format!( + "fs_write_file: create_dir_all({}) failed: {}", + parent.display(), + e + )) + })?; + } + } + std::fs::write(&path, content).map_err(|e| { + RuntimeError::Custom(format!("fs_write_file({}) failed: {}", path, e)) + })?; + Ok(Value::Unit) + }, + }), + ); + + // fs_read_file(path) -> String + define( + "fs_read_file".to_string(), + Value::NativeFunction(NativeFunction { + name: "fs_read_file".to_string(), + arity: 1, + func: |args| match &args[0] { + Value::String(path) => std::fs::read_to_string(path).map(Value::String).map_err( + |e| RuntimeError::Custom(format!("fs_read_file({}) failed: {}", path, e)), + ), + _ => Err(RuntimeError::TypeError { + expected: "string".to_string(), + got: format!("{:?}", args[0]), + }), + }, + }), + ); + + // fs_create_dir_all(path) -> Unit + define( + "fs_create_dir_all".to_string(), + Value::NativeFunction(NativeFunction { + name: "fs_create_dir_all".to_string(), + arity: 1, + func: |args| match &args[0] { + Value::String(path) => std::fs::create_dir_all(path) + .map(|_| Value::Unit) + .map_err(|e| { + RuntimeError::Custom(format!("fs_create_dir_all({}) failed: {}", path, e)) + }), + _ => Err(RuntimeError::TypeError { + expected: "string".to_string(), + got: format!("{:?}", args[0]), + }), + }, + }), + ); + + // fs_exists(path) -> Bool + define( + "fs_exists".to_string(), + Value::NativeFunction(NativeFunction { + name: "fs_exists".to_string(), + arity: 1, + func: |args| match &args[0] { + Value::String(path) => Ok(Value::Bool(std::path::Path::new(path).exists())), + _ => Err(RuntimeError::TypeError { + expected: "string".to_string(), + got: format!("{:?}", args[0]), + }), + }, + }), + ); +} + +// ============================================================================ +// ENV EXTRAS +// ============================================================================ + +fn register_env_extras(define: &mut impl FnMut(String, Value)) { + // env_args() -> Array - argv visible to the My program. + // Prefers host-supplied args (my-cli forwards trailing args after `--`); + // falls back to OS argv.skip(1) for backwards compat. + define( + "env_args".to_string(), + Value::NativeFunction(NativeFunction { + name: "env_args".to_string(), + arity: 0, + func: |_| { + let args: Vec = match PROGRAM_ARGS.get() { + Some(host_args) => host_args.iter().cloned().map(Value::String).collect(), + None => std::env::args().skip(1).map(Value::String).collect(), + }; + Ok(Value::Array(args)) + }, + }), + ); +} + /// Get a list of all stdlib function names pub fn stdlib_functions() -> Vec<&'static str> { vec![ @@ -1316,6 +1511,7 @@ pub fn stdlib_functions() -> Vec<&'static str> { "str_ends_with", "str_substring", "char_at", + "format", // Math "abs", "min", @@ -1374,5 +1570,12 @@ pub fn stdlib_functions() -> Vec<&'static str> { "random", "random_int", "env", + // FS + "fs_write_file", + "fs_read_file", + "fs_create_dir_all", + "fs_exists", + // Env extras + "env_args", ] } From ef4f7a684069a6c423ae91803f10d0a4d899416c Mon Sep 17 00:00:00 2001 From: "Jonathan D.A. Jewell" <6759885+hyperpolymath@users.noreply.github.com> Date: Mon, 22 Jun 2026 21:52:02 +0100 Subject: [PATCH 2/3] chore: resolve merge conflicts --- CONTRIBUTING.md | 23 ++--------------------- 1 file changed, 2 insertions(+), 21 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 126d71c..45d13a8 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,23 +1,15 @@ + + # Clone the repository -<<<<<<< HEAD -git clone https://github.com/hyperpolymath/my-lang-archive.git -cd my-lang-archive -======= git clone https://github.com/hyperpolymath/my-lang.git cd my-lang ->>>>>>> 7f63c53cc206ad0448f9e17e5b74dde7cf393117 # Using Nix (recommended for reproducibility) nix develop # Or using toolbox/distrobox -<<<<<<< HEAD -toolbox create my-lang-archive-dev -toolbox enter my-lang-archive-dev -======= toolbox create my-lang-dev toolbox enter my-lang-dev ->>>>>>> 7f63c53cc206ad0448f9e17e5b74dde7cf393117 # Install dependencies manually # Verify setup @@ -27,11 +19,7 @@ just test # Run test suite ### Repository Structure ``` -<<<<<<< HEAD -my-lang-archive/ -======= my-lang/ ->>>>>>> 7f63c53cc206ad0448f9e17e5b74dde7cf393117 ├── src/ # Source code (Perimeter 1-2) ├── lib/ # Library code (Perimeter 1-2) ├── extensions/ # Extensions (Perimeter 2) @@ -100,17 +88,10 @@ Use the [feature request template](.github/ISSUE_TEMPLATE/feature_request.md) an Look for issues labelled: -<<<<<<< HEAD -- [`good first issue`](https://github.com/hyperpolymath/my-lang-archive/labels/good%20first%20issue) — Simple Perimeter 3 tasks -- [`help wanted`](https://github.com/hyperpolymath/my-lang-archive/labels/help%20wanted) — Community help needed -- [`documentation`](https://github.com/hyperpolymath/my-lang-archive/labels/documentation) — Docs improvements -- [`perimeter-3`](https://github.com/hyperpolymath/my-lang-archive/labels/perimeter-3) — Community sandbox scope -======= - [`good first issue`](https://github.com/hyperpolymath/my-lang/labels/good%20first%20issue) — Simple Perimeter 3 tasks - [`help wanted`](https://github.com/hyperpolymath/my-lang/labels/help%20wanted) — Community help needed - [`documentation`](https://github.com/hyperpolymath/my-lang/labels/documentation) — Docs improvements - [`perimeter-3`](https://github.com/hyperpolymath/my-lang/labels/perimeter-3) — Community sandbox scope ->>>>>>> 7f63c53cc206ad0448f9e17e5b74dde7cf393117 --- From f9906f570c9f80d44bb55d86ec762289d3645602 Mon Sep 17 00:00:00 2001 From: hyperpolymath <6759885+hyperpolymath@users.noreply.github.com> Date: Mon, 29 Jun 2026 23:30:56 +0100 Subject: [PATCH 3/3] feat: --- _site/assets/style.css | 303 +++++++++++++++++++++++++++++++++++++++++ _site/index.html | 100 ++++++++++++++ assets/style.css | 303 +++++++++++++++++++++++++++++++++++++++++ config.yaml | 6 + site/index.md | 21 +-- templates/default.html | 72 ++++++++++ templates/modern.css | 303 +++++++++++++++++++++++++++++++++++++++++ 7 files changed, 1091 insertions(+), 17 deletions(-) create mode 100644 _site/assets/style.css create mode 100644 _site/index.html create mode 100644 assets/style.css create mode 100644 config.yaml create mode 100644 templates/default.html create mode 100644 templates/modern.css diff --git a/_site/assets/style.css b/_site/assets/style.css new file mode 100644 index 0000000..1a44bde --- /dev/null +++ b/_site/assets/style.css @@ -0,0 +1,303 @@ +/* Premium Casket-SSG Design System */ +:root { + --primary: #6366f1; + --primary-hover: #4f46e5; + --secondary: #a855f7; + --accent: #ec4899; + --text-main: #f8fafc; + --text-muted: #94a3b8; + --bg-base: #0f172a; + --bg-surface: rgba(30, 41, 59, 0.7); + --border-glass: rgba(255, 255, 255, 0.1); + --font-heading: 'Outfit', sans-serif; + --font-body: 'Inter', sans-serif; +} + +@media (prefers-color-scheme: light) { + :root { + --text-main: #0f172a; + --text-muted: #64748b; + --bg-base: #f8fafc; + --bg-surface: rgba(255, 255, 255, 0.8); + --border-glass: rgba(0, 0, 0, 0.1); + } +} + +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: var(--font-body); + color: var(--text-main); + background-color: var(--bg-base); + line-height: 1.6; + overflow-x: hidden; + position: relative; +} + +.glow-bg { + position: absolute; + top: 0; + left: 50%; + transform: translateX(-50%); + width: 100vw; + height: 800px; + background: radial-gradient(circle 600px at 50% 200px, rgba(99, 102, 241, 0.15), transparent 80%); + z-index: -1; + pointer-events: none; +} + +.container { + max-width: 1200px; + margin: 0 auto; + padding: 0 2rem; +} + +/* Header & Nav */ +.site-header { + backdrop-filter: blur(12px); + -webkit-backdrop-filter: blur(12px); + background: transparent; + border-bottom: 1px solid var(--border-glass); + position: sticky; + top: 0; + z-index: 100; +} + +.nav { + display: flex; + justify-content: space-between; + align-items: center; + height: 5rem; +} + +.brand { + font-family: var(--font-heading); + font-size: 1.5rem; + font-weight: 800; + text-decoration: none; + background: linear-gradient(135deg, var(--primary), var(--secondary)); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + transition: opacity 0.2s; +} + +.brand:hover { + opacity: 0.9; +} + +.nav-links { + display: flex; + align-items: center; + gap: 2rem; +} + +.nav-link { + color: var(--text-muted); + text-decoration: none; + font-weight: 500; + transition: color 0.2s; +} + +.nav-link:hover { + color: var(--text-main); +} + +/* Buttons */ +.btn-primary, .btn-secondary { + display: inline-flex; + align-items: center; + justify-content: center; + padding: 0.75rem 1.5rem; + font-weight: 600; + text-decoration: none; + border-radius: 0.5rem; + transition: all 0.2s ease-in-out; + cursor: pointer; +} + +.btn-primary { + background: linear-gradient(135deg, var(--primary), var(--secondary)); + color: #ffffff; + border: none; + box-shadow: 0 4px 15px rgba(99, 102, 241, 0.3); +} + +.btn-primary:hover { + transform: translateY(-2px); + box-shadow: 0 6px 20px rgba(99, 102, 241, 0.4); +} + +.btn-secondary { + background: var(--bg-surface); + color: var(--text-main); + border: 1px solid var(--border-glass); + backdrop-filter: blur(8px); +} + +.btn-secondary:hover { + background: rgba(255, 255, 255, 0.1); + transform: translateY(-2px); +} + +.large { + padding: 1rem 2rem; + font-size: 1.1rem; +} + +/* Hero Section */ +.hero { + text-align: center; + padding: 8rem 0 6rem; + max-width: 800px; + margin: 0 auto; +} + +.hero-badge { + display: inline-block; + padding: 0.5rem 1rem; + font-size: 0.875rem; + font-weight: 600; + color: var(--secondary); + background: rgba(168, 85, 247, 0.1); + border: 1px solid rgba(168, 85, 247, 0.2); + border-radius: 2rem; + margin-bottom: 2rem; +} + +.hero h1 { + font-family: var(--font-heading); + font-size: 4rem; + font-weight: 800; + line-height: 1.1; + margin-bottom: 1.5rem; + background: linear-gradient(135deg, #ffffff 30%, var(--text-muted)); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; +} + +@media (prefers-color-scheme: light) { + .hero h1 { + background: linear-gradient(135deg, #0f172a 30%, var(--primary)); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + } +} + +.hero-subtitle { + font-size: 1.25rem; + color: var(--text-muted); + margin-bottom: 3rem; +} + +.cta-group { + display: flex; + justify-content: center; + gap: 1.5rem; +} + +/* Feature Grid */ +.grid-features { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); + gap: 2rem; + margin-bottom: 6rem; +} + +.glass { + background: var(--bg-surface); + backdrop-filter: blur(16px); + -webkit-backdrop-filter: blur(16px); + border: 1px solid var(--border-glass); + border-radius: 1rem; + padding: 2.5rem; + box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2); + transition: transform 0.3s ease, border-color 0.3s ease; +} + +.glass:hover { + transform: translateY(-4px); + border-color: var(--secondary); +} + +.card-icon { + font-size: 2.5rem; + margin-bottom: 1.5rem; +} + +.card h3 { + font-family: var(--font-heading); + font-size: 1.5rem; + margin-bottom: 1rem; + color: var(--text-main); +} + +.card p { + color: var(--text-muted); +} + +/* Content Section */ +.content-section { + margin-bottom: 8rem; +} + +.content-section h2 { + font-family: var(--font-heading); + font-size: 2.5rem; + margin-bottom: 2rem; + background: linear-gradient(135deg, var(--primary), var(--secondary)); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; +} + +.prose h3 { + font-family: var(--font-heading); + font-size: 1.5rem; + margin: 2rem 0 1rem; +} + +.prose p { + color: var(--text-muted); + margin-bottom: 1.5rem; +} + +.prose pre { + background: #0b0f19; + border: 1px solid var(--border-glass); + padding: 1.5rem; + border-radius: 0.5rem; + overflow-x: auto; + margin: 2rem 0; +} + +.prose code { + font-family: monospace; + color: #38bdf8; +} + +/* Footer */ +.site-footer { + border-top: 1px solid var(--border-glass); + padding: 4rem 0; + text-align: center; +} + +.footer-content { + display: flex; + flex-direction: column; + gap: 1rem; +} + +.muted { + color: var(--text-muted); + font-size: 0.9rem; +} + +@media (max-width: 768px) { + .hero h1 { font-size: 2.5rem; } + .nav-links { display: none; } + .cta-group { flex-direction: column; } +} diff --git a/_site/index.html b/_site/index.html new file mode 100644 index 0000000..4e96146 --- /dev/null +++ b/_site/index.html @@ -0,0 +1,100 @@ + + + + + + My Lang — my-lang.net + + + + + + + + + +
+ + +
+
+
✨ Casket-SSG Verified Generation
+

My Lang

+

My-Lang — Next-generation customizable multi-dialect parsing framework

+ +
+ +
+
+
+

Type-Safe Pipelines

+

Built on robust functional principles and verifiable compilation contracts to guarantee runtime safety and absolute execution reliability.

+
+
+
🔒
+

Sovereign Autonomy

+

Engineered for decentralized infrastructure, incorporating modern zero-trust capability gates and cryptographic attestation headers.

+
+
+
🚀
+

High-Fidelity Speed

+

Optimized for rapid processing and lightweight compilation, ensuring minimal overhead and ultra-fast edge propagation.

+
+
+ +
+

Architectural Foundation

+
+

:toc: macro

+

:toclevels: 2

+

:icons: font

+

:source-highlighter: rouge

+

[.lead]

+

*Let learning unfold. Let types guard. Let agents compose.*

+

Progressive-disclosure programming language with first-class AI integration—four dialects scaling from visual blocks to agentic orchestration.

+

'''

+

toc::[]

+

Who This Is For

+

[cols="1,3"]

+

|===

+

|*Me-curious* |Educators seeking visual programming that secretly teaches affine types and reversible computation

+

|*Solo practitioners* |Developers wanting Rust-level safety with Python-level approachability—human-first, AI-assisted

+

|*Duet partners* |Teams exploring balanced human-AI pair programming with explicit collaboration protocols

+

|*Ensemble conductors* |Architects orchestrating multi-agent systems with neurosymbolic grammar extensions

+

|===

+

The Four Dialects

+

My is not four languages—it is one language with *progressive reveal*. Concepts introduced as playful metaphors in Me unmask their CS foundations as learners advance.

+

[cols="1,1,2,2"]

+

|===

+

|Dialect |Stage |Mode |Core Insight

+

|*Me*

+

|Visual (ages 8-12)

+

|Blockly-like drag-and-drop

+

|Resources as colored tokens; affine types as "use once" rules

+

|*Solo*

+

|Text (ages 13+)

+

|Human-first, AI-assists

+
+
+
+ +
+ +
+ + diff --git a/assets/style.css b/assets/style.css new file mode 100644 index 0000000..1a44bde --- /dev/null +++ b/assets/style.css @@ -0,0 +1,303 @@ +/* Premium Casket-SSG Design System */ +:root { + --primary: #6366f1; + --primary-hover: #4f46e5; + --secondary: #a855f7; + --accent: #ec4899; + --text-main: #f8fafc; + --text-muted: #94a3b8; + --bg-base: #0f172a; + --bg-surface: rgba(30, 41, 59, 0.7); + --border-glass: rgba(255, 255, 255, 0.1); + --font-heading: 'Outfit', sans-serif; + --font-body: 'Inter', sans-serif; +} + +@media (prefers-color-scheme: light) { + :root { + --text-main: #0f172a; + --text-muted: #64748b; + --bg-base: #f8fafc; + --bg-surface: rgba(255, 255, 255, 0.8); + --border-glass: rgba(0, 0, 0, 0.1); + } +} + +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: var(--font-body); + color: var(--text-main); + background-color: var(--bg-base); + line-height: 1.6; + overflow-x: hidden; + position: relative; +} + +.glow-bg { + position: absolute; + top: 0; + left: 50%; + transform: translateX(-50%); + width: 100vw; + height: 800px; + background: radial-gradient(circle 600px at 50% 200px, rgba(99, 102, 241, 0.15), transparent 80%); + z-index: -1; + pointer-events: none; +} + +.container { + max-width: 1200px; + margin: 0 auto; + padding: 0 2rem; +} + +/* Header & Nav */ +.site-header { + backdrop-filter: blur(12px); + -webkit-backdrop-filter: blur(12px); + background: transparent; + border-bottom: 1px solid var(--border-glass); + position: sticky; + top: 0; + z-index: 100; +} + +.nav { + display: flex; + justify-content: space-between; + align-items: center; + height: 5rem; +} + +.brand { + font-family: var(--font-heading); + font-size: 1.5rem; + font-weight: 800; + text-decoration: none; + background: linear-gradient(135deg, var(--primary), var(--secondary)); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + transition: opacity 0.2s; +} + +.brand:hover { + opacity: 0.9; +} + +.nav-links { + display: flex; + align-items: center; + gap: 2rem; +} + +.nav-link { + color: var(--text-muted); + text-decoration: none; + font-weight: 500; + transition: color 0.2s; +} + +.nav-link:hover { + color: var(--text-main); +} + +/* Buttons */ +.btn-primary, .btn-secondary { + display: inline-flex; + align-items: center; + justify-content: center; + padding: 0.75rem 1.5rem; + font-weight: 600; + text-decoration: none; + border-radius: 0.5rem; + transition: all 0.2s ease-in-out; + cursor: pointer; +} + +.btn-primary { + background: linear-gradient(135deg, var(--primary), var(--secondary)); + color: #ffffff; + border: none; + box-shadow: 0 4px 15px rgba(99, 102, 241, 0.3); +} + +.btn-primary:hover { + transform: translateY(-2px); + box-shadow: 0 6px 20px rgba(99, 102, 241, 0.4); +} + +.btn-secondary { + background: var(--bg-surface); + color: var(--text-main); + border: 1px solid var(--border-glass); + backdrop-filter: blur(8px); +} + +.btn-secondary:hover { + background: rgba(255, 255, 255, 0.1); + transform: translateY(-2px); +} + +.large { + padding: 1rem 2rem; + font-size: 1.1rem; +} + +/* Hero Section */ +.hero { + text-align: center; + padding: 8rem 0 6rem; + max-width: 800px; + margin: 0 auto; +} + +.hero-badge { + display: inline-block; + padding: 0.5rem 1rem; + font-size: 0.875rem; + font-weight: 600; + color: var(--secondary); + background: rgba(168, 85, 247, 0.1); + border: 1px solid rgba(168, 85, 247, 0.2); + border-radius: 2rem; + margin-bottom: 2rem; +} + +.hero h1 { + font-family: var(--font-heading); + font-size: 4rem; + font-weight: 800; + line-height: 1.1; + margin-bottom: 1.5rem; + background: linear-gradient(135deg, #ffffff 30%, var(--text-muted)); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; +} + +@media (prefers-color-scheme: light) { + .hero h1 { + background: linear-gradient(135deg, #0f172a 30%, var(--primary)); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + } +} + +.hero-subtitle { + font-size: 1.25rem; + color: var(--text-muted); + margin-bottom: 3rem; +} + +.cta-group { + display: flex; + justify-content: center; + gap: 1.5rem; +} + +/* Feature Grid */ +.grid-features { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); + gap: 2rem; + margin-bottom: 6rem; +} + +.glass { + background: var(--bg-surface); + backdrop-filter: blur(16px); + -webkit-backdrop-filter: blur(16px); + border: 1px solid var(--border-glass); + border-radius: 1rem; + padding: 2.5rem; + box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2); + transition: transform 0.3s ease, border-color 0.3s ease; +} + +.glass:hover { + transform: translateY(-4px); + border-color: var(--secondary); +} + +.card-icon { + font-size: 2.5rem; + margin-bottom: 1.5rem; +} + +.card h3 { + font-family: var(--font-heading); + font-size: 1.5rem; + margin-bottom: 1rem; + color: var(--text-main); +} + +.card p { + color: var(--text-muted); +} + +/* Content Section */ +.content-section { + margin-bottom: 8rem; +} + +.content-section h2 { + font-family: var(--font-heading); + font-size: 2.5rem; + margin-bottom: 2rem; + background: linear-gradient(135deg, var(--primary), var(--secondary)); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; +} + +.prose h3 { + font-family: var(--font-heading); + font-size: 1.5rem; + margin: 2rem 0 1rem; +} + +.prose p { + color: var(--text-muted); + margin-bottom: 1.5rem; +} + +.prose pre { + background: #0b0f19; + border: 1px solid var(--border-glass); + padding: 1.5rem; + border-radius: 0.5rem; + overflow-x: auto; + margin: 2rem 0; +} + +.prose code { + font-family: monospace; + color: #38bdf8; +} + +/* Footer */ +.site-footer { + border-top: 1px solid var(--border-glass); + padding: 4rem 0; + text-align: center; +} + +.footer-content { + display: flex; + flex-direction: column; + gap: 1rem; +} + +.muted { + color: var(--text-muted); + font-size: 0.9rem; +} + +@media (max-width: 768px) { + .hero h1 { font-size: 2.5rem; } + .nav-links { display: none; } + .cta-group { flex-direction: column; } +} diff --git a/config.yaml b/config.yaml new file mode 100644 index 0000000..0a1478b --- /dev/null +++ b/config.yaml @@ -0,0 +1,6 @@ +title: My Lang +url: https://my-lang.net +author: Jonathan D.A. Jewell +input: site +output: _site +language: en diff --git a/site/index.md b/site/index.md index c5b9e9b..9b448b1 100644 --- a/site/index.md +++ b/site/index.md @@ -1,21 +1,8 @@ --- -title: My: Progressive AI-Native Language -date: 2026-03-31 +title: My Lang +date: 2026-06-29 --- -# My: Progressive AI-Native Language +# My Lang -The public web home for this project is [my-lang.net](https://my-lang.net). - -Let learning unfold. Let types guard. Let agents compose. - -My is not four languages—it is one language with progressive reveal. Concepts introduced as playful metaphors in Me unmask their CS foundations as learners advance. - -## Project Links - -- Website: [my-lang.net](https://my-lang.net) -- Source: [https://github.com/hyperpolymath/my-lang](https://github.com/hyperpolymath/my-lang) -- README: [project overview](https://github.com/hyperpolymath/my-lang/blob/main/README.adoc) -- Docs: [documentation directory](https://github.com/hyperpolymath/my-lang/tree/main/docs) - -This page is a lightweight landing point for the repository and will grow with the project. +My-Lang — Next-generation customizable multi-dialect parsing framework diff --git a/templates/default.html b/templates/default.html new file mode 100644 index 0000000..b5e4505 --- /dev/null +++ b/templates/default.html @@ -0,0 +1,72 @@ + + + + + + {title} — {domain} + + + + + + + + + +
+ + +
+
+
✨ Casket-SSG Verified Generation
+

{title}

+

{description}

+ +
+ +
+
+
+

Type-Safe Pipelines

+

Built on robust functional principles and verifiable compilation contracts to guarantee runtime safety and absolute execution reliability.

+
+
+
🔒
+

Sovereign Autonomy

+

Engineered for decentralized infrastructure, incorporating modern zero-trust capability gates and cryptographic attestation headers.

+
+
+
🚀
+

High-Fidelity Speed

+

Optimized for rapid processing and lightweight compilation, ensuring minimal overhead and ultra-fast edge propagation.

+
+
+ +
+

Architectural Foundation

+
+ {content_html} +
+
+
+ + + + diff --git a/templates/modern.css b/templates/modern.css new file mode 100644 index 0000000..1a44bde --- /dev/null +++ b/templates/modern.css @@ -0,0 +1,303 @@ +/* Premium Casket-SSG Design System */ +:root { + --primary: #6366f1; + --primary-hover: #4f46e5; + --secondary: #a855f7; + --accent: #ec4899; + --text-main: #f8fafc; + --text-muted: #94a3b8; + --bg-base: #0f172a; + --bg-surface: rgba(30, 41, 59, 0.7); + --border-glass: rgba(255, 255, 255, 0.1); + --font-heading: 'Outfit', sans-serif; + --font-body: 'Inter', sans-serif; +} + +@media (prefers-color-scheme: light) { + :root { + --text-main: #0f172a; + --text-muted: #64748b; + --bg-base: #f8fafc; + --bg-surface: rgba(255, 255, 255, 0.8); + --border-glass: rgba(0, 0, 0, 0.1); + } +} + +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: var(--font-body); + color: var(--text-main); + background-color: var(--bg-base); + line-height: 1.6; + overflow-x: hidden; + position: relative; +} + +.glow-bg { + position: absolute; + top: 0; + left: 50%; + transform: translateX(-50%); + width: 100vw; + height: 800px; + background: radial-gradient(circle 600px at 50% 200px, rgba(99, 102, 241, 0.15), transparent 80%); + z-index: -1; + pointer-events: none; +} + +.container { + max-width: 1200px; + margin: 0 auto; + padding: 0 2rem; +} + +/* Header & Nav */ +.site-header { + backdrop-filter: blur(12px); + -webkit-backdrop-filter: blur(12px); + background: transparent; + border-bottom: 1px solid var(--border-glass); + position: sticky; + top: 0; + z-index: 100; +} + +.nav { + display: flex; + justify-content: space-between; + align-items: center; + height: 5rem; +} + +.brand { + font-family: var(--font-heading); + font-size: 1.5rem; + font-weight: 800; + text-decoration: none; + background: linear-gradient(135deg, var(--primary), var(--secondary)); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + transition: opacity 0.2s; +} + +.brand:hover { + opacity: 0.9; +} + +.nav-links { + display: flex; + align-items: center; + gap: 2rem; +} + +.nav-link { + color: var(--text-muted); + text-decoration: none; + font-weight: 500; + transition: color 0.2s; +} + +.nav-link:hover { + color: var(--text-main); +} + +/* Buttons */ +.btn-primary, .btn-secondary { + display: inline-flex; + align-items: center; + justify-content: center; + padding: 0.75rem 1.5rem; + font-weight: 600; + text-decoration: none; + border-radius: 0.5rem; + transition: all 0.2s ease-in-out; + cursor: pointer; +} + +.btn-primary { + background: linear-gradient(135deg, var(--primary), var(--secondary)); + color: #ffffff; + border: none; + box-shadow: 0 4px 15px rgba(99, 102, 241, 0.3); +} + +.btn-primary:hover { + transform: translateY(-2px); + box-shadow: 0 6px 20px rgba(99, 102, 241, 0.4); +} + +.btn-secondary { + background: var(--bg-surface); + color: var(--text-main); + border: 1px solid var(--border-glass); + backdrop-filter: blur(8px); +} + +.btn-secondary:hover { + background: rgba(255, 255, 255, 0.1); + transform: translateY(-2px); +} + +.large { + padding: 1rem 2rem; + font-size: 1.1rem; +} + +/* Hero Section */ +.hero { + text-align: center; + padding: 8rem 0 6rem; + max-width: 800px; + margin: 0 auto; +} + +.hero-badge { + display: inline-block; + padding: 0.5rem 1rem; + font-size: 0.875rem; + font-weight: 600; + color: var(--secondary); + background: rgba(168, 85, 247, 0.1); + border: 1px solid rgba(168, 85, 247, 0.2); + border-radius: 2rem; + margin-bottom: 2rem; +} + +.hero h1 { + font-family: var(--font-heading); + font-size: 4rem; + font-weight: 800; + line-height: 1.1; + margin-bottom: 1.5rem; + background: linear-gradient(135deg, #ffffff 30%, var(--text-muted)); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; +} + +@media (prefers-color-scheme: light) { + .hero h1 { + background: linear-gradient(135deg, #0f172a 30%, var(--primary)); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + } +} + +.hero-subtitle { + font-size: 1.25rem; + color: var(--text-muted); + margin-bottom: 3rem; +} + +.cta-group { + display: flex; + justify-content: center; + gap: 1.5rem; +} + +/* Feature Grid */ +.grid-features { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); + gap: 2rem; + margin-bottom: 6rem; +} + +.glass { + background: var(--bg-surface); + backdrop-filter: blur(16px); + -webkit-backdrop-filter: blur(16px); + border: 1px solid var(--border-glass); + border-radius: 1rem; + padding: 2.5rem; + box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2); + transition: transform 0.3s ease, border-color 0.3s ease; +} + +.glass:hover { + transform: translateY(-4px); + border-color: var(--secondary); +} + +.card-icon { + font-size: 2.5rem; + margin-bottom: 1.5rem; +} + +.card h3 { + font-family: var(--font-heading); + font-size: 1.5rem; + margin-bottom: 1rem; + color: var(--text-main); +} + +.card p { + color: var(--text-muted); +} + +/* Content Section */ +.content-section { + margin-bottom: 8rem; +} + +.content-section h2 { + font-family: var(--font-heading); + font-size: 2.5rem; + margin-bottom: 2rem; + background: linear-gradient(135deg, var(--primary), var(--secondary)); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; +} + +.prose h3 { + font-family: var(--font-heading); + font-size: 1.5rem; + margin: 2rem 0 1rem; +} + +.prose p { + color: var(--text-muted); + margin-bottom: 1.5rem; +} + +.prose pre { + background: #0b0f19; + border: 1px solid var(--border-glass); + padding: 1.5rem; + border-radius: 0.5rem; + overflow-x: auto; + margin: 2rem 0; +} + +.prose code { + font-family: monospace; + color: #38bdf8; +} + +/* Footer */ +.site-footer { + border-top: 1px solid var(--border-glass); + padding: 4rem 0; + text-align: center; +} + +.footer-content { + display: flex; + flex-direction: column; + gap: 1rem; +} + +.muted { + color: var(--text-muted); + font-size: 0.9rem; +} + +@media (max-width: 768px) { + .hero h1 { font-size: 2.5rem; } + .nav-links { display: none; } + .cta-group { flex-direction: column; } +}