@kolkrabbi/kol-theme 0.145.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.
@@ -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
  *
@@ -166,15 +166,26 @@
166
166
  }
167
167
 
168
168
  /* Tooltip — hover-triggered text label with optional kbd-style shortcut chip.
169
- * Used by molecules/Popover.jsx Tooltip. No border (intentionally distinct
170
- * from native browser tooltips); shortcut renders as a fg-tinted chip. */
169
+ * Used by utilities/Popover.jsx Tooltip; shortcut renders as a fg-tinted chip.
170
+ *
171
+ * SYMMETRIC PADDING (2026-09-21). It was `4px 4px 4px 8px` — 8 left, 4 right —
172
+ * so a shortcut chip could sit tight to the right edge. Most tooltips carry no
173
+ * shortcut, so the common case rendered its label 4px off the centre of a
174
+ * perfectly centred box, which reads as a positioning bug and is not one. The
175
+ * chip now sits 8px in like the text does.
176
+ *
177
+ * It also had no border, deliberately, to stay distinct from a native browser
178
+ * tooltip. The editor's own `[data-kol-tip]` rule has carried one since it was
179
+ * written, so the border is the DS's now — at `.kol-popover`'s own `oq-04`,
180
+ * the opaque ramp, for the reason stated on that rule. */
171
181
  .kol-tooltip {
172
182
  display: inline-flex;
173
183
  align-items: center;
174
184
  gap: 6px;
175
185
  background: var(--kol-surface-secondary);
186
+ border: 1px solid var(--kol-oq-04);
176
187
  border-radius: var(--kol-radius-sm);
177
- padding: 4px 4px 4px 8px;
188
+ padding: 4px 8px;
178
189
  font-family: var(--kol-font-family-mono);
179
190
  font-size: 11px;
180
191
  line-height: 1;
@@ -1249,46 +1260,297 @@
1249
1260
  * as a second, darker plate. Prose is bounded by the page, not by its own
1250
1261
  * measure; tables and pre wrap inside it. */
1251
1262
  .kol-doc-page {
1252
- 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);
1253
1266
  border-radius: var(--kol-radius-sm);
1254
1267
  padding: 24px;
1255
1268
  min-width: 0;
1256
1269
  overflow-wrap: anywhere;
1257
1270
  }
1258
1271
  .kol-doc-page .kol-codeblock-wrapper { margin: 0; }
1259
- .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; }
1260
1278
  .kol-doc-page .kol-prose { max-width: none; margin: 0; padding: 0; }
1261
1279
  .kol-doc-page .kol-prose table { max-width: 100%; }
1262
1280
  .kol-doc-page .kol-prose td,
1263
1281
  .kol-doc-page .kol-prose th { overflow-wrap: anywhere; word-break: break-word; }
1264
1282
  .kol-doc-page .kol-prose pre { white-space: pre-wrap; overflow-wrap: anywhere; }
1265
- /* 3:5 IS THE TALLEST A DOCUMENT PAGE MAY BE (BrowsePageRulingsAndSeams,
1266
- * kol-r2b2 2026-09-02; user 2026-08-28: "this is not an approved ratio"). The
1267
- * overlay page was A-series (1:√2) and the column preview had NO bound at all,
1268
- * so the FILE decided the height — a 7 KB JSON drew a pane taller than the
1269
- * browser. 3:5 is the portrait rung on the export-specs ladder below 4:5, and
1270
- * the floor before a page reads as a 9:16 strip. Both presentations take it:
1271
- * content scrolls inside the box, the box never grows to the file. */
1272
- .kol-overlay .kol-doc-page {
1273
- aspect-ratio: 3 / 5;
1274
- height: 85vh;
1275
- width: auto;
1276
- 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;
1277
1382
  overflow-y: auto;
1278
1383
  overflow-x: hidden;
1279
- margin-inline: auto;
1280
1384
  }
1281
- .kol-column-browser-preview .kol-doc-page {
1282
- aspect-ratio: 3 / 5;
1283
- height: auto;
1284
- overflow: auto;
1285
- zoom: 0.5;
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
+
1512
+ /* THE WALL'S THUMB — the same document, at tile scale. `KindPreview` renders a
1513
+ * real page; in a 44px row or a 230px card that is a wall of unreadable glyphs,
1514
+ * so the page is zoomed down and clipped and you read its SHAPE (a JSON tree, a
1515
+ * frontmatter block, a table) rather than its words. Same treatment the column
1516
+ * preview uses, one rung smaller. The children reset `zoom: 1` so it never
1517
+ * compounds. No forced ratio here either — the tile is the bound. */
1518
+ .kol-media-thumb .kol-doc-page {
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);
1523
+ height: 100%;
1524
+ width: 100%;
1525
+ padding: 12px;
1526
+ overflow: hidden;
1286
1527
  background: transparent;
1287
1528
  border-radius: 0;
1288
1529
  }
