Releases
Every published version of @human-kit/ui, newest first — generated from the
changelog.
1.0.0-beta.7
- #87
Add the CheckboxGroup primitive with
Root,ItemandIndicator: one array value for a set of checkboxes, a sharednamefor form submission, group-wide disabled, read-only and required state,allSelectedandsomeSelectedfor a parent select-all checkbox, SSR-safe default selection, documentation, and demo coverage.CheckboxGroup.ItemandCheckboxGroup.IndicatorareCheckbox.RootandCheckbox.Indicatorunder the namespace of the group, so every group in the library reads the same way; a checkbox still works on its own under its own name. - #94
Add
CheckboxGroup.LabelandRadioGroup.Label. The part names its group: it registers its id with the root, which gives it to the group element asaria-labelledby. Two labels read as one name, in the order they appear, and anaria-labelledbythat the caller gives stands. It renders a<span>and not a<label>, because a<label>names one control and cannot name a set. This also corrects the API reference ofRadioGroup.Item, which listed the props ofRadioGroup.Root. - #89
Add the RadioGroup primitive with
Root,ItemandIndicator: one value for a set of radio buttons, a sharednamefor form submission, group-wide disabled, read-only and required state, and the keyboard the WAI-ARIA APG asks for — a single tab stop on the checked button, and arrow keys that move the focus and the selection together, with wrapping. Includes documentation and demo coverage. - #90
Add
ToggleGroup.Item, which isToggle.Rootunder the namespace of the group. Every group in the library now reads the same way —Group.RootwithGroup.Iteminside — andToggle.Rootkeeps working on its own and inside a group, so nothing that is already written changes.The props of
Toggle.Rootalso move fromapi.jsoninto JSDoc, so the reference of the toggle and the reference of the group both read them from one place.
- #86
Let the pointer take the virtual focus in
Autocomplete, the same as inComboBox.The keys moved the virtual focus and the pointer only marked
data-hovered, so the row the keys left behind and the row under the pointer were both current at the same time. A style bound todata-focusedand one bound todata-hoveredthen painted two rows, and an item cannot correct that on its own: it sees only its own attributes.Autocomplete.Itemnow moves the focus to the option the pointer enters, and clears the keyboard ring, so exactly one option is current. - #88
Bring the focus ring back when a key press follows a pointer press.
Button,Checkbox,SwitchandToggleread the interaction modality only when they take focus, so the ring stayed off for the rest of that focus, while the browser had already flipped:focus-visibleback on. They now follow the modality for as long as they hold focus, which is what React Aria and Base UI do. - #93
Bring the focus ring back on
RadioGroup.Item,TableandCalendar.BodyCellwhen a key press follows a pointer press. These read the interaction modality only when they take focus, thus the ring stayed off for the rest of that focus. They now follow the modality for as long as they hold focus, the same asButton,Checkbox,SwitchandToggle.Tablekeeps one focus-visible value for every part, thus the watch is on the table and it serves the cell, the row and the header cell together. - #87
Rewrite the
TimePicker.Inputnamedescription in ASD-STE100, so the generated API reference passes the documentation style check.
1.0.0-beta.6
- #78
TimePicker.Inputacceptsidandname, matchingDatePicker.Input.Either one renders a visually hidden, focusable proxy input that carries them, so a
<label for>reaches the segments and a native form submit reads the committed value. The segment group keeps an id of its own (${id}-group). Anaria-invalidpassed by the consumer is now combined with the invalid segment draft instead of being dropped.
- #83
Fix the focus return of
Dialogwhen the panel has an exit animation.The animation keeps the content mounted after the close. The
inertattribute that hides the page from the open dialog is thus still on the trigger, andfocus()on an inert element does nothing. The focus stayed on the<body>, which sent the keyboard user back to the top of the page.Dialognow tries again after the update, in the same way asDrawer. - #83
Fix the wheel inside a modal popover, and let the browser zoom again.
Popover.Contentputs two actions on one element:scrollLockwhile it is modal, andallowScrollWithinwhile it is not. The disabled action removed the registration that the enabled one had just made. The panel thus held the scroll lock with no live scroll region of its own, and every wheel event inside it was cancelled. TheTimePickerwheels did not turn, and no list in a modal popover could scroll. The registry now counts the registrations, so an action releases only what it took.A wheel with the
Ctrlkey also goes through now. That gesture is the browser zoom, not a scroll, and cancelling it took page zoom away from the user for as long as an overlay was open. - #82
Rewrite every prop description in ASD-STE100 (Simplified Technical English), the writing standard the rest of the documentation now follows. The text ships in the
.d.tsfiles, so it is what an editor shows on hover — the wording changes, the API does not. No prop, type, default or behaviour was touched.
1.0.0-beta.5
- #79
Breaking: remove
ToggleGroup.Root'scontrolledValueprop, and stop the group from reporting a selection change while it is unmounting.valueis the source of truth whenever it is supplied, withbind:valueor without — there is no longer a flag to declare which.onChangealways fires on a real interaction, and the write-back still reaches a binding.- A parent that owns
valueand rejects a change still sees the group move; the suppliedvaluetakes the selection back on the parent's next render. - Unmounting the whole group no longer fires
onChange. Previously the selected toggle unregistered during teardown,disallowEmptySelectionpicked a fallback, and the consumer heard a press the user never made — enough to navigate a URL-backed group straight back to the screen being left. Removing a singleToggle.Rootfrom a group that stays mounted still falls back and reports.
Migration: delete
controlledValue.value+onChangewithout a binding already is the controlled case.
1.0.0-beta.4
- #73
Add
Menu.ContextTrigger, a surface that opens the menu on right click, on long press for touch and pen, and withShift+F10or theContextMenukey. Everything below the trigger — items, groups, submenus, keyboard navigation — is unchanged, so a context menu is the same menu with a different opener.The panel is anchored at the pointer (and
Menu.Contentdrops its defaultoffsetto0for a context menu), or to the surface itself when opened from the keyboard, where no pointer position exists.Two new primitives back it and are exported for reuse:
createPointAnchor, which lets any floating panel anchor to a viewport point instead of an element, and thelongPressaction. - #74
TransferListgains filtering, ordering, form submission and a keyboard shortcut:filterper side. A predicate decides what each list shows; the input driving it stays yours. With a filter applied, "move all" means the rows on screen rather than the whole side — moving items the user cannot see would be invisible work.TransferList.MoveUp/MoveDown. They shift the right-hand selection one position withinvalue, keeping a contiguous block together and disabling at the ends instead of doing nothing quietly. Reordering exists only on the right, where the order is state the user is building.nameon the Root renders one hidden input per key, in order, sovaluesubmits with a form without any wiring.Ctrl/Cmd+Entersends the focused list's selection to the other one. Each list has exactly one destination, so the shortcut carries no direction and stays correct in a mirrored layout; each list advertises it witharia-keyshortcuts, andmoveShortcut={false}turns it off.
onChangedetails now carry atypeof'move'or'reorder', plus thedirectionof a reorder, and reorders are announced too — otherwise they are completely silent, since the rows are all still there and only their order changed.Two accessibility fixes came out of auditing it. The Root renders
role="group"once it has anaria-labeloraria-labelledby, so the two lists and the buttons reach assistive technology as one control rather than unrelated ones. And a virtualizedListBoxnow carriesaria-setsizeandaria-posinseton its rows: only a window of options exists in the DOM, so a screen reader was announcing the size of the window — "1 of 8" for a list of two thousand.ListBoxalso gainsgetItemKey, which lets a Shift range be measured over the whole collection rather than over the options in the DOM: withvirtualizer, a range now spans rows that were never rendered, and the anchor survives scrolling away. It composesonkeydown,onmousedown,onfocusin,onfocusoutandonscrollwith its own handlers instead of letting a consumer's replace them. - #74
Add
TransferList: two selectable lists with buttons that move items between them. There is one source of truth —itemsis the whole collection andvalueis the ordered list of keys on the right — sovalueis exactly what a form submits, and the right-hand list keeps the order things were moved in.Both sides are
ListBoxes, so selection, arrow-key navigation, typeahead and virtualization come from there unchanged. Double click moves a row;Enterdeliberately does not, because in a multi-select listbox it toggles selection. Focus is placed explicitly after every move rather than left to fall on the<body>, andTransferList.Statusannounces what moved.ListBoxgains range selection inselectionMode="multiple": Shift+click, Shift+Arrow and Shift+Home/End select a range from an anchor, and Ctrl/Cmd+click toggles a single option even underselectionBehavior="replace". It also acceptsaria-labelledby, and now forwards unknown props to its element like every other component.
- #75
Fix non-modal popovers refusing to scroll when opened from inside a modal. A
ComboBoxlistbox, aSelectmenu or anyPopover.Contentwithmodal={false}is portalled to the body, so it sits outside the dialog that holds the scroll lock — and that lock cancels wheel and touch events everywhere but its own node. The list rendered with a scrollbar that would not move.Non-modal popover content now registers itself as a live scroll region for as long as it is open, through a new
allowScrollWithinaction. It never takes the lock, so it cannot keep the page frozen on its own.
1.0.0-beta.3
- #67
Add
keyboardNavigationtoTable.Root('grid' | 'row' | 'none', defaulting to'grid'), which decides how far the roving tab stop reaches into the body.Cell navigation is not free: every body cell registers itself with the focus registry and derives its own focus state, and a virtualized table pays that again for every row it mounts while scrolling.
'row'keeps the body keyboard-reachable at one focus target per row — arrows walk rows,Enterpresses one,Spacetoggles its selection — and'none'leaves the body inert. In both, focusable content inside a body cell (Table.Checkbox, links) becomes a regular tab stop, since no roving focus reaches it any more.The header keeps its own cell navigation in every mode, so sorting and column resizing stay reachable.
- #67
Keep
left/right-placed floating panels on screen when they fit on neither side.shift's main axis is the one running along the placement edge, and its cross axis is off by default. Fortop/bottomplacements that main axis is horizontal, so a dropdown too wide for the viewport is pulled back into view. Forleft/rightit is vertical — nothing pulled the panel back horizontally, so one that fit on neither side stayed wherever the placement left it.Submenus are exactly that case: they open
right-startand flip toleft-start, and on a phone neither side has room, which put the panel off the edge of the screen entirely. The cross axis is now enabled for the horizontal placements only — ontop/bottomit is vertical, where shifting would slide a dropdown over its own trigger andflipalready does better — withlimitShiftso a panel never slides far enough to detach from its anchor.
1.0.0-beta.2
- #64
Export the table cell context,
TableRowItemandTableRowFocusEdgefrom@human-kit/ui/table.useTableCellContext(and itsget/setpair, plus theTableCellContexttype) were defined alongside the table, row and column contexts but left out of the subpath's barrel. Every other level of the grid was reachable; the cell was the one that forced consumers to deep-importtable/root/context.svelte.js, a path outside the package'sexportsmap — so it typechecked only against the source, never against the published package.Two type-level gaps of the same kind are closed with it.
TableRowItemis the constraint on the already-exportedTableBodyProps<T extends TableRowItem>, andTableRowFocusEdgeis the second parameter offocusRowByTokenandsetFocusedRowon the already-exportedTableContext. Both were unnameable from outside the package, which made the surfaces that use them impossible to annotate or wrap.
1.0.0-beta.1
- #61
Add
Drawer, an edge-anchored panel dismissed by swiping it away.- Compose
Drawer.Root,Drawer.Trigger,Drawer.Portal,Drawer.OverlayandDrawer.Content, plusDrawer.Body(the scrolling region),Drawer.Title,Drawer.DescriptionandDrawer.Close.Drawer.Viewportis an optional positioning layer; without it the panel pins itself to its edge. sideanchors the panel to any of the four edges.modalacceptstrue,'trap-focus'(keyboard captured, page still scrollable) orfalse. Drawers register in the same layer stack asDialog, so Escape and outside presses only ever dismiss the topmost layer and z-indexes interleave correctly.- Swipe-to-dismiss with velocity-aware release and deference to any scrollable region between the finger and the panel — a sheet with a scrolling body no longer drags itself off screen when you try to scroll it. The panel publishes
--drawer-swipe-movement-x/y,--drawer-swipe-progressand--drawer-swipe-strength; appearance stays with the consumer's CSS. --drawer-swipe-progressmeasures progress toward dismissal, staying at0for the whole trip between snap points. A backdrop tied to raw movement brightened the page while a sheet travelled from one snap point to another and snapped dark again on release, for a drawer that never left.- Pulling a drawer further open than it can go stretches it against heavy resistance, capped at 40px and published as
--drawer-overdrag. The strip of page the panel moves off is covered in the panel's own background, so the drawer never looks like it is coming apart from its edge. - Only the drawer at the back of the stack paints a backdrop. Each root brings its own overlay, so stacking two dimmed the page twice — darkening the drawer underneath along with everything else. The ones above get
data-nestedon their overlay and stand down. data-starting-stylemarks the first painted frame after the panel mounts, giving a CSS transition a value to animate from. Without it a drawer built ontransitionhas an exit animation and no entrance.snapPoints/snapPoint/defaultSnapPoint/onSnapPointChange/snapToSequentialPoints, resolved from fractions, pixels or CSS lengths, with releases settling on the point the flick was heading for. Exposed through--drawer-snap-point-offsetanddata-expanded.- Nested drawers expose
data-nested-drawer-open,data-nested-drawer-swiping,--nested-drawersand--drawer-frontmost-height;Drawer.IndentandDrawer.IndentBackgroundlet the app behind pull back with the gesture. Drawer.SwipeAreaopens the drawer from a viewport edge with the panel following the finger, andDrawer.VirtualKeyboardProviderpublishes--drawer-keyboard-insetso a bottom sheet's footer clears the software keyboard.createDrawerHandle()drives a drawer from triggers anywhere in the tree, passing apayloadto the root'schildrensnippet and returning focus to the trigger that actually opened it.
Add
Dialog.Title,Dialog.DescriptionandDialog.Close.Dialog.TitleandDialog.Descriptionregister their ids and wirearia-labelledby/aria-describedbyonDialog.Content. Arole="dialog"takes its name fromaria-labelledby, never from the text inside it, so a dialog built with a bare heading had no accessible name. The new parts are additive — existing dialogs are unchanged.Move the layer z-index math from
dialog/root/dialog-stack.tsintoprimitives/layer-stack.ts, soMenuandPopoverno longer import fromDialogto place themselves. The public helpers keep their names and values. - Compose
1.0.0-beta.0
Promote the library to its first public beta, exiting the alpha prerelease line.
1.0.0-alpha.22
- #55
Add the new
Toggleprimitive with a singleRootpart.- support controlled and uncontrolled selected state with
selected,defaultSelected, andonChange - expose native button semantics with
aria-pressed, disabled behavior, and keyboard activation - add styling hooks for selected, unselected, pressed, hover, focus, and focus-visible states
- expose the
./togglepackage entry and add docs/demo coverage
- support controlled and uncontrolled selected state with
- #55
Add a
filterprop toComboBox.Rootso consumers can customize local option filtering or passnullto disable it for externally filtered lists. - #55
Add the new
Tabsprimitive withRoot,List,Tab,Indicator, andPanelparts.- support controlled and uncontrolled selection, including
nullvalues - add automatic and manual keyboard activation with horizontal and vertical roving focus
- include accessible tab and tabpanel wiring, SSR-ready default selection, disabled tabs, and indicator positioning hooks
- expose the
./tabspackage entry and add docs/demo coverage
- support controlled and uncontrolled selection, including
- #55
Add an
autofocusprop toInputthat reliably focuses the element on mount.Native
autofocusonly focuses the first autofocus element inserted per document, so it silently fails for inputs that mount inside an already-open popover/dialog or that remount as a view swaps. The prop focuses the underlying input on mount instead, so it works every time the input appears. - #55
Add
Menu, an accessible dropdown / action menu following the WAI-ARIA menu button pattern.- Compose
Menu.Root,Menu.Trigger, andMenu.Content(portal + floating +role="menu"panel), built on the same positioning/presence primitives asPopover. Menu.ItemwithonSelect,disabled,closeOnSelect, andtextValue; arrow-key navigation, typeahead, Home/End, and hover highlighting via roving focus.Menu.Separator, plusMenu.Group+Menu.GroupLabelwitharia-labelledbywiring.Menu.SubmenuRoot+Menu.SubmenuTriggerfor nested submenus, with a layer stack so only the topmost menu handles Escape / outside-press,ArrowRight/ArrowLeftopen/close, and sibling submenus collapse on hover.Menu.Rootexposesopen/defaultOpen/onOpenChange(with cancelabledetails),loop,typeahead, andcloseOnSelect. Escape and selection return focus to the trigger; Tab and outside interaction close the whole chain.
- Compose
- #55
Add the ToggleGroup primitive with single and multiple selection, roving focus, disabled reconciliation, SSR-safe default selection, documentation, and demo coverage.
- #55
Add short helper types to the public
tablemodule for column-driven wrappers and consumer-defined table abstractions.- export
RowData,Row,ColumnDef,CellContext,CellProps, andCellRenderer - keep these helpers generic so consumers can build any wrapper shape on top of the existing table primitives
- export
- #55
Add a new headless
Treecomponent with hierarchical keyboard navigation, controlled and uncontrolled expansion state, configurable selection propagation, section headers, and docs/demo coverage.
- #55
Bias
Table.Bodyvirtualization overscan toward the current scroll direction when no explicitoverscandistribution is provided, reducing the chance of visible blanking ahead of the viewport during fast scrolling. - #55
Summary
Add the composable
NumberFieldcomponent with locale-aware formatting, spinbutton semantics, steppers, wheel scrubbing, and pointer scrubbing. - #55
Fix nested popovers dismissing together: add a popover layer stack so only the topmost open popover handles Escape, outside-press, outside-scroll, and focus-out. Closing a nested popover (e.g. a date picker calendar inside a filter popover) no longer closes its ancestors.
- #53
Table Body typing and overscan
Improve
Table.Bodyitem-driven typings and virtualization defaults.- Infer the
children(item)snippet parameter from theitemselement type in item-driven mode. - Make body virtualization derive
overscanautomatically from the current viewport row count when it is not provided.
- Infer the
- #55
Summary
Add the headless
TextAreaprimitive with native textarea semantics, shared focus state attributes, RAC-style state props, and opt-in auto-resize.
1.0.0-alpha.21
- #53
Table Body typing and overscan
Improve
Table.Bodyitem-driven typings and virtualization defaults.- Infer the
children(item)snippet parameter from theitemselement type in item-driven mode. - Increase the default body virtualization
overscanfrom6to18rows when it is not provided.
- Infer the
1.0.0-alpha.20
- #51
Replace implicit table header sorting with an explicit
Table.SortTriggerpart.Table.Columnno longer acceptsallowsSorting; columns become sortable by composingTable.SortTriggerinsideTable.ColumnHeaderCell.This change prevents nested header actions like filter popovers from triggering sort through click bubbling and lets sortable headers take DOM focus directly through the trigger while keeping the table grid navigation contract.
1.0.0-alpha.19
- #49
Fix
Tableminimum width calculations so relative and resizable columns preserve measured minimum widths more reliably during layout and resize updates.
1.0.0-alpha.18
- #46
Fix
Tablecolumn sizing and ordering edge cases by keeping trailing flexible columns in sync during resize recovery, recomputing relative widths after viewport or container size changes, avoiding one-pixel width loss from relative-column rounding, and updating body cell column indices correctly when keyed columns reorder.
1.0.0-alpha.17
- #43
RAC-style Table Widths
Add
%andfrsupport to table width state, and preserve a flexible trailing column during resize so RAC-style resizable tables can keep filling the available width. - #43
Width Contract
Treat
Table.Column.widthas a fixed width that disables user resizing, while keepingdefaultWidthas the uncontrolled resizable initial width.
1.0.0-alpha.16
- #41
Fix table accessibility helper nodes so the sort live region and selection-unavailable description stay visually hidden without contributing to page overflow.
1.0.0-alpha.15
- #39
Summary
Clean up the Table contract by removing the legacy
Table.Column.allowsResizingprop, exporting explicit public prop types forTable.Root,Table.Column,Table.ColumnHeaderCell, andTable.ColumnResizer, and documenting the intended composition model separately from internal normalized column metadata.
1.0.0-alpha.14
- #37
Add table row actions and selection-only disabled behavior.
- add
onRowActiontoTable.Rootwith RAC-style interaction rules acrossselectionModeandselectionBehavior - add
disabledBehavior="selection" | "all"to split selection disabling from fully disabled rows - expose actionable and selection-disabled row/cell state through data attributes for styling
- document and demo manual testing flows for toggle-mode actions, replace-mode double click actions, and disabled row behavior
- add
1.0.0-alpha.13
- #35
Fix ComboBox and ListBox interaction regressions around input behavior, focus handling, and virtual focus scrolling.
This disables native browser autocomplete on ComboBox inputs, prevents the reused ListBox root from stealing DOM focus, avoids filtering flashes during popover close animations, and keeps hover-driven virtual focus from auto-scrolling overflowed option lists.
1.0.0-alpha.12
- #33
Fix ListBox and ComboBox interaction state issues so keyboard focus, hover, and virtual focus stay in sync.
This includes clearing item
data-focus-visibleon pointer hover, tightening ListBox focus ownership, skipping disabled ComboBox options during keyboard navigation, and continuing keyboard navigation from the clicked option in multiselect flows.
1.0.0-alpha.11
- #31
Add follow-up ComboBox and Popover improvements after the previous prerelease changeset was already consumed.
- Forward
Popover.Contentconfiguration props throughComboBox.Popover, including positioning options likeoffset,placement,shouldFlip,shouldCloseOnEscape, andshouldCloseOnBlur. - Ensure
ComboBoxvirtual focus marks the activeListBox.Itemwithdata-focus-visibleduring keyboard navigation. - Keep the interactive ComboBox docs aligned with the shared popover positioning behavior.
- Forward
1.0.0-alpha.10
- #28
Add new ComboBox trigger and clear parts, plus pending and scroll improvements.
- Add
ComboBox.Triggeras the primary trigger part while keepingComboBox.Buttonas a compatibility alias. - Add
ComboBox.Clearto reset the input and clear the current selection without stealing focus. - Reflect
isPendingon trigger and clear affordances while keeping the root as the main async state source. - Clear the selected value when a single-select combobox input is fully emptied.
- Allow wheel events to stay inside the combobox when a descendant scroll container can continue scrolling.
- Prevent page scroll when neither the popover nor a descendant scroll container can scroll further.
- Add docs coverage for pending state and the pattern where overflow is applied to
ComboBox.Listinstead ofComboBox.Popover.
- Add
1.0.0-alpha.9
- #25
Summary
Make
ComboBox.Inputrender through the sharedInputprimitive while preserving existing combobox behavior and accessibility semantics.
1.0.0-alpha.8
- #22
Summary
Upgrade
Inputto a focus-aware native input primitive with RAC-style disabled, read-only, invalid, and required state props.
1.0.0-alpha.7
- #20
Summary
Add a new headless
Buttoncomponent with modality-aware focus state, pressed and hovered data attributes, and RAC-style pending semantics.
1.0.0-alpha.6
- #18
Fix published package entrypoints so generated ESM files no longer import sibling TypeScript source paths.
1.0.0-alpha.5
- #16
Add
Table.CheckboxandTable.CheckboxIndicatorfor explicit row selection controls in body cells and select-all behavior in header cells, including keyboard navigation integration with the table grid.Add
hiddenColumns(bindable) anddefaultHiddenColumnsprops toTable.Rootfor controlled and uncontrolled column visibility. Hidden columns are excluded from grid navigation, visible column counts (aria-colcount), and resize interactions while preserving their registered widths.Add
aria-colindexto header and body cells for accurate screen reader column position announcements. - #16
Table Column Resizing
Add column resizing support to
Table.- add
Table.ColumnResizeras a public part - add column width and resize APIs to
Table.RootandTable.Column - render managed column widths through
colgroup - document and demo resizable table columns
- add
- #16
Add a new
Tablecomponent with composable parts, grid-style keyboard navigation, row selection, sorting support, docs, and tests. - #16
Add a new headless Checkbox component with Root and Indicator parts.
- Add tri-state checkbox behavior with checked and indeterminate bindings.
- Sync a hidden native input for form submission and label targeting.
- Export Checkbox from the root library entrypoint and package subpath exports.
- Add baseline docs and browser tests for checkbox interaction.
- #16
Update
Table.ColumnResizerkeyboard interaction to use an explicit Enter-to-resize mode.- Focused resize handles now enter keyboard resize mode with
Enterand exit withEnter. Escapecancels keyboard resizing, restores the starting width, and returns focus to the header cell.- Update table docs, demo styling, and tests to reflect the new focus and resize flow.
- Focused resize handles now enter keyboard resize mode with
- #16
Fix table column resizing so keyboard interactions use the same resize lifecycle as pointer input, add Pointer Events support for touch and pen resizing, announce committed width changes to screen readers, respect RTL keyboard controls, support cancelling pointer drags with Escape, and reduce resize overhead with cached column lookups plus animation-frame batched drag updates. Also make table cell and header column indices react correctly when keyed column order changes and replace module-level table instance counters with per-root token generation to avoid shared SSR and test state.
1.0.0-alpha.4
- #13
Refactor TimePicker panel to Apple-like wheel architecture.
- Replace
TimePicker.Column/TimePicker.ColumnCellwithTimePicker.WheelColumn/TimePicker.WheelItem. - Migrate panel semantics from
listbox/optiontospinbuttonper wheel column. - Remove
shouldCloseOnSelectandcloseOnSelectfromTimePicker.Root; wheel selection now commits on snap without auto-close. - Replace root context column APIs with wheel APIs:
getWheelOptions,getSelectedWheelValue,selectWheelValue. - Update docs and tests for wheel interaction and focus behavior.
- Replace
1.0.0-alpha.3
- #11
Standardize focus-visible modality behavior across overlay flows.
- Remove DatePicker local interaction modality state and rely on shared input-modality primitive.
- Restore DatePicker trigger focus via
focusWithModalityfor consistent pointer/keyboard semantics. - Unify close-modality resolution between Popover and Dialog through shared primitive helper.
- Align DatePicker input modality handling with shared focus-visible contract.
- Expand input-modality tests and document primitive usage in the focus-state contract.
1.0.0-alpha.2
- #6
Add the new Calendar component as a public feature release.
- introduce single and range selection modes
- add keyboard navigation and accessibility improvements
- include docs/demo integration and supporting tests
1.0.0-alpha.1
- #1
Initial release of @human-kit/ui
- ComboBox (single & multi-select with tags, virtual focus, filtering)
- Dialog (modal with portal, overlay, nested dialogs, focus trap)
- ListBox (keyboard navigation, single selection)
- Popover (floating UI positioning, click outside, trigger)
- Input, Label, Portal primitives
- Utility primitives (aria-hide-outside, scroll-lock, focus-trap, keyboard-navigation)