Releases: kungal/kun-ui
Release list
v2.17.0
Minor Changes
-
aae4747: feat(vue): KunPopover exposes right / left (and centered) placements
KunPopoverPositionnow covers all 12 floating-ui sides — theright-*/left-*
placements (and the centeredtop/bottom/right/left) are now part of
the public type, not justtop-*/bottom-*.The implementation already passed
positionstraight to floating-ui and mapped
every side's transform-origin, so a side-anchored flyout just needed the type to
allow it. WithautoPosition(the default) aposition="right-start"flyout is
fully collision-aware:flip()/shift()keep it on-screen andsize()caps
its height to the available space and scrolls — so a tall menu near the bottom
edge no longer clips. This makes a navigation rail's hover flyout a first-class
use of<KunPopover position="right-start" trigger="hover" :group>instead of
hand-rolledabsolute left-full+max-h-[80vh]positioning.
Patch Changes
- @kungal/ui-core@2.17.0
v2.16.0
Minor Changes
-
d23e061: feat(vue): KunTab auto-handles horizontal overflow (scroll + edge fade + chevrons)
A horizontal tab strip that outgrows its container now scrolls inside the
container instead of widening the page — automatically, with noscrollable
flag and no manual overflow check. When the tabs overflow:- the overflowing edge fades to transparent via a CSS mask — background-independent,
so it reads clearly on any surface (unlike a colored scroll shadow that blends in); - a chevron button floats on each scrollable side (opt out with
:scroll-buttons="false"
to keep just the fade); - the active tab auto-scrolls into view, so ← / → keyboard nav always keeps the
selection visible.
New prop:
scrollButtons?: boolean(defaulttrue). The existingscrollable
prop now only governs vertical tab columns; horizontal overflow is handled
unconditionally. - the overflowing edge fades to transparent via a CSS mask — background-independent,
Patch Changes
- @kungal/ui-core@2.16.0
v2.15.1
Patch Changes
-
4ba751a: fix(vue): KunTab vertical orientation now defaults to left-aligned content
The
aligndefault is now orientation-aware. A vertical tab list reads as a
nav column, where left-aligned labels are the convention, so vertical tabs now
default toalign="start". Horizontal tabs keep the classic centered look.
An explicitalignprop still overrides either orientation — pass
align="center"to restore the previous centered vertical tabs.- @kungal/ui-core@2.15.1
v2.15.0
Minor Changes
-
19e041c: feat(vue): KunTab
#tabslot for custom tab content (badges, dots)KunTab is now generic over the item shape and exposes a
#tabscoped slot
({ item, index, active }) so you can render custom per-tab content — e.g.
compose aKunBadgefor an unread count or an "unsaved" dot — instead of being
limited to icon + label. Extra fields on the item (acount, adirtyflag, …)
are typed inside the slot. The sliding indicator measures the button, so
badge-widened tabs are tracked automatically. Defaults to icon + label
(backward-compatible).
Patch Changes
- @kungal/ui-core@2.15.0
v2.14.1
Patch Changes
-
27790a5: feat(vue): KunPagination animates the active page (sliding pill + "highlight leads")
The active page is now a single primary pill that slides between numbers (like
KunTab's indicator) with a small elastic pop, instead of the highlight jumping.
For mid-range pages — where the active number stays centered in the ellipsis
window so the pill can't slide — the highlight leads: it first covers the
adjacent number, then the number row scrolls (FLIP) to recenter and the pill
rides back with it. Honorsprefers-reduced-motion; falls back to a solid pill
before hydration. No API change.- @kungal/ui-core@2.14.1
v2.14.0
Minor Changes
-
b4b1460: feat(vue): add KunCommandPalette (⌘K command palette / spotlight)
The generic ⌘K palette SHELL — trigger + global shortcut, teleported dialog,
autofocus, body scroll-lock, keyboard nav (↑↓ / Home / End / Enter / Esc),
grouped results, safe match highlighting, and full a11y (dialog + combobox +
listbox + aria-activedescendant) — with NO search logic baked in. You compute
items(flat or grouped) from thequeryit exposes viav-model:query(your
own scoring / index / async fetch) and it renders + navigates them; selecting
emits@select. Generic over the item shape, with#trigger/#item/
#empty/#no-result/#footerslots, aloadingstate, and a configurable
shortcut. The docs site's ⌘K search is now a thin consumer of it.
Patch Changes
- @kungal/ui-core@2.14.0
v2.13.1
Patch Changes
-
978cf03: fix(vue): KunMessage no longer leaks toasts across SSR requests
The toast store is module-scope, so on the server it's a single array shared by
every SSR request and never cleared there (the dismiss timer is client-only). A
server-sideuseKunMessage()— e.g. from a data-fetch error handler that runs
during SSR — therefore piled up (deduped into a growingcount), baked into
every page's SSR HTML, and vanished on hydration (empty client store →
hydration mismatch). Two guards, both making toasts the client-only ephemeral UI
they are:useKunMessage()is a no-op on the server (the store is never mutated
there), andKunMessageProviderrenders nothing until mounted.- @kungal/ui-core@2.13.1
v2.13.0
Minor Changes
-
6eadb74: feat(vue): KunPopover gains a
fullWidthpropThe trigger was wrapped in two hardcoded
inline-blockdivs, so a consumer could
never make the anchor span its container — external classes only reached the outer
wrapper, not the innertriggerRef.<KunPopover full-width>now switches both
wrappers toblock w-full, so a full-width trigger (e.g. afullWidthKunButton
or a split button) fills the width. Defaultfalse(inline, content-width) —
unchanged.
Patch Changes
- @kungal/ui-core@2.13.0
v2.12.2
Patch Changes
-
7a99394: fix(vue): KunDropdown / KunContextMenu item labels align left, not center
Menu items are native
<button>s, which default totext-align: center; the
flex-1label span inherited that, so short labels sat centered. Both item rows
now carrytext-leftso the label starts at the left edge (icon → label), the
expected menu-item layout.- @kungal/ui-core@2.12.2
v2.12.1
Patch Changes
-
f5c867b: fix(vue): KunMessage no longer jumps wider for a frame when dismissed
The leaving toast went
position: absolute; width: 100%, but the%resolved
against the outerfixedcontainer's padding box — 2rem wider than the in-flow
content width — so the toast visibly widened and spilled out the right edge for a
frame before fading. TheTransitionGroupwrapper is now the containing block
(position: relative), sowidth: 100%matches the in-flow width exactly. -
f5c867b: fix(vue): KunMessage toasts use semantic-colored border + count badge
Each toast's outline is now its own semantic colour (
ring-{color}/50) instead of
a uniform neutral grey ring, and the de-dup count badge uses a matching
bg-{color}/10tint instead of the neutralbg-black/10. Each type now reads as
one cohesive coloured surface in both light and dark.- @kungal/ui-core@2.12.1