@ahrowe/ui 0.42.0 → 0.44.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 +946 -0
- package/README.md +14 -12
- 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/configProvider/configProvider.types.d.ts +4 -0
- 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/loader/index.d.ts +2 -0
- package/dist/cjs-types/common/loader/loader.d.ts +4 -0
- package/dist/cjs-types/common/loader/loader.types.d.ts +31 -0
- package/dist/cjs-types/common/loadingOverlay/index.d.ts +2 -0
- package/dist/cjs-types/common/loadingOverlay/loadingOverlay.d.ts +4 -0
- package/dist/cjs-types/common/loadingOverlay/loadingOverlay.types.d.ts +21 -0
- 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 +7 -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/cjs-types/index.d.ts +4 -1
- 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/checkbox/checkbox.mjs +1 -1
- package/dist/esm/common/checkbox/checkbox.mjs.map +1 -1
- package/dist/esm/common/checkbox/checkbox.module.mjs +1 -1
- package/dist/esm/common/checkbox/checkbox.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/dropdown/dropdown.mjs +1 -1
- package/dist/esm/common/dropdown/dropdown.mjs.map +1 -1
- package/dist/esm/common/dropdown/dropdown.module.mjs +1 -1
- package/dist/esm/common/dropdown/dropdown.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/kanbanBoard/KanbanColumn.mjs +1 -1
- package/dist/esm/common/kanbanBoard/KanbanColumn.mjs.map +1 -1
- package/dist/esm/common/kanbanBoard/kanbanBoard.module.mjs +1 -1
- package/dist/esm/common/kanbanBoard/kanbanBoard.module.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/loader/loader.mjs +2 -0
- package/dist/esm/common/loader/loader.mjs.map +1 -0
- package/dist/esm/common/loader/loader.module.mjs +2 -0
- package/dist/esm/common/loader/loader.module.mjs.map +1 -0
- package/dist/esm/common/loader/loader.types.mjs +2 -0
- package/dist/esm/common/loader/loader.types.mjs.map +1 -0
- package/dist/esm/common/loadingOverlay/loadingOverlay.mjs +2 -0
- package/dist/esm/common/loadingOverlay/loadingOverlay.mjs.map +1 -0
- package/dist/esm/common/loadingOverlay/loadingOverlay.module.mjs +2 -0
- package/dist/esm/common/loadingOverlay/loadingOverlay.module.mjs.map +1 -0
- 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/common/virtualList/virtualList.mjs +1 -1
- package/dist/esm/common/virtualList/virtualList.mjs.map +1 -1
- package/dist/esm/common/virtualList/virtualList.module.mjs +1 -1
- package/dist/esm/common/virtualList/virtualList.module.mjs.map +1 -1
- 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/configProvider/configProvider.types.d.ts +4 -0
- 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/loader/index.d.ts +2 -0
- package/dist/types/common/loader/loader.d.ts +4 -0
- package/dist/types/common/loader/loader.types.d.ts +31 -0
- package/dist/types/common/loadingOverlay/index.d.ts +2 -0
- package/dist/types/common/loadingOverlay/loadingOverlay.d.ts +4 -0
- package/dist/types/common/loadingOverlay/loadingOverlay.types.d.ts +21 -0
- 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 +7 -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/dist/types/index.d.ts +4 -1
- 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 +24 -13
- package/docs/Calendar.md +35 -17
- package/docs/Card.md +53 -14
- package/docs/Checkbox.md +1 -1
- package/docs/Chip.md +24 -9
- package/docs/ConfigProvider.md +4 -4
- package/docs/CopyButton.md +6 -5
- package/docs/Loader.md +95 -0
- package/docs/LoadingOverlay.md +85 -0
- package/docs/ProgressBar.md +7 -4
- package/docs/SectionHeader.md +1 -1
- package/docs/Skeleton.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/cjs-types/common/loading/index.d.ts +0 -1
- package/dist/cjs-types/common/loading/spinnerLoading/index.d.ts +0 -2
- package/dist/cjs-types/common/loading/spinnerLoading/spinnerLoading.d.ts +0 -6
- 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/dist/esm/common/loading/spinnerLoading/index.mjs +0 -2
- package/dist/esm/common/loading/spinnerLoading/index.mjs.map +0 -1
- package/dist/esm/common/loading/spinnerLoading/spinnerLoading.mjs +0 -2
- package/dist/esm/common/loading/spinnerLoading/spinnerLoading.mjs.map +0 -1
- package/dist/esm/common/loading/spinnerLoading/spinnerLoading.module.mjs +0 -2
- package/dist/esm/common/loading/spinnerLoading/spinnerLoading.module.mjs.map +0 -1
- package/dist/types/common/loading/index.d.ts +0 -1
- package/dist/types/common/loading/spinnerLoading/index.d.ts +0 -2
- package/dist/types/common/loading/spinnerLoading/spinnerLoading.d.ts +0 -6
- package/docs/Loading.md +0 -68
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"progressBar.mjs","names":[],"sources":["../../../../package/common/progressBar/progressBar.tsx"],"sourcesContent":["import type { ReactElement } from 'react';\nimport cx from 'classnames';\nimport { Progress, ProgressBarProps } from './progressBar.types';\n\nimport styles from './progressBar.module.pcss';\
|
|
1
|
+
{"version":3,"file":"progressBar.mjs","names":[],"sources":["../../../../package/common/progressBar/progressBar.tsx"],"sourcesContent":["import type { ReactElement } from 'react';\nimport cx from 'classnames';\nimport { Progress, ProgressBarProps } from './progressBar.types';\n\nimport styles from './progressBar.module.pcss';\nimport { toneProps, useToneCheck } from '../styles/tone';\n\nfunction ProgressBar({\n className = undefined,\n total = 100,\n progress = 0,\n style = undefined,\n classNames,\n styles: slotStyles,\n ...rest\n}: ProgressBarProps): ReactElement {\n const progressArray: Progress[] = Array.isArray(progress)\n ? progress\n : typeof progress === 'object'\n ? [progress]\n : [{ amount: progress }];\n useToneCheck(\n 'ProgressBar',\n progressArray.map((prog) => prog.color),\n );\n\n function renderProgressBars() {\n return progressArray.map((prog, index) => {\n const widthPercentage = !total ? 0 : (prog.amount / total) * 100;\n const tone = prog.color ? toneProps(prog.color) : undefined;\n\n return (\n <div\n key={index}\n className={cx(\n styles.progressBarFill,\n tone && [tone.className, styles.progressBarFillToned],\n index === progressArray.length - 1 && styles.progressBarFillEnd,\n prog.class,\n classNames?.fill,\n )}\n style={{\n width: `${widthPercentage}%`,\n ...tone?.style,\n ...slotStyles?.fill,\n }}\n title={prog.label ? `${prog.label}: ${prog.amount}` : undefined}\n >\n {prog.label && (\n <div className={cx(styles.progressBarLabel, classNames?.label)} style={slotStyles?.label}>\n {prog.label}\n </div>\n )}\n </div>\n );\n });\n }\n\n return (\n <div\n {...rest}\n className={cx(styles.progressBar, className, classNames?.root)}\n style={{ ...style, ...slotStyles?.root }}\n >\n {renderProgressBars()}\n </div>\n );\n}\n\nexport default ProgressBar;\n"],"mappings":"wLAOA,SAAS,EAAY,CACnB,YAAY,IAAA,GACZ,QAAQ,IACR,WAAW,EACX,QAAQ,IAAA,GACR,aACA,OAAQ,EACR,GAAG,GAC8B,CACjC,IAAM,EAA4B,MAAM,QAAQ,CAAQ,EACpD,EACA,OAAO,GAAa,SAClB,CAAC,CAAQ,EACT,CAAC,CAAE,OAAQ,CAAS,CAAC,EAC3B,EACE,cACA,EAAc,IAAK,GAAS,EAAK,KAAK,CACxC,EAEA,SAAS,GAAqB,CAC5B,OAAO,EAAc,KAAK,EAAM,IAAU,CACxC,IAAM,EAAmB,EAAa,EAAK,OAAS,EAAS,IAA5B,EAC3B,EAAO,EAAK,MAAQ,EAAU,EAAK,KAAK,EAAI,IAAA,GAElD,OACE,EAAC,MAAD,CAEE,UAAW,EACT,EAAO,gBACP,GAAQ,CAAC,EAAK,UAAW,EAAO,oBAAoB,EACpD,IAAU,EAAc,OAAS,GAAK,EAAO,mBAC7C,EAAK,MACL,GAAY,IACd,EACA,MAAO,CACL,MAAO,GAAG,EAAgB,GAC1B,GAAG,GAAM,MACT,GAAG,GAAY,IACjB,EACA,MAAO,EAAK,MAAQ,GAAG,EAAK,MAAM,IAAI,EAAK,SAAW,IAAA,GAErD,SAAA,EAAK,OACJ,EAAC,MAAD,CAAK,UAAW,EAAG,EAAO,iBAAkB,GAAY,KAAK,EAAG,MAAO,GAAY,MAChF,SAAA,EAAK,KACH,CAAA,CAEJ,EApBE,CAoBF,CAET,CAAC,CACH,CAEA,OACE,EAAC,MAAD,CACE,GAAI,EACJ,UAAW,EAAG,EAAO,YAAa,EAAW,GAAY,IAAI,EAC7D,MAAO,CAAE,GAAG,EAAO,GAAG,GAAY,IAAK,EAEtC,SAAA,EAAmB,CACjB,CAAA,CAET"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use client";var e=`progressBar_LO0sX`,t=`progressBar-fill_rt32j`,n=`progressBar-fill-end_71wL3`,r=`progressBar-label_jWud2`,
|
|
1
|
+
"use client";var e=`progressBar_LO0sX`,t=`progressBar-fill_rt32j`,n=`progressBar-fill-end_71wL3`,r=`progressBar-fill-toned_cM4yE`,i=`progressBar-label_jWud2`,a={progressBar:e,"progressBar-fill":`progressBar-fill_rt32j`,progressBarFill:t,"progressBar-fill-end":`progressBar-fill-end_71wL3`,progressBarFillEnd:n,"progressBar-fill-toned":`progressBar-fill-toned_cM4yE`,progressBarFillToned:r,"progressBar-label":`progressBar-label_jWud2`,progressBarLabel:i};export{a as default,e as progressBar,t as progressBarFill,n as progressBarFillEnd,r as progressBarFillToned,i as progressBarLabel};
|
|
2
2
|
//# sourceMappingURL=progressBar.module.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"progressBar.module.mjs","names":[],"sources":["../../../../package/common/progressBar/progressBar.module.pcss"],"sourcesContent":[".progressBar {\n min-width: 100px;\n min-height: 10px;\n background-color: var(--progress-bar-track-color, var(--background-accent-light));\n border-radius: var(--default-border-radius);\n overflow: hidden;\n display: flex;\n align-items: stretch;\n\n &-fill {\n background-color: var(--primary-color);\n background-image: var(--primary-gradient, none);\n width: 0;\n display: flex;\n align-items: center;\n overflow: hidden;\n transition: width 0.3s ease;\n transform: translateZ(0);\n container-type: inline-size;\n\n &-end {\n border-radius: 0 var(--default-border-radius) var(--default-border-radius) 0;\n }\n }\n\n &-label {\n color: var(--text-on-primary);\n font-size: 12px;\n padding: 0 min(5px, 4cqw);\n box-sizing: border-box;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n}\n\n/* The bar still shows its value, it just stops sliding to it. */\n@media (prefers-reduced-motion: reduce) {\n .progressBar-fill {\n transition: none;\n }\n}\n"],"mappings":""}
|
|
1
|
+
{"version":3,"file":"progressBar.module.mjs","names":[],"sources":["../../../../package/common/progressBar/progressBar.module.pcss"],"sourcesContent":[".progressBar {\n min-width: 100px;\n min-height: 10px;\n background-color: var(--progress-bar-track-color, var(--background-accent-light));\n border-radius: var(--default-border-radius);\n overflow: hidden;\n display: flex;\n align-items: stretch;\n\n &-fill {\n background-color: var(--primary-color);\n background-image: var(--primary-gradient, none);\n width: 0;\n display: flex;\n align-items: center;\n overflow: hidden;\n transition: width 0.3s ease;\n transform: translateZ(0);\n container-type: inline-size;\n\n &-end {\n border-radius: 0 var(--default-border-radius) var(--default-border-radius) 0;\n }\n\n /* After the rule above, which it ties on specificity. */\n &-toned {\n background-color: var(--tone-fill);\n background-image: var(--tone-gradient);\n }\n }\n\n &-label {\n color: var(--text-on-primary);\n font-size: 12px;\n padding: 0 min(5px, 4cqw);\n box-sizing: border-box;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n &-fill-toned &-label {\n color: var(--tone-contrast);\n }\n}\n\n/* The bar still shows its value, it just stops sliding to it. */\n@media (prefers-reduced-motion: reduce) {\n .progressBar-fill {\n transition: none;\n }\n}\n"],"mappings":""}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use client";import{useComponentDefaults as e}from"../configProvider/useComponentDefaults.mjs";import{useLabels as t}from"../configProvider/useLabels.mjs";import{renderIcon as n}from"../utils/renderIcon.mjs";import r from"../actionIcon/actionIcon.mjs";import i from"../hooks/useCoarsePointer.mjs";import a from"../input/input.mjs";import{OpeningKind as o,WallType as s}from"../floorPlan/floorPlan.types.mjs";import{pointToSegment as c}from"../floorPlan/floorPlan.geometry.mjs";import{DEFAULT_WALL_ATTRS as l,addOpening as ee,addRect as u,addWall as te,detachWall as ne,dissolveNode as re,mergeNodes as ie,moveNode as ae,removeOpening as oe,removeWall as se,splitWall as ce,updateOpening as le,weldShortWalls as ue}from"../floorPlan/floorPlan.graph.mjs";import{addFloor as de,duplicateFloor as fe,emptyFloorPlan as pe,floorBelow as me,floorBounds as he,floorIndex as ge,getFloor as _e,moveFloor as ve,removeFloor as ye,renameFloor as be,setFloor as xe,setFloorHeight as Se}from"../floorPlan/floorPlan.plan.mjs";import{commitDerivation as Ce,derivePlan as we}from"../floorPlan/floorPlan.rooms.mjs";import{HIT_PX as Te,HIT_PX_COARSE as Ee,hitTest as De,selectionsEqual as Oe,worldTolerances as ke}from"../floorPlan/floorPlan.hit.mjs";import{SnapKind as d,clientToWorld as Ae,resolveSnap as je}from"../floorPlan/floorPlan.snap.mjs";import{planFromJson as Me,planToJson as Ne}from"../floorPlan/floorPlan.json.mjs";import Pe from"../numberInput/index.mjs";import Fe from"../planCanvas/planCanvas.mjs";import{usePlanHistory as Ie}from"./usePlanHistory.mjs";import f from"./roomDrawer.module.mjs";import{useCallback as p,useEffect as m,useImperativeHandle as Le,useMemo as Re,useRef as h,useState as g}from"react";import _ from"classnames";import{faAngleDown as ze,faAngleUp as Be,faArrowPointer as Ve,faArrowRotateLeft as He,faArrowRotateRight as Ue,faBorderAll as We,faClone as Ge,faDoorOpen as Ke,faDownload as qe,faDraftingCompass as Je,faExpand as Ye,faLayerGroup as Xe,faMagnet as Ze,faMagnifyingGlassMinus as Qe,faMagnifyingGlassPlus as $e,faMinus as et,faPlus as tt,faRulerCombined as nt,faSquare as rt,faTrash as it,faUpload as at,faWindowMaximize as ot}from"@fortawesome/free-solid-svg-icons";import{Fragment as st,jsx as v,jsxs as y}from"react/jsx-runtime";var ct=[`select`,`wall`,`rect`,`door`,`window`,`archway`,`measure`],lt={v:`select`,w:`wall`,r:`rect`,d:`door`,n:`window`,a:`archway`,m:`measure`},ut={door:o.Door,window:o.Window,archway:o.Archway},dt={[o.Door]:{width:900,sill:0,head:2100},[o.Window]:{width:1200,sill:900,head:2100},[o.Archway]:{width:1200,sill:0,head:2100},[o.Gap]:{width:1e3,sill:0,head:2500}},ft=1,pt=4,mt=[];function ht(e){return e>=1e3?`${(e/1e3).toFixed(2)} m`:`${Math.round(e)} mm`}function gt(e){let t=e/1e6;return`${t.toFixed(+(t<10))} m²`}function _t(e){return`${Math.round(e*10)/10}°`}function vt(e){return`${Math.round(e*1e3)/10}%`}function yt(e){let t=(e*180/Math.PI%360+360)%360;return t>180?t-360:t}var bt={tools:`Drawing tools`,storeyHeightHint:`Storey height. The floors above move to sit on top of it.`,sillHeightHint:`How far above the floor the opening starts. Stored for a 3D view; it does not change the plan.`,select:`Select and edit`,wall:`Draw walls`,rect:`Draw a room`,measure:`Measure`,door:`Add a door`,window:`Add a window`,archway:`Add an archway`,undo:`Undo`,redo:`Redo`,download:`Download plan`,upload:`Open a plan file`,underlay:`Show the floor below`,addFloor:`Add a floor above`,floorName:`Floor name`,duplicateFloor:`Copy this floor to a new one above`,deleteFloor:`Delete this floor`,floorHeight:`Height (mm)`,moveFloorUp:`Move this floor up`,moveFloorDown:`Move this floor down`,newRoomName:e=>`Room ${e}`,newFloorName:e=>`Floor ${e}`,copiedFloorName:e=>`${e} copy`,initialFloorName:`Ground floor`,selectedFloor:`Floor`,importFailed:`That file could not be read as a floor plan`,snap:`Snap to grid and geometry`,angleLock:e=>`Lock to ${e}° angles`,grid:`Show grid`,zoomIn:`Zoom in`,zoomOut:`Zoom out`,fit:`Fit to content`,roomName:`Room name`,addCorner:`Add corner`,thickness:`Thickness (mm)`,width:`Width (mm)`,sill:`Sill (mm)`,deleteSelection:`Delete selection`,selectedCount:e=>`${e} selected`,selectedRoom:`Room`,selectedWall:`Wall`,selectedCorner:`Corner`,selectedDoor:`Door`,selectedWindow:`Window`,selectedArchway:`Archway`,selectedGap:`Gap`,hintSelect:`Drag a corner to reshape · Drag a wall to push it, and the room next door moves with it · Ctrl-click or drag a box to select several · Delete to remove`,hintSelectSingle:`Drag a corner to reshape · Drag a wall to push it, and the room next door moves with it · Drag the dot on a selected wall to add a corner · Delete to remove`,hintWall:`Click to place corners · Shift for a fixed angle, L to latch it · Click the first corner or press Enter to close`,hintRect:`Drag to draw a room`,hintMeasure:`Drag to measure · Drag an end or the line to adjust it · Delete removes one, Escape clears them`,hintOpening:`Click a wall to cut an opening into it`,relativeAngle:e=>`${e} rel`};function xt(xt){let{ref:St,value:Ct,defaultValue:wt,onChange:b,onChangeEnd:Tt,floorId:Et,defaultFloorId:Dt,onFloorChange:Ot,showFloorBar:kt=!0,showUnderlay:At=!0,tool:jt,defaultTool:Mt=`select`,onToolChange:Nt,tools:Pt=ct,selection:Ft,defaultSelection:It,onSelectionChange:Lt,multiSelect:Rt=!0,onHoverChange:zt,view:Bt,defaultView:Vt,onViewChange:Ht,minZoom:Ut=.005,maxZoom:Wt=2,fitOnMount:Gt=!0,gridSize:x=100,showGrid:Kt=!0,snap:qt=!0,angleLock:Jt=!1,constrainAngle:Yt=45,showSnapGuides:Xt=!0,wallThickness:Zt=l.thickness,wallHeight:Qt,openingDefaults:$t,showMeasurements:en=!0,formatLength:tn=ht,formatArea:nn=gt,formatAngle:rn=_t,formatZoom:an=vt,showToolbar:on=!0,showInspector:sn=!0,showHint:cn=!0,showHistoryControls:ln=!0,showFileControls:un=!0,fileName:dn,onImport:fn,historyMode:pn=`internal`,historyLimit:mn=50,onHistoryChange:hn,readOnly:gn=!1,disabled:S=!1,canvasHeight:_n=`420px`,getRoomColor:vn,renderRoomLabel:yn,labels:bn,icons:C,"aria-label":xn,className:Sn,style:Cn,classNames:w,styles:T,...wn}=e(`RoomDrawer`,xt),E=t(`RoomDrawer`,bn,bt),{newRoomName:Tn,newFloorName:En,copiedFloorName:Dn,initialFloorName:On,relativeAngle:kn}=E,An=i(),D=An?Ee:Te,jn=h(null),Mn=h(null),Nn=h(null),Pn=h(null),O=h({kind:`none`}),k=h(new Map),A=h(null),Fn=h(!1),In=h(!1),Ln=h(!1),Rn=Re(()=>wt??Ct??pe({floorLabel:On}),[]),j=Ie(Rn,mn),zn=Ct!==void 0,M=zn?Ct:j.present;m(()=>{if(zn&&Ct){if(Ct===Pn.current){j.replace(Ct);return}j.commit(Ct,`external`)}},[Ct,zn]);let[Bn,Vn]=g(Dt),Hn=Et??Bn??M.floors[0]?.id,N=Re(()=>_e(M,Hn)??_e(M)??pe().floors[0],[M,Hn]),[Un,Wn]=g(At);m(()=>Wn(At),[At]);let Gn=Re(()=>Un?me(M,N.id):null,[Un,M,N.id]),Kn=p(e=>{e!==N.id&&(Et===void 0&&Vn(e),Ot?.(e))},[N.id,Et,Ot]),P=Re(()=>we(N),[N]).rooms,[qn,Jn]=g(Mt),F=jt??qn,Yn=p(e=>{jt===void 0&&Jn(e),Nt?.(e)},[jt,Nt]),[Xn,Zn]=g(It??mt),I=Ft===void 0?Xn:Ft,L=h(I);L.current=I;let R=p(e=>{let t=e===null?mt:Array.isArray(e)?e:[e];L.current=t,Ft===void 0&&Zn(t),Lt?.([...t])},[Ft,Lt]),Qn=p(e=>{let t=L.current,n=t.filter(t=>t.type!==e.type||t.id!==e.id);R(n.length===t.length?[...t,e]:n)},[R]),z=I.length===1?I[0]:null,$n=p(e=>{let t=new Set;for(let n of e)if(n.type===`node`)t.add(n.id);else if(n.type===`wall`){let e=N.walls[n.id];e&&(t.add(e.a),t.add(e.b))}else if(n.type===`room`){let e=P.find(e=>e.roomId===n.id);for(let n of e?.nodeIds??[])t.add(n)}return t},[N.walls,P]),er=Re(()=>$n(I),[$n,I]),[tr,nr]=g(null),[rr,ir]=g(Vt??{x:0,y:0,zoom:.05}),B=Bt??rr,V=p(e=>{Bt===void 0&&ir(e),Ht?.(e)},[Bt,Ht]),[H,ar]=g({width:800,height:420}),[U,or]=g([]),[W,sr]=g(null),[cr,lr]=g(qt),[ur,dr]=g(Jt);m(()=>lr(qt),[qt]),m(()=>dr(Jt),[Jt]);let[fr,pr]=g(Kt);m(()=>pr(Kt),[Kt]);let mr=h(null),[G,hr]=g(null),[K,gr]=g([]),_r=h(0),[vr,yr]=g(null),br=h(null),xr=p(e=>{let t=ke(D,B.zoom);for(let n=K.length-1;n>=0;n--){let r=K[n];if(Math.hypot(e.x-r.a.x,e.y-r.a.y)<=t.node)return{id:r.id,end:`a`};if(Math.hypot(e.x-r.b.x,e.y-r.b.y)<=t.node)return{id:r.id,end:`b`}}for(let n=K.length-1;n>=0;n--){let r=K[n];if(c(e,r.a,r.b).dist<=t.wall)return{id:r.id}}return null},[K,D,B.zoom]),[Sr,Cr]=g(null),q=!gn&&!S,wr=Re(()=>{if(U.length<2)return;let e=U[U.length-2],t=U[U.length-1];return Math.atan2(t.y-e.y,t.x-e.x)},[U]);m(()=>{let e=Mn.current;if(!e)return;let t=new ResizeObserver(()=>{let t=e.getBoundingClientRect();t.width>0&&t.height>0&&ar({width:Math.round(t.width),height:Math.round(t.height)})});t.observe(e);let n=e.getBoundingClientRect();return n.width>0&&n.height>0&&ar({width:Math.round(n.width),height:Math.round(n.height)}),()=>t.disconnect()},[]);let Tr=p((e,t)=>{let n=Mn.current?.getBoundingClientRect()??{left:0,top:0};return Ae(e,t,n,B)},[B]),J=p(e=>({x:(e.x-B.x)*B.zoom,y:(e.y-B.y)*B.zoom}),[B]),Y=p((e,t,n,r,i)=>{let a=cr!==In.current,o=ur!==Ln.current,s=je(e,{floor:N,pxToWorld:B.zoom>0?1/B.zoom:1,origin:t,referenceAngle:r,excludeNodeIds:n,excludeWallIds:i,options:{enabled:a?[d.Node,d.Intersection,d.Wall,d.Angle,d.Extension,d.Alignment,d.Grid]:[],gridSize:x,angleStepDeg:o?Yt:0,toleranceScreenPx:An?16:10}});return mr.current=s,s},[N,B.zoom,cr,ur,x,Yt,An]),Er=p(e=>{let t=Object.values(N.walls).filter(t=>t.a===e||t.b===e),n=new Set(t.map(e=>e.id)),r=N.nodes[e];if(!r)return{excludeWallIds:n};let i={x:r.x,y:r.y},a,o=t[0];if(o){let t=o.a===e?o.b:o.a,n=N.nodes[t];n&&(a=Math.atan2(n.y-r.y,n.x-r.x))}return{origin:i,referenceAngle:a,excludeWallIds:n}},[N]),Dr=p((e={})=>{let t=e.padding??24,n=he(N);if(!n||n.width<=0||n.height<=0){V({x:-1e3,y:-1e3,zoom:.05});return}let r=Math.min((H.width-t*2)/n.width,(H.height-t*2)/n.height),i=Math.max(Ut,Math.min(Wt,r));V({x:n.minX-(H.width/i-n.width)/2,y:n.minY-(H.height/i-n.height)/2,zoom:i})},[N,H.width,H.height,Ut,Wt,V]),Or=h(!1);m(()=>{Gt&&!Or.current&&Object.keys(N.nodes).length!==0&&(H.width<=1||(Or.current=!0,Dr()))},[Gt,N,H.width,Dr]);let kr=p((e,t,n,r=[],i={})=>{if(e===N)return M;let a=xe(M,e);Pn.current=a,n?i.push===!1?j.replace(a):j.commit(a,t,r):j.updateGesture(a);let o={reason:t,committed:n,targetIds:r};return b?.(a,o),n&&Tt?.(a,o),a},[N,M,j,b,Tt]),X=p((e,t,n=[],r={})=>{let i=Ce(ue(e).floor,{nameFor:Tn}).floor;return kr(i,t,!0,n,r)},[kr,Tn]);m(()=>{hn?.({canUndo:j.canUndo,canRedo:j.canRedo})},[j.canUndo,j.canRedo,hn]);let Ar=Re(()=>z?.type===`room`?P.find(e=>e.roomId===z.id)??null:null,[z,P]),Z=z?.type===`wall`?N.walls[z.id]:void 0,jr=z?.type===`opening`?N.openings[z.id]:void 0,Mr=Re(()=>{if(!Z)return null;let e=N.nodes[Z.a],t=N.nodes[Z.b];return!e||!t?null:{x:(e.x+t.x)/2,y:(e.y+t.y)/2}},[Z,N.nodes]),Nr=p(()=>{if(!q||!Z)return;let e=ce(N,Z.id,.5);e.result.wallIds&&(X(e.floor,`edit-wall`,[e.result.nodeId]),R({type:`node`,id:e.result.nodeId}))},[q,Z,N,X,R]),Pr=p((e,t,n=new Set)=>{if(e.type===`wall`)return{floor:se(t,e.id).floor};if(e.type===`opening`)return{floor:oe(t,e.id).floor};if(e.type===`node`){let n=re(t,e.id,{force:!0});if(n.result)return{floor:n.floor,reselect:{type:`wall`,id:n.result.wallId}};let r=t;for(let n of Object.values(t.walls))(n.a===e.id||n.b===e.id)&&(r=se(r,n.id,{dissolveCollinear:!1}).floor);return{floor:r}}let r=P.find(t=>t.roomId===e.id);if(!r)return{floor:t};let i=new Set;for(let t of P)if(t.roomId!==e.id&&!(t.roomId&&n.has(t.roomId)))for(let e of t.wallIds)i.add(e);let a=t;for(let e of new Set(r.wallIds))i.has(e)||(a=se(a,e,{dissolveCollinear:!1}).floor);let o={...a.rooms};return delete o[e.id],{floor:{...a,rooms:o}}},[P]),Fr=p(()=>{let e=L.current;if(!q||e.length===0)return;let t={room:0,opening:1,wall:2,node:3},n=[...e].sort((e,n)=>t[e.type]-t[n.type]),r=new Set(n.filter(e=>e.type===`room`).map(e=>e.id)),i=N,a;for(let e of n){let t=Pr(e,i,r);i=t.floor,n.length===1&&(a=t.reselect)}i!==N&&(X(i,`delete`,n.map(e=>e.id)),R(a??null))},[q,N,Pr,X,R]),Ir=p(()=>{or(e=>e.length===0?e:[]),hr(null)},[]);m(()=>{Ir()},[F,Ir]);let Lr=p(e=>{if(S)return;if(jn.current?.focus(),Cr(null),k.current.set(e.pointerId,{x:e.clientX,y:e.clientY}),e.currentTarget.setPointerCapture?.(e.pointerId),k.current.size===2){let[e,t]=[...k.current.values()];O.current.kind!==`none`&&O.current.kind!==`pan`&&j.cancelGesture(),O.current={kind:`pinch`,startDist:Math.hypot(t.x-e.x,t.y-e.y),startView:B,startMid:{x:(e.x+t.x)/2,y:(e.y+t.y)/2}};return}if(k.current.size>2)return;if(A.current={client:{x:e.clientX,y:e.clientY},moved:!1},e.button===1||Fn.current){O.current={kind:`pan`,startClient:{x:e.clientX,y:e.clientY},startView:B};return}if(e.button!==0)return;let t=Tr(e.clientX,e.clientY);if(!q){let e=De(N,P,t,ke(D,B.zoom));R(e);return}if(F===`rect`){let e=Y(t).point;O.current={kind:`rect`,start:e,current:e},j.beginGesture();return}if(F===`measure`){let e=xr(t);if(e){let n=K.find(t=>t.id===e.id);O.current=e.end?{kind:`measureEnd`,id:e.id,end:e.end}:{kind:`measureMove`,id:e.id,startWorld:t,origA:n.a,origB:n.b};return}let n=Y(t).point;O.current={kind:`measure`,start:n,current:n};return}if(F===`wall`){let e=U[U.length-1],n=Y(t,e,void 0,wr).point;if(U.length===0){or([n]);return}let r=U[U.length-1],i=te(N,r,n,{thickness:Zt,type:s.Interior,height:Qt},ke(D,B.zoom).node);i.result.wallIds.length>0&&X(i.floor,`draw-wall`,i.result.wallIds),U.length>=2&&Math.hypot(n.x-U[0].x,n.y-U[0].y)<ke(D,B.zoom).node?Ir():or(e=>[...e,n]);return}let n=ut[F];if(n){let e=ke(D,B.zoom),r=De(N,P,t,e,{accept:[`wall`]});if(r?.type!==`wall`)return;let i=N.walls[r.id],a=N.nodes[i.a],o=N.nodes[i.b],s=Math.hypot(o.x-a.x,o.y-a.y),c=((t.x-a.x)*(o.x-a.x)+(t.y-a.y)*(o.y-a.y))/(s*s||1),l={...dt[n],...$t?.[n]},u=ee(N,{wallId:i.id,kind:n,offset:Math.min(Math.max(c,0),1)*s,width:l.width,sill:l.sill,head:l.head});u.result.openingId&&(X(u.floor,`add-opening`,[u.result.openingId]),R({type:`opening`,id:u.result.openingId}));return}let r=ke(D,B.zoom);if(Mr&&z?.type===`wall`&&Math.hypot(t.x-Mr.x,t.y-Mr.y)<=r.node){j.beginGesture(),O.current={kind:`wallSplit`,wallId:z.id,at:Mr};return}let i=De(N,P,t,r),a=Rt&&(e.ctrlKey||e.metaKey);if(!i){a||R(null),O.current=Rt?{kind:`marquee`,start:t,current:t,additive:a,base:L.current}:{kind:`none`};return}if((e.ctrlKey||e.metaKey)&&i.type===`wall`&&N.walls[i.id]){let e=N.walls[i.id];a||R(i),j.beginGesture(),O.current={kind:`wall`,wallId:i.id,startWorld:t,origA:{...N.nodes[e.a]},origB:{...N.nodes[e.b]},moved:!1,detach:!0,toggle:a};return}if(a){Qn(i),O.current={kind:`none`};return}if(L.current.some(e=>e.type===i.type&&e.id===i.id)||R(i),j.beginGesture(),L.current.length>1){let e=[...$n(L.current)],n={};for(let t of e){let e=N.nodes[t];e&&(n[t]={x:e.x,y:e.y})}O.current={kind:`room`,nodeIds:e,startWorld:t,orig:n,moved:!1};return}if(i.type===`node`)O.current={kind:`node`,nodeId:i.id,moved:!1,...Er(i.id)};else if(i.type===`wall`){let e=N.walls[i.id];O.current={kind:`wall`,wallId:i.id,startWorld:t,origA:{...N.nodes[e.a]},origB:{...N.nodes[e.b]},moved:!1}}else if(i.type===`opening`)O.current={kind:`opening`,openingId:i.id,moved:!1};else{let e=P.find(e=>e.roomId===i.id),n=e?[...new Set(e.nodeIds)]:[],r={};for(let e of n){let t=N.nodes[e];t&&(r[e]={x:t.x,y:t.y})}O.current={kind:`room`,nodeIds:n,startWorld:t,orig:r,moved:!1}}},[S,q,B,F,N,P,D,Tr,Y,U,Zt,Qt,$t,X,R,Mr,z,wr,Er,$n,Rt,Qn,j,Ir,xr,K]),Rr=p(e=>{if(S)return;k.current.has(e.pointerId)&&k.current.set(e.pointerId,{x:e.clientX,y:e.clientY});let t=O.current;if(t.kind===`pinch`&&k.current.size>=2){let[e,n]=[...k.current.values()],r=Math.hypot(n.x-e.x,n.y-e.y);if(t.startDist<=0)return;let i=Math.max(Ut,Math.min(Wt,t.startView.zoom*(r/t.startDist))),a=Mn.current?.getBoundingClientRect()??{left:0,top:0},o={x:(e.x+n.x)/2,y:(e.y+n.y)/2},s=Ae(t.startMid.x,t.startMid.y,a,t.startView);V({x:s.x-(o.x-a.left)/i,y:s.y-(o.y-a.top)/i,zoom:i});return}if(A.current){let t=e.clientX-A.current.client.x,n=e.clientY-A.current.client.y;Math.hypot(t,n)>pt&&(A.current.moved=!0)}if(t.kind===`pan`){V({x:t.startView.x-(e.clientX-t.startClient.x)/t.startView.zoom,y:t.startView.y-(e.clientY-t.startClient.y)/t.startView.zoom,zoom:t.startView.zoom});return}let n=Tr(e.clientX,e.clientY);if(sr(n),t.kind===`none`){if(!q)return;if(F===`wall`&&U.length>0){let e=Y(n,U[U.length-1],void 0,wr);sr(e.point),hr(e);return}if(F===`select`){let e=De(N,P,n,ke(D,B.zoom));Oe(e,tr)||(nr(e),zt?.(e))}F===`measure`&&yr(xr(n)?.id??null);return}if(A.current?.moved){if(t.kind===`measureEnd`){let e=Y(n).point;gr(n=>n.map(n=>n.id===t.id?{...n,[t.end]:e}:n)),sr(e);return}if(t.kind===`measureMove`){let e=n.x-t.startWorld.x,r=n.y-t.startWorld.y;gr(n=>n.map(n=>n.id===t.id?{...n,a:{x:t.origA.x+e,y:t.origA.y+r},b:{x:t.origB.x+e,y:t.origB.y+r}}:n));return}if(t.kind===`rect`||t.kind===`measure`){O.current={...t,current:Y(n).point},sr(Y(n).point);return}if(t.kind===`marquee`){O.current={...t,current:n},sr(n);return}if(t.kind===`wallSplit`){let e=ce(N,t.wallId,t.at);if(!e.result.wallIds){O.current={kind:`none`};return}let r=e.result.nodeId,i=N.walls[t.wallId],a=i?e.floor.nodes[i.a]:void 0,o=i?e.floor.nodes[i.b]:void 0,s={origin:a?{x:a.x,y:a.y}:void 0,referenceAngle:a&&o?Math.atan2(o.y-a.y,o.x-a.x):void 0,excludeWallIds:new Set(e.result.wallIds)},c=Y(n,s.origin,new Set([r]),s.referenceAngle,s.excludeWallIds).point;O.current={kind:`node`,nodeId:r,moved:!0,...s},R({type:`node`,id:r}),hr(mr.current),kr(ae(e.floor,r,c).floor,`move-node`,!1,[r]);return}if(t.kind===`node`){let e=Y(n,t.origin,new Set([t.nodeId]),t.referenceAngle,t.excludeWallIds).point;hr(mr.current),O.current={...t,moved:!0},kr(ae(N,t.nodeId,e).floor,`move-node`,!1,[t.nodeId]);return}if(t.kind===`wall`){let e=N.walls[t.wallId];if(!e)return;let r=t.origB.x-t.origA.x,i=t.origB.y-t.origA.y,a=Math.hypot(r,i);if(a<1e-6)return;let o={x:-i/a,y:r/a},s=(n.x-t.startWorld.x)*o.x+(n.y-t.startWorld.y)*o.y,c=qt!==In.current&&x>0?x:1,l=Math.round(s/c)*c,ee=Math.max(c,10);if(t.detach){if(Math.abs(l)<ee)return;let e=ne(N,t.wallId,{x:o.x*l,y:o.y*l});if(!e.result)return;O.current={...t,detach:!1,toggle:!1,detachedSign:Math.sign(l),moved:!0},R({type:`wall`,id:t.wallId}),kr(e.floor,`move-wall`,!1,[t.wallId]);return}let u=ae(N,e.a,{x:t.origA.x+o.x*l,y:t.origA.y+o.y*l}).floor;u=ae(u,e.b,{x:t.origB.x+o.x*l,y:t.origB.y+o.y*l}).floor,t.detachedSign&&Math.abs(l)<10?(u=ue(u).floor,O.current={...t,detachedSign:void 0,moved:!0}):O.current={...t,moved:!0},kr(u,`move-wall`,!1,[t.wallId]);return}if(t.kind===`opening`){let e=N.openings[t.openingId];if(!e)return;let r=N.walls[e.wallId],i=N.nodes[r.a],a=N.nodes[r.b],o=Math.hypot(a.x-i.x,a.y-i.y),s=((n.x-i.x)*(a.x-i.x)+(n.y-i.y)*(a.y-i.y))/(o*o||1);O.current={...t,moved:!0},kr(le(N,t.openingId,{offset:Math.min(Math.max(s,0),1)*o}).floor,`move-opening`,!1,[t.openingId]);return}if(t.kind===`room`){let e=n.x-t.startWorld.x,r=n.y-t.startWorld.y,i=qt!==In.current&&x>0?x:1,a=Math.round(e/i)*i,o=Math.round(r/i)*i,s=N;for(let e of t.nodeIds){let n=t.orig[e];n&&(s=ae(s,e,{x:n.x+a,y:n.y+o}).floor)}O.current={...t,moved:!0},kr(s,`move-room`,!1,t.nodeIds)}}},[S,q,F,N,P,tr,D,B.zoom,Ut,Wt,x,qt,Tr,Y,kr,V,R,U,wr,zt,xr]),zr=p((e,t)=>{k.current.delete(e.pointerId);let n=O.current;O.current={kind:`none`};let r=A.current?.moved??!1;if(A.current=null,hr(null),n.kind===`none`||n.kind===`pan`||n.kind===`pinch`)return;if(n.kind===`marquee`){if(t||!r){t&&R([...n.base]);return}let e=Math.min(n.start.x,n.current.x),i=Math.max(n.start.x,n.current.x),a=Math.min(n.start.y,n.current.y),o=Math.max(n.start.y,n.current.y),s=[];for(let t of Object.values(N.nodes))t.x>=e&&t.x<=i&&t.y>=a&&t.y<=o&&s.push({type:`node`,id:t.id});if(n.additive){let e=new Set(n.base.map(e=>`${e.type}:${e.id}`));R([...n.base,...s.filter(t=>!e.has(`${t.type}:${t.id}`))])}else R(s);return}if(t){let e=j.cancelGesture();e&&b?.(e,{reason:`external`,committed:!1,targetIds:[]});return}if(n.kind===`measureEnd`||n.kind===`measureMove`)return;if(n.kind===`measure`){let e=Math.hypot(n.current.x-n.start.x,n.current.y-n.start.y);r&&e>ft&&(_r.current+=1,gr(e=>[...e,{id:_r.current,a:n.start,b:n.current}]));return}if(n.kind===`rect`){if(!r){j.cancelGesture();return}let e=u(N,n.start,n.current,{thickness:Zt,type:s.Interior,height:Qt},ke(D,B.zoom).node);if(e.result.wallIds.length===0){j.cancelGesture();return}let t=j.endGesture();X(e.floor,`draw-rect`,e.result.wallIds,{push:!t});return}if(!r){j.cancelGesture(),n.kind===`wall`&&n.toggle&&Qn({type:`wall`,id:n.wallId});return}if(n.kind===`node`){let e=N.nodes[n.nodeId];if(e){let t=ke(D,B.zoom).node,r=Object.values(N.nodes).find(r=>r.id!==n.nodeId&&Math.hypot(r.x-e.x,r.y-e.y)<=t);if(r){let e=j.endGesture();X(ie(N,r.id,n.nodeId).floor,`move-node`,[r.id],{push:!e}),R({type:`node`,id:r.id});return}}}let i=j.endGesture(),a=n.kind===`wall`?`move-wall`:n.kind===`opening`?`move-opening`:n.kind===`room`?`move-room`:`move-node`;X(N,a,[],{push:!i})},[N,j,D,B.zoom,Zt,Qt,X,R,Qn,b]);m(()=>{let e=Mn.current;if(!e||S)return;function t(t){t.preventDefault();let n=e.getBoundingClientRect(),r=Math.exp(-t.deltaY*.002);V((()=>{let e=Br.current,i=Math.max(Ut,Math.min(Wt,e.zoom*r)),a=Ae(t.clientX,t.clientY,n,e);return{x:a.x-(t.clientX-n.left)/i,y:a.y-(t.clientY-n.top)/i,zoom:i}})())}return e.addEventListener(`wheel`,t,{passive:!1}),()=>e.removeEventListener(`wheel`,t)},[S,Ut,Wt,V]);let Br=h(B);Br.current=B;let Vr=p(e=>{let t=Math.max(Ut,Math.min(Wt,B.zoom*e)),n={x:B.x+H.width/2/B.zoom,y:B.y+H.height/2/B.zoom};V({x:n.x-H.width/2/t,y:n.y-H.height/2/t,zoom:t})},[B,H,Ut,Wt,V]),Hr=p(()=>{if(pn===`none`)return;let e=j.undo();e&&(Pn.current=e,b?.(e,{reason:`undo`,committed:!0,targetIds:[]}),Tt?.(e,{reason:`undo`,committed:!0,targetIds:[]}))},[pn,j,b,Tt]),Ur=p(()=>{if(pn===`none`)return;let e=j.redo();e&&(Pn.current=e,b?.(e,{reason:`redo`,committed:!0,targetIds:[]}),Tt?.(e,{reason:`redo`,committed:!0,targetIds:[]}))},[pn,j,b,Tt]),Wr=p(()=>{let e=P.filter(e=>e.roomId).map(e=>({type:`room`,id:e.roomId}));if(e.length>0){R(e);return}R(Object.keys(N.nodes).map(e=>({type:`node`,id:e})))},[P,N.nodes,R]),Gr=p((e,t)=>{if(!q||er.size===0)return;let n=x>0?x:100,r=Ln.current?n*10:n,i=N;for(let n of er){let a=i.nodes[n];a&&(i=ae(i,n,{x:a.x+e*r,y:a.y+t*r}).floor)}X(i,`nudge`,[...er])},[q,er,N,x,X]),Kr=p(e=>{if(S)return;let t=e.target;if(t instanceof HTMLInputElement||t instanceof HTMLTextAreaElement){e.key===`Escape`&&t.blur();return}if(e.key===`Shift`&&(Ln.current=!0),e.key===`Alt`&&(In.current=!0),e.key===` `&&!Fn.current){Fn.current=!0,e.preventDefault();return}let n=e.metaKey||e.ctrlKey;if(n&&e.key.toLowerCase()===`z`){e.preventDefault(),e.shiftKey?Ur():Hr();return}if(n&&e.key.toLowerCase()===`a`){e.preventDefault(),Rt&&Wr();return}if(n&&e.key.toLowerCase()===`y`){e.preventDefault(),Ur();return}if(e.key===`Escape`){U.length>0?Ir():K.length>0?gr([]):R(null);return}if(e.key===`Enter`&&F===`wall`){Ir();return}if(e.key===`Delete`||e.key===`Backspace`){if(e.preventDefault(),F===`measure`){vr!==null&&(gr(e=>e.filter(e=>e.id!==vr)),yr(null));return}Fr();return}if(e.key===`+`||e.key===`=`){Vr(1.25);return}if(e.key===`-`){Vr(1/1.25);return}if(e.key===`0`){Dr();return}if(e.key.startsWith(`Arrow`)){e.preventDefault();let t={ArrowLeft:[-1,0],ArrowRight:[1,0],ArrowUp:[0,-1],ArrowDown:[0,1]}[e.key];t&&Gr(t[0],t[1]);return}let r=e.key.toLowerCase();if(r===`s`){lr(e=>!e);return}if(r===`l`){dr(e=>!e);return}if(r===`g`){pr(e=>!e);return}let i=lt[e.key.toLowerCase()];i&&q&&Pt.includes(i)&&(Yn(i),Ir())},[S,q,Pt,F,U,K.length,vr,Ur,Hr,R,Ir,Fr,Vr,Dr,Gr,Yn,Rt,Wr]),Q=p((e,t,n)=>{Pn.current=e,n?.resetHistory?(j.clearHistory(),j.replace(e)):j.commit(e,t);let r={reason:t,committed:!0,targetIds:[]};b?.(e,r),Tt?.(e,r)},[j,b,Tt]),qr=p((e={})=>{let{plan:t,floor:n}=de(M,{nameFor:En,...e,index:ge(M,N.id)+1});return Q(t,`add-floor`),Kn(n.id),n.id},[M,N.id,Q,Kn,En]),Jr=p(()=>{let{plan:e,floor:t}=fe(M,N.id,{label:Dn(N.label)});return t?(Q(e,`duplicate-floor`),Kn(t.id),t.id):null},[M,N.id,N.label,Q,Kn,Dn]),Yr=p(e=>{let t=e??N.id,n=ye(M,t);if(n!==M&&(Q(n,`remove-floor`),t===N.id)){let e=ge(M,t);Kn(n.floors[Math.max(0,e-1)].id)}},[M,N.id,Q,Kn]),Xr=p((e,t)=>{let n=ve(M,e,t);n!==M&&Q(n,`move-floor`)},[M,Q]),Zr=p((e,t)=>{let n=Se(M,e,t);n!==M&&Q(n,`edit-floor`)},[M,Q]),Qr=p((e,t)=>{let n=be(M,e,t);n!==M&&Q(n,`rename-floor`)},[M,Q]),$r=p(e=>{let t=(e??dn??M.name??``).trim()||`floor-plan`,n=URL.createObjectURL(new Blob([Ne(M)],{type:`application/json`})),r=document.createElement(`a`);r.href=n,r.download=t.endsWith(`.json`)?t:`${t}.json`,r.click(),setTimeout(()=>URL.revokeObjectURL(n),0)},[dn,M]),ei=p(e=>{let t=Me(e);return t.plan&&Q(t.plan,`import`),Cr(t.plan&&t.issues.length===0?null:t.issues),fn?.(t),t},[fn,Q]),ti=p(e=>{e.text().then(e=>ei(e)).catch(e=>{let t=[`Could not read that file: ${e.message}`];Cr(t),fn?.({plan:null,issues:t})})},[ei,fn]),ni=p(()=>gr([]),[]),ri=p(e=>{e.key===`Shift`&&(Ln.current=!1),e.key===`Alt`&&(In.current=!1),e.key===` `&&(Fn.current=!1)},[]);Le(St,()=>({getPlan:()=>M,setPlan:(e,t)=>Q(e,`import`,t),clear:()=>Q(pe({floorLabel:On}),`clear`),getFloorId:()=>N.id,setFloorId:Kn,addFloor:e=>qr(e),duplicateFloor:Jr,removeFloor:Yr,renameFloor:Qr,moveFloor:Xr,setFloorHeight:Zr,clearMeasurements:ni,download:$r,loadJson:ei,undo:Hr,redo:Ur,canUndo:()=>pn!==`none`&&j.canUndo,canRedo:()=>pn!==`none`&&j.canRedo,clearHistory:j.clearHistory,getSelection:()=>[...L.current],select:R,addToSelection:e=>{let t=Array.isArray(e)?e:[e],n=new Set(L.current.map(e=>`${e.type}:${e.id}`));R([...L.current,...t.filter(e=>!n.has(`${e.type}:${e.id}`))])},toggleSelection:Qn,selectAll:Wr,deleteSelection:Fr,getView:()=>B,setView:V,zoomBy:Vr,fitToContent:Dr,toWorld:Tr,toScreen:J,getSvgElement:()=>Nn.current}),[M,j,Q,On,N,Kn,qr,Jr,Yr,Qr,Xr,Zr,ni,$r,ei,Hr,Ur,pn,R,Qn,Wr,Fr,B,V,Vr,Dr,Tr,J]);let $=O.current,ii=Re(()=>{if(!q)return null;let e=[],t=[...K,...$.kind===`measure`?[{id:-1,a:$.start,b:$.current}]:[]];for(let n of t){let t=J(n.a),r=J(n.b),i=Math.hypot(n.b.x-n.a.x,n.b.y-n.a.y);if(i<ft)continue;let a=Math.atan2(n.b.y-n.a.y,n.b.x-n.a.x),o=-Math.sin(a)*5,s=Math.cos(a)*5,c={x:(t.x+r.x)/2,y:(t.y+r.y)/2};if(e.push(y(`g`,{className:_(f.roomDrawerMeasureLine,vr===n.id&&f.roomDrawerMeasureLineHovered,w?.measureLine),children:[v(`line`,{x1:t.x,y1:t.y,x2:r.x,y2:r.y}),v(`line`,{x1:t.x-o,y1:t.y-s,x2:t.x+o,y2:t.y+s}),v(`line`,{x1:r.x-o,y1:r.y-s,x2:r.x+o,y2:r.y+s})]},`measure-${n.id}`)),F===`measure`&&n.id>=0)for(let[i,a]of[[`a`,t],[`b`,r]])e.push(v(`circle`,{className:f.roomDrawerMeasureGrip,cx:a.x,cy:a.y,r:4},`measure-grip-${n.id}-${i}`));e.push(v(`text`,{className:_(f.roomDrawerMeasure,w?.measureLine),x:c.x,y:c.y-8,textAnchor:`middle`,children:`${tn(i)} · ${rn(yt(a))}`},`measure-label-${n.id}`))}if(Xt&&G&&(G.guides.forEach((t,n)=>{let r=J(t.a),i=J(t.b);e.push(v(`line`,{className:_(f.roomDrawerGuide,t.kind===d.Angle&&f.roomDrawerGuideAngle),x1:r.x,y1:r.y,x2:i.x,y2:i.y},`guide-${n}`))}),G.kind!==d.None&&G.kind!==d.Grid)){let t=J(G.point);e.push(v(`rect`,{className:f.roomDrawerSnapMarker,x:t.x-4,y:t.y-4,width:8,height:8},`snap-marker`))}if($.kind===`rect`){let t=J($.start),n=J($.current),r=Math.min(t.x,n.x),i=Math.min(t.y,n.y),a=Math.max(t.x,n.x),o=Math.max(t.y,n.y);e.push(v(`rect`,{className:f.roomDrawerPreview,x:r,y:i,width:a-r,height:o-i},`rect-preview`));let s=Math.abs($.current.x-$.start.x),c=Math.abs($.current.y-$.start.y);en&&(s>0||c>0)&&(e.push(v(`text`,{className:f.roomDrawerMeasure,x:(r+a)/2,y:i-8,textAnchor:`middle`,children:tn(s)},`rect-width`),v(`text`,{className:f.roomDrawerMeasure,x:r-8,y:(i+o)/2,textAnchor:`end`,dominantBaseline:`central`,children:tn(c)},`rect-height`)),s>0&&c>0&&e.push(v(`text`,{className:_(f.roomDrawerMeasure,f.roomDrawerMeasureSecondary),x:(r+a)/2,y:(i+o)/2,textAnchor:`middle`,dominantBaseline:`central`,children:nn(s*c)},`rect-area`)))}if(F===`wall`&&U.length>0){let t=[...U,W].filter(Boolean).map(J);if(e.push(v(`polyline`,{className:f.roomDrawerPreview,points:t.map(e=>`${e.x},${e.y}`).join(` `),fill:`none`},`chain`)),t.forEach((t,n)=>{e.push(v(`circle`,{className:f.roomDrawerHandle,cx:t.x,cy:t.y,r:4},`chain-dot-${n}`))}),en&&W&&U.length>0){let t=U[U.length-1],n=Math.hypot(W.x-t.x,W.y-t.y),r=J({x:(t.x+W.x)/2,y:(t.y+W.y)/2}),i=G?.kind===d.Angle;e.push(v(`text`,{className:_(f.roomDrawerMeasure,i&&f.roomDrawerMeasureLocked),x:r.x,y:r.y-8,textAnchor:`middle`,children:`${tn(n)} · ${G?.angleRelativeTo===`reference`&&wr!==void 0?kn(rn(yt(Math.atan2(W.y-t.y,W.x-t.x)-wr))):rn(yt(Math.atan2(W.y-t.y,W.x-t.x)))}`},`chain-len`))}}let n=new Set(I.filter(e=>e.type===`node`).map(e=>e.id));for(let t of er){let r=N.nodes[t];if(!r)continue;let i=J(r);e.push(v(`circle`,{className:_(f.roomDrawerHandle,n.has(t)&&f.roomDrawerHandleActive),cx:i.x,cy:i.y,r:5},`handle-${t}`))}if($.kind===`marquee`&&A.current?.moved){let t=J($.start),n=J($.current);e.push(v(`rect`,{className:f.roomDrawerMarquee,x:Math.min(t.x,n.x),y:Math.min(t.y,n.y),width:Math.abs(n.x-t.x),height:Math.abs(n.y-t.y)},`marquee`))}if(Mr&&$.kind!==`node`){let t=J(Mr);e.push(v(`circle`,{className:f.roomDrawerMidHandle,cx:t.x,cy:t.y,r:4},`midpoint`))}if(en&&$.kind===`room`&&$.moved){let t=new Set($.nodeIds),n=$.nodeIds.find(e=>N.nodes[e]&&$.orig[e]);if(n){let t=N.nodes[n],r=$.orig[n],i=t.x-r.x,a=t.y-r.y,o=z?.type===`room`?P.find(e=>e.roomId===z.id):void 0,s=J(o?o.anchor:t);e.push(v(`text`,{className:_(f.roomDrawerMeasure,f.roomDrawerMeasureOffset),x:s.x,y:s.y-26,textAnchor:`middle`,children:`${tn(Math.hypot(i,a))} · ${rn(yt(Math.atan2(a,i)))}`},`room-offset`))}for(let n of Object.values(N.walls)){if(t.has(n.a)===t.has(n.b))continue;let r=N.nodes[n.a],i=N.nodes[n.b];if(!r||!i)continue;let a=t.has(n.a)?r:i,o=t.has(n.a)?i:r,s=J({x:(r.x+i.x)/2,y:(r.y+i.y)/2});e.push(v(`text`,{className:_(f.roomDrawerMeasure,f.roomDrawerMeasureSecondary),x:s.x,y:s.y-8,textAnchor:`middle`,children:`${tn(Math.hypot(o.x-a.x,o.y-a.y))} · ${rn(yt(Math.atan2(o.y-a.y,o.x-a.x)))}`},`room-stretch-${n.id}`))}}if(en&&(z?.type===`node`||z?.type===`wall`)){let t=[],n=new Set,r=(e,r,i)=>{if(n.has(e))return;let a=N.walls[e];a&&(n.add(e),t.push({wall:a,from:r,primary:i}))};if(z.type===`node`)for(let e of Object.values(N.walls))(e.a===z.id||e.b===z.id)&&r(e.id,z.id,!0);else{let e=N.walls[z.id];if(e){r(e.id,e.a,!0);for(let t of Object.values(N.walls))if(t.id!==e.id)for(let n of[e.a,e.b])(t.a===n||t.b===n)&&r(t.id,n,!1)}}let i=G?.kind===d.Angle&&$.kind!==`none`;for(let{wall:n,from:r,primary:a}of t){let t=N.nodes[n.a],o=N.nodes[n.b];if(!t||!o)continue;let s=n.a===r?t:o,c=n.a===r?o:t,l=J({x:(t.x+o.x)/2,y:(t.y+o.y)/2});e.push(v(`text`,{className:_(f.roomDrawerMeasure,!a&&f.roomDrawerMeasureSecondary,a&&i&&f.roomDrawerMeasureLocked),x:l.x,y:l.y-8,textAnchor:`middle`,children:`${tn(Math.hypot(c.x-s.x,c.y-s.y))} · ${rn(yt(Math.atan2(c.y-s.y,c.x-s.x)))}`},`measure-${n.id}`))}}return v(st,{children:e})},[q,$,F,U,W,I,N,P,z,er,Mr,en,Xt,G,wr,tn,nn,rn,kn,K,vr,w?.measureLine,J]),ai={select:{icon:Ve,label:E.select,key:`V`},wall:{icon:et,label:E.wall,key:`W`},rect:{icon:rt,label:E.rect,key:`R`},door:{icon:Ke,label:E.door,key:`D`},window:{icon:ot,label:E.window,key:`N`},archway:{icon:Ye,label:E.archway,key:`A`},measure:{icon:nt,label:E.measure,key:`M`}},oi=q?F===`wall`?E.hintWall:F===`rect`?E.hintRect:F===`measure`?E.hintMeasure:ut[F]?E.hintOpening:Rt?E.hintSelect:E.hintSelectSingle:``,si=I.length===0?E.selectedFloor:I.length>1?E.selectedCount(I.length):jr?{[o.Door]:E.selectedDoor,[o.Window]:E.selectedWindow,[o.Archway]:E.selectedArchway,[o.Gap]:E.selectedGap}[jr.kind]:Z?E.selectedWall:z?.type===`room`?E.selectedRoom:E.selectedCorner,ci=q?Pt:[];return y(`div`,{...wn,ref:jn,className:_(f.roomDrawer,S&&f.roomDrawerDisabled,Sn,w?.root),style:{...Cn,...T?.root},role:`application`,"aria-label":xn??`Floor plan editor`,tabIndex:S?-1:0,onKeyDown:Kr,onKeyUp:ri,children:[on&&y(`div`,{className:_(f.roomDrawerToolbar,w?.toolbar),style:T?.toolbar,role:`toolbar`,"aria-label":E.tools,children:[ci.map(e=>{let t=ai[e];return v(`button`,{type:`button`,className:_(f.roomDrawerToolButton,e===F&&f.roomDrawerToolButtonActive,w?.toolButton),style:T?.toolButton,title:`${t.label} (${t.key})`,"aria-label":t.label,"aria-pressed":e===F,onClick:()=>{Yn(e),Ir()},children:n(C?.[e]??t.icon,{className:_(f.roomDrawerToolIcon,w?.toolIcon),style:T?.toolIcon})},e)}),ci.length>0&&v(`span`,{className:f.roomDrawerToolbarSeparator}),q&&y(st,{children:[[{on:cr,toggle:()=>lr(e=>!e),icon:C?.snap??Ze,label:E.snap,key:`S`},{on:ur,toggle:()=>dr(e=>!e),icon:C?.angleLock??Je,label:E.angleLock(Yt),key:`L`},{on:fr,toggle:()=>pr(e=>!e),icon:C?.grid??We,label:E.grid,key:`G`},...me(M,N.id)?[{on:Un,toggle:()=>Wn(e=>!e),icon:C?.underlay??Xe,label:E.underlay,key:`B`}]:[]].map(e=>v(`button`,{type:`button`,className:_(f.roomDrawerToolButton,e.on&&f.roomDrawerToolButtonOn,w?.toolButton),style:T?.toolButton,title:`${e.label} (${e.key})`,"aria-label":e.label,"aria-pressed":e.on,onClick:e.toggle,children:n(e.icon,{className:_(f.roomDrawerToolIcon,w?.toolIcon),style:T?.toolIcon})},e.key)),v(`span`,{className:f.roomDrawerToolbarSeparator})]}),ln&&pn!==`none`&&q&&y(st,{children:[v(`button`,{type:`button`,className:_(f.roomDrawerViewButton,w?.viewButton),style:T?.viewButton,title:E.undo,"aria-label":E.undo,disabled:!j.canUndo,onClick:Hr,children:n(C?.undo??He)}),v(`button`,{type:`button`,className:_(f.roomDrawerViewButton,w?.viewButton),style:T?.viewButton,title:E.redo,"aria-label":E.redo,disabled:!j.canRedo,onClick:Ur,children:n(C?.redo??Ue)}),v(`span`,{className:f.roomDrawerToolbarSeparator})]}),un&&y(st,{children:[v(`button`,{type:`button`,className:_(f.roomDrawerViewButton,w?.viewButton),style:T?.viewButton,title:E.download,"aria-label":E.download,onClick:()=>$r(),children:n(C?.download??qe)}),q&&v(`button`,{type:`button`,className:_(f.roomDrawerViewButton,w?.viewButton),style:T?.viewButton,title:E.upload,"aria-label":E.upload,onClick:()=>br.current?.click(),children:n(C?.upload??at)}),v(`span`,{className:f.roomDrawerToolbarSeparator})]}),y(`div`,{className:_(f.roomDrawerViewControls,w?.viewControls),style:T?.viewControls,children:[v(`button`,{type:`button`,className:_(f.roomDrawerViewButton,w?.viewButton),style:T?.viewButton,title:E.zoomOut,"aria-label":E.zoomOut,onClick:()=>Vr(1/1.25),children:n(C?.zoomOut??Qe)}),v(`button`,{type:`button`,className:_(f.roomDrawerZoomLabel,w?.zoomLabel),style:T?.zoomLabel,title:E.fit,onClick:()=>Dr(),children:an(B.zoom)}),v(`button`,{type:`button`,className:_(f.roomDrawerViewButton,w?.viewButton),style:T?.viewButton,title:E.zoomIn,"aria-label":E.zoomIn,onClick:()=>Vr(1.25),children:n(C?.zoomIn??$e)})]})]}),kt&&M.floors.length>0&&y(`div`,{className:_(f.roomDrawerFloorBar,w?.floorBar),style:T?.floorBar,role:`tablist`,"aria-label":E.selectedFloor,children:[[...M.floors].reverse().map(e=>v(`button`,{type:`button`,role:`tab`,className:_(f.roomDrawerFloorTab,e.id===N.id&&f.roomDrawerFloorTabActive,w?.floorTab),style:T?.floorTab,"aria-selected":e.id===N.id,onClick:()=>Kn(e.id),children:e.label},e.id)),q&&v(`button`,{type:`button`,className:_(f.roomDrawerFloorTab,f.roomDrawerFloorTabAdd),title:E.addFloor,"aria-label":E.addFloor,onClick:()=>qr(),children:n(C?.addFloor??tt)})]}),v(`div`,{ref:Mn,className:_(f.roomDrawerCanvasWrapper,q&&F!==`select`&&f.roomDrawerCanvasWrapperDrawing,w?.canvasWrapper),style:{height:_n,...T?.canvasWrapper},onPointerDown:Lr,onPointerMove:Rr,onPointerUp:e=>zr(e,!1),onPointerCancel:e=>zr(e,!0),children:v(Fe,{ref:Nn,floor:N,underlay:Gn,rooms:P,view:B,size:H,selection:I,hovered:tr,interactiveRooms:!1,showGrid:fr,gridSize:x,showRoomLabels:!0,formatArea:nn,getRoomColor:vn,renderRoomLabel:yn,overlay:ii,classNames:w,styles:T})}),sn&&q&&y(`div`,{className:_(f.roomDrawerInspector,w?.inspector),style:T?.inspector,children:[v(`span`,{className:_(f.roomDrawerInspectorKind,I.length===0&&f.roomDrawerInspectorKindEmpty,w?.inspectorLabel),children:si}),I.length===0&&y(st,{children:[v(a,{className:_(f.roomDrawerInspectorName,w?.inspectorField),style:T?.inspectorField,label:E.floorName,value:N.label,onChange:e=>Qr(N.id,e)}),v(Pe,{className:_(f.roomDrawerInspectorField,w?.inspectorField),style:T?.inspectorField,label:E.floorHeight,title:E.storeyHeightHint,value:N.height,decimalScale:0,min:500,step:100,showArrows:!0,onChange:e=>{e!==void 0&&Zr(N.id,e)}}),M.floors.length>1&&y(st,{children:[v(`button`,{type:`button`,className:_(f.roomDrawerInspectorAction,w?.inspectorField),style:T?.inspectorField,title:E.moveFloorUp,"aria-label":E.moveFloorUp,disabled:ge(M,N.id)>=M.floors.length-1,onClick:()=>Xr(N.id,ge(M,N.id)+1),children:n(C?.moveFloorUp??Be)}),v(`button`,{type:`button`,className:_(f.roomDrawerInspectorAction,w?.inspectorField),style:T?.inspectorField,title:E.moveFloorDown,"aria-label":E.moveFloorDown,disabled:ge(M,N.id)<=0,onClick:()=>Xr(N.id,ge(M,N.id)-1),children:n(C?.moveFloorDown??ze)})]}),v(`button`,{type:`button`,className:_(f.roomDrawerInspectorAction,w?.inspectorField),style:T?.inspectorField,title:E.duplicateFloor,onClick:()=>Jr(),children:n(C?.duplicateFloor??Ge)}),M.floors.length>1&&v(r,{className:f.roomDrawerInspectorDelete,icon:C?.delete??it,title:E.deleteFloor,onClick:()=>Yr()})]}),Ar?.meta&&y(st,{children:[v(a,{className:_(f.roomDrawerInspectorName,w?.inspectorField),style:T?.inspectorField,label:E.roomName,value:Ar.meta.name,onChange:e=>{let t=Ar.meta;X({...N,rooms:{...N.rooms,[t.id]:{...t,name:e}}},`edit-room`,[t.id])}}),v(`span`,{className:_(f.roomDrawerInspectorLabel,w?.inspectorLabel),children:nn(Ar.area)})]}),Z&&v(`button`,{type:`button`,className:_(f.roomDrawerInspectorAction,w?.inspectorField),style:T?.inspectorField,onClick:Nr,children:E.addCorner}),Z&&v(Pe,{className:_(f.roomDrawerInspectorField,w?.inspectorField),style:T?.inspectorField,label:E.thickness,value:Z.thickness,decimalScale:0,min:10,showArrows:!0,step:10,onChange:e=>{e!==void 0&&X({...N,walls:{...N.walls,[Z.id]:{...Z,thickness:e}}},`edit-wall`,[Z.id])}}),jr&&y(st,{children:[v(Pe,{className:_(f.roomDrawerInspectorField,w?.inspectorField),style:T?.inspectorField,label:E.width,value:jr.width,decimalScale:0,min:100,step:50,showArrows:!0,onChange:e=>{e!==void 0&&X(le(N,jr.id,{width:e}).floor,`edit-opening`,[jr.id])}}),v(Pe,{className:_(f.roomDrawerInspectorField,w?.inspectorField),style:T?.inspectorField,label:E.sill,title:E.sillHeightHint,showArrows:!0,value:jr.sill,decimalScale:0,min:0,step:50,onChange:e=>{e!==void 0&&X(le(N,jr.id,{sill:e}).floor,`edit-opening`,[jr.id])}})]}),I.length>0&&v(r,{className:f.roomDrawerInspectorDelete,icon:C?.delete??it,title:E.deleteSelection,onClick:Fr})]}),un&&q&&v(`input`,{ref:br,type:`file`,accept:`application/json,.json`,className:f.roomDrawerFileInput,tabIndex:-1,"aria-hidden":`true`,onChange:e=>{let t=e.target.files?.[0];e.target.value=``,t&&ti(t)}}),cn&&(Sr!==null||oi)&&v(`div`,{className:_(f.roomDrawerHint,Sr!==null&&f.roomDrawerHintReport,w?.hint),style:T?.hint,role:Sr===null?void 0:`status`,children:Sr===null?oi:Sr.length===0?E.importFailed:Sr.join(` · `)})]})}export{xt as default};
|
|
1
|
+
"use client";import{useComponentDefaults as e}from"../configProvider/useComponentDefaults.mjs";import{useLabels as t}from"../configProvider/useLabels.mjs";import{ThemeColor as n}from"../themeProvider/color.types.mjs";import{renderIcon as r}from"../utils/renderIcon.mjs";import i from"../actionIcon/actionIcon.mjs";import a from"../hooks/useCoarsePointer.mjs";import o from"../input/input.mjs";import{OpeningKind as s,WallType as c}from"../floorPlan/floorPlan.types.mjs";import{pointToSegment as l}from"../floorPlan/floorPlan.geometry.mjs";import{DEFAULT_WALL_ATTRS as ee,addOpening as te,addRect as ne,addWall as re,detachWall as ie,dissolveNode as ae,mergeNodes as oe,moveNode as se,removeOpening as ce,removeWall as le,splitWall as ue,updateOpening as de,weldShortWalls as fe}from"../floorPlan/floorPlan.graph.mjs";import{addFloor as pe,duplicateFloor as me,emptyFloorPlan as he,floorBelow as ge,floorBounds as _e,floorIndex as ve,getFloor as ye,moveFloor as be,removeFloor as xe,renameFloor as Se,setFloor as Ce,setFloorHeight as we}from"../floorPlan/floorPlan.plan.mjs";import{commitDerivation as Te,derivePlan as Ee}from"../floorPlan/floorPlan.rooms.mjs";import{HIT_PX as De,HIT_PX_COARSE as Oe,hitTest as ke,selectionsEqual as Ae,worldTolerances as u}from"../floorPlan/floorPlan.hit.mjs";import{SnapKind as d,clientToWorld as je,resolveSnap as Me}from"../floorPlan/floorPlan.snap.mjs";import{planFromJson as Ne,planToJson as Pe}from"../floorPlan/floorPlan.json.mjs";import Fe from"../numberInput/index.mjs";import Ie from"../planCanvas/planCanvas.mjs";import{usePlanHistory as Le}from"./usePlanHistory.mjs";import f from"./roomDrawer.module.mjs";import{useCallback as p,useEffect as m,useImperativeHandle as Re,useMemo as ze,useRef as h,useState as g}from"react";import _ from"classnames";import{faAngleDown as Be,faAngleUp as Ve,faArrowPointer as He,faArrowRotateLeft as Ue,faArrowRotateRight as We,faBorderAll as Ge,faClone as Ke,faDoorOpen as qe,faDownload as Je,faDraftingCompass as Ye,faExpand as Xe,faLayerGroup as Ze,faMagnet as Qe,faMagnifyingGlassMinus as $e,faMagnifyingGlassPlus as et,faMinus as tt,faPlus as nt,faRulerCombined as rt,faSquare as it,faTrash as at,faUpload as ot,faWindowMaximize as st}from"@fortawesome/free-solid-svg-icons";import{Fragment as ct,jsx as v,jsxs as y}from"react/jsx-runtime";var lt=[`select`,`wall`,`rect`,`door`,`window`,`archway`,`measure`],ut={v:`select`,w:`wall`,r:`rect`,d:`door`,n:`window`,a:`archway`,m:`measure`},dt={door:s.Door,window:s.Window,archway:s.Archway},ft={[s.Door]:{width:900,sill:0,head:2100},[s.Window]:{width:1200,sill:900,head:2100},[s.Archway]:{width:1200,sill:0,head:2100},[s.Gap]:{width:1e3,sill:0,head:2500}},pt=1,mt=4,ht=[];function gt(e){return e>=1e3?`${(e/1e3).toFixed(2)} m`:`${Math.round(e)} mm`}function _t(e){let t=e/1e6;return`${t.toFixed(+(t<10))} m²`}function vt(e){return`${Math.round(e*10)/10}°`}function yt(e){return`${Math.round(e*1e3)/10}%`}function bt(e){let t=(e*180/Math.PI%360+360)%360;return t>180?t-360:t}var xt={tools:`Drawing tools`,storeyHeightHint:`Storey height. The floors above move to sit on top of it.`,sillHeightHint:`How far above the floor the opening starts. Stored for a 3D view; it does not change the plan.`,select:`Select and edit`,wall:`Draw walls`,rect:`Draw a room`,measure:`Measure`,door:`Add a door`,window:`Add a window`,archway:`Add an archway`,undo:`Undo`,redo:`Redo`,download:`Download plan`,upload:`Open a plan file`,underlay:`Show the floor below`,addFloor:`Add a floor above`,floorName:`Floor name`,duplicateFloor:`Copy this floor to a new one above`,deleteFloor:`Delete this floor`,floorHeight:`Height (mm)`,moveFloorUp:`Move this floor up`,moveFloorDown:`Move this floor down`,newRoomName:e=>`Room ${e}`,newFloorName:e=>`Floor ${e}`,copiedFloorName:e=>`${e} copy`,initialFloorName:`Ground floor`,selectedFloor:`Floor`,importFailed:`That file could not be read as a floor plan`,snap:`Snap to grid and geometry`,angleLock:e=>`Lock to ${e}° angles`,grid:`Show grid`,zoomIn:`Zoom in`,zoomOut:`Zoom out`,fit:`Fit to content`,roomName:`Room name`,addCorner:`Add corner`,thickness:`Thickness (mm)`,width:`Width (mm)`,sill:`Sill (mm)`,deleteSelection:`Delete selection`,selectedCount:e=>`${e} selected`,selectedRoom:`Room`,selectedWall:`Wall`,selectedCorner:`Corner`,selectedDoor:`Door`,selectedWindow:`Window`,selectedArchway:`Archway`,selectedGap:`Gap`,hintSelect:`Drag a corner to reshape · Drag a wall to push it, and the room next door moves with it · Ctrl-click or drag a box to select several · Delete to remove`,hintSelectSingle:`Drag a corner to reshape · Drag a wall to push it, and the room next door moves with it · Drag the dot on a selected wall to add a corner · Delete to remove`,hintWall:`Click to place corners · Shift for a fixed angle, L to latch it · Click the first corner or press Enter to close`,hintRect:`Drag to draw a room`,hintMeasure:`Drag to measure · Drag an end or the line to adjust it · Delete removes one, Escape clears them`,hintOpening:`Click a wall to cut an opening into it`,relativeAngle:e=>`${e} rel`};function St(St){let{ref:Ct,value:wt,defaultValue:Tt,onChange:b,onChangeEnd:Et,floorId:Dt,defaultFloorId:Ot,onFloorChange:kt,showFloorBar:At=!0,showUnderlay:jt=!0,tool:Mt,defaultTool:Nt=`select`,onToolChange:Pt,tools:Ft=lt,selection:It,defaultSelection:Lt,onSelectionChange:Rt,multiSelect:zt=!0,onHoverChange:Bt,view:Vt,defaultView:Ht,onViewChange:Ut,minZoom:Wt=.005,maxZoom:Gt=2,fitOnMount:Kt=!0,gridSize:x=100,showGrid:qt=!0,snap:Jt=!0,angleLock:Yt=!1,constrainAngle:Xt=45,showSnapGuides:Zt=!0,wallThickness:Qt=ee.thickness,wallHeight:$t,openingDefaults:en,showMeasurements:tn=!0,formatLength:nn=gt,formatArea:rn=_t,formatAngle:an=vt,formatZoom:on=yt,showToolbar:sn=!0,showInspector:cn=!0,showHint:ln=!0,showHistoryControls:un=!0,showFileControls:dn=!0,fileName:fn,onImport:pn,historyMode:mn=`internal`,historyLimit:hn=50,onHistoryChange:gn,readOnly:_n=!1,disabled:S=!1,canvasHeight:vn=`420px`,getRoomColor:yn,renderRoomLabel:bn,labels:xn,icons:C,"aria-label":Sn,className:Cn,style:wn,classNames:w,styles:T,...Tn}=e(`RoomDrawer`,St),E=t(`RoomDrawer`,xn,xt),{newRoomName:En,newFloorName:Dn,copiedFloorName:On,initialFloorName:kn,relativeAngle:An}=E,jn=a(),D=jn?Oe:De,Mn=h(null),Nn=h(null),Pn=h(null),Fn=h(null),O=h({kind:`none`}),k=h(new Map),A=h(null),In=h(!1),Ln=h(!1),Rn=h(!1),zn=ze(()=>Tt??wt??he({floorLabel:kn}),[]),j=Le(zn,hn),Bn=wt!==void 0,M=Bn?wt:j.present;m(()=>{if(Bn&&wt){if(wt===Fn.current){j.replace(wt);return}j.commit(wt,`external`)}},[wt,Bn]);let[Vn,Hn]=g(Ot),Un=Dt??Vn??M.floors[0]?.id,N=ze(()=>ye(M,Un)??ye(M)??he().floors[0],[M,Un]),[Wn,Gn]=g(jt);m(()=>Gn(jt),[jt]);let Kn=ze(()=>Wn?ge(M,N.id):null,[Wn,M,N.id]),P=p(e=>{e!==N.id&&(Dt===void 0&&Hn(e),kt?.(e))},[N.id,Dt,kt]),F=ze(()=>Ee(N),[N]).rooms,[qn,Jn]=g(Nt),I=Mt??qn,Yn=p(e=>{Mt===void 0&&Jn(e),Pt?.(e)},[Mt,Pt]),[Xn,Zn]=g(Lt??ht),L=It===void 0?Xn:It,R=h(L);R.current=L;let z=p(e=>{let t=e===null?ht:Array.isArray(e)?e:[e];R.current=t,It===void 0&&Zn(t),Rt?.([...t])},[It,Rt]),Qn=p(e=>{let t=R.current,n=t.filter(t=>t.type!==e.type||t.id!==e.id);z(n.length===t.length?[...t,e]:n)},[z]),B=L.length===1?L[0]:null,$n=p(e=>{let t=new Set;for(let n of e)if(n.type===`node`)t.add(n.id);else if(n.type===`wall`){let e=N.walls[n.id];e&&(t.add(e.a),t.add(e.b))}else if(n.type===`room`){let e=F.find(e=>e.roomId===n.id);for(let n of e?.nodeIds??[])t.add(n)}return t},[N.walls,F]),er=ze(()=>$n(L),[$n,L]),[tr,nr]=g(null),[rr,ir]=g(Ht??{x:0,y:0,zoom:.05}),V=Vt??rr,H=p(e=>{Vt===void 0&&ir(e),Ut?.(e)},[Vt,Ut]),[U,ar]=g({width:800,height:420}),[W,or]=g([]),[G,sr]=g(null),[cr,lr]=g(Jt),[ur,dr]=g(Yt);m(()=>lr(Jt),[Jt]),m(()=>dr(Yt),[Yt]);let[fr,pr]=g(qt);m(()=>pr(qt),[qt]);let mr=h(null),[hr,gr]=g(null),[K,_r]=g([]),vr=h(0),[yr,br]=g(null),xr=h(null),Sr=p(e=>{let t=u(D,V.zoom);for(let n=K.length-1;n>=0;n--){let r=K[n];if(Math.hypot(e.x-r.a.x,e.y-r.a.y)<=t.node)return{id:r.id,end:`a`};if(Math.hypot(e.x-r.b.x,e.y-r.b.y)<=t.node)return{id:r.id,end:`b`}}for(let n=K.length-1;n>=0;n--){let r=K[n];if(l(e,r.a,r.b).dist<=t.wall)return{id:r.id}}return null},[K,D,V.zoom]),[Cr,wr]=g(null),q=!_n&&!S,Tr=ze(()=>{if(W.length<2)return;let e=W[W.length-2],t=W[W.length-1];return Math.atan2(t.y-e.y,t.x-e.x)},[W]);m(()=>{let e=Nn.current;if(!e)return;let t=new ResizeObserver(()=>{let t=e.getBoundingClientRect();t.width>0&&t.height>0&&ar({width:Math.round(t.width),height:Math.round(t.height)})});t.observe(e);let n=e.getBoundingClientRect();return n.width>0&&n.height>0&&ar({width:Math.round(n.width),height:Math.round(n.height)}),()=>t.disconnect()},[]);let Er=p((e,t)=>{let n=Nn.current?.getBoundingClientRect()??{left:0,top:0};return je(e,t,n,V)},[V]),J=p(e=>({x:(e.x-V.x)*V.zoom,y:(e.y-V.y)*V.zoom}),[V]),Y=p((e,t,n,r,i)=>{let a=cr!==Ln.current,o=ur!==Rn.current,s=Me(e,{floor:N,pxToWorld:V.zoom>0?1/V.zoom:1,origin:t,referenceAngle:r,excludeNodeIds:n,excludeWallIds:i,options:{enabled:a?[d.Node,d.Intersection,d.Wall,d.Angle,d.Extension,d.Alignment,d.Grid]:[],gridSize:x,angleStepDeg:o?Xt:0,toleranceScreenPx:jn?16:10}});return mr.current=s,s},[N,V.zoom,cr,ur,x,Xt,jn]),Dr=p(e=>{let t=Object.values(N.walls).filter(t=>t.a===e||t.b===e),n=new Set(t.map(e=>e.id)),r=N.nodes[e];if(!r)return{excludeWallIds:n};let i={x:r.x,y:r.y},a,o=t[0];if(o){let t=o.a===e?o.b:o.a,n=N.nodes[t];n&&(a=Math.atan2(n.y-r.y,n.x-r.x))}return{origin:i,referenceAngle:a,excludeWallIds:n}},[N]),Or=p((e={})=>{let t=e.padding??24,n=_e(N);if(!n||n.width<=0||n.height<=0){H({x:-1e3,y:-1e3,zoom:.05});return}let r=Math.min((U.width-t*2)/n.width,(U.height-t*2)/n.height),i=Math.max(Wt,Math.min(Gt,r));H({x:n.minX-(U.width/i-n.width)/2,y:n.minY-(U.height/i-n.height)/2,zoom:i})},[N,U.width,U.height,Wt,Gt,H]),kr=h(!1);m(()=>{Kt&&!kr.current&&Object.keys(N.nodes).length!==0&&(U.width<=1||(kr.current=!0,Or()))},[Kt,N,U.width,Or]);let Ar=p((e,t,n,r=[],i={})=>{if(e===N)return M;let a=Ce(M,e);Fn.current=a,n?i.push===!1?j.replace(a):j.commit(a,t,r):j.updateGesture(a);let o={reason:t,committed:n,targetIds:r};return b?.(a,o),n&&Et?.(a,o),a},[N,M,j,b,Et]),X=p((e,t,n=[],r={})=>{let i=Te(fe(e).floor,{nameFor:En}).floor;return Ar(i,t,!0,n,r)},[Ar,En]);m(()=>{gn?.({canUndo:j.canUndo,canRedo:j.canRedo})},[j.canUndo,j.canRedo,gn]);let jr=ze(()=>B?.type===`room`?F.find(e=>e.roomId===B.id)??null:null,[B,F]),Z=B?.type===`wall`?N.walls[B.id]:void 0,Mr=B?.type===`opening`?N.openings[B.id]:void 0,Nr=ze(()=>{if(!Z)return null;let e=N.nodes[Z.a],t=N.nodes[Z.b];return!e||!t?null:{x:(e.x+t.x)/2,y:(e.y+t.y)/2}},[Z,N.nodes]),Pr=p(()=>{if(!q||!Z)return;let e=ue(N,Z.id,.5);e.result.wallIds&&(X(e.floor,`edit-wall`,[e.result.nodeId]),z({type:`node`,id:e.result.nodeId}))},[q,Z,N,X,z]),Fr=p((e,t,n=new Set)=>{if(e.type===`wall`)return{floor:le(t,e.id).floor};if(e.type===`opening`)return{floor:ce(t,e.id).floor};if(e.type===`node`){let n=ae(t,e.id,{force:!0});if(n.result)return{floor:n.floor,reselect:{type:`wall`,id:n.result.wallId}};let r=t;for(let n of Object.values(t.walls))(n.a===e.id||n.b===e.id)&&(r=le(r,n.id,{dissolveCollinear:!1}).floor);return{floor:r}}let r=F.find(t=>t.roomId===e.id);if(!r)return{floor:t};let i=new Set;for(let t of F)if(t.roomId!==e.id&&!(t.roomId&&n.has(t.roomId)))for(let e of t.wallIds)i.add(e);let a=t;for(let e of new Set(r.wallIds))i.has(e)||(a=le(a,e,{dissolveCollinear:!1}).floor);let o={...a.rooms};return delete o[e.id],{floor:{...a,rooms:o}}},[F]),Ir=p(()=>{let e=R.current;if(!q||e.length===0)return;let t={room:0,opening:1,wall:2,node:3},n=[...e].sort((e,n)=>t[e.type]-t[n.type]),r=new Set(n.filter(e=>e.type===`room`).map(e=>e.id)),i=N,a;for(let e of n){let t=Fr(e,i,r);i=t.floor,n.length===1&&(a=t.reselect)}i!==N&&(X(i,`delete`,n.map(e=>e.id)),z(a??null))},[q,N,Fr,X,z]),Lr=p(()=>{or(e=>e.length===0?e:[]),gr(null)},[]);m(()=>{Lr()},[I,Lr]);let Rr=p(e=>{if(S)return;if(Mn.current?.focus(),wr(null),k.current.set(e.pointerId,{x:e.clientX,y:e.clientY}),e.currentTarget.setPointerCapture?.(e.pointerId),k.current.size===2){let[e,t]=[...k.current.values()];O.current.kind!==`none`&&O.current.kind!==`pan`&&j.cancelGesture(),O.current={kind:`pinch`,startDist:Math.hypot(t.x-e.x,t.y-e.y),startView:V,startMid:{x:(e.x+t.x)/2,y:(e.y+t.y)/2}};return}if(k.current.size>2)return;if(A.current={client:{x:e.clientX,y:e.clientY},moved:!1},e.button===1||In.current){O.current={kind:`pan`,startClient:{x:e.clientX,y:e.clientY},startView:V};return}if(e.button!==0)return;let t=Er(e.clientX,e.clientY);if(!q){let e=ke(N,F,t,u(D,V.zoom));z(e);return}if(I===`rect`){let e=Y(t).point;O.current={kind:`rect`,start:e,current:e},j.beginGesture();return}if(I===`measure`){let e=Sr(t);if(e){let n=K.find(t=>t.id===e.id);O.current=e.end?{kind:`measureEnd`,id:e.id,end:e.end}:{kind:`measureMove`,id:e.id,startWorld:t,origA:n.a,origB:n.b};return}let n=Y(t).point;O.current={kind:`measure`,start:n,current:n};return}if(I===`wall`){let e=W[W.length-1],n=Y(t,e,void 0,Tr).point;if(W.length===0){or([n]);return}let r=W[W.length-1],i=re(N,r,n,{thickness:Qt,type:c.Interior,height:$t},u(D,V.zoom).node);i.result.wallIds.length>0&&X(i.floor,`draw-wall`,i.result.wallIds),W.length>=2&&Math.hypot(n.x-W[0].x,n.y-W[0].y)<u(D,V.zoom).node?Lr():or(e=>[...e,n]);return}let n=dt[I];if(n){let e=u(D,V.zoom),r=ke(N,F,t,e,{accept:[`wall`]});if(r?.type!==`wall`)return;let i=N.walls[r.id],a=N.nodes[i.a],o=N.nodes[i.b],s=Math.hypot(o.x-a.x,o.y-a.y),c=((t.x-a.x)*(o.x-a.x)+(t.y-a.y)*(o.y-a.y))/(s*s||1),l={...ft[n],...en?.[n]},ee=te(N,{wallId:i.id,kind:n,offset:Math.min(Math.max(c,0),1)*s,width:l.width,sill:l.sill,head:l.head});ee.result.openingId&&(X(ee.floor,`add-opening`,[ee.result.openingId]),z({type:`opening`,id:ee.result.openingId}));return}let r=u(D,V.zoom);if(Nr&&B?.type===`wall`&&Math.hypot(t.x-Nr.x,t.y-Nr.y)<=r.node){j.beginGesture(),O.current={kind:`wallSplit`,wallId:B.id,at:Nr};return}let i=ke(N,F,t,r),a=zt&&(e.ctrlKey||e.metaKey);if(!i){a||z(null),O.current=zt?{kind:`marquee`,start:t,current:t,additive:a,base:R.current}:{kind:`none`};return}if((e.ctrlKey||e.metaKey)&&i.type===`wall`&&N.walls[i.id]){let e=N.walls[i.id];a||z(i),j.beginGesture(),O.current={kind:`wall`,wallId:i.id,startWorld:t,origA:{...N.nodes[e.a]},origB:{...N.nodes[e.b]},moved:!1,detach:!0,toggle:a};return}if(a){Qn(i),O.current={kind:`none`};return}if(R.current.some(e=>e.type===i.type&&e.id===i.id)||z(i),j.beginGesture(),R.current.length>1){let e=[...$n(R.current)],n={};for(let t of e){let e=N.nodes[t];e&&(n[t]={x:e.x,y:e.y})}O.current={kind:`room`,nodeIds:e,startWorld:t,orig:n,moved:!1};return}if(i.type===`node`)O.current={kind:`node`,nodeId:i.id,moved:!1,...Dr(i.id)};else if(i.type===`wall`){let e=N.walls[i.id];O.current={kind:`wall`,wallId:i.id,startWorld:t,origA:{...N.nodes[e.a]},origB:{...N.nodes[e.b]},moved:!1}}else if(i.type===`opening`)O.current={kind:`opening`,openingId:i.id,moved:!1};else{let e=F.find(e=>e.roomId===i.id),n=e?[...new Set(e.nodeIds)]:[],r={};for(let e of n){let t=N.nodes[e];t&&(r[e]={x:t.x,y:t.y})}O.current={kind:`room`,nodeIds:n,startWorld:t,orig:r,moved:!1}}},[S,q,V,I,N,F,D,Er,Y,W,Qt,$t,en,X,z,Nr,B,Tr,Dr,$n,zt,Qn,j,Lr,Sr,K]),zr=p(e=>{if(S)return;k.current.has(e.pointerId)&&k.current.set(e.pointerId,{x:e.clientX,y:e.clientY});let t=O.current;if(t.kind===`pinch`&&k.current.size>=2){let[e,n]=[...k.current.values()],r=Math.hypot(n.x-e.x,n.y-e.y);if(t.startDist<=0)return;let i=Math.max(Wt,Math.min(Gt,t.startView.zoom*(r/t.startDist))),a=Nn.current?.getBoundingClientRect()??{left:0,top:0},o={x:(e.x+n.x)/2,y:(e.y+n.y)/2},s=je(t.startMid.x,t.startMid.y,a,t.startView);H({x:s.x-(o.x-a.left)/i,y:s.y-(o.y-a.top)/i,zoom:i});return}if(A.current){let t=e.clientX-A.current.client.x,n=e.clientY-A.current.client.y;Math.hypot(t,n)>mt&&(A.current.moved=!0)}if(t.kind===`pan`){H({x:t.startView.x-(e.clientX-t.startClient.x)/t.startView.zoom,y:t.startView.y-(e.clientY-t.startClient.y)/t.startView.zoom,zoom:t.startView.zoom});return}let n=Er(e.clientX,e.clientY);if(sr(n),t.kind===`none`){if(!q)return;if(I===`wall`&&W.length>0){let e=Y(n,W[W.length-1],void 0,Tr);sr(e.point),gr(e);return}if(I===`select`){let e=ke(N,F,n,u(D,V.zoom));Ae(e,tr)||(nr(e),Bt?.(e))}I===`measure`&&br(Sr(n)?.id??null);return}if(A.current?.moved){if(t.kind===`measureEnd`){let e=Y(n).point;_r(n=>n.map(n=>n.id===t.id?{...n,[t.end]:e}:n)),sr(e);return}if(t.kind===`measureMove`){let e=n.x-t.startWorld.x,r=n.y-t.startWorld.y;_r(n=>n.map(n=>n.id===t.id?{...n,a:{x:t.origA.x+e,y:t.origA.y+r},b:{x:t.origB.x+e,y:t.origB.y+r}}:n));return}if(t.kind===`rect`||t.kind===`measure`){O.current={...t,current:Y(n).point},sr(Y(n).point);return}if(t.kind===`marquee`){O.current={...t,current:n},sr(n);return}if(t.kind===`wallSplit`){let e=ue(N,t.wallId,t.at);if(!e.result.wallIds){O.current={kind:`none`};return}let r=e.result.nodeId,i=N.walls[t.wallId],a=i?e.floor.nodes[i.a]:void 0,o=i?e.floor.nodes[i.b]:void 0,s={origin:a?{x:a.x,y:a.y}:void 0,referenceAngle:a&&o?Math.atan2(o.y-a.y,o.x-a.x):void 0,excludeWallIds:new Set(e.result.wallIds)},c=Y(n,s.origin,new Set([r]),s.referenceAngle,s.excludeWallIds).point;O.current={kind:`node`,nodeId:r,moved:!0,...s},z({type:`node`,id:r}),gr(mr.current),Ar(se(e.floor,r,c).floor,`move-node`,!1,[r]);return}if(t.kind===`node`){let e=Y(n,t.origin,new Set([t.nodeId]),t.referenceAngle,t.excludeWallIds).point;gr(mr.current),O.current={...t,moved:!0},Ar(se(N,t.nodeId,e).floor,`move-node`,!1,[t.nodeId]);return}if(t.kind===`wall`){let e=N.walls[t.wallId];if(!e)return;let r=t.origB.x-t.origA.x,i=t.origB.y-t.origA.y,a=Math.hypot(r,i);if(a<1e-6)return;let o={x:-i/a,y:r/a},s=(n.x-t.startWorld.x)*o.x+(n.y-t.startWorld.y)*o.y,c=Jt!==Ln.current&&x>0?x:1,l=Math.round(s/c)*c,ee=Math.max(c,10);if(t.detach){if(Math.abs(l)<ee)return;let e=ie(N,t.wallId,{x:o.x*l,y:o.y*l});if(!e.result)return;O.current={...t,detach:!1,toggle:!1,detachedSign:Math.sign(l),moved:!0},z({type:`wall`,id:t.wallId}),Ar(e.floor,`move-wall`,!1,[t.wallId]);return}let te=se(N,e.a,{x:t.origA.x+o.x*l,y:t.origA.y+o.y*l}).floor;te=se(te,e.b,{x:t.origB.x+o.x*l,y:t.origB.y+o.y*l}).floor,t.detachedSign&&Math.abs(l)<10?(te=fe(te).floor,O.current={...t,detachedSign:void 0,moved:!0}):O.current={...t,moved:!0},Ar(te,`move-wall`,!1,[t.wallId]);return}if(t.kind===`opening`){let e=N.openings[t.openingId];if(!e)return;let r=N.walls[e.wallId],i=N.nodes[r.a],a=N.nodes[r.b],o=Math.hypot(a.x-i.x,a.y-i.y),s=((n.x-i.x)*(a.x-i.x)+(n.y-i.y)*(a.y-i.y))/(o*o||1);O.current={...t,moved:!0},Ar(de(N,t.openingId,{offset:Math.min(Math.max(s,0),1)*o}).floor,`move-opening`,!1,[t.openingId]);return}if(t.kind===`room`){let e=n.x-t.startWorld.x,r=n.y-t.startWorld.y,i=Jt!==Ln.current&&x>0?x:1,a=Math.round(e/i)*i,o=Math.round(r/i)*i,s=N;for(let e of t.nodeIds){let n=t.orig[e];n&&(s=se(s,e,{x:n.x+a,y:n.y+o}).floor)}O.current={...t,moved:!0},Ar(s,`move-room`,!1,t.nodeIds)}}},[S,q,I,N,F,tr,D,V.zoom,Wt,Gt,x,Jt,Er,Y,Ar,H,z,W,Tr,Bt,Sr]),Br=p((e,t)=>{k.current.delete(e.pointerId);let n=O.current;O.current={kind:`none`};let r=A.current?.moved??!1;if(A.current=null,gr(null),n.kind===`none`||n.kind===`pan`||n.kind===`pinch`)return;if(n.kind===`marquee`){if(t||!r){t&&z([...n.base]);return}let e=Math.min(n.start.x,n.current.x),i=Math.max(n.start.x,n.current.x),a=Math.min(n.start.y,n.current.y),o=Math.max(n.start.y,n.current.y),s=[];for(let t of Object.values(N.nodes))t.x>=e&&t.x<=i&&t.y>=a&&t.y<=o&&s.push({type:`node`,id:t.id});if(n.additive){let e=new Set(n.base.map(e=>`${e.type}:${e.id}`));z([...n.base,...s.filter(t=>!e.has(`${t.type}:${t.id}`))])}else z(s);return}if(t){let e=j.cancelGesture();e&&b?.(e,{reason:`external`,committed:!1,targetIds:[]});return}if(n.kind===`measureEnd`||n.kind===`measureMove`)return;if(n.kind===`measure`){let e=Math.hypot(n.current.x-n.start.x,n.current.y-n.start.y);r&&e>pt&&(vr.current+=1,_r(e=>[...e,{id:vr.current,a:n.start,b:n.current}]));return}if(n.kind===`rect`){if(!r){j.cancelGesture();return}let e=ne(N,n.start,n.current,{thickness:Qt,type:c.Interior,height:$t},u(D,V.zoom).node);if(e.result.wallIds.length===0){j.cancelGesture();return}let t=j.endGesture();X(e.floor,`draw-rect`,e.result.wallIds,{push:!t});return}if(!r){j.cancelGesture(),n.kind===`wall`&&n.toggle&&Qn({type:`wall`,id:n.wallId});return}if(n.kind===`node`){let e=N.nodes[n.nodeId];if(e){let t=u(D,V.zoom).node,r=Object.values(N.nodes).find(r=>r.id!==n.nodeId&&Math.hypot(r.x-e.x,r.y-e.y)<=t);if(r){let e=j.endGesture();X(oe(N,r.id,n.nodeId).floor,`move-node`,[r.id],{push:!e}),z({type:`node`,id:r.id});return}}}let i=j.endGesture(),a=n.kind===`wall`?`move-wall`:n.kind===`opening`?`move-opening`:n.kind===`room`?`move-room`:`move-node`;X(N,a,[],{push:!i})},[N,j,D,V.zoom,Qt,$t,X,z,Qn,b]);m(()=>{let e=Nn.current;if(!e||S)return;function t(t){t.preventDefault();let n=e.getBoundingClientRect(),r=Math.exp(-t.deltaY*.002);H((()=>{let e=Vr.current,i=Math.max(Wt,Math.min(Gt,e.zoom*r)),a=je(t.clientX,t.clientY,n,e);return{x:a.x-(t.clientX-n.left)/i,y:a.y-(t.clientY-n.top)/i,zoom:i}})())}return e.addEventListener(`wheel`,t,{passive:!1}),()=>e.removeEventListener(`wheel`,t)},[S,Wt,Gt,H]);let Vr=h(V);Vr.current=V;let Hr=p(e=>{let t=Math.max(Wt,Math.min(Gt,V.zoom*e)),n={x:V.x+U.width/2/V.zoom,y:V.y+U.height/2/V.zoom};H({x:n.x-U.width/2/t,y:n.y-U.height/2/t,zoom:t})},[V,U,Wt,Gt,H]),Ur=p(()=>{if(mn===`none`)return;let e=j.undo();e&&(Fn.current=e,b?.(e,{reason:`undo`,committed:!0,targetIds:[]}),Et?.(e,{reason:`undo`,committed:!0,targetIds:[]}))},[mn,j,b,Et]),Wr=p(()=>{if(mn===`none`)return;let e=j.redo();e&&(Fn.current=e,b?.(e,{reason:`redo`,committed:!0,targetIds:[]}),Et?.(e,{reason:`redo`,committed:!0,targetIds:[]}))},[mn,j,b,Et]),Gr=p(()=>{let e=F.filter(e=>e.roomId).map(e=>({type:`room`,id:e.roomId}));if(e.length>0){z(e);return}z(Object.keys(N.nodes).map(e=>({type:`node`,id:e})))},[F,N.nodes,z]),Kr=p((e,t)=>{if(!q||er.size===0)return;let n=x>0?x:100,r=Rn.current?n*10:n,i=N;for(let n of er){let a=i.nodes[n];a&&(i=se(i,n,{x:a.x+e*r,y:a.y+t*r}).floor)}X(i,`nudge`,[...er])},[q,er,N,x,X]),qr=p(e=>{if(S)return;let t=e.target;if(t instanceof HTMLInputElement||t instanceof HTMLTextAreaElement){e.key===`Escape`&&t.blur();return}if(e.key===`Shift`&&(Rn.current=!0),e.key===`Alt`&&(Ln.current=!0),e.key===` `&&!In.current){In.current=!0,e.preventDefault();return}let n=e.metaKey||e.ctrlKey;if(n&&e.key.toLowerCase()===`z`){e.preventDefault(),e.shiftKey?Wr():Ur();return}if(n&&e.key.toLowerCase()===`a`){e.preventDefault(),zt&&Gr();return}if(n&&e.key.toLowerCase()===`y`){e.preventDefault(),Wr();return}if(e.key===`Escape`){W.length>0?Lr():K.length>0?_r([]):z(null);return}if(e.key===`Enter`&&I===`wall`){Lr();return}if(e.key===`Delete`||e.key===`Backspace`){if(e.preventDefault(),I===`measure`){yr!==null&&(_r(e=>e.filter(e=>e.id!==yr)),br(null));return}Ir();return}if(e.key===`+`||e.key===`=`){Hr(1.25);return}if(e.key===`-`){Hr(1/1.25);return}if(e.key===`0`){Or();return}if(e.key.startsWith(`Arrow`)){e.preventDefault();let t={ArrowLeft:[-1,0],ArrowRight:[1,0],ArrowUp:[0,-1],ArrowDown:[0,1]}[e.key];t&&Kr(t[0],t[1]);return}let r=e.key.toLowerCase();if(r===`s`){lr(e=>!e);return}if(r===`l`){dr(e=>!e);return}if(r===`g`){pr(e=>!e);return}let i=ut[e.key.toLowerCase()];i&&q&&Ft.includes(i)&&(Yn(i),Lr())},[S,q,Ft,I,W,K.length,yr,Wr,Ur,z,Lr,Ir,Hr,Or,Kr,Yn,zt,Gr]),Q=p((e,t,n)=>{Fn.current=e,n?.resetHistory?(j.clearHistory(),j.replace(e)):j.commit(e,t);let r={reason:t,committed:!0,targetIds:[]};b?.(e,r),Et?.(e,r)},[j,b,Et]),Jr=p((e={})=>{let{plan:t,floor:n}=pe(M,{nameFor:Dn,...e,index:ve(M,N.id)+1});return Q(t,`add-floor`),P(n.id),n.id},[M,N.id,Q,P,Dn]),Yr=p(()=>{let{plan:e,floor:t}=me(M,N.id,{label:On(N.label)});return t?(Q(e,`duplicate-floor`),P(t.id),t.id):null},[M,N.id,N.label,Q,P,On]),Xr=p(e=>{let t=e??N.id,n=xe(M,t);if(n!==M&&(Q(n,`remove-floor`),t===N.id)){let e=ve(M,t);P(n.floors[Math.max(0,e-1)].id)}},[M,N.id,Q,P]),Zr=p((e,t)=>{let n=be(M,e,t);n!==M&&Q(n,`move-floor`)},[M,Q]),Qr=p((e,t)=>{let n=we(M,e,t);n!==M&&Q(n,`edit-floor`)},[M,Q]),$r=p((e,t)=>{let n=Se(M,e,t);n!==M&&Q(n,`rename-floor`)},[M,Q]),ei=p(e=>{let t=(e??fn??M.name??``).trim()||`floor-plan`,n=URL.createObjectURL(new Blob([Pe(M)],{type:`application/json`})),r=document.createElement(`a`);r.href=n,r.download=t.endsWith(`.json`)?t:`${t}.json`,r.click(),setTimeout(()=>URL.revokeObjectURL(n),0)},[fn,M]),ti=p(e=>{let t=Ne(e);return t.plan&&Q(t.plan,`import`),wr(t.plan&&t.issues.length===0?null:t.issues),pn?.(t),t},[pn,Q]),ni=p(e=>{e.text().then(e=>ti(e)).catch(e=>{let t=[`Could not read that file: ${e.message}`];wr(t),pn?.({plan:null,issues:t})})},[ti,pn]),ri=p(()=>_r([]),[]),ii=p(e=>{e.key===`Shift`&&(Rn.current=!1),e.key===`Alt`&&(Ln.current=!1),e.key===` `&&(In.current=!1)},[]);Re(Ct,()=>({getPlan:()=>M,setPlan:(e,t)=>Q(e,`import`,t),clear:()=>Q(he({floorLabel:kn}),`clear`),getFloorId:()=>N.id,setFloorId:P,addFloor:e=>Jr(e),duplicateFloor:Yr,removeFloor:Xr,renameFloor:$r,moveFloor:Zr,setFloorHeight:Qr,clearMeasurements:ri,download:ei,loadJson:ti,undo:Ur,redo:Wr,canUndo:()=>mn!==`none`&&j.canUndo,canRedo:()=>mn!==`none`&&j.canRedo,clearHistory:j.clearHistory,getSelection:()=>[...R.current],select:z,addToSelection:e=>{let t=Array.isArray(e)?e:[e],n=new Set(R.current.map(e=>`${e.type}:${e.id}`));z([...R.current,...t.filter(e=>!n.has(`${e.type}:${e.id}`))])},toggleSelection:Qn,selectAll:Gr,deleteSelection:Ir,getView:()=>V,setView:H,zoomBy:Hr,fitToContent:Or,toWorld:Er,toScreen:J,getSvgElement:()=>Pn.current}),[M,j,Q,kn,N,P,Jr,Yr,Xr,$r,Zr,Qr,ri,ei,ti,Ur,Wr,mn,z,Qn,Gr,Ir,V,H,Hr,Or,Er,J]);let $=O.current,ai=ze(()=>{if(!q)return null;let e=[],t=[...K,...$.kind===`measure`?[{id:-1,a:$.start,b:$.current}]:[]];for(let n of t){let t=J(n.a),r=J(n.b),i=Math.hypot(n.b.x-n.a.x,n.b.y-n.a.y);if(i<pt)continue;let a=Math.atan2(n.b.y-n.a.y,n.b.x-n.a.x),o=-Math.sin(a)*5,s=Math.cos(a)*5,c={x:(t.x+r.x)/2,y:(t.y+r.y)/2};if(e.push(y(`g`,{className:_(f.roomDrawerMeasureLine,yr===n.id&&f.roomDrawerMeasureLineHovered,w?.measureLine),children:[v(`line`,{x1:t.x,y1:t.y,x2:r.x,y2:r.y}),v(`line`,{x1:t.x-o,y1:t.y-s,x2:t.x+o,y2:t.y+s}),v(`line`,{x1:r.x-o,y1:r.y-s,x2:r.x+o,y2:r.y+s})]},`measure-${n.id}`)),I===`measure`&&n.id>=0)for(let[i,a]of[[`a`,t],[`b`,r]])e.push(v(`circle`,{className:f.roomDrawerMeasureGrip,cx:a.x,cy:a.y,r:4},`measure-grip-${n.id}-${i}`));e.push(v(`text`,{className:_(f.roomDrawerMeasure,w?.measureLine),x:c.x,y:c.y-8,textAnchor:`middle`,children:`${nn(i)} · ${an(bt(a))}`},`measure-label-${n.id}`))}if(Zt&&hr&&(hr.guides.forEach((t,n)=>{let r=J(t.a),i=J(t.b);e.push(v(`line`,{className:_(f.roomDrawerGuide,t.kind===d.Angle&&f.roomDrawerGuideAngle),x1:r.x,y1:r.y,x2:i.x,y2:i.y},`guide-${n}`))}),hr.kind!==d.None&&hr.kind!==d.Grid)){let t=J(hr.point);e.push(v(`rect`,{className:f.roomDrawerSnapMarker,x:t.x-4,y:t.y-4,width:8,height:8},`snap-marker`))}if($.kind===`rect`){let t=J($.start),n=J($.current),r=Math.min(t.x,n.x),i=Math.min(t.y,n.y),a=Math.max(t.x,n.x),o=Math.max(t.y,n.y);e.push(v(`rect`,{className:f.roomDrawerPreview,x:r,y:i,width:a-r,height:o-i},`rect-preview`));let s=Math.abs($.current.x-$.start.x),c=Math.abs($.current.y-$.start.y);tn&&(s>0||c>0)&&(e.push(v(`text`,{className:f.roomDrawerMeasure,x:(r+a)/2,y:i-8,textAnchor:`middle`,children:nn(s)},`rect-width`),v(`text`,{className:f.roomDrawerMeasure,x:r-8,y:(i+o)/2,textAnchor:`end`,dominantBaseline:`central`,children:nn(c)},`rect-height`)),s>0&&c>0&&e.push(v(`text`,{className:_(f.roomDrawerMeasure,f.roomDrawerMeasureSecondary),x:(r+a)/2,y:(i+o)/2,textAnchor:`middle`,dominantBaseline:`central`,children:rn(s*c)},`rect-area`)))}if(I===`wall`&&W.length>0){let t=[...W,G].filter(Boolean).map(J);if(e.push(v(`polyline`,{className:f.roomDrawerPreview,points:t.map(e=>`${e.x},${e.y}`).join(` `),fill:`none`},`chain`)),t.forEach((t,n)=>{e.push(v(`circle`,{className:f.roomDrawerHandle,cx:t.x,cy:t.y,r:4},`chain-dot-${n}`))}),tn&&G&&W.length>0){let t=W[W.length-1],n=Math.hypot(G.x-t.x,G.y-t.y),r=J({x:(t.x+G.x)/2,y:(t.y+G.y)/2}),i=hr?.kind===d.Angle;e.push(v(`text`,{className:_(f.roomDrawerMeasure,i&&f.roomDrawerMeasureLocked),x:r.x,y:r.y-8,textAnchor:`middle`,children:`${nn(n)} · ${hr?.angleRelativeTo===`reference`&&Tr!==void 0?An(an(bt(Math.atan2(G.y-t.y,G.x-t.x)-Tr))):an(bt(Math.atan2(G.y-t.y,G.x-t.x)))}`},`chain-len`))}}let n=new Set(L.filter(e=>e.type===`node`).map(e=>e.id));for(let t of er){let r=N.nodes[t];if(!r)continue;let i=J(r);e.push(v(`circle`,{className:_(f.roomDrawerHandle,n.has(t)&&f.roomDrawerHandleActive),cx:i.x,cy:i.y,r:5},`handle-${t}`))}if($.kind===`marquee`&&A.current?.moved){let t=J($.start),n=J($.current);e.push(v(`rect`,{className:f.roomDrawerMarquee,x:Math.min(t.x,n.x),y:Math.min(t.y,n.y),width:Math.abs(n.x-t.x),height:Math.abs(n.y-t.y)},`marquee`))}if(Nr&&$.kind!==`node`){let t=J(Nr);e.push(v(`circle`,{className:f.roomDrawerMidHandle,cx:t.x,cy:t.y,r:4},`midpoint`))}if(tn&&$.kind===`room`&&$.moved){let t=new Set($.nodeIds),n=$.nodeIds.find(e=>N.nodes[e]&&$.orig[e]);if(n){let t=N.nodes[n],r=$.orig[n],i=t.x-r.x,a=t.y-r.y,o=B?.type===`room`?F.find(e=>e.roomId===B.id):void 0,s=J(o?o.anchor:t);e.push(v(`text`,{className:_(f.roomDrawerMeasure,f.roomDrawerMeasureOffset),x:s.x,y:s.y-26,textAnchor:`middle`,children:`${nn(Math.hypot(i,a))} · ${an(bt(Math.atan2(a,i)))}`},`room-offset`))}for(let n of Object.values(N.walls)){if(t.has(n.a)===t.has(n.b))continue;let r=N.nodes[n.a],i=N.nodes[n.b];if(!r||!i)continue;let a=t.has(n.a)?r:i,o=t.has(n.a)?i:r,s=J({x:(r.x+i.x)/2,y:(r.y+i.y)/2});e.push(v(`text`,{className:_(f.roomDrawerMeasure,f.roomDrawerMeasureSecondary),x:s.x,y:s.y-8,textAnchor:`middle`,children:`${nn(Math.hypot(o.x-a.x,o.y-a.y))} · ${an(bt(Math.atan2(o.y-a.y,o.x-a.x)))}`},`room-stretch-${n.id}`))}}if(tn&&(B?.type===`node`||B?.type===`wall`)){let t=[],n=new Set,r=(e,r,i)=>{if(n.has(e))return;let a=N.walls[e];a&&(n.add(e),t.push({wall:a,from:r,primary:i}))};if(B.type===`node`)for(let e of Object.values(N.walls))(e.a===B.id||e.b===B.id)&&r(e.id,B.id,!0);else{let e=N.walls[B.id];if(e){r(e.id,e.a,!0);for(let t of Object.values(N.walls))if(t.id!==e.id)for(let n of[e.a,e.b])(t.a===n||t.b===n)&&r(t.id,n,!1)}}let i=hr?.kind===d.Angle&&$.kind!==`none`;for(let{wall:n,from:r,primary:a}of t){let t=N.nodes[n.a],o=N.nodes[n.b];if(!t||!o)continue;let s=n.a===r?t:o,c=n.a===r?o:t,l=J({x:(t.x+o.x)/2,y:(t.y+o.y)/2});e.push(v(`text`,{className:_(f.roomDrawerMeasure,!a&&f.roomDrawerMeasureSecondary,a&&i&&f.roomDrawerMeasureLocked),x:l.x,y:l.y-8,textAnchor:`middle`,children:`${nn(Math.hypot(c.x-s.x,c.y-s.y))} · ${an(bt(Math.atan2(c.y-s.y,c.x-s.x)))}`},`measure-${n.id}`))}}return v(ct,{children:e})},[q,$,I,W,G,L,N,F,B,er,Nr,tn,Zt,hr,Tr,nn,rn,an,An,K,yr,w?.measureLine,J]),oi={select:{icon:He,label:E.select,key:`V`},wall:{icon:tt,label:E.wall,key:`W`},rect:{icon:it,label:E.rect,key:`R`},door:{icon:qe,label:E.door,key:`D`},window:{icon:st,label:E.window,key:`N`},archway:{icon:Xe,label:E.archway,key:`A`},measure:{icon:rt,label:E.measure,key:`M`}},si=q?I===`wall`?E.hintWall:I===`rect`?E.hintRect:I===`measure`?E.hintMeasure:dt[I]?E.hintOpening:zt?E.hintSelect:E.hintSelectSingle:``,ci=L.length===0?E.selectedFloor:L.length>1?E.selectedCount(L.length):Mr?{[s.Door]:E.selectedDoor,[s.Window]:E.selectedWindow,[s.Archway]:E.selectedArchway,[s.Gap]:E.selectedGap}[Mr.kind]:Z?E.selectedWall:B?.type===`room`?E.selectedRoom:E.selectedCorner,li=q?Ft:[];return y(`div`,{...Tn,ref:Mn,className:_(f.roomDrawer,S&&f.roomDrawerDisabled,Cn,w?.root),style:{...wn,...T?.root},role:`application`,"aria-label":Sn??`Floor plan editor`,tabIndex:S?-1:0,onKeyDown:qr,onKeyUp:ii,children:[sn&&y(`div`,{className:_(f.roomDrawerToolbar,w?.toolbar),style:T?.toolbar,role:`toolbar`,"aria-label":E.tools,children:[li.map(e=>{let t=oi[e];return v(`button`,{type:`button`,className:_(f.roomDrawerToolButton,e===I&&f.roomDrawerToolButtonActive,w?.toolButton),style:T?.toolButton,title:`${t.label} (${t.key})`,"aria-label":t.label,"aria-pressed":e===I,onClick:()=>{Yn(e),Lr()},children:r(C?.[e]??t.icon,{className:_(f.roomDrawerToolIcon,w?.toolIcon),style:T?.toolIcon})},e)}),li.length>0&&v(`span`,{className:f.roomDrawerToolbarSeparator}),q&&y(ct,{children:[[{on:cr,toggle:()=>lr(e=>!e),icon:C?.snap??Qe,label:E.snap,key:`S`},{on:ur,toggle:()=>dr(e=>!e),icon:C?.angleLock??Ye,label:E.angleLock(Xt),key:`L`},{on:fr,toggle:()=>pr(e=>!e),icon:C?.grid??Ge,label:E.grid,key:`G`},...ge(M,N.id)?[{on:Wn,toggle:()=>Gn(e=>!e),icon:C?.underlay??Ze,label:E.underlay,key:`B`}]:[]].map(e=>v(`button`,{type:`button`,className:_(f.roomDrawerToolButton,e.on&&f.roomDrawerToolButtonOn,w?.toolButton),style:T?.toolButton,title:`${e.label} (${e.key})`,"aria-label":e.label,"aria-pressed":e.on,onClick:e.toggle,children:r(e.icon,{className:_(f.roomDrawerToolIcon,w?.toolIcon),style:T?.toolIcon})},e.key)),v(`span`,{className:f.roomDrawerToolbarSeparator})]}),un&&mn!==`none`&&q&&y(ct,{children:[v(`button`,{type:`button`,className:_(f.roomDrawerViewButton,w?.viewButton),style:T?.viewButton,title:E.undo,"aria-label":E.undo,disabled:!j.canUndo,onClick:Ur,children:r(C?.undo??Ue)}),v(`button`,{type:`button`,className:_(f.roomDrawerViewButton,w?.viewButton),style:T?.viewButton,title:E.redo,"aria-label":E.redo,disabled:!j.canRedo,onClick:Wr,children:r(C?.redo??We)}),v(`span`,{className:f.roomDrawerToolbarSeparator})]}),dn&&y(ct,{children:[v(`button`,{type:`button`,className:_(f.roomDrawerViewButton,w?.viewButton),style:T?.viewButton,title:E.download,"aria-label":E.download,onClick:()=>ei(),children:r(C?.download??Je)}),q&&v(`button`,{type:`button`,className:_(f.roomDrawerViewButton,w?.viewButton),style:T?.viewButton,title:E.upload,"aria-label":E.upload,onClick:()=>xr.current?.click(),children:r(C?.upload??ot)}),v(`span`,{className:f.roomDrawerToolbarSeparator})]}),y(`div`,{className:_(f.roomDrawerViewControls,w?.viewControls),style:T?.viewControls,children:[v(`button`,{type:`button`,className:_(f.roomDrawerViewButton,w?.viewButton),style:T?.viewButton,title:E.zoomOut,"aria-label":E.zoomOut,onClick:()=>Hr(1/1.25),children:r(C?.zoomOut??$e)}),v(`button`,{type:`button`,className:_(f.roomDrawerZoomLabel,w?.zoomLabel),style:T?.zoomLabel,title:E.fit,onClick:()=>Or(),children:on(V.zoom)}),v(`button`,{type:`button`,className:_(f.roomDrawerViewButton,w?.viewButton),style:T?.viewButton,title:E.zoomIn,"aria-label":E.zoomIn,onClick:()=>Hr(1.25),children:r(C?.zoomIn??et)})]})]}),At&&M.floors.length>0&&y(`div`,{className:_(f.roomDrawerFloorBar,w?.floorBar),style:T?.floorBar,role:`tablist`,"aria-label":E.selectedFloor,children:[[...M.floors].reverse().map(e=>v(`button`,{type:`button`,role:`tab`,className:_(f.roomDrawerFloorTab,e.id===N.id&&f.roomDrawerFloorTabActive,w?.floorTab),style:T?.floorTab,"aria-selected":e.id===N.id,onClick:()=>P(e.id),children:e.label},e.id)),q&&v(`button`,{type:`button`,className:_(f.roomDrawerFloorTab,f.roomDrawerFloorTabAdd),title:E.addFloor,"aria-label":E.addFloor,onClick:()=>Jr(),children:r(C?.addFloor??nt)})]}),v(`div`,{ref:Nn,className:_(f.roomDrawerCanvasWrapper,q&&I!==`select`&&f.roomDrawerCanvasWrapperDrawing,w?.canvasWrapper),style:{height:vn,...T?.canvasWrapper},onPointerDown:Rr,onPointerMove:zr,onPointerUp:e=>Br(e,!1),onPointerCancel:e=>Br(e,!0),children:v(Ie,{ref:Pn,floor:N,underlay:Kn,rooms:F,view:V,size:U,selection:L,hovered:tr,interactiveRooms:!1,showGrid:fr,gridSize:x,showRoomLabels:!0,formatArea:rn,getRoomColor:yn,renderRoomLabel:bn,overlay:ai,classNames:w,styles:T})}),cn&&q&&y(`div`,{className:_(f.roomDrawerInspector,w?.inspector),style:T?.inspector,children:[v(`span`,{className:_(f.roomDrawerInspectorKind,L.length===0&&f.roomDrawerInspectorKindEmpty,w?.inspectorLabel),children:ci}),L.length===0&&y(ct,{children:[v(o,{className:_(f.roomDrawerInspectorName,w?.inspectorField),style:T?.inspectorField,label:E.floorName,value:N.label,onChange:e=>$r(N.id,e)}),v(Fe,{className:_(f.roomDrawerInspectorField,w?.inspectorField),style:T?.inspectorField,label:E.floorHeight,title:E.storeyHeightHint,value:N.height,decimalScale:0,min:500,step:100,showArrows:!0,onChange:e=>{e!==void 0&&Qr(N.id,e)}}),M.floors.length>1&&y(ct,{children:[v(`button`,{type:`button`,className:_(f.roomDrawerInspectorAction,w?.inspectorField),style:T?.inspectorField,title:E.moveFloorUp,"aria-label":E.moveFloorUp,disabled:ve(M,N.id)>=M.floors.length-1,onClick:()=>Zr(N.id,ve(M,N.id)+1),children:r(C?.moveFloorUp??Ve)}),v(`button`,{type:`button`,className:_(f.roomDrawerInspectorAction,w?.inspectorField),style:T?.inspectorField,title:E.moveFloorDown,"aria-label":E.moveFloorDown,disabled:ve(M,N.id)<=0,onClick:()=>Zr(N.id,ve(M,N.id)-1),children:r(C?.moveFloorDown??Be)})]}),v(`button`,{type:`button`,className:_(f.roomDrawerInspectorAction,w?.inspectorField),style:T?.inspectorField,title:E.duplicateFloor,onClick:()=>Yr(),children:r(C?.duplicateFloor??Ke)}),M.floors.length>1&&v(i,{color:n.Error,className:f.roomDrawerInspectorDelete,icon:C?.delete??at,title:E.deleteFloor,onClick:()=>Xr()})]}),jr?.meta&&y(ct,{children:[v(o,{className:_(f.roomDrawerInspectorName,w?.inspectorField),style:T?.inspectorField,label:E.roomName,value:jr.meta.name,onChange:e=>{let t=jr.meta;X({...N,rooms:{...N.rooms,[t.id]:{...t,name:e}}},`edit-room`,[t.id])}}),v(`span`,{className:_(f.roomDrawerInspectorLabel,w?.inspectorLabel),children:rn(jr.area)})]}),Z&&v(`button`,{type:`button`,className:_(f.roomDrawerInspectorAction,w?.inspectorField),style:T?.inspectorField,onClick:Pr,children:E.addCorner}),Z&&v(Fe,{className:_(f.roomDrawerInspectorField,w?.inspectorField),style:T?.inspectorField,label:E.thickness,value:Z.thickness,decimalScale:0,min:10,showArrows:!0,step:10,onChange:e=>{e!==void 0&&X({...N,walls:{...N.walls,[Z.id]:{...Z,thickness:e}}},`edit-wall`,[Z.id])}}),Mr&&y(ct,{children:[v(Fe,{className:_(f.roomDrawerInspectorField,w?.inspectorField),style:T?.inspectorField,label:E.width,value:Mr.width,decimalScale:0,min:100,step:50,showArrows:!0,onChange:e=>{e!==void 0&&X(de(N,Mr.id,{width:e}).floor,`edit-opening`,[Mr.id])}}),v(Fe,{className:_(f.roomDrawerInspectorField,w?.inspectorField),style:T?.inspectorField,label:E.sill,title:E.sillHeightHint,showArrows:!0,value:Mr.sill,decimalScale:0,min:0,step:50,onChange:e=>{e!==void 0&&X(de(N,Mr.id,{sill:e}).floor,`edit-opening`,[Mr.id])}})]}),L.length>0&&v(i,{color:n.Error,className:f.roomDrawerInspectorDelete,icon:C?.delete??at,title:E.deleteSelection,onClick:Ir})]}),dn&&q&&v(`input`,{ref:xr,type:`file`,accept:`application/json,.json`,className:f.roomDrawerFileInput,tabIndex:-1,"aria-hidden":`true`,onChange:e=>{let t=e.target.files?.[0];e.target.value=``,t&&ni(t)}}),ln&&(Cr!==null||si)&&v(`div`,{className:_(f.roomDrawerHint,Cr!==null&&f.roomDrawerHintReport,w?.hint),style:T?.hint,role:Cr===null?void 0:`status`,children:Cr===null?si:Cr.length===0?E.importFailed:Cr.join(` · `)})]})}export{St as default};
|
|
2
2
|
//# sourceMappingURL=roomDrawer.mjs.map
|