@ponchia/ui 0.2.0

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/css/app.css ADDED
@@ -0,0 +1,309 @@
1
+ /* ==========================================================================
2
+ app — admin shell (sidebar + topbar + panels + metrics)
3
+ Adopted by polpo-admin and future operator UIs.
4
+ ========================================================================== */
5
+
6
+ .app-shell {
7
+ display: grid;
8
+ grid-template-columns: var(--app-rail, 14rem) minmax(0, 1fr);
9
+ min-height: 100vh;
10
+ }
11
+
12
+ .app-shell--full {
13
+ grid-template-columns: minmax(0, 1fr);
14
+ }
15
+
16
+ /* --- Sidebar rail --- */
17
+
18
+ .app-rail {
19
+ background: var(--panel);
20
+ border-right: 1px solid var(--line);
21
+ display: flex;
22
+ flex-direction: column;
23
+ gap: var(--space-md);
24
+ padding: var(--space-md);
25
+ position: sticky;
26
+ top: 0;
27
+ height: 100vh;
28
+ overflow-y: auto;
29
+ }
30
+
31
+ .app-rail__brand {
32
+ align-items: center;
33
+ color: var(--text);
34
+ display: flex;
35
+ font-family: var(--display);
36
+ font-size: 1.05rem;
37
+ gap: 0.5rem;
38
+ letter-spacing: var(--tracking-wide);
39
+ padding: 0.35rem 0.5rem;
40
+ text-transform: uppercase;
41
+ }
42
+
43
+ .app-rail__brand::before {
44
+ background: var(--accent);
45
+ border-radius: 50%;
46
+ content: '';
47
+ height: 0.5rem;
48
+ width: 0.5rem;
49
+ }
50
+
51
+ .app-nav {
52
+ display: grid;
53
+ gap: 0.15rem;
54
+ }
55
+
56
+ .app-nav__section {
57
+ color: var(--text-dim);
58
+ font-family: var(--mono);
59
+ font-size: var(--text-2xs);
60
+ letter-spacing: var(--tracking-wide);
61
+ margin: var(--space-sm) 0 0.3rem;
62
+ padding: 0 0.5rem;
63
+ text-transform: uppercase;
64
+ }
65
+
66
+ .app-nav a {
67
+ align-items: center;
68
+ border-left: 2px solid transparent;
69
+ color: var(--text-soft);
70
+ display: flex;
71
+ font-family: var(--mono);
72
+ font-size: var(--text-sm);
73
+ gap: 0.55rem;
74
+ padding: 0.5rem 0.6rem;
75
+ transition:
76
+ background-color var(--duration-fast) var(--ease-standard),
77
+ border-color var(--duration-fast) var(--ease-standard),
78
+ color var(--duration-fast) var(--ease-standard);
79
+ }
80
+
81
+ .app-nav a::before {
82
+ background: currentColor;
83
+ border-radius: 50%;
84
+ content: '';
85
+ height: 0.34rem;
86
+ opacity: 0.45;
87
+ width: 0.34rem;
88
+ }
89
+
90
+ .app-nav a:hover {
91
+ background: var(--bg-accent);
92
+ color: var(--text);
93
+ }
94
+
95
+ .app-nav a.is-active {
96
+ background: var(--accent-soft);
97
+ border-left-color: var(--accent);
98
+ color: var(--accent);
99
+ }
100
+
101
+ .app-nav a.is-active::before {
102
+ opacity: 1;
103
+ }
104
+
105
+ .app-rail__foot {
106
+ border-top: 1px solid var(--line);
107
+ color: var(--text-dim);
108
+ font-family: var(--mono);
109
+ font-size: var(--text-2xs);
110
+ margin-top: auto;
111
+ padding-top: var(--space-sm);
112
+ }
113
+
114
+ /* --- Main column --- */
115
+
116
+ .app-main {
117
+ display: flex;
118
+ flex-direction: column;
119
+ min-width: 0;
120
+ }
121
+
122
+ .app-topbar {
123
+ align-items: center;
124
+ background: color-mix(in srgb, var(--bg) 86%, transparent);
125
+ backdrop-filter: blur(8px);
126
+ border-bottom: 1px solid var(--line);
127
+ display: flex;
128
+ gap: var(--space-md);
129
+ justify-content: space-between;
130
+ padding: 0.75rem var(--space-lg);
131
+ position: sticky;
132
+ top: 0;
133
+ z-index: 10;
134
+ }
135
+
136
+ .app-topbar__title {
137
+ color: var(--text);
138
+ font-family: var(--display);
139
+ font-size: 1.1rem;
140
+ letter-spacing: var(--tracking-wide);
141
+ margin: 0;
142
+ text-transform: uppercase;
143
+ }
144
+
145
+ .app-content {
146
+ display: grid;
147
+ gap: var(--space-lg);
148
+ padding: var(--space-lg);
149
+ }
150
+
151
+ /* --- Toolbar --- */
152
+
153
+ .app-toolbar {
154
+ align-items: center;
155
+ background: var(--panel);
156
+ border: 1px solid var(--line);
157
+ border-radius: var(--radius-md);
158
+ display: flex;
159
+ flex-wrap: wrap;
160
+ gap: 0.7rem;
161
+ justify-content: space-between;
162
+ padding: 0.7rem 0.85rem;
163
+ }
164
+
165
+ .app-toolbar__group {
166
+ align-items: center;
167
+ display: flex;
168
+ flex-wrap: wrap;
169
+ gap: 0.5rem;
170
+ }
171
+
172
+ /* --- Panel --- */
173
+
174
+ .app-panel {
175
+ background: var(--panel);
176
+ border: 1px solid var(--line);
177
+ border-radius: var(--radius-md);
178
+ display: grid;
179
+ gap: 0.85rem;
180
+ padding: var(--space-md);
181
+ }
182
+
183
+ .app-panel__head {
184
+ align-items: flex-start;
185
+ display: flex;
186
+ gap: 0.7rem;
187
+ justify-content: space-between;
188
+ }
189
+
190
+ .app-panel__title {
191
+ color: var(--text);
192
+ font-family: var(--display);
193
+ font-size: 0.95rem;
194
+ letter-spacing: var(--tracking-wide);
195
+ margin: 0;
196
+ text-transform: uppercase;
197
+ }
198
+
199
+ .app-panel__head p,
200
+ .app-empty-state p {
201
+ color: var(--text-dim);
202
+ margin: 0.3rem 0 0;
203
+ }
204
+
205
+ /* --- Metric tiles --- */
206
+
207
+ .app-metrics {
208
+ display: grid;
209
+ gap: var(--space-md);
210
+ grid-template-columns: repeat(auto-fit, minmax(11rem, 1fr));
211
+ }
212
+
213
+ .app-metric {
214
+ background: var(--panel);
215
+ border: 1px solid var(--line);
216
+ border-radius: var(--radius-md);
217
+ display: grid;
218
+ gap: 0.4rem;
219
+ padding: var(--space-md);
220
+ }
221
+
222
+ .app-metric__label {
223
+ color: var(--text-dim);
224
+ font-family: var(--mono);
225
+ font-size: var(--text-2xs);
226
+ letter-spacing: var(--tracking-wide);
227
+ text-transform: uppercase;
228
+ }
229
+
230
+ .app-metric__value {
231
+ color: var(--text);
232
+ font-family: var(--display);
233
+ font-size: 1.9rem;
234
+ font-variant-numeric: tabular-nums;
235
+ letter-spacing: 0.01em;
236
+ line-height: 1;
237
+ }
238
+
239
+ .app-metric__delta {
240
+ font-family: var(--mono);
241
+ font-size: var(--text-xs);
242
+ }
243
+
244
+ .app-metric__delta.is-pos {
245
+ color: var(--success);
246
+ }
247
+
248
+ .app-metric__delta.is-neg {
249
+ color: var(--danger);
250
+ }
251
+
252
+ /* --- Empty state --- */
253
+
254
+ .app-empty-state {
255
+ border: 1px dashed var(--line-strong);
256
+ border-radius: var(--radius-md);
257
+ color: var(--text-dim);
258
+ padding: var(--space-lg);
259
+ text-align: center;
260
+ }
261
+
262
+ /* --- Mobile rail collapse --- */
263
+
264
+ .app-rail__toggle {
265
+ display: none;
266
+ }
267
+
268
+ @media (max-width: 880px) {
269
+ .app-shell {
270
+ grid-template-columns: minmax(0, 1fr);
271
+ }
272
+
273
+ .app-rail {
274
+ flex-direction: row;
275
+ height: auto;
276
+ overflow-x: auto;
277
+ position: sticky;
278
+ top: 0;
279
+ z-index: 11;
280
+ }
281
+
282
+ .app-rail__foot {
283
+ display: none;
284
+ }
285
+
286
+ .app-nav {
287
+ grid-auto-flow: column;
288
+ gap: 0.15rem;
289
+ }
290
+
291
+ .app-nav__section {
292
+ display: none;
293
+ }
294
+
295
+ .app-nav a {
296
+ border-left: 0;
297
+ border-bottom: 2px solid transparent;
298
+ white-space: nowrap;
299
+ }
300
+
301
+ .app-nav a.is-active {
302
+ border-left: 0;
303
+ border-bottom-color: var(--accent);
304
+ }
305
+
306
+ .app-content {
307
+ padding: var(--space-md);
308
+ }
309
+ }
package/css/base.css ADDED
@@ -0,0 +1,206 @@
1
+ /* ==========================================================================
2
+ base — reset + element defaults, Nothing-flat
3
+ ========================================================================== */
4
+
5
+ *,
6
+ *::before,
7
+ *::after {
8
+ box-sizing: border-box;
9
+ }
10
+
11
+ html {
12
+ background: var(--bg);
13
+ color: var(--text);
14
+ font-family: var(--sans);
15
+ font-size: 15px;
16
+ line-height: 1.55;
17
+ scroll-behavior: smooth;
18
+ text-rendering: optimizeLegibility;
19
+ -webkit-font-smoothing: antialiased;
20
+ }
21
+
22
+ body {
23
+ accent-color: var(--accent);
24
+ background: var(--bg);
25
+ color: var(--text);
26
+ margin: 0;
27
+ min-height: 100vh;
28
+ position: relative;
29
+ }
30
+
31
+ main [id] {
32
+ scroll-margin-top: 6rem;
33
+ }
34
+
35
+ ::selection {
36
+ background: var(--accent);
37
+ color: var(--button-text);
38
+ }
39
+
40
+ a {
41
+ color: inherit;
42
+ text-decoration: none;
43
+ }
44
+
45
+ a,
46
+ button,
47
+ summary {
48
+ -webkit-tap-highlight-color: transparent;
49
+ }
50
+
51
+ button,
52
+ input,
53
+ select,
54
+ textarea {
55
+ font: inherit;
56
+ }
57
+
58
+ img,
59
+ svg {
60
+ display: block;
61
+ max-width: 100%;
62
+ }
63
+
64
+ p,
65
+ li {
66
+ color: var(--text-soft);
67
+ line-height: 1.65;
68
+ }
69
+
70
+ /* Headings ride the dot-matrix display face. */
71
+ h1,
72
+ h2,
73
+ h3,
74
+ h4 {
75
+ color: var(--text);
76
+ font-family: var(--display);
77
+ font-weight: 700;
78
+ letter-spacing: 0.01em;
79
+ line-height: 1.06;
80
+ margin: 0;
81
+ text-transform: uppercase;
82
+ }
83
+
84
+ h1 {
85
+ font-size: clamp(2.6rem, 6vw, 4.6rem);
86
+ letter-spacing: 0.02em;
87
+ }
88
+
89
+ h2 {
90
+ font-size: clamp(1.7rem, 3.4vw, 2.4rem);
91
+ }
92
+
93
+ h3 {
94
+ font-size: 1.25rem;
95
+ }
96
+
97
+ h4 {
98
+ font-size: 1rem;
99
+ letter-spacing: var(--tracking-wide);
100
+ }
101
+
102
+ strong,
103
+ b {
104
+ color: var(--text);
105
+ font-weight: 700;
106
+ }
107
+
108
+ code,
109
+ kbd,
110
+ samp {
111
+ background: var(--code-bg);
112
+ border: 1px solid var(--line);
113
+ border-radius: var(--radius-sm);
114
+ color: var(--text);
115
+ font-family: var(--mono);
116
+ font-size: 0.88em;
117
+ padding: 0.1rem 0.36rem;
118
+ }
119
+
120
+ pre {
121
+ background: var(--code-bg);
122
+ border: 1px solid var(--line);
123
+ border-radius: var(--radius-md);
124
+ font-family: var(--mono);
125
+ overflow-x: auto;
126
+ padding: 1rem 1.1rem;
127
+ }
128
+
129
+ pre code {
130
+ background: transparent;
131
+ border: 0;
132
+ padding: 0;
133
+ }
134
+
135
+ hr {
136
+ border: 0;
137
+ border-top: 1px solid var(--line);
138
+ margin: var(--space-lg) 0;
139
+ }
140
+
141
+ ::-webkit-scrollbar {
142
+ height: 10px;
143
+ width: 10px;
144
+ }
145
+
146
+ ::-webkit-scrollbar-thumb {
147
+ background: var(--line-strong);
148
+ border: 2px solid var(--bg);
149
+ border-radius: var(--radius-pill);
150
+ }
151
+
152
+ ::-webkit-scrollbar-track {
153
+ background: transparent;
154
+ }
155
+
156
+ /* Focus — square red ring, on-brand and visible. */
157
+ a:focus-visible,
158
+ button:focus-visible,
159
+ summary:focus-visible,
160
+ input:focus-visible,
161
+ select:focus-visible,
162
+ textarea:focus-visible,
163
+ [tabindex]:focus-visible {
164
+ outline: 2px solid var(--accent);
165
+ outline-offset: 2px;
166
+ }
167
+
168
+ .skip-link {
169
+ background: var(--panel-strong);
170
+ border: 1px solid var(--line-strong);
171
+ border-radius: var(--radius-md);
172
+ color: var(--text);
173
+ left: 1rem;
174
+ padding: 0.7rem 1rem;
175
+ position: fixed;
176
+ top: -4rem;
177
+ z-index: 40;
178
+ }
179
+
180
+ .skip-link:focus {
181
+ top: 1rem;
182
+ }
183
+
184
+ /* Small global helpers reused across apps. */
185
+ .ui-muted {
186
+ color: var(--text-dim);
187
+ }
188
+
189
+ .ui-mono {
190
+ font-family: var(--mono);
191
+ }
192
+
193
+ .ui-display {
194
+ font-family: var(--display);
195
+ text-transform: uppercase;
196
+ }
197
+
198
+ .ui-visually-hidden {
199
+ clip: rect(0 0 0 0);
200
+ clip-path: inset(50%);
201
+ height: 1px;
202
+ overflow: hidden;
203
+ position: absolute;
204
+ white-space: nowrap;
205
+ width: 1px;
206
+ }