@kolkrabbi/kol-component 0.245.0 → 0.247.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kolkrabbi/kol-component",
3
- "version": "0.245.0",
3
+ "version": "0.247.0",
4
4
  "description": "The core component library",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -38,7 +38,7 @@
38
38
  "react-dom": "^18.3.0 || ^19.0.0"
39
39
  },
40
40
  "devDependencies": {
41
- "@kolkrabbi/kol-icons": "^0.33.1"
41
+ "@kolkrabbi/kol-icons": "^0.35.0"
42
42
  },
43
43
  "files": [
44
44
  "src",
package/src/index.js CHANGED
@@ -38,6 +38,9 @@ export { default as IconFrame } from './atoms/IconFrame.jsx'
38
38
  export { default as ExitPreview } from './utilities/ExitPreview.jsx'
39
39
  export { default as Figure } from './atoms/Figure.jsx'
40
40
  export { default as FullscreenOverlay } from './utilities/FullscreenOverlay.jsx'
41
+ /* the overlay layer stack — which open layer owns Escape; exported so a layer in another package
42
+ * (kol-shell's walkthrough) joins the same stack instead of a second one (2026-10-09) */
43
+ export { pushLayer, popLayer, isTopLayer } from './utilities/layerStack.js'
41
44
  /* BackgroundVideo — renamed from HlsVideo and moved to utilities 2026-10-01 (user ruling: no UI,
42
45
  * and the name said how it streams, not what it is for). `HlsVideo` is the alias, on the ledger. */
43
46
  export { default as BackgroundVideo, default as HlsVideo } from './utilities/BackgroundVideo.jsx'
@@ -6,8 +6,8 @@ import ContentText from './ContentText.jsx'
6
6
  * the variant has one) beside the ruled text. Box values — thumb size, gap,
7
7
  * padding, frame — default per variant to the RULED structures from the live
8
8
  * review (06-content-card-system.md §2 boxes): default is a bare table-like
9
- * line with a 48px thumb; catalog/print are framed between-headers with no
10
- * thumb; article rides a 120px 16:9 thumb; work a framed 64px row; typeface a
9
+ * line with a 48px thumb; catalog/print are framed between-headers with a
10
+ * 36 square thumb when `media` is passed (none without); article rides a 120px 16:9 thumb; work a framed 64px row; typeface a
11
11
  * framed no-thumb block.
12
12
  *
13
13
  * @param {string} variant file | catalog | print | article | work | typeface | roster
