@kolkrabbi/kol-theme 0.85.0 → 0.87.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.
@@ -61,13 +61,25 @@
61
61
  * button text — the stretched label span then centers inside the widest-ghost
62
62
  * cell (a value floating at a random indent per list). Pin it to the leading
63
63
  * edge, Input's model. */
64
- .kol-dd-label { display: inline-grid; min-width: 0; text-align: start; }
65
- .kol-dd-label > span { grid-area: 1 / 1; white-space: nowrap; }
64
+ .kol-dd-label { display: inline-grid; min-width: 0; text-align: start; overflow: hidden; }
65
+ .kol-dd-label > span { grid-area: 1 / 1; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
66
66
  /* Ghost slack: each hidden option reserves the PANEL row's trailing check
67
67
  * column on top of its label, so the fused one-piece width fits every row
68
68
  * without truncating (2026-08-09 night — closes the "Cen…" defect at the
69
69
  * trigger instead of un-fusing the panel). */
70
70
  .kol-dd-ghost { visibility: hidden; padding-right: 1rem; }
71
+ /* THE RESERVATION YIELDS TO THE AVAILABLE WIDTH (DropdownGhostWidthAndListHeight,
72
+ * kol-mirror 2026-08-28 — user, on the studio's 30-option Source picker in a
73
+ * ~300px shelf: "1 it's way too tall, 2 it's not fitting"). The ghost stack
74
+ * above reserves the widest option's width, and the 2026-08-09 one-piece ruling
75
+ * assumed a trigger free to take it: with 30 long labels it computed ~640px,
76
+ * overflowed its container and was clipped, while the portalled panel rendered
77
+ * at the true 640 — a panel wider than and detached from its trigger. Capping
78
+ * the trigger at its container keeps the fusion honest (the panel still matches
79
+ * `rects.reference.width`, which is now the real one) and the label ellipsises.
80
+ * A dropdown in a narrow chrome is where dropdowns live. */
81
+ .kol-dd-root { max-width: 100%; }
82
+ .kol-dd-trigger { max-width: 100%; }
71
83
  .kol-dd-caret {
72
84
  flex-shrink: 0;
73
85
  transition: rotate var(--kol-transition-base);
@@ -101,7 +113,18 @@
101
113
  border-top: none; /* the trigger's bottom edge is the divider (docs page) */
102
114
  }
103
115
  .kol-dd-div { border-top: 1px solid var(--kol-fg-08); }
104
- .kol-dd-list { padding: var(--kol-spacing-1); overflow-y: auto; min-height: 0; }
116
+ /* A ROWS CEILING THE CONSUMER CAN REACH (same ticket): Popover's size
117
+ * middleware clamps the PANEL to the viewport, which does nothing for a
118
+ * 30-row slab opened at the top of a tall page — and its inline `maxHeight`
119
+ * cannot be overridden from a consumer stylesheet, so the ceiling had to be
120
+ * ours. `maxRows` (Dropdown, default 10) and `rowHeight` write these two
121
+ * variables on the panel; the list scrolls at the ceiling as it always could. */
122
+ .kol-dd-list {
123
+ padding: var(--kol-spacing-1);
124
+ overflow-y: auto;
125
+ min-height: 0;
126
+ max-height: calc(var(--kol-dd-max-rows, 10) * var(--kol-dd-row-h, 2rem) + var(--kol-spacing-1) * 2);
127
+ }
105
128
 
106
129
  /* Popover — default chrome for floating-ui-positioned panels.
107
130
  * Used by molecules/Popover.jsx PopoverPanel. */
@@ -1234,12 +1257,22 @@
1234
1257
  .kol-view-toggle.kol-tone-sunken > button:not([aria-pressed="true"]):hover, .kol-view-toggle.kol-tone-inverse > button:not([aria-pressed="true"]):hover { background-color: color-mix(in srgb, var(--kol-color-absolute-white) 8%, transparent); }
1235
1258
  .kol-control.kol-tone-sunken, .kol-control.kol-tone-inverse { background-color: var(--kol-fg-inverse-96); }
1236
1259
  .kol-expand.kol-tone-sunken, .kol-expand.kol-tone-inverse { background-color: var(--kol-fg-inverse-96); }
1237
- /* the trigger: rest and open are its only states the pin-back rules above
1238
- * paint surface-secondary on hover/active, so the tone pins its own chip */
1260
+ /* NO HOVER STATE ON THE DROPDOWN (user ruling 2026-08-28). Rest and open are
1261
+ * its only states and the three selectors are what ENFORCE that: the base
1262
+ * `.kol-dd-trigger:hover/:active` rules paint surface-secondary, so the tone
1263
+ * re-states its own fill on all three and nothing moves. Deleting them gives
1264
+ * the hover back. */
1239
1265
  .kol-dd-trigger.kol-tone-sunken, .kol-dd-trigger.kol-tone-inverse,
1240
1266
  .kol-dd-trigger.kol-tone-sunken:not(:disabled):hover, .kol-dd-trigger.kol-tone-inverse:not(:disabled):hover,
1241
1267
  .kol-dd-trigger.kol-tone-sunken:not(:disabled):active, .kol-dd-trigger.kol-tone-inverse:not(:disabled):active { background-color: var(--kol-fg-inverse-96); }
1242
- .kol-dd-panel.kol-tone-sunken, .kol-dd-panel.kol-tone-inverse { background-color: var(--kol-fg-inverse-96); }
1268
+ /* THE PANEL IS OPAQUE (user 2026-08-28: "transparent doesn't work for
1269
+ * dropdown") — it floats over page content, and every `fg-*` stop is an alpha
1270
+ * wash that the content reads through. `oq-inverse-*`, the opaque tier, bakes
1271
+ * onto `surface-inverse` — the near-WHITE in dark theme — so even `oq-inverse-96`
1272
+ * lands ~23.5 against the #121215 page's 18: lighter than the page, the wrong
1273
+ * side of it. `surface-tertiary` is the flat twin of what the trigger renders:
1274
+ * #0e0e11 (14.0) in dark against the trigger's 14.2, #ffffff in light. */
1275
+ .kol-dd-panel.kol-tone-sunken, .kol-dd-panel.kol-tone-inverse { background-color: var(--kol-surface-tertiary); }
1243
1276
  /* the rest of the set — Button (icon-only especially), IconFrame, ThemeToggle:
1244
1277
  * the well, transparent edge, fg-96 ink; hover the white wash, pressed the
1245
1278
  * fg-08 chip — both LAYERED over the well (a gradient image over the fill),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kolkrabbi/kol-theme",
3
- "version": "0.85.0",
3
+ "version": "0.87.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",