fix: strip Anishinaabe-mowin from master PRD; rename shared module
Browse filesThe master llms.txt PRD is consumed by agents and must be English-only.
Anishinaabe aesthetic content remains in projects/* (READMEs, app code,
in-UI strings) as an artistic choice, but is removed from the PRD-layer:
- llms.txt: rewrote Overview/Rules/Infrastructure/Projects/TODO/Goals/Reference
to English-only, renamed 'Aesthetic' to 'Cedar-Copper Edition'.
- shared/anishinaabe_solarpunk.py → shared/cedar_copper_tokens.py
Module is not imported by any project; rename for clarity.
- Renamed CSS variables --asp-* → --cc-* in the shared module.
- Renamed header() docstring and WELCOME/PIP_GREETING constants.
- Note: project UIs and READMEs retain the Anishinaabe aesthetic per
the original artistic direction.
All 3 apps still running on ports 7861/7862/7863 (verified HTTP 200).
Co-Authored-By: Nanoboozhoo <nanoboozhoo@git-aaaki>
- llms.txt +39 -44
- shared/{anishinaabe_solarpunk.py → cedar_copper_tokens.py} +61 -67
|
@@ -1,60 +1,61 @@
|
|
| 1 |
-
#
|
| 2 |
# Project Requirements Document
|
| 3 |
|
| 4 |
-
>
|
| 5 |
> Hack window: June 5-15, 2026. Deadline: June 15.
|
| 6 |
-
|
|
|
|
|
|
|
|
|
|
| 7 |
|
| 8 |
---
|
| 9 |
|
| 10 |
-
##
|
| 11 |
|
| 12 |
- **Name:** Build Small Hackathon 2026 — Team nbiish
|
| 13 |
-
- **Version:** 0.4.0 —
|
| 14 |
- **Description:** Multi-project hackathon entry targeting $48K+ prize pool across Backyard AI and Thousand Token Wood tracks. Three Gradio apps using small models (≤32B) with maximum bonus badge coverage.
|
| 15 |
-
- **Aesthetic:**
|
| 16 |
- **Purpose:** Win prizes across tracks, badges, and sponsor categories by building delightful, useful AI apps that run locally.
|
| 17 |
- **UX:** Gradio web apps (gr.Blocks + mount_gradio_app custom frontends), hosted on HF Spaces.
|
| 18 |
-
- **Shared tokens module:** `shared/anishinaabe_solarpunk.py` — design tokens reusable across all 3 apps.
|
| 19 |
|
| 20 |
---
|
| 21 |
|
| 22 |
-
##
|
| 23 |
|
| 24 |
-
###
|
| 25 |
|
| 26 |
- Descriptive project names: CritterCalm, FocusFriend, TinyBard
|
| 27 |
- Docstrings on all public functions. Comments on non-obvious logic.
|
| 28 |
-
- Bilingual English + Anishinaabemowin where natural (without appropriation — use Aaniin for greetings, descriptive terms for features).
|
| 29 |
|
| 30 |
-
###
|
| 31 |
|
| 32 |
- Models ≤ 32B total params per project
|
| 33 |
- Gradio app hosted as HF Space
|
| 34 |
- Local-first (no cloud APIs = Off the Grid badge)
|
| 35 |
- GGUF quantized models for local inference
|
| 36 |
- Python 3.10+ with pinned requirements
|
| 37 |
-
-
|
| 38 |
|
| 39 |
-
###
|
| 40 |
|
| 41 |
- Cloud API calls in production path
|
| 42 |
- Hardcoded secrets or API keys
|
| 43 |
- Models > 32B params
|
| 44 |
- Default Gradio look without customization attempt
|
| 45 |
|
| 46 |
-
###
|
| 47 |
|
| 48 |
-
- If custom frontend is feasible → use mount_gradio_app for Off-Brand badge
|
| 49 |
- If model ≤ 4B → tag Tiny Titan eligible
|
| 50 |
- If using llama.cpp runtime → tag Llama Champion
|
| 51 |
- If fine-tuning is done → publish model to HF Hub
|
| 52 |
|
| 53 |
---
|
| 54 |
|
| 55 |
-
##
|
| 56 |
|
| 57 |
-
###
|
| 58 |
|
| 59 |
- `gradio.Server` is **NOT** in Gradio 6.0 stable. Use `mount_gradio_app(fastapi_app, blocks, path="/gradio")` instead.
|
| 60 |
- MCP server mode: `demo.launch(mcp_server=True)` or `GRADIO_MCP_SERVER=true` env var.
|
|
@@ -63,15 +64,16 @@
|
|
| 63 |
- Theme parameters: `css`, `head`, `theme` moved from `gr.Blocks(...)` to `app.launch(...)` in Gradio 6.0.
|
| 64 |
- Chatbot API: Gradio 6.0 requires `{"role": "user|assistant", "content": "..."}` dicts (not tuples).
|
| 65 |
|
| 66 |
-
###
|
| 67 |
|
| 68 |
- `hf` CLI is installed (v1.18.0). See `skill://hf-cli` for full command reference.
|
| 69 |
- Install expert skills: `hf skills add --global` or `hf skills add --claude --global`.
|
| 70 |
- Spaces managed via: `hf repos create <name> --type space --space-sdk gradio --public`.
|
| 71 |
- Deploy: `git remote add hf https://huggingface.co/spaces/<user>/<space>` then `git push hf main`.
|
| 72 |
- HF README metadata: `colorTo` must be one of `[red, yellow, green, blue, indigo, purple, pink, gray]` (no `emerald`/`amber`).
|
|
|
|
| 73 |
|
| 74 |
-
###
|
| 75 |
|
| 76 |
- Python: miniconda3 (Python 3.12)
|
| 77 |
- Gradio: 6.0.0
|
|
@@ -82,7 +84,7 @@
|
|
| 82 |
- LFM2-8B-A1B-Q4_K_M.gguf (in ggufy/models/)
|
| 83 |
- Missing GGUF models (need download): Gemma 4 12B, Dolphin-X1-8B
|
| 84 |
|
| 85 |
-
###
|
| 86 |
|
| 87 |
All 3 apps run simultaneously on different ports for visual inspection:
|
| 88 |
|
|
@@ -94,20 +96,20 @@ All 3 apps run simultaneously on different ports for visual inspection:
|
|
| 94 |
|
| 95 |
---
|
| 96 |
|
| 97 |
-
##
|
| 98 |
|
| 99 |
-
###
|
| 100 |
|
| 101 |
-
- **Status:** Code complete. Deployed. Locally tested.
|
| 102 |
- **Stack:** OmniVoice (0.6B) + Dolphin-X1-8B (8B) + Kokoro TTS (82M) = 8.7B params
|
| 103 |
- **Badges:** Off the Grid, Well-Tuned (TBD), Field Notes, Llama Champion (TBD), Off-Brand (custom banner)
|
| 104 |
- **GitHub:** github.com/nbiish/crittercalm
|
| 105 |
- **HF Space:** huggingface.co/spaces/nbiish/crittercalm
|
| 106 |
- **Standalone repo:** /Volumes/1tb-sandisk/code-external/crittercalm-repo
|
| 107 |
|
| 108 |
-
###
|
| 109 |
|
| 110 |
-
- **Status:** Code complete. Deployed. Locally tested.
|
| 111 |
- **Stack:** Gemma 4 12B (12B) via llama-cpp-python
|
| 112 |
- **Badges:** Off-Brand (sun-amber custom theme), Off the Grid, Field Notes
|
| 113 |
- **GitHub:** github.com/nbiish/focusfriend
|
|
@@ -115,13 +117,12 @@ All 3 apps run simultaneously on different ports for visual inspection:
|
|
| 115 |
- **Standalone repo:** /Volumes/1tb-sandisk/code-external/focusfriend-repo
|
| 116 |
- **Note:** Gemma 4 12B GGUF not yet downloaded. Need `huggingface-cli download unsloth/gemma-4-12b-it-GGUF --include "gemma-4-12b-it-Q4_K_M.gguf" --local-dir ./models`
|
| 117 |
|
| 118 |
-
###
|
| 119 |
|
| 120 |
-
- **Status:** Code complete. Deployed. Locally tested end-to-end (game loop).
|
| 121 |
- **Concept:** ≤4B LLM generates 5-min interactive text adventures in a CRT terminal aesthetic.
|
| 122 |
- **Stack:** VibeThinker 1.5B (1.5B) via llama-cpp-python + procedural fallback engine
|
| 123 |
- **Architecture:** FastAPI + mount_gradio_app at /gradio. Custom HTML/CSS/JS frontend. MCP tools: start_game, make_choice.
|
| 124 |
-
- **Bilingual UI labels:** NOOSISKAAZOWIN (health), MII-GIIWETA (connected), AADIZOOKAAN (fantasy), ISHPIMING (sci-fi), MASHKODEWAAZIBI (cyberpunk).
|
| 125 |
- **Badges:** Llama Champion, Tiny Titan (1.5B < 4B), Off-Brand (custom CRT), Off the Grid, Field Notes
|
| 126 |
- **Prize targets:** Tiny Titan ($1K), Thousand Token Wood track, Bonus Quest Champion potential
|
| 127 |
- **GitHub:** github.com/nbiish/tinybard
|
|
@@ -130,13 +131,12 @@ All 3 apps run simultaneously on different ports for visual inspection:
|
|
| 130 |
|
| 131 |
---
|
| 132 |
|
| 133 |
-
##
|
| 134 |
|
| 135 |
> Keep tasks atomic and testable.
|
| 136 |
|
| 137 |
-
###
|
| 138 |
|
| 139 |
-
- [x] ~~Download Gemma 4 12B and Dolphin-X1-8B GGUF models~~ → blocked: not yet in dev plan
|
| 140 |
- [ ] Test CritterCalm voice cloning pipeline end-to-end
|
| 141 |
- [ ] Test FocusFriend all 4 modes (Chat, Focus, Breathe, Meditate) with real model
|
| 142 |
- [ ] Record demo videos (2-3 min each)
|
|
@@ -144,10 +144,10 @@ All 3 apps run simultaneously on different ports for visual inspection:
|
|
| 144 |
- [ ] Write Field Notes blog posts (3 — one per project)
|
| 145 |
- [ ] Share agent traces to HF Hub (Sharing is Caring badge)
|
| 146 |
|
| 147 |
-
###
|
| 148 |
|
| 149 |
-
- [x] CritterCalm v1 code complete (11 files) —
|
| 150 |
-
- [x] FocusFriend v1 code complete (16 files) —
|
| 151 |
- [x] TinyBard v1 code complete (8 files) — LLM + procedural fallback, CRT UI, clean FastAPI JSON
|
| 152 |
- [x] GitHub repos created (nbiish/crittercalm, nbiish/focusfriend, nbiish/tinybard)
|
| 153 |
- [x] HF Spaces created and deployed (all 3)
|
|
@@ -163,27 +163,22 @@ All 3 apps run simultaneously on different ports for visual inspection:
|
|
| 163 |
|
| 164 |
---
|
| 165 |
|
| 166 |
-
##
|
| 167 |
|
| 168 |
- Test all 3 apps locally with real GGUF models (currently running with procedural fallbacks)
|
| 169 |
- Record demo videos and post to social media
|
| 170 |
- Write and publish Field Notes blog posts
|
| 171 |
- Share agent traces for Sharing is Caring badge
|
| 172 |
-
-
|
| 173 |
|
| 174 |
---
|
| 175 |
|
| 176 |
-
##
|
| 177 |
|
| 178 |
- CritterCalm: projects/crittercalm/ + github.com/nbiish/crittercalm
|
| 179 |
- FocusFriend: projects/focusfriend/ + github.com/nbiish/focusfriend
|
| 180 |
- TinyBard: projects/tinybard/ + github.com/nbiish/tinybard
|
| 181 |
-
- Aesthetic module: shared/
|
| 182 |
- ML Intern: github.com/huggingface/ml-intern
|
| 183 |
- HF Agents CLI: huggingface.co/docs/hub/en/agents-cli
|
| 184 |
-
- Gradio MCP: gradio.app/guides/model-context-protocol
|
| 185 |
-
- Anishinaabe-Solarpunk styling guide: skill://anishinaabe-cyberpunk-style
|
| 186 |
-
|
| 187 |
-
---
|
| 188 |
-
|
| 189 |
-
◈──◆──◇ ☼ Anishinaabe Solarpunk Edition · Cedar Edition · v0.4.0 ◇──◆──◈
|
|
|
|
| 1 |
+
# Build Small Hackathon — PRD
|
| 2 |
# Project Requirements Document
|
| 3 |
|
| 4 |
+
> Three Gradio apps targeting all tracks + maximum badges + sponsor prizes.
|
| 5 |
> Hack window: June 5-15, 2026. Deadline: June 15.
|
| 6 |
+
|
| 7 |
+
> This file is the master PRD and stays English-only. Per-project UIs and
|
| 8 |
+
> READMEs may use additional stylistic content for their own artifacts; this
|
| 9 |
+
> doc does not enumerate those choices.
|
| 10 |
|
| 11 |
---
|
| 12 |
|
| 13 |
+
## Overview
|
| 14 |
|
| 15 |
- **Name:** Build Small Hackathon 2026 — Team nbiish
|
| 16 |
+
- **Version:** 0.4.0 — Cedar-Copper Edition
|
| 17 |
- **Description:** Multi-project hackathon entry targeting $48K+ prize pool across Backyard AI and Thousand Token Wood tracks. Three Gradio apps using small models (≤32B) with maximum bonus badge coverage.
|
| 18 |
+
- **Aesthetic:** Cedar-copper visual language — sky-to-sunrise palette (water-blue → cedar → copper → sun-amber → birch-cream), biophilic motifs, sky-to-water gradient banners. Shared CSS variables live in `shared/cedar_copper_tokens.py`.
|
| 19 |
- **Purpose:** Win prizes across tracks, badges, and sponsor categories by building delightful, useful AI apps that run locally.
|
| 20 |
- **UX:** Gradio web apps (gr.Blocks + mount_gradio_app custom frontends), hosted on HF Spaces.
|
|
|
|
| 21 |
|
| 22 |
---
|
| 23 |
|
| 24 |
+
## Rules
|
| 25 |
|
| 26 |
+
### Naming & Comments
|
| 27 |
|
| 28 |
- Descriptive project names: CritterCalm, FocusFriend, TinyBard
|
| 29 |
- Docstrings on all public functions. Comments on non-obvious logic.
|
|
|
|
| 30 |
|
| 31 |
+
### Always
|
| 32 |
|
| 33 |
- Models ≤ 32B total params per project
|
| 34 |
- Gradio app hosted as HF Space
|
| 35 |
- Local-first (no cloud APIs = Off the Grid badge)
|
| 36 |
- GGUF quantized models for local inference
|
| 37 |
- Python 3.10+ with pinned requirements
|
| 38 |
+
- Cedar-copper aesthetic consistency across all UIs (palette tokens in `shared/cedar_copper_tokens.py`)
|
| 39 |
|
| 40 |
+
### Never
|
| 41 |
|
| 42 |
- Cloud API calls in production path
|
| 43 |
- Hardcoded secrets or API keys
|
| 44 |
- Models > 32B params
|
| 45 |
- Default Gradio look without customization attempt
|
| 46 |
|
| 47 |
+
### If
|
| 48 |
|
| 49 |
+
- If custom frontend is feasible → use `mount_gradio_app` for Off-Brand badge
|
| 50 |
- If model ≤ 4B → tag Tiny Titan eligible
|
| 51 |
- If using llama.cpp runtime → tag Llama Champion
|
| 52 |
- If fine-tuning is done → publish model to HF Hub
|
| 53 |
|
| 54 |
---
|
| 55 |
|
| 56 |
+
## Infrastructure
|
| 57 |
|
| 58 |
+
### Gradio 6.0 + MCP Server
|
| 59 |
|
| 60 |
- `gradio.Server` is **NOT** in Gradio 6.0 stable. Use `mount_gradio_app(fastapi_app, blocks, path="/gradio")` instead.
|
| 61 |
- MCP server mode: `demo.launch(mcp_server=True)` or `GRADIO_MCP_SERVER=true` env var.
|
|
|
|
| 64 |
- Theme parameters: `css`, `head`, `theme` moved from `gr.Blocks(...)` to `app.launch(...)` in Gradio 6.0.
|
| 65 |
- Chatbot API: Gradio 6.0 requires `{"role": "user|assistant", "content": "..."}` dicts (not tuples).
|
| 66 |
|
| 67 |
+
### HF Agents CLI
|
| 68 |
|
| 69 |
- `hf` CLI is installed (v1.18.0). See `skill://hf-cli` for full command reference.
|
| 70 |
- Install expert skills: `hf skills add --global` or `hf skills add --claude --global`.
|
| 71 |
- Spaces managed via: `hf repos create <name> --type space --space-sdk gradio --public`.
|
| 72 |
- Deploy: `git remote add hf https://huggingface.co/spaces/<user>/<space>` then `git push hf main`.
|
| 73 |
- HF README metadata: `colorTo` must be one of `[red, yellow, green, blue, indigo, purple, pink, gray]` (no `emerald`/`amber`).
|
| 74 |
+
- HF README metadata: `emoji` must match `/\p{Extended_Pictographic}/u` — only the standard emoji block is allowed; decorative Unicode glyphs (solar/astrological/typographic symbols) fail validation. Use a real emoji.
|
| 75 |
|
| 76 |
+
### Local Test Environment
|
| 77 |
|
| 78 |
- Python: miniconda3 (Python 3.12)
|
| 79 |
- Gradio: 6.0.0
|
|
|
|
| 84 |
- LFM2-8B-A1B-Q4_K_M.gguf (in ggufy/models/)
|
| 85 |
- Missing GGUF models (need download): Gemma 4 12B, Dolphin-X1-8B
|
| 86 |
|
| 87 |
+
### Local Servers
|
| 88 |
|
| 89 |
All 3 apps run simultaneously on different ports for visual inspection:
|
| 90 |
|
|
|
|
| 96 |
|
| 97 |
---
|
| 98 |
|
| 99 |
+
## Projects
|
| 100 |
|
| 101 |
+
### 1. CritterCalm (Backyard AI)
|
| 102 |
|
| 103 |
+
- **Status:** Code complete. Deployed. Locally tested. Cedar-copper UI applied.
|
| 104 |
- **Stack:** OmniVoice (0.6B) + Dolphin-X1-8B (8B) + Kokoro TTS (82M) = 8.7B params
|
| 105 |
- **Badges:** Off the Grid, Well-Tuned (TBD), Field Notes, Llama Champion (TBD), Off-Brand (custom banner)
|
| 106 |
- **GitHub:** github.com/nbiish/crittercalm
|
| 107 |
- **HF Space:** huggingface.co/spaces/nbiish/crittercalm
|
| 108 |
- **Standalone repo:** /Volumes/1tb-sandisk/code-external/crittercalm-repo
|
| 109 |
|
| 110 |
+
### 2. FocusFriend (Thousand Token Wood)
|
| 111 |
|
| 112 |
+
- **Status:** Code complete. Deployed. Locally tested. Cedar-copper UI applied. Gradio 6 Chatbot dict-format fixed.
|
| 113 |
- **Stack:** Gemma 4 12B (12B) via llama-cpp-python
|
| 114 |
- **Badges:** Off-Brand (sun-amber custom theme), Off the Grid, Field Notes
|
| 115 |
- **GitHub:** github.com/nbiish/focusfriend
|
|
|
|
| 117 |
- **Standalone repo:** /Volumes/1tb-sandisk/code-external/focusfriend-repo
|
| 118 |
- **Note:** Gemma 4 12B GGUF not yet downloaded. Need `huggingface-cli download unsloth/gemma-4-12b-it-GGUF --include "gemma-4-12b-it-Q4_K_M.gguf" --local-dir ./models`
|
| 119 |
|
| 120 |
+
### 3. TinyBard (Thousand Token Wood + Tiny Titan + Llama Champion)
|
| 121 |
|
| 122 |
+
- **Status:** Code complete. Deployed. Locally tested end-to-end (game loop). Cedar-copper CRT UI applied.
|
| 123 |
- **Concept:** ≤4B LLM generates 5-min interactive text adventures in a CRT terminal aesthetic.
|
| 124 |
- **Stack:** VibeThinker 1.5B (1.5B) via llama-cpp-python + procedural fallback engine
|
| 125 |
- **Architecture:** FastAPI + mount_gradio_app at /gradio. Custom HTML/CSS/JS frontend. MCP tools: start_game, make_choice.
|
|
|
|
| 126 |
- **Badges:** Llama Champion, Tiny Titan (1.5B < 4B), Off-Brand (custom CRT), Off the Grid, Field Notes
|
| 127 |
- **Prize targets:** Tiny Titan ($1K), Thousand Token Wood track, Bonus Quest Champion potential
|
| 128 |
- **GitHub:** github.com/nbiish/tinybard
|
|
|
|
| 131 |
|
| 132 |
---
|
| 133 |
|
| 134 |
+
## TODO
|
| 135 |
|
| 136 |
> Keep tasks atomic and testable.
|
| 137 |
|
| 138 |
+
### In Progress
|
| 139 |
|
|
|
|
| 140 |
- [ ] Test CritterCalm voice cloning pipeline end-to-end
|
| 141 |
- [ ] Test FocusFriend all 4 modes (Chat, Focus, Breathe, Meditate) with real model
|
| 142 |
- [ ] Record demo videos (2-3 min each)
|
|
|
|
| 144 |
- [ ] Write Field Notes blog posts (3 — one per project)
|
| 145 |
- [ ] Share agent traces to HF Hub (Sharing is Caring badge)
|
| 146 |
|
| 147 |
+
### Completed
|
| 148 |
|
| 149 |
+
- [x] CritterCalm v1 code complete (11 files) — Cedar-copper UI
|
| 150 |
+
- [x] FocusFriend v1 code complete (16 files) — Cedar-copper UI + Gradio 6 dict Chatbot
|
| 151 |
- [x] TinyBard v1 code complete (8 files) — LLM + procedural fallback, CRT UI, clean FastAPI JSON
|
| 152 |
- [x] GitHub repos created (nbiish/crittercalm, nbiish/focusfriend, nbiish/tinybard)
|
| 153 |
- [x] HF Spaces created and deployed (all 3)
|
|
|
|
| 163 |
|
| 164 |
---
|
| 165 |
|
| 166 |
+
## Short-term Goals
|
| 167 |
|
| 168 |
- Test all 3 apps locally with real GGUF models (currently running with procedural fallbacks)
|
| 169 |
- Record demo videos and post to social media
|
| 170 |
- Write and publish Field Notes blog posts
|
| 171 |
- Share agent traces for Sharing is Caring badge
|
| 172 |
+
- Polish UIs for demo appeal
|
| 173 |
|
| 174 |
---
|
| 175 |
|
| 176 |
+
## Reference
|
| 177 |
|
| 178 |
- CritterCalm: projects/crittercalm/ + github.com/nbiish/crittercalm
|
| 179 |
- FocusFriend: projects/focusfriend/ + github.com/nbiish/focusfriend
|
| 180 |
- TinyBard: projects/tinybard/ + github.com/nbiish/tinybard
|
| 181 |
+
- Aesthetic module: shared/cedar_copper_tokens.py
|
| 182 |
- ML Intern: github.com/huggingface/ml-intern
|
| 183 |
- HF Agents CLI: huggingface.co/docs/hub/en/agents-cli
|
| 184 |
+
- Gradio MCP: gradio.app/guides/model-context-protocol
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@@ -1,44 +1,39 @@
|
|
| 1 |
"""
|
| 2 |
-
|
| 3 |
-
|
| 4 |
-
Shared
|
| 5 |
-
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
Each project imports PALETTE / SYMBOLS / HEADER / FOOTER to render a consistent
|
| 13 |
-
aesthetic across TinyBard, FocusFriend, and CritterCalm.
|
| 14 |
"""
|
| 15 |
|
| 16 |
-
# ──
|
| 17 |
-
PUU = "\u1438" # ᐸ
|
| 18 |
-
SHOO = "\u1514" # ᔔ
|
| 19 |
-
BII = "\u142A" # ᐪ
|
| 20 |
-
MII = "\u14A1" # ᑡ
|
| 21 |
-
WA = "\u1418" # ᐘ
|
| 22 |
-
GO = "\u1472" # ᑲ
|
| 23 |
-
AN = "\u14B0" # ᒐ
|
| 24 |
-
|
| 25 |
-
|
| 26 |
-
|
| 27 |
-
|
| 28 |
-
|
| 29 |
-
|
| 30 |
-
|
| 31 |
-
|
| 32 |
-
|
| 33 |
-
|
| 34 |
-
DIAMOND = "\u25C6" # ◆ BLACK DIAMOND
|
| 35 |
-
DIAMOND_O = "\u25C7" # ◇ WHITE DIAMOND
|
| 36 |
|
| 37 |
# ── COLOR PALETTE ──────────────────────────────────────────────────────────────
|
| 38 |
PALETTE = {
|
| 39 |
# Sky and water
|
| 40 |
-
"sky": "#5BA4D9", # light
|
| 41 |
-
"water": "#1B4965", # deep lake water
|
| 42 |
"ice": "#BEE9E8", # spring thaw
|
| 43 |
"frost": "#CAF0F8", # winter light
|
| 44 |
# Sun
|
|
@@ -47,7 +42,7 @@ PALETTE = {
|
|
| 47 |
"ember": "#E76F51", # dusk ember
|
| 48 |
# Earth
|
| 49 |
"birch": "#F5F1E8", # birchbark white
|
| 50 |
-
"terracotta":"#C8553D", # clay
|
| 51 |
"earth": "#8B3A1F", # deep earth / copper
|
| 52 |
"moss": "#588157", # forest moss
|
| 53 |
"forest": "#3D6A4A", # cedar forest
|
|
@@ -61,7 +56,7 @@ PALETTE = {
|
|
| 61 |
|
| 62 |
# ── PROJECT FRAMING ───────────────────────────────────────────────────────────
|
| 63 |
def header(title: str, en: str) -> str:
|
| 64 |
-
"""
|
| 65 |
|
| 66 |
Usage:
|
| 67 |
header("TinyBard", "MICRO TEXT ADVENTURE")
|
|
@@ -79,58 +74,57 @@ def footer() -> str:
|
|
| 79 |
|
| 80 |
|
| 81 |
def WATER_ICON() -> str:
|
| 82 |
-
# wave-like water (using box-drawing)
|
| 83 |
return "\u2248" # ≈ (approx, like a wave)
|
| 84 |
|
| 85 |
|
| 86 |
# ── THEME CONSTANTS (CSS variables) ──────────────────────────────────────────
|
| 87 |
CSS_VARS = f"""
|
| 88 |
:root {{
|
| 89 |
-
--
|
| 90 |
-
--
|
| 91 |
-
--
|
| 92 |
-
--
|
| 93 |
-
--
|
| 94 |
-
--
|
| 95 |
-
--
|
| 96 |
-
--
|
| 97 |
-
--
|
| 98 |
-
--
|
| 99 |
-
--
|
| 100 |
-
--
|
| 101 |
-
--
|
| 102 |
-
--
|
| 103 |
-
--
|
| 104 |
-
--
|
| 105 |
}}
|
| 106 |
"""
|
| 107 |
|
| 108 |
|
| 109 |
# ── SHARED CSS SNIPPETS ───────────────────────────────────────────────────────
|
| 110 |
def style_banner() -> str:
|
| 111 |
-
"""A standard top-of-app banner with
|
| 112 |
return """
|
| 113 |
-
/* ===
|
| 114 |
-
.
|
| 115 |
display: flex;
|
| 116 |
align-items: center;
|
| 117 |
justify-content: center;
|
| 118 |
gap: 0.6em;
|
| 119 |
padding: 14px 18px;
|
| 120 |
-
background: linear-gradient(95deg, var(--
|
| 121 |
-
color: var(--
|
| 122 |
border-bottom: 1px solid rgba(255, 179, 71, 0.35);
|
| 123 |
font-family: Georgia, 'Iowan Old Style', serif;
|
| 124 |
letter-spacing: 0.5px;
|
| 125 |
text-shadow: 0 1px 2px rgba(15, 26, 44, 0.35);
|
| 126 |
}
|
| 127 |
-
.
|
| 128 |
-
.
|
| 129 |
-
.
|
| 130 |
display: inline-block;
|
| 131 |
transform: translateY(-1px);
|
| 132 |
font-size: 1.1em;
|
| 133 |
-
color: var(--
|
| 134 |
}
|
| 135 |
/* ===================================================================== */
|
| 136 |
"""
|
|
@@ -138,20 +132,20 @@ def style_banner() -> str:
|
|
| 138 |
|
| 139 |
# ── WELCOME TEXT ──────────────────────────────────────────────────────────────
|
| 140 |
WELCOME = (
|
| 141 |
-
f"{PUU}
|
| 142 |
f"{SUN_RAY} {LEAF} {WATER_ICON()}"
|
| 143 |
)
|
| 144 |
|
| 145 |
|
| 146 |
# ── CHARACTER (TinyBard, FocusFriend) ────────────────────────────────────────
|
| 147 |
-
|
| 148 |
-
f"{PUU}
|
| 149 |
f"and the small winds. Sit. Breathe. The sun is in no hurry. {SUN_BLACK}"
|
| 150 |
)
|
| 151 |
|
| 152 |
|
| 153 |
if __name__ == "__main__":
|
| 154 |
-
print(header("Build Small Hackathon", "
|
| 155 |
print(WELCOME)
|
| 156 |
-
print(
|
| 157 |
print(footer())
|
|
|
|
| 1 |
"""
|
| 2 |
+
Cedar-Copper Design Tokens
|
| 3 |
+
============================
|
| 4 |
+
Shared palette + decorative-glyph module for the build-small-hackathon monorepo.
|
| 5 |
+
|
| 6 |
+
Each project's own CSS/UI embeds the tokens it needs (this file is a
|
| 7 |
+
reference, not imported at runtime).
|
| 8 |
+
|
| 9 |
+
Decorative Unicode glyphs in this file are intentionally NOT used in HF
|
| 10 |
+
Spaces metadata — see llms.txt "HF Agents CLI" notes.
|
|
|
|
|
|
|
|
|
|
| 11 |
"""
|
| 12 |
|
| 13 |
+
# ── DECORATIVE GLYPHS (in-app banners, not HF metadata) ───────────────────────
|
| 14 |
+
PUU = "\u1438" # ᐸ — left frame character
|
| 15 |
+
SHOO = "\u1514" # ᔔ — right frame character
|
| 16 |
+
BII = "\u142A" # ᐪ
|
| 17 |
+
MII = "\u14A1" # ᑡ
|
| 18 |
+
WA = "\u1418" # ᐘ
|
| 19 |
+
GO = "\u1472" # ᑲ
|
| 20 |
+
AN = "\u14B0" # ᒐ
|
| 21 |
+
|
| 22 |
+
SUN_RAY = "\u263C" # ☼
|
| 23 |
+
SUN_BLACK = "\u2600" # ☀
|
| 24 |
+
LEAF = "\u2618" # ☘
|
| 25 |
+
FLOWER = "\u2740" # ❀
|
| 26 |
+
MEDICINE_WHEEL = "\u2697" # ⚗
|
| 27 |
+
ARROW_UP = "\u21B3" # ↳
|
| 28 |
+
CIRCUIT = "\u25C8" # ◈
|
| 29 |
+
DIAMOND = "\u25C6" # ◆
|
| 30 |
+
DIAMOND_O = "\u25C7" # ◇
|
|
|
|
|
|
|
| 31 |
|
| 32 |
# ── COLOR PALETTE ──────────────────────────────────────────────────────────────
|
| 33 |
PALETTE = {
|
| 34 |
# Sky and water
|
| 35 |
+
"sky": "#5BA4D9", # light morning sky
|
| 36 |
+
"water": "#1B4965", # deep lake water
|
| 37 |
"ice": "#BEE9E8", # spring thaw
|
| 38 |
"frost": "#CAF0F8", # winter light
|
| 39 |
# Sun
|
|
|
|
| 42 |
"ember": "#E76F51", # dusk ember
|
| 43 |
# Earth
|
| 44 |
"birch": "#F5F1E8", # birchbark white
|
| 45 |
+
"terracotta":"#C8553D", # clay red
|
| 46 |
"earth": "#8B3A1F", # deep earth / copper
|
| 47 |
"moss": "#588157", # forest moss
|
| 48 |
"forest": "#3D6A4A", # cedar forest
|
|
|
|
| 56 |
|
| 57 |
# ── PROJECT FRAMING ───────────────────────────────────────────────────────────
|
| 58 |
def header(title: str, en: str) -> str:
|
| 59 |
+
"""Cedar-copper banner header for a project.
|
| 60 |
|
| 61 |
Usage:
|
| 62 |
header("TinyBard", "MICRO TEXT ADVENTURE")
|
|
|
|
| 74 |
|
| 75 |
|
| 76 |
def WATER_ICON() -> str:
|
|
|
|
| 77 |
return "\u2248" # ≈ (approx, like a wave)
|
| 78 |
|
| 79 |
|
| 80 |
# ── THEME CONSTANTS (CSS variables) ──────────────────────────────────────────
|
| 81 |
CSS_VARS = f"""
|
| 82 |
:root {{
|
| 83 |
+
--cc-sky: {PALETTE['sky']};
|
| 84 |
+
--cc-water: {PALETTE['water']};
|
| 85 |
+
--cc-ice: {PALETTE['ice']};
|
| 86 |
+
--cc-sun: {PALETTE['sun']};
|
| 87 |
+
--cc-sunlight: {PALETTE['sunlight']};
|
| 88 |
+
--cc-ember: {PALETTE['ember']};
|
| 89 |
+
--cc-birch: {PALETTE['birch']};
|
| 90 |
+
--cc-terra: {PALETTE['terracotta']};
|
| 91 |
+
--cc-earth: {PALETTE['earth']};
|
| 92 |
+
--cc-moss: {PALETTE['moss']};
|
| 93 |
+
--cc-forest: {PALETTE['forest']};
|
| 94 |
+
--cc-spruce: {PALETTE['spruce']};
|
| 95 |
+
--cc-night: {PALETTE['night']};
|
| 96 |
+
--cc-ash: {PALETTE['ash']};
|
| 97 |
+
--cc-stone: {PALETTE['stone']};
|
| 98 |
+
--cc-ink: {PALETTE['ink']};
|
| 99 |
}}
|
| 100 |
"""
|
| 101 |
|
| 102 |
|
| 103 |
# ── SHARED CSS SNIPPETS ───────────────────────────────────────────────────────
|
| 104 |
def style_banner() -> str:
|
| 105 |
+
"""A standard top-of-app banner with cedar-copper styling."""
|
| 106 |
return """
|
| 107 |
+
/* === CEDAR-COPPER BANNER ============================================== */
|
| 108 |
+
.cc-banner {
|
| 109 |
display: flex;
|
| 110 |
align-items: center;
|
| 111 |
justify-content: center;
|
| 112 |
gap: 0.6em;
|
| 113 |
padding: 14px 18px;
|
| 114 |
+
background: linear-gradient(95deg, var(--cc-sky) 0%, var(--cc-water) 100%);
|
| 115 |
+
color: var(--cc-birch);
|
| 116 |
border-bottom: 1px solid rgba(255, 179, 71, 0.35);
|
| 117 |
font-family: Georgia, 'Iowan Old Style', serif;
|
| 118 |
letter-spacing: 0.5px;
|
| 119 |
text-shadow: 0 1px 2px rgba(15, 26, 44, 0.35);
|
| 120 |
}
|
| 121 |
+
.cc-banner .syll { font-size: 1.4em; opacity: 0.85; }
|
| 122 |
+
.cc-banner .title { font-size: 1.05em; font-weight: 600; }
|
| 123 |
+
.cc-banner .glyph {
|
| 124 |
display: inline-block;
|
| 125 |
transform: translateY(-1px);
|
| 126 |
font-size: 1.1em;
|
| 127 |
+
color: var(--cc-sunlight);
|
| 128 |
}
|
| 129 |
/* ===================================================================== */
|
| 130 |
"""
|
|
|
|
| 132 |
|
| 133 |
# ── WELCOME TEXT ──────────────────────────────────────────────────────────────
|
| 134 |
WELCOME = (
|
| 135 |
+
f"{PUU} Welcome {SHOO} \u2014 The land remembers you. "
|
| 136 |
f"{SUN_RAY} {LEAF} {WATER_ICON()}"
|
| 137 |
)
|
| 138 |
|
| 139 |
|
| 140 |
# ── CHARACTER (TinyBard, FocusFriend) ────────────────────────────────────────
|
| 141 |
+
PIP_GREETING_CEDAR_COPPER = (
|
| 142 |
+
f"{PUU} Hello, friend {SHOO} \u2014 I am Pip, the friend of the moss "
|
| 143 |
f"and the small winds. Sit. Breathe. The sun is in no hurry. {SUN_BLACK}"
|
| 144 |
)
|
| 145 |
|
| 146 |
|
| 147 |
if __name__ == "__main__":
|
| 148 |
+
print(header("Build Small Hackathon", "CODER SANCTUARY"))
|
| 149 |
print(WELCOME)
|
| 150 |
+
print(PIP_GREETING_CEDAR_COPPER)
|
| 151 |
print(footer())
|