Releases

Every published version of @human-kit/ui, newest first — generated from the changelog.

  1. 1.0.0-beta.7

    • Add the CheckboxGroup primitive with Root, Item and Indicator: one array value for a set of checkboxes, a shared name for form submission, group-wide disabled, read-only and required state, allSelected and someSelected for a parent select-all checkbox, SSR-safe default selection, documentation, and demo coverage. CheckboxGroup.Item and CheckboxGroup.Indicator are Checkbox.Root and Checkbox.Indicator under 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.

      #87
    • Add CheckboxGroup.Label and RadioGroup.Label. The part names its group: it registers its id with the root, which gives it to the group element as aria-labelledby. Two labels read as one name, in the order they appear, and an aria-labelledby that 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 of RadioGroup.Item, which listed the props of RadioGroup.Root.

      #94
    • Add the RadioGroup primitive with Root, Item and Indicator: one value for a set of radio buttons, a shared name for 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.

      #89
    • Add ToggleGroup.Item, which is Toggle.Root under the namespace of the group. Every group in the library now reads the same way — Group.Root with Group.Item inside — and Toggle.Root keeps working on its own and inside a group, so nothing that is already written changes.

      The props of Toggle.Root also move from api.json into JSDoc, so the reference of the toggle and the reference of the group both read them from one place.

      #90
    • Let the pointer take the virtual focus in Autocomplete, the same as in ComboBox.

      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 to data-focused and one bound to data-hovered then painted two rows, and an item cannot correct that on its own: it sees only its own attributes. Autocomplete.Item now moves the focus to the option the pointer enters, and clears the keyboard ring, so exactly one option is current.

      #86
    • Bring the focus ring back when a key press follows a pointer press. Button, Checkbox, Switch and Toggle read 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-visible back on. They now follow the modality for as long as they hold focus, which is what React Aria and Base UI do.

      #88
    • Bring the focus ring back on RadioGroup.Item, Table and Calendar.BodyCell when 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 as Button, Checkbox, Switch and Toggle. Table keeps 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.

      #93
    • Rewrite the TimePicker.Input name description in ASD-STE100, so the generated API reference passes the documentation style check.

      #87
  2. 1.0.0-beta.6

    • TimePicker.Input accepts id and name, matching DatePicker.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). An aria-invalid passed by the consumer is now combined with the invalid segment draft instead of being dropped.

      #78
    • Fix the focus return of Dialog when the panel has an exit animation.

      The animation keeps the content mounted after the close. The inert attribute that hides the page from the open dialog is thus still on the trigger, and focus() on an inert element does nothing. The focus stayed on the <body>, which sent the keyboard user back to the top of the page. Dialog now tries again after the update, in the same way as Drawer.

      #83
    • Fix the wheel inside a modal popover, and let the browser zoom again.

      Popover.Content puts two actions on one element: scrollLock while it is modal, and allowScrollWithin while 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. The TimePicker wheels 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 Ctrl key 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.

      #83
    • 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.ts files, so it is what an editor shows on hover — the wording changes, the API does not. No prop, type, default or behaviour was touched.

      #82
  3. 1.0.0-beta.5

    • Breaking: remove ToggleGroup.Root's controlledValue prop, and stop the group from reporting a selection change while it is unmounting.

      • value is the source of truth whenever it is supplied, with bind:value or without — there is no longer a flag to declare which. onChange always fires on a real interaction, and the write-back still reaches a binding.
      • A parent that owns value and rejects a change still sees the group move; the supplied value takes the selection back on the parent's next render.
      • Unmounting the whole group no longer fires onChange. Previously the selected toggle unregistered during teardown, disallowEmptySelection picked 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 single Toggle.Root from a group that stays mounted still falls back and reports.

      Migration: delete controlledValue. value + onChange without a binding already is the controlled case.

      #79
  4. 1.0.0-beta.4

    • Add Menu.ContextTrigger, a surface that opens the menu on right click, on long press for touch and pen, and with Shift+F10 or the ContextMenu key. 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.Content drops its default offset to 0 for 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 the longPress action.

      #73
    • TransferList gains filtering, ordering, form submission and a keyboard shortcut:

      • filter per 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 within value, 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.
      • name on the Root renders one hidden input per key, in order, so value submits with a form without any wiring.
      • Ctrl/Cmd+Enter sends 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 with aria-keyshortcuts, and moveShortcut={false} turns it off.

      onChange details now carry a type of 'move' or 'reorder', plus the direction of 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 an aria-label or aria-labelledby, so the two lists and the buttons reach assistive technology as one control rather than unrelated ones. And a virtualized ListBox now carries aria-setsize and aria-posinset on 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.

      ListBox also gains getItemKey, which lets a Shift range be measured over the whole collection rather than over the options in the DOM: with virtualizer, a range now spans rows that were never rendered, and the anchor survives scrolling away. It composes onkeydown, onmousedown, onfocusin, onfocusout and onscroll with 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 — items is the whole collection and value is the ordered list of keys on the right — so value is 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; Enter deliberately 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>, and TransferList.Status announces what moved.

      ListBox gains range selection in selectionMode="multiple": Shift+click, Shift+Arrow and Shift+Home/End select a range from an anchor, and Ctrl/Cmd+click toggles a single option even under selectionBehavior="replace". It also accepts aria-labelledby, and now forwards unknown props to its element like every other component.

      #74
    • Fix non-modal popovers refusing to scroll when opened from inside a modal. A ComboBox listbox, a Select menu or any Popover.Content with modal={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 allowScrollWithin action. It never takes the lock, so it cannot keep the page frozen on its own.

      #75
  5. 1.0.0-beta.3

    • Add keyboardNavigation to Table.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, Enter presses one, Space toggles 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. For top/bottom placements that main axis is horizontal, so a dropdown too wide for the viewport is pulled back into view. For left/right it 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-start and flip to left-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 — on top/bottom it is vertical, where shifting would slide a dropdown over its own trigger and flip already does better — with limitShift so a panel never slides far enough to detach from its anchor.

      #67
  6. 1.0.0-beta.2

    • Export the table cell context, TableRowItem and TableRowFocusEdge from @human-kit/ui/table.

      useTableCellContext (and its get/set pair, plus the TableCellContext type) 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-import table/root/context.svelte.js, a path outside the package's exports map — so it typechecked only against the source, never against the published package.

      Two type-level gaps of the same kind are closed with it. TableRowItem is the constraint on the already-exported TableBodyProps<T extends TableRowItem>, and TableRowFocusEdge is the second parameter of focusRowByToken and setFocusedRow on the already-exported TableContext. Both were unnameable from outside the package, which made the surfaces that use them impossible to annotate or wrap.

      #64
  7. 1.0.0-beta.1

    • Add Drawer, an edge-anchored panel dismissed by swiping it away.

      • Compose Drawer.Root, Drawer.Trigger, Drawer.Portal, Drawer.Overlay and Drawer.Content, plus Drawer.Body (the scrolling region), Drawer.Title, Drawer.Description and Drawer.Close. Drawer.Viewport is an optional positioning layer; without it the panel pins itself to its edge.
      • side anchors the panel to any of the four edges. modal accepts true, 'trap-focus' (keyboard captured, page still scrollable) or false. Drawers register in the same layer stack as Dialog, 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-progress and --drawer-swipe-strength; appearance stays with the consumer's CSS.
      • --drawer-swipe-progress measures progress toward dismissal, staying at 0 for 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-nested on their overlay and stand down.
      • data-starting-style marks the first painted frame after the panel mounts, giving a CSS transition a value to animate from. Without it a drawer built on transition has 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-offset and data-expanded.
      • Nested drawers expose data-nested-drawer-open, data-nested-drawer-swiping, --nested-drawers and --drawer-frontmost-height; Drawer.Indent and Drawer.IndentBackground let the app behind pull back with the gesture.
      • Drawer.SwipeArea opens the drawer from a viewport edge with the panel following the finger, and Drawer.VirtualKeyboardProvider publishes --drawer-keyboard-inset so a bottom sheet's footer clears the software keyboard.
      • createDrawerHandle() drives a drawer from triggers anywhere in the tree, passing a payload to the root's children snippet and returning focus to the trigger that actually opened it.

      Add Dialog.Title, Dialog.Description and Dialog.Close.

      Dialog.Title and Dialog.Description register their ids and wire aria-labelledby / aria-describedby on Dialog.Content. A role="dialog" takes its name from aria-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.ts into primitives/layer-stack.ts, so Menu and Popover no longer import from Dialog to place themselves. The public helpers keep their names and values.

      #61
  8. 1.0.0-beta.0

    • Promote the library to its first public beta, exiting the alpha prerelease line.

  9. 1.0.0-alpha.22

    • Add the new Toggle primitive with a single Root part.

      • support controlled and uncontrolled selected state with selected, defaultSelected, and onChange
      • 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 ./toggle package entry and add docs/demo coverage
      #55
    • Add a filter prop to ComboBox.Root so consumers can customize local option filtering or pass null to disable it for externally filtered lists.

      #55
    • Add the new Tabs primitive with Root, List, Tab, Indicator, and Panel parts.

      • support controlled and uncontrolled selection, including null values
      • 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 ./tabs package entry and add docs/demo coverage
      #55
    • Add an autofocus prop to Input that reliably focuses the element on mount.

      Native autofocus only 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, and Menu.Content (portal + floating + role="menu" panel), built on the same positioning/presence primitives as Popover.
      • Menu.Item with onSelect, disabled, closeOnSelect, and textValue; arrow-key navigation, typeahead, Home/End, and hover highlighting via roving focus.
      • Menu.Separator, plus Menu.Group + Menu.GroupLabel with aria-labelledby wiring.
      • Menu.SubmenuRoot + Menu.SubmenuTrigger for nested submenus, with a layer stack so only the topmost menu handles Escape / outside-press, ArrowRight/ArrowLeft open/close, and sibling submenus collapse on hover.
      • Menu.Root exposes open/defaultOpen/onOpenChange (with cancelable details), loop, typeahead, and closeOnSelect. Escape and selection return focus to the trigger; Tab and outside interaction close the whole chain.
      #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 table module for column-driven wrappers and consumer-defined table abstractions.

      • export RowData, Row, ColumnDef, CellContext, CellProps, and CellRenderer
      • keep these helpers generic so consumers can build any wrapper shape on top of the existing table primitives
      #55
    • Add a new headless Tree component with hierarchical keyboard navigation, controlled and uncontrolled expansion state, configurable selection propagation, section headers, and docs/demo coverage.

      #55
    • Bias Table.Body virtualization overscan toward the current scroll direction when no explicit overscan distribution is provided, reducing the chance of visible blanking ahead of the viewport during fast scrolling.

      #55
    • Summary

      Add the composable NumberField component 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.

      #55
    • Table Body typing and overscan

      Improve Table.Body item-driven typings and virtualization defaults.

      • Infer the children(item) snippet parameter from the items element type in item-driven mode.
      • Make body virtualization derive overscan automatically from the current viewport row count when it is not provided.
      #53
    • Summary

      Add the headless TextArea primitive with native textarea semantics, shared focus state attributes, RAC-style state props, and opt-in auto-resize.

      #55
  10. 1.0.0-alpha.21

    • Table Body typing and overscan

      Improve Table.Body item-driven typings and virtualization defaults.

      • Infer the children(item) snippet parameter from the items element type in item-driven mode.
      • Increase the default body virtualization overscan from 6 to 18 rows when it is not provided.
      #53
  11. 1.0.0-alpha.20

    • Replace implicit table header sorting with an explicit Table.SortTrigger part. Table.Column no longer accepts allowsSorting; columns become sortable by composing Table.SortTrigger inside Table.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.

      #51
  12. 1.0.0-alpha.19

    • Fix Table minimum width calculations so relative and resizable columns preserve measured minimum widths more reliably during layout and resize updates.

      #49
  13. 1.0.0-alpha.18

    • Fix Table column 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.

      #46
  14. 1.0.0-alpha.17

    • RAC-style Table Widths

      Add % and fr support 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.width as a fixed width that disables user resizing, while keeping defaultWidth as the uncontrolled resizable initial width.

      #43
  15. 1.0.0-alpha.16

    • Fix table accessibility helper nodes so the sort live region and selection-unavailable description stay visually hidden without contributing to page overflow.

      #41
  16. 1.0.0-alpha.15

    • Summary

      Clean up the Table contract by removing the legacy Table.Column.allowsResizing prop, exporting explicit public prop types for Table.Root, Table.Column, Table.ColumnHeaderCell, and Table.ColumnResizer, and documenting the intended composition model separately from internal normalized column metadata.

      #39
  17. 1.0.0-alpha.14

    • Add table row actions and selection-only disabled behavior.

      • add onRowAction to Table.Root with RAC-style interaction rules across selectionMode and selectionBehavior
      • 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
      #37
  18. 1.0.0-alpha.13

    • 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.

      #35
  19. 1.0.0-alpha.12

    • Fix ListBox and ComboBox interaction state issues so keyboard focus, hover, and virtual focus stay in sync.

      This includes clearing item data-focus-visible on pointer hover, tightening ListBox focus ownership, skipping disabled ComboBox options during keyboard navigation, and continuing keyboard navigation from the clicked option in multiselect flows.

      #33
  20. 1.0.0-alpha.11

    • Add follow-up ComboBox and Popover improvements after the previous prerelease changeset was already consumed.

      • Forward Popover.Content configuration props through ComboBox.Popover, including positioning options like offset, placement, shouldFlip, shouldCloseOnEscape, and shouldCloseOnBlur.
      • Ensure ComboBox virtual focus marks the active ListBox.Item with data-focus-visible during keyboard navigation.
      • Keep the interactive ComboBox docs aligned with the shared popover positioning behavior.
      #31
  21. 1.0.0-alpha.10

    • Add new ComboBox trigger and clear parts, plus pending and scroll improvements.

      • Add ComboBox.Trigger as the primary trigger part while keeping ComboBox.Button as a compatibility alias.
      • Add ComboBox.Clear to reset the input and clear the current selection without stealing focus.
      • Reflect isPending on 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.List instead of ComboBox.Popover.
      #28
  22. 1.0.0-alpha.9

    • Summary

      Make ComboBox.Input render through the shared Input primitive while preserving existing combobox behavior and accessibility semantics.

      #25
  23. 1.0.0-alpha.8

    • Summary

      Upgrade Input to a focus-aware native input primitive with RAC-style disabled, read-only, invalid, and required state props.

      #22
  24. 1.0.0-alpha.7

    • Summary

      Add a new headless Button component with modality-aware focus state, pressed and hovered data attributes, and RAC-style pending semantics.

      #20
  25. 1.0.0-alpha.6

    • Fix published package entrypoints so generated ESM files no longer import sibling TypeScript source paths.

      #18
  26. 1.0.0-alpha.5

    • Add Table.Checkbox and Table.CheckboxIndicator for 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) and defaultHiddenColumns props to Table.Root for 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-colindex to header and body cells for accurate screen reader column position announcements.

      #16
    • Table Column Resizing

      Add column resizing support to Table.

      • add Table.ColumnResizer as a public part
      • add column width and resize APIs to Table.Root and Table.Column
      • render managed column widths through colgroup
      • document and demo resizable table columns
      #16
    • Add a new Table component 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.ColumnResizer keyboard interaction to use an explicit Enter-to-resize mode.

      • Focused resize handles now enter keyboard resize mode with Enter and exit with Enter.
      • Escape cancels 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.
      #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.

      #16
  27. 1.0.0-alpha.4

    • Refactor TimePicker panel to Apple-like wheel architecture.

      • Replace TimePicker.Column/TimePicker.ColumnCell with TimePicker.WheelColumn/TimePicker.WheelItem.
      • Migrate panel semantics from listbox/option to spinbutton per wheel column.
      • Remove shouldCloseOnSelect and closeOnSelect from TimePicker.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.
      #13
  28. 1.0.0-alpha.3

    • 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 focusWithModality for 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.
      #11
  29. 1.0.0-alpha.2

    • 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
      #6
  30. 1.0.0-alpha.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)
      #1