@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.
@@ -0,0 +1,146 @@
1
+ /* ==========================================================================
2
+ navigation — site nav, menu, theme toggle (Nothing flat, dot indicator)
3
+ Class names preserved for personal-site compatibility.
4
+ ========================================================================== */
5
+
6
+ .site-menu {
7
+ display: none;
8
+ position: relative;
9
+ }
10
+
11
+ .site-menu__toggle,
12
+ .theme-toggle__button {
13
+ align-items: center;
14
+ background: transparent;
15
+ border: 1px solid var(--line-strong);
16
+ border-radius: var(--radius-md);
17
+ color: var(--text);
18
+ cursor: pointer;
19
+ display: inline-flex;
20
+ font-family: var(--mono);
21
+ font-size: var(--text-xs);
22
+ font-weight: 600;
23
+ gap: 0.4rem;
24
+ letter-spacing: var(--tracking-wide);
25
+ list-style: none;
26
+ min-height: 2rem;
27
+ padding: 0.42rem 0.66rem;
28
+ text-transform: uppercase;
29
+ transition:
30
+ background-color var(--duration-fast) var(--ease-standard),
31
+ border-color var(--duration-fast) var(--ease-standard),
32
+ color var(--duration-fast) var(--ease-standard);
33
+ white-space: nowrap;
34
+ }
35
+
36
+ .theme-toggle__button {
37
+ justify-content: center;
38
+ min-width: 7rem;
39
+ }
40
+
41
+ .site-menu__toggle::-webkit-details-marker {
42
+ display: none;
43
+ }
44
+
45
+ .site-menu[open] .site-menu__toggle,
46
+ .site-menu__toggle:hover,
47
+ .theme-toggle__button:hover {
48
+ border-color: var(--accent);
49
+ color: var(--accent);
50
+ }
51
+
52
+ .theme-toggle__prefix {
53
+ color: var(--text-dim);
54
+ }
55
+
56
+ .theme-toggle__label {
57
+ color: var(--text);
58
+ font-weight: 700;
59
+ }
60
+
61
+ .theme-toggle__track {
62
+ background: var(--panel-soft);
63
+ border: 1px solid var(--line-strong);
64
+ border-radius: var(--radius-pill);
65
+ display: inline-flex;
66
+ height: 0.8rem;
67
+ padding: 0.12rem;
68
+ width: 1.5rem;
69
+ }
70
+
71
+ .theme-toggle__thumb {
72
+ background: var(--text-dim);
73
+ border-radius: 50%;
74
+ display: block;
75
+ height: 100%;
76
+ transform: translateX(0);
77
+ transition:
78
+ background-color var(--duration-fast) var(--ease-standard),
79
+ transform var(--duration-fast) var(--ease-spring);
80
+ width: 0.56rem;
81
+ }
82
+
83
+ [data-theme='dark'] .theme-toggle__thumb {
84
+ background: var(--accent);
85
+ transform: translateX(0.6rem);
86
+ }
87
+
88
+ .site-nav {
89
+ display: inline-flex;
90
+ gap: 0.15rem;
91
+ }
92
+
93
+ .site-nav a {
94
+ align-items: center;
95
+ border: 1px solid transparent;
96
+ border-radius: var(--radius-md);
97
+ color: var(--text-soft);
98
+ display: inline-flex;
99
+ font-family: var(--mono);
100
+ font-size: var(--text-xs);
101
+ gap: 0.45rem;
102
+ letter-spacing: var(--tracking-wide);
103
+ padding: 0.4rem 0.6rem;
104
+ position: relative;
105
+ text-transform: uppercase;
106
+ transition:
107
+ border-color var(--duration-fast) var(--ease-standard),
108
+ background-color var(--duration-fast) var(--ease-standard),
109
+ color var(--duration-fast) var(--ease-standard);
110
+ }
111
+
112
+ /* Leading dot is the active/hover indicator — Nothing glyph cue. */
113
+ .site-nav a::before {
114
+ background: currentColor;
115
+ border-radius: 50%;
116
+ content: '';
117
+ height: 0.32rem;
118
+ opacity: 0;
119
+ transform: scale(0.5);
120
+ transition:
121
+ opacity var(--duration-fast) var(--ease-standard),
122
+ transform var(--duration-fast) var(--ease-spring);
123
+ width: 0.32rem;
124
+ }
125
+
126
+ .site-nav a:hover,
127
+ .site-nav a.is-active {
128
+ color: var(--text);
129
+ }
130
+
131
+ .site-nav a.is-active {
132
+ color: var(--accent);
133
+ }
134
+
135
+ .site-nav a:hover::before,
136
+ .site-nav a.is-active::before {
137
+ opacity: 1;
138
+ transform: scale(1);
139
+ }
140
+
141
+ @media (hover: hover) {
142
+ .site-menu__toggle:active,
143
+ .theme-toggle__button:active {
144
+ transform: translateY(1px);
145
+ }
146
+ }
@@ -0,0 +1,321 @@
1
+ /* ==========================================================================
2
+ primitives — ui-* building blocks, Nothing-flat
3
+ Flat surfaces, hairline borders, sharp corners, rationed colour.
4
+ ========================================================================== */
5
+
6
+ /* --- Layout composition --- */
7
+
8
+ .ui-stack {
9
+ display: grid;
10
+ gap: var(--stack-gap, var(--space-md));
11
+ }
12
+
13
+ .ui-cluster {
14
+ align-items: center;
15
+ display: flex;
16
+ flex-wrap: wrap;
17
+ gap: var(--cluster-gap, var(--space-xs));
18
+ }
19
+
20
+ .ui-cluster--between {
21
+ justify-content: space-between;
22
+ }
23
+
24
+ .ui-grid {
25
+ display: grid;
26
+ gap: var(--grid-gap, var(--space-md));
27
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, var(--grid-min, 16rem)), 1fr));
28
+ }
29
+
30
+ /* --- Surfaces --- */
31
+
32
+ .ui-surface,
33
+ .ui-card,
34
+ .ui-panel {
35
+ background: var(--panel);
36
+ border: 1px solid var(--line);
37
+ }
38
+
39
+ .ui-card,
40
+ .ui-panel {
41
+ border-radius: var(--radius-lg);
42
+ display: grid;
43
+ gap: var(--space-sm);
44
+ padding: var(--space-md);
45
+ }
46
+
47
+ .ui-card {
48
+ transition:
49
+ border-color var(--duration-base) var(--ease-standard),
50
+ background-color var(--duration-base) var(--ease-standard),
51
+ transform var(--duration-base) var(--ease-standard);
52
+ }
53
+
54
+ .ui-panel {
55
+ background: var(--panel-strong);
56
+ }
57
+
58
+ .ui-card--accent {
59
+ border-color: var(--accent);
60
+ }
61
+
62
+ .ui-card__head,
63
+ .ui-panel__head {
64
+ align-items: flex-start;
65
+ display: flex;
66
+ gap: var(--space-sm);
67
+ justify-content: space-between;
68
+ }
69
+
70
+ .ui-divider {
71
+ border: 0;
72
+ border-top: 1px solid var(--line);
73
+ margin: 0;
74
+ }
75
+
76
+ /* --- Eyebrow / section label — dot-matrix face --- */
77
+
78
+ .ui-eyebrow {
79
+ color: var(--accent);
80
+ font-family: var(--display);
81
+ font-size: var(--text-xs);
82
+ font-weight: 700;
83
+ letter-spacing: var(--tracking-wide);
84
+ margin: 0;
85
+ text-transform: uppercase;
86
+ }
87
+
88
+ .ui-eyebrow--muted {
89
+ color: var(--text-dim);
90
+ }
91
+
92
+ /* --- Buttons --- */
93
+
94
+ .ui-button {
95
+ align-items: center;
96
+ background: var(--accent);
97
+ border: 1px solid var(--accent);
98
+ border-radius: var(--radius-md);
99
+ color: var(--button-text);
100
+ cursor: pointer;
101
+ display: inline-flex;
102
+ font-family: var(--mono);
103
+ font-size: var(--text-sm);
104
+ font-weight: 600;
105
+ gap: 0.45rem;
106
+ justify-content: center;
107
+ letter-spacing: var(--tracking-wide);
108
+ line-height: 1;
109
+ min-height: 2.4rem;
110
+ min-width: 2.4rem;
111
+ padding: 0.66rem 1rem;
112
+ text-transform: uppercase;
113
+ transition:
114
+ background-color var(--duration-fast) var(--ease-standard),
115
+ border-color var(--duration-fast) var(--ease-standard),
116
+ color var(--duration-fast) var(--ease-standard),
117
+ transform var(--duration-fast) var(--ease-standard);
118
+ }
119
+
120
+ .ui-button--ghost {
121
+ background: transparent;
122
+ border-color: var(--line-strong);
123
+ color: var(--text);
124
+ }
125
+
126
+ .ui-button--subtle {
127
+ background: var(--panel-soft);
128
+ border-color: var(--line);
129
+ color: var(--text);
130
+ }
131
+
132
+ .ui-button--danger {
133
+ background: var(--danger);
134
+ border-color: var(--danger);
135
+ color: var(--button-text);
136
+ }
137
+
138
+ .ui-button--icon {
139
+ aspect-ratio: 1;
140
+ min-width: 2.4rem;
141
+ padding: 0;
142
+ }
143
+
144
+ .ui-button:disabled,
145
+ .ui-button[aria-disabled='true'] {
146
+ cursor: not-allowed;
147
+ opacity: 0.45;
148
+ }
149
+
150
+ .ui-button:active {
151
+ transform: translateY(1px);
152
+ }
153
+
154
+ /* --- Link --- */
155
+
156
+ .ui-link {
157
+ color: var(--text);
158
+ text-decoration: underline;
159
+ text-decoration-color: color-mix(in srgb, var(--accent) 55%, transparent);
160
+ text-decoration-thickness: 1px;
161
+ text-underline-offset: 0.22rem;
162
+ transition:
163
+ color var(--duration-fast) var(--ease-standard),
164
+ text-decoration-color var(--duration-fast) var(--ease-standard);
165
+ }
166
+
167
+ .ui-link--arrow {
168
+ align-items: center;
169
+ display: inline-flex;
170
+ gap: 0.4rem;
171
+ text-decoration: none;
172
+ }
173
+
174
+ .ui-link--arrow::after {
175
+ border-right: 1px solid currentColor;
176
+ border-top: 1px solid currentColor;
177
+ content: '';
178
+ height: 0.42rem;
179
+ transform: rotate(45deg);
180
+ transition: transform var(--duration-fast) var(--ease-standard);
181
+ width: 0.42rem;
182
+ }
183
+
184
+ /* --- Chip / tag --- */
185
+
186
+ .ui-chip {
187
+ align-items: center;
188
+ background: transparent;
189
+ border: 1px solid var(--line-strong);
190
+ border-radius: var(--radius-sm);
191
+ color: var(--text-soft);
192
+ display: inline-flex;
193
+ font-family: var(--mono);
194
+ font-size: var(--text-2xs);
195
+ gap: 0.36rem;
196
+ letter-spacing: var(--tracking-wide);
197
+ line-height: 1;
198
+ min-height: 1.7rem;
199
+ padding: 0.32rem 0.55rem;
200
+ text-transform: uppercase;
201
+ }
202
+
203
+ .ui-chip--accent {
204
+ border-color: var(--accent);
205
+ color: var(--accent);
206
+ }
207
+
208
+ /* --- Badge / status pill --- */
209
+
210
+ .ui-badge {
211
+ align-items: center;
212
+ background: var(--panel-soft);
213
+ border: 1px solid var(--line);
214
+ border-radius: var(--radius-sm);
215
+ color: var(--text-soft);
216
+ display: inline-flex;
217
+ font-family: var(--mono);
218
+ font-size: var(--text-2xs);
219
+ font-weight: 700;
220
+ gap: 0.34rem;
221
+ letter-spacing: var(--tracking-wide);
222
+ line-height: 1;
223
+ padding: 0.28rem 0.5rem;
224
+ text-transform: uppercase;
225
+ }
226
+
227
+ .ui-badge--accent {
228
+ background: var(--accent-soft);
229
+ border-color: color-mix(in srgb, var(--accent) 45%, var(--line));
230
+ color: var(--accent);
231
+ }
232
+
233
+ .ui-badge--success {
234
+ background: var(--success-soft);
235
+ border-color: color-mix(in srgb, var(--success) 40%, var(--line));
236
+ color: var(--success);
237
+ }
238
+
239
+ .ui-badge--warning {
240
+ background: var(--warning-soft);
241
+ border-color: color-mix(in srgb, var(--warning) 40%, var(--line));
242
+ color: var(--warning);
243
+ }
244
+
245
+ .ui-badge--danger {
246
+ background: var(--danger-soft);
247
+ border-color: color-mix(in srgb, var(--danger) 40%, var(--line));
248
+ color: var(--danger);
249
+ }
250
+
251
+ /* --- Key/value list --- */
252
+
253
+ .ui-key-value {
254
+ display: grid;
255
+ gap: 0.55rem;
256
+ margin: 0;
257
+ }
258
+
259
+ .ui-key-value div {
260
+ border-top: 1px solid var(--line);
261
+ display: grid;
262
+ gap: 0.16rem;
263
+ padding-top: 0.6rem;
264
+ }
265
+
266
+ .ui-key-value dt {
267
+ color: var(--text-dim);
268
+ font-family: var(--mono);
269
+ font-size: var(--text-2xs);
270
+ font-weight: 700;
271
+ letter-spacing: var(--tracking-wide);
272
+ line-height: 1;
273
+ text-transform: uppercase;
274
+ }
275
+
276
+ .ui-key-value dd {
277
+ color: var(--text);
278
+ font-family: var(--mono);
279
+ margin: 0;
280
+ }
281
+
282
+ /* --- Hover (pointer only) --- */
283
+
284
+ @media (hover: hover) {
285
+ .ui-card:hover {
286
+ border-color: var(--line-strong);
287
+ }
288
+
289
+ .ui-card--interactive:hover {
290
+ transform: translateY(-2px);
291
+ }
292
+
293
+ .ui-button:hover {
294
+ background: var(--accent-strong);
295
+ border-color: var(--accent-strong);
296
+ }
297
+
298
+ .ui-button--ghost:hover,
299
+ .ui-button--subtle:hover {
300
+ background: var(--panel-soft);
301
+ border-color: var(--accent);
302
+ color: var(--text);
303
+ }
304
+
305
+ .ui-button--danger:hover {
306
+ background: color-mix(in srgb, var(--danger) 84%, #000);
307
+ }
308
+
309
+ .ui-link:hover {
310
+ color: var(--accent);
311
+ text-decoration-color: var(--accent);
312
+ }
313
+
314
+ .ui-link--arrow:hover::after {
315
+ transform: translateX(0.14rem) rotate(45deg);
316
+ }
317
+
318
+ .ui-chip--accent:hover {
319
+ background: var(--accent-soft);
320
+ }
321
+ }
@@ -0,0 +1,157 @@
1
+ /* ==========================================================================
2
+ responsive — breakpoint overrides
3
+ Keyframes and reduced-motion handling now live in motion.css.
4
+ ========================================================================== */
5
+
6
+ @media (max-width: 1120px) {
7
+ .hero,
8
+ .profile-grid,
9
+ .project-detail-grid,
10
+ .project-detail-layout,
11
+ .project-artifact {
12
+ grid-template-columns: 1fr;
13
+ }
14
+
15
+ .project-side {
16
+ position: static;
17
+ }
18
+
19
+ .metric-grid,
20
+ .principle-grid {
21
+ grid-template-columns: repeat(2, minmax(0, 1fr));
22
+ }
23
+ }
24
+
25
+ @media (max-width: 820px) {
26
+ .site-shell {
27
+ padding: 0.9rem;
28
+ }
29
+
30
+ .hero,
31
+ .page-head,
32
+ .post-shell {
33
+ padding: 1.25rem;
34
+ }
35
+
36
+ .site-footer,
37
+ .section-head,
38
+ .signal-panel__readout,
39
+ .project-card__header,
40
+ .post-card__meta,
41
+ .post-header__meta,
42
+ .project-teaser__topline,
43
+ .project-page__headline {
44
+ align-items: flex-start;
45
+ flex-direction: column;
46
+ }
47
+
48
+ .site-footer__links {
49
+ justify-content: flex-start;
50
+ }
51
+
52
+ .site-nav--desktop {
53
+ display: none;
54
+ }
55
+
56
+ .site-header__actions {
57
+ align-items: center;
58
+ margin-left: auto;
59
+ }
60
+
61
+ .site-menu {
62
+ display: block;
63
+ }
64
+
65
+ .site-menu[open] {
66
+ min-width: 0;
67
+ }
68
+
69
+ .site-menu[open] .site-nav--mobile {
70
+ display: grid;
71
+ }
72
+
73
+ .site-nav--mobile {
74
+ background: var(--panel-strong);
75
+ border: 1px solid var(--line);
76
+ border-radius: var(--radius-lg);
77
+ box-shadow: var(--shadow-raised);
78
+ display: none;
79
+ gap: 0.35rem;
80
+ margin-top: 0;
81
+ padding: 0.6rem;
82
+ position: absolute;
83
+ right: 0;
84
+ top: calc(100% + 0.7rem);
85
+ width: min(12rem, calc(100vw - 1.8rem));
86
+ z-index: 20;
87
+ }
88
+
89
+ .site-nav--mobile a {
90
+ width: 100%;
91
+ }
92
+
93
+ .hero--home .problem-panel {
94
+ border-left: 0;
95
+ border-top: 1px solid var(--line);
96
+ padding: 1rem 0 0;
97
+ }
98
+
99
+ .metric-grid,
100
+ .project-grid,
101
+ .project-teaser-grid,
102
+ .misc-grid,
103
+ .home-grid,
104
+ .essay-grid,
105
+ .principle-grid,
106
+ .profile-grid,
107
+ .project-detail-grid,
108
+ .project-pager {
109
+ grid-template-columns: 1fr;
110
+ }
111
+
112
+ .notes-strip {
113
+ grid-template-columns: 1fr;
114
+ }
115
+
116
+ .notes-strip__latest {
117
+ border-left: 0;
118
+ border-top: 1px solid var(--line);
119
+ padding-left: 0;
120
+ padding-top: 1rem;
121
+ }
122
+
123
+ .hero--home .hero__panel {
124
+ display: grid;
125
+ }
126
+
127
+ .dot-field {
128
+ grid-template-columns: repeat(8, minmax(0, 1fr));
129
+ }
130
+
131
+ h1 {
132
+ font-size: 2.65rem;
133
+ }
134
+
135
+ .page-head h1 {
136
+ font-size: 2.25rem;
137
+ }
138
+
139
+ .page-head h1,
140
+ .post-header h1 {
141
+ overflow-wrap: anywhere;
142
+ }
143
+
144
+ h2 {
145
+ font-size: 1.9rem;
146
+ }
147
+ }
148
+
149
+ @media (max-width: 460px) {
150
+ .theme-toggle__prefix {
151
+ display: none;
152
+ }
153
+
154
+ .theme-toggle__button {
155
+ min-width: 4.2rem;
156
+ }
157
+ }
package/css/table.css ADDED
@@ -0,0 +1,102 @@
1
+ /* ==========================================================================
2
+ table — ui-table, dense + comfortable
3
+ Built for admin dashboards (polpo-admin) as well as content tables.
4
+ ========================================================================== */
5
+
6
+ .ui-table-wrap {
7
+ border: 1px solid var(--line);
8
+ border-radius: var(--radius-md);
9
+ overflow: auto;
10
+ }
11
+
12
+ .ui-table {
13
+ border-collapse: collapse;
14
+ font-family: var(--mono);
15
+ font-size: var(--text-sm);
16
+ min-width: 100%;
17
+ width: 100%;
18
+ }
19
+
20
+ .ui-table th,
21
+ .ui-table td {
22
+ border-bottom: 1px solid var(--line);
23
+ overflow-wrap: anywhere;
24
+ padding: 0.7rem 0.85rem;
25
+ text-align: left;
26
+ vertical-align: top;
27
+ }
28
+
29
+ .ui-table th {
30
+ background: var(--panel);
31
+ color: var(--text-dim);
32
+ font-size: var(--text-2xs);
33
+ font-weight: 700;
34
+ letter-spacing: var(--tracking-wide);
35
+ position: sticky;
36
+ text-transform: uppercase;
37
+ top: 0;
38
+ }
39
+
40
+ .ui-table td {
41
+ color: var(--text-soft);
42
+ }
43
+
44
+ .ui-table tbody tr:last-child td {
45
+ border-bottom: 0;
46
+ }
47
+
48
+ .ui-table tbody tr {
49
+ transition: background-color var(--duration-fast) var(--ease-standard);
50
+ }
51
+
52
+ @media (hover: hover) {
53
+ .ui-table tbody tr:hover td {
54
+ background: var(--bg-accent);
55
+ }
56
+ }
57
+
58
+ .ui-table--dense th,
59
+ .ui-table--dense td {
60
+ font-size: var(--text-xs);
61
+ padding: 0.42rem 0.6rem;
62
+ }
63
+
64
+ .ui-table--comfortable th,
65
+ .ui-table--comfortable td {
66
+ padding: 0.95rem 1.1rem;
67
+ }
68
+
69
+ .ui-table--lined td {
70
+ border-right: 1px solid var(--line);
71
+ }
72
+
73
+ .ui-table--lined td:last-child {
74
+ border-right: 0;
75
+ }
76
+
77
+ /* Numeric / right-aligned cells. */
78
+ .ui-table .is-num,
79
+ .ui-table th.is-num {
80
+ font-variant-numeric: tabular-nums;
81
+ text-align: right;
82
+ }
83
+
84
+ .ui-table .is-pos {
85
+ color: var(--success);
86
+ }
87
+
88
+ .ui-table .is-neg {
89
+ color: var(--danger);
90
+ }
91
+
92
+ .ui-table .is-key {
93
+ color: var(--text);
94
+ font-weight: 600;
95
+ }
96
+
97
+ /* Empty state row. */
98
+ .ui-table__empty td {
99
+ color: var(--text-dim);
100
+ padding: 2rem;
101
+ text-align: center;
102
+ }