diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..51b17e1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,20 @@ +# Secrets — never commit +*.env +.env +.env.* +!.env.example +*credentials* +*.pem +*.key + +# OS / editor +.DS_Store +Thumbs.db +*.swp +.idea/ +.vscode/ + +# Build artifacts +dist/ +*.zip +node_modules/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..6cb10ee --- /dev/null +++ b/README.md @@ -0,0 +1,54 @@ +# Phosphor + +A CRT / terminal **WordPress block theme** — green-on-black, monospace, subtle scanlines. +Minimal, fast, full-site-editing (FSE). Built for people who like their blog to look like a +warm CRT terminal that's *alive*. + +> Phosphor (n.) — the glowing coating on the inside of a cathode-ray tube. The green afterglow. + +## Status + +**v0.1.0 — early.** A clean, installable block-theme foundation extracted and generalized from a +live personal site. No personal data, no API keys, no third-party services — pure GPL theme. +The roadmap below tracks the road to a polished, sellable-grade product. + +## Install + +1. Download `phosphor.zip` from the [Releases](https://github.com/Jeuners/phosphor/releases) page. +2. WordPress Admin → **Appearance → Themes → Add New → Upload Theme** → choose the ZIP → Activate. + +Or clone and symlink the `theme/` folder into `wp-content/themes/phosphor`. + +## What's in here + +``` +theme/ # the Phosphor block theme (this is what gets zipped & installed) +plugins/ # optional companion plugins (CRT admin skin, coming-soon, …) — added incrementally +LICENSE # GPL-2.0-or-later +``` + +## Design tokens + +| Token | Value | +|---|---| +| Background | `#000000` | +| Text | `#ffffff` | +| Accent | `#00ff00` (CRT green) | +| Muted | `#666666` | +| Type | monospace (Courier / system mono) | + +All editable in the Site Editor (Styles) or `theme.json` — no code needed to rebrand. + +## Roadmap + +- [x] Clean block-theme foundation (theme.json, templates, parts, GPL) +- [ ] Companion plugin: CRT admin skin + coming-soon (genericized) +- [ ] Full i18n (`phosphor` text domain, `.pot`) +- [ ] Block patterns (hero, post grid, CRT cards) +- [ ] Customizer-free theming presets + style variations +- [ ] Demo content (WXR) + screenshot +- [ ] `readme.txt` to WordPress.org standard + +## License + +[GPL-2.0-or-later](LICENSE). Use it, fork it, sell services around it. diff --git a/theme/functions.php b/theme/functions.php new file mode 100644 index 0000000..b244d22 --- /dev/null +++ b/theme/functions.php @@ -0,0 +1,40 @@ + + + diff --git a/theme/parts/header.html b/theme/parts/header.html new file mode 100644 index 0000000..38bb07d --- /dev/null +++ b/theme/parts/header.html @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/theme/readme.txt b/theme/readme.txt new file mode 100644 index 0000000..5f4287d --- /dev/null +++ b/theme/readme.txt @@ -0,0 +1,34 @@ +=== Phosphor === +Contributors: phosphor +Requires at least: 6.4 +Tested up to: 6.7 +Requires PHP: 8.0 +Stable tag: 0.1.0 +License: GPLv2 or later +License URI: https://www.gnu.org/licenses/gpl-2.0.html +Tags: full-site-editing, blog, one-column, custom-colors, editor-style, block-patterns, dark-mode, accessibility-ready + +A CRT/terminal WordPress block theme — green-on-black, monospace, subtle scanlines. + +== Description == + +Phosphor is a minimal, fast full-site-editing block theme with a CRT/terminal aesthetic: +green-on-black, monospace type, optional scanline overlay, and a blinking-caret accent. +Everything is editable in the Site Editor (Styles) or theme.json — no code needed to rebrand. + +Features: +* Full Site Editing (block templates + template parts) +* CRT design tokens in theme.json (base, contrast, accent, muted, line) +* Optional scanline overlay (off by default; enable via the `phosphor_scanlines` filter) +* Blinking-caret utility class (`ph-caret`) +* Accessibility: honors prefers-reduced-motion + +== Installation == + +1. Appearance > Themes > Add New > Upload Theme. +2. Upload phosphor.zip and click Activate. + +== Changelog == + += 0.1.0 = +* Initial release: clean block-theme foundation (theme.json, templates, parts, GPL-2.0). diff --git a/theme/style.css b/theme/style.css new file mode 100644 index 0000000..803ef3e --- /dev/null +++ b/theme/style.css @@ -0,0 +1,77 @@ +/* +Theme Name: Phosphor +Theme URI: https://github.com/Jeuners/phosphor +Author: Phosphor +Author URI: https://github.com/Jeuners/phosphor +Description: A CRT/terminal WordPress block theme — green-on-black, monospace, subtle scanlines. Minimal, fast, full-site-editing. +Version: 0.1.0 +Requires at least: 6.4 +Tested up to: 6.7 +Requires PHP: 8.0 +License: GPL-2.0-or-later +License URI: https://www.gnu.org/licenses/gpl-2.0.html +Text Domain: phosphor +Tags: full-site-editing, blog, one-column, custom-colors, editor-style, block-patterns, dark-mode, accessibility-ready +*/ + +/* Phosphor — supplemental front-end styles. Design tokens live in theme.json. */ + +:root { + --ph-bg: #000; + --ph-fg: #fff; + --ph-accent: #00ff00; + --ph-muted: #666; + --ph-line: #1a1a1a; +} + +/* CRT scanline overlay — subtle, non-blocking */ +body.phosphor-scanlines::before { + content: ""; + position: fixed; + inset: 0; + pointer-events: none; + z-index: 9999; + background: repeating-linear-gradient( + 0deg, + rgba(0, 255, 80, 0.03) 0 1px, + transparent 1px 3px + ); + mix-blend-mode: screen; +} + +/* Links — CRT green with glow on hover */ +a { + color: var(--ph-accent); + text-decoration-thickness: 1px; + text-underline-offset: 0.2em; + transition: text-shadow 0.15s ease, opacity 0.15s ease; +} +a:hover { + text-shadow: 0 0 8px rgba(0, 255, 80, 0.5); +} + +/* Selection */ +::selection { + background: var(--ph-accent); + color: #000; +} + +/* Post title accent prompt */ +.wp-block-post-title a::before { + content: "\25B8\00a0"; /* ▸ */ + color: var(--ph-accent); + opacity: 0.7; +} + +/* Blinking caret utility (for headings/heroes) */ +.ph-caret::after { + content: "\2588"; /* █ */ + color: var(--ph-accent); + margin-left: 0.1em; + animation: ph-blink 1.05s steps(1) infinite; +} +@keyframes ph-blink { 50% { opacity: 0; } } + +@media (prefers-reduced-motion: reduce) { + .ph-caret::after { animation: none; } +} diff --git a/theme/templates/404.html b/theme/templates/404.html new file mode 100644 index 0000000..bd98262 --- /dev/null +++ b/theme/templates/404.html @@ -0,0 +1,17 @@ + + + + + + 404 — signal lost + + + + // the page you tried to reach is not on this channel. + + + + + + + diff --git a/theme/templates/archive.html b/theme/templates/archive.html new file mode 100644 index 0000000..3d80255 --- /dev/null +++ b/theme/templates/archive.html @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + // nothing here. + + + + + + + + + diff --git a/theme/templates/index.html b/theme/templates/index.html new file mode 100644 index 0000000..1246421 --- /dev/null +++ b/theme/templates/index.html @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + // nothing here yet. + + + + + + + + + diff --git a/theme/templates/page.html b/theme/templates/page.html new file mode 100644 index 0000000..e0d1bad --- /dev/null +++ b/theme/templates/page.html @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/theme/templates/search.html b/theme/templates/search.html new file mode 100644 index 0000000..5172e47 --- /dev/null +++ b/theme/templates/search.html @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + // no matches. + + + + + + + + + diff --git a/theme/templates/single.html b/theme/templates/single.html new file mode 100644 index 0000000..2ff472a --- /dev/null +++ b/theme/templates/single.html @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/theme/theme.json b/theme/theme.json new file mode 100644 index 0000000..12f6ec3 --- /dev/null +++ b/theme/theme.json @@ -0,0 +1,77 @@ +{ + "$schema": "https://schemas.wp.org/trunk/theme.json", + "version": 3, + "settings": { + "appearanceTools": true, + "useRootPaddingAwareAlignments": true, + "layout": { + "contentSize": "720px", + "wideSize": "1100px" + }, + "color": { + "defaultPalette": false, + "custom": true, + "palette": [ + { "slug": "base", "color": "#000000", "name": "Base" }, + { "slug": "contrast", "color": "#ffffff", "name": "Contrast" }, + { "slug": "accent", "color": "#00ff00", "name": "Accent (CRT green)" }, + { "slug": "muted", "color": "#666666", "name": "Muted" }, + { "slug": "line", "color": "#1a1a1a", "name": "Line" } + ] + }, + "typography": { + "defaultFontSizes": false, + "fluid": true, + "fontFamilies": [ + { + "slug": "mono", + "name": "Monospace", + "fontFamily": "'Courier New', Courier, ui-monospace, monospace" + }, + { + "slug": "sans", + "name": "System Sans", + "fontFamily": "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif" + } + ], + "fontSizes": [ + { "slug": "small", "size": "0.875rem", "name": "Small" }, + { "slug": "medium", "size": "1rem", "name": "Medium" }, + { "slug": "large", "size": "1.5rem", "name": "Large" }, + { "slug": "xlarge", "size": "clamp(2rem, 8vw, 6rem)", "name": "XL Hero" } + ] + }, + "spacing": { + "units": ["px", "em", "rem", "vh", "vw", "%"], + "spacingScale": { "steps": 7 } + } + }, + "styles": { + "color": { + "background": "var(--wp--preset--color--base)", + "text": "var(--wp--preset--color--contrast)" + }, + "typography": { + "fontFamily": "var(--wp--preset--font-family--mono)", + "fontSize": "var(--wp--preset--font-size--medium)", + "lineHeight": "1.6", + "letterSpacing": "0.02em" + }, + "elements": { + "link": { + "color": { "text": "var(--wp--preset--color--accent)" }, + ":hover": { "typography": { "textDecoration": "underline" } } + }, + "h1": { "typography": { "fontSize": "var(--wp--preset--font-size--xlarge)", "lineHeight": "1.1", "letterSpacing": "-0.02em" } }, + "h2": { "typography": { "fontSize": "var(--wp--preset--font-size--large)", "lineHeight": "1.2" } } + }, + "blocks": { + "core/post-title": { "typography": { "fontWeight": "500" } } + } + }, + "templateParts": [ + { "name": "header", "title": "Header", "area": "header" }, + { "name": "footer", "title": "Footer", "area": "footer" } + ], + "customTemplates": [] +}
// the page you tried to reach is not on this channel.
// nothing here.
// nothing here yet.
// no matches.