@kolkrabbi/kol-component 0.168.0 → 0.169.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.168.0",
3
+ "version": "0.169.0",
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",
@@ -329,10 +329,18 @@ export function MediaLibraryBrowse({
329
329
  const crumbs = prefix ? prefix.replace(/\/$/, '').split('/') : []
330
330
 
331
331
  /* the virtual root — one browser for the whole client: root row = the title,
332
- * its children the buckets, stepping into one IS the bucket switch */
332
+ * its children the buckets, stepping into one IS the bucket switch.
333
+ *
334
+ * ONE BUCKET GETS NO BUCKET LEVEL (one-bucket-consumer, kol-client-olina
335
+ * 2026-09-03): with a single bucket the second column was a row that named
336
+ * the only thing it could name, under a root that named the app — two levels
337
+ * to reach a folder. The virtual root collapses to the empty string, which
338
+ * makes every `slice(VROOT.length)` below a no-op and leaves column 0 as the
339
+ * bucket's own folders. Multi-bucket browse is untouched. */
340
+ const single = buckets.length <= 1
333
341
  const ROOT = title
334
342
  const label = bucketMeta.label || 'bucket'
335
- const VROOT = `${ROOT}/${label}/`
343
+ const VROOT = single ? '' : `${ROOT}/${label}/`
336
344
  const treeFolders = (level) => (folderTree?.[bucketMeta.id]?.folders ?? [])
337
345
  .filter((p) => p.startsWith(level) && p.length > level.length && !p.slice(level.length, -1).includes('/'))
338
346
  .map((p) => p.slice(level.length))
@@ -412,8 +420,10 @@ export function MediaLibraryBrowse({
412
420
  columnWidths={settings.columnWidths}
413
421
  onColumnResize={(i, px) => setSettings({ ...settings, columnWidths: { ...(settings.columnWidths ?? {}), [i]: px } })}
414
422
  objects={objects.filter((o) => !isSystemFile(o.key)).map((o) => ({ ...o, key: `${VROOT}${o.key}` }))}
415
- prefix={appRoot ? `${ROOT}/` : `${VROOT}${prefix}`}
423
+ prefix={single ? prefix : (appRoot ? `${ROOT}/` : `${VROOT}${prefix}`)}
416
424
  onPrefix={(v) => {
425
+ /* single: the browser's path IS the bucket path, no segment to strip */
426
+ if (single) { setAppRoot(false); setPrefix(v); return }
417
427
  const [, seg, ...rest] = v.split('/')
418
428
  const target = buckets.find((b) => b.label === seg)
419
429
  if (!target && buckets.length) { setAppRoot(true); setPickedFile(null); setPrefix(''); return }
@@ -435,8 +445,10 @@ export function MediaLibraryBrowse({
435
445
  return <KindPreview o={real} urlOf={(x) => mediaUrl(x.key)} poster={poster ? mediaUrl(poster) : undefined} kindOf={kindOf} kindLabel={KIND_LABEL} />
436
446
  }}
437
447
  partition={(objs, level) => {
438
- if (level === '') return { folders: [`${ROOT}/`], files: [] }
439
- if (level === `${ROOT}/`) return { folders: (buckets.length ? buckets : [bucketMeta]).map((b) => `${b.label || 'bucket'}/`), files: [] }
448
+ if (!single) {
449
+ if (level === '') return { folders: [`${ROOT}/`], files: [] }
450
+ if (level === `${ROOT}/`) return { folders: (buckets.length ? buckets : [bucketMeta]).map((b) => `${b.label || 'bucket'}/`), files: [] }
451
+ }
440
452
  const live = partition(objs, level)
441
453
  const baked = treeFolders(level.slice(VROOT.length))
442
454
  return { folders: [...new Set([...baked, ...live.folders])].sort(), files: live.files }