@kolkrabbi/kol-theme 0.146.0 → 0.148.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.
@@ -109,7 +109,7 @@
109
109
  bottom: 4px;
110
110
  right: 4px;
111
111
  display: inline-flex;
112
- color: var(--kol-fg-48);
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-fg-80);
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,258 @@
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
- background: var(--kol-fg-04);
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
- /* 3:5 IS THE TALLEST A DOCUMENT PAGE MAY BE (BrowsePageRulingsAndSeams,
1277
- * kol-r2b2 2026-09-02; user 2026-08-28: "this is not an approved ratio"). The
1278
- * overlay page was A-series (1:√2) and the column preview had NO bound at all,
1279
- * so the FILE decided the height — a 7 KB JSON drew a pane taller than the
1280
- * browser. 3:5 is the portrait rung on the export-specs ladder below 4:5, and
1281
- * the floor before a page reads as a 9:16 strip. Content scrolls inside the
1282
- * box; the box never grows to the file.
1283
- *
1284
- * OPEN 2026-09-21 (user, on the column preview: "3:5 is so close to 9:16 and
1285
- * its too tall here"). The plate measures a true 3:5; the complaint is the dead
1286
- * space a short document leaves below its content. A one-off rung change was
1287
- * tried and reverted — the value belongs to the preview spec being written
1288
- * against Finder / Dropbox / Drive, not to a guess. */
1289
- .kol-overlay .kol-doc-page {
1290
- aspect-ratio: 3 / 5;
1291
- height: 85vh;
1292
- width: auto;
1293
- max-width: calc(100vw - 10rem);
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
+ /* A PREVIEW FITS THE BOX, it is not merely capped by it (user 2026-09-24: a 24px favicon.svg drew
1439
+ * at 24px in a 190px tile). `max-*` only ever shrank; Finder fits every preview to the tile, large
1440
+ * or small, keeping its proportions. */
1441
+ .kol-media-tile-thumb > img,
1442
+ .kol-media-tile-thumb > video { width: 100%; height: 100%; object-fit: contain; border-radius: var(--kol-radius-sm); }
1443
+ .kol-media-tile-thumb > .kol-media-thumb { border-radius: var(--kol-radius-sm); }
1444
+ .kol-media-tile-name {
1445
+ max-width: 100%;
1446
+ padding: 1px 6px;
1447
+ border-radius: var(--kol-radius-sm);
1448
+ font-family: var(--kol-font-family-mono);
1449
+ font-size: 12px;
1450
+ line-height: 16px;
1451
+ text-align: center;
1452
+ overflow-wrap: anywhere;
1453
+ display: -webkit-box;
1454
+ -webkit-line-clamp: 2;
1455
+ -webkit-box-orient: vertical;
1456
+ overflow: hidden;
1457
+ color: var(--kol-fg-strong);
1458
+ }
1459
+ .kol-media-tile-item[data-selected] .kol-media-tile-thumb { background: var(--kol-oq-08); }
1460
+ .kol-media-tile-item[data-selected] .kol-media-tile-name { background: var(--kol-surface-on-primary); color: var(--kol-surface-primary); }
1461
+ .kol-media-tile-item:focus-visible .kol-media-tile-thumb { box-shadow: inset 0 0 0 2px var(--kol-oq-24); }
1462
+
1463
+ /* the list view's hit: only the icon and name take the pointer (user 2026-09-23) */
1464
+ .kol-row-hit { cursor: pointer; }
1465
+
1466
+ /* THE FONT SPECIMEN (`KindPreview`, kind `font`, 2026-09-23) — `Aa` large, the set beneath it,
1467
+ * in the file's own face. The face is the preview's inline `font-family`; sizes scale with the fit. */
1468
+ .kol-font-specimen {
1469
+ width: 100%;
1470
+ height: 100%;
1471
+ display: flex;
1472
+ flex-direction: column;
1473
+ align-items: center;
1474
+ justify-content: center;
1475
+ gap: 8px;
1476
+ padding: 16px;
1477
+ overflow: hidden;
1478
+ text-align: center;
1479
+ color: var(--kol-fg-strong);
1480
+ }
1481
+ .kol-font-specimen-aa { font-size: 56px; line-height: 1; }
1482
+ .kol-font-specimen-set { font-size: 13px; line-height: 1.35; color: var(--kol-fg-body); overflow-wrap: anywhere; }
1483
+ .kol-font-specimen--sheet { width: min(900px, var(--kol-ql-max-w, 90vw)); min-height: 60vh; padding: 48px; gap: 24px; }
1484
+ .kol-font-specimen--sheet .kol-font-specimen-aa { font-size: 180px; }
1485
+ .kol-font-specimen--sheet .kol-font-specimen-set { font-size: 32px; }
1486
+
1487
+ /* THE SELECTION STACK (user 2026-09-23, Finder's) — up to three cards, the first on top, the
1488
+ * other two turned a few degrees behind it. It says "several"; the facts under it do the count. */
1489
+ .kol-selection-stack {
1490
+ position: relative;
1491
+ isolation: isolate;
1492
+ width: 100%;
1493
+ aspect-ratio: 4 / 3;
1494
+ display: grid;
1495
+ place-items: center;
1496
+ }
1497
+ .kol-selection-stack-card {
1498
+ grid-area: 1 / 1;
1499
+ width: 62%;
1500
+ aspect-ratio: 1;
1501
+ display: flex;
1502
+ align-items: center;
1503
+ justify-content: center;
1504
+ overflow: hidden;
1505
+ background: var(--kol-oq-08);
1506
+ border: 1px solid var(--kol-oq-16);
1507
+ border-radius: var(--kol-radius-sm);
1508
+ }
1509
+ /* the straight card is the first item and sits ON TOP; the turned ones sit behind it — stated in
1510
+ * z-index, not left to DOM order (user 2026-09-23: *"you had it reversed"*) */
1511
+ .kol-selection-stack-card[data-depth="0"] { z-index: 3; }
1512
+ .kol-selection-stack-card[data-depth="1"] { z-index: 2; transform: rotate(-7deg) translate(-6%, 2%); }
1513
+ .kol-selection-stack-card[data-depth="2"] { z-index: 1; transform: rotate(6deg) translate(7%, 3%); }
1514
+
1298
1515
  /* THE WALL'S THUMB — the same document, at tile scale. `KindPreview` renders a
1299
1516
  * real page; in a 44px row or a 230px card that is a wall of unreadable glyphs,
1300
1517
  * so the page is zoomed down and clipped and you read its SHAPE (a JSON tree, a
@@ -1302,38 +1519,44 @@
1302
1519
  * preview uses, one rung smaller. The children reset `zoom: 1` so it never
1303
1520
  * compounds. No forced ratio here either — the tile is the bound. */
1304
1521
  .kol-media-thumb .kol-doc-page {
1305
- zoom: 0.25;
1522
+ /* THE TILE SETS IT (user 2026-09-23). `--kol-thumb-zoom` is box-width ÷ page-width, measured by
1523
+ * the tile itself, so a document reads the same size in a 260px card and a 400px one. The 0.34
1524
+ * fallback is the kind-overview's step, for a tile that never measured (SSR, no ResizeObserver). */
1525
+ zoom: var(--kol-thumb-zoom, 0.34);
1306
1526
  height: 100%;
1307
1527
  width: 100%;
1308
- padding: 12px;
1528
+ /* THE PAGE KEEPS ITS MARGIN AT TILE SCALE (user 2026-09-24: text ran to the tile's edge while the
1529
+ * pane's preview has margins). This padding is in PAGE space and the page is zoomed to ~0.2, so
1530
+ * 12px drew as 2px; 40px lands at ~5.5% of the tile — the pane's 16px, proportionally. */
1531
+ padding: 40px;
1309
1532
  overflow: hidden;
1310
1533
  background: transparent;
1311
1534
  border-radius: 0;
1312
1535
  }
1313
- .kol-media-thumb .kol-doc-page :is(.kol-prose, .kol-codeblock-wrapper, .kol-doc-frontmatter) { zoom: 1; }
1536
+ /* NO RESET HERE — this is what made a markdown tile render at READING size while its code
1537
+ * siblings sat at a quarter: the child undid the page's zoom. The column preview keeps its reset
1538
+ * (it zooms 0.5 and wants the prose legible); a tile wants the SHAPE, uniformly. */
1314
1539
  .kol-media-thumb .kol-prose,
1315
1540
  .kol-media-thumb .kol-codeblock-wrapper { max-width: none; }
1316
1541
  .kol-media-thumb > * { max-width: 100%; max-height: 100%; }
1317
1542
 
1318
1543
  .kol-column-browser-preview .kol-doc-page {
1319
- /* NO FORCED RATIO (user 2026-09-21: "it just fucking takes the aspect ratio of
1320
- * the file and displays that"). A preview is the file at its own shape,
1321
- * bounded by the pane — which is what every reference file manager does. The
1322
- * 3:5 above exists because the column preview once had no bound AT ALL and a
1323
- * 7 KB JSON drew a pane taller than the browser; the bound was the fix, the
1324
- * ratio was the overreach. A max-height bounds it without deciding a shape,
1325
- * so a short document ends where its content ends instead of leaving half a
1326
- * plate of dead grey. The overlay keeps 3:5 — that one IS a sheet. */
1327
- max-height: 100%;
1328
- height: auto;
1329
- overflow: auto;
1330
- zoom: 0.5;
1331
- background: transparent;
1332
- border-radius: 0;
1544
+ /* THE PANE'S DOCUMENT BOX (user 2026-09-23, Finder's preview column: *"rtf .md .txt all have the
1545
+ * same height … it looks square-ish … just add a vertical scroll"*). One box for text and code
1546
+ * alike, the pane's width and as tall as it is wide, capped to the viewport; content from the
1547
+ * top-left at the page's one inset, scrolling inside. Type steps down a notch (0.8) so a pane
1548
+ * reads like Finder's rather than a page at full size. */
1549
+ width: 100%;
1550
+ aspect-ratio: 1;
1551
+ max-height: 60vh;
1552
+ overflow-y: auto;
1553
+ overflow-x: hidden;
1554
+ padding: 16px;
1555
+ border-radius: var(--kol-radius-sm);
1333
1556
  }
1334
- .kol-column-browser-preview .kol-doc-page :is(.kol-prose, .kol-codeblock-wrapper, .kol-doc-frontmatter) { zoom: 1; }
1335
- /* documents start at the top of the column frame with a small inset, and scroll */
1336
- .kol-column-browser-preview > div:first-child:has(.kol-doc-page) { align-items: flex-start; justify-content: flex-start; overflow: auto; }
1557
+ .kol-column-browser-preview .kol-doc-page > * { zoom: 0.8; }
1558
+ /* documents start at the top of the column frame, and scroll */
1559
+ .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
1560
 
1338
1561
  /* THE QUICKTIME BAR (PlaybackBarAndAudioSheet, kol-r2b2 2026-08-27 — ruled
1339
1562
  * against the reference). White glyphs on the frosted strip whatever the theme:
@@ -1355,6 +1578,14 @@
1355
1578
  .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
1579
  .kol-playback-scrub::-moz-range-track { height: 2px; border-radius: 1px; background: color-mix(in srgb, var(--kol-color-ab-white) 40%, transparent); }
1357
1580
  .kol-playback-scrub::-moz-range-thumb { width: 4px; height: 28px; border: 0; border-radius: 2px; background: var(--kol-color-ab-white); }
1581
+ /* DOCKED (2026-09-23) — the bar in the Quick Look window's footer. It sits on the window, not on
1582
+ * media, so it takes the theme's ink on an opaque plate instead of white on a dark wash. */
1583
+ .kol-playback-bar--docked { background: var(--kol-oq-08); color: var(--kol-oq-80); }
1584
+ .kol-playback-bar--docked .kol-icon-frame { color: var(--kol-oq-80); }
1585
+ .kol-playback-bar--docked .kol-playback-scrub::-webkit-slider-runnable-track { background: var(--kol-oq-24); }
1586
+ .kol-playback-bar--docked .kol-playback-scrub::-webkit-slider-thumb { background: var(--kol-oq-80); }
1587
+ .kol-playback-bar--docked .kol-playback-scrub::-moz-range-track { background: var(--kol-oq-24); }
1588
+ .kol-playback-bar--docked .kol-playback-scrub::-moz-range-thumb { background: var(--kol-oq-80); }
1358
1589
 
1359
1590
  /* ColumnBrowser rows — ONE SELECTED STATE (ColumnBrowserSeams, kol-r2b2
1360
1591
  * 2026-08-28; user: "ONLY one selected state can exist, not TWO"). The row's
@@ -1383,13 +1614,20 @@
1383
1614
  * correct together since. */
1384
1615
  .kol-column-browser-row:hover,
1385
1616
  .kol-column-browser-row.is-cursor { background-color: transparent; }
1386
- .kol-column-browser-row.is-selected { background-color: var(--kol-fg-02); }
1387
- .kol-column-browser-column:not(:has(~ .kol-column-browser-column .is-selected)) > .is-selected { background-color: var(--kol-fg-04); }
1617
+ /* ONE STEP BRIGHTER, AND OPAQUE (user 2026-09-23: *"maybe our higlight bg needs to be one step
1618
+ * brihgter? just so its more clear whats higlighted"*). fg-02 / fg-04 were translucent and
1619
+ * barely there; the trail is oq-04 and the current selection oq-08 — in the columns, the rows
1620
+ * and the grid alike. */
1621
+ .kol-column-browser-row.is-selected { background-color: var(--kol-oq-04); }
1622
+ .kol-column-browser-column:not(:has(~ .kol-column-browser-column .is-selected)) > .is-selected,
1623
+ .kol-row-browser li.is-selected { background-color: var(--kol-oq-08); }
1624
+ /* the folder you are IN (rows): the trail tone, never the selected fill (user 2026-09-23) */
1625
+ .kol-row-browser li.is-current:not(.is-selected) { background-color: var(--kol-oq-04); }
1388
1626
  /* A DROP TARGET OUTRANKS SELECTION while something is over it (2026-09-21). It is transient and it
1389
1627
  * is the one thing you must see mid-drag — which folder is about to receive this. It sits AFTER the
1390
1628
  * two fills above and matches their specificity through the child combinator, so it wins the tie
1391
1629
  * 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-fg-08); }
1630
+ .kol-column-browser-column > .kol-column-browser-row[data-drop-over] { background-color: var(--kol-oq-16); }
1393
1631
  /* THE COLUMN ITSELF AS A TARGET — dropping anywhere in a column files the item into the folder
1394
1632
  * that column is showing. An inset ring rather than a fill: a fill over a list of rows reads as
1395
1633
  * every row being selected, which is the opposite of what is being said. */
@@ -1404,7 +1642,20 @@
1404
1642
  * box the pill is not. `.kol-column-browser-preview` is deliberately NOT in the
1405
1643
  * padding rule: it has no rows, and its own `p-4` is a Tailwind utility that
1406
1644
  * would out-rank this layer anyway. */
1407
- .kol-column-browser-row { margin-inline: 4px; }
1645
+ /* ROWS ARE CONTROLS, NOT COPY (user 2026-09-22) — a drag across the list draws the marquee band,
1646
+ * and a browser text-selection dragging out of it is the thing that looked broken. The NAME is
1647
+ * still readable by the preview pane and the crumb line, both of which stay selectable. */
1648
+ .kol-column-browser-row { margin-inline: 4px; user-select: none; }
1649
+
1650
+ /* A SELECTED RUN IS STILL ROWS (user 2026-09-22: "should there not be a little gap between
1651
+ * selected items?"). Two adjacent fills merged into one slab, which reads as one thing. The 1px
1652
+ * transparent bands are on EVERY row, not just the selected one, so selecting never moves the
1653
+ * list; `padding-box` keeps the fill off them. */
1654
+ .kol-column-browser-row {
1655
+ border-top: 1px solid transparent;
1656
+ border-bottom: 1px solid transparent;
1657
+ background-clip: padding-box;
1658
+ }
1408
1659
  .kol-column-browser-column { padding-block: 4px; }
1409
1660
  .kol-column-browser-row.is-selected,
1410
1661
  .kol-column-browser-row.is-cursor { border-radius: var(--kol-radius-sm); }
@@ -1511,6 +1762,10 @@
1511
1762
  margin-inline: auto;
1512
1763
  padding: 24px;
1513
1764
  }
