@kolkrabbi/kol-theme 0.146.0 → 0.147.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/kol-components-atoms.css +20 -2
- package/kol-components-molecules.css +339 -46
- package/package.json +1 -1
package/kol-components-atoms.css
CHANGED
|
@@ -109,7 +109,7 @@
|
|
|
109
109
|
bottom: 4px;
|
|
110
110
|
right: 4px;
|
|
111
111
|
display: inline-flex;
|
|
112
|
-
color: var(--kol-
|
|
112
|
+
color: var(--kol-oq-48);
|
|
113
113
|
cursor: nwse-resize;
|
|
114
114
|
touch-action: none;
|
|
115
115
|
}
|
|
@@ -162,6 +162,8 @@
|
|
|
162
162
|
inset: 0;
|
|
163
163
|
z-index: var(--kol-z-modal, 100); /* the modal tier — the overlay contract (EditorOverlaysOnFullscreenOverlay, 2026-08-27) */
|
|
164
164
|
background: var(--kol-surface-primary);
|
|
165
|
+
/* `scrim` (2026-09-23) swaps the surface for the estate's one tint — the class it adds is
|
|
166
|
+
`.kol-overlay-scrim`, which paints 48 % black and out-declares this line by source order. */
|
|
165
167
|
display: grid;
|
|
166
168
|
place-items: center;
|
|
167
169
|
overflow-y: auto;
|
|
@@ -801,7 +803,7 @@
|
|
|
801
803
|
}
|
|
802
804
|
|
|
803
805
|
.kol-sidenav-hop-icon {
|
|
804
|
-
color: var(--kol-
|
|
806
|
+
color: var(--kol-oq-80);
|
|
805
807
|
transition: color 150ms ease;
|
|
806
808
|
}
|
|
807
809
|
|
|
@@ -1202,6 +1204,22 @@ a.kol-icon-frame {
|
|
|
1202
1204
|
.kol-media-tile:hover .kol-play-disc,
|
|
1203
1205
|
.kol-play-disc:focus-visible { opacity: 1; }
|
|
1204
1206
|
|
|
1207
|
+
/* FileIcon — the generic document (user 2026-09-23, Finder's): a page in the oq ladder so it
|
|
1208
|
+
* reads on either ground, the fold one step heavier, the extension in the mono voice. Drawn in
|
|
1209
|
+
* one SVG, so the label scales with the page and the host box sets the size. */
|
|
1210
|
+
.kol-file-icon { display: block; aspect-ratio: 100 / 128; height: auto; overflow: visible; }
|
|
1211
|
+
.kol-file-icon-page { fill: var(--kol-oq-08); stroke: var(--kol-oq-16); stroke-width: 1.5; }
|
|
1212
|
+
.kol-file-icon-fold { fill: var(--kol-oq-16); }
|
|
1213
|
+
/* OQ, NEVER FG (user ruling, 2026-09-23 and before): a translucent stroke stacks where it crosses
|
|
1214
|
+
* itself, so the glyph's joints showed brighter than its lines. */
|
|
1215
|
+
.kol-file-icon-glyph { color: var(--kol-oq-48); }
|
|
1216
|
+
.kol-file-icon-ext {
|
|
1217
|
+
fill: var(--kol-oq-48);
|
|
1218
|
+
font-family: var(--kol-font-family-mono);
|
|
1219
|
+
font-size: 15px;
|
|
1220
|
+
letter-spacing: 0.06em;
|
|
1221
|
+
}
|
|
1222
|
+
|
|
1205
1223
|
/* ═══════════════════════════════════════════════════════════════
|
|
1206
1224
|
* ThemeToggle — .kol-theme-toggle
|
|
1207
1225
|
*
|
|
@@ -1260,41 +1260,255 @@
|
|
|
1260
1260
|
* as a second, darker plate. Prose is bounded by the page, not by its own
|
|
1261
1261
|
* measure; tables and pre wrap inside it. */
|
|
1262
1262
|
.kol-doc-page {
|
|
1263
|
-
|
|
1263
|
+
/* OPAQUE (user 2026-09-23: *"this is not correct bg, its transparent should be opaque so not
|
|
1264
|
+
* fg-* but oq-*"*) — a page is paper, and the list behind it read through it in Quick Look. */
|
|
1265
|
+
background: var(--kol-oq-04);
|
|
1264
1266
|
border-radius: var(--kol-radius-sm);
|
|
1265
1267
|
padding: 24px;
|
|
1266
1268
|
min-width: 0;
|
|
1267
1269
|
overflow-wrap: anywhere;
|
|
1268
1270
|
}
|
|
1269
1271
|
.kol-doc-page .kol-codeblock-wrapper { margin: 0; }
|
|
1270
|
-
.kol-doc-page .kol-codeblock { background: transparent; border: 0; width: 100%; }
|
|
1272
|
+
.kol-doc-page .kol-codeblock { background: transparent; border: 0; width: 100%; padding: 0; }
|
|
1273
|
+
/* ONE INSET FOR EVERY DOCUMENT (user 2026-09-23: *"why are they not aligning from top left with
|
|
1274
|
+
* the same padding?"*). The code block brought its own padding and a filename chip on top of the
|
|
1275
|
+
* page's, so JSON and YAML started lower and further in than markdown. The page's padding is the
|
|
1276
|
+
* only inset, and the file's name is already beside every preview. */
|
|
1277
|
+
.kol-doc-page .kol-codeblock-filename { display: none; }
|
|
1271
1278
|
.kol-doc-page .kol-prose { max-width: none; margin: 0; padding: 0; }
|
|
1272
1279
|
.kol-doc-page .kol-prose table { max-width: 100%; }
|
|
1273
1280
|
.kol-doc-page .kol-prose td,
|
|
1274
1281
|
.kol-doc-page .kol-prose th { overflow-wrap: anywhere; word-break: break-word; }
|
|
1275
1282
|
.kol-doc-page .kol-prose pre { white-space: pre-wrap; overflow-wrap: anywhere; }
|
|
1276
|
-
/*
|
|
1277
|
-
*
|
|
1278
|
-
*
|
|
1279
|
-
*
|
|
1280
|
-
*
|
|
1281
|
-
|
|
1282
|
-
*
|
|
1283
|
-
*
|
|
1284
|
-
*
|
|
1285
|
-
*
|
|
1286
|
-
*
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1283
|
+
/* NO RATIO ON A DOCUMENT (user 2026-09-23: *"its weird we have these ratios 3:5 linked to the
|
|
1284
|
+
* preview … lets be flexible and logical"*). Text and code are the only two document kinds, and
|
|
1285
|
+
* neither has a shape of its own: the SURFACE picks the box and the content scrolls inside it.
|
|
1286
|
+
* Pane: a fixed square-ish box (Finder's). Quick Look: a wide window. Tile: the tile. The 3:5
|
|
1287
|
+
* that stood here since 2026-09-02 was a bound mistaken for a shape. */
|
|
1288
|
+
/* QUICK LOOK — one window for every kind (`QuickLookFrame`, user 2026-09-23: *"put them in a
|
|
1289
|
+
* container LIKE FINDER"*). An opaque raised surface that HUGS its body: the media sets the width
|
|
1290
|
+
* at its own aspect ratio and the window follows. `--kol-ql-media-h` is the height the body is
|
|
1291
|
+
* left once the header (and the footer, when a transport docks there) are paid for; every body
|
|
1292
|
+
* caps against it, so a tall video makes a tall window and never a scrolling one. The side caps
|
|
1293
|
+
* leave the prev / next gutters (10rem). */
|
|
1294
|
+
.kol-quicklook {
|
|
1295
|
+
--kol-ql-header-h: 44px;
|
|
1296
|
+
--kol-ql-footer-h: 0px;
|
|
1297
|
+
--kol-ql-frame-h: 88vh;
|
|
1298
|
+
--kol-ql-max-w: calc(100vw - 4rem);
|
|
1299
|
+
--kol-ql-media-h: calc(var(--kol-ql-frame-h) - var(--kol-ql-header-h) - var(--kol-ql-footer-h) - 2px);
|
|
1300
|
+
position: relative;
|
|
1301
|
+
display: flex;
|
|
1302
|
+
flex-direction: column;
|
|
1303
|
+
width: fit-content;
|
|
1304
|
+
min-width: min(360px, var(--kol-ql-max-w));
|
|
1305
|
+
max-width: var(--kol-ql-max-w);
|
|
1306
|
+
background: var(--kol-oq-04);
|
|
1307
|
+
border: 1px solid var(--kol-oq-12);
|
|
1308
|
+
border-radius: var(--kol-radius-md);
|
|
1309
|
+
overflow: hidden;
|
|
1310
|
+
}
|
|
1311
|
+
/* a sized window (the corner was dragged): the body takes all of it, media centred inside */
|
|
1312
|
+
.kol-quicklook--sized { max-width: none; }
|
|
1313
|
+
/* THE HEADER'S CONTROLS WEAR THE CLOSE IDIOM (`Button variant="nav"`), whose hover wash is oq-04 —
|
|
1314
|
+
* the window's own surface, so on this header it vanished. One stop up keeps the same 4-point lift
|
|
1315
|
+
* the X shows on the page (user 2026-09-23). `.kol-btn-nav`'s tokens sit in `:where()`, so this wins. */
|
|
1316
|
+
.kol-quicklook-header .kol-btn-nav {
|
|
1317
|
+
--kol-tone-hover-bg: var(--kol-oq-08);
|
|
1318
|
+
--kol-tone-active-bg: var(--kol-oq-08);
|
|
1319
|
+
}
|
|
1320
|
+
.kol-quicklook--sized .kol-quicklook-body { flex: 1 1 auto; }
|
|
1321
|
+
.kol-quicklook--sized .kol-doc-page,
|
|
1322
|
+
.kol-quicklook--sized .kol-pdf-document { width: 100%; }
|
|
1323
|
+
.kol-quicklook--sized .kol-pdf-document-main { flex: 1 1 auto; width: auto; max-width: none; }
|
|
1324
|
+
/* the corner grip — Finder's: invisible until you reach for it */
|
|
1325
|
+
.kol-quicklook-grip {
|
|
1326
|
+
position: absolute;
|
|
1327
|
+
right: 0;
|
|
1328
|
+
bottom: 0;
|
|
1329
|
+
width: 16px;
|
|
1330
|
+
height: 16px;
|
|
1331
|
+
cursor: nwse-resize;
|
|
1332
|
+
touch-action: none;
|
|
1333
|
+
}
|
|
1334
|
+
.kol-quicklook--footer { --kol-ql-footer-h: 64px; }
|
|
1335
|
+
.kol-quicklook-header {
|
|
1336
|
+
height: var(--kol-ql-header-h);
|
|
1337
|
+
display: flex;
|
|
1338
|
+
align-items: center;
|
|
1339
|
+
gap: 8px;
|
|
1340
|
+
padding-inline: 8px;
|
|
1341
|
+
min-width: 0;
|
|
1342
|
+
flex-shrink: 0;
|
|
1343
|
+
}
|
|
1344
|
+
.kol-quicklook-body {
|
|
1345
|
+
display: flex;
|
|
1346
|
+
justify-content: center;
|
|
1347
|
+
align-items: center;
|
|
1348
|
+
min-width: 0;
|
|
1349
|
+
min-height: 0;
|
|
1350
|
+
background: var(--kol-oq-02);
|
|
1351
|
+
}
|
|
1352
|
+
.kol-quicklook-footer { padding: 8px; flex-shrink: 0; } /* one inset around a 48px bar — Finder's transport is not double-padded (user 2026-09-23) */
|
|
1353
|
+
.kol-quicklook-media {
|
|
1354
|
+
display: block;
|
|
1355
|
+
max-width: var(--kol-ql-max-w);
|
|
1356
|
+
max-height: var(--kol-ql-media-h);
|
|
1357
|
+
object-fit: contain;
|
|
1358
|
+
}
|
|
1359
|
+
/* audio — Finder's: the artwork square left, the length beside it */
|
|
1360
|
+
.kol-quicklook-audio {
|
|
1361
|
+
display: flex;
|
|
1362
|
+
align-items: center;
|
|
1363
|
+
gap: 48px;
|
|
1364
|
+
padding: 32px 48px;
|
|
1365
|
+
width: min(var(--kol-ql-max-w), 760px);
|
|
1366
|
+
}
|
|
1367
|
+
.kol-quicklook-art {
|
|
1368
|
+
width: min(40vh, 340px);
|
|
1369
|
+
aspect-ratio: 1;
|
|
1370
|
+
flex-shrink: 0;
|
|
1371
|
+
overflow: hidden;
|
|
1372
|
+
display: flex;
|
|
1373
|
+
align-items: center;
|
|
1374
|
+
justify-content: center;
|
|
1375
|
+
background: var(--kol-oq-08);
|
|
1376
|
+
}
|
|
1377
|
+
/* a document is the page itself — the window is the plate, so no second plate inside it */
|
|
1378
|
+
.kol-quicklook .kol-doc-page {
|
|
1379
|
+
height: var(--kol-ql-media-h);
|
|
1380
|
+
width: min(1040px, var(--kol-ql-max-w));
|
|
1381
|
+
border-radius: 0;
|
|
1294
1382
|
overflow-y: auto;
|
|
1295
1383
|
overflow-x: hidden;
|
|
1296
|
-
margin-inline: auto;
|
|
1297
1384
|
}
|
|
1385
|
+
/* a PDF — every page in a scroller, the thumbnail rail on the right (Finder's) */
|
|
1386
|
+
.kol-pdf-document { display: flex; height: var(--kol-ql-media-h); }
|
|
1387
|
+
.kol-pdf-document-main {
|
|
1388
|
+
width: calc(var(--kol-ql-media-h) * 0.74);
|
|
1389
|
+
max-width: calc(var(--kol-ql-max-w) - 160px);
|
|
1390
|
+
overflow-y: auto;
|
|
1391
|
+
display: flex;
|
|
1392
|
+
flex-direction: column;
|
|
1393
|
+
gap: 12px;
|
|
1394
|
+
padding: 16px;
|
|
1395
|
+
}
|
|
1396
|
+
.kol-pdf-document-main .kol-pdf-page { width: 100%; height: auto; display: block; }
|
|
1397
|
+
.kol-pdf-document-rail {
|
|
1398
|
+
width: 140px;
|
|
1399
|
+
flex-shrink: 0;
|
|
1400
|
+
overflow-y: auto;
|
|
1401
|
+
display: flex;
|
|
1402
|
+
flex-direction: column;
|
|
1403
|
+
gap: 12px;
|
|
1404
|
+
padding: 16px 16px 16px 0;
|
|
1405
|
+
}
|
|
1406
|
+
.kol-pdf-document-rail button {
|
|
1407
|
+
display: block;
|
|
1408
|
+
padding: 4px;
|
|
1409
|
+
border-radius: var(--kol-radius-sm);
|
|
1410
|
+
background: transparent;
|
|
1411
|
+
}
|
|
1412
|
+
.kol-pdf-document-rail button[aria-current] { background: var(--kol-oq-16); }
|
|
1413
|
+
.kol-pdf-document-rail .kol-pdf-page { width: 100%; height: auto; display: block; }
|
|
1414
|
+
|
|
1415
|
+
/* MEDIA TILE — the grid's item, Finder's icon view (user 2026-09-23). Preview over name, no card.
|
|
1416
|
+
* Selected: a rounded opaque wash behind the preview and the name on an inverse pill. The type is
|
|
1417
|
+
* the tile's own rule (§5 — a component's type never rides a utility class on the element). */
|
|
1418
|
+
.kol-media-tile-item {
|
|
1419
|
+
display: flex;
|
|
1420
|
+
flex-direction: column;
|
|
1421
|
+
align-items: center;
|
|
1422
|
+
gap: 6px;
|
|
1423
|
+
min-width: 0;
|
|
1424
|
+
outline: none;
|
|
1425
|
+
user-select: none;
|
|
1426
|
+
cursor: default;
|
|
1427
|
+
}
|
|
1428
|
+
.kol-media-tile-thumb {
|
|
1429
|
+
width: 100%;
|
|
1430
|
+
aspect-ratio: 1;
|
|
1431
|
+
padding: 10px;
|
|
1432
|
+
display: flex;
|
|
1433
|
+
align-items: center;
|
|
1434
|
+
justify-content: center;
|
|
1435
|
+
border-radius: var(--kol-radius-md);
|
|
1436
|
+
overflow: hidden;
|
|
1437
|
+
}
|
|
1438
|
+
.kol-media-tile-thumb > img,
|
|
1439
|
+
.kol-media-tile-thumb > video { max-width: 100%; max-height: 100%; object-fit: contain; border-radius: var(--kol-radius-sm); }
|
|
1440
|
+
.kol-media-tile-thumb > .kol-media-thumb { border-radius: var(--kol-radius-sm); }
|
|
1441
|
+
.kol-media-tile-name {
|
|
1442
|
+
max-width: 100%;
|
|
1443
|
+
padding: 1px 6px;
|
|
1444
|
+
border-radius: var(--kol-radius-sm);
|
|
1445
|
+
font-family: var(--kol-font-family-mono);
|
|
1446
|
+
font-size: 12px;
|
|
1447
|
+
line-height: 16px;
|
|
1448
|
+
text-align: center;
|
|
1449
|
+
overflow-wrap: anywhere;
|
|
1450
|
+
display: -webkit-box;
|
|
1451
|
+
-webkit-line-clamp: 2;
|
|
1452
|
+
-webkit-box-orient: vertical;
|
|
1453
|
+
overflow: hidden;
|
|
1454
|
+
color: var(--kol-fg-strong);
|
|
1455
|
+
}
|
|
1456
|
+
.kol-media-tile-item[data-selected] .kol-media-tile-thumb { background: var(--kol-oq-08); }
|
|
1457
|
+
.kol-media-tile-item[data-selected] .kol-media-tile-name { background: var(--kol-surface-on-primary); color: var(--kol-surface-primary); }
|
|
1458
|
+
.kol-media-tile-item:focus-visible .kol-media-tile-thumb { box-shadow: inset 0 0 0 2px var(--kol-oq-24); }
|
|
1459
|
+
|
|
1460
|
+
/* the list view's hit: only the icon and name take the pointer (user 2026-09-23) */
|
|
1461
|
+
.kol-row-hit { cursor: pointer; }
|
|
1462
|
+
|
|
1463
|
+
/* THE FONT SPECIMEN (`KindPreview`, kind `font`, 2026-09-23) — `Aa` large, the set beneath it,
|
|
1464
|
+
* in the file's own face. The face is the preview's inline `font-family`; sizes scale with the fit. */
|
|
1465
|
+
.kol-font-specimen {
|
|
1466
|
+
width: 100%;
|
|
1467
|
+
height: 100%;
|
|
1468
|
+
display: flex;
|
|
1469
|
+
flex-direction: column;
|
|
1470
|
+
align-items: center;
|
|
1471
|
+
justify-content: center;
|
|
1472
|
+
gap: 8px;
|
|
1473
|
+
padding: 16px;
|
|
1474
|
+
overflow: hidden;
|
|
1475
|
+
text-align: center;
|
|
1476
|
+
color: var(--kol-fg-strong);
|
|
1477
|
+
}
|
|
1478
|
+
.kol-font-specimen-aa { font-size: 56px; line-height: 1; }
|
|
1479
|
+
.kol-font-specimen-set { font-size: 13px; line-height: 1.35; color: var(--kol-fg-body); overflow-wrap: anywhere; }
|
|
1480
|
+
.kol-font-specimen--sheet { width: min(900px, var(--kol-ql-max-w, 90vw)); min-height: 60vh; padding: 48px; gap: 24px; }
|
|
1481
|
+
.kol-font-specimen--sheet .kol-font-specimen-aa { font-size: 180px; }
|
|
1482
|
+
.kol-font-specimen--sheet .kol-font-specimen-set { font-size: 32px; }
|
|
1483
|
+
|
|
1484
|
+
/* THE SELECTION STACK (user 2026-09-23, Finder's) — up to three cards, the first on top, the
|
|
1485
|
+
* other two turned a few degrees behind it. It says "several"; the facts under it do the count. */
|
|
1486
|
+
.kol-selection-stack {
|
|
1487
|
+
position: relative;
|
|
1488
|
+
isolation: isolate;
|
|
1489
|
+
width: 100%;
|
|
1490
|
+
aspect-ratio: 4 / 3;
|
|
1491
|
+
display: grid;
|
|
1492
|
+
place-items: center;
|
|
1493
|
+
}
|
|
1494
|
+
.kol-selection-stack-card {
|
|
1495
|
+
grid-area: 1 / 1;
|
|
1496
|
+
width: 62%;
|
|
1497
|
+
aspect-ratio: 1;
|
|
1498
|
+
display: flex;
|
|
1499
|
+
align-items: center;
|
|
1500
|
+
justify-content: center;
|
|
1501
|
+
overflow: hidden;
|
|
1502
|
+
background: var(--kol-oq-08);
|
|
1503
|
+
border: 1px solid var(--kol-oq-16);
|
|
1504
|
+
border-radius: var(--kol-radius-sm);
|
|
1505
|
+
}
|
|
1506
|
+
/* the straight card is the first item and sits ON TOP; the turned ones sit behind it — stated in
|
|
1507
|
+
* z-index, not left to DOM order (user 2026-09-23: *"you had it reversed"*) */
|
|
1508
|
+
.kol-selection-stack-card[data-depth="0"] { z-index: 3; }
|
|
1509
|
+
.kol-selection-stack-card[data-depth="1"] { z-index: 2; transform: rotate(-7deg) translate(-6%, 2%); }
|
|
1510
|
+
.kol-selection-stack-card[data-depth="2"] { z-index: 1; transform: rotate(6deg) translate(7%, 3%); }
|
|
1511
|
+
|
|
1298
1512
|
/* THE WALL'S THUMB — the same document, at tile scale. `KindPreview` renders a
|
|
1299
1513
|
* real page; in a 44px row or a 230px card that is a wall of unreadable glyphs,
|
|
1300
1514
|
* so the page is zoomed down and clipped and you read its SHAPE (a JSON tree, a
|
|
@@ -1302,7 +1516,10 @@
|
|
|
1302
1516
|
* preview uses, one rung smaller. The children reset `zoom: 1` so it never
|
|
1303
1517
|
* compounds. No forced ratio here either — the tile is the bound. */
|
|
1304
1518
|
.kol-media-thumb .kol-doc-page {
|
|
1305
|
-
zoom
|
|
1519
|
+
/* THE TILE SETS IT (user 2026-09-23). `--kol-thumb-zoom` is box-width ÷ page-width, measured by
|
|
1520
|
+
* the tile itself, so a document reads the same size in a 260px card and a 400px one. The 0.34
|
|
1521
|
+
* fallback is the kind-overview's step, for a tile that never measured (SSR, no ResizeObserver). */
|
|
1522
|
+
zoom: var(--kol-thumb-zoom, 0.34);
|
|
1306
1523
|
height: 100%;
|
|
1307
1524
|
width: 100%;
|
|
1308
1525
|
padding: 12px;
|
|
@@ -1310,30 +1527,30 @@
|
|
|
1310
1527
|
background: transparent;
|
|
1311
1528
|
border-radius: 0;
|
|
1312
1529
|
}
|
|
1313
|
-
|
|
1530
|
+
/* NO RESET HERE — this is what made a markdown tile render at READING size while its code
|
|
1531
|
+
* siblings sat at a quarter: the child undid the page's zoom. The column preview keeps its reset
|
|
1532
|
+
* (it zooms 0.5 and wants the prose legible); a tile wants the SHAPE, uniformly. */
|
|
1314
1533
|
.kol-media-thumb .kol-prose,
|
|
1315
1534
|
.kol-media-thumb .kol-codeblock-wrapper { max-width: none; }
|
|
1316
1535
|
.kol-media-thumb > * { max-width: 100%; max-height: 100%; }
|
|
1317
1536
|
|
|
1318
1537
|
.kol-column-browser-preview .kol-doc-page {
|
|
1319
|
-
/*
|
|
1320
|
-
*
|
|
1321
|
-
*
|
|
1322
|
-
*
|
|
1323
|
-
*
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
background: transparent;
|
|
1332
|
-
border-radius: 0;
|
|
1538
|
+
/* THE PANE'S DOCUMENT BOX (user 2026-09-23, Finder's preview column: *"rtf .md .txt all have the
|
|
1539
|
+
* same height … it looks square-ish … just add a vertical scroll"*). One box for text and code
|
|
1540
|
+
* alike, the pane's width and as tall as it is wide, capped to the viewport; content from the
|
|
1541
|
+
* top-left at the page's one inset, scrolling inside. Type steps down a notch (0.8) so a pane
|
|
1542
|
+
* reads like Finder's rather than a page at full size. */
|
|
1543
|
+
width: 100%;
|
|
1544
|
+
aspect-ratio: 1;
|
|
1545
|
+
max-height: 60vh;
|
|
1546
|
+
overflow-y: auto;
|
|
1547
|
+
overflow-x: hidden;
|
|
1548
|
+
padding: 16px;
|
|
1549
|
+
border-radius: var(--kol-radius-sm);
|
|
1333
1550
|
}
|
|
1334
|
-
.kol-column-browser-preview .kol-doc-page
|
|
1335
|
-
/* documents start at the top of the column frame
|
|
1336
|
-
.kol-column-browser-preview > div:first-child:has(.kol-doc-page) { align-items: flex-start; justify-content: flex-start; overflow:
|
|
1551
|
+
.kol-column-browser-preview .kol-doc-page > * { zoom: 0.8; }
|
|
1552
|
+
/* documents start at the top of the column frame, and scroll */
|
|
1553
|
+
.kol-column-browser-preview > div:first-child:has(.kol-doc-page) { align-items: flex-start; justify-content: flex-start; overflow: visible; max-height: none; }
|
|
1337
1554
|
|
|
1338
1555
|
/* THE QUICKTIME BAR (PlaybackBarAndAudioSheet, kol-r2b2 2026-08-27 — ruled
|
|
1339
1556
|
* against the reference). White glyphs on the frosted strip whatever the theme:
|
|
@@ -1355,6 +1572,14 @@
|
|
|
1355
1572
|
.kol-playback-scrub::-webkit-slider-thumb { -webkit-appearance: none; width: 4px; height: 28px; margin-top: -13px; border-radius: 2px; background: var(--kol-color-ab-white); }
|
|
1356
1573
|
.kol-playback-scrub::-moz-range-track { height: 2px; border-radius: 1px; background: color-mix(in srgb, var(--kol-color-ab-white) 40%, transparent); }
|
|
1357
1574
|
.kol-playback-scrub::-moz-range-thumb { width: 4px; height: 28px; border: 0; border-radius: 2px; background: var(--kol-color-ab-white); }
|
|
1575
|
+
/* DOCKED (2026-09-23) — the bar in the Quick Look window's footer. It sits on the window, not on
|
|
1576
|
+
* media, so it takes the theme's ink on an opaque plate instead of white on a dark wash. */
|
|
1577
|
+
.kol-playback-bar--docked { background: var(--kol-oq-08); color: var(--kol-oq-80); }
|
|
1578
|
+
.kol-playback-bar--docked .kol-icon-frame { color: var(--kol-oq-80); }
|
|
1579
|
+
.kol-playback-bar--docked .kol-playback-scrub::-webkit-slider-runnable-track { background: var(--kol-oq-24); }
|
|
1580
|
+
.kol-playback-bar--docked .kol-playback-scrub::-webkit-slider-thumb { background: var(--kol-oq-80); }
|
|
1581
|
+
.kol-playback-bar--docked .kol-playback-scrub::-moz-range-track { background: var(--kol-oq-24); }
|
|
1582
|
+
.kol-playback-bar--docked .kol-playback-scrub::-moz-range-thumb { background: var(--kol-oq-80); }
|
|
1358
1583
|
|
|
1359
1584
|
/* ColumnBrowser rows — ONE SELECTED STATE (ColumnBrowserSeams, kol-r2b2
|
|
1360
1585
|
* 2026-08-28; user: "ONLY one selected state can exist, not TWO"). The row's
|
|
@@ -1383,13 +1608,20 @@
|
|
|
1383
1608
|
* correct together since. */
|
|
1384
1609
|
.kol-column-browser-row:hover,
|
|
1385
1610
|
.kol-column-browser-row.is-cursor { background-color: transparent; }
|
|
1386
|
-
|
|
1387
|
-
|
|
1611
|
+
/* ONE STEP BRIGHTER, AND OPAQUE (user 2026-09-23: *"maybe our higlight bg needs to be one step
|
|
1612
|
+
* brihgter? just so its more clear whats higlighted"*). fg-02 / fg-04 were translucent and
|
|
1613
|
+
* barely there; the trail is oq-04 and the current selection oq-08 — in the columns, the rows
|
|
1614
|
+
* and the grid alike. */
|
|
1615
|
+
.kol-column-browser-row.is-selected { background-color: var(--kol-oq-04); }
|
|
1616
|
+
.kol-column-browser-column:not(:has(~ .kol-column-browser-column .is-selected)) > .is-selected,
|
|
1617
|
+
.kol-row-browser li.is-selected { background-color: var(--kol-oq-08); }
|
|
1618
|
+
/* the folder you are IN (rows): the trail tone, never the selected fill (user 2026-09-23) */
|
|
1619
|
+
.kol-row-browser li.is-current:not(.is-selected) { background-color: var(--kol-oq-04); }
|
|
1388
1620
|
/* A DROP TARGET OUTRANKS SELECTION while something is over it (2026-09-21). It is transient and it
|
|
1389
1621
|
* is the one thing you must see mid-drag — which folder is about to receive this. It sits AFTER the
|
|
1390
1622
|
* two fills above and matches their specificity through the child combinator, so it wins the tie
|
|
1391
1623
|
* rather than merely claiming to; written above them it lost to the deepest-column rule. */
|
|
1392
|
-
.kol-column-browser-column > .kol-column-browser-row[data-drop-over] { background-color: var(--kol-
|
|
1624
|
+
.kol-column-browser-column > .kol-column-browser-row[data-drop-over] { background-color: var(--kol-oq-16); }
|
|
1393
1625
|
/* THE COLUMN ITSELF AS A TARGET — dropping anywhere in a column files the item into the folder
|
|
1394
1626
|
* that column is showing. An inset ring rather than a fill: a fill over a list of rows reads as
|
|
1395
1627
|
* every row being selected, which is the opposite of what is being said. */
|
|
@@ -1404,7 +1636,20 @@
|
|
|
1404
1636
|
* box the pill is not. `.kol-column-browser-preview` is deliberately NOT in the
|
|
1405
1637
|
* padding rule: it has no rows, and its own `p-4` is a Tailwind utility that
|
|
1406
1638
|
* would out-rank this layer anyway. */
|
|
1407
|
-
|
|
1639
|
+
/* ROWS ARE CONTROLS, NOT COPY (user 2026-09-22) — a drag across the list draws the marquee band,
|
|
1640
|
+
* and a browser text-selection dragging out of it is the thing that looked broken. The NAME is
|
|
1641
|
+
* still readable by the preview pane and the crumb line, both of which stay selectable. */
|
|
1642
|
+
.kol-column-browser-row { margin-inline: 4px; user-select: none; }
|
|
1643
|
+
|
|
1644
|
+
/* A SELECTED RUN IS STILL ROWS (user 2026-09-22: "should there not be a little gap between
|
|
1645
|
+
* selected items?"). Two adjacent fills merged into one slab, which reads as one thing. The 1px
|
|
1646
|
+
* transparent bands are on EVERY row, not just the selected one, so selecting never moves the
|
|
1647
|
+
* list; `padding-box` keeps the fill off them. */
|
|
1648
|
+
.kol-column-browser-row {
|
|
1649
|
+
border-top: 1px solid transparent;
|
|
1650
|
+
border-bottom: 1px solid transparent;
|
|
1651
|
+
background-clip: padding-box;
|
|
1652
|
+
}
|
|
1408
1653
|
.kol-column-browser-column { padding-block: 4px; }
|
|
1409
1654
|
.kol-column-browser-row.is-selected,
|
|
1410
1655
|
.kol-column-browser-row.is-cursor { border-radius: var(--kol-radius-sm); }
|
|
@@ -1511,6 +1756,10 @@
|
|
|
1511
1756
|
margin-inline: auto;
|
|
1512
1757
|
padding: 24px;
|
|
1513
1758
|
}
|
|
1759
|
+
/* …except a document: it is the page's content and starts at the page's own inset, top-left, like
|
|
1760
|
+
* a code file beside it (user 2026-09-23). Without this the measure above centred markdown in
|
|
1761
|
+
* Quick Look while JSON and YAML filled the window. */
|
|
1762
|
+
.kol-overlay .kol-doc-page .kol-prose { max-width: none; margin-inline: 0; padding: 0; }
|
|
1514
1763
|
|
|
1515
1764
|
/* ─────────────────────────────────────────────────────────────────────
|
|
1516
1765
|
* TONE — sunken (ControlToneSunken, kol-website 2026-08-28; was "inverse",
|
|
@@ -1882,10 +2131,13 @@
|
|
|
1882
2131
|
|
|
1883
2132
|
/* ─── the families that keep their own plates ─── */
|
|
1884
2133
|
.kol-view-toggle { background-color: var(--kol-tone-bg, var(--kol-surface-secondary)); }
|
|
2134
|
+
/* keyboard focus in the well wears the DS ring, not the browser's blue (a button regains focus when
|
|
2135
|
+
* the search palette it opened closes, 2026-09-23) */
|
|
2136
|
+
.kol-view-toggle button:focus-visible { outline: none; box-shadow: inset 0 0 0 2px var(--kol-oq-24); }
|
|
1885
2137
|
/* the sunken well's chip ladder (rest · +fg-04 hover · +fg-08 selected) — on the
|
|
1886
2138
|
* element, or inherited from a sunken wrapper */
|
|
1887
|
-
:is(.kol-view-toggle.kol-tone-sunken, .kol-view-toggle.kol-tone-inverse, .kol-tone-sunken .kol-view-toggle)
|
|
1888
|
-
:is(.kol-view-toggle.kol-tone-sunken, .kol-view-toggle.kol-tone-inverse, .kol-tone-sunken .kol-view-toggle)
|
|
2139
|
+
:is(.kol-view-toggle.kol-tone-sunken, .kol-view-toggle.kol-tone-inverse, .kol-tone-sunken .kol-view-toggle) button[aria-pressed="true"] { background-color: var(--kol-fg-08); }
|
|
2140
|
+
:is(.kol-view-toggle.kol-tone-sunken, .kol-view-toggle.kol-tone-inverse, .kol-tone-sunken .kol-view-toggle) button:not([aria-pressed="true"]):hover { background-color: var(--kol-fg-04); }
|
|
1889
2141
|
/* the open search shell — was `bg-fg-04` on the element, sunken by class */
|
|
1890
2142
|
.kol-expand--open { background-color: var(--kol-tone-bg, var(--kol-fg-04)); }
|
|
1891
2143
|
/* THE SEGMENTED STRIP, SUNKEN (segmented-toggle-sunken-tone, kol-client-olina
|
|
@@ -2025,3 +2277,44 @@
|
|
|
2025
2277
|
/* THE ROW BROWSER — the folder list view. Same drop affordance as a column, for the same reason:
|
|
2026
2278
|
* the list IS the folder you are in, so dropping anywhere on it files the item here. */
|
|
2027
2279
|
.kol-row-browser[data-drop-over] { box-shadow: inset 0 0 0 2px var(--kol-fg-16); }
|
|
2280
|
+
|
|
2281
|
+
/* SELECTED — one mark for a card and a row, whatever the variant (user 2026-09-23). `selected`
|
|
2282
|
+
* used to tint a border, so on the variants that carry none — the file wall's — a selected tile
|
|
2283
|
+
* was indistinguishable from the rest. A 2px inset ring in the same ink the list rows select with,
|
|
2284
|
+
* drawn inside the radius so nothing reflows. Scoped to the CARD (2026-09-23): the bare
|
|
2285
|
+
* `[role="button"][data-selected]` also matched the grid's MediaTile and boxed every selected tile
|
|
2286
|
+
* in a square on top of its wash and pill. */
|
|
2287
|
+
.kol-card[data-selected],
|
|
2288
|
+
article[role="button"][data-selected] {
|
|
2289
|
+
box-shadow: inset 0 0 0 2px var(--kol-fg-32);
|
|
2290
|
+
}
|
|
2291
|
+
/* FOCUS WEARS THE SAME RING (user 2026-09-23: the blue double border after Quick Look). Closing
|
|
2292
|
+
* the overlay hands focus back to the card, and the browser drew its own outline around the
|
|
2293
|
+
* selected ring. Keyboard focus keeps a visible mark — it is just the DS one. */
|
|
2294
|
+
.kol-card:focus-visible,
|
|
2295
|
+
article[role="button"]:focus-visible {
|
|
2296
|
+
outline: none;
|
|
2297
|
+
box-shadow: inset 0 0 0 2px var(--kol-fg-32);
|
|
2298
|
+
}
|
|
2299
|
+
|
|
2300
|
+
/* THE MARQUEE BAND (user 2026-09-22) — drawn by `useMarquee` inside a relative list. Ink only,
|
|
2301
|
+
* never pointer-reactive: it is a picture of the drag, and the rows under it own the hit-testing. */
|
|
2302
|
+
.kol-marquee {
|
|
2303
|
+
position: absolute;
|
|
2304
|
+
pointer-events: none;
|
|
2305
|
+
border: 1px solid var(--kol-fg-32);
|
|
2306
|
+
background-color: var(--kol-fg-08);
|
|
2307
|
+
border-radius: var(--kol-radius-sm);
|
|
2308
|
+
z-index: 2;
|
|
2309
|
+
}
|
|
2310
|
+
|
|
2311
|
+
/* ALTERNATING BANDS (user 2026-09-22, against Finder's list view). The row dividers went with the
|
|
2312
|
+
* pill shape, and a long list needs SOMETHING to track a line across to its date and size. Finder
|
|
2313
|
+
* bands every other row; so does this. `fg-02` is the faintest ink stop — it must read as texture,
|
|
2314
|
+
* never as a state — and both real states outrank it: `is-selected` and a drop are excluded
|
|
2315
|
+
* outright rather than left to specificity. Columns are NOT banded: a column is one folder, read
|
|
2316
|
+
* top to bottom with nothing to the right of a name. */
|
|
2317
|
+
.kol-row-browser > li:nth-child(even):not(.is-selected):not([data-drop-over]) {
|
|
2318
|
+
background-color: var(--kol-fg-02);
|
|
2319
|
+
border-radius: var(--kol-radius-sm);
|
|
2320
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kolkrabbi/kol-theme",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.147.0",
|
|
4
4
|
"description": "KOL (Kolkrabbi) design-system tokens + base CSS — brand-neutral. The canonical token/cascade layer every other KOL package and consumer builds on.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|