@kolkrabbi/kol-component 0.104.1 → 0.104.3

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.104.1",
3
+ "version": "0.104.3",
4
4
  "description": "KOL design-system components — atoms through organisms, emitting canonical kol-* classes. Pairs with @kolkrabbi/kol-theme for styling.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -40,10 +40,11 @@ import IconFrame from '../atoms/IconFrame.jsx'
40
40
  * Look seams — all default to the shipped values, pass nothing and nothing changes:
41
41
  * @param {string} props.titleClassName — header title type/ink
42
42
  * @param {boolean} props.titleUppercase — cases the title (default false)
43
- * @param {string} props.labelClassName — filter-group label type/ink
43
+ * @param {string} props.labelClassName — filter-group label type/ink (default `kol-eyebrow text-fg-96`)
44
44
  * @param {boolean} props.labelUppercase — cases the group label (default true)
45
- * groups: `{ label, key, values, stack?, className?, wrapClassName? }` — columns are equal width by default;
46
- * `stack: true` makes a group hug its chips; `className` / `wrapClassName` are per-group seams
45
+ * groups: `{ label, key, values, stack?, className?, wrapClassName? }` — THE FIRST GROUP HUGS ITS CHIPS, EVERY
46
+ * GROUP AFTER IT FLOWS (user law 2026-08-27, by position, never by chip count); `stack` is the explicit
47
+ * override; `className` / `wrapClassName` are per-group seams
47
48
  * @param {string} props.tagVariant — filter chip variant ('primary' grey fill)
48
49
  * @param {string} props.tagSize — filter chip size
49
50
  * @param {string} props.tagActiveClassName — chip ink, selected
@@ -104,7 +105,10 @@ const ContentFilters = ({
104
105
  * titles wrap can move to `kol-mono-14` without losing the casing. */
105
106
  titleClassName = 'kol-helper-14',
106
107
  titleUppercase = true,
107
- labelClassName = 'kol-helper-12 text-fg-96',
108
+ /* the category label is the EYEBROW role (ContentFiltersEqualColumns, what stood —
109
+ * kol-fxr 2026-08-27: every section / category label in the app tier is
110
+ * kol-eyebrow; the role carries the uppercase) */
111
+ labelClassName = 'kol-eyebrow text-fg-96',
108
112
  labelUppercase = true,
109
113
  tagVariant = 'primary',
110
114
  tagSize = 'sm',
@@ -242,13 +246,15 @@ const ContentFilters = ({
242
246
  </div>
243
247
  ) : null
244
248
 
245
- const renderFilterGroup = (group) => {
246
- /* GROUP COLUMNS ARE EQUAL by default (ContentFiltersEqualColumns, kol-fxr
247
- * 2026-08-27 "only the first column is narrow it's content filters
248
- * everywhere"); `stack: true` is the opt-in for a group that hugs its chips.
249
- * The 0.101 short-group default was a per-page ruling written into the
250
- * organism — reverted. */
251
- const stacked = group.stack === true
249
+ const renderFilterGroup = (group, index = 0) => {
250
+ /* THE LAW (user ruling 2026-08-27, said "for the 10th time" — ContentFiltersFirstGroupHugs):
251
+ * THE FIRST FILTER GROUP HUGS ITS CHIPS IT IS NARROW. EVERY GROUP AFTER IT
252
+ * FLOWS ACROSS THE REST OF THE ROW. By POSITION, never by chip count. The
253
+ * reference is kol-website /prints: CATEGORY hugs at the left, YEAR flows
254
+ * beside it. Not equal columns (0.104.1, a misread — reverted), not "short
255
+ * groups stack" (0.101, one page's ruling — reverted). `stack` stays the
256
+ * explicit override; kol-fxr pins `stack: i === 0`. */
257
+ const stacked = group.stack ?? index === 0
252
258
  return (
253
259
  <div key={group.key} className={`flex flex-col gap-3 ${stacked ? 'shrink-0' : 'min-w-0 flex-1'} ${group.className ?? ''}`.trim()}>
254
260
  {/* THE CATEGORY LABEL IS THE ACTIVE INK — `kol-helper-12` at `text-fg-96`,
@@ -261,7 +267,7 @@ const ContentFilters = ({
261
267
  * never what anyone looked at. No inline letter-spacing: the helper ramp
262
268
  * carries its own, and the override the fork added was not in the
263
269
  * rendered path either. */}
264
- <h4 className={labelClassName} style={labelUppercase ? { textTransform: 'uppercase' } : undefined}>
270
+ <h4 className={labelClassName} style={labelUppercase && !/\bkol-eyebrow\b/.test(labelClassName) ? { textTransform: 'uppercase' } : undefined}>
265
271
  {group.label}
266
272
  </h4>
267
273
  {/* the fluid group keeps 48px of room on its right (it ran flush to the
@@ -442,7 +448,7 @@ const ContentFilters = ({
442
448
  <div className="flex items-start justify-between gap-16">
443
449
  <div className="flex min-w-0 flex-1 items-start gap-16">
444
450
  {leadingActions}
445
- {isExpanded && filterGroups.map((group) => renderFilterGroup(group))}
451
+ {isExpanded && filterGroups.map((group, i) => renderFilterGroup(group, i))}
446
452
  {isExpanded && activeFilters.size > 0 && (
447
453
  <button
448
454
  type="button"