1765
+ /* …except a document: it is the page's content and starts at the page's own inset, top-left, like
1766
+ * a code file beside it (user 2026-09-23). Without this the measure above centred markdown in
1767
+ * Quick Look while JSON and YAML filled the window. */
1768
+ .kol-overlay .kol-doc-page .kol-prose { max-width: none; margin-inline: 0; padding: 0; }
1514
1769
 
1515
1770
  /* ─────────────────────────────────────────────────────────────────────
1516
1771
  * TONE — sunken (ControlToneSunken, kol-website 2026-08-28; was "inverse",
@@ -1882,10 +2137,13 @@
1882
2137
 
1883
2138
  /* ─── the families that keep their own plates ─── */
1884
2139
  .kol-view-toggle { background-color: var(--kol-tone-bg, var(--kol-surface-secondary)); }
2140
+ /* keyboard focus in the well wears the DS ring, not the browser's blue (a button regains focus when
2141
+ * the search palette it opened closes, 2026-09-23) */
2142
+ .kol-view-toggle button:focus-visible { outline: none; box-shadow: inset 0 0 0 2px var(--kol-oq-24); }
1885
2143
  /* the sunken well's chip ladder (rest · +fg-04 hover · +fg-08 selected) — on the
1886
2144
  * 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) > button[aria-pressed="true"] { background-color: var(--kol-fg-08); }
1888
- :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); }
2145
+ :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); }
2146
+ :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
2147
  /* the open search shell — was `bg-fg-04` on the element, sunken by class */
