@kolkrabbi/kol-theme 0.130.0 → 0.131.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-animation.css CHANGED
@@ -333,8 +333,9 @@
333
333
  * kol-component's `utilities/motion.js`, GRAB); `clamp()` holds it half its own
334
334
  * length from either end so it stops flush, never past.
335
335
  *
336
- * Longer and finer than the ColumnBrowser's 3 × 32 on a rail it should read
337
- * as a thickening of the line, not a tab stuck to it. The fade is long and
336
+ * Fine and long it should read as a thickening of the line, not a tab stuck
337
+ * to it. (This said "longer and finer than the ColumnBrowser's 3 × 32" until
338
+ * 2026-09-02; that handle takes the same 0.125 × 4.5rem now.) The fade is long and
338
339
  * unhurried at BOTH ends on a symmetric in-out: an ease-out popped the first
339
340
  * 20 % and crawled the rest, which the user read as a jerk.
340
341
  * ═════════════════════════════════════════════════════════════════════ */
@@ -370,6 +371,18 @@
370
371
  .kol-rail-grab::before { transition: none; }
371
372
  }
372
373
 
374
+ /* The ColumnBrowser's two handles wear the SAME pill (BrowsePageRulingsAndSeams,
375
+ * kol-r2b2 2026-09-02, user ruling) — `useGrabEdge` drives both. Their geometry
376
+ * and placement differ and stay with the component in
377
+ * kol-components-molecules.css (the strips sit INSIDE the border they grab, and
378
+ * there are two axes); only the reduced-motion cut belongs here, with every
379
+ * other one. The 08-28 note on the rail's pill — "Longer and finer than the
380
+ * ColumnBrowser's 3 × 32" — is stale: they are the same 0.125 × 4.5rem now. */
381
+ @media (prefers-reduced-motion: reduce) {
382
+ .kol-column-browser-resize-x::before,
383
+ .kol-column-browser-resize-y::before { transition: none; }
384
+ }
385
+
373
386
  /* ═════════════════════════════════════════════════════════════════════
374
387
  * SCROLL ENTRANCE — the reveal family (promoted from kol-website's
375
388
  * apps/web/src/styles/animations.css, 2026-08-28, on the user's "it's good to
@@ -1351,33 +1351,74 @@
1351
1351
  cursor: row-resize;
1352
1352
  touch-action: none;
1353
1353
  }
1354
- /* THE GRAB IS A PILL, NOT A WASH (ColumnBrowserChromeCorrections, kol-r2b2
1355
- * 2026-08-28 user: "dont show me this way to grab" · "like in the sidenav" ·
1356
- * "MIDDLE smack middle" · "more smooth animation longer in and out"): the same
1357
- * affordance as the framework's `.kol-sidenav-grab::before` — 0.1875rem × 2rem,
1358
- * radius-full, fg-64, dead centre (pointer-following was built and rejected).
1359
- * Two deliberate differences: hidden at rest rather than dim (N handles standing
1360
- * at rest is noise where the SideNav has one) and 420ms rather than 150ms. */
1354
+ /* THE GRAB PILL ON THE LINE, FOLLOWING THE POINTER (BrowsePageRulingsAndSeams,
1355
+ * kol-r2b2 2026-09-02, user ruling; supersedes the "pointer-following was built
1356
+ * and rejected" note that stood here from ColumnBrowserChromeCorrections
1357
+ * 2026-08-28).
1358
+ *
1359
+ * The rejection was already contradicted by the DS itself: the rail's grab
1360
+ * (`kol-animation.css` § THE GRAB PILL, RailFlatGrabOpen, kol-mirror 2026-08-28
1361
+ * — *"make it like it is in kol-r2b2, it has animation and gsap"*) shipped the
1362
+ * pointer-follow, the 0.125 × 4.5rem geometry and the slow proximity fade the
1363
+ * SAME DAY, and its own comment noted the two handles were knowingly different.
1364
+ * One gesture, two shapes, is the ruling now. `useGrabEdge` drives both.
1365
+ *
1366
+ * THESE HANDLES ARE NOT THE SIDENAV'S, and that is the part to keep straight:
1367
+ *
1368
+ * ACROSS the rail's strip STRADDLES its line, so a strip-centred pill IS the
1369
+ * line. These strips lie INSIDE the border they grab — the x strip is
1370
+ * pulled back over the column's right edge (`margin-left: -8px`), the
1371
+ * y strip sits on the root's inner bottom edge — so a strip-centred
1372
+ * pill is always ~4px short of it. The FAR edge plus half the 1px
1373
+ * border is the line: `calc(100% + 0.5px)`.
1374
+ * AXES the rail has one vertical edge; there are two here, and the pill on
1375
+ * each travels the other way from what it resizes. The x handle reads
1376
+ * `--kol-rail-grab-y`, the y handle `--kol-rail-grab-x`.
1377
+ * REST hidden, not dim — N handles standing at rest is noise where the
1378
+ * SideNav has one. The rail's pill rests visible; these do not.
1379
+ *
1380
+ * Shared with the rail, deliberately: the fine/long geometry, the 1800ms fade
1381
+ * with its 400ms rest delay and 40ms engaged delay, and the symmetric in-out
1382
+ * curve. The ease-out kol-r2b2 filed is the curve the rail moved OFF on
1383
+ * 2026-08-28 (it popped the first 20 % and crawled the rest — the user read it
1384
+ * as a jerk); the travel likewise comes from `GRAB` in kol-component's
1385
+ * motion.js — dwell, not a 30px deadband — so one gesture cannot drift into two
1386
+ * feels. `clamp()` holds the pill half its own length from each end. */
1361
1387
  .kol-column-browser-resize-x::before,
