@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.
- package/commands/build_my_app.md +28 -1
- package/commands/manage_secrets.md +158 -0
- package/commands/update_branding.md +35 -87
- package/package.json +1 -1
- package/rules/branding.mdc +19 -27
- package/rules/design.mdc +16 -2
- package/skills/lovelace-branding/BRANDING.md +176 -0
- package/skills/lovelace-branding/SKILL.md +25 -0
- package/skills/lovelace-branding/assets/LL-logo-full-white-green.svg +35 -0
- package/skills/lovelace-branding/assets/LL-logo-full-wht.svg +39 -0
- package/skills/lovelace-branding/assets/LL-mark-green.svg +21 -0
- package/skills/lovelace-branding/assets/entity-styles.json +42 -0
- package/skills/lovelace-branding/assets/help-circle.svg +4 -0
- package/skills/lovelace-branding/fonts.md +147 -0
- package/skills/lovelace-branding/overview.md +136 -0
- package/skills/lovelace-branding/patterns.md +263 -0
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
# Lovelace CSS Patterns
|
|
2
|
+
|
|
3
|
+
Framework-agnostic CSS patterns for implementing Lovelace brand styling. These patterns are extracted from the News UI theme styles and can be adapted for React, Vue, Tailwind, or plain CSS.
|
|
4
|
+
|
|
5
|
+
## Card Styling
|
|
6
|
+
|
|
7
|
+
### Basic Card
|
|
8
|
+
|
|
9
|
+
```css
|
|
10
|
+
.card {
|
|
11
|
+
background-color: var(--lv-surface);
|
|
12
|
+
border: 1px solid #2A2A2A;
|
|
13
|
+
color: var(--lv-white);
|
|
14
|
+
}
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
### Card Header with Gradient
|
|
18
|
+
|
|
19
|
+
```css
|
|
20
|
+
.card-header {
|
|
21
|
+
background: linear-gradient(135deg, var(--lv-surface), var(--lv-surface-light));
|
|
22
|
+
border-bottom: 1px solid var(--lv-green-dim);
|
|
23
|
+
color: var(--lv-white);
|
|
24
|
+
padding: 12px 16px;
|
|
25
|
+
height: 56px;
|
|
26
|
+
}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### Metric Card
|
|
30
|
+
|
|
31
|
+
```css
|
|
32
|
+
.metric-card {
|
|
33
|
+
background-color: var(--lv-surface);
|
|
34
|
+
border: 1px solid #2A2A2A;
|
|
35
|
+
color: var(--lv-white);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
.metric-label {
|
|
39
|
+
color: #A0AEC0;
|
|
40
|
+
font-size: 0.875rem;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
.metric-value {
|
|
44
|
+
color: var(--lv-white);
|
|
45
|
+
font-weight: 600;
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Button Patterns
|
|
50
|
+
|
|
51
|
+
### Active/Selected Button
|
|
52
|
+
|
|
53
|
+
```css
|
|
54
|
+
.btn-active {
|
|
55
|
+
background-color: var(--lv-green);
|
|
56
|
+
color: var(--lv-black);
|
|
57
|
+
border-color: var(--lv-green);
|
|
58
|
+
font-weight: 600;
|
|
59
|
+
box-shadow: 0 0 12px rgba(63, 234, 0, 0.3);
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### Inactive Button
|
|
64
|
+
|
|
65
|
+
```css
|
|
66
|
+
.btn-inactive {
|
|
67
|
+
background-color: transparent;
|
|
68
|
+
color: rgba(255, 255, 255, 0.9);
|
|
69
|
+
border: 1px solid #2A2A2A;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
.btn-inactive:hover {
|
|
73
|
+
background-color: rgba(255, 255, 255, 0.1);
|
|
74
|
+
}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### Button Group Sizing
|
|
78
|
+
|
|
79
|
+
```css
|
|
80
|
+
.btn-group .btn {
|
|
81
|
+
transition: all 0.2s ease;
|
|
82
|
+
border-radius: 4px;
|
|
83
|
+
padding: 0 16px;
|
|
84
|
+
min-height: 36px;
|
|
85
|
+
letter-spacing: normal;
|
|
86
|
+
text-transform: none;
|
|
87
|
+
font-weight: 500;
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## Data Table Patterns
|
|
92
|
+
|
|
93
|
+
```css
|
|
94
|
+
.data-table {
|
|
95
|
+
background-color: var(--lv-surface);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
.data-table th {
|
|
99
|
+
background-color: #111111;
|
|
100
|
+
color: var(--lv-white);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
.data-table td {
|
|
104
|
+
color: var(--lv-white);
|
|
105
|
+
border-bottom: 1px solid #2A2A2A;
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## List Patterns
|
|
110
|
+
|
|
111
|
+
### Interactive List
|
|
112
|
+
|
|
113
|
+
```css
|
|
114
|
+
.list {
|
|
115
|
+
background-color: transparent;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
.list-item {
|
|
119
|
+
color: var(--lv-white);
|
|
120
|
+
background-color: transparent;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
.list-item:hover {
|
|
124
|
+
background-color: var(--lv-surface-light);
|
|
125
|
+
}
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### List Item States
|
|
129
|
+
|
|
130
|
+
```css
|
|
131
|
+
.list-item-title {
|
|
132
|
+
color: var(--lv-white);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
.list-item-subtitle {
|
|
136
|
+
color: #A0AEC0;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
.list-item-disabled .list-item-title {
|
|
140
|
+
color: #A0AEC0;
|
|
141
|
+
opacity: 0.6;
|
|
142
|
+
}
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
## Text Utility Classes
|
|
146
|
+
|
|
147
|
+
```css
|
|
148
|
+
.text-primary {
|
|
149
|
+
color: var(--lv-white);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
.text-secondary {
|
|
153
|
+
color: #A0AEC0;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
.text-muted {
|
|
157
|
+
color: var(--lv-silver);
|
|
158
|
+
}
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
## Background Colors
|
|
162
|
+
|
|
163
|
+
```css
|
|
164
|
+
.bg-surface {
|
|
165
|
+
background-color: var(--lv-surface);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
.bg-card {
|
|
169
|
+
background-color: var(--lv-surface-light);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
.bg-panel {
|
|
173
|
+
background-color: #111111;
|
|
174
|
+
}
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
## Input Styling
|
|
178
|
+
|
|
179
|
+
```css
|
|
180
|
+
.input:focus {
|
|
181
|
+
background-color: rgba(255, 255, 255, 0.08);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
.input {
|
|
185
|
+
color: white;
|
|
186
|
+
}
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
## Visual Effects
|
|
190
|
+
|
|
191
|
+
### Glow Effects
|
|
192
|
+
|
|
193
|
+
```css
|
|
194
|
+
.glow-green {
|
|
195
|
+
box-shadow: 0 0 12px rgba(63, 234, 0, 0.3);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
.glow-orange {
|
|
199
|
+
box-shadow: 0 0 12px rgba(255, 92, 0, 0.3);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
.glow-blue {
|
|
203
|
+
box-shadow: 0 0 12px rgba(0, 59, 255, 0.3);
|
|
204
|
+
}
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
### Text Glow
|
|
208
|
+
|
|
209
|
+
```css
|
|
210
|
+
.text-glow {
|
|
211
|
+
text-shadow: 0 0 8px rgba(63, 234, 0, 0.5);
|
|
212
|
+
}
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
### Border Accent
|
|
216
|
+
|
|
217
|
+
```css
|
|
218
|
+
.border-accent {
|
|
219
|
+
border-color: var(--lv-green-dim);
|
|
220
|
+
}
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
## CSS Variable Naming Conventions
|
|
224
|
+
|
|
225
|
+
| Prefix | Purpose | Example |
|
|
226
|
+
|--------|---------|---------|
|
|
227
|
+
| `--lv-*` | Brand colors (static) | `--lv-green`, `--lv-surface` |
|
|
228
|
+
| `--theme-*` | Theme-aware aliases | `--theme-primary`, `--theme-text` |
|
|
229
|
+
| `--dynamic-*` | JS-set runtime values | `--dynamic-primary`, `--dynamic-surface` |
|
|
230
|
+
| `--font-*` | Typography | `--font-primary`, `--font-mono` |
|
|
231
|
+
|
|
232
|
+
## Framework Adaptation Notes
|
|
233
|
+
|
|
234
|
+
### React
|
|
235
|
+
|
|
236
|
+
Use CSS modules or styled-components. Import the CSS variables in your global styles.
|
|
237
|
+
|
|
238
|
+
### Vue
|
|
239
|
+
|
|
240
|
+
Use scoped styles with `<style scoped>`. The variables work naturally with Vue's reactivity.
|
|
241
|
+
|
|
242
|
+
### Tailwind
|
|
243
|
+
|
|
244
|
+
Extend your `tailwind.config.js` with the brand colors:
|
|
245
|
+
|
|
246
|
+
```javascript
|
|
247
|
+
module.exports = {
|
|
248
|
+
theme: {
|
|
249
|
+
extend: {
|
|
250
|
+
colors: {
|
|
251
|
+
'lv-black': '#0A0A0A',
|
|
252
|
+
'lv-green': '#3FEA00',
|
|
253
|
+
'lv-surface': '#141414',
|
|
254
|
+
// ...
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
### Plain CSS
|
|
262
|
+
|
|
263
|
+
Include the CSS variables in your `:root` and use them directly.
|