1890
2148
  .kol-expand--open { background-color: var(--kol-tone-bg, var(--kol-fg-04)); }
1891
2149
  /* THE SEGMENTED STRIP, SUNKEN (segmented-toggle-sunken-tone, kol-client-olina
@@ -2025,3 +2283,44 @@
2025
2283
  /* THE ROW BROWSER — the folder list view. Same drop affordance as a column, for the same reason:
2026
2284
  * the list IS the folder you are in, so dropping anywhere on it files the item here. */
2027
2285
  .kol-row-browser[data-drop-over] { box-shadow: inset 0 0 0 2px var(--kol-fg-16); }
2286
+
2287
+ /* SELECTED — one mark for a card and a row, whatever the variant (user 2026-09-23). `selected`
2288
+ * used to tint a border, so on the variants that carry none — the file wall's — a selected tile
2289
+ * was indistinguishable from the rest. A 2px inset ring in the same ink the list rows select with,
2290
+ * drawn inside the radius so nothing reflows. Scoped to the CARD (2026-09-23): the bare
2291
+ * `[role="button"][data-selected]` also matched the grid's MediaTile and boxed every selected tile
2292
+ * in a square on top of its wash and pill. */
2293
+ .kol-card[data-selected],
2294
+ article[role="button"][data-selected] {
2295
+ box-shadow: inset 0 0 0 2px var(--kol-fg-32);
2296
+ }
2297
+ /* FOCUS WEARS THE SAME RING (user 2026-09-23: the blue double border after Quick Look). Closing
2298
+ * the overlay hands focus back to the card, and the browser drew its own outline around the
2299
+ * selected ring. Keyboard focus keeps a visible mark — it is just the DS one. */
2300
+ .kol-card:focus-visible,
2301
+ article[role="button"]:focus-visible {
2302
+ outline: none;
2303
+ box-shadow: inset 0 0 0 2px var(--kol-fg-32);
2304
+ }
2305
+
2306
+ /* THE MARQUEE BAND (user 2026-09-22) — drawn by `useMarquee` inside a relative list. Ink only,
2307
+ * never pointer-reactive: it is a picture of the drag, and the rows under it own the hit-testing. */
2308
+ .kol-marquee {
2309
+ position: absolute;
2310
+ pointer-events: none;
2311
+ border: 1px solid var(--kol-fg-32);
2312
+ background-color: var(--kol-fg-08);
2313
+ border-radius: var(--kol-radius-sm);
2314
+ z-index: 2;
2315
+ }
2316
+
2317
+ /* ALTERNATING BANDS (user 2026-09-22, against Finder's list view). The row dividers went with the
2318
+ * pill shape, and a long list needs SOMETHING to track a line across to its date and size. Finder
2319
+ * bands every other row; so does this. `fg-02` is the faintest ink stop — it must read as texture,
2320
+ * never as a state — and both real states outrank it: `is-selected` and a drop are excluded
2321
+ * outright rather than left to specificity. Columns are NOT banded: a column is one folder, read
2322
+ * top to bottom with nothing to the right of a name. */
2323
+ .kol-row-browser > li:nth-child(even):not(.is-selected):not([data-drop-over]) {
2324
+ background-color: var(--kol-fg-02);
2325
+ border-radius: var(--kol-radius-sm);
2326
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kolkrabbi/kol-theme",
3
- "version": "0.146.0",
3
+ "version": "0.148.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",