@kolkrabbi/kol-theme 0.45.0 → 0.46.1

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.
@@ -859,18 +859,37 @@
859
859
  padding: var(--kol-row-pad);
860
860
  min-height: var(--kol-row-min-h);
861
861
  background: var(--kol-row-bg);
862
- border-color: var(--kol-row-border);
862
+ /* the FALLBACK is not optional. A variant with no frame publishes no
863
+ * `--kol-row-border`, and `border-color: var(--undefined)` is invalid at
864
+ * computed-value time — it resolves to `unset`, which INHERITS, which is
865
+ * currentColor, which is the text colour. That is how `default`'s hairline
866
+ * divider rendered as a solid white rule. */
867
+ border-color: var(--kol-row-border, transparent);
863
868
  transition: background-color 300ms var(--kol-ease-house),
864
869
  border-color 300ms var(--kol-ease-house);
865
870
  }
871
+
872
+ /* the divider is its OWN longhand, declared after the shorthand above so it
873
+ * wins on order — `default`'s bottom rule is not the same thing as a framed
874
+ * variant's border, and one property cannot carry both. */
875
+ .kol-row--divided {
876
+ border-bottom: 1px solid var(--kol-fg-08);
877
+ }
866
878
  .kol-row > .kol-row-thumb {
867
879
  width: var(--kol-row-thumb);
868
880
  }
869
881
 
870
- /* 768 = the ruled `md` rung (08-breakpoints/01-values.md). A media query
871
- * cannot read a custom property, so the number is a literal by necessity —
872
- * naming the rung is the only thing that stops it reading as arbitrary. */
873
- @media (min-width: 768px) {
882
+ /* CONTAINER query, not a viewport one (2026-08-15). The row steps on the width
883
+ * of the WALL it sits in, for exactly the reason the card-wall law gives: the
884
+ * shell rails eat width that viewport breakpoints cannot see, so a row inside a
885
+ * 700px panel on a 1600px screen was taking the desktop step and overflowing.
886
+ * It also means the step is VISIBLE in a resizable panel instead of only when
887
+ * the whole browser is dragged.
888
+ *
889
+ * 768 is still the ruled `md` rung (08-breakpoints/01-values.md) — the number
890
+ * did not change, only what it measures. A row with no container ancestor falls
891
+ * back to its base values, which is the correct nothing-happens. */
892
+ @container (min-width: 768px) {
874
893
  .kol-row {
875
894
  gap: var(--kol-row-gap-md, var(--kol-row-gap));
876
895
  padding: var(--kol-row-pad-md, var(--kol-row-pad));
@@ -920,8 +939,10 @@
920
939
  * one (work: 16 → 24, matching the shipped drawer's `p-4 md:p-6`). Same
921
940
  * custom-property mechanism as .kol-row — Tailwind cannot generate an
922
941
  * md: variant from package source, and these are per-variant data. */
923
- /* the ruled `md` rung, same as .kol-row above */
924
- @media (min-width: 768px) {
942
+ /* the ruled `md` rung, same as .kol-row above — and a container query for the
943
+ * same reason: a card in a narrow wall must not take the wide plate padding
944
+ * because the BROWSER happens to be wide. */
945
+ @container (min-width: 768px) {
925
946
  .kol-card-plate {
926
947
  padding: var(--kol-plate-pad-md, var(--kol-plate-pad));
927
948
  }
@@ -964,3 +985,44 @@
964
985
  .kol-expand-content {
965
986
  transition: opacity 300ms var(--kol-ease-house);
966
987
  }
988
+
989
+ /* ─────────────────────────────────────────────────────────────────────
990
+ * ContentMedia — the hover zoom
991
+ *
992
+ * A state the house serves on image-led cards: the artwork creeps up
993
+ * inside its own frame while the frame holds still. ContentMedia already
994
+ * clips, so the scale has something to push against — without that
995
+ * overflow the image just grows out of the card.
996
+ *
997
+ * Keyed off the CARD's hover, not the media's, because the whole tile is
998
+ * the affordance; hovering the caption must zoom too. Transform only —
999
+ * it is the one property that scales without relayout, and a wall of
1000
+ * these must not thrash the grid.
1001
+ *
1002
+ * 1.06 and 600ms, deliberately slow and small: a zoom you can SEE
1003
+ * happening reads as a photograph breathing; a fast one reads as a
1004
+ * glitch.
1005
+ * ───────────────────────────────────────────────────────────────────── */
1006
+ .kol-media-zoom > img,
1007
+ .kol-media-zoom > video {
1008
+ transition: transform 600ms var(--kol-ease-house);
1009
+ transform-origin: center;
1010
+ }
1011
+
1012
+ @media (hover: hover) {
1013
+ .group:hover .kol-media-zoom > img,
1014
+ .group:hover .kol-media-zoom > video {
1015
+ transform: scale(1.06);
1016
+ }
1017
+ }
1018
+
1019
+ @media (prefers-reduced-motion: reduce) {
1020
+ .kol-media-zoom > img,
1021
+ .kol-media-zoom > video {
1022
+ transition: none;
1023
+ }
1024
+ .group:hover .kol-media-zoom > img,
1025
+ .group:hover .kol-media-zoom > video {
1026
+ transform: none;
1027
+ }
1028
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kolkrabbi/kol-theme",
3
- "version": "0.45.0",
3
+ "version": "0.46.1",
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",