@leavepulse/ui 0.33.1 → 0.35.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.
@@ -451,7 +451,14 @@ const barInsetTop = computed(() =>
451
451
  this is the fallback rather than a competitor. -->
452
452
  <LpContextMenu :items="contextMenu" always>
453
453
  <table class="w-full border-collapse text-sm">
454
- <thead ref="headEl" :class="stickyHeader ? 'sticky top-0 z-10' : ''">
454
+ <!-- The background belongs on `thead` itself, not only on its row:
455
+ `border-collapse` collapses the borders, and with a sticky header the
456
+ rows show through that seam — a band of body text rides across the
457
+ header on every scroll. -->
458
+ <thead
459
+ ref="headEl"
460
+ :class="stickyHeader ? 'sticky top-0 z-10 bg-surface-soft' : ''"
461
+ >
455
462
  <tr class="border-b border-line bg-surface-soft">
456
463
  <th v-if="selectable" class="w-px px-4 py-3">
457
464
  <LpCheckbox
@@ -522,7 +529,7 @@ const barInsetTop = computed(() =>
522
529
  name="lp-row"
523
530
  :ref="(el: unknown) => roving.setContainer((el as { $el?: HTMLElement })?.$el ?? null)"
524
531
  >
525
- <tr v-if="displayRows.length === 0" key="lp-table-empty">
532
+ <tr v-if="displayRows.length === 0" key="lp-table-empty" class="lp-row-empty">
526
533
  <td :colspan="colSpan" class="px-4 py-10 text-center text-muted">
527
534
  <LpIcon :name="emptyIcon" :size="22" class="mx-auto mb-2 opacity-60" />
528
535
  <div>{{ emptyLabel }}</div>
@@ -594,6 +601,19 @@ const barInsetTop = computed(() =>
594
601
  transform: translateX(-0.5rem);
595
602
  }
596
603
 
604
+ /*
605
+ * The empty-state row leaves at once, without the fade. It and the first real
606
+ * rows would otherwise share the table for the length of the animation, and a
607
+ * row of blank height sits above them — the table jumps once on every load.
608
+ *
609
+ * `position: absolute` is what a list would use here, but a positioned `<tr>`
610
+ * drops out of the table layout entirely. Nothing sits below this row to be
611
+ * dragged around, so simply not animating its exit costs nothing.
612
+ */
613
+ .lp-row-empty.lp-row-leave-active {
614
+ display: none;
615
+ }
616
+
597
617
  /*
598
618
  * The leaving row stays in the flow. Taking it out with `position: absolute` is
599
619
  * the usual trick for a list, but a `<tr>` positioned that way loses the table's
package/src/index.ts CHANGED
@@ -64,7 +64,7 @@ export {
64
64
  } from "./components/color"
65
65
  export type { ColorFormat, Hsv, Rgb } from "./components/color"
66
66
  export { default as LpCommandPalette } from "./components/LpCommandPalette.vue"
67
- export type { Command } from "./components/LpCommandPalette.vue"
67
+ export type { Command, PaletteLabels } from "./components/LpCommandPalette.vue"
68
68
  export { default as LpConfirmDialog } from "./components/LpConfirmDialog.vue"
69
69
  export { default as LpContextMenu } from "./components/LpContextMenu.vue"
70
70
  export type { ContextMenuItemDef } from "./components/LpContextMenu.vue"
@@ -105,6 +105,7 @@ export { default as LpLogViewer } from "./components/LpLogViewer.vue"
105
105
  export type { LogLevel, LogLine } from "./components/LpLogViewer.vue"
106
106
  export { default as LpMediaGallery } from "./components/LpMediaGallery.vue"
107
107
  export { default as LpModal } from "./components/LpModal.vue"
108
+ export { default as LpModalNav } from "./components/LpModalNav.vue"
108
109
  export { default as LpNotificationBell } from "./components/LpNotificationBell.vue"
109
110
  export type {
110
111
  NotificationItem,