@@ -57,7 +57,10 @@ const BOX = {
57
57
  /* catalog/print rows render AT 36px — the shipped GridCard list row is a
58
58
  * fixed 36 and the Y padding was what pushed it past that. X padding stays;
59
59
  * `minH` is now the whole height budget and the row centres inside it. */
60
- catalog: { thumb: 0, ratio: '1 / 1', pad: `0 ${S3}`, gap: S3, frame: 'var(--kol-fg-04)', bg: 'var(--kol-surface-tertiary)', minH: 36, align: 'items-center', hover: 'var(--kol-oq-04)' },
60
+ /* catalog carries a thumb (2026-10-09 — user: "catalog should change its default"): the full
61
+ * 36 rung, square, and ONLY when `media` is passed — every catalog row that never had one keeps
62
+ * none, rather than growing a MISSING plate (`mediaOnly`). */
63
+ catalog: { thumb: 36, mediaOnly: true, ratio: '1 / 1', pad: `0 ${S3}`, gap: S3, frame: 'var(--kol-fg-04)', bg: 'var(--kol-surface-tertiary)', minH: 36, align: 'items-center', hover: 'var(--kol-oq-04)' },
61
64
  /* ListingCard's row thumb is `bg-fg-12` bare — a tint, no border. */
62
65
  /* article had NO hover of any kind — the only row in the family you could
63
66
  * point at and get nothing back. It has no surface of its own, so it takes
@@ -188,7 +191,7 @@ export default function ContentRow({
188
191
  * consumer listing coverless documents should not have to say it two
189
192
  * different ways on the card and the row. `media={false}` reads the same in
190
193
  * both; `thumb` still wins when it is passed explicitly. */
191
- const thumbPx = thumb ?? (media === false ? 0 : box.thumb)
194
+ const thumbPx = thumb ?? (media === false || (box.mediaOnly && media == null) ? 0 : box.thumb)
192
195
  const padY = (paddingY != null ? `${paddingY}px` : String(box.pad)).trim().split(/\s+/)[0]
193
196
 
194
197
  /* The md: STEP is a custom property, not a Tailwind variant. Tailwind cannot
@@ -107,7 +107,7 @@ export default function SectionText({
107
107
  ? <p className={cls(bodyClass, 'body')} style={slotStyle.body}>{body}</p>
108
108
  : <div className={cls(bodyClass, 'body')} style={slotStyle.body}>{body}</div>)
109
109
  const cluster = actions && (
110
- <div className={cls(`${actionsClass} shrink-0 h-0 self-center`, 'actions')} style={slotStyle.actions}>{actions}</div>
110
+ <div className={cls(`${actionsClass} shrink-0 md:h-0 md:self-center`, 'actions')} style={slotStyle.actions}>{actions}</div>
111
111
  )
112
112
  return (
113
113
  <div className={`kol-section-text flex flex-col ${gap} ${alignCls} ${className}`.replace(/\s+/g, ' ').trim()} style={style}>
@@ -133,7 +133,10 @@ export default function SectionText({
133
133
  * have been space between … on the right edge"). The column is `items-start`, so this
134
134
  * row shrank to its content and `justify-between` had no room to act: the cluster sat
135
135
  * against the subtitle on every PageHeader with actions. */
136
- <div className="flex self-stretch items-baseline justify-between gap-6">
136
+ /* BELOW `md` THE CLUSTER DROPS UNDER THE BODY (kol-fxr 2026-10-09, HubSettingsHeaderAt390:
137
+ * at 390 the cluster kept its natural width and left the lede ~110px, three lines). It
138
+ * takes its own row there, with its real height; the zero-height trick is a desk rule. */
139
+ <div className="flex flex-col md:flex-row self-stretch md:items-baseline md:justify-between gap-3 md:gap-6">
137
140
  {bodyNode}
138
141
  {cluster}
139
142
  </div>
@@ -523,19 +523,39 @@ const ContentFilters = ({
523
523
 
524
524
  {/* the view family's own line below md (`auto`) or always (`below`) —
525
525
  * full width, wrapping, so no view is ever off the page */}
526
- {viewModeOptions && viewPlacement !== 'header' && (
527
- <div className={`${viewPlacement === 'auto' ? 'md:hidden ' : ''}mb-3`}>
528
- {viewStrip('flex flex-wrap gap-y-2')}
529
- </div>
530
- )}
531
- {/* the consumer's trailing controls: their OWN line below md (`auto`) or
532
- * always (`below`) — full width, wrapping. In the below row's right
533
- * group they measured 223px beside LIST/GRID in a 342px track. */}
534
- {trailingActions && trailingPlacement !== 'header' && (
535
- <div className={`${trailingPlacement === 'auto' ? 'md:hidden ' : ''}mb-3 flex flex-wrap items-center gap-6 gap-y-2`}>
536
- {trailingActions}
537
- </div>
538
- )}
526
+ {/* BELOW `md` THE VIEW STRIP AND THE TRAILING CONTROLS SHARE ONE WRAPPING LINE (kol-fxr
527
+ * 2026-10-09, HubSettingsHeaderAt390: fxr's SETTINGS label and its options/shortcuts toggle
528
+ * were two ragged rows of one rung). Same rung, same line; it still wraps when they do not
529
+ * fit, so nothing is ever off the page. `below` placements keep their own line at every width. */}
530
+ {(() => {
531
+ const view = viewModeOptions && viewPlacement !== 'header'
532
+ const trail = trailingActions && trailingPlacement !== 'header'
533
+ const shared = view && trail && viewPlacement === 'auto' && trailingPlacement === 'auto'
534
+ if (shared) return (
535
+ <div className="md:hidden mb-3 flex flex-wrap items-center gap-6 gap-y-2">
536
+ {/* the desk's order — trailing, then the strip — so a consumer's divider sits between them */}
537
+ {trailingActions}
538
+ {viewStrip('flex flex-wrap gap-y-2')}
539
+ </div>
540
+ )
541
+ return (
542
+ <>
543
+ {view && (
544
+ <div className={`${viewPlacement === 'auto' ? 'md:hidden ' : ''}mb-3`}>
545
+ {viewStrip('flex flex-wrap gap-y-2')}
546
+ </div>
547
+ )}
548
+ {/* the consumer's trailing controls: their OWN line below md (`auto`) or
549
+ * always (`below`) — full width, wrapping. In the below row's right
550
+ * group they measured 223px beside LIST/GRID in a 342px track. */}
551
+ {trail && (
552
+ <div className={`${trailingPlacement === 'auto' ? 'md:hidden ' : ''}mb-3 flex flex-wrap items-center gap-6 gap-y-2`}>
553
+ {trailingActions}
554
+ </div>
555
+ )}
556
+ </>
557
+ )
558
+ })()}
539
559
 
540
560
  {/* BELOW the divider: the filter GROUPS only. Left-aligned columns —
541
561
  * label above values — visible only while the filter toggle is open.