diff --git a/public/css/gallery.css b/public/css/gallery.css
index 8cba30f54..6f3b52eb7 100644
--- a/public/css/gallery.css
+++ b/public/css/gallery.css
@@ -318,6 +318,64 @@
}
+/* Coming Soon States */
+.skill-nav-item.coming-soon,
+.command-nav-item.coming-soon {
+ opacity: 0.7;
+}
+
+.coming-soon-badge {
+ display: inline-block;
+ font-size: 0.5625rem;
+ font-weight: 600;
+ text-transform: uppercase;
+ letter-spacing: 0.05em;
+ padding: 2px 5px;
+ background: var(--c-mist);
+ color: var(--c-ash);
+ border-radius: 2px;
+ margin-left: var(--s-xs);
+ vertical-align: middle;
+}
+
+.coming-soon-showcase {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ text-align: center;
+ padding: var(--s-2xl);
+ min-height: 300px;
+}
+
+.coming-soon-icon {
+ color: var(--c-mist);
+ margin-bottom: var(--s-lg);
+}
+
+.coming-soon-showcase h3 {
+ font-family: var(--font-display);
+ font-size: 1.75rem;
+ font-weight: 300;
+ font-style: italic;
+ margin: 0 0 var(--s-sm) 0;
+ color: var(--c-text);
+}
+
+.coming-soon-text {
+ font-size: 1rem;
+ color: var(--c-accent);
+ font-weight: 500;
+ margin-bottom: var(--s-md);
+}
+
+.coming-soon-showcase .skill-description {
+ max-width: 50ch;
+ color: var(--c-ash);
+ font-size: 0.9375rem;
+ line-height: 1.6;
+}
+
/* Animation */
@keyframes fadeIn {
from {
@@ -331,6 +389,7 @@
}
.skills-showcase,
-.command-detail-panel {
+.command-detail-panel,
+.coming-soon-showcase {
animation: fadeIn 0.4s cubic-bezier(0.4, 0, 0.2, 1);
}
diff --git a/public/js/commands.js b/public/js/commands.js
index d756d290d..7fc4eae7c 100644
--- a/public/js/commands.js
+++ b/public/js/commands.js
@@ -7,12 +7,18 @@ import {
commandCategories,
commandProcessSteps,
commandRelationships,
+ readyCommands,
} from "./data.js";
import { setupCommandDemoToggles } from "./demo-toggles.js";
let currentCommand = null;
let currentCategory = "all";
+// Check if a command is ready for public use
+function isCommandReady(id) {
+ return readyCommands.includes(id);
+}
+
export function renderWorkflowDiagram(allCommands, onSelectCommand) {
const container = document.getElementById("workflow-diagram");
if (!container) return;
@@ -24,18 +30,23 @@ export function renderWorkflowDiagram(allCommands, onSelectCommand) {
system: ['extract', 'onboard']
};
+ const renderNavItem = (id) => {
+ const ready = isCommandReady(id);
+ return ``;
+ };
+
container.innerHTML = `
Production
- ${groups.production.map(id => ``).join('')}
+ ${groups.production.map(renderNavItem).join('')}
Aesthetic
- ${groups.aesthetic.map(id => ``).join('')}
+ ${groups.aesthetic.map(renderNavItem).join('')}
System
- ${groups.system.map(id => ``).join('')}
+ ${groups.system.map(renderNavItem).join('')}
`;
@@ -116,6 +127,23 @@ function renderCommandDetail(command) {
const relationships = commandRelationships[command.id] || {};
const steps = commandProcessSteps[command.id] || [];
const category = commandCategories[command.id] || "other";
+ const ready = isCommandReady(command.id);
+
+ // Coming soon placeholder for incomplete commands
+ if (!ready) {
+ return `
+
+
+
/${command.id}
+
This command is being refined and will be available soon.
+
${command.description}
+
+ `;
+ }
return `
diff --git a/public/js/data.js b/public/js/data.js
index f4e606226..fadc76682 100644
--- a/public/js/data.js
+++ b/public/js/data.js
@@ -2,6 +2,16 @@
// DATA: Skill focus areas, command processes, relationships
// ============================================
+// Items that are fully complete and ready for public use
+// All others will show "Coming Soon"
+export const readySkills = [
+ // None ready yet - all skills are still being refined
+];
+
+export const readyCommands = [
+ 'normalize' // First command to be fully completed
+];
+
export const skillFocusAreas = {
'typography': [
{ area: 'Scale & Rhythm', detail: 'Harmonious systems' },
diff --git a/public/js/skills.js b/public/js/skills.js
index 462f49237..9b725c144 100644
--- a/public/js/skills.js
+++ b/public/js/skills.js
@@ -2,7 +2,7 @@
// SKILLS - Rendering and selection logic
// ============================================
-import { skillFocusAreas } from "./data.js";
+import { skillFocusAreas, readySkills } from "./data.js";
import { setupDemoToggles } from "./demo-toggles.js";
import { renderSkillDemo, setupDemoTabs } from "./skill-demos.js";
@@ -20,6 +20,11 @@ function formatSkillName(id) {
.join(" ");
}
+// Check if a skill is ready for public use
+function isSkillReady(id) {
+ return readySkills.includes(id);
+}
+
// Filter out frontend-design (Anthropic's skill, not ours)
function filterSkills(skills) {
return skills.filter((s) => s.id !== "frontend-design");
@@ -34,8 +39,9 @@ export function renderSkillsNav(skills, onSelect) {
nav.innerHTML = filteredSkills
.map(
(skill) => `
-