1362
1388
  .kol-column-browser-resize-y::before {
1363
1389
  content: '';
1364
1390
  position: absolute;
1365
- top: 50%;
1366
- left: 50%;
1367
1391
  translate: -50% -50%;
1368
1392
  border-radius: var(--kol-radius-full);
1369
1393
  background: var(--kol-fg-64);
1370
1394
  opacity: 0;
1371
- transition: opacity 420ms cubic-bezier(0.4, 0, 0.2, 1);
1395
+ transition: opacity 1800ms cubic-bezier(0.45, 0, 0.55, 1) 400ms, background-color 500ms ease;
1372
1396
  }
1373
- .kol-column-browser-resize-x::before { width: 0.1875rem; height: 2rem; }
1374
- .kol-column-browser-resize-y::before { width: 2rem; height: 0.1875rem; }
1375
- .kol-column-browser-resize-x:hover::before,
1397
+ .kol-column-browser-resize-x::before {
1398
+ width: 0.125rem;
1399
+ height: 4.5rem;
1400
+ left: calc(100% + 0.5px);
1401
+ top: clamp(2.25rem, var(--kol-rail-grab-y, 50%), calc(100% - 2.25rem));
1402
+ }
1403
+ .kol-column-browser-resize-y::before {
1404
+ width: 4.5rem;
1405
+ height: 0.125rem;
1406
+ top: calc(100% + 0.5px);
1407
+ left: clamp(2.25rem, var(--kol-rail-grab-x, 50%), calc(100% - 2.25rem));
1408
+ }
1409
+ /* `is-near` = the pointer is within GRAB.near of THIS handle's line (JS,
1410
+ * hysteresis at GRAB.sleep). The pill shows before you are on the 8px strip, so
1411
+ * the grab is discoverable instead of hidden. */
1412
+ .kol-column-browser-resize-x.is-near::before,
1376
1413
  .kol-column-browser-resize-x.is-dragging::before,
1377
- .kol-column-browser-resize-y:hover::before,
1414
+ .kol-column-browser-resize-y.is-near::before,
1378
1415
  .kol-column-browser-resize-y.is-dragging::before {
1379
1416
  opacity: 1;
1417
+ transition-delay: 40ms;
1380
1418
  }
1419
+ .kol-column-browser-resize-x.is-dragging::before,
1420
+ .kol-column-browser-resize-y.is-dragging::before { background: var(--kol-fg-96); }
1421
+
1381
1422
  .kol-overlay .kol-prose {
1382
1423
  max-width: var(--kol-content-measure);
1383
1424
  margin-inline: auto;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kolkrabbi/kol-theme",
3
- "version": "0.130.0",
3
+ "version": "0.131.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",