@ahrowe/ui 0.42.0 → 0.43.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/CHANGELOG.md +934 -0
- package/README.md +11 -10
- package/dist/cjs-types/common/accordion/accordion.types.d.ts +17 -2
- package/dist/cjs-types/common/actionButtons/actionButtons.types.d.ts +7 -1
- package/dist/cjs-types/common/actionIcon/actionIcon.d.ts +1 -1
- package/dist/cjs-types/common/actionIcon/actionIcon.types.d.ts +7 -9
- package/dist/cjs-types/common/alert/alert.types.d.ts +6 -8
- package/dist/cjs-types/common/animatedLogo/animatedLogo.types.d.ts +3 -2
- package/dist/cjs-types/common/badge/badge.types.d.ts +10 -6
- package/dist/cjs-types/common/button/button.types.d.ts +14 -4
- package/dist/cjs-types/common/calendar/calendar.types.d.ts +25 -10
- package/dist/cjs-types/common/calendar/components/agendaList/agendaList.d.ts +1 -1
- package/dist/cjs-types/common/calendar/components/agendaList/agendaList.types.d.ts +3 -0
- package/dist/cjs-types/common/calendar/components/calendarHeader/calendarHeader.d.ts +1 -1
- package/dist/cjs-types/common/calendar/components/calendarHeader/calendarHeader.types.d.ts +2 -0
- package/dist/cjs-types/common/calendar/components/compactMonth/compactMonth.d.ts +1 -1
- package/dist/cjs-types/common/calendar/components/monthView/monthView.d.ts +1 -1
- package/dist/cjs-types/common/calendar/components/monthView/monthView.types.d.ts +3 -2
- package/dist/cjs-types/common/calendar/components/timeGrid/timeGrid.d.ts +1 -1
- package/dist/cjs-types/common/calendar/components/timeGrid/timeGrid.types.d.ts +9 -1
- package/dist/cjs-types/common/calendar/dates.d.ts +21 -5
- package/dist/cjs-types/common/calendar/format.d.ts +3 -2
- package/dist/cjs-types/common/calendar/layout.d.ts +5 -0
- package/dist/cjs-types/common/calendar/useNow.d.ts +4 -0
- package/dist/cjs-types/common/calendar/view.types.d.ts +9 -2
- package/dist/cjs-types/common/card/card.types.d.ts +16 -2
- package/dist/cjs-types/common/chip/chip.types.d.ts +10 -5
- package/dist/cjs-types/common/copyButton/copyButton.types.d.ts +5 -4
- package/dist/cjs-types/common/fab/components/fabBase/fabBase.d.ts +1 -1
- package/dist/cjs-types/common/fab/components/fabBase/fabBase.types.d.ts +2 -1
- package/dist/cjs-types/common/progressBar/progressBar.d.ts +0 -1
- package/dist/cjs-types/common/progressBar/progressBar.types.d.ts +3 -1
- package/dist/cjs-types/common/splitButton/splitButton.types.d.ts +4 -1
- package/dist/cjs-types/common/styles/tone.d.ts +11 -0
- package/dist/cjs-types/common/themeProvider/color.types.d.ts +20 -0
- package/dist/cjs-types/common/themeProvider/index.d.ts +2 -0
- package/dist/cjs-types/common/themeProvider/theme.types.d.ts +3 -6
- package/dist/cjs-types/common/timeline/timeline.types.d.ts +3 -10
- package/dist/cjs-types/common/toast/index.d.ts +1 -1
- package/dist/cjs-types/common/toast/toast.types.d.ts +7 -3
- package/dist/cjs-types/common/types/actions.types.d.ts +1 -1
- package/dist/cjs-types/common/utils/dismissClick.d.ts +4 -0
- package/dist/cjs-types/common/utils/isDev.d.ts +1 -0
- package/dist/esm/common/accordion/accordion.mjs +1 -1
- package/dist/esm/common/accordion/accordion.mjs.map +1 -1
- package/dist/esm/common/accordion/accordion.module.mjs +1 -1
- package/dist/esm/common/accordion/accordion.module.mjs.map +1 -1
- package/dist/esm/common/accordion/accordion.types.mjs +1 -1
- package/dist/esm/common/accordion/accordion.types.mjs.map +1 -1
- package/dist/esm/common/actionButtons/actionButtons.mjs +1 -1
- package/dist/esm/common/actionButtons/actionButtons.mjs.map +1 -1
- package/dist/esm/common/actionIcon/actionIcon.mjs +1 -1
- package/dist/esm/common/actionIcon/actionIcon.mjs.map +1 -1
- package/dist/esm/common/actionIcon/actionIcon.module.mjs +1 -1
- package/dist/esm/common/actionIcon/actionIcon.module.mjs.map +1 -1
- package/dist/esm/common/alert/alert.mjs +1 -1
- package/dist/esm/common/alert/alert.mjs.map +1 -1
- package/dist/esm/common/alert/alert.module.mjs +1 -1
- package/dist/esm/common/alert/alert.module.mjs.map +1 -1
- package/dist/esm/common/animatedLogo/animatedLogo.mjs +1 -1
- package/dist/esm/common/animatedLogo/animatedLogo.mjs.map +1 -1
- package/dist/esm/common/avatar/avatar.mjs +1 -1
- package/dist/esm/common/avatar/avatar.mjs.map +1 -1
- package/dist/esm/common/badge/badge.mjs +1 -1
- package/dist/esm/common/badge/badge.mjs.map +1 -1
- package/dist/esm/common/badge/badge.module.mjs +1 -1
- package/dist/esm/common/badge/badge.module.mjs.map +1 -1
- package/dist/esm/common/badge/badge.types.mjs +1 -1
- package/dist/esm/common/badge/badge.types.mjs.map +1 -1
- package/dist/esm/common/bodyEnd/bodyEnd.mjs +1 -1
- package/dist/esm/common/bodyEnd/bodyEnd.mjs.map +1 -1
- package/dist/esm/common/breadcrumb/breadcrumb.mjs +1 -1
- package/dist/esm/common/breadcrumb/breadcrumb.mjs.map +1 -1
- package/dist/esm/common/breadcrumb/breadcrumb.module.mjs.map +1 -1
- package/dist/esm/common/button/button.mjs +1 -1
- package/dist/esm/common/button/button.mjs.map +1 -1
- package/dist/esm/common/button/button.module.mjs +1 -1
- package/dist/esm/common/button/button.module.mjs.map +1 -1
- package/dist/esm/common/button/button.types.mjs +1 -1
- package/dist/esm/common/button/button.types.mjs.map +1 -1
- package/dist/esm/common/calendar/calendar.mjs +1 -1
- package/dist/esm/common/calendar/calendar.mjs.map +1 -1
- package/dist/esm/common/calendar/calendar.module.mjs.map +1 -1
- package/dist/esm/common/calendar/calendar.types.mjs.map +1 -1
- package/dist/esm/common/calendar/components/agendaList/agendaList.mjs +1 -1
- package/dist/esm/common/calendar/components/agendaList/agendaList.mjs.map +1 -1
- package/dist/esm/common/calendar/components/agendaList/agendaList.module.mjs.map +1 -1
- package/dist/esm/common/calendar/components/calendarHeader/calendarHeader.mjs +1 -1
- package/dist/esm/common/calendar/components/calendarHeader/calendarHeader.mjs.map +1 -1
- package/dist/esm/common/calendar/components/calendarHeader/calendarHeader.module.mjs +1 -1
- package/dist/esm/common/calendar/components/calendarHeader/calendarHeader.module.mjs.map +1 -1
- package/dist/esm/common/calendar/components/compactMonth/compactMonth.mjs +1 -1
- package/dist/esm/common/calendar/components/compactMonth/compactMonth.mjs.map +1 -1
- package/dist/esm/common/calendar/components/compactMonth/compactMonth.module.mjs +1 -1
- package/dist/esm/common/calendar/components/compactMonth/compactMonth.module.mjs.map +1 -1
- package/dist/esm/common/calendar/components/monthView/monthView.mjs +1 -1
- package/dist/esm/common/calendar/components/monthView/monthView.mjs.map +1 -1
- package/dist/esm/common/calendar/components/monthView/monthView.module.mjs +1 -1
- package/dist/esm/common/calendar/components/monthView/monthView.module.mjs.map +1 -1
- package/dist/esm/common/calendar/components/timeGrid/timeGrid.mjs +1 -1
- package/dist/esm/common/calendar/components/timeGrid/timeGrid.mjs.map +1 -1
- package/dist/esm/common/calendar/components/timeGrid/timeGrid.module.mjs +1 -1
- package/dist/esm/common/calendar/components/timeGrid/timeGrid.module.mjs.map +1 -1
- package/dist/esm/common/calendar/dates.mjs +1 -1
- package/dist/esm/common/calendar/dates.mjs.map +1 -1
- package/dist/esm/common/calendar/format.mjs +1 -1
- package/dist/esm/common/calendar/format.mjs.map +1 -1
- package/dist/esm/common/calendar/layout.mjs +1 -1
- package/dist/esm/common/calendar/layout.mjs.map +1 -1
- package/dist/esm/common/calendar/useNow.mjs +2 -0
- package/dist/esm/common/calendar/useNow.mjs.map +1 -0
- package/dist/esm/common/card/Card.mjs +1 -1
- package/dist/esm/common/card/Card.mjs.map +1 -1
- package/dist/esm/common/card/CardActions.mjs +1 -1
- package/dist/esm/common/card/CardActions.mjs.map +1 -1
- package/dist/esm/common/card/CardHeader.mjs.map +1 -1
- package/dist/esm/common/card/card.module.mjs +1 -1
- package/dist/esm/common/card/card.module.mjs.map +1 -1
- package/dist/esm/common/card/card.types.mjs +1 -1
- package/dist/esm/common/card/card.types.mjs.map +1 -1
- package/dist/esm/common/carousel/carousel.mjs +1 -1
- package/dist/esm/common/carousel/carousel.mjs.map +1 -1
- package/dist/esm/common/carousel/carousel.module.mjs.map +1 -1
- package/dist/esm/common/chip/chip.mjs +1 -1
- package/dist/esm/common/chip/chip.mjs.map +1 -1
- package/dist/esm/common/chip/chip.module.mjs +1 -1
- package/dist/esm/common/chip/chip.module.mjs.map +1 -1
- package/dist/esm/common/chip/chip.types.mjs +1 -1
- package/dist/esm/common/chip/chip.types.mjs.map +1 -1
- package/dist/esm/common/colorPicker/colorPicker.mjs +1 -1
- package/dist/esm/common/colorPicker/colorPicker.mjs.map +1 -1
- package/dist/esm/common/colorPicker/colorPicker.module.mjs.map +1 -1
- package/dist/esm/common/confirmModal/confirmModal.mjs +1 -1
- package/dist/esm/common/confirmModal/confirmModal.mjs.map +1 -1
- package/dist/esm/common/copyButton/copyButton.mjs +1 -1
- package/dist/esm/common/copyButton/copyButton.mjs.map +1 -1
- package/dist/esm/common/copyButton/copyButton.module.mjs +1 -1
- package/dist/esm/common/copyButton/copyButton.module.mjs.map +1 -1
- package/dist/esm/common/errorBoundary/errorBoundary.mjs +2 -2
- package/dist/esm/common/errorBoundary/errorBoundary.mjs.map +1 -1
- package/dist/esm/common/fab/components/fabBase/fabBase.mjs +1 -1
- package/dist/esm/common/fab/components/fabBase/fabBase.mjs.map +1 -1
- package/dist/esm/common/fab/fab.mjs +1 -1
- package/dist/esm/common/fab/fab.mjs.map +1 -1
- package/dist/esm/common/flip/flip.mjs +1 -1
- package/dist/esm/common/flip/flip.mjs.map +1 -1
- package/dist/esm/common/klipyPicker/klipyPicker.mjs +1 -1
- package/dist/esm/common/klipyPicker/klipyPicker.mjs.map +1 -1
- package/dist/esm/common/modal/modal.mjs +1 -1
- package/dist/esm/common/modal/modal.mjs.map +1 -1
- package/dist/esm/common/modal/modal.module.mjs.map +1 -1
- package/dist/esm/common/numberInput/numberInput.mjs +1 -1
- package/dist/esm/common/numberInput/numberInput.mjs.map +1 -1
- package/dist/esm/common/numberInput/numberInput.module.mjs.map +1 -1
- package/dist/esm/common/popover/popover.mjs +1 -1
- package/dist/esm/common/popover/popover.mjs.map +1 -1
- package/dist/esm/common/progressBar/progressBar.mjs +1 -1
- package/dist/esm/common/progressBar/progressBar.mjs.map +1 -1
- package/dist/esm/common/progressBar/progressBar.module.mjs +1 -1
- package/dist/esm/common/progressBar/progressBar.module.mjs.map +1 -1
- package/dist/esm/common/roomDrawer/roomDrawer.mjs +1 -1
- package/dist/esm/common/roomDrawer/roomDrawer.mjs.map +1 -1
- package/dist/esm/common/roomDrawer/roomDrawer.module.mjs.map +1 -1
- package/dist/esm/common/sectionHeader/sectionHeader.mjs.map +1 -1
- package/dist/esm/common/splitButton/splitButton.mjs +1 -1
- package/dist/esm/common/splitButton/splitButton.mjs.map +1 -1
- package/dist/esm/common/styles/tone.mjs +4 -0
- package/dist/esm/common/styles/tone.mjs.map +1 -0
- package/dist/esm/common/styles/tone.module.mjs +2 -0
- package/dist/esm/common/styles/tone.module.mjs.map +1 -0
- package/dist/esm/common/themeProvider/color.types.mjs +2 -0
- package/dist/esm/common/themeProvider/color.types.mjs.map +1 -0
- package/dist/esm/common/themeProvider/defaultTheme.mjs +1 -1
- package/dist/esm/common/themeProvider/defaultTheme.mjs.map +1 -1
- package/dist/esm/common/tilt/tilt.mjs +1 -1
- package/dist/esm/common/tilt/tilt.mjs.map +1 -1
- package/dist/esm/common/timeInput/timeInput.mjs +1 -1
- package/dist/esm/common/timeInput/timeInput.mjs.map +1 -1
- package/dist/esm/common/timeline/timeline.mjs +1 -1
- package/dist/esm/common/timeline/timeline.mjs.map +1 -1
- package/dist/esm/common/timeline/timeline.module.mjs +1 -1
- package/dist/esm/common/timeline/timeline.module.mjs.map +1 -1
- package/dist/esm/common/timeline/timeline.types.mjs +1 -1
- package/dist/esm/common/timeline/timeline.types.mjs.map +1 -1
- package/dist/esm/common/timer/timer.mjs +1 -1
- package/dist/esm/common/timer/timer.mjs.map +1 -1
- package/dist/esm/common/timer/timer.module.mjs +1 -1
- package/dist/esm/common/timer/timer.module.mjs.map +1 -1
- package/dist/esm/common/toast/toast.mjs +1 -1
- package/dist/esm/common/toast/toast.mjs.map +1 -1
- package/dist/esm/common/toast/toast.module.mjs +1 -1
- package/dist/esm/common/toast/toast.module.mjs.map +1 -1
- package/dist/esm/common/toast/toastHost.mjs +1 -1
- package/dist/esm/common/toast/toastHost.mjs.map +1 -1
- package/dist/esm/common/utils/dismissClick.mjs +2 -0
- package/dist/esm/common/utils/dismissClick.mjs.map +1 -0
- package/dist/esm/common/utils/isDev.mjs +2 -0
- package/dist/esm/common/utils/isDev.mjs.map +1 -0
- package/dist/esm/index.mjs +1 -1
- package/dist/esm/services/formValidation/FormValidatorGroupWithForm.mjs +1 -1
- package/dist/esm/services/formValidation/FormValidatorGroupWithForm.mjs.map +1 -1
- package/dist/index.cjs +5 -3
- package/dist/index.cjs.map +1 -1
- package/dist/style.css +1 -1
- package/dist/types/common/accordion/accordion.types.d.ts +17 -2
- package/dist/types/common/actionButtons/actionButtons.types.d.ts +7 -1
- package/dist/types/common/actionIcon/actionIcon.d.ts +1 -1
- package/dist/types/common/actionIcon/actionIcon.types.d.ts +7 -9
- package/dist/types/common/alert/alert.types.d.ts +6 -8
- package/dist/types/common/animatedLogo/animatedLogo.types.d.ts +3 -2
- package/dist/types/common/badge/badge.types.d.ts +10 -6
- package/dist/types/common/button/button.types.d.ts +14 -4
- package/dist/types/common/calendar/calendar.types.d.ts +25 -10
- package/dist/types/common/calendar/components/agendaList/agendaList.d.ts +1 -1
- package/dist/types/common/calendar/components/agendaList/agendaList.types.d.ts +3 -0
- package/dist/types/common/calendar/components/calendarHeader/calendarHeader.d.ts +1 -1
- package/dist/types/common/calendar/components/calendarHeader/calendarHeader.types.d.ts +2 -0
- package/dist/types/common/calendar/components/compactMonth/compactMonth.d.ts +1 -1
- package/dist/types/common/calendar/components/monthView/monthView.d.ts +1 -1
- package/dist/types/common/calendar/components/monthView/monthView.types.d.ts +3 -2
- package/dist/types/common/calendar/components/timeGrid/timeGrid.d.ts +1 -1
- package/dist/types/common/calendar/components/timeGrid/timeGrid.types.d.ts +9 -1
- package/dist/types/common/calendar/dates.d.ts +21 -5
- package/dist/types/common/calendar/format.d.ts +3 -2
- package/dist/types/common/calendar/layout.d.ts +5 -0
- package/dist/types/common/calendar/useNow.d.ts +4 -0
- package/dist/types/common/calendar/view.types.d.ts +9 -2
- package/dist/types/common/card/card.types.d.ts +16 -2
- package/dist/types/common/chip/chip.types.d.ts +10 -5
- package/dist/types/common/copyButton/copyButton.types.d.ts +5 -4
- package/dist/types/common/fab/components/fabBase/fabBase.d.ts +1 -1
- package/dist/types/common/fab/components/fabBase/fabBase.types.d.ts +2 -1
- package/dist/types/common/progressBar/progressBar.d.ts +0 -1
- package/dist/types/common/progressBar/progressBar.types.d.ts +3 -1
- package/dist/types/common/splitButton/splitButton.types.d.ts +4 -1
- package/dist/types/common/styles/tone.d.ts +11 -0
- package/dist/types/common/themeProvider/color.types.d.ts +20 -0
- package/dist/types/common/themeProvider/index.d.ts +2 -0
- package/dist/types/common/themeProvider/theme.types.d.ts +3 -6
- package/dist/types/common/timeline/timeline.types.d.ts +3 -10
- package/dist/types/common/toast/index.d.ts +1 -1
- package/dist/types/common/toast/toast.types.d.ts +7 -3
- package/dist/types/common/types/actions.types.d.ts +1 -1
- package/dist/types/common/utils/dismissClick.d.ts +4 -0
- package/dist/types/common/utils/isDev.d.ts +1 -0
- package/docs/Accordion.md +74 -5
- package/docs/ActionButtons.md +6 -3
- package/docs/ActionIcon.md +39 -14
- package/docs/Alert.md +27 -17
- package/docs/AnimatedLogo.md +1 -1
- package/docs/Badge.md +24 -7
- package/docs/Button.md +98 -40
- package/docs/ButtonGroup.md +18 -18
- package/docs/CLAUDE.md +21 -11
- package/docs/Calendar.md +35 -17
- package/docs/Card.md +53 -14
- package/docs/Chip.md +24 -9
- package/docs/ConfigProvider.md +3 -3
- package/docs/CopyButton.md +6 -5
- package/docs/ProgressBar.md +7 -4
- package/docs/SectionHeader.md +1 -1
- package/docs/SplitButton.md +6 -5
- package/docs/ThemeColor.md +103 -0
- package/docs/ThemeProvider.md +5 -5
- package/docs/Timeline.md +18 -9
- package/docs/Toast.md +25 -11
- package/package.json +3 -2
- package/dist/esm/common/accordion/accordion.plain.module.mjs +0 -2
- package/dist/esm/common/accordion/accordion.plain.module.mjs.map +0 -1
- package/dist/esm/common/accordion/accordion.primary.module.mjs +0 -2
- package/dist/esm/common/accordion/accordion.primary.module.mjs.map +0 -1
- package/dist/esm/common/alert/alert.types.mjs +0 -2
- package/dist/esm/common/alert/alert.types.mjs.map +0 -1
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,934 @@
|
|
|
1
|
+
# @ahrowe/ui
|
|
2
|
+
|
|
3
|
+
## 0.43.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- f3f3f90: Accordion headers take the WAI-ARIA accordion keys (Up and Down between neighbouring headers, wrapping; Home and End to the ends), tint on hover and show a focus ring
|
|
8
|
+
- f3f3f90: **Breaking:** Accordion's styles are the shared `Outlined` (default), `Light` and `Plain`, with a `color`, and `Default` and `Primary` are gone; neighbours keep a small gap unless both are `joined`, which makes them one block. See "Migration from `Default`, `Primary` and `Plain`" in docs/Accordion.md
|
|
9
|
+
- 567a929: **Breaking:** ActionIcon is a real `<button>` built on Button, with its `styleType` and `color` (default Plain in the surrounding text colour); its `ref` and `onClick`, CopyButton's, and those of Card and SectionHeader actions are typed for `HTMLButtonElement`. See "Migration from the div" in docs/ActionIcon.md
|
|
10
|
+
- 567a929: **Breaking:** Alert takes its colour as `color` instead of `styleType`, and `AlertStyleType` is gone; any CSS colour works too. See "Migration from `AlertStyleType`" in docs/Alert.md
|
|
11
|
+
- 567a929: **Breaking:** Badge's `styleType` is now `Filled | Light | Outlined` and its colour a separate `color` prop, so every colour comes in every style; the old colour members are gone. See "Migration from colour styles" in docs/Badge.md
|
|
12
|
+
- 76a4743: **Breaking:** ActionButtons takes `submitButtonColor` and `cancelButtonColor` (a destructive confirm is `submitButtonColor={ThemeColor.Error}`), and SplitButton and Card actions take a `color` beside `styleType`. See "Migration from `Primary`, `Default` and `Delete`" in docs/Button.md
|
|
13
|
+
- 76a4743: **Breaking:** Button's `styleType` is `Filled | Light | Outlined | Plain` with a separate `color`: `Primary` becomes `Filled`, `Default` becomes `Outlined` (now the default, in `--primary-color`) and `Delete` becomes `Filled` in `ThemeColor.Error`. See "Migration from `Primary`, `Default` and `Delete`" in docs/Button.md
|
|
14
|
+
- 76a4743: **Breaking:** the `--button-default-background`, `--button-default-color` and `--button-default-border` theme variables are gone; use `color={ThemeColor.Neutral}`, a custom colour or a `ConfigProvider` default. See "Migration from `Primary`, `Default` and `Delete`" in docs/Button.md
|
|
15
|
+
- 443fcea: Calendar's all-day row in the week and day views creates an all-day slot from a click and one over several days from a drag, and moves an all-day event by days
|
|
16
|
+
- 443fcea: Added `eventClassName` to Calendar: a class for one event's element in every view, for a tentative, cancelled or selected event
|
|
17
|
+
- 443fcea: Calendar's month view creates an all-day slot over several days from a drag across them
|
|
18
|
+
- 443fcea: Calendar's week view shows three days from the selected one below 600px of its own width, and pages by three
|
|
19
|
+
- 443fcea: Calendar's header has a New event button when `onSlotCreate` is set, the keyboard's way to create in every view: the next full hour in the week and day views, the selected day elsewhere. It replaces the narrow month's own button
|
|
20
|
+
- 443fcea: Added `showWeekNumbers` to Calendar: ISO 8601 week numbers on the month's rows and in the corner of the week and day views, worded by `labels.weekNumber`
|
|
21
|
+
- 443fcea: Added `workingHours` to Calendar, which shades the hours outside it in the week and day views, overnight shifts such as `[22, 6]` included, and opens them at its start. `--calendar-off-hours-color` sets the shade
|
|
22
|
+
- bd14f63: **Breaking:** Card's `CardStyleType.Filled` is now `Light`, and Card takes a `color` for the border of an `Outlined` card and the tint of a `Light` one. See "Migration from `Filled`" in docs/Card.md
|
|
23
|
+
- 567a929: **Breaking:** Chip's `styleType` is now `Light | Filled | Outlined` and its colour a separate `color` prop, so every colour comes in every style; the old colour members are gone. See "Migration from colour styles" in docs/Chip.md
|
|
24
|
+
- 567a929: Added `ThemeColor` and `ColorValue`: every `color` prop, now including Calendar events, ProgressBar segments and AnimatedLogo, takes one of six theme colours or any CSS colour, with black or white text on a fill picked for contrast. See docs/ThemeColor.md
|
|
25
|
+
- 567a929: **Breaking:** a Timeline entry takes its marker colour as `color` instead of `status`, and `TimelineItemStatus` is gone; any CSS colour works too. See "Migration from `status`" in docs/Timeline.md
|
|
26
|
+
- 567a929: **Breaking:** a toast takes its colour as `color` instead of `type` (`showToast('Saved', { color: ThemeColor.Success })`), and `ToastType` is gone; any CSS colour works too. See "Migration from `type`" in docs/Toast.md
|
|
27
|
+
|
|
28
|
+
### Patch Changes
|
|
29
|
+
|
|
30
|
+
- bd14f63: A Badge over its `children` sits on the page colour, so the avatar or icon no longer shows through a `Light`, `Outlined` or `Neutral` badge
|
|
31
|
+
- 75603d2: Button no longer sets `overflow: hidden` on every `div` passed in as its content
|
|
32
|
+
- 75603d2: A disabled Button fades to 50% opacity instead of 80%; a loading one keeps its full colour
|
|
33
|
+
- b878796: Button's hover and press tint and its ripple are drawn in its own text colour, so they show on every style and theme, and its focus ring sits inside its edge, where a ButtonGroup neighbour cannot hide it
|
|
34
|
+
- 443fcea: Calendar opens on the first of `views` when no `defaultView` is given, instead of on the month view whether `views` offers it or not
|
|
35
|
+
- 443fcea: Calendar.md says an event's `id` must be unique per occurrence, its `onRangeChange` example no longer lets a slower answer replace a newer one, and its time zone limit gives the real reason
|
|
36
|
+
- 443fcea: Calendar's header controls look like the library's own `Button` and `ActionIcon` instead of restyled ones, its all-day toggle is an `ActionIcon` and an empty agenda shows an `EmptyState`
|
|
37
|
+
- 443fcea: A click on Calendar's empty time that closes a `Popover` only closes it, instead of also creating a slot and moving the editor there. A click on another event still opens that one
|
|
38
|
+
- 443fcea: Calendar's month, narrow month and agenda views move today's mark at midnight, as the week and day views already did
|
|
39
|
+
- bd14f63: Card's `hoverEffect` tints the card's own surface instead of swapping it for `--background-accent`, so a coloured card keeps its colour
|
|
40
|
+
- bd14f63: A Neutral `Light` Card falls back to a tint of the text colour instead of `--background-accent` where the theme does not set `--background-card-filled`; `defaultTheme` and `lightTheme` set it
|
|
41
|
+
- 4ca0533: Developer warnings (BodyEnd without a host, Flip, Tilt, a `color` that is not a colour) show in a development build; the published package had compiled them out
|
|
42
|
+
- 207d1e9: Modal's close button and ColorPicker's eyedropper are ActionIcons, with the hover tint and keyboard focus ring every other icon button has
|
|
43
|
+
- 207d1e9: A ProgressBar label on a coloured segment is black or white by the segment's luminance for any CSS colour, not only six-digit hex
|
|
44
|
+
- f3f3f90: `Light` Badges and Chips in `Success`, `Info`, `Warn` and `Error` are a see-through tint of the colour, like every other colour, instead of the theme's solid `--*-lighter` pastels
|
|
45
|
+
- f3f3f90: A neutral Badge or Chip is tinted in the text colour instead of black, so it shows on a dark theme too
|
|
46
|
+
- f3f3f90: Text in a colour (`Light`, `Outlined` and `Plain` styles) is moved toward the page's text colour so it stays readable, dark red on a dark theme most of all; borders, dots and icons keep the pure colour
|
|
47
|
+
|
|
48
|
+
## 0.42.0
|
|
49
|
+
|
|
50
|
+
### Minor Changes
|
|
51
|
+
|
|
52
|
+
- 49441b0: **Breaking:** `commitDerivation`'s `nameFor` gets the room's number on the floor, skipping names already taken, instead of its index among the rooms created in that call, so `` (n) => `Raum ${n}` `` numbers rooms the way the default does rather than naming every new one "Raum 1". `addFloor` takes the same `nameFor`
|
|
53
|
+
- 49441b0: New entry `@ahrowe/ui/floor-plan`: the floor plan model alone, with no React, react-dom or FontAwesome behind it and no `'use client'`, so a Node server can read and validate a plan with `planFromJson` and `validatePlan`, the same code the client uses. See "On a server" in docs/FloorPlan.md
|
|
54
|
+
- a982a59: **Breaking:** removed `planFromLegacySvg` and `LegacyImportOptions`. The SVG format of the old RoomDrawer is no longer read; plans are JSON. It was also the one function in `@ahrowe/ui/floor-plan` that needed a browser, for its `DOMParser`
|
|
55
|
+
- a982a59: **Breaking:** removed `screenScale`. Nothing in the library called it, it needed a live `<svg>`, and its `SVGSVGElement` parameter made `@ahrowe/ui/floor-plan`'s declarations fail to type-check in a project without the DOM lib. Pass `1 / view.zoom` as `pxToWorld`, as `RoomDrawer` does
|
|
56
|
+
- 49441b0: `RoomDrawer` takes `formatAngle` and `formatZoom` next to `formatLength` and `formatArea`, so every number it prints can follow the app's locale. `formatZoom` gets screen pixels per millimetre, which `Intl.NumberFormat`'s `percent` style takes as it is
|
|
57
|
+
- 49441b0: `RoomDrawer` has `labels.hintSelectSingle` for the select hint with `multiSelect` off, and `labels.relativeAngle` for the "rel" after an angle measured from the previous wall. Before, one `hintSelect` replaced both hints, and "rel" could not be translated
|
|
58
|
+
- 49441b0: `RoomDrawer` names the rooms and floors it creates through `labels`: `newRoomName` and `newFloorName` get the next free number, `copiedFloorName` the name of the floor being copied, and `initialFloorName` names the floor an empty plan starts with. These names are stored in the plan, so before this a translated app still saved "Room 1", "Floor 2", "… copy" and "Ground floor"
|
|
59
|
+
- 49441b0: **Breaking:** `RoomDrawer`'s `labels.selectedOpening` is replaced by `selectedDoor`, `selectedWindow`, `selectedArchway` and `selectedGap`. One string for every kind lost the kind in translation
|
|
60
|
+
- 49441b0: **Breaking:** removed `RoomDrawer`'s `labels.head` and `labels.selectedNothing`. Nothing rendered either of them
|
|
61
|
+
- 49441b0: **Breaking:** `RoomDrawer`'s `labels.angleLock` is now `(angle) => string` and gets `constrainAngle`, and `labels.selectedCount` is `(count) => string` instead of a `{count}` string, as every other counting label in the library already was. A translated `angleLock` no longer goes stale when `constrainAngle` changes
|
|
62
|
+
- 49441b0: **Breaking:** `RoomViewer`'s `labels.selectedRoom` is now `(name, area) => string` instead of a string with `{name}` and `{area}`, and the new `labels.unnamedRoom` replaces the "Unnamed room" that was hardcoded in the announcement and in each room's accessible name
|
|
63
|
+
|
|
64
|
+
### Patch Changes
|
|
65
|
+
|
|
66
|
+
- 49441b0: `RoomDrawer` and `RoomViewer` merge `labels` per key with the ones set through `AhroweProvider`, like every other component. An instance that overrode one string used to drop every translation set app-wide
|
|
67
|
+
|
|
68
|
+
## 0.41.2
|
|
69
|
+
|
|
70
|
+
### Patch Changes
|
|
71
|
+
|
|
72
|
+
- 9a1cf56: A Modal keeps Tab inside itself while a Popover opened from it is open, where Tab used to leave the Modal when the Popover had nothing to focus
|
|
73
|
+
- b6cc029: A Modal opened from a Popover shows above it: Modal, Popover and Tooltip share one layer, so the one opened last is on top
|
|
74
|
+
- a72e273: A Popover open while a Modal or another ancestor still moves it waits for that, then shows next to its trigger with its entrance animation
|
|
75
|
+
- 9a1cf56: A Popover with `focusOnOpen` opened while a Modal or another ancestor still moves it takes the focus once it shows, instead of not at all
|
|
76
|
+
- a72e273: Popover and Tooltip reposition once an animation that moved their trigger ends, so one opened as a Modal scales in no longer stays hidden or misplaced
|
|
77
|
+
- 9a1cf56: Tab out of the end of a Popover or Menu whose trigger is the last element in a Modal moves on to the Modal's first element, instead of leaving the focus on the panel being closed
|
|
78
|
+
|
|
79
|
+
## 0.41.1
|
|
80
|
+
|
|
81
|
+
### Patch Changes
|
|
82
|
+
|
|
83
|
+
- 50ea478: AhroweProvider no longer takes the focus from an autofocused field in a portal on its first render under StrictMode
|
|
84
|
+
- 389da11: Modal no longer stays hidden when reopened during its close animation
|
|
85
|
+
- 389da11: OtpInput's `clearOnError` no longer drops its clear after a remount, as under StrictMode or `<Activity>`
|
|
86
|
+
- 389da11: A closing Modal no longer takes the focus back from an overlay opened after it
|
|
87
|
+
- 389da11: A key held down while Modal, Popover or Menu opens no longer repeats into it
|
|
88
|
+
- 389da11: Popover closes only when focus leaves it, not when focus moves elsewhere or returns from another tab
|
|
89
|
+
- 389da11: Popover's `onOpenChange` reports `fromKeyboard: false` when a press on an outside field closes it
|
|
90
|
+
- 389da11: Popover returns focus to its trigger however it closes, when the focus was inside it
|
|
91
|
+
- 389da11: Under StrictMode, Calendar no longer reports a range twice, VirtualList no longer warns twice and Timer no longer stacks two ripples
|
|
92
|
+
|
|
93
|
+
## 0.41.0
|
|
94
|
+
|
|
95
|
+
### Minor Changes
|
|
96
|
+
|
|
97
|
+
- b62986d: Added `AhroweProvider`, the one wrapper an app needs: it applies the theme, takes `defaultProps` and `presentation`, shows toasts (`toast` prop), styles every scrollbar in the app and the page's own (`scrollbars={false}` to opt out) and renders the element portals go to, so `<div id="bodyEnd" />` is no longer needed
|
|
98
|
+
- b62986d: **Breaking:** removed `allowStacking` from `ToastOptions`. A single toast never read it; it stays on the `toast` prop
|
|
99
|
+
- b62986d: **Breaking:** removed `ToastProvider` and `ToastProviderProps`. `AhroweProvider` shows toasts now: pass the same settings to its `toast` prop, as in "Migrating from separate providers" in docs/AhroweProvider.md
|
|
100
|
+
|
|
101
|
+
### Patch Changes
|
|
102
|
+
|
|
103
|
+
- b62986d: Fixed portalled panels (Tooltip, Popover, Menu, Modal, Toast) under a nested theme taking the outer theme's font size, weight and text colour
|
|
104
|
+
- b62986d: `ScrollbarProvider`'s styles give way to any scrollbar rule of a component's or the app's own. They used to tie with a single class, such as Overscroll's `scrollbar-width: none`, and win or lose on stylesheet order
|
|
105
|
+
- b62986d: Fixed a nested `ThemeProvider` setting the page's `theme-color` to its own colour and leaving it there after unmounting. Only the outermost provider sets it now
|
|
106
|
+
- b62986d: Exported the `ThemeProviderProps` type
|
|
107
|
+
- b62986d: Corrected the defaults in Toast.md: toasts show top right for 4000 ms, with the progress bar and close button on
|
|
108
|
+
- b62986d: Fixed `showToast` ignoring its `labels` option
|
|
109
|
+
- b62986d: Exported the `ToastLabels` type, which Toast.md already named
|
|
110
|
+
|
|
111
|
+
## 0.40.0
|
|
112
|
+
|
|
113
|
+
### Minor Changes
|
|
114
|
+
|
|
115
|
+
- ea3f240: Added Calendar, with month, week, day and agenda views of your own events, swipe paging, drag to create, move and resize, and pinch to zoom the hours
|
|
116
|
+
- ea3f240: Added `dayTimeToDate` and `dateToTime`, to turn a DatePicker day and a TimeInput time into one `Date` and back in the browser's time zone
|
|
117
|
+
|
|
118
|
+
### Patch Changes
|
|
119
|
+
|
|
120
|
+
- f7477f8: `Modal` is named by its `aria-label` when one is passed, instead of by its title
|
|
121
|
+
- f7477f8: `Modal` and `ConfirmModal` accept any `ReactNode` as `title`, not only a string
|
|
122
|
+
- ea3f240: Fixed Popover closing at once when opened during a press, such as on the `pointerup` that ends a drag
|
|
123
|
+
- d01c27e: Fixed TabHeader scrolling vertically when its content overflows its height, for example when a flex column squeezes it
|
|
124
|
+
- 981bfd2: Fixed a VirtualList `fit` column staying at its padding width when rows replaced the `isLoading` spinner under the same `items` array
|
|
125
|
+
|
|
126
|
+
## 0.39.1
|
|
127
|
+
|
|
128
|
+
### Patch Changes
|
|
129
|
+
|
|
130
|
+
- 02b6c8a: Fixed Popover closing when a drag that started inside it, such as selecting a field's text, was released outside
|
|
131
|
+
|
|
132
|
+
## 0.39.0
|
|
133
|
+
|
|
134
|
+
### Minor Changes
|
|
135
|
+
|
|
136
|
+
- ea7165f: **Breaking:** DatePicker takes and hands out days as `'YYYY-MM-DD'` strings instead of `Date`s, in `selected`, `onSelect`, `onChange`, `minDate`, `maxDate`, `startDate`, `endDate` and its `formValidator`. A day no longer depends on the time zone: before, west of UTC the picked day showed as the day before, and east of it a typed `maxDate` was rejected. See "Migration from Date values" in docs/DatePicker.md
|
|
137
|
+
- ea7165f: Added `dateToDay` and `dayToDate`, to turn a `Date` into a `'YYYY-MM-DD'` day and back in the browser's time zone
|
|
138
|
+
- ea7165f: Updated `@ahrowe/form-validation` to 0.3.0: `Validators.date()` accepts DatePicker's `'YYYY-MM-DD'` days and no longer days that do not exist, and `isDay` is exported
|
|
139
|
+
- 65f8d7c: Added `anchor` to Popover, to open it at an element it does not wrap, such as a calendar event or a table cell
|
|
140
|
+
|
|
141
|
+
### Patch Changes
|
|
142
|
+
|
|
143
|
+
- 65f8d7c: Fixed DatePicker accepting typed days that do not exist, such as 31.02 or month 00, and rolling them over into a different date
|
|
144
|
+
- ea7165f: Fixed DatePicker west of UTC starting the weekday headers on Sunday, putting the 1st of each month a column early and naming every month one too early
|
|
145
|
+
- 65f8d7c: Fixed DatePicker crashing when `minDate` is later than `maxDate`
|
|
146
|
+
- ea7165f: Fixed DatePicker not giving its `formValidator` the field's `label`, so `Validators.required()` said "Value is required", and not validating a value the form started with
|
|
147
|
+
- 65f8d7c: Fixed Popover ignoring the first click outside it when the focus had moved into its panel on opening, its own focus move or one its content made on mount
|
|
148
|
+
|
|
149
|
+
## 0.38.0
|
|
150
|
+
|
|
151
|
+
### Minor Changes
|
|
152
|
+
|
|
153
|
+
- a4d31d2: Added `CommandPalette`, a ⌘K-style search dialog that takes the same `MenuEntry[]` as `Menu`, with built-in filtering or server results via `filter={false}`
|
|
154
|
+
- 044d087: Added `CopyButton`, an icon button that copies a value to the clipboard, shows a check and announces "Copied" to screen readers
|
|
155
|
+
- 0dab9cc: `InputDropdown` no longer opens an empty panel. With `allowCustomValue` the list stays closed while nothing matches; without it, a `No matches` row (`labels.empty`, slot `empty`) says the typed text will not be kept, and screen readers announce it
|
|
156
|
+
- a4d31d2: `MenuAction` takes optional `keywords`, extra search terms for `CommandPalette`
|
|
157
|
+
- 044d087: Added the `useClipboard` hook, for copying from any trigger such as a labelled `Button`
|
|
158
|
+
- 8e20554: Added `WeatherIcon`, animated line-art weather for twelve conditions, including a thunderstorm
|
|
159
|
+
|
|
160
|
+
### Patch Changes
|
|
161
|
+
|
|
162
|
+
- 6ab39c6: ButtonGroup: every seam is one border wide at any browser zoom or display scale. The two overlapping borders used to round to different device pixels, so a seam could read 2px next to a 1px one
|
|
163
|
+
- 1e9f3f0: Dropdown: the selected value sits at the same height as the text of an Input beside it, instead of 1px higher
|
|
164
|
+
- 044d087: `ErrorBoundary`'s stack trace copy control is now a `CopyButton`: icon-only, with "Copy"/"Copied" as its tooltip and accessible name, and `ErrorBoundaryState` no longer carries `copied`
|
|
165
|
+
- 601f58f: `Fab.md` states that `closeMenuOnEntryClicked` defaults to `true`
|
|
166
|
+
- 0dab9cc: `InputDropdown` is never a bottom sheet, as `ConfigProvider.md` already said. It passed no `presentation` to its `Popover`, so an app-wide `presentation={Presentation.Auto}` turned its suggestions into a sheet on touch screens, with a backdrop over the field being typed into. Apps that worked around it with `defaultProps={{ Popover: { presentation: Presentation.Default } }}` can drop that entry: it also switched off sheets for `Menu`, `SplitButton`, `MultiSelect`, `ColorPicker`, `Breadcrumb`, `VirtualList` and the pickers of `DatePicker`, `TimeInput` and `KlipyPicker`. `Dropdown` resolves its own presentation and was never affected
|
|
167
|
+
- 0dab9cc: `InputDropdown` no longer picks a suggestion the user cannot see. After Escape or a blur closed the list, the arrow keys still moved a hidden highlight and Enter selected it instead of submitting the form; an arrow now reopens the list with nothing highlighted
|
|
168
|
+
- 0dab9cc: `InputDropdown` shows the selected item's label when `items` arrive after the value, instead of keeping the raw value on display
|
|
169
|
+
- 1d56a7d: `ThemeProvider` applies its theme on the first render, so a page no longer fades its backgrounds in on every load
|
|
170
|
+
- 4995f29: Timer: two running ripples spawned before a render no longer share an id, so one finishing its animation no longer removes the other with it
|
|
171
|
+
|
|
172
|
+
## 0.37.0
|
|
173
|
+
|
|
174
|
+
### Minor Changes
|
|
175
|
+
|
|
176
|
+
- ab75f7a: Added `formatHotkey`, which writes a `useHotkeys` combo for the reader's platform: `formatHotkey('mod+shift+k')` is `⇧⌘K` on an Apple platform and `Ctrl+Shift+K` everywhere else
|
|
177
|
+
- ab75f7a: Added `menuHotkeys`, which turns a `Menu`'s entries into a map for `useHotkeys`, so a shortcut is spelled once and the hint the menu draws cannot drift from what fires. You bind it, so the scope stays yours: always, or `{ enabled: isOpen }` for only while the menu is open
|
|
178
|
+
- ab75f7a: A `Menu` entry's `shortcut` is now a `useHotkeys` combo (`'mod+s'`, `'f2'`) rather than a `ReactNode`, and the menu writes it for the reader's platform: `⌘S` on an Apple one, `Ctrl+S` everywhere else. A hand-written `'⌘S'` was silently wrong on Windows. The menu still only draws it, so an app that already binds the combo does not end up running the action twice
|
|
179
|
+
- 4c6ba03: Added `useHotkeys`, a keyboard-shortcut hook: a combo → handler map, `mod` resolving to Cmd or Ctrl per platform, plain keys suppressed while a text field has focus, and an optional element scope
|
|
180
|
+
- 4c6ba03: Published the general-purpose hooks the library already used internally: `useMediaQuery`, `useCoarsePointer`, `useVisualViewportSize`, `useScrollEdges`, `useSwipeDismiss`, `useOverlay` and `tabbablesIn`, documented in `docs/Hooks.md`
|
|
181
|
+
- d01bbad: Removed `IconLoading`. Its hand-drawn SVG held `scale(0)` for the last quarter of every animation cycle, so the loader vanished for 0.6s out of every 2.4s, and its five paths shared one hardcoded `stroke-dasharray` despite differing in length. Use `SpinnerLoading` for a generic spinner or `AnimatedLogo` for a branded one; `docs/Loading.md` documents the overlay wrapper `IconLoading` provided.
|
|
182
|
+
- fb62782: Sticky: new `boundaryInset` prop sets how much of a `boundary`'s lower end stays uncovered while the pinned content leaves it. At 0 the content rests on the very bottom edge, so the last stretch of the boundary, as tall as the content itself, spends the whole exit hidden underneath it
|
|
183
|
+
- fb62782: Sticky: new `boundary` prop confines the pinned content to an element. Once that element's bottom edge reaches the content, the content is pushed up with it and leaves the screen together with it, instead of staying pinned over whatever scrolls under it next. This is what native `position: sticky` gets from its containing block and a `position: fixed` implementation otherwise has no equivalent of. Several Stickies stacked on each other and pointed at the same boundary are lifted by one shared amount, so the group keeps its spacing on the way out
|
|
184
|
+
- fb62782: VirtualList: `getScrollElement()` on the imperative handle now returns `HTMLElement | null` (it can be a `scrollParent`, and is `null` when the page scrolls), and the handle gained `remeasure()`
|
|
185
|
+
- fb62782: VirtualList: new `tabAcrossRows` prop lets Tab carry on into the next row instead of leaving the list at the end of the current one, mounting the row it moves into, for grids of inputs that are filled in field by field
|
|
186
|
+
|
|
187
|
+
### Patch Changes
|
|
188
|
+
|
|
189
|
+
- ab75f7a: `useHotkeys` no longer holds back a combo a focused text field would never consume: `f2`, `escape` and the function keys now fire while an input has focus, while a single character and the editing keys still do not
|
|
190
|
+
- 37e66f3: Input, Dropdown, MultiSelect: a field without a label no longer draws its top border half a notch above the field in Safari and Firefox
|
|
191
|
+
- ab75f7a: Fixed `Menu` throwing keyboard focus back to the first entry whenever its parent re-rendered while it was open, which an `items={[…]}` array written inline made happen on any unrelated state change
|
|
192
|
+
- aa6d9b3: Popover, Tooltip: the panel no longer trails its trigger while scrolling. Where the browser's CSS anchor positioning counts the trigger's transforms it is anchored to the trigger in CSS, so the browser moves both in the same frame; Firefox, which does not, keeps the pixel positioning
|
|
193
|
+
- fb62782: VirtualList: `onScroll`, `onKeyDown`, `onFocus`, `onBlur` and `tabIndex` passed to the list now survive alongside the component's own scroll and keyboard handling, instead of being overwritten by it. A `preventDefault()` in the consumer's handler keeps the key, so a list can be given key handling of its own without the arrow keys acting twice
|
|
194
|
+
- fb62782: VirtualList: new `scrollParent` prop drops the list's own scrollbar, so it renders at full height in the page flow and virtualizes against the page or a given element instead of nesting a second scrollbar inside the first. It takes `'window'`, an element or a getter, and `'nearest'` for the ancestor that actually carries the scroll, which is the same one `Sticky` pins to, so a sticky header above the list and the rows under it answer to the same scrollport
|
|
195
|
+
- fb62782: VirtualList: warns when `height` is passed alongside `scrollParent`, which leaves the list no viewport to size
|
|
196
|
+
- fb62782: VirtualList: warns when it is rendering every one of more than a hundred rows, which means its viewport is as tall as its content and nothing is being virtualized. A percentage `height` inside a parent with no definite height does exactly that, and it used to fail silently as nothing but a slow page
|
|
197
|
+
|
|
198
|
+
## 0.36.0
|
|
199
|
+
|
|
200
|
+
### Minor Changes
|
|
201
|
+
|
|
202
|
+
- 7f5261b: Added a Claude Code plugin, installable with `/plugin marketplace add AndreasWeinzierl/ahrowe-ui`, that bundles the MCP server and a skill pointing at the docs installed in the consumer's project
|
|
203
|
+
- d144e01: Dropdown no longer depends on `downshift`, which was the package's heaviest dependency at 5.4 MB across nine packages, for this one component. Its keyboard and screen-reader behaviour is now the component's own and is covered by tests
|
|
204
|
+
- 97b66ea: `docs/CLAUDE.md`, the file a consumer's Claude Code loads, is now a compact index (the rules that apply everywhere plus a table of every component) that tells Claude to read a component's doc on demand, instead of importing all 77 docs into every session
|
|
205
|
+
- f35bc0b: Added a `footer` prop to `Modal`, pinning content below the scrolling body so action buttons stay visible however long the content is
|
|
206
|
+
- f35bc0b: Added `--modal-scroll-fade`, so an app can shorten the scroll fade on `Modal` or switch it off entirely with `0px`
|
|
207
|
+
- f35bc0b: `Modal` now fades its content into the header and footer while there is more to scroll, instead of cutting it off mid-line against them
|
|
208
|
+
- f35bc0b: Added `--modal-max-width` and `--modal-max-height`, so a dialog's size cap can be set app-wide rather than per instance
|
|
209
|
+
- f35bc0b: `Modal`'s spacing is now themeable through `--modal-padding`, `--modal-gap` and `--modal-body-bleed` instead of being hardcoded
|
|
210
|
+
- 7f389b6: **Breaking:** removed the `InfiniteBlock` component. `VirtualList` and `KanbanColumn` already did load-on-scroll with a `hasMore` that `InfiniteBlock` never had, so it could not be told to stop; its published example named three props it did not have and so had never compiled; and half of it was keyboard machinery left over from `Dropdown`, which no longer uses it. Use `VirtualList` for a long or paginated list
|
|
211
|
+
- f35bc0b: Added `ScrollFade`, a scrollable box whose content dissolves at the edge it is scrolling past instead of being cut off against it, on either axis
|
|
212
|
+
- f35bc0b: A bottom sheet's width cap is now `--sheet-max-width` rather than a hardcoded 560px, joining `--sheet-max-height` and `--sheet-safe-padding` as a themeable dimension
|
|
213
|
+
|
|
214
|
+
### Patch Changes
|
|
215
|
+
|
|
216
|
+
- f374c2c: Added a CI workflow running the type check, lint, formatting check and both test suites on every pull request, plus the package checks on master, and gated the demo deploy on them
|
|
217
|
+
- f35bc0b: `ConfirmModal` now renders its buttons in `Modal`'s footer, so they stay visible instead of scrolling away with long content
|
|
218
|
+
- 7f5261b: Added `dev@ahrowe.com` as the contact address, and pointed the npm homepage and the README at the live component demo, which nothing linked to before
|
|
219
|
+
- 9de8a7d: Every component page in the demo now shows its `docs/<Name>.md` under the examples, so the props, slots, enums and theming notes are on the page instead of a repository away. It is the same file the package ships and Claude reads, rendered rather than restated, with links between docs navigating inside the demo and anchors scrolling to their section.
|
|
220
|
+
- 9de8a7d: The component demo opens on a landing page instead of on `Ripple`, which was simply the first page ever written. It says what the package is, shows a dozen live components, carries the install line and the Claude Code setup, and links to the source and to npm. A header on every page holds the theme swatches, the version and those links, so the demo is no longer a dead end.
|
|
221
|
+
- 9de8a7d: The component tiles on the demo's landing page and in the Theme Editor answer properly now. `Input` and `NumberInput` were controlled with an empty `onChange`, so they read every keystroke and dropped it, and `Dropdown` and `OtpInput` had no value at all, so a pick or a typed digit left no trace. `Chip` and `Stepper` respond to a click as well, and the landing shows `TabHeader` in place of the static `ProgressBar`.
|
|
222
|
+
- 60192e8: Four documented defaults now say what the code does. `KlipyPicker`'s `token` was described as falling back to a built-in demo key, which does not exist, so a first-time reader had no reason to pass one. `RadioGroup`'s and `Slider`'s `size` and `Timer`'s `size` were given as fixed pixel values, when all three scale with `--default-font-size`; the pixel figure only held at a 16px base, which the theme editor is built to change.
|
|
223
|
+
- 7f389b6: Fixed the `MultiSelect` custom-values example, whose unbalanced braces meant it could not compile
|
|
224
|
+
- 97b66ea: Docs: added the Slots lines for ActionIcon and Wizard, Keywords for Divider, Loading, Rating and ScrollbarProvider, removed the doc for the long-gone `Icon`, and added a test that fails the suite when a doc names an export, slot or component that does not exist
|
|
225
|
+
- 9de8a7d: The docs test that type-checks every example no longer fails on a busy machine. It compiles the whole barrel, which takes seconds rather than milliseconds, and it was running against vitest's default five-second limit.
|
|
226
|
+
- d144e01: Dropdown's trigger is now a `combobox` named by its label, so a screen reader reads the field name and then the selected value. It previously announced "open menu" and never mentioned either. The chevron beside it is hidden from assistive technology rather than offering the same control twice
|
|
227
|
+
- d144e01: Dropdown's list is now the listbox itself rather than wrapping one. It previously nested its options inside a focusable container with no role, which took the Tab that should have moved to the next field and gave the arrow keys a second, competing handler
|
|
228
|
+
- 9de8a7d: `Dropdown` fills its container instead of collapsing, matching `Input` and `MultiSelect`. Everything inside it is absolutely positioned, so as a flex or grid item it had no width of its own and shrank to the chevron, drawing its border through the label. In normal block flow nothing changes.
|
|
229
|
+
- 7f389b6: Rewrote the `IdleManager` doc, which described a callback API the component never had. It takes `idleAfterSeconds` and `renderCondition` and renders its children once the user goes idle, rather than taking `idleTimeout` and calling `onIdle`
|
|
230
|
+
- 7f389b6: Exported `IdleManagerProps`, which the doc already told consumers to import
|
|
231
|
+
- d144e01: InputDropdown's arrow keys now cycle rather than stopping. `↓` on the last suggestion went nowhere, so the list could only be walked back up; it now returns to the text you typed and carries on round to the first suggestion, which `↑` already did at the other end
|
|
232
|
+
- d144e01: Choosing a suggestion in InputDropdown with `Enter` no longer submits the form around it. The key selected the item and then fell through to the browser's implicit submission, so picking from the list submitted the form underneath the user. `Enter` with nothing highlighted still submits, as a text field should
|
|
233
|
+
- 9de8a7d: A click on a control inside a clickable `Card` or `InteractableDiv` no longer activates the container. Clicking into a card's text field counted as pressing the card, and rippled to say so, while a Space typed into the same field correctly did not: only the keyboard path checked where the event came from. Fields, links, buttons, tree nodes and anything else carrying an interactive `role` now own their clicks, and `Ripple` follows the same rule.
|
|
234
|
+
- d144e01: MultiSelect and InputDropdown now scroll their list as the arrow keys move the highlight past the edge. Neither ever did: the arrows move a highlight rather than the focus, so the browser does not scroll it into view on its own, and in a list taller than its panel the highlight walked out of sight
|
|
235
|
+
- d144e01: Dropdown, MultiSelect and InputDropdown now share one piece of arrow-key arithmetic, so they agree on where the highlight goes. MultiSelect's arrows no longer stop on an option that cannot be picked, whether it is disabled or blocked by `maxSelected`
|
|
236
|
+
- 453ca2c: Clicking near the end of an empty date or time field no longer swallows the next digit typed. A mask is as wide empty as full, so the caret could land past every slot with nowhere for the digit to go; it is now pulled back to the first slot still free
|
|
237
|
+
- 453ca2c: Typing a date or time with the separators the mask already draws no longer erases the digit before them, and a letter is ignored rather than deleting one. Forward Delete clears the digit ahead of the caret rather than the one behind, typing over a digit replaces it, and a value handed in from elsewhere is coerced to the mask rather than rendered raw
|
|
238
|
+
- 7f5261b: MCP server: every component doc is also exposed as a resource, so a component can be dropped into the conversation directly with `@ahrowe-ui:ahrowe-ui://docs/Button`
|
|
239
|
+
- 97b66ea: MCP server: `get_component_docs` now resolves any exported name (`ToastProvider`, `CardHeader`, `IconLoading`), search ranks hits in a component's name or summary above hits in its body, the docs index no longer appears as a component, tools carry read-only annotations, and the server reports the package version
|
|
240
|
+
- 97b66ea: Exported `IconPickerItem`, `IconPickerProps`, `InputDropdownItem`, `InputDropdownProps`, `InferGroupValues` and `MergedValues`, which the docs already told consumers to import
|
|
241
|
+
- f35bc0b: `--modal-body-bleed` now defaults to half of `--modal-gap` instead of `0.6em`, so where a scrolling body is clipped no longer drifts with the font size
|
|
242
|
+
- f35bc0b: A `Modal` is now capped the same way at every screen size, never coming closer to the edge than its own padding, instead of spanning the full width of a phone and cutting off its own rounded corners
|
|
243
|
+
- 7f5261b: Added `engines.node`, a `./package.json` export and the `claude`, `mcp`, `ai` and `agent` keywords, and corrected the repository URL
|
|
244
|
+
- 7f5261b: Fixed the published types for `moduleResolution: node16` / `nodenext`, where every declaration past the entry file failed to resolve and consumers silently got `any`, and for `require`, where the types described the package as ESM
|
|
245
|
+
- 9de8a7d: `Rating`'s filled stars line up with the empty ones behind them. The filled icon sat on a text baseline inside its clipping box, a fraction of a pixel below the icon it covers, so the clip cut its bottom off while the empty star showed through above it. A partial fill also keeps its shape where `icon` is not an `svg`, which the clip would otherwise squeeze rather than clip.
|
|
246
|
+
- 97b66ea: README: the MCP setup now points at `.mcp.json` / `claude mcp add --scope project`, which Claude Code reads, instead of `.claude/settings.json`, which it does not
|
|
247
|
+
- 60192e8: Four more stylesheets honour `prefers-reduced-motion: reduce`. `Wizard`'s step slide and `Drawer`'s width change now snap to the new state instead of animating to it, and the sweeping gradient behind a loading GIF in `KlipyPicker` holds still. The three were the last unintentional gaps; the loading spinners and Toast's progress bar keep moving on purpose.
|
|
248
|
+
- 453ca2c: Dropped `@mona-health/react-input-mask`, which cost eight packages of the previous generation (prop-types, object-assign, loose-envify, warning, invariant) for two fixed-digit masks. DatePicker and TimeInput now share an internal masked input. A consumer install is down from 24 packages to 16
|
|
249
|
+
- f35bc0b: The scroll fade now switches itself off under `prefers-contrast: more`, where dimming text at the edge costs contrast someone has asked for
|
|
250
|
+
- f35bc0b: The scroll fade on `ScrollFade` and `Modal` now eases in and out at each edge instead of switching on and off instantly
|
|
251
|
+
- f35bc0b: `Modal` and `Carousel` now share one scroll-fade mask instead of each carrying their own copy of the gradient
|
|
252
|
+
- f35bc0b: The scroll fade no longer marks an edge on a container whose overflow is `hidden` or `clip`, where it was dimming content that could not be scrolled to
|
|
253
|
+
- f35bc0b: `Menu`, `Dropdown` and `Popover` now document the `--sheet-*` dimensions they present with, which only `Modal` had spelled out
|
|
254
|
+
- f35bc0b: The `--sheet-*` custom properties are now declared on `ThemeVariables`, so they type-check in a `Theme` and show up in the theme editor
|
|
255
|
+
- 60192e8: The README says what the package supports before you install it: the browsers it is built for, what its accessibility work covers and what it does not, and what 0.x means for breaking changes. The rest of it is shorter.
|
|
256
|
+
|
|
257
|
+
## 0.35.0
|
|
258
|
+
|
|
259
|
+
### Minor Changes
|
|
260
|
+
|
|
261
|
+
- 7042104: `ColorPicker`'s saturation and brightness square can be used without a mouse. It was the one control in the panel with no keyboard path, so a keyboard user could set hue, alpha and a hex value but never move the cursor in the square itself. The arrows now walk it a percent at a time and `Shift` ten, `Home` and `End` take saturation to either end and `PageUp` and `PageDown` do the same for brightness. It reports itself as a slider on the horizontal axis, with both numbers in `aria-valuetext`, and carries two new `labels` keys for that text.
|
|
262
|
+
- a74ea62: New `lightTheme`, the light sibling of the built-in dark `defaultTheme`. It keeps the brand colour and inherits everything it does not flip, so `<ThemeProvider themes={[defaultTheme, lightTheme]}>` is a working light/dark pair.
|
|
263
|
+
- a74ea62: `@modelcontextprotocol/sdk` and `zod` are no longer runtime dependencies. They served only the `ahrowe-ui-mcp` binary, which every consumer downloaded but few run; the binary now bundles them and behaves the same.
|
|
264
|
+
- a74ea62: React 19 is now the minimum. `peerDependencies` said `>=18` while `Button` already took its `ref` as a plain prop, which only works from React 19 on, so the old range was never true.
|
|
265
|
+
- a74ea62: Every component that takes a ref now takes it as a plain prop instead of through `forwardRef`. `Ripple`, `VirtualList`, `InteractableDiv`, `Tilt`, `Flip`, `Timer`, `RoomDrawer` and `RoomViewer` are unchanged for callers; `VirtualList` keeps its generic without the cast that `forwardRef` used to need.
|
|
266
|
+
- a74ea62: `Input`, `Textarea`, `NumberInput`, `SearchInput`, `Checkbox`, `Switch`, `ActionIcon`, `OtpInput` and `Card` accept a `ref`. The four field components hand you the inner `<input>` or `<textarea>` rather than their wrapper, which is what focusing one needs.
|
|
267
|
+
- a74ea62: `Tooltip` takes `labels`, for translating the accessible name of the `details` badge.
|
|
268
|
+
- a74ea62: Every published module is now marked `'use client'`. The package can be imported straight into a React Server Components app (Next.js App Router and the like) without a wrapper; outside one the directive is inert.
|
|
269
|
+
|
|
270
|
+
### Patch Changes
|
|
271
|
+
|
|
272
|
+
- a74ea62: `Accordion`'s header toggles on Space as well as Enter and reports its state through `aria-expanded`, naming the body it controls. It previously announced nothing, so a screen reader user could not tell whether a section was open.
|
|
273
|
+
- a74ea62: A Space pressed inside an open `Accordion` no longer collapses it. Keydown bubbles, so typing a space into a field in the body reached the header's handler, which then called `preventDefault()` and swallowed the character.
|
|
274
|
+
- 7042104: `ColorPicker`'s hue and alpha sliders show that they have the focus. Both set `outline: none` to drop the browser's default ring, which is drawn around the track, and never replaced it, so a keyboard user walking the panel had nothing to go on. They now ring the thumb, which is what the arrow keys move, the way `Slider` marks its own.
|
|
275
|
+
- a74ea62: Twenty-two more stylesheets honour `prefers-reduced-motion: reduce`. Entrances, slides, chevron rotations and the ink ripple stop; fades and colour changes stay, as do the loading spinners and Toast's progress bar, which would state something untrue if frozen.
|
|
276
|
+
- a74ea62: `SpinnerLoading` no longer sets `defaultProps`, which React 19 ignores on a function component.
|
|
277
|
+
- a74ea62: `Tooltip` is readable by a screen reader. The bubble carries `role='tooltip'` and describes the element it sits inside through `aria-describedby`; the `error` variant is `role='alert'` instead, since it appears in answer to something the user just did.
|
|
278
|
+
- a74ea62: `Tooltip`'s `details` badge is reachable from the keyboard. It opens on focus as well as hover and toggles on Enter and Space, where before a pointer was the only way to read what it explains.
|
|
279
|
+
|
|
280
|
+
## 0.34.0
|
|
281
|
+
|
|
282
|
+
### Minor Changes
|
|
283
|
+
|
|
284
|
+
- 7faf4d1: New `Menu`: a list of actions on a trigger of your choosing, with icons, shortcut hints, disabled and destructive entries, separators and headings. It is `Popover` with the list written once instead of in every consumer, so it carries `role="menu"`, arrow keys that skip disabled entries and wrap, Home/End, typeahead, Escape back to the trigger, and a trigger that announces itself as a menu button.
|
|
285
|
+
- 286849f: `Menu` and `SplitButton` put the focus on an entry only when the keyboard opened them. A click leaves the focus on the trigger with nothing marked, because a highlight that does not follow the mouse reads as a selected entry, and the first `ArrowDown` or `ArrowUp` on the trigger moves into the list. Opening with `Enter`, `Space` or an arrow key is unchanged.
|
|
286
|
+
- ee60f00: **Breaking:** `FloatingMenu` is gone. It and `Popover` were the same thing — a portaled panel anchored to a trigger, with the same flip, clamp, sheet and outside-click machinery — and `Popover` did all of it plus four sides, optional arrow, hover and focus triggers and delays. Replace `<FloatingMenu>` with `<Popover>`: `align={Align.Left|Center|Right}` becomes `align={PopoverAlign.Start|Center|End}` with `placement={PopoverPlacement.Bottom}`, `dontCloseOnChildClick` is gone because a click inside the panel never closes it, and the slots `menu` and `menuContainer` are now `floating` and `panel`. `ComponentDefaults.FloatingMenu` is gone with it; set those defaults under `Popover`.
|
|
287
|
+
- ee60f00: Popover gained the behaviour its consumers needed to take FloatingMenu's place: `focusOnOpen` (`'keyboard'` by default: the panel takes the focus when the keyboard opened it, because it is portaled to the end of the document and Tab never reaches it, and leaves the focus alone when a pointer opened it, so a click into a field keeps the caret; `true` and `false` force either), `closeOnTriggerClick` (off for a field that opens a picker, where a click to place the caret must not close the panel), `width='trigger'` for a list that lines up with its field, and `constrainWidth` to lift the readable-measure cap for a calendar or a media grid. `ArrowDown` and `ArrowUp` on the trigger open it.
|
|
288
|
+
- 286849f: **Breaking:** `Popover` generates no box of its own. Its root and its trigger wrapper are both `display: contents`, so your trigger sits in your layout exactly as it would without Popover around it: it is the flex item, the block-level child, and a row that stretches its children now reaches it rather than stopping at a wrapper. A `className`, `style` or `classNames.root` on Popover can no longer paint a background, padding or a border, because there is no box to paint on; style the trigger you pass in instead. This is what left `SplitButton`'s chevron shorter than the button beside it and doubled the border overlap between them.
|
|
289
|
+
- 286849f: `Popover`'s `onOpenChange` now receives `{ fromKeyboard }` alongside the new open state, so a consumer that manages its own focus can tell a key from a pointer without repeating the detection. Existing callbacks are unaffected.
|
|
290
|
+
- ee60f00: **Breaking:** `SplitButton`'s `align` prop takes `PopoverAlign` instead of the removed `Align`. `Align.Right` (the default) becomes `PopoverAlign.End`, `Align.Left` becomes `PopoverAlign.Start`.
|
|
291
|
+
|
|
292
|
+
### Patch Changes
|
|
293
|
+
|
|
294
|
+
- aa01c6b: `ActionIcon` is as wide as its icon rather than as wide as its container. The div underneath is block-level, so anywhere but a flex row it spanned the line and the empty space beside the icon answered a click.
|
|
295
|
+
- 888566c: `Breadcrumb`'s overflow ellipsis says whether it is open, through `aria-expanded`. It stays a disclosure rather than a menu button: what it reveals is a list of navigation links, and announcing them as commands would be a worse description than none.
|
|
296
|
+
- 1bc6545: `ColorPicker` can be opened and used without a mouse. Its swatch carries the click handler on the `Popover` wrapped around it, so it had neither a tab stop nor a button role of its own and the whole control was unreachable from the keyboard. `Enter` now opens the panel onto the hue slider, `Tab` walks the rest of it, and `Escape` hands the focus back to the swatch.
|
|
297
|
+
- ebeb3a7: `Dropdown` opens when its chevron is pressed while the dropdown already has the focus. The value button and the chevron carry the same toggle handlers, and the blur the press caused on the value button cancelled the toggle the click had just performed, so the arrow did nothing.
|
|
298
|
+
- 9e0de85: `Dropdown` and `InputDropdown` open their lists through `Popover` instead of positioning, portalling and stacking them by hand. Both drop their own `BodyEnd`, their own overlay registration and, for `Dropdown`, its own bottom-sheet and backdrop code, and both inherit `Popover`'s fractional-pixel alignment.
|
|
299
|
+
- aa01c6b: `InteractableDiv` answers Enter and Space with a real click instead of calling its own `onClick` directly, the way a native button does. Its handler now receives a `MouseEvent` rather than a keydown wearing one, and the activation reaches a handler above it, which is what a `Menu` or `Popover` wrapped around such a trigger needs: an `ActionIcon` opening a menu could be focused and pressed with nothing happening.
|
|
300
|
+
- aa01c6b: `Tab` out of a `Menu` carries on past the trigger from any entry, and `Shift+Tab` hands the focus back to the trigger. Both used to close the menu and leave the focus to the browser, which took it from an entry that was being removed and landed at the top of the document; only the last entry behaved.
|
|
301
|
+
- 286849f: The row a keyboard user is on is visible again in every panel that opens over the page. `Menu`, `SplitButton`, `Breadcrumb`'s overflow list and `VirtualList`'s column menu drew their highlight in `--background-accent-light`, which the default theme sets to the same colour as the `--background-modal` panel underneath, so the highlighted row looked exactly like the rest; `DatePicker` marked today the same way. They now use `--background-accent`, as `Dropdown` and `MultiSelect` already did, and the lists that take the focus when the keyboard opens them highlight on `:focus` as well as on hover.
|
|
302
|
+
- 3e7397c: A `Popover` that stops matching its trigger's width gives that width back. The minimum `width='trigger'` writes onto the panel was never removed, so a popover switched to `width='auto'` while open, or turned into a bottom sheet, kept the width it was given as an anchored panel: the panel is the same element across that switch, and an inline width outranks whatever class it switches to.
|
|
303
|
+
- ee60f00: Popover no longer closes when something inside its panel that portals elsewhere is used, such as a `Dropdown` list inside a `DatePicker` calendar; its stacking level matches every other portaled surface, so a list opened from inside a panel is no longer covered by it.
|
|
304
|
+
- 286849f: A `Popover` panel whose width is fractional lines up with its trigger exactly. The panel was measured with `offsetWidth`, which rounds to whole pixels, so an end-aligned panel could sit up to half a pixel past the edge it was aligned to. It showed as daylight between a `SplitButton`'s menu and the button that opens it.
|
|
305
|
+
- ee60f00: The `Presentation` enum moved out of the deleted `FloatingMenu` into `ConfigProvider`, which owns the app-wide switch that sets it. Importing it from `@ahrowe/ui` is unchanged.
|
|
306
|
+
- aa01c6b: `SplitButton`'s dropdown is a `Menu` rather than a list of its own, so it gains typeahead, a trigger that announces itself as a menu button, and the same rows as every other menu in the library. Its props, slots and `SplitButtonAction` shape are unchanged, and the rows are styled a touch differently now that they come from `Menu`.
|
|
307
|
+
- aa01c6b: A `Popover` whose panel holds a roving tabindex, where one entry of a list is the tab stop and the rest are reached with the arrow keys, now finds its Tab boundary on the entry the user is standing on rather than on the last one in the list. Every enabled button counted as a tab stop, whatever its `tabindex`.
|
|
308
|
+
- de89304: A `Toast` fits a screen narrower than its own minimum width. It could not shrink below 15em, so below about 270px it hung off the edge opposite the one it is pinned to.
|
|
309
|
+
- 73008f1: `Tooltip` is placed by the same engine as every other anchored surface, and `useFloatingPosition`, the second positioning engine the library carried, is gone. The bubble is now the positioned element rather than sitting inside a zero-height wrapper the width of its trigger, so it takes its side, its alignment and its flip from `usePopoverPosition`. Its measured geometry is unchanged: same edges, same six-pixel gap, same arrow on the trigger's centre.
|
|
310
|
+
- de89304: A `Tooltip` stays on screen, and stays attached to what it points at. A long message used to run off the right edge, because a bubble wider than the viewport cannot be shifted back into view, only pushed off one side; it now takes the screen as a maximum and wraps. An error bubble is aligned to the trailing edge of its field, and where the room to the left of that edge ran out it was shifted sideways instead, overhanging the field by up to 32px with its arrow pointing past the end of it; it now wraps one more line and stays flush. Below 160px of room it still shifts, since a trigger that close to the screen edge is better served by a bubble that overhangs it. Both bubbles also set `box-sizing: border-box` themselves rather than leaning on the consumer's reset for that maximum to mean what it says.
|
|
311
|
+
|
|
312
|
+
## 0.33.0
|
|
313
|
+
|
|
314
|
+
### Minor Changes
|
|
315
|
+
|
|
316
|
+
- 2eb0e4b: Card, Chip, EmptyState, ProgressBar, SearchInput and Drawer expose `classNames`/`styles` slots, and Drawer and ConfirmModal accept the native attribute set on their root, so the customisation contract holds for them as it already did elsewhere.
|
|
317
|
+
- 0a7c805: `DatePicker` accepts the native attribute set on its root (`id`, `data-*`, `aria-*`, event handlers) and both it and `NumberInput` now expose `classNames`/`styles` slots, which every other component already had. DatePicker: `root` `input` `header` `monthDropdown` `yearDropdown` `calendar` `clearButton`. NumberInput: `root` `input` `arrows` `increaseButton` `decreaseButton`.
|
|
318
|
+
- 2eb0e4b: **Breaking:** Dropdown's five per-element class props are replaced by the `classNames`/`styles` slots every other component uses. `inputClassName` → `classNames.control`, `dropDownInputClassName` → `classNames.field`, `dropDownIconClassName` → `classNames.icon`, `dropDownClassName` → `classNames.option`, `labelClassName` → `classNames.label`, and `list`, `placeholder` and `root` are reachable now too. Fab and ColorPicker gained slots as well, so every component with inner elements has them.
|
|
319
|
+
|
|
320
|
+
### Patch Changes
|
|
321
|
+
|
|
322
|
+
- 2eb0e4b: Fixed Fab dropping a `className` passed to it: the root's own class overrode it.
|
|
323
|
+
- 2eb0e4b: Fixed ProgressBar applying the root's `style` to every filled segment as well, which is what `styles.fill` is for.
|
|
324
|
+
- 2eb0e4b: SearchInput's result count was English whatever the app was; it is now `labels.results(count)`.
|
|
325
|
+
|
|
326
|
+
## 0.32.0
|
|
327
|
+
|
|
328
|
+
### Minor Changes
|
|
329
|
+
|
|
330
|
+
- 6b118e3: `DatePickerProps` is now exported from the package, alongside every other component's props type. It moved into `datePicker.types.ts`, where the project keeps component types, and each prop carries documentation that shows up in your editor.
|
|
331
|
+
- 50c1feb: **Breaking:** the per-string label props are gone; every component's own text now lives in its `labels` object, so there is one convention instead of two. Rename as follows: `ActionButtons` and `ConfirmModal` `submitLabel`/`cancelLabel` → `labels.submit`/`labels.cancel`; `Tree` `emptyLabel` → `labels.empty`; `MultiSelect` `emptyLabel`/`createLabel`/`searchPlaceholder` → `labels.empty`/`labels.create`/`labels.searchPlaceholder`; `NumberInput` `increaseLabel`/`decreaseLabel` → `labels.increase`/`labels.decrease`; `Chip` `removeLabel` → `labels.remove`. The values themselves are unchanged, and `ConfigProvider` entries move the same way (`ConfirmModal: { labels: { submit: 'OK' } }`).
|
|
332
|
+
- 50c1feb: Every string the components render of their own is now translatable through a `labels` prop, on the component or app-wide through `ConfigProvider`, where the keys merge individually so an instance can override one without dropping the rest. Covers Alert, Breadcrumb, Carousel, ColorPicker, Input, Modal, MultiSelect, OtpInput, Pagination, SplitButton, Timer, Toast and VirtualList; RoomDrawer's existing labels gained the three strings that were still hardcoded.
|
|
333
|
+
- 50c1feb: More text moved behind `labels`: Pagination's first/previous/next/last controls, Input's password toggle and search clear, EmptyState's fallback line and KlipyPicker's search label were still English no matter what the app was.
|
|
334
|
+
|
|
335
|
+
### Patch Changes
|
|
336
|
+
|
|
337
|
+
- 50c1feb: RoomDrawer and RoomViewer are no longer marked beta.
|
|
338
|
+
- 50c1feb: VirtualList: `resetColumnWidthsLabel` moved into the new `labels` prop as `labels.resetColumnWidths`, alongside the table's other strings.
|
|
339
|
+
|
|
340
|
+
## 0.31.0
|
|
341
|
+
|
|
342
|
+
### Minor Changes
|
|
343
|
+
|
|
344
|
+
- 3a120fa: VirtualList: resizable columns via `resizableColumns`. Drag a column's trailing edge, double-click it to fit the content, or resize from the keyboard; widths persist with `persistColumnsKey`, can be controlled with `columnWidths`/`onColumnWidthsChange`, and are undone from the gear menu (labelled with `resetColumnWidthsLabel`) or `resetColumnWidths()` on the ref.
|
|
345
|
+
- a23fbac: VirtualList: sortable columns. A column with `sortValue` or `compare` is sorted by the list itself, one with `sortable` only reports through `onSortChange` for server-side sorting, and `sort`/`defaultSort` control the asc/desc/unsorted cycle.
|
|
346
|
+
- bf06ec1: VirtualList: the table header is now a single tab stop with arrow-key navigation between the select-all box, the column headers and the column menu, instead of one stop per interactive element.
|
|
347
|
+
- 3fa5068: VirtualList: arrow-key navigation over the rows. The list takes one tab stop, the arrows move an active row, `Enter` fires `onRowClick` and `Space` toggles the selection; per-row checkboxes are no longer separate tab stops. `F2` steps into a row's own controls and `Escape` steps back out; controls inside rows are held out of the tab order until their row is entered, so the tab order no longer depends on which rows happen to be rendered. Turn it off with `keyboardNavigation={false}`.
|
|
348
|
+
|
|
349
|
+
### Patch Changes
|
|
350
|
+
|
|
351
|
+
- f608dbc: VirtualList now assumes the average of the rows it has measured for the ones it hasn't, instead of `estimatedRowHeight` forever. A jump into rows that had never been rendered used to compound that estimate's error over the distance and land many rows off; it now lands on the row asked for, and the scrollbar reflects the real content length sooner.
|
|
352
|
+
- f608dbc: Fixed `scrollToIndex` landing short of the requested row in a table: the sticky header was subtracted from the target although the row offsets already clear it, which put every alignment one header height too low.
|
|
353
|
+
|
|
354
|
+
## 0.30.0
|
|
355
|
+
|
|
356
|
+
### Minor Changes
|
|
357
|
+
|
|
358
|
+
- 1bb179b: `--primary-gradient` now also reaches the three accent borders that read as brand marks: the default-style `Alert` and `Toast` left borders and the active `TabHeader` indicator. A border cannot hold a gradient, so each is painted as a background layer sized to the border and anchored to the border box, with the existing solid border left in place as the no-gradient fallback. Focus rings and every other primary border stay solid.
|
|
359
|
+
- 2a00a51: A theme can now give the brand a gradient through the new `--primary-gradient` variable. It is layered over `--primary-color` on the filled surfaces large enough to show a ramp: primary `Button`, primary `Chip`, `ProgressBar` fill, checked `Switch` track, `Slider` range, active `Pagination` page, selected `OptionPicker` option and primary `Badge`. `--primary-color` stays required and stays a solid, because borders, outlines, SVG strokes, shadows and text read it and a gradient is invalid in all of them. Leaving `--primary-gradient` unset keeps the current flat look, and setting it to `none` on a subtree turns it off there.
|
|
360
|
+
|
|
361
|
+
### Patch Changes
|
|
362
|
+
|
|
363
|
+
- a3bc2c1: The Accordion header is taller and no longer cramped. A hardcoded height clamped it to 34px, so its padding never had room to show; the height is now simply that padding plus the title's line, which comes to 44px at a 16px base.
|
|
364
|
+
- 30e5fa0: Content rendered through `BodyEnd` now keeps the theme of the nearest `ThemeProvider` it was written under, rather than whichever one happens to wrap `#bodyEnd`. A Tooltip, Dropdown, ColorPicker, FloatingMenu, Popover, Modal or Toast opened from inside a nested theme used to render in the outer theme instead. The variables are applied through a `display: contents` wrapper, so positioning, stacking and clipping are unchanged, and no wrapper is added when there is no provider above.
|
|
365
|
+
- a3bc2c1: A checked Checkbox is now exactly the size of an unchecked one. The fill used to be the tick's own svg, sized past the outline and nudged into place, which left it two to three pixels proud on every edge; the box paints its own background instead. A custom `background` colours the border to match.
|
|
366
|
+
- 72228c6: ColorPicker's `value` accepts any CSS colour the browser understands — `rgb()`, `hsl()`, named colours, shorthand hex, `oklch()` and other wide-gamut syntaxes — instead of hex alone. Previously anything else was silently replaced by the component's default blue, so a consumer passing `rgb(255, 0, 0)` saw blue. `onChange` still emits hex.
|
|
367
|
+
- 11514b8: InputDropdown, SearchInput, MultiSelect, DatePicker and TimeInput set `autocomplete="off"`. Each renders its own suggestion list, and the browser's autofill dropdown was opening on top of it. Plain `Input` is deliberately unchanged: autofill and password managers are usability features, and a field with no list of its own has nothing to collide with.
|
|
368
|
+
- a3bc2c1: Components are sized by the theme's text instead of by fixed pixels. Accordion, Alert, Button, Card, Checkbox, ColorPicker's swatch, IconPicker, KanbanBoard's spinner, OtpInput, RadioGroup, Rating, Slider, Timer, Toast and Tooltip each had lengths pinned in `px` or `rem` while their labels followed `--default-font-size`, so raising the base font grew the text inside controls that stayed put: the Timer's digits overflowed its ring, IconPicker's glyphs outgrew their backgrounds and Button's padding stopped matching its label. Every one of them now measures from the font it carries, and Checkbox, ColorPicker, RadioGroup, Rating, Slider and Timer expose the size as a theme variable. At a 16px base nothing moves.
|
|
369
|
+
- a3bc2c1: Removed two rules that nothing could apply: a `padding: 0` on a Button small-size class that was never set on an element, and a `mix-blend-mode` in ProgressBar's stylesheet, which has no slots API to reach it.
|
|
370
|
+
- a3bc2c1: Fab is themeable: `--fab-size`, `--fab-mini-size` and `--fab-icon-size` replace the hardcoded 56px, 40px and 18px, and the icon box, including the layer that cross-fades the two icons, follows the icon size rather than clipping anything larger to a square. The three are deliberately not tied to `--default-font-size` — a FAB is a touch target holding an icon, not a text element — but a consumer who wants that coupling can now write it. The variable Fab sets on itself is no longer called `--icon-size`: custom properties inherit, so that generic name reached every descendant.
|
|
371
|
+
- 72228c6: ProgressBar's label, Input's date-field icon and Checkbox's icon no longer hardcode their colour. They take `--text-on-primary` (the label sits on the `--primary-color` fill), `--input-icon-color` (the token every other input icon already used) and `--text-dark`, so all three follow the theme instead of a fixed white or grey.
|
|
372
|
+
- a3bc2c1: A selected icon in IconPicker draws in `--text-on-primary` instead of inheriting the page's `--text-color`, which made the same selected state render white on a dark theme and near-black on a light one. Its error border also takes `--error-color` rather than a hardcoded `red`.
|
|
373
|
+
- 11514b8: Input handles browser autofill. Chrome fills a field on page load by writing the DOM value directly, without firing anything React can observe, so the component believed it was still empty: the floating label sat on top of the autofilled text and the Material placeholder faded in over it on focus. Input now detects autofill through an animation bound to `:-webkit-autofill` — the only notification the browser offers — and replays the filled text through its normal change path, so `parse`, the form validator and `onChange` all see it as if it had been typed. A consumer's own `onAnimationStart` is forwarded rather than replaced, and the two internal autofill animations are not leaked to it.
|
|
374
|
+
- 11514b8: Autofilled inputs keep the theme. Chrome paints `:-webkit-autofill` with its own background and text colour, overriding both outright — on a dark theme a filled field came out pale blue with near-black text. Input now clips that background to the text and sets `-webkit-text-fill-color`, so an autofilled field shows the theme's text on whatever surface is genuinely behind it, inside a Modal or a Card as much as on the page.
|
|
375
|
+
- 11514b8: Reworked the demo site's Theme Editor into a tool for building a theme. It previews every themeable component live on the theme's own background, lists every variable on `ThemeVariables` grouped and annotated from the type itself, and links the two: clicking a component filters the list to the variables it reads directly or through what it renders, and hovering a variable rings every component it reaches. Colours are normalised through the browser's own parser, so a theme written in `oklch()` or shorthand hex no longer shows the picker's default blue.
|
|
376
|
+
- 2a00a51: The theme-switch colour fade now applies regardless of stylesheet order. Its rule tied on specificity with any component that declares its own `transition` (`Drawer`'s `transition: width`, for one), so which of the two a component got was decided by whichever stylesheet the bundler emitted last, and a component could silently stop fading on a theme switch when that order moved.
|
|
377
|
+
- 72228c6: The remaining 24 theme variables are now declared on `ThemeVariables`: all eight `--timeline-*`, the `--pagination-*`, `--rating-*`, `--tree-*` and `--multi-select-*` sets, `--timer-ripple-color`, `--spacing-xs`, `--error-font-color`, `--light-background-color` and `--monospace-font`. Every variable a component reads is now on the published type, which also makes Timeline's doc claim that its variables are typed there true.
|
|
378
|
+
- 72228c6: Fixed Timeline losing its vertical spine when only some items had an icon. An icon dot is twice the width of a plain one and the marker took its width from the dot inside it, so every row put its dot and its content column at a different x. Markers are now as wide as the widest dot whenever any item has an icon; a timeline without icons is unchanged.
|
|
379
|
+
- a3bc2c1: Tooltip takes its colours from the theme. The bubble, arrow and details badge no longer hardcode `#454953` and `white`: they read `--tooltip-background` and `--tooltip-color`, which default to an inverse of the page — dark on a light theme, light on a dark one — so a tooltip always separates from what it floats over, where the old fixed slate sat almost invisibly on a dark background. The error variant reads `--error-color` rather than the `--red` palette primitive, so redefining the error colour alone now applies. A light theme looks as it did.
|
|
380
|
+
|
|
381
|
+
## 0.29.1
|
|
382
|
+
|
|
383
|
+
### Patch Changes
|
|
384
|
+
|
|
385
|
+
- 7e87b38: RoomViewer and RoomDrawer draw walls as mass rather than as ink: the body and its edge are now mixed towards the canvas instead of sitting at the text colour, so a wall reads as a solid body with a soft rim instead of a drafted slab inside a hairline. Override with `--plan-wall-fill` and `--plan-wall-outline` as before.
|
|
386
|
+
- 3ddba0b: Fixed Space and Enter inside a nested input being swallowed by clickable containers (InteractableDiv, Card, Chip, Flip, DropZone). Keyboard activation now only fires for keys pressed on the container itself.
|
|
387
|
+
- fd9bc93: The 15 `--plan-*` floor plan variables are now declared on `ThemeVariables`, so a `Theme` gets them with autocomplete and their fallbacks documented in the editor, the way every other component's variables already were. They were previously reachable only through the interface's index signature.
|
|
388
|
+
- 7e87b38: Wall corners are rounded by default, which also removes the mitre spike an acute junction could throw. Set `--plan-wall-join: miter` for the drafting corner; `--plan-wall-miter-limit` still governs it when you do.
|
|
389
|
+
- 7e87b38: Fixed the RoomDrawer snap guide and its marker staying on the canvas after the wall chain ended. Only a pointer release used to clear the hint, so finishing a chain with Escape or Enter, or switching tool mid-chain, left a construction line and a small square behind with nothing to explain them.
|
|
390
|
+
|
|
391
|
+
## 0.29.0
|
|
392
|
+
|
|
393
|
+
### Minor Changes
|
|
394
|
+
|
|
395
|
+
- d8a99f4: `Slider` takes a `range` prop for two thumbs and `[from, to]` values, with `minRange` to hold the ends apart and one `role="slider"` per thumb inside a `role="group"`; `range` is discriminated rather than widening `value`, so existing single-thumb usage is untouched
|
|
396
|
+
|
|
397
|
+
## 0.28.0
|
|
398
|
+
|
|
399
|
+
### Minor Changes
|
|
400
|
+
|
|
401
|
+
- 9e52598: InputDropdown now caps how many filtered matches it renders via a new `maxItems` prop (default `100`, `0` for all), so a long `items` list no longer builds thousands of DOM nodes for a six-row scroll box.
|
|
402
|
+
- 6719e99: Added `MultiSelect` for picking several options from a list: chips for the selection, a floating label notched into the border like `Input`'s, optional search, an `allowCustomValues` tag-entry mode, a `maxSelected` cap, FormValidator support, bottom-sheet presentation on small touch screens, slots and `ConfigProvider` defaults
|
|
403
|
+
- 1db4646: Added `Pagination` for server-paged results: page numbers with collapsed gaps, previous/next and optional first/last controls, `siblings`/`boundaries` to size the window, slots and `ConfigProvider` defaults
|
|
404
|
+
- 5a2f798: Added `Tree` for hierarchical lists: expand/collapse, single selection, per-node icons, full arrow-key navigation, flat `aria-level` rows rather than nested lists, and a `height` prop that windows those rows through `VirtualList` for trees too large to keep in the DOM
|
|
405
|
+
- 5a2f798: Added `ariaRoles` to `VirtualList`, so a caller windowing non-list content can replace the `list`/`listitem` roles it puts on its container and rows
|
|
406
|
+
|
|
407
|
+
### Patch Changes
|
|
408
|
+
|
|
409
|
+
- 8b8382d: Fixed `Accordion` keeping collapsed content focusable: the collapsed body is now `inert`, so it stays out of the tab order and out of the accessibility tree
|
|
410
|
+
- 895ac3d: Fixed `ColorPicker` altering a colour it was given: hue, saturation, value and alpha were rounded on the way into its internal HSV state, so `#3b82f6` was displayed and emitted as `#3b82f5`
|
|
411
|
+
- 895ac3d: Fixed `ConfirmModal` letting a rejected `onConfirm` escape as an unhandled promise rejection; the dialog still stays open so the user can retry
|
|
412
|
+
- 55dc04c: Fixed `DropZone` and `Overscroll` writing their latest-props refs during render, and `GifView` resetting its loading flag in an effect, so all three stay correct when React discards a render
|
|
413
|
+
- 55dc04c: `IdleManager` no longer dismisses the idle content when `idleAfterSeconds` changes: the countdown restarts, but only real user activity hides what is already on screen
|
|
414
|
+
- 55dc04c: Fixed an auto-resizing `Textarea` keeping a stale height: it now re-measures whenever the value changes from outside its own change handler (the clear button, a parent reset, `formValidator.set`), and releases the height it set when `autoResize` is turned off
|
|
415
|
+
- 1d143ed: Fixed a Popover whose content changes size while open (an async body loading in, a list filtering down) staying at coordinates computed for its old height instead of re-anchoring to its trigger.
|
|
416
|
+
- 1d143ed: Extracted the shared anchoring lifecycle behind `useAnchorTracking`, so `useFloatingPosition` and `usePopoverPosition` now hold only their own geometry instead of each repeating the mount wait, scroll-ancestor resolution, listener wiring and teardown.
|
|
417
|
+
|
|
418
|
+
## 0.27.0
|
|
419
|
+
|
|
420
|
+
### Minor Changes
|
|
421
|
+
|
|
422
|
+
- a597b4a: Added `detachWall`, which pulls a wall off the nodes it shares with its neighbours and bridges each old corner to the new one
|
|
423
|
+
- 02f4778: Added `buildPlanMesh`, which turns a storey into triangles: wall solids with their openings cut out, and a slab under each room. It returns plain `positions` / `normals` / `indices` arrays and pulls in no dependency, so the same plan feeds three.js, Babylon, a glTF writer or anything else without this package having an opinion about which. Openings are cut by splitting the wall into prisms rather than by subtracting solids, so a window keeps its upstand and lintel and no CSG is needed, storeys stack without intersecting — a slab hangs below its finished floor level and the walls clothe it — and corners are mitred, so two walls meeting at one do not leave a notch cut through the full height of the joint.
|
|
424
|
+
- a597b4a: RoomDrawer: hold Ctrl/Cmd while dragging a wall to detach it from its corners, so a partition joining that wall stays where it is instead of being dragged along
|
|
425
|
+
|
|
426
|
+
### Patch Changes
|
|
427
|
+
|
|
428
|
+
- a597b4a: Fixed a wall squashed to zero length leaving two corners stacked on the same point, which split the plan and made it report as repaired when reloaded; its ends now weld together, in the drawer and in `cleanupPlan`
|
|
429
|
+
|
|
430
|
+
## 0.26.0
|
|
431
|
+
|
|
432
|
+
### Minor Changes
|
|
433
|
+
|
|
434
|
+
- 7c3543d: Rooms in a FloorPlan are derived from the enclosed faces the walls form rather than stored as polygons, so free-standing interior walls and automatic room backgrounds work without a separate drawing mode, and a room keeps its name through reshaping, splitting and merging.
|
|
435
|
+
- 6acbb5d: Added floor operations to the plan model: `addFloor`, `duplicateFloor`, `removeFloor`, `moveFloor`, `renameFloor`, `floorIndex` and `floorBelow`. Each re-stacks the elevations so every storey sits on the one below, rather than leaving a gap that only shows up in 3D, and `duplicateFloor` regenerates every id and rewires every reference so two storeys can never share geometry.
|
|
436
|
+
- 6acbb5d: Added `planToJson` and `planFromJson` for reading and writing a plan as JSON, which is the interchange format. Reading is defensive, because a file off a disk is untrusted and whatever comes out of it is rendered immediately: the plan is rebuilt field by field rather than cast, unambiguous problems are repaired, and everything that had to be dropped or fixed comes back alongside the plan.
|
|
437
|
+
- 7c3543d: Added planFromLegacySvg for converting floor plans exported by the previous RoomDrawer into the new model, collapsing each duplicated room boundary into the single shared wall it should always have been.
|
|
438
|
+
- 7c3543d: Added the FloorPlan model, a shared planar wall graph in which walls are first-class and shared between adjacent rooms, so two rooms drawn flush against each other have one wall between them rather than two coincident ones.
|
|
439
|
+
- 7c3543d: Openings in a FloorPlan belong to a wall and carry a kind (door, window, archway or gap) plus width, sill and head, so a door between two rooms is cut once and both rooms open through it.
|
|
440
|
+
- 7c3543d: Added resolveSnap, which separates snapping from coordinate conversion and measures every tolerance in screen pixels, so snapping keeps working at any zoom level and can be suspended for a single gesture.
|
|
441
|
+
- 7c3543d: Added buildWallPaths for rendering walls with real thickness as two stroked passes over the same path data, including the mitred corners, junction fills and jamb, free-end and thickness-step caps that the two passes cannot produce on their own.
|
|
442
|
+
- 063d82f: Added a `wallIds` option to `buildWallPaths`, building the same paths for a subset of walls. Node degrees still come from the whole floor, so chains break and corners fill exactly where they do in the full drawing and the result lands precisely on top of it.
|
|
443
|
+
- 063d82f: A room is marked by colouring the walls that bound it, and hovered by a faint tint of its floor. The two states use different channels so they can be told apart at a glance: hover is fleeting and asks which room is under the pointer, where a fill is instant and a shared wall is ambiguous between the rooms either side of it; selection is state you then work inside, where a wash over the room would bury its doors and its label. The selection highlight is built from the same geometry as the walls and drawn in the same two passes, so a doorway in the boundary stays open and the wall keeps its edge, and a wall shared by two selected rooms is drawn once. Set `--plan-room-fill-hover`, `--plan-room-edge-selected` and `--plan-room-edge-selected-fill`, or style the fill through its `data-state` attribute.
|
|
444
|
+
- 7c3543d: RoomDrawer can add a corner part-way along a wall: selecting a wall shows a handle at its midpoint that splits the wall and places the new corner in one drag, with an equivalent Add corner button in the inspector for keyboard use.
|
|
445
|
+
- fef00b0: RoomDrawer gains a latching angle lock, snap toggle and grid toggle in its toolbar on the L, S and G keys, with Shift and Alt as momentary overrides of whichever state is latched. It draws the construction lines explaining what the pointer snapped to and shows the live angle beside the length, so snapping reads as guidance rather than as the cursor being moved somewhere it was not asked to go. Angles can be measured from a reference direction as well as from the world axes, so a wall can be drawn square to the wall it continues rather than only square to the page.
|
|
446
|
+
- 7c3543d: **Breaking.** RoomDrawer is a controlled or uncontrolled editor over the shared FloorPlan model: `value`, `defaultValue`, `onChange` and `onChangeEnd` replace the previous internal-only state, which had no way to read or write the drawing at all. Its old exported types are gone with it — `Point`, `RoomData`, `DoorData` and `Tool` — since rooms are no longer stored as polygons and a wall is no longer an edge of one. `PlanPoint` in the FloorPlan model replaces `Point`; it is deliberately not called `Point`, which was too generic a name to take from the package root.
|
|
447
|
+
- 6acbb5d: Added download and open buttons to the room drawer, so a plan can be saved to a JSON file and loaded back. Opening a file goes through history, so undo puts back what was there before it, and anything the file needed repaired is reported in the hint line and to `onImport`. Hide the buttons with `showFileControls={false}` and drive it yourself through the `download` and `loadJson` handle methods.
|
|
448
|
+
- 6acbb5d: Added floors to RoomDrawer. A strip above the canvas lists the storeys top first with a button to add one, and with nothing selected the selection bar becomes the floor's own: rename it, set its storey height, move it up or down the stack, copy it, or delete it. Copying is the usual way to start an upper storey, and reordering is how a basement is made, since the add button always adds above. The storey below is traced faintly behind the one being edited so walls can be lined up between floors (`showUnderlay={false}`, or the toolbar toggle). Every floor edit is a single undo step, and elevations re-stack themselves so each storey keeps sitting on the one below. Controlled through `floorId` / `onFloorChange`, uncontrolled through `defaultFloorId`, hidden with `showFloorBar={false}`.
|
|
449
|
+
- 7c3543d: RoomDrawer gains undo and redo via toolbar buttons, Ctrl+Z, and a RoomDrawerHandle ref, with one history entry per gesture rather than one per pointer move.
|
|
450
|
+
- fef00b0: RoomDrawer measures what it is editing, live. Dragging a room out reports both sides and the area; a selected corner reports every wall meeting it; a selected wall reports the walls running off each end, since dragging a wall translates both its endpoints and its own length is the one figure that cannot change; a dragged room reports how far it has moved and which walls are being stretched by it. Figures come off the wall centrelines, which is where a finished room takes its own area from, so nothing jumps when you let go.
|
|
451
|
+
- 6acbb5d: RoomDrawer supports selecting several things at once, by Ctrl/Cmd-clicking or by dragging a marquee across empty canvas, and moves, nudges and deletes the whole set together. `selection`, `defaultSelection` and `onSelectionChange` take an array, and the handle carries `addToSelection`, `toggleSelection` and `selectAll`.
|
|
452
|
+
- 6acbb5d: Added a measure tool to the room drawer, so distances can be checked without drawing and deleting a wall to find them. It snaps like every other tool, and its measurements stay on screen through a change of tool so you can draw against them, until Escape clears them. They are view state, never part of the plan: a line in the wall graph would close faces, and faces become rooms.
|
|
453
|
+
- 7c3543d: RoomDrawer walls are shared between adjacent rooms, so drawing two rooms flush against each other produces one wall rather than two coincident ones, a door cut into it opens both rooms, and dragging it reshapes both.
|
|
454
|
+
- 7c3543d: RoomDrawer accepts classNames, styles and the full HTML pass-through prop set, reads defaults from ConfigProvider, and takes its colours entirely from theme variables.
|
|
455
|
+
- 7c3543d: RoomDrawer gains a wall tool for drawing single walls and open chains, and separate door, window and archway tools; rooms now appear by themselves wherever walls enclose a space, so free-standing interior walls are possible.
|
|
456
|
+
- 7c3543d: RoomDrawer handles touch: Pointer Events throughout, pinch to zoom, two-finger pan, and hit tolerances measured in screen pixels so grabbing a corner is equally easy at any zoom level.
|
|
457
|
+
- 063d82f: Gave RoomViewer selection callbacks, controlled selection and hover, multi-floor tabs, pan and zoom, and an empty state. Rooms are focusable buttons with accessible names that respond to Enter and Space, the floor and zoom controls are real buttons rather than clickable icons, and the current selection is announced through a live region because clicking a shape is otherwise silent. The hardcoded `#18f810` highlight colours are gone in favour of theme variables.
|
|
458
|
+
- 063d82f: **Breaking.** RoomViewer takes a `FloorPlan` instead of pre-rendered SVG. It draws on the same canvas as the room drawer from the same document, so a plan can be drawn, saved and shown without conversion, and rooms carry their real geometry rather than an `id="room…"` naming convention. Selection and hover are React state rather than classes pushed onto DOM nodes, which is what lets them be controlled from outside. The `data` prop and `RoomViewerFloor` are gone and cannot be shimmed, since `data` held React elements rather than markup; `planFromLegacySvg` converts an old SVG plan once, and the result is a plan.
|
|
459
|
+
|
|
460
|
+
## 0.25.2
|
|
461
|
+
|
|
462
|
+
### Patch Changes
|
|
463
|
+
|
|
464
|
+
- ed43aa5: Fixed a tall bottom sheet running off the top of the screen while the on-screen keyboard is open, putting its header and the start of its content out of reach: its height was capped in `dvh`, which measures the layout viewport and so never shrinks for the keyboard, while the sheet was being lifted above it at the same time
|
|
465
|
+
|
|
466
|
+
## 0.25.1
|
|
467
|
+
|
|
468
|
+
### Patch Changes
|
|
469
|
+
|
|
470
|
+
- a420682: Fixed the Modal header slicing the top off a floating label on an Input placed first in the body: the scrolling body clipped anything painting outside its own box, which a material label does by design
|
|
471
|
+
|
|
472
|
+
## 0.25.0
|
|
473
|
+
|
|
474
|
+
### Minor Changes
|
|
475
|
+
|
|
476
|
+
- 398f8ec: ConfigProvider takes a `presentation` prop that switches every sheet-capable component (FloatingMenu, Dropdown, Popover, Modal, and everything built on them) in one line, instead of four component-keyed entries that are easy to leave half-set
|
|
477
|
+
- 01fc8c7: Dropdown takes the same `presentation` prop, so its list can open as a bottom sheet on mobile instead of a menu anchored to the input
|
|
478
|
+
- 01fc8c7: FloatingMenu now reads global defaults from ConfigProvider, so an app can switch every menu to sheet presentation in one place
|
|
479
|
+
- 01fc8c7: FloatingMenu can now present as a bottom sheet on mobile via `presentation={Presentation.Sheet}` (or `Presentation.Auto` for small touch screens only): pinned to the bottom of the screen, full width up to 560px, scrollable, backdropped, and lifted above an open keyboard
|
|
480
|
+
- 5399d1f: Heads-up for existing Modal consumers: its mobile sizing rule now actually applies, so below 768px a modal fills the screen width where it previously stopped at 95%; children are now wrapped in a scrolling `body` element rather than sitting directly in the panel (a direct-child CSS selector needs updating); and every modal now traps focus, locks page scrolling and closes on Escape (`closeOnEscape={false}` opts out of the last one)
|
|
481
|
+
- 41d6089: Modal is now labelled as a `role="dialog"` by its title, renders its close control as a real focusable button, and accepts the full native `div` attribute set on its panel
|
|
482
|
+
- 41d6089: Modal now closes on Escape (opt out with `closeOnEscape={false}`), traps focus inside the panel and restores it on close, and locks scrolling on the page behind it, all correctly scoped to the topmost modal when several are open
|
|
483
|
+
- 5399d1f: Modal can now present as a bottom sheet on mobile via `presentation={Presentation.Sheet}` (or `Presentation.Auto`), pinned to the bottom of the screen with its header fixed and its body scrolling, and it reads that default from ConfigProvider like the other overlays
|
|
484
|
+
- 41d6089: Modal now keeps its header fixed and scrolls only its content, so the title and close button stay visible with long content, and exposes the new scrolling wrapper as a `body` slot
|
|
485
|
+
- 2a5db33: Popover now reads global defaults from ConfigProvider
|
|
486
|
+
- 2a5db33: Popover takes the same `presentation` prop as FloatingMenu and Dropdown, so its panel can open as a bottom sheet on mobile; hover and focus triggers stay anchored, since a pointer hint is not a screen-owning panel
|
|
487
|
+
- 398f8ec: Renamed `Presentation.Anchored` to `Presentation.Default`, so the one enum reads correctly for every surface it now covers: a Modal is centred rather than anchored to anything, and `Modal`'s `presentation` accepts the full enum instead of a narrowed union
|
|
488
|
+
|
|
489
|
+
### Patch Changes
|
|
490
|
+
|
|
491
|
+
- 5399d1f: FloatingMenu now closes on Escape wherever focus is, including on the trigger itself, rather than only while focus sits inside the menu
|
|
492
|
+
- 01fc8c7: Fixed anchored popups leaving their computed inline position behind after closing, which overrode the styles of any layout they switched to while still mounted
|
|
493
|
+
- 41d6089: Fixed Modal's mobile sizing rule never applying: it was written against an undefined custom media query, so browsers dropped the whole block
|
|
494
|
+
- 5399d1f: Fixed a Modal fighting the menus opened from inside it: a FloatingMenu, Dropdown or Popover now counts as the layer above the modal, so Escape closes it alone instead of the modal too, and the modal's focus trap no longer drags focus out of the (portaled) menu on Tab
|
|
495
|
+
- 2a5db33: Fixed Popover leaving its computed inline position behind after closing, which overrode the styles of any layout it switched to while still mounted
|
|
496
|
+
- 01fc8c7: Fixed a tap on a bottom sheet's backdrop also activating whatever sat behind it: the sheet closed on the press, unmounted, and left the browser to deliver the completing click to the page underneath
|
|
497
|
+
|
|
498
|
+
## 0.24.3
|
|
499
|
+
|
|
500
|
+
### Patch Changes
|
|
501
|
+
|
|
502
|
+
- 74c9e9b: Fixed NumberInput's stepper divider losing contrast when a chevron is hovered — the hover state is now colour-only
|
|
503
|
+
|
|
504
|
+
## 0.24.2
|
|
505
|
+
|
|
506
|
+
### Patch Changes
|
|
507
|
+
|
|
508
|
+
- 66c6f9b: Fixed clicks never reaching buttons inside a Carousel slide by capturing the pointer only once a swipe is recognised
|
|
509
|
+
- 952d2b1: Grew Carousel's dots to a 24px hit area and gave the dots and arrows a visible focus ring
|
|
510
|
+
- 952d2b1: Stopped Carousel's dots from being clipped when there are more of them than fit: the row is now a scroll strip that keeps the selected dot centred, at full dot size
|
|
511
|
+
- 952d2b1: Reworked Carousel keyboard navigation onto the APG carousel pattern: the dots are a tablist with one tab stop, arrow keys and Home/End move between slides, and slide content keeps its own arrow keys
|
|
512
|
+
|
|
513
|
+
## 0.24.1
|
|
514
|
+
|
|
515
|
+
### Patch Changes
|
|
516
|
+
|
|
517
|
+
- f71f767: Removed the per-pointermove re-render and layout measurement from Carousel swiping, so a drag now only writes the track's transform
|
|
518
|
+
- f71f767: Stopped Carousel re-rendering on hover and focus when autoPlay is off, where the tracked state pauses nothing
|
|
519
|
+
- 1f7672c: Fixed Carousel sliding backwards across every slide when a new slide was picked before a loop wrap had finished animating
|
|
520
|
+
|
|
521
|
+
## 0.24.0
|
|
522
|
+
|
|
523
|
+
### Minor Changes
|
|
524
|
+
|
|
525
|
+
- 8f4644a: `ButtonProps` now extends `React.ButtonHTMLAttributes<HTMLButtonElement>`, so every native `<button>` attribute is typed and forwarded — pointer handlers, `onContextMenu`, `tabIndex`, `name`, `value`, `form` and the rest. They were already spread onto the element at runtime; only the types were in the way.
|
|
526
|
+
- 8f4644a: Added `ButtonSize.Icon` — a padding-free variant that centres a lone icon in a box the caller sizes.
|
|
527
|
+
- 94a0a61: `HtmlProps` now carries the root element's full native attribute set instead of just `id`/`role`/`aria-*`/`data-*`, so every component types the HTML attributes it already forwarded at runtime — `title`, `lang`, `tabIndex`, every `on*` handler, and the rest. It takes an optional element parameter (`HtmlProps<HTMLDivElement>`) for correctly-typed event handlers, and the new `DataProps` exports just the `data-*` half for components that source their attributes elsewhere.
|
|
528
|
+
- 8f4644a: Added `min` and `max` props to NumberInput — steps clamp to the bounds and the corresponding stepper button disables once a bound is reached.
|
|
529
|
+
- 8f4644a: NumberInput steppers are now real buttons with accessible names (the split layout uses the shared `Button` component) (overridable via `increaseLabel` / `decreaseLabel`), and the field carries `role="spinbutton"` with `aria-valuenow`/`aria-valuemin`/`aria-valuemax` when `showArrows` is set.
|
|
530
|
+
- 8f4644a: NumberInput stepper buttons now repeat while held (400ms delay, then an accelerating repeat) and respond on `pointerdown`, so a hold works identically on touch and mouse.
|
|
531
|
+
- 8f4644a: NumberInput steppers are now touch-friendly: on a coarse pointer they render as square `−` / `+` buttons flanking the field, controlled by the new `arrowsLayout` prop (`'auto' | 'stacked' | 'split'`); the stacked chevrons grew from roughly 20x13 to 27x17 with a larger glyph.
|
|
532
|
+
|
|
533
|
+
### Patch Changes
|
|
534
|
+
|
|
535
|
+
- 4e9074d: Button now shows its ripple when activated by keyboard. Enter/Space dispatches a click targeting the button itself, which never reached the node Ripple listens on, so keyboard users got no press feedback at all; it is now spawned centred for those clicks, since a keyboard click reports no pointer coordinates.
|
|
536
|
+
- aba2e97: Button no longer shrinks below its own content in a flex row. Its `overflow: hidden` (needed to clip the ripple) disables the automatic minimum size a flex item normally gets, so a Button next to a flexible sibling — an Input in a `ButtonGroup`, say — could be squashed until its icon was cut off. It now states that floor explicitly with `min-width: min-content`.
|
|
537
|
+
- 4e9074d: A clickable Chip can now be reached and activated by keyboard — it was a plain `div` with an `onClick`, with no role, tab stop or key handling — and shows its ripple when activated. Its remove button also gained an accessible name, overridable via the new `removeLabel` prop.
|
|
538
|
+
- 94a0a61: Components whose own prop shares a name with a native attribute of a different shape now omit that native attribute explicitly — `onChange` on Carousel, ColorPicker, IconPicker, KanbanBoard, OptionPicker, OtpInput, RadioGroup, Rating, SearchInput, Slider, TabHeader and TimeInput; `content` on Avatar, Badge, FloatingMenu and Popover; `title` on Alert, ErrorBoundary and SectionHeader; plus `onToggle`, `onSelect`, `onFocus`, `onBlur`, `tabIndex` and `children` on a handful of others.
|
|
539
|
+
- 4e9074d: `InteractableDiv` no longer applies `role="button"` and a tab stop when it has no `onClick`, so a non-interactive Card is no longer announced as a button and no longer sits in the tab order doing nothing.
|
|
540
|
+
- 4e9074d: Card and IconPicker now show their ripple when activated by keyboard. Both call their click handler directly on Enter/Space without dispatching a DOM click, so Ripple never saw the activation and keyboard users got no press feedback.
|
|
541
|
+
- 8f4644a: Fixed the NumberInput stacked chevrons' hover background squaring off the field's rounded corner — the stepper column is now clipped to the field's own border radius, and still flattens correctly inside a `ButtonGroup`.
|
|
542
|
+
- 8f4644a: NumberInput's `min`/`max` now clamp a typed value on blur and on Enter, so an out-of-range value cannot reach a form submit. Neither bound blocks typing: rejecting keystrokes swallowed edits that were on their way to a valid value.
|
|
543
|
+
- 8f4644a: Fixed several NumberInput stepper defects: a hold could repeat forever if the pointer was released outside the window, `disabled` neither reached the input nor stopped the steppers, and holding at a `min`/`max` bound kept emitting the unchanged value.
|
|
544
|
+
- 8f4644a: Reverted the NumberInput split-stepper seam tweak. Suppressing one of the two stacked borders made the seam vanish entirely under any theme with an opaque button background, and again on hover, where `z-index` reverses which of the pair is on top. The sub-pixel width difference it was meant to fix only shows at fractional zoom and is far less visible.
|
|
545
|
+
- 8f4644a: The NumberInput split stepper now wraps its buttons and field in a `ButtonGroup`, so the three collapse into one continuous bordered control that follows the field's focus and error colours, instead of sitting apart as three separate ones.
|
|
546
|
+
- 8f4644a: A NumberInput with `showArrows` is now exactly as tall as one without, at any text size — the steppers derive their size from the field instead of imposing a minimum height (previously 38px for the stacked chevrons and 44px for the split buttons against a 34px plain field).
|
|
547
|
+
- 8f4644a: The NumberInput split steppers now use the standard Button ripple for press feedback instead of a custom colour flash, and no longer latch into a highlighted state after a tap on touch.
|
|
548
|
+
- 8f4644a: Fixed the NumberInput split steppers losing their ripple on mouse input: capturing the pointer retargeted the following click to the button itself, past the handler Ripple attaches inside it. The hold now watches the window for the release instead of capturing the pointer.
|
|
549
|
+
|
|
550
|
+
## 0.23.0
|
|
551
|
+
|
|
552
|
+
### Minor Changes
|
|
553
|
+
|
|
554
|
+
- 7455aad: Added an `adaptiveHeight` prop to Carousel that sizes the carousel to the active slide instead of the tallest one
|
|
555
|
+
- 7455aad: Added a `lazyRender` prop to Carousel that mounts only the active slide and its immediate neighbours
|
|
556
|
+
|
|
557
|
+
## 0.22.0
|
|
558
|
+
|
|
559
|
+
### Minor Changes
|
|
560
|
+
|
|
561
|
+
- 87e355e: SectionHeader now keeps the leading icon/thumbnail and the title together in a new `identity` slot, so a long title no longer wraps to its own row and orphans the icon above it
|
|
562
|
+
|
|
563
|
+
### Patch Changes
|
|
564
|
+
|
|
565
|
+
- 87e355e: SectionHeader truncates the title on a single line with a working ellipsis and exposes a plain-string title as the heading's `title` attribute, and clamps the subtitle to two lines
|
|
566
|
+
|
|
567
|
+
## 0.21.0
|
|
568
|
+
|
|
569
|
+
### Minor Changes
|
|
570
|
+
|
|
571
|
+
- 629a0b0: Every `icon` prop now accepts an arbitrary React element as well as a FontAwesome `IconDefinition` — Button, ActionIcon, Alert, Avatar, Breadcrumb, EmptyState, Fab, Rating, SectionHeader, SplitButton, Stepper, TabHeader, Timeline, ActionButtons and Card/SectionHeader actions
|
|
572
|
+
|
|
573
|
+
## 0.20.0
|
|
574
|
+
|
|
575
|
+
### Minor Changes
|
|
576
|
+
|
|
577
|
+
- c1a1f12: Added `OtpInput`, a one-time-passcode input with auto-advance (including when retyping a digit already in a box, which React's controlled-input `onChange` alone can't detect), backspace/arrow navigation, paste/autofill distribution (typing or pasting past the filled prefix fills the next expected slot rather than misplacing characters), masking, grouping, an `Input`/`RadioGroup`-style error `Tooltip`, `clearOnError` auto-retry handling, and `FormValidator`/`ConfigProvider` support.
|
|
578
|
+
- 4e17e69: Added `Timer`'s `counterClockwise` prop to sweep the depleting ring the other way instead of the default clockwise direction
|
|
579
|
+
- 4e17e69: Added `Timer`'s `showRunningRipples` prop — a thin ring pulsing outward from the dial's own edge and fading out while the countdown is running, for a beacon/live-indicator-style halo; pausing stops new ripples from spawning but lets whichever are already mid-flight finish their animation instead of disappearing mid-cycle
|
|
580
|
+
- 4e17e69: Added `Timer`'s `urgentMinSeconds` prop (default `3`), a floor in absolute seconds for the urgent/critical state so short timers no longer get a barely-perceptible urgent window from `urgentThreshold`'s duration-fraction alone
|
|
581
|
+
|
|
582
|
+
### Patch Changes
|
|
583
|
+
|
|
584
|
+
- 4e17e69: Fixed Timer's ring feeling sluggish (a 1s CSS transition against 200ms ticks meant the rendered ring perpetually lagged the true remaining time), pausing no longer lets the ring keep animating toward its target, and `start()`/the ref API now correctly restarts from the full duration when called after completion or cancellation instead of re-completing instantly
|
|
585
|
+
- 4e17e69: Fixed `Timer`'s built-in pause button hiding itself entirely once the countdown was completed or cancelled, leaving no way to restart it from the component's own controls — it now doubles as a play/restart button ("Start" when idle, "Restart" once completed or cancelled) instead of disappearing
|
|
586
|
+
- 4e17e69: Fixed Timer's progress ring appearing to visually jump/drift instead of depleting smoothly, caused by combining an SVG transform attribute with a separate ancestor CSS transform alongside vector-effect: non-scaling-stroke while stroke-dashoffset was transitioning
|
|
587
|
+
|
|
588
|
+
## 0.19.4
|
|
589
|
+
|
|
590
|
+
### Patch Changes
|
|
591
|
+
|
|
592
|
+
- 04d44f1: OptionPicker option padding is now themeable via `--option-picker-padding`, falling back to `--spacing-m`
|
|
593
|
+
|
|
594
|
+
## 0.19.3
|
|
595
|
+
|
|
596
|
+
### Patch Changes
|
|
597
|
+
|
|
598
|
+
- 6ad4350: Dropdown now scales its floating label, placeholder, border notch and menu items with a custom `font-size`, matching Input's em-based sizing instead of hardcoded pixel values
|
|
599
|
+
- 6ad4350: Fixed the Dropdown menu visibly resizing when opened — the items' `transition: all` was animating their size, and the menu width was applied a frame after paint
|
|
600
|
+
- 6ad4350: InputDropdown menu items now scale with a custom `font-size` instead of staying at a fixed size
|
|
601
|
+
- 4c9bbce: Fixed OptionPicker option labels not centering vertically or truncating with an ellipsis
|
|
602
|
+
|
|
603
|
+
## 0.19.2
|
|
604
|
+
|
|
605
|
+
### Patch Changes
|
|
606
|
+
|
|
607
|
+
- aad4a3c: DatePicker's day grid now uses a roving tab stop with arrow-key navigation (`←`/`→` by day, `↑`/`↓` by week, crossing into the adjacent month at the edges) instead of every day being its own tab stop.
|
|
608
|
+
- aad4a3c: Fixed DatePicker's month/year selectors (and any other `Dropdown` with `plainStyle`) showing no focus indicator for keyboard users: the plain-style border override always won over the focused-state color in CSS, regardless of which state was actually active, silently erasing the focus ring.
|
|
609
|
+
- 187754a: Input/Textarea and ColorPicker's hex field no longer trigger iOS Safari's auto-zoom-on-focus on mobile viewports, where the themed font size can fall below the 16px threshold that avoids it.
|
|
610
|
+
- 187754a: Modal now sizes and centers itself against the actually-visible viewport instead of the full layout viewport, so it no longer gets clipped or overlapped by a mobile on-screen keyboard.
|
|
611
|
+
- 187754a: Popover and FloatingMenu now flip/clamp their position against the actually-visible viewport (and react to it live), so they no longer render off-screen or hidden behind a mobile on-screen keyboard.
|
|
612
|
+
|
|
613
|
+
## 0.19.1
|
|
614
|
+
|
|
615
|
+
### Patch Changes
|
|
616
|
+
|
|
617
|
+
- a7ac175: Added a `--focus-border-color` theme variable (falls back to `--primary-color`) and switched every component's focus ring/border to use it — `Input`, `Dropdown`, `Checkbox`, `Switch`, `RadioGroup`, `OptionPicker`, `IconPicker`, `ColorPicker`, `Timeline`, `RoomDrawer` — so focus styling can be customised theme-wide in one place instead of per component. `OptionPicker` also now highlights its whole border on keyboard focus (`:has(:focus-visible)`), matching `Input`'s focus treatment.
|
|
618
|
+
- c8cdb64: IconPicker now follows the ARIA `radiogroup` pattern instead of every item being its own tab stop: arrow keys move focus and selection between items (wrapping at the ends), and Tab only stops once on the selected (or first) item, matching RadioGroup's keyboard behavior.
|
|
619
|
+
- 52b4fdc: Fixed InfiniteBlock's keyboard navigation scrolling the highlighted item out of view: ArrowUp/ArrowDown didn't call `preventDefault()`, so the browser's own native arrow-key scrolling on the focused, scrollable container fired alongside our scroll-into-view logic, compounding on every press until the highlighted item was pushed off-screen.
|
|
620
|
+
- 52b4fdc: Hardened InfiniteBlock's scroll container with `position: relative`, so its children's `offsetTop` (used by keyboard-nav scroll-into-view math) is always measured against it rather than against whatever positioned ancestor a consumer happens to wrap it in.
|
|
621
|
+
- 52b4fdc: Reworked InfiniteBlock's internals: scroll-loading now uses IntersectionObserver instead of manual scroll-position math (also fixing a stuck-spinner bug if `onScroll` rejected), and type-ahead now matches text nested inside wrapper elements instead of only a narrow set of shapes.
|
|
622
|
+
- 52b4fdc: Fixed InfiniteBlock's keyboard navigation so ArrowUp from the first item wraps directly to the last (matching how ArrowDown already wraps from the last item to the first), instead of landing on a "nothing highlighted" state for one press first.
|
|
623
|
+
- 4ff2b3e: OptionPicker now follows the ARIA `radiogroup` pattern instead of an inverted tabindex (every unselected option tabbable, the selected one skipped): arrow keys move focus and selection between options (wrapping at the ends), and only the selected option is a tab stop.
|
|
624
|
+
- 4ff2b3e: Fixed OptionPicker's focus ring being invisible on the selected option: it used the same primary color as the option's own chip background, so it disappeared exactly where roving-tabindex keyboard focus actually lands. The selected option's focus outline now uses the on-primary color for contrast.
|
|
625
|
+
- 4ff2b3e: OptionPicker's focus ring now only shows on keyboard focus (`:focus-visible`), not on mouse clicks, matching RadioGroup and IconPicker.
|
|
626
|
+
|
|
627
|
+
## 0.19.0
|
|
628
|
+
|
|
629
|
+
### Minor Changes
|
|
630
|
+
|
|
631
|
+
- fcdc576: Added `stackButtons` prop to `ActionButtons` to stack the buttons vertically at full width, e.g. as a mobile default via `ConfigProvider`
|
|
632
|
+
|
|
633
|
+
## 0.18.1
|
|
634
|
+
|
|
635
|
+
### Patch Changes
|
|
636
|
+
|
|
637
|
+
- 1e94cf4: Fixed `OptionPicker`'s sliding chip drifting out of alignment with the selected option in narrow containers, by removing the row's flex `gap` (the options' own padding already provides spacing) — the chip's percentage-based position now matches the options' actual layout exactly.
|
|
638
|
+
|
|
639
|
+
## 0.18.0
|
|
640
|
+
|
|
641
|
+
### Minor Changes
|
|
642
|
+
|
|
643
|
+
- 97853ee: `OptionPicker` now adopts `ConfigProvider` for app-wide default props.
|
|
644
|
+
- 97853ee: Added `classNames`/`styles` slots (`root`, `chip`, `option`) to `OptionPicker`.
|
|
645
|
+
|
|
646
|
+
## 0.17.3
|
|
647
|
+
|
|
648
|
+
### Patch Changes
|
|
649
|
+
|
|
650
|
+
- c2f724f: Changed Checkbox's unchecked border to use `--border-color` instead of `--text-color`, matching RadioGroup and the theming convention that `--border-color` is for borders
|
|
651
|
+
- c19ee8e: Made Input's clickable icons (custom icon with onIconClick, search clear, password show/hide, cancel) keyboard-focusable via Tab and activatable with Enter/Space, with a visible focus outline and aria-labels on the ones with known semantics — instead of being reachable only by mouse and hidden from screen readers
|
|
652
|
+
- c19ee8e: Made InteractableDiv activate on Space as well as Enter, matching native button behaviour and the WAI-ARIA button pattern it declares via role="button" — Space previously did nothing but scroll the page. This also fixes keyboard activation for every component built on it (ActionIcon, Carousel controls, TabHeader, Breadcrumb, SplitButton, and others)
|
|
653
|
+
- 852b0ec: `ProgressBar` segment labels now keep their full padding on normal-sized segments — padding only shrinks automatically (via CSS container query units) on segments narrow enough to actually need it for Firefox's ellipsis to render, instead of the flat reduced padding applied to every segment previously.
|
|
654
|
+
|
|
655
|
+
## 0.17.2
|
|
656
|
+
|
|
657
|
+
### Patch Changes
|
|
658
|
+
|
|
659
|
+
- 72853f1: `ProgressBar`'s track background is no longer a hardcoded `#e0e0e0` — it's now themeable via the new `--progress-bar-track-color` CSS variable, falling back to `--background-accent` so it adapts to dark themes by default.
|
|
660
|
+
|
|
661
|
+
## 0.17.1
|
|
662
|
+
|
|
663
|
+
### Patch Changes
|
|
664
|
+
|
|
665
|
+
- bb8aec1: Extended `ButtonGroup`'s corner-flattening `--group-radius-*` mechanism to `ColorPicker`'s swatch and `Checkbox`'s checkmark box, whose visible border also lives on a nested element rather than the component's root.
|
|
666
|
+
- bb8aec1: Fixed `ButtonGroup` not flattening the corners of `Input`-based children (`Input`, `Textarea`, `NumberInput`, `DatePicker`, `TimeInput`, `InputDropdown`) or `Dropdown` — their visible border lives on a nested `fieldset`, not their root, so `ButtonGroup`'s corner reset couldn't reach it. It now also cascades `--group-radius-*` CSS custom properties, which those components' stylesheets read to flatten correctly with no extra props needed.
|
|
667
|
+
- bb8aec1: Fixed `FloatingMenu`/`Dropdown`/`InputDropdown`/`DatePicker`/`TimeInput` (and every other consumer of the shared floating-position hook) overflowing off the right or left edge of the screen when their trigger sits near a screen edge — the popup is now also shifted horizontally to stay within the viewport, mirroring the existing vertical flip behavior.
|
|
668
|
+
- 634fc8d: Fixed `ProgressBar`'s fill collapsing to zero height in Firefox (invisible bar) when no explicit `height` was passed — it relied on the `height: stretch` CSS keyword, which Firefox doesn't support unprefixed; switched to plain flexbox `align-items: stretch`, which resolves consistently across browsers regardless of whether the container has an explicit height.
|
|
669
|
+
- 634fc8d: Fixed `ProgressBar` segment labels not truncating with an ellipsis in Firefox for long text — the label is a flex item with a default `min-width: auto`, which Firefox correctly enforces (refusing to shrink below the label's full unwrapped width) while Chrome has historically been lenient about it; added `min-width: 0` so the label actually shrinks and its `text-overflow: ellipsis` can take effect in every browser.
|
|
670
|
+
- 634fc8d: Fixed `ProgressBar` segment labels showing a bare hard-clipped fragment (e.g. "Oth") instead of an ellipsis in Firefox on very narrow segments — reduced the label's padding so there's enough content-box width left for the "…" glyph to render consistently in every browser, even on a segment representing only a few percent of the total.
|
|
671
|
+
|
|
672
|
+
## 0.17.0
|
|
673
|
+
|
|
674
|
+
### Minor Changes
|
|
675
|
+
|
|
676
|
+
- 79776fa: Added `offsetElement` prop to `Sticky` to stick below an external element (e.g. a pinned header outside the library) using its live height, instead of a fixed `offsetTop`.
|
|
677
|
+
- 79776fa: Added `stickToScrollParent` prop to `Sticky` to pin relative to the nearest scrollable ancestor's top edge instead of the browser viewport, so it doesn't overlap chrome (e.g. a fixed header) that sits outside that scroll container.
|
|
678
|
+
|
|
679
|
+
## 0.16.8
|
|
680
|
+
|
|
681
|
+
### Patch Changes
|
|
682
|
+
|
|
683
|
+
- e46102d: Added a `**Keywords:**` line to every component doc listing common natural-language search terms not already present in its own text (e.g. "text" for SearchInput), and changed the `search_components` MCP tool to rank full-term matches first and partial-term matches after, instead of requiring every query word to match or returning nothing.
|
|
684
|
+
|
|
685
|
+
## 0.16.7
|
|
686
|
+
|
|
687
|
+
### Patch Changes
|
|
688
|
+
|
|
689
|
+
- ee9e284: Fixed Badge overlay's z-index leaking out to compete with unrelated positioned content elsewhere on the page (e.g. rendering above an open Modal) by containing it with `isolation: isolate` on the Badge wrapper, so it no longer needs to fight for a global z-index value.
|
|
690
|
+
|
|
691
|
+
## 0.16.6
|
|
692
|
+
|
|
693
|
+
### Patch Changes
|
|
694
|
+
|
|
695
|
+
- 5ae7e7d: Fixed Fab icon (main button and mini speed-dial menu entries) sitting slightly off vertical-center, caused by FontAwesome's inline-block/line-height-based icon layout instead of true box centering; the icon wrapper is now a flex container so centering holds for any icon or aspect ratio
|
|
696
|
+
|
|
697
|
+
## 0.16.5
|
|
698
|
+
|
|
699
|
+
### Patch Changes
|
|
700
|
+
|
|
701
|
+
- cff88c1: Fixed Fab icon content not centering its child glyph, causing off-center icons for non-square SVGs
|
|
702
|
+
- cff88c1: Fixed FabBase icon sizing being silently overridden by unlayered consumer CSS (e.g. FontAwesome's own base stylesheet), which stretched non-square icons off-center since the library's CSS is wrapped in a cascade layer and always loses to unlayered rules regardless of specificity
|
|
703
|
+
|
|
704
|
+
## 0.16.4
|
|
705
|
+
|
|
706
|
+
### Patch Changes
|
|
707
|
+
|
|
708
|
+
- 979a88d: Fixed Fab icon content not centering its child glyph, causing off-center icons for non-square SVGs
|
|
709
|
+
|
|
710
|
+
## 0.16.3
|
|
711
|
+
|
|
712
|
+
### Patch Changes
|
|
713
|
+
|
|
714
|
+
- 225ed16: Fixed InputDropdown never showing its formValidator's error state or required mark, and added error/isRequired props
|
|
715
|
+
|
|
716
|
+
## 0.16.2
|
|
717
|
+
|
|
718
|
+
### Patch Changes
|
|
719
|
+
|
|
720
|
+
- bf72b41: Fixed NumberInput showing a validation error before the field was touched, and made blur mark it as touched
|
|
721
|
+
- bf72b41: Fixed NumberInput not showing the required mark for a formValidator with a required validator, and added an isRequired prop
|
|
722
|
+
|
|
723
|
+
## 0.16.1
|
|
724
|
+
|
|
725
|
+
### Patch Changes
|
|
726
|
+
|
|
727
|
+
- 5ec26f2: Fixed SectionHeader wrapping onto its own row on narrow screens even when no center content was provided
|
|
728
|
+
|
|
729
|
+
## 0.16.0
|
|
730
|
+
|
|
731
|
+
### Minor Changes
|
|
732
|
+
|
|
733
|
+
- b136643: Added RevealLens, a two-layer pointer-driven reveal component for magnifier/before-after image effects
|
|
734
|
+
- 1f1cd0c: Added Tilt, a pointer-driven 3D tilt component with a JS-based smoothing loop and a TiltGroup for shared "hand of cards" cursor tracking, and Flip, a standalone front/back card flip with configurable hinge axis and direction, composable with Tilt for a tilting, flippable card
|
|
735
|
+
|
|
736
|
+
## 0.15.1
|
|
737
|
+
|
|
738
|
+
### Patch Changes
|
|
739
|
+
|
|
740
|
+
- d34575a: Fixed portaled popups (FloatingMenu, Dropdown, InputDropdown, Tooltip) keeping a position measured for their old content height: they now re-measure when their content resizes while open, so a list that shrinks while opened upward stays anchored to its trigger instead of hanging above it, and flips back below once it fits there again.
|
|
741
|
+
- e31485d: Fixed Input dropping a `customInput` element's own `className` and `style` — both are now merged with Input's field classes and the `styles.input` slot instead of being overwritten.
|
|
742
|
+
- e31485d: Fixed Input ignoring a `formValidator`-driven value for its clear icon (`showCancel`) and its active search border — both only reacted to the `value` prop before.
|
|
743
|
+
- e31485d: Fixed Input's `styles.input` slot being ignored — the documented inline-style slot for the field element was never applied.
|
|
744
|
+
- e31485d: Fixed NumberInput's `style` prop landing on the inner field instead of the root element — it now behaves like `className` and like Input's own `style`.
|
|
745
|
+
|
|
746
|
+
## 0.15.0
|
|
747
|
+
|
|
748
|
+
### Minor Changes
|
|
749
|
+
|
|
750
|
+
- aa25786: Added `ErrorBoundary`, a component that catches render errors in its descendants and shows a fallback built from `Accordion` and `Button` — with a copyable stack trace, a "Try again" reset button, `onError`/`onReset` callbacks, `resetKeys` for auto-recovery, a `labels` prop for translating every built-in string, and a fully overridable `fallback` render prop.
|
|
751
|
+
- a15db24: Added `Timeline`, a vertical connected list of dated events for audit logs, activity feeds, and order/deploy history, with icon or status-coloured markers, `Left`/`Right`/`Alternate` layouts, per-entry `onClick`/`disabled` for opening the full record, and arbitrary extra content per entry.
|
|
752
|
+
|
|
753
|
+
### Patch Changes
|
|
754
|
+
|
|
755
|
+
- acdb550: Added `columnMaxHeight` to `KanbanBoard`, bounding each column's height and letting its card list scroll independently instead of growing the whole page, plus `onLoadMore`/`loadMoreThreshold` and `KanbanColumnDef.hasMore` for paginating a column's cards as the user scrolls near the bottom — useful for columns (e.g. "Done") that could otherwise hold thousands of entries. Each column tracks its own in-flight load state (shown via the new `loadingIndicator` slot) and retries automatically if a loaded page doesn't fill the column's visible height.
|
|
756
|
+
|
|
757
|
+
## 0.14.1
|
|
758
|
+
|
|
759
|
+
### Patch Changes
|
|
760
|
+
|
|
761
|
+
- cc7eb95: Fixed `InteractableDiv` (and every non-interactive `Card`, which is built on it) always rendering `tabindex="0"` even when explicitly passed `tabIndex={null}` to opt out — a loose `==` check treated `null` the same as `undefined`, so a plain `Card` with no `onClick` was silently a keyboard tab stop
|
|
762
|
+
- cc7eb95: Added accessible screen-reader announcements for KanbanBoard drag interactions (pick up, hover, drop, cancel) and Kanban-specific keyboard instructions, plus an optional `getItemLabel` prop to make announcements read a card's title instead of its raw id
|
|
763
|
+
- cc7eb95: Fixed a "Maximum update depth exceeded" crash when moving a card with the keyboard: the `accessibility` object passed to dnd-kit's `DndContext` was a new object literal on every render, and since keyboard moves re-render the board on every keystroke, dnd-kit's internal accessibility subscription kept re-triggering itself. The object is now memoized so its identity only changes when the announcements actually change.
|
|
764
|
+
- 3774e8c: Added a `collapseEmptyColumns` prop to KanbanBoard (default `true`, matching existing behaviour) to opt out of shrinking empty columns to a narrow strip, and exposed the collapsed width via a `--kanban-empty-column-width` CSS variable instead of a hardcoded `140px`
|
|
765
|
+
- 8b197d1: Fixed the cards drop-target highlight lighting up on columns a dragged _column_ passes over (with `reorderableColumns`) — that highlight means "drop a card here" and doesn't apply mid-column-drag. Added a distinct highlight for "drop the column here" instead.
|
|
766
|
+
- e528323: Added a `renderColumnActions` prop to KanbanBoard for custom header actions per column (e.g. an "add card" button, a column menu), laid out alongside the title and the `maxItems` count badge instead of fighting the fixed header layout
|
|
767
|
+
- 3c66584: Fixed another source of the drag "Maximum update depth exceeded" risk: the board-level column `SortableContext` was handed a brand-new `.map()`'d ids array on every render (including every `dragOver` while dragging), and `SortableContext` memoizes its own internal state keyed on that array's reference rather than its contents — forcing every column to recompute and re-render on every board render regardless of whether column order actually changed. The ids array is now memoized so it only changes when the columns actually do.
|
|
768
|
+
- cc7eb95: Added a `style` prop to KanbanColumn's root element, matching every other component's className/style convention
|
|
769
|
+
- cc7eb95: Added `disabled` to `KanbanColumnDef` to freeze a column (its cards can't be picked up, and nothing can be dropped into it, including directly onto its existing cards — e.g. enforcing "cards in Done can't move back out"), and a `getItemDisabled` prop on `KanbanBoard` to pin individual cards independent of their column. The dimmed styling for a disabled column only applies to its cards, not its header, so a custom `renderColumnActions` button stays fully visible and interactive.
|
|
770
|
+
- cc7eb95: Fixed KanbanBoard not reverting a card to its original position when a drag is cancelled (Escape key): dnd-kit fires a separate `onDragCancel` event rather than `onDragEnd`, which the board wasn't listening for, so the in-progress preview state was never cleared
|
|
771
|
+
- cc7eb95: Added a `dragHandle` prop to KanbanBoard to restrict drag initiation to a `data-drag-handle` element, so cards with interactive content no longer have clicks swallowed by the drag listener
|
|
772
|
+
- 3c66584: Fixed a real "Maximum update depth exceeded" crash reproducible by holding a card in place mid-drag for a few seconds: applying a reorder reflows the columns involved, which can shift a different card under an otherwise-stationary pointer, causing dnd-kit to re-fire `dragOver` with a new target even though nothing the user did changed. If the geometry decision for that new target flips back once applied, this could bounce between two or three states forever, purely from the board's own layout changes. `KanbanBoard` now only applies a reorder once per distinct dragged-card position, so a drag settles instead of oscillating once the pointer stops moving.
|
|
773
|
+
- 28018c7: Fixed KanbanBoard sometimes dropping a card into the wrong slot near the top or bottom of a column. Hovering the empty padding above the first card resolves the drop target to the column's own droppable rather than that card, which is now correctly treated as "insert at the start" instead of always "append to the end". Landing on the last card now recognizes "the drag has moved past it" once the dragged card clears it by about half its height, rather than requiring a full card's height of clearance that in practice almost never happened before the drop — which had been landing cards second-to-last instead of last.
|
|
774
|
+
- cc7eb95: Fixed a "Maximum update depth exceeded" crash when dragging the last card out of a column: the column's empty-state collapse was reacting to transient drag state, shrinking the column mid-drag and triggering a feedback loop with dnd-kit's layout measuring. The collapse is now suppressed for the duration of any active drag.
|
|
775
|
+
- f527b4d: Added a `renderEmptyColumn` prop to KanbanBoard for custom content inside a column with no cards (e.g. "No tasks yet"), instead of leaving it blank
|
|
776
|
+
- cc7eb95: KanbanBoard and KanbanColumn now accept `id`, `role`, `aria-*`, and `data-*` props, passed through to their root element like every other component in the library
|
|
777
|
+
- cc7eb95: Fixed inconsistent keyboard drag navigation in KanbanBoard where arrow keys would sometimes move a card within its column and sometimes jump it to a different column regardless of direction pressed. Replaced dnd-kit's generic `sortableKeyboardCoordinates` (unreliable across multiple per-column `SortableContext`s) with a board-aware coordinate getter: Up/Down always reorders within the current column, Left/Right always moves into the adjacent column.
|
|
778
|
+
- cc7eb95: Added keyboard drag-and-drop support to KanbanBoard, so cards can be picked up and moved without a pointer
|
|
779
|
+
- cc7eb95: Fixed KanbanBoard calling `onChange` with a new but unchanged columns array on a drop that didn't actually move anything
|
|
780
|
+
- cc7eb95: Fixed KanbanBoard's drag logic cloning and returning a new columns array on every same-column hover event even when nothing actually moved (e.g. `oldIndex === newIndex`), which defeated the no-op state update guard and could cascade into a "Maximum update depth exceeded" crash during a fast or sustained drag
|
|
781
|
+
- b5a9cea: Reduced KanbanBoard's per-frame work while dragging: the sensors were being recreated with a brand-new options object on every render (including every drag-over event during an active drag), defeating dnd-kit's own sensor memoization; and every card move was deep-cloning every column's full item list, not just the one or two columns actually involved in the move. Both are now O(columns touched) instead of O(total cards on the board), which matters most on boards with a lot of columns or cards.
|
|
782
|
+
- 28018c7: Fixed cards being impossible to reorder past a pinned card (`getItemDisabled`) sitting at either end of a column, when it was the only thing there for the drag to land near — a pinned card's own droppable was disabled entirely, the same as a fully frozen column's cards, so nothing could ever be dropped before or after it. A pinned card now stays a valid drop target for other cards; only a column frozen via `disabled` also blocks its cards from being landed on.
|
|
783
|
+
- 28018c7: Fixed being unable to reorder a card past a disabled/pinned card (via `disabled` or `getItemDisabled`) when it sits at the very top or bottom of a column with no other card on the far side — a disabled card's own droppable is excluded from collision candidates, so the drag resolved to the column's own droppable instead of a card id, which the same-column reorder logic didn't know how to handle and silently ignored
|
|
784
|
+
- 8b197d1: Added a `reorderableColumns` prop to KanbanBoard, letting whole columns be reordered by dragging their header (mouse, touch, and keyboard), alongside the existing card dragging — commits through the same `onChange` as any other change. Collision detection is scoped by drag type (a column drag only considers other columns; a card drag only considers cards and card lists), so the correct drop target lights up immediately instead of only in certain pointer positions.
|
|
785
|
+
- 3c66584: Fixed a "Maximum update depth exceeded" crash that could happen during a long drag: `KanbanColumn` and `KanbanItem` were passing brand-new `data`/`disabled` object literals to `useSortable` on every render, and every column/card re-renders on every `dragOver` while a drag is in progress. dnd-kit's own registration effect reacting to that constant reference churn could spiral into a render loop. Those option objects are now stable references that only change when their underlying values actually do.
|
|
786
|
+
- 3c66584: Fixed KanbanBoard drags starting too easily on touchscreens: mouse and touch previously shared one sensor with an 8px movement threshold, which meant a normal swipe-to-scroll on a touch device could immediately be picked up as a card/column drag. Touch now requires a brief press-and-hold (250ms) before a drag arms, matching the pattern used elsewhere in the library, while mouse still starts a drag on a small movement as before.
|
|
787
|
+
- cc7eb95: Added an optional `maxItems` (work-in-progress limit) to `KanbanColumnDef`, shown as a `count/maxItems` badge on the column header with a warning style once exceeded — display-only, enforce a hard cap in your own `onChange` if you want one
|
|
788
|
+
|
|
789
|
+
## 0.14.0
|
|
790
|
+
|
|
791
|
+
### Minor Changes
|
|
792
|
+
|
|
793
|
+
- 39d74cc: Added orientation to Divider (horizontal or vertical) and taught ButtonGroup to treat a role="separator" child as a visible divider rather than merging it into an adjacent button's border, so a vertical Divider can be used as a seam between buttons whose style has no border of its own.
|
|
794
|
+
- 39d74cc: Added ButtonGroup component for joining a row or column of buttons into a single seamless control.
|
|
795
|
+
- fc9fbb1: Added `iconPosition` to Input, letting the input's icon — built-in or custom — be placed on the left instead of the default right, with the field padding, material label, and native placeholder all shifting out of its way automatically. A custom `icon` now also replaces the built-in icon for `Edit`/`Phone`/`Email`; it's ignored for `Search`/`Password`, whose icon is functional (clear button, show/hide toggle) rather than decorative.
|
|
796
|
+
- 0bf5047: Added SplitButton component, a primary action button with an attached dropdown of secondary actions.
|
|
797
|
+
- d51b8d1: VirtualList now keeps calling `onLoadMore` until the rows fill its viewport, so a first batch shorter than the list height no longer dead-ends lazy loading with nothing to scroll
|
|
798
|
+
|
|
799
|
+
### Patch Changes
|
|
800
|
+
|
|
801
|
+
- 47bf195: Fixed FloatingMenu so clicking inside its content closes the menu by default (matching `dontCloseOnChildClick`'s documented behavior), and re-clicking the trigger while open now closes it cleanly instead of a close-then-reopen glitch.
|
|
802
|
+
- 47bf195: Added keyboard support to FloatingMenu: Escape closes the menu and returns focus to the trigger, and Tab/Shift+Tab out of either end of the portaled content closes the menu and continues focus naturally past the trigger.
|
|
803
|
+
- fc9fbb1: Fixed Input's icons (built-in type icons and the custom `icon` prop) to scale with font-size instead of staying pinned at a fixed pixel size — a large `font-size` on the input no longer leaves a tiny icon behind.
|
|
804
|
+
- a795ffa: Input's Search type now suppresses the browser's native search-cancel decoration and always shows a themed, animated clear icon once there's a value — no `showCancel`/`onClearClicked` wiring needed, and clicking clear now actually clears the field.
|
|
805
|
+
- b2de2e0: Fixed Input and NumberInput to show the correct on-screen mobile keyboard: email/phone/search Inputs now set the matching `inputMode`, phone and search also get the correct native `type` (previously invalid values silently fell back to a plain text keyboard), and NumberInput now shows a numeric keypad.
|
|
806
|
+
- 6f3b2c2: Documented VirtualList's previously undocumented props: the whole drag-and-drop reordering API (`reorderable`, `treeReorder`, `dragHandle`, `onReorder`, `onTreeDrop`, `getItemDepth`, `isGroup`, `treeIndentPx`, `longPressDelay`), plus `rowHover`, `persistColumnsKey`, and the `dropIndicator`/`columnChip` slots
|
|
807
|
+
- 4e95bb3: Fixed VirtualList `dragHandle` mode making text in row inputs unselectable with the mouse in Firefox — a row now only carries `draggable` while the pointer is on its handle
|
|
808
|
+
|
|
809
|
+
## 0.13.0
|
|
810
|
+
|
|
811
|
+
### Minor Changes
|
|
812
|
+
|
|
813
|
+
- 5d3133d: Added Alert component for persistent inline status messages.
|
|
814
|
+
- f979907: Added Breadcrumb component for showing a page's position within a hierarchy.
|
|
815
|
+
- f979907: Added maxItems to Breadcrumb, collapsing long trails behind a clickable ellipsis that reveals the hidden items in a menu.
|
|
816
|
+
- ce2fca9: Added Carousel component with arrows, dots, drag/swipe, autoplay, and infinite looping.
|
|
817
|
+
- 471a428: Added Rating component for star ratings, with half-star increments, keyboard control, and a read-only mode.
|
|
818
|
+
|
|
819
|
+
## 0.12.0
|
|
820
|
+
|
|
821
|
+
### Minor Changes
|
|
822
|
+
|
|
823
|
+
- d61f2d8: Added a `Slider` component: pick a number from a range by drag, track click, or keyboard (arrows / Page Up-Down / Home-End). Controlled or uncontrolled, with `min`/`max`/`step`, `onChange`/`onChangeEnd`, tick `marks`, a `showValue` bubble, `formatValue`, `size`, ARIA slider semantics, `--slider-*` theme variables, and `root`/`track`/`range`/`thumb`/`mark`/`markLabel`/`value` slots.
|
|
824
|
+
- 5176a45: AnimatedText now waits until it scrolls into view to start its animation by default; set `triggerOnView={false}` to play immediately on mount as before.
|
|
825
|
+
- 767d64f: Added an eyedropper button to ColorPicker on browsers that support the native EyeDropper API, letting users sample a colour from anywhere on screen
|
|
826
|
+
|
|
827
|
+
### Patch Changes
|
|
828
|
+
|
|
829
|
+
- bb7804e: Removed the default blue tap-highlight flash on mobile for all clickable components
|
|
830
|
+
- 6936093: Vertical Stepper: the marker now stays centred in its label row and the connector line stays joined to it even when a label wraps to several lines, via flex-grow connector segments above and below the marker.
|
|
831
|
+
|
|
832
|
+
## 0.11.0
|
|
833
|
+
|
|
834
|
+
### Minor Changes
|
|
835
|
+
|
|
836
|
+
- 6689a8c: Toasts can now be swiped away to dismiss on touch devices, pausing the auto-dismiss timer for the duration of the drag
|
|
837
|
+
|
|
838
|
+
### Patch Changes
|
|
839
|
+
|
|
840
|
+
- 2ddfd96: Fixed FloatingMenu closing on a click inside a nested overlay rendered by its own content (e.g. a Dropdown's list) — DatePicker's month/year dropdowns no longer close the whole picker when selected
|
|
841
|
+
|
|
842
|
+
## 0.10.0
|
|
843
|
+
|
|
844
|
+
### Minor Changes
|
|
845
|
+
|
|
846
|
+
- 9659772: Added AnimatedText component with RiseUp, BlurIn, Bounce, Typewriter, Scramble, Glitch, Wave, Shine, and Highlight variants, letter/word unit staggering, and automatic replay when its props change
|
|
847
|
+
- 4b549ff: Added Popover — a portaled floating panel with four-side placement, start/center/end alignment, click/hover/focus triggers, auto-flip, an arrow, controlled or uncontrolled open state, and non-modal keyboard focus management (focus moves into the panel on open, Tab/Shift+Tab and Escape move focus out and close, with focus returned to the trigger).
|
|
848
|
+
- ac1dae0: Reworked Stepper: per-step `icon`, `description`, `error`, `optional`, and `disabled`; collapsible vertical step `content` with `collapse` modes (None / ActiveOnly / Completed); `styleType` presets (Default / Outlined / Dots); `labelPlacement`; overridable `--stepper-*` theme variables (typed on `ThemeVariables`, set theme-wide via `ThemeProvider` or per instance via `style`); and `StepperAlignment` as an enum (string values still accepted).
|
|
849
|
+
|
|
850
|
+
### Patch Changes
|
|
851
|
+
|
|
852
|
+
- 8dd52fb: Deduplicated the scroll-ancestor tracking logic shared by Popover and FloatingMenu into a common internal utility
|
|
853
|
+
- 2d4044c: Fixed ThemeProvider's theme-color meta tag not being re-inserted into the document after React's development-mode remount cycle
|
|
854
|
+
|
|
855
|
+
## 0.9.0
|
|
856
|
+
|
|
857
|
+
### Minor Changes
|
|
858
|
+
|
|
859
|
+
- acbeac5: Added RadioGroup — single-choice selection following the ARIA radiogroup pattern (roving tabindex, arrow-key navigation), with controlled/uncontrolled/formValidator values, an Input-style error tooltip and error state, per-option descriptions, horizontal or vertical layout, and ConfigProvider support.
|
|
860
|
+
|
|
861
|
+
### Patch Changes
|
|
862
|
+
|
|
863
|
+
- 606d9f0: Fixed AnimatedLogo outline retracting at the end when `loop` is false — the drawn stroke now stays put alongside the fill
|
|
864
|
+
- 606d9f0: AnimatedLogo `scale` now scales back out at the end of each loop, mirroring the stroke retract
|
|
865
|
+
- 52abd6e: DatePicker with `isModal` now shows a pointer cursor and normal (non-muted) text on its read-only input instead of the greyed-out read-only styling
|
|
866
|
+
- ad90a03: DropZone no longer shows a hover highlight on plain mouse hover when it isn't clickable (`openPickerOnClick` off) — drag-over feedback is unaffected
|
|
867
|
+
- 55e5a1f: ScrollbarProvider now blends onto any surface color instead of assuming `--background` — the Firefox track and the webkit thumb's inset gap are transparent rather than hardcoded to `--background`
|
|
868
|
+
- eff1453: Sticky elements now coordinate automatically: overlapping ones (in DOM order) stack underneath each other once stuck instead of pinning to the same spot, while non-overlapping ones (e.g. two half-width Stickies side by side under a full-width one) land at the same top instead of pushing each other down
|
|
869
|
+
|
|
870
|
+
## 0.8.0
|
|
871
|
+
|
|
872
|
+
### Minor Changes
|
|
873
|
+
|
|
874
|
+
- 964763b: Added AnimatedLogo, a self-drawing SVG mark that traces its outline then fills in, accepting any custom `path`/`viewBox`, an optional `fill={false}` for an outline-only trace, and optional `spin`/`scale` props to rotate from 180°→0° and/or grow from 0→1 while it draws
|
|
875
|
+
|
|
876
|
+
### Patch Changes
|
|
877
|
+
|
|
878
|
+
- dcb57c5: Fixed Dropdown menu closing on tap on touch devices — the portaled list is now registered with Downshift via `getMenuProps`, so tapping an item selects it instead of closing the menu and passing the tap through to the element behind
|
|
879
|
+
|
|
880
|
+
## 0.7.1
|
|
881
|
+
|
|
882
|
+
### Patch Changes
|
|
883
|
+
|
|
884
|
+
- 7992c78: Extracted the form validation engine (`FormValidator`, `FormValidatorGroup`, `Validators`, and related hooks/types) into a standalone `@ahrowe/form-validation` package, now a dependency of `@ahrowe/ui`. No change to the public API — everything is still exported from `@ahrowe/ui` exactly as before.
|
|
885
|
+
|
|
886
|
+
## 0.7.0
|
|
887
|
+
|
|
888
|
+
### Minor Changes
|
|
889
|
+
|
|
890
|
+
- 836b657: Added a `readOnly` prop to `InputDropdown` that blocks typing, keeps the list from opening, and disables keyboard navigation/selection.
|
|
891
|
+
|
|
892
|
+
## 0.6.0
|
|
893
|
+
|
|
894
|
+
### Minor Changes
|
|
895
|
+
|
|
896
|
+
- ef6797a: Added a `readOnly` prop to `Dropdown` that locks the selection without greying the field out — the menu can't open and the value can't change, but the field keeps its normal appearance and stays focusable.
|
|
897
|
+
- ef6797a: Added a `readOnly` prop to `NumberInput` that blocks typing and disables the arrow steppers and ↑/↓ keys; read-only inputs now also get a muted visual treatment.
|
|
898
|
+
|
|
899
|
+
### Patch Changes
|
|
900
|
+
|
|
901
|
+
- ef6797a: Read-only `Input`, `NumberInput`, and `Dropdown` fields no longer show the primary-colour focus border or float their label on focus — those "editing" affordances are suppressed when read-only, while the label still floats when a value is present.
|
|
902
|
+
|
|
903
|
+
## 0.5.2
|
|
904
|
+
|
|
905
|
+
### Patch Changes
|
|
906
|
+
|
|
907
|
+
- 0cac13b: NumberInput: added a `fixedDecimalScale` prop (default `true`, preserving current padding behaviour). Set `fixedDecimalScale={false}` to make `decimalScale` an upper limit only — the user may enter fewer decimals and they're kept as-is (`12` stays `12`, `12.1` stays `12.1`), while anything beyond `decimalScale` is still truncated.
|
|
908
|
+
|
|
909
|
+
## 0.5.1
|
|
910
|
+
|
|
911
|
+
### Patch Changes
|
|
912
|
+
|
|
913
|
+
- e392f92: Checkbox now sets `aria-disabled` when disabled, so assistive tech announces the disabled state (the control is a `role="checkbox"` div, not a native input)
|
|
914
|
+
- e392f92: VirtualList: columns can now set `lockVisible` (always visible, can't be hidden from the gear menu, shown checked and disabled) and `toggleLabel` (custom gear-menu text, e.g. label an unheadered actions column as "Actions")
|
|
915
|
+
- e392f92: VirtualList: columns can now set `hideFromToggle` to be omitted from the gear menu entirely (no entry at all, unlike `lockVisible` which shows a disabled entry). The gear button hides automatically when no column is left to toggle.
|
|
916
|
+
- e392f92: VirtualList: the column show/hide gear menu now renders through `FloatingMenu`, so it escapes clipping ancestors (scroll containers, cards) and flips up when there's no room below. Note: this popover now portals via `BodyEnd`, so a `<div id="bodyEnd">` is required for the toggle menu to appear (only when the column toggle is used).
|
|
917
|
+
|
|
918
|
+
## 0.5.0
|
|
919
|
+
|
|
920
|
+
### Minor Changes
|
|
921
|
+
|
|
922
|
+
- be384e6: ConfirmModal: added an `isDelete` prop that renders the confirm button with the destructive (delete) style, a `submitLabel` prop, `cancelLabel` prop and `ConfigProvider` support so the submit label, cancel label and other props can be defaulted globally
|
|
923
|
+
|
|
924
|
+
### Patch Changes
|
|
925
|
+
|
|
926
|
+
- 24f40ed: Required marks (Input, Dropdown) now use a new `--required-mark-color` theme variable that falls back to `--error-color`, replacing the non-existent `--error-font-color`. Both components now render the mark in their material floating label (previously the Dropdown showed no mark at all when `useMatLabelStyle` was on), and the Input's standard label no longer shows a duplicate asterisk.
|
|
927
|
+
|
|
928
|
+
## 0.4.4
|
|
929
|
+
|
|
930
|
+
### Patch Changes
|
|
931
|
+
|
|
932
|
+
- Added changeset - used to create patchnotes for future updates
|
|
933
|
+
- Added sectionHeader component - a component used instead of h to create headers
|
|
934
|
+
- Added Divider — a horizontal rule with optional text, positioned left, center, or right
|