@yuneta/gobj-ui 7.23.35 → 7.23.37

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,524 @@
1
+ /***********************************************************************
2
+ * c_yui_gclass.css
3
+ *
4
+ * Styling for C_YUI_GCLASS (the gclass viewer, by zones).
5
+ * Monospace identifiers, one accent per zone, dark-aware.
6
+ * No transitions/animations by design (lib-yui convention).
7
+ *
8
+ * Copyright (c) 2026, ArtGins.
9
+ * All Rights Reserved.
10
+ ***********************************************************************/
11
+
12
+ /*
13
+ * One accent per zone, so a reader who has seen this view twice knows
14
+ * which zone they are in before reading its heading. The values are
15
+ * the ones the doc site's interactive pages use, which were already
16
+ * picked to stay legible on both grounds.
17
+ */
18
+ .C_YUI_GCLASS {
19
+ --gclass-attrs: #2D4EC8;
20
+ --gclass-cmds: #0E6F63;
21
+ --gclass-fsm: #6B4FA8;
22
+ --gclass-live: #9A5B00;
23
+ --gclass-live-bg: rgba(154, 91, 0, .11);
24
+ --gclass-warn: #A3282F;
25
+ --gclass-rule: var(--bulma-border-weak, #e6e6e6);
26
+ --gclass-hair: var(--bulma-border-weak, #ededed);
27
+ --gclass-muted: var(--bulma-text-weak, #6a6a6a);
28
+ --gclass-chip-bg: rgba(0, 0, 0, .05);
29
+ --gclass-none: rgba(0, 0, 0, .10);
30
+ --gclass-mono: ui-monospace, "SF Mono", "Cascadia Mono", Menlo, Consolas,
31
+ "Liberation Mono", monospace;
32
+ }
33
+
34
+ :root[data-theme="dark"] .C_YUI_GCLASS,
35
+ .C_YUI_GCLASS[data-theme="dark"] {
36
+ --gclass-attrs: #7C93F5;
37
+ --gclass-cmds: #46C4B2;
38
+ --gclass-fsm: #B49AE8;
39
+ --gclass-live: #D9A23F;
40
+ --gclass-live-bg: rgba(217, 162, 63, .14);
41
+ --gclass-warn: #E9737A;
42
+ --gclass-chip-bg: rgba(255, 255, 255, .07);
43
+ --gclass-none: rgba(255, 255, 255, .12);
44
+ }
45
+
46
+ @media (prefers-color-scheme: dark) {
47
+ :root:not([data-theme="light"]) .C_YUI_GCLASS {
48
+ --gclass-attrs: #7C93F5;
49
+ --gclass-cmds: #46C4B2;
50
+ --gclass-fsm: #B49AE8;
51
+ --gclass-live: #D9A23F;
52
+ --gclass-live-bg: rgba(217, 162, 63, .14);
53
+ --gclass-warn: #E9737A;
54
+ --gclass-chip-bg: rgba(255, 255, 255, .07);
55
+ --gclass-none: rgba(255, 255, 255, .12);
56
+ }
57
+ }
58
+
59
+ .C_YUI_GCLASS .GCLASS_TOOLBAR {
60
+ border-bottom: 1px solid var(--gclass-rule);
61
+ }
62
+
63
+ /*
64
+ * Same floor the JSON viewer gives its search box, for the same
65
+ * reason: a box that shrinks to the magnifier fits, and cannot be
66
+ * read or corrected.
67
+ */
68
+ .C_YUI_GCLASS .GCLASS_SEARCH_CONTROL {
69
+ flex: 1 1 auto;
70
+ min-width: 9rem;
71
+ }
72
+
73
+ .C_YUI_GCLASS .GCLASS_BODY {
74
+ padding: .75rem;
75
+ }
76
+
77
+ /*
78
+ * The header: the name, and the two numbers a reader asks for before
79
+ * anything else.
80
+ */
81
+ .C_YUI_GCLASS .GCLASS_HEAD {
82
+ display: flex;
83
+ flex-wrap: wrap;
84
+ align-items: baseline;
85
+ gap: .35rem .6rem;
86
+ padding-bottom: .6rem;
87
+ margin-bottom: .8rem;
88
+ border-bottom: 1px solid var(--gclass-rule);
89
+ }
90
+
91
+ .C_YUI_GCLASS .GCLASS_NAME {
92
+ font-family: var(--gclass-mono);
93
+ font-size: 1.05rem;
94
+ font-weight: 600;
95
+ }
96
+
97
+ .C_YUI_GCLASS .GCLASS_INSTANCES {
98
+ display: inline-flex;
99
+ gap: .3rem;
100
+ font-family: var(--gclass-mono);
101
+ font-size: .72rem;
102
+ }
103
+
104
+ /* Specificity on purpose: .GCLASS_CHIP is declared further down and
105
+ * would repaint this one grey at equal weight. */
106
+ .C_YUI_GCLASS .GCLASS_HEAD .GCLASS_CURRENT {
107
+ color: var(--gclass-live);
108
+ background: var(--gclass-live-bg);
109
+ }
110
+
111
+ /*
112
+ * Two columns while there is room for two: the machine grows sideways
113
+ * and everything else grows downwards, so they are the two that must
114
+ * not share a column. Below the breakpoint they stack, which is also
115
+ * the order they are written in.
116
+ */
117
+ .C_YUI_GCLASS .GCLASS_COLS {
118
+ display: grid;
119
+ grid-template-columns: minmax(0, 1fr);
120
+ gap: 1.2rem;
121
+ }
122
+
123
+ @media (min-width: 900px) {
124
+ .C_YUI_GCLASS .GCLASS_COLS {
125
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1.15fr);
126
+ }
127
+
128
+ /* In graph mode the machine is above, across the whole width, and
129
+ * what is left stacks in one column. */
130
+ .C_YUI_GCLASS .GCLASS_COLS.is-stacked {
131
+ grid-template-columns: minmax(0, 1fr);
132
+ }
133
+ }
134
+
135
+ .C_YUI_GCLASS .GCLASS_FULL {
136
+ margin-bottom: 1.2rem;
137
+ }
138
+
139
+ .C_YUI_GCLASS .GCLASS_COL {
140
+ display: flex;
141
+ flex-direction: column;
142
+ gap: 1.1rem;
143
+ min-width: 0;
144
+ }
145
+
146
+ /*
147
+ * A flex item's `min-width` is AUTO, which means "as wide as my
148
+ * content" -- so without this the widest table pushes its zone, its
149
+ * column and the whole viewer past the edge of a phone, and the page
150
+ * itself scrolls sideways however many scrollers are nested inside.
151
+ */
152
+ .C_YUI_GCLASS .GCLASS_ZONE {
153
+ min-width: 0;
154
+ max-width: 100%;
155
+ }
156
+
157
+ .C_YUI_GCLASS .GCLASS_ZONE_BODY {
158
+ min-width: 0;
159
+ max-width: 100%;
160
+ }
161
+
162
+ /*
163
+ * A zone heading is a button: folding a zone is an action, and it goes
164
+ * through the machine like every other one.
165
+ */
166
+ .C_YUI_GCLASS .GCLASS_ZONE_TOGGLE {
167
+ display: flex;
168
+ align-items: center;
169
+ gap: .4rem;
170
+ width: 100%;
171
+ padding: 0 0 .35rem 0;
172
+ margin-bottom: .5rem;
173
+ background: none;
174
+ border: 0;
175
+ border-bottom: 1px solid var(--gclass-rule);
176
+ color: inherit;
177
+ cursor: pointer;
178
+ text-align: left;
179
+ font-size: .7rem;
180
+ font-weight: 700;
181
+ letter-spacing: .12em;
182
+ text-transform: uppercase;
183
+ }
184
+
185
+ .C_YUI_GCLASS .GCLASS_ZONE_TOGGLE:focus-visible {
186
+ outline: 2px solid var(--bulma-link, #3273dc);
187
+ outline-offset: 2px;
188
+ }
189
+
190
+ .C_YUI_GCLASS .GCLASS_ZONE_COUNT {
191
+ margin-left: auto;
192
+ font-family: var(--gclass-mono);
193
+ font-weight: 400;
194
+ letter-spacing: normal;
195
+ color: var(--gclass-muted);
196
+ }
197
+
198
+ .C_YUI_GCLASS .GCLASS_ZONE_ARROW .yi-chevron-right,
199
+ .C_YUI_GCLASS .GCLASS_ZONE_ARROW .yi-chevron-down {
200
+ width: .8em;
201
+ height: .8em;
202
+ }
203
+
204
+ .C_YUI_GCLASS .GCLASS_ZONE_ATTRS .GCLASS_ZONE_TITLE { color: var(--gclass-attrs); }
205
+ .C_YUI_GCLASS .GCLASS_ZONE_COMMANDS .GCLASS_ZONE_TITLE { color: var(--gclass-cmds); }
206
+ .C_YUI_GCLASS .GCLASS_ZONE_MACHINE .GCLASS_ZONE_TITLE { color: var(--gclass-fsm); }
207
+
208
+ .C_YUI_GCLASS .GCLASS_ZONE_EMPTY {
209
+ padding: .45rem .6rem;
210
+ border: 1px dashed var(--gclass-rule);
211
+ border-radius: 2px;
212
+ color: var(--gclass-muted);
213
+ font-size: .8rem;
214
+ }
215
+
216
+ .C_YUI_GCLASS .GCLASS_SUBTITLE {
217
+ margin: .8rem 0 .4rem;
218
+ font-size: .68rem;
219
+ font-weight: 700;
220
+ letter-spacing: .12em;
221
+ text-transform: uppercase;
222
+ color: var(--gclass-muted);
223
+ }
224
+
225
+ /*
226
+ * Tables. Identifiers are monospace everywhere -- they are compared
227
+ * by eye against a source file, and a proportional font breaks that.
228
+ */
229
+ .C_YUI_GCLASS .GCLASS_TABLE {
230
+ width: 100%;
231
+ border-collapse: collapse;
232
+ font-family: var(--gclass-mono);
233
+ font-size: .76rem;
234
+ font-variant-numeric: tabular-nums;
235
+ }
236
+
237
+ .C_YUI_GCLASS .GCLASS_TABLE th {
238
+ text-align: left;
239
+ padding: 0 .5rem .3rem 0;
240
+ border-bottom: 1px solid var(--gclass-rule);
241
+ font-family: inherit;
242
+ font-size: .64rem;
243
+ font-weight: 500;
244
+ letter-spacing: .06em;
245
+ text-transform: uppercase;
246
+ color: var(--gclass-muted);
247
+ white-space: nowrap;
248
+ }
249
+
250
+ .C_YUI_GCLASS .GCLASS_TABLE td {
251
+ padding: .22rem .5rem .22rem 0;
252
+ border-bottom: 1px solid var(--gclass-hair);
253
+ vertical-align: top;
254
+ }
255
+
256
+ .C_YUI_GCLASS .GCLASS_TABLE tbody tr:last-child td {
257
+ border-bottom: 0;
258
+ }
259
+
260
+ .C_YUI_GCLASS .GCLASS_CELL_KEY {
261
+ font-weight: 500;
262
+ white-space: nowrap;
263
+ }
264
+
265
+ .C_YUI_GCLASS .GCLASS_CELL_TYPE,
266
+ .C_YUI_GCLASS .GCLASS_CELL_DEFAULT,
267
+ .C_YUI_GCLASS .GCLASS_CELL_DESC {
268
+ color: var(--gclass-muted);
269
+ }
270
+
271
+ .C_YUI_GCLASS .GCLASS_CELL_TYPE { white-space: nowrap; }
272
+
273
+ .C_YUI_GCLASS .GCLASS_CMD_SECTION td {
274
+ padding-top: .7rem;
275
+ font-size: .64rem;
276
+ font-weight: 700;
277
+ letter-spacing: .12em;
278
+ text-transform: uppercase;
279
+ color: var(--gclass-cmds);
280
+ border-bottom: 0;
281
+ }
282
+
283
+ .C_YUI_GCLASS .GCLASS_CMD_PARAM .GCLASS_CELL_KEY {
284
+ padding-left: .9rem;
285
+ font-weight: 400;
286
+ }
287
+
288
+ .C_YUI_GCLASS .GCLASS_PARAM_MARK,
289
+ .C_YUI_GCLASS .GCLASS_PARAM_TYPE {
290
+ color: var(--gclass-muted);
291
+ }
292
+
293
+ .C_YUI_GCLASS .GCLASS_PARAM_NAME {
294
+ color: var(--gclass-cmds);
295
+ margin: 0 .35rem;
296
+ }
297
+
298
+ /*
299
+ * Chips. A flag that changes what the reader may DO with the thing
300
+ * gets a colour; the rest stay quiet, or the row turns into a
301
+ * fairground.
302
+ */
303
+ .C_YUI_GCLASS .GCLASS_CHIP {
304
+ display: inline-block;
305
+ padding: 0 .35rem;
306
+ border-radius: 2px;
307
+ background: var(--gclass-chip-bg);
308
+ color: var(--gclass-muted);
309
+ font-size: .64rem;
310
+ line-height: 1.5;
311
+ white-space: nowrap;
312
+ }
313
+
314
+ .C_YUI_GCLASS .GCLASS_CHIP + .GCLASS_CHIP { margin-left: .2rem; }
315
+
316
+ .C_YUI_GCLASS .GCLASS_FLAG.is-persist { color: var(--gclass-live); }
317
+ .C_YUI_GCLASS .GCLASS_FLAG.is-writable { color: var(--gclass-attrs); }
318
+ .C_YUI_GCLASS .GCLASS_FLAG.is-authz,
319
+ .C_YUI_GCLASS .GCLASS_FLAG.is-required { color: var(--gclass-warn); }
320
+ .C_YUI_GCLASS .GCLASS_EVFLAG.is-output { color: var(--gclass-cmds); }
321
+ .C_YUI_GCLASS .GCLASS_ALIAS { color: var(--gclass-cmds); }
322
+
323
+ .C_YUI_GCLASS .GCLASS_CHIPS {
324
+ display: flex;
325
+ flex-wrap: wrap;
326
+ gap: .25rem;
327
+ }
328
+
329
+ .C_YUI_GCLASS .GCLASS_CHIPS .GCLASS_CHIP + .GCLASS_CHIP { margin-left: 0; }
330
+
331
+ .C_YUI_GCLASS .GCLASS_METHOD {
332
+ font-family: var(--gclass-mono);
333
+ color: var(--bulma-text-strong, #363636);
334
+ }
335
+
336
+ /*
337
+ * Every table scrolls INSIDE its own box -- the viewer's body must
338
+ * never scroll sideways, whether it is a matrix with eight states or
339
+ * an attrs table with a long description on a phone.
340
+ */
341
+ .C_YUI_GCLASS .GCLASS_SCROLL {
342
+ overflow-x: auto;
343
+ max-width: 100%;
344
+ }
345
+
346
+ .C_YUI_GCLASS .GCLASS_MATRIX {
347
+ width: auto;
348
+ min-width: 100%;
349
+ }
350
+
351
+ /* A description may wrap; an identifier may not. Without this the
352
+ * attrs table is as wide as its longest sentence. */
353
+ .C_YUI_GCLASS .GCLASS_TABLE_ATTRS,
354
+ .C_YUI_GCLASS .GCLASS_TABLE_COMMANDS,
355
+ .C_YUI_GCLASS .GCLASS_TABLE_TRACES {
356
+ min-width: 22rem;
357
+ }
358
+
359
+ .C_YUI_GCLASS .GCLASS_CELL_DESC {
360
+ min-width: 10rem;
361
+ }
362
+
363
+ .C_YUI_GCLASS .GCLASS_MATRIX th,
364
+ .C_YUI_GCLASS .GCLASS_MATRIX td {
365
+ border: 1px solid var(--gclass-hair);
366
+ padding: .22rem .45rem;
367
+ white-space: nowrap;
368
+ vertical-align: middle;
369
+ }
370
+
371
+ .C_YUI_GCLASS .GCLASS_MX_STATE {
372
+ background: var(--gclass-chip-bg);
373
+ color: var(--bulma-text-strong, #363636);
374
+ font-size: .68rem;
375
+ font-weight: 600;
376
+ text-transform: none;
377
+ letter-spacing: normal;
378
+ }
379
+
380
+ .C_YUI_GCLASS .GCLASS_MX_STATE.is-current {
381
+ background: var(--gclass-live-bg);
382
+ color: var(--gclass-live);
383
+ border-color: var(--gclass-live);
384
+ }
385
+
386
+ .C_YUI_GCLASS .GCLASS_MX_MARK {
387
+ margin-left: .3rem;
388
+ color: var(--gclass-warn);
389
+ cursor: help;
390
+ }
391
+
392
+ /*
393
+ * The event column stays put while the states scroll past it.
394
+ *
395
+ * Without this the matrix is unreadable the moment it scrolls: the
396
+ * cells say `● ▸ ST_DISCONNECTED` and nothing on screen says which
397
+ * EVENT does that. It needs an opaque background of its own -- a
398
+ * sticky cell is painted over by whatever slides under it.
399
+ */
400
+ .C_YUI_GCLASS .GCLASS_MX_EVENT,
401
+ .C_YUI_GCLASS .GCLASS_MX_CORNER {
402
+ position: sticky;
403
+ left: 0;
404
+ z-index: 1;
405
+ background: var(--bulma-scheme-main, #fff);
406
+ }
407
+
408
+ .C_YUI_GCLASS .GCLASS_MX_EVENT {
409
+ font-weight: 500;
410
+ }
411
+
412
+ .C_YUI_GCLASS .GCLASS_MX_ACTION { color: var(--gclass-fsm); }
413
+ .C_YUI_GCLASS .GCLASS_MX_ACTION.is-unnamed { cursor: help; }
414
+ .C_YUI_GCLASS .GCLASS_MX_ARROW,
415
+ .C_YUI_GCLASS .GCLASS_MX_NEXT { color: var(--gclass-muted); }
416
+ .C_YUI_GCLASS .GCLASS_MX_ARROW { padding: 0 .15rem; }
417
+
418
+ .C_YUI_GCLASS .GCLASS_MX_CELL.is-current { background: var(--gclass-live-bg); }
419
+
420
+ /*
421
+ * An empty cell is INFORMATION: that event, in that state, is refused
422
+ * with "Event NOT DEFINED in state". Hatching says so; blank would
423
+ * read as "nothing to see here", which is the opposite.
424
+ */
425
+ .C_YUI_GCLASS .GCLASS_MX_CELL.is-none {
426
+ color: var(--gclass-none);
427
+ text-align: center;
428
+ cursor: help;
429
+ background-image: repeating-linear-gradient(
430
+ 135deg, transparent, transparent 5px,
431
+ var(--gclass-none) 5px, var(--gclass-none) 6px);
432
+ }
433
+
434
+ .C_YUI_GCLASS .GCLASS_LEGEND {
435
+ display: flex;
436
+ flex-wrap: wrap;
437
+ gap: .3rem 1.1rem;
438
+ margin-top: .6rem;
439
+ font-size: .7rem;
440
+ color: var(--gclass-muted);
441
+ }
442
+
443
+ .C_YUI_GCLASS .GCLASS_LEGEND_ITEM {
444
+ display: inline-flex;
445
+ align-items: center;
446
+ gap: .4rem;
447
+ }
448
+
449
+ .C_YUI_GCLASS .GCLASS_LEGEND_SWATCH {
450
+ display: inline-block;
451
+ width: 1.4em;
452
+ height: .85em;
453
+ border: 1px solid var(--gclass-hair);
454
+ border-radius: 2px;
455
+ font-style: normal;
456
+ font-size: .7em;
457
+ line-height: 1;
458
+ text-align: center;
459
+ }
460
+
461
+ .C_YUI_GCLASS .GCLASS_LEGEND_SWATCH.is-none {
462
+ background-image: repeating-linear-gradient(
463
+ 135deg, transparent, transparent 5px,
464
+ var(--gclass-none) 5px, var(--gclass-none) 6px);
465
+ }
466
+
467
+ .C_YUI_GCLASS .GCLASS_LEGEND_SWATCH.is-current {
468
+ background: var(--gclass-live-bg);
469
+ border-color: var(--gclass-live);
470
+ }
471
+
472
+ .C_YUI_GCLASS .GCLASS_LEGEND_SWATCH.is-unreachable {
473
+ border-color: transparent;
474
+ color: var(--gclass-warn);
475
+ width: auto;
476
+ }
477
+
478
+ .C_YUI_GCLASS .GCLASS_PUB_EVENT { color: var(--gclass-cmds); }
479
+
480
+ /*
481
+ * The raw view: the description as the backend answered it.
482
+ */
483
+ .C_YUI_GCLASS .GCLASS_RAW_BODY {
484
+ margin: 0;
485
+ padding: .75rem;
486
+ background: none;
487
+ font-family: var(--gclass-mono);
488
+ font-size: .76rem;
489
+ line-height: 1.45;
490
+ white-space: pre;
491
+ tab-size: 4;
492
+ }
493
+
494
+ /*
495
+ * The machine's own switch, and the box its graph lives in.
496
+ *
497
+ * A graph needs a HEIGHT: the zone is as tall as its content, and a
498
+ * canvas asked to be "as tall as its content" is 0 pixels tall.
499
+ */
500
+ .C_YUI_GCLASS .GCLASS_MACHINE_SWITCH {
501
+ margin-bottom: .5rem;
502
+ }
503
+
504
+ .C_YUI_GCLASS .GCLASS_GRAPH_MOUNT {
505
+ height: 26rem;
506
+ min-height: 16rem;
507
+ max-height: 70vh;
508
+ }
509
+
510
+ /*
511
+ * An event declared with no action at all: legal here, and it does
512
+ * nothing. Quieter than an action and louder than an empty cell,
513
+ * because it is neither.
514
+ */
515
+ .C_YUI_GCLASS .GCLASS_MX_ACTION.is-none-action {
516
+ color: var(--gclass-muted);
517
+ cursor: help;
518
+ }
519
+
520
+ .C_YUI_GCLASS .GCLASS_LEGEND_SWATCH.is-none-action {
521
+ border-color: transparent;
522
+ color: var(--gclass-muted);
523
+ width: auto;
524
+ }