1289
- .kol-column-browser-preview .kol-doc-page :is(.kol-prose, .kol-codeblock-wrapper, .kol-doc-frontmatter) { zoom: 1; }
1290
- /* documents start at the top of the column frame with a small inset, and scroll */
1291
- .kol-column-browser-preview > div:first-child:has(.kol-doc-page) { align-items: flex-start; justify-content: flex-start; overflow: auto; }
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. */
1533
+ .kol-media-thumb .kol-prose,
1534
+ .kol-media-thumb .kol-codeblock-wrapper { max-width: none; }
1535
+ .kol-media-thumb > * { max-width: 100%; max-height: 100%; }
1536
+
1537
+ .kol-column-browser-preview .kol-doc-page {
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);
1550
+ }
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; }
1292
1554
 
1293
1555
  /* THE QUICKTIME BAR (PlaybackBarAndAudioSheet, kol-r2b2 2026-08-27 — ruled
1294
1556
  * against the reference). White glyphs on the frosted strip whatever the theme:
@@ -1310,6 +1572,14 @@
1310
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); }
1311
1573
  .kol-playback-scrub::-moz-range-track { height: 2px; border-radius: 1px; background: color-mix(in srgb, var(--kol-color-ab-white) 40%, transparent); }
1312
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); }
1313
1583
 
1314
1584
  /* ColumnBrowser rows — ONE SELECTED STATE (ColumnBrowserSeams, kol-r2b2
1315
1585
  * 2026-08-28; user: "ONLY one selected state can exist, not TWO"). The row's
@@ -1338,8 +1608,24 @@
1338
1608
  * correct together since. */
1339
1609
  .kol-column-browser-row:hover,
1340
1610
  .kol-column-browser-row.is-cursor { background-color: transparent; }
1341
- .kol-column-browser-row.is-selected { background-color: var(--kol-fg-02); }
1342
- .kol-column-browser-column:not(:has(~ .kol-column-browser-column .is-selected)) > .is-selected { background-color: var(--kol-fg-04); }
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); }
1620
+ /* A DROP TARGET OUTRANKS SELECTION while something is over it (2026-09-21). It is transient and it
1621
+ * is the one thing you must see mid-drag — which folder is about to receive this. It sits AFTER the
1622
+ * two fills above and matches their specificity through the child combinator, so it wins the tie
1623
+ * rather than merely claiming to; written above them it lost to the deepest-column rule. */
1624
+ .kol-column-browser-column > .kol-column-browser-row[data-drop-over] { background-color: var(--kol-oq-16); }
1625
+ /* THE COLUMN ITSELF AS A TARGET — dropping anywhere in a column files the item into the folder
1626
+ * that column is showing. An inset ring rather than a fill: a fill over a list of rows reads as
1627
+ * every row being selected, which is the opposite of what is being said. */
1628
+ .kol-column-browser-column[data-drop-over] { box-shadow: inset 0 0 0 2px var(--kol-fg-16); }
1343
1629
 
1344
1630
  /* THE ROW IS A PILL (same ticket, user ruling 2026-08-27: "dont make selected
1345
1631
  * state move the layout"). A constant 4px inset on EVERY row, selected or not,
@@ -1350,7 +1636,20 @@
1350
1636
  * box the pill is not. `.kol-column-browser-preview` is deliberately NOT in the
1351
1637
  * padding rule: it has no rows, and its own `p-4` is a Tailwind utility that
1352
1638
  * would out-rank this layer anyway. */
1353
- .kol-column-browser-row { margin-inline: 4px; }
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
+ }
1354
1653
  .kol-column-browser-column { padding-block: 4px; }
1355
1654
  .kol-column-browser-row.is-selected,
1356
1655
  .kol-column-browser-row.is-cursor { border-radius: var(--kol-radius-sm); }
@@ -1457,6 +1756,10 @@
1457
1756
  margin-inline: auto;
1458
1757
  padding: 24px;
1459
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; }
1460
1763
 
1461
1764
  /* ─────────────────────────────────────────────────────────────────────
1462
1765
  * TONE — sunken (ControlToneSunken, kol-website 2026-08-28; was "inverse",
@@ -1828,10 +2131,13 @@
1828
2131
 
1829
2132
  /* ─── the families that keep their own plates ─── */
1830
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); }
1831
2137
  /* the sunken well's chip ladder (rest · +fg-04 hover · +fg-08 selected) — on the
1832
2138
  * element, or inherited from a sunken wrapper */
1833
- :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); }
1834
- :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); }
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); }
1835
2141
  /* the open search shell — was `bg-fg-04` on the element, sunken by class */
1836
2142
  .kol-expand--open { background-color: var(--kol-tone-bg, var(--kol-fg-04)); }
1837
2143
  /* THE SEGMENTED STRIP, SUNKEN (segmented-toggle-sunken-tone, kol-client-olina
@@ -1967,3 +2273,48 @@
1967
2273
  .kol-toc-tick .kol-toc-rule { width: 5px; }
1968
2274
  .kol-toc-label, .kol-toc-rule { transition: none; }
1969
2275
  }
2276
+
2277
+ /* THE ROW BROWSER — the folder list view. Same drop affordance as a column, for the same reason:
2278
+ * the list IS the folder you are in, so dropping anywhere on it files the item here. */
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.145.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",