@yottagraph-app/aether-instructions 1.1.24 → 1.1.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -10,7 +10,7 @@ This command reads `DESIGN.md` (which contains the project creator's vision) and
10
10
 
11
11
  ---
12
12
 
13
- ## Step 1: Read the Brief
13
+ ## Step 1: Read the Brief and Design References
14
14
 
15
15
  Read `DESIGN.md` from the project root.
16
16
 
@@ -26,6 +26,33 @@ Look for a `## Vision` section -- this contains the project creator's descriptio
26
26
 
27
27
  Stop here and wait for the user to describe what they want.
28
28
 
29
+ ### Long-form briefs
30
+
31
+ If the Vision section is long (roughly 500+ words -- a full PRD, spec, or design doc), don't try to hold it all in your head at once. Instead:
32
+
33
+ 1. Read the full Vision section carefully.
34
+ 2. Extract the **core purpose** (one sentence: what is this app for?).
35
+ 3. Identify the **MVP feature set** -- the minimum set of features that delivers the core value. Look for explicit priority indicators (P0/P1, "must have" vs "nice to have", numbered phases). If none exist, use your judgment: what's the smallest thing that works end-to-end?
36
+ 4. Create `design/requirements.md` with your extracted requirements, grouped by priority. This becomes your working checklist.
37
+ 5. Build the MVP first, then iterate. Don't try to implement every detail from a long brief in one pass.
38
+
39
+ ### Design references
40
+
41
+ Check for a `## Design References` section in DESIGN.md and for files in `design/references/`:
42
+
43
+ ```bash
44
+ ls design/references/ 2>/dev/null
45
+ ```
46
+
47
+ If design reference images exist (screenshots from Figma or other design tools):
48
+
49
+ 1. **Examine each image** -- these are design mockups from the project creator showing what the app should look like.
50
+ 2. Describe what you see in each image: layout structure, navigation patterns, component types, color usage, typography.
51
+ 3. Map visual elements to **Vuetify components** (cards = `v-card`, data tables = `v-data-table`, navigation drawers = `v-navigation-drawer`, app bars = `v-app-bar`, etc.). If a `vuetify-figma` skill is available in `.cursor/skills/`, read it for detailed component mapping guidance.
52
+ 4. Use the design references alongside the Vision text to plan the UX. The images show *what it should look like*; the Vision text explains *what it should do*.
53
+
54
+ If a Figma URL is referenced in DESIGN.md, note it for the user but don't attempt to fetch it -- work from the uploaded screenshots and the text brief.
55
+
29
56
  ---
30
57
 
31
58
  ## Step 2: Check MCP Servers
@@ -0,0 +1,158 @@
1
+ # Manage Secrets
2
+
3
+ Add, update, or remove environment variables (secrets) for your deployed app. Secrets are stored encrypted on Vercel and are available to your app at runtime and build time.
4
+
5
+ ## Overview
6
+
7
+ This command manages environment variables on your project's Vercel deployment through the Broadchurch Portal API. After any change, it automatically syncs the updated values to your local `.env` file so your dev server stays in sync with production.
8
+
9
+ **Prerequisite:** The project must have a valid `broadchurch.yaml` (created during provisioning).
10
+
11
+ ---
12
+
13
+ ## Step 1: Read Configuration
14
+
15
+ Read `broadchurch.yaml` from the project root.
16
+
17
+ ```bash
18
+ cat broadchurch.yaml
19
+ ```
20
+
21
+ **If the file does not exist:**
22
+
23
+ > This project hasn't been provisioned yet. Create it in the Broadchurch Portal first.
24
+
25
+ Stop here.
26
+
27
+ Extract these values:
28
+
29
+ - `tenant.org_id` (tenant org ID)
30
+ - `gateway.url` (Portal Gateway URL)
31
+
32
+ ---
33
+
34
+ ## Step 2: List Current Environment Variables
35
+
36
+ Fetch the current user-managed environment variables:
37
+
38
+ ```bash
39
+ curl -sf "<GATEWAY_URL>/api/projects/<ORG_ID>/env-vars"
40
+ ```
41
+
42
+ Parse the JSON response. The `vars` array contains `{ key, value }` objects.
43
+
44
+ Present the current state to the user:
45
+
46
+ > **Environment Variables for this project:**
47
+ >
48
+ > | Key | Value |
49
+ > |-----|-------|
50
+ > | `MY_API_KEY` | `sk-abc...xyz` |
51
+ > | `THIRD_PARTY_SECRET` | `secret_1234` |
52
+ >
53
+ > _(or "No environment variables set yet." if empty)_
54
+ >
55
+ > What would you like to do?
56
+ >
57
+ > 1. **Add** a new variable
58
+ > 2. **Update** an existing variable
59
+ > 3. **Remove** a variable
60
+ > 4. **Done** — nothing to change
61
+
62
+ Wait for the user to choose.
63
+
64
+ ---
65
+
66
+ ## Step 3: Execute the Change
67
+
68
+ ### If adding or updating:
69
+
70
+ Ask the user for the key name and value. Key names must match `[A-Za-z_][A-Za-z0-9_]*`.
71
+
72
+ ```bash
73
+ curl -sf -X PUT "<GATEWAY_URL>/api/projects/<ORG_ID>/env-vars" \
74
+ -H "Content-Type: application/json" \
75
+ -d '{"vars": {"<KEY>": "<VALUE>"}}'
76
+ ```
77
+
78
+ **If the API returns 403:** The key is a platform-managed variable and cannot be modified by users.
79
+
80
+ ### If removing:
81
+
82
+ Confirm which key to delete, then:
83
+
84
+ ```bash
85
+ curl -sf -X DELETE "<GATEWAY_URL>/api/projects/<ORG_ID>/env-vars/<KEY>"
86
+ ```
87
+
88
+ **If the API returns 404:** The variable doesn't exist.
89
+
90
+ ---
91
+
92
+ ## Step 4: Sync Local .env
93
+
94
+ After the API call succeeds, update the local `.env` file to match.
95
+
96
+ 1. Read the current `.env` file
97
+ 2. Look for a `# User secrets (managed via Broadchurch Portal)` section delimiter
98
+ 3. **If the section exists:** Replace everything from that delimiter to the next blank line (or end of file) with the updated variables
99
+ 4. **If the section doesn't exist:** Append it at the end of `.env`
100
+
101
+ Fetch the current full list to ensure local is in sync:
102
+
103
+ ```bash
104
+ curl -sf "<GATEWAY_URL>/api/projects/<ORG_ID>/env-vars"
105
+ ```
106
+
107
+ Then write the section to `.env`:
108
+
109
+ ```
110
+ # User secrets (managed via Broadchurch Portal)
111
+ KEY_ONE=value_one
112
+ KEY_TWO=value_two
113
+ ```
114
+
115
+ **Important:** Do not modify any other lines in `.env`. Only touch lines within the user secrets section.
116
+
117
+ ---
118
+
119
+ ## Step 5: Confirm and Offer Next Steps
120
+
121
+ > Updated `<KEY>`:
122
+ >
123
+ > - Vercel (production + preview) — updated
124
+ > - Local `.env` — synced
125
+ >
126
+ > **Restart your dev server** (`npm run dev`) if it's running, to pick up the change locally.
127
+
128
+ If the variable name starts with `NUXT_PUBLIC_`:
129
+
130
+ > **Note:** `NUXT_PUBLIC_*` variables are baked into the app at build time. The Vercel deployment will need a rebuild for the change to take effect in production. Push a commit or trigger a redeployment from the Portal.
131
+
132
+ If the variable name does NOT start with `NUXT_PUBLIC_`:
133
+
134
+ > This server-side variable will be available on the next request in production — no redeployment needed.
135
+
136
+ Then ask:
137
+
138
+ > Would you like to add, update, or remove another variable? (or type "done")
139
+
140
+ If yes, go back to Step 3. If done, finish.
141
+
142
+ ---
143
+
144
+ ## Troubleshooting
145
+
146
+ ### "Project has no Vercel project configured"
147
+
148
+ The project's Vercel integration wasn't set up during provisioning. Check the Broadchurch Portal for the project status.
149
+
150
+ ### API returns 403 for a key
151
+
152
+ The key is platform-managed (Auth0, gateway, query server, etc.) and cannot be modified through this command. Use the Portal's Platform Services section instead.
153
+
154
+ ### Variable not appearing in the deployed app
155
+
156
+ - **`NUXT_PUBLIC_*` vars** need a redeployment (push a commit or trigger from Portal)
157
+ - **Server-side vars** should be available immediately — check that the key name is correct
158
+ - Make sure you're reading the variable correctly in code: use `useRuntimeConfig()` in Nuxt, not `process.env` directly
@@ -1,123 +1,71 @@
1
1
  # Update Branding
2
2
 
3
- Refresh the Lovelace Brand R2 files from the canonical source repository.
3
+ Sync the project's branding implementation with the latest Lovelace branding skill guidelines.
4
4
 
5
5
  ## Overview
6
6
 
7
- Aether's branding files are wholesale copies from the `moongoose/ui/news-ui` directory of the Lovelace repo. This command copies the latest versions and checks for new dependencies.
8
-
9
- **Do not hardcode any local paths.** Always ask the user for the Lovelace repo location.
7
+ The `lovelace-branding` skill (`skills/lovelace-branding/`) is the single source of truth for Lovelace brand identity. This command reviews the project's branding implementation files and updates them to align with the skill.
10
8
 
11
9
  ---
12
10
 
13
- ## Step 1: Ask for the Lovelace Repo Path
14
-
15
- ```
16
- AskQuestion({
17
- title: "Lovelace Repository Path",
18
- questions: [
19
- {
20
- id: "repo-path",
21
- prompt: "Where is your local clone of the Lovelace repository?",
22
- options: [
23
- { id: "home-lovelace", label: "~/lovelace" },
24
- { id: "custom", label: "Other location (I'll specify)" }
25
- ]
26
- }
27
- ]
28
- })
29
- ```
11
+ ## Step 1: Read the Branding Skill
30
12
 
31
- If the user selects "Other location", ask them to provide the full path.
32
-
33
- Expand `~` to the user's home directory. Store the result as `{repo}`.
13
+ Read the skill starting from `skills/lovelace-branding/SKILL.md`. It contains a file index that will direct you to the relevant reference files.
34
14
 
35
15
  ---
36
16
 
37
- ## Step 2: Validate the Source Path
38
-
39
- Confirm the branding source directory exists:
17
+ ## Step 2: Review Implementation Files
40
18
 
41
- ```bash
42
- ls {repo}/moongoose/ui/news-ui/BRANDING.md
43
- ```
19
+ Read each of the project's branding implementation files and compare against the skill guidelines:
44
20
 
45
- **If the file does not exist:** Tell the user the path doesn't contain the expected branding files and ask them to double-check. Stop.
21
+ | File | What to check |
22
+ | --------------------------------- | --------------------------------------------------------------------------------- |
23
+ | `assets/brand-globals.css` | `:root` CSS variables match the skill's color and typography values |
24
+ | `assets/fonts.css` | `@font-face` declarations match the skill's font setup |
25
+ | `assets/theme-styles.css` | Theme utility classes align with the skill's CSS patterns |
26
+ | `composables/useLovelaceTheme.ts` | `themeColors` object matches the skill's color palette |
27
+ | `composables/useThemeClasses.ts` | Theme-aware utilities consistent with skill patterns |
28
+ | `nuxt.config.ts` | Vuetify theme colors match the skill; CSS array includes all branding stylesheets |
46
29
 
47
- Also verify the other expected source files exist:
48
-
49
- ```bash
50
- ls {repo}/moongoose/ui/news-ui/composables/useNewsTheme.ts
51
- ls {repo}/moongoose/ui/news-ui/composables/useThemeClasses.ts
52
- ls {repo}/moongoose/ui/news-ui/assets/theme-styles.css
53
- ls {repo}/moongoose/ui/news-ui/assets/fonts.css
54
- ls {repo}/moongoose/ui/news-ui/public/fonts/README.md
55
- ls {repo}/moongoose/ui/news-ui/public/LL-logo-full-wht.svg
56
- ```
57
-
58
- Report any missing files. If critical files are missing (BRANDING.md, useNewsTheme.ts, theme-styles.css), stop. If optional files are missing (logo, fonts README), warn but continue.
30
+ For each file, note any discrepancies between the current implementation and the skill guidelines.
59
31
 
60
32
  ---
61
33
 
62
- ## Step 3: Copy the Branding Files
34
+ ## Step 3: Update Implementation
63
35
 
64
- The base source path is `{repo}/moongoose/ui/news-ui`.
36
+ For each discrepancy found in Step 2, update the project file to align with the skill:
65
37
 
66
- Copy these files to their Aether destinations:
38
+ - **CSS variables**: Update hex values, add missing variables, remove obsolete ones
39
+ - **Color palette**: Update `themeColors` in `useLovelaceTheme.ts` to match
40
+ - **Typography**: Update font families, weights, and fallbacks as specified by the skill
41
+ - **Patterns**: Update theme utility classes to match the skill's CSS patterns
42
+ - **Vuetify theme**: Update `lovelaceDark` theme colors in `nuxt.config.ts` if needed
67
43
 
68
- | Source (relative to base) | Destination (relative to Aether root) |
69
- | -------------------------------- | ------------------------------------- |
70
- | `BRANDING.md` | `branding/BRANDING.md` |
71
- | `composables/useNewsTheme.ts` | `composables/useNewsTheme.ts` |
72
- | `composables/useThemeClasses.ts` | `composables/useThemeClasses.ts` |
73
- | `assets/theme-styles.css` | `assets/theme-styles.css` |
74
- | `assets/fonts.css` | `assets/fonts.css` |
75
- | `public/fonts/README.md` | `public/fonts/README.md` |
76
- | `public/LL-logo-full-wht.svg` | `public/LL-logo-full-wht.svg` |
44
+ If the skill introduces new concepts not yet implemented in the project (new CSS variable namespaces, new utility classes, new patterns), add them.
77
45
 
78
- For `app.vue`, extract only the `<style>` block contents (not the `<style>` tags themselves) and write them to `assets/brand-globals.css`. Read the source `app.vue`, find the content between `<style>` and `</style>`, and overwrite `assets/brand-globals.css` with that content.
46
+ If the project has customizations that intentionally diverge from the skill (e.g., project-specific semantic colors), preserve them but note the divergence.
79
47
 
80
48
  ---
81
49
 
82
- ## Step 4: Dependency Audit
83
-
84
- After copying, read through each copied file and check for new references that weren't present before:
50
+ ## Step 4: Check Assets
85
51
 
86
- 1. **TypeScript imports**: Check `useNewsTheme.ts` and `useThemeClasses.ts` for any new `import` statements referencing files that don't exist in Aether.
52
+ Compare logo and asset files in `public/` against the skill's `assets/` directory (`skills/lovelace-branding/assets/`).
87
53
 
88
- 2. **CSS references**: Check `theme-styles.css`, `fonts.css`, and `brand-globals.css` for:
89
- - `url()` paths pointing to files not in `public/`
90
- - `@import` statements referencing files not in `assets/`
91
-
92
- 3. **Documentation references**: Check `BRANDING.md` for references to new files (logos, assets, CSS files) that should be copied.
93
-
94
- **If new dependencies are found:**
95
-
96
- - Static assets (images, SVGs, fonts) -> copy to `public/` in the equivalent subdirectory
97
- - CSS files -> copy to `assets/`
98
- - TypeScript/JS files -> copy to `composables/` or the equivalent directory
99
- - Report what was copied to the user
54
+ - Copy any new or updated SVGs/assets from the skill to `public/`
55
+ - If existing assets differ, update them to the skill's versions
100
56
 
101
57
  ---
102
58
 
103
- ## Step 5: Verify Integration
104
-
105
- Check that the adapter (`composables/useCustomTheme.ts`) is still compatible:
106
-
107
- 1. Read `composables/useNewsTheme.ts` and check what it exports.
108
- 2. Read `composables/useCustomTheme.ts` and confirm it re-exports the expected interface.
109
- 3. If `useNewsTheme.ts` has added new named exports that aren't re-exported by the adapter, tell the user:
110
-
111
- > `useNewsTheme.ts` has new exports that aren't exposed through `useCustomTheme.ts`: [list them]. You may want to add these to the adapter if components need them.
112
-
113
- 4. Check that `nuxt.config.ts` still includes the three CSS files:
59
+ ## Step 5: Verify
114
60
 
115
- ```typescript
116
- css: ['~/assets/fonts.css', '~/assets/brand-globals.css', '~/assets/theme-styles.css'],
117
- ```
61
+ 1. Confirm `nuxt.config.ts` CSS array still includes all branding stylesheets:
62
+ ```typescript
63
+ css: ['~/assets/fonts.css', '~/assets/brand-globals.css', '~/assets/theme-styles.css'];
64
+ ```
65
+ 2. Run `npm run build` to verify no compilation errors
118
66
 
119
67
  ---
120
68
 
121
69
  ## Step 6: Commit
122
70
 
123
- Follow the `git-support.mdc` workflow to commit the change.
71
+ Follow the `git-support.mdc` workflow to commit the changes.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yottagraph-app/aether-instructions",
3
- "version": "1.1.24",
3
+ "version": "1.1.26",
4
4
  "description": "Cursor rules, commands, and skills for Aether development",
5
5
  "files": [
6
6
  "rules",
@@ -3,41 +3,33 @@ description: Apply when working on visual styling, colors, typography, theming,
3
3
  alwaysApply: false
4
4
  ---
5
5
 
6
- # Lovelace Brand R2
6
+ # Lovelace Branding
7
7
 
8
- The app follows Lovelace Brand R2 guidelines. For the full specification (color ramps, accessibility, visual effects), read `branding/BRANDING.md`.
8
+ The `lovelace-branding` skill (`skills/lovelace-branding/`) is the single source of truth for all brand specifics -- colors, typography, patterns, assets, and usage guidelines. Read the skill before making branding decisions. Start with `SKILL.md` for the file index.
9
9
 
10
- ## Quick Reference
10
+ ## Theme
11
11
 
12
- - **Theme**: Single dark theme. No light mode, no theme switching.
13
- - **Core colors**: Jet Black `#0A0A0A`, Pure White `#FFFFFF`, Cyber Green `#3FEA00`, Sonic Silver `#757575`
14
- - **Secondary colors**: Electric Blue `#003BFF`, Blaze Orange `#FF5C00`
15
- - **Semantic**: Amber `#FF9F0A` (warnings), Red `#EF4444` (errors)
16
- - **Fonts**: FK Grotesk (body), FK Grotesk Mono (headlines, buttons, code). Falls back to Inter / system-ui. See `public/fonts/README.md` for setup.
17
- - **Icons**: Material Design Icons (mdi) via Vuetify
12
+ Single dark theme. No light mode, no theme switching.
18
13
 
19
- ## Branding Files
14
+ ## Implementation Files
20
15
 
21
- These files are copied wholesale from the canonical branding source (`moongoose/ui/news-ui`). Update them by running `/update_branding`. Do **not** edit them in place.
16
+ These files are project-owned. Consult the branding skill for the values and patterns they should implement.
22
17
 
23
- | File | Purpose |
24
- |---|---|
25
- | `branding/BRANDING.md` | Full brand specification |
26
- | `composables/useNewsTheme.ts` | Theme colors and CSS variable application |
27
- | `composables/useThemeClasses.ts` | Theme-aware class utilities |
28
- | `assets/theme-styles.css` | Theme CSS classes |
18
+ | File | Role |
19
+ |------|------|
20
+ | `assets/brand-globals.css` | `:root` CSS variables and global typography/layout |
29
21
  | `assets/fonts.css` | `@font-face` declarations |
30
- | `assets/brand-globals.css` | Global CSS variables, typography, utilities |
31
- | `public/fonts/README.md` | Font setup instructions |
32
- | `public/LL-logo-full-wht.svg` | Primary logo (white, for dark backgrounds) |
22
+ | `assets/theme-styles.css` | Theme-aware CSS utility classes |
23
+ | `composables/useLovelaceTheme.ts` | Theme color palette and Vuetify theme activation |
24
+ | `composables/useThemeClasses.ts` | Theme-aware class combination utilities |
33
25
 
34
- ## Vuetify Theme
26
+ ## Integration
35
27
 
36
- The `lovelaceDark` Vuetify theme is defined in `nuxt.config.ts` under `vuetify.vuetifyOptions.theme`. This is the same theme used by the Broadchurch Portal. It provides Brand R2 colors to all Vuetify components automatically (primary = Cyber Green, secondary = Electric Blue, etc.). Component defaults (rounded buttons, outlined cards, etc.) are also set in `nuxt.config.ts` under `vuetify.vuetifyOptions.defaults`.
28
+ - Use `useLovelaceTheme()` or `useThemeClasses()` in components for theme colors and class utilities.
29
+ - The `lovelaceDark` Vuetify theme is defined in `nuxt.config.ts` under `vuetify.vuetifyOptions.theme`. It provides brand colors to all Vuetify components automatically. Component defaults are set under `vuetify.vuetifyOptions.defaults`.
30
+ - CSS variables (`--lv-*`) and theme classes (`.theme-*`) are available globally via the stylesheets listed above.
31
+ - `useLovelaceTheme` calls `theme.change('lovelaceDark')` to activate the Vuetify theme. This must match the theme name in `nuxt.config.ts`.
37
32
 
38
- ## Integration
33
+ ## Updating
39
34
 
40
- - `composables/useCustomTheme.ts` is a thin adapter around `useNewsTheme`. Use `useCustomTheme()` or `useThemeClasses()` in components.
41
- - CSS variables (`--lv-green`, `--lv-black`, etc.) and theme classes (`.theme-card`, `.theme-text-primary`, etc.) are available globally.
42
- - `useNewsTheme` calls `theme.change('lovelaceDark')` to activate the Vuetify theme. This must match the theme name in `nuxt.config.ts`.
43
- - If you need to change how the branding integrates with Aether, modify the adapter -- not the branding files.
35
+ Run `/update_branding` to sync these files with the latest branding skill guidelines. The command reads the skill, compares each implementation file against the guidelines, and updates as needed.
package/rules/design.mdc CHANGED
@@ -20,7 +20,8 @@ When building from a project brief or user request, feel free to:
20
20
 
21
21
  - **Replace** `pages/index.vue` with the app's real home page
22
22
  - **Remove** any pages that don't fit the app
23
- - **Restructure** the navigation, layout, and branding entirely
23
+ - **Restructure** the navigation and layout entirely
24
+ - **Check** the branding is up to date with the `lovelace-branding` skill, and update as needed
24
25
  - **Keep** the infrastructure: `composables/`, `server/api/kv/`, `agents/`
25
26
 
26
27
  Do NOT treat the existing UI as something to preserve. Build what the
@@ -30,10 +31,23 @@ asks to keep specific parts.
30
31
 
31
32
  # Project Brief
32
33
 
33
- If `DESIGN.md` has a `## Vision` section, it contains the project creator's original description of what they want to build — written during project setup in the Broadchurch Portal.
34
+ If `DESIGN.md` has a `## Vision` section, it contains the project creator's original description of what they want to build — written during project setup in the Broadchurch Portal. This can range from a single sentence to a full PRD with user stories, wireframes, and technical constraints.
34
35
 
35
36
  When a user opens the project for the first time and hasn't started building yet (the `## Status` section says "Run `/build_my_app`"), suggest running that command. If they ask "what should I build?" or similar, read the Vision section of DESIGN.md first.
36
37
 
38
+ ## Long-form briefs
39
+
40
+ Users may paste full PRD or spec documents as their project brief. When the Vision section is long (500+ words), focus on extracting the MVP scope before building. Look for priority indicators, phased rollout plans, or "must-have" vs "nice-to-have" distinctions. If none exist, identify the smallest coherent feature set that demonstrates the core value. Create `design/requirements.md` to capture your extracted requirements as a working checklist.
41
+
42
+ ## Design references
43
+
44
+ `DESIGN.md` may include a `## Design References` section with Figma URLs and/or image references. Design mockup images live in `design/references/`. When these exist:
45
+
46
+ - Examine the images to understand intended layout, navigation patterns, and visual style
47
+ - Map visual elements to Vuetify components (if a `vuetify-figma` skill exists, use it)
48
+ - Treat design references as the "what it should look like" complement to the Vision's "what it should do"
49
+ - Figma URLs are informational — work from the uploaded screenshots, not the live Figma file
50
+
37
51
  # Feature docs
38
52
 
39
53
  Feature docs are used as working documents to help a user and agent collaborate on feature implementation. A feature can be whatever size you need -- an entire page, a shared composable, or a single component.
@@ -0,0 +1,176 @@
1
+ # Lovelace Brand R2 Guidelines
2
+
3
+ This document defines the visual identity for all Lovelace UI products (News UI, Ada Demo, etc.). It is derived from the Brand R2 review and serves as the single source of truth for colors, typography, iconography, and usage patterns.
4
+
5
+ ## Color Palettes
6
+
7
+ ### Core Palette
8
+
9
+ Jet Black, Pure White, Sonic Silver, and Cyber Green are Lovelace's core brand colors.
10
+
11
+ | Name | Hex | Usage |
12
+ |--------------|-----------|--------------------------------|
13
+ | Jet Black | `#0A0A0A` | Primary backgrounds |
14
+ | Pure White | `#FFFFFF` | Primary text on dark surfaces |
15
+ | Sonic Silver | `#757575` | Muted text, secondary elements |
16
+ | Cyber Green | `#3FEA00` | Primary accent, CTAs, success |
17
+
18
+ The palette can be extended with neutral greyscale tones ranging from Pure White `#FFF` to True Black `#000`. We use Jet Black `#0A0A0A` as our primary black for most purposes.
19
+
20
+ ### Secondary Colors
21
+
22
+ Electric Blue and Blaze Orange are secondary colors to extend the branding.
23
+
24
+ | Name | Hex | Usage |
25
+ |---------------|-----------|-------------------------------------|
26
+ | Electric Blue | `#003BFF` | Accent, links, finance/data |
27
+ | Blaze Orange | `#FF5C00` | Warnings, highlights, secondary CTA |
28
+
29
+ ### Semantic Colors
30
+
31
+ | Name | Hex | Usage |
32
+ |--------|-----------|----------|
33
+ | Amber | `#FF9F0A` | Warnings |
34
+ | Red | `#EF4444` | Errors |
35
+
36
+ ### Color Ramps
37
+
38
+ Each color has a ramp from 50 (lightest) to 950 (darkest). The `/500` value is the base brand color. Colors go lighter (lower numbers) or darker (higher numbers) depending on context.
39
+
40
+ **Neutrals:**
41
+
42
+ | 50 | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900 | 950 |
43
+ |---------|----------|----------|----------|----------|----------|----------|----------|----------|----------|----------|
44
+ | #FFFFFF | #F8F8F8 | #E6E6E6 | #D5D5D6 | #B1B1B1 | #757575 | #6C6C6C | #464646 | #222222 | #0A0A0A | #000000 |
45
+
46
+ **Green:**
47
+
48
+ | 50 | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900 | 950 |
49
+ |---------|----------|----------|----------|----------|----------|----------|----------|----------|----------|----------|
50
+ | #DDFFD1 | #BBFFA3 | #99FF75 | #78FF47 | #57FF19 | #3FEA00 | #30BC00 | #238E00 | #166100 | #0B3300 | #010500 |
51
+
52
+ **Blue:**
53
+
54
+ | 50 | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900 | 950 |
55
+ |---------|----------|----------|----------|----------|----------|----------|----------|----------|----------|----------|
56
+ | #E6EBFF | #BBC7FF | #8AA3FF | #6C80FF | #2E5DFF | #003BFF | #0230D0 | #0326A1 | #031B73 | #021146 | #010819 |
57
+
58
+ **Orange:**
59
+
60
+ | 50 | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900 | 950 |
61
+ |---------|----------|----------|----------|----------|----------|----------|----------|----------|----------|----------|
62
+ | #FFF0E6 | #FFD4B8 | #FFB78A | #FF989C | #FF7B2E | #FF5C00 | #D04E02 | #A13F03 | #732F03 | #461E02 | #190801 |
63
+
64
+ ### Usage Proportions
65
+
66
+ The proportional usage of each color to the whole (approximate):
67
+ - Jet Black + Pure White: ~70% of surface area (dark backgrounds, white text)
68
+ - Cyber Green: ~15% (accents, interactive elements, success states)
69
+ - Sonic Silver: ~10% (muted text, borders, secondary elements)
70
+ - Electric Blue + Blaze Orange: ~5% (sparingly, for specific semantic purposes)
71
+
72
+ ### Accessibility
73
+
74
+ All color pairings must meet WCAG AA contrast ratio at a minimum. Use the color ramps to find appropriate pairings:
75
+ - White text on Jet Black: passes AAA
76
+ - Cyber Green on Jet Black: passes AA
77
+ - Electric Blue on Jet Black: passes AA
78
+
79
+ Reference: https://accessibleweb.com/color-contrast-checker/
80
+
81
+ ## Typography
82
+
83
+ ### Font Families
84
+
85
+ | Role | Font | Fallbacks |
86
+ |-------------------|---------------------|----------------------------------------|
87
+ | Body / Primary | FK Grotesk | Inter, system-ui, sans-serif |
88
+ | Headlines | FK Grotesk SemiMono | Inter, system-ui, sans-serif |
89
+ | Subheaders | FK Grotesk SemiMono | Inter, system-ui, sans-serif |
90
+ | Buttons/Elements | FK Grotesk Mono | JetBrains Mono, Fira Code, monospace |
91
+ | Brand wordmark | Inter | system-ui, sans-serif |
92
+ | Code/Data | FK Grotesk Mono | JetBrains Mono, Fira Code, monospace |
93
+
94
+ FK Grotesk is a commercial font (licensed). Font files are **not committed to git**. See `public/fonts/README.md` for setup instructions.
95
+
96
+ ### Type Hierarchy
97
+
98
+ | Level | Font | Weight | Style |
99
+ |--------------------------|-------------------|---------|------------|
100
+ | Headlines (h1) | FK Grotesk SemiMono | Regular | Normal |
101
+ | Subheaders (h2, h3) | FK Grotesk SemiMono | Regular | Normal |
102
+ | Body Copy | FK Grotesk | Regular | Normal |
103
+ | Body Strong / Highlighted | FK Grotesk | Strong (700) | Normal |
104
+ | Buttons & UI Elements | FK Grotesk Mono | Regular | UPPERCASE, letter-spacing 0.05em |
105
+
106
+ ### CSS Variables
107
+
108
+ ```css
109
+ :root {
110
+ --font-primary: 'FK Grotesk', 'Inter', system-ui, -apple-system, sans-serif;
111
+ --font-headline: 'FK Grotesk Mono', 'Inter', system-ui, sans-serif;
112
+ --font-brand: 'Inter', system-ui, -apple-system, sans-serif;
113
+ --font-mono: 'FK Grotesk Mono', 'JetBrains Mono', 'Fira Code', monospace;
114
+ }
115
+ ```
116
+
117
+ ## Iconography
118
+
119
+ We use the **IBM Carbon Design** icon kit -- an open-source, free icon kit with over 2,000 icons available.
120
+
121
+ Library: https://carbondesignsystem.com/elements/icons/library/
122
+
123
+ In practice, we currently use Material Design Icons (mdi) via Vuetify. Carbon icons can be adopted incrementally.
124
+
125
+ ## Logo
126
+
127
+ The primary logo is the Lovelace wordmark with the circular green-dot badge:
128
+ - **White version** (for dark backgrounds): `LL-logo-full-wht.svg`
129
+ - Located in `public/LL-logo-full-wht.svg`
130
+
131
+ ## Visual Effects (Optional)
132
+
133
+ These effects can be applied sparingly for branded sections:
134
+
135
+ - **Grid pattern**: Subtle grid lines at 20px intervals
136
+ - **Dot pattern**: Punch-card aesthetic with radial dots at 16px intervals
137
+ - **Glow effects**: Colored box-shadows (green, orange, blue) at 0.3 opacity
138
+ - **Text glow**: Green text-shadow for emphasis
139
+
140
+ ## CSS Variable Reference
141
+
142
+ All Brand R2 CSS variables are defined in `app.vue` under `:root`:
143
+
144
+ ```css
145
+ :root {
146
+ /* Core */
147
+ --lv-black: #0A0A0A;
148
+ --lv-surface: #141414;
149
+ --lv-surface-light: #1E1E1E;
150
+ --lv-white: #FFFFFF;
151
+ --lv-silver: #757575;
152
+
153
+ /* Primary */
154
+ --lv-green: #3FEA00;
155
+ --lv-green-dim: #30BC00;
156
+ --lv-green-light: #57FF19;
157
+
158
+ /* Secondary */
159
+ --lv-orange: #FF5C00;
160
+ --lv-orange-dim: #D04E02;
161
+ --lv-blue: #003BFF;
162
+ --lv-blue-dim: #0230D0;
163
+ --lv-blue-light: #2E5DFF;
164
+
165
+ /* Semantic */
166
+ --lv-yellow: #FF9F0A;
167
+ --lv-finance-blue: #003BFF;
168
+ }
169
+ ```
170
+
171
+ ## Implementation Notes
172
+
173
+ - The News UI uses a single dark theme ("brand") defined in `composables/useNewsTheme.ts`
174
+ - Theme-aware CSS utility classes are in `assets/theme-styles.css`
175
+ - The `useThemeClasses` composable provides pre-built class combinations for components
176
+ - Vuetify is configured with `defaultTheme: "dark"` in `nuxt.config.ts`