{"version":3,"sources":["@webhare/env/src/envbackend.ts","@webhare/env/src/init-browser.ts","@webhare/dompack/src/tree.ts","@webhare/std/src/quacks.ts","@webhare/std/src/finmath.ts","@webhare/std/src/money.ts","@webhare/std/src/strings.ts","@webhare/std/src/collections.ts","@webhare/std/src/localmutex.ts","@webhare/frontend/src/init.ts","@webhare/tsrun/src/polyfills.ts","mod::publisher/js/internal/polyfills/iterator-helpers.ts","@webhare/env/src/navigation.ts","@webhare/env/src/whglobal.ts","mod::system/js/dompack/src/events.ts","@webhare/dompack/src/busy.ts","mod::system/js/dompack/src/tree.ts","mod::system/js/dompack/src/components.ts","@webhare/dompack/src/storage.ts","@webhare/dompack/src/browser.ts","mod::publisher/js/internal/polyfills/publisher-integration.ts","mod::vue/node_modules/@vue/shared/dist/shared.esm-bundler.js","mod::vue/node_modules/@vue/reactivity/dist/reactivity.esm-bundler.js","mod::vue/node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js","mod::vue/node_modules/@vue/runtime-dom/dist/runtime-dom.esm-bundler.js","node_modules/stacktrace-parser/dist/stack-trace-parser.esm.js","@webhare/js-api-tools/src/stacktracing.ts","@webhare/rpc/src/rpc.ts","@webhare/auth/src/shared.ts","@webhare/frontend/src/auth.ts","@webhare/frontend/src/gtm.ts","@webhare/frontend/src/frontend.ts","mod::vue/node_modules/vue-router/dist/vue-router.mjs","mod::happy/webdesigns/happy/frontend/lib/useWrdAuthState.ts","mod::happy/webdesigns/happy/frontend/lib/organization.ts","mod::happy/webdesigns/happy/frontend/lib/routeQuery.ts","mod::happy/webdesigns/happy/frontend/lib/customerNavigation.ts","mod::happy/webdesigns/happy/frontend/lib/toast.ts","mod::happy/webdesigns/happy/frontend/lib/rpcError.ts","mod::happy/webdesigns/happy/frontend/lib/api.ts","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/OrganizationChoiceView.vue?type=template","mod::happy/webdesigns/happy/frontend/views/OrganizationChoiceView.vue","mod::happy/webdesigns/happy/frontend/lib/preferences.ts","mod::ww/js/auth/code-login-frontend.ts","/opt/whdata/generated/platform/ap/happy.happy/opt/whdata/installedmodules/vue.20261006T102852.814Z/libs/auth/CodeInput.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/vue.20261006T102852.814Z/libs/auth/CodeInput.vue?type=template","mod::vue/libs/auth/CodeInput.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/FormField.vue?type=template","mod::happy/webdesigns/happy/frontend/components/FormField.vue","/opt/whdata/generated/platform/ap/happy.happy/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/PasswordResetForm.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/PasswordResetForm.vue?type=template","mod::happy/webdesigns/happy/frontend/components/PasswordResetForm.vue","/opt/whdata/generated/platform/ap/happy.happy/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/LoginForm.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/LoginForm.vue?type=template","mod::happy/webdesigns/happy/frontend/components/LoginForm.vue","mod::happy/webdesigns/happy/frontend/lib/feedback-widget.ts","/opt/whdata/generated/platform/ap/happy.happy/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/FeedbackWidget.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/FeedbackWidget.vue?type=template","mod::happy/webdesigns/happy/frontend/components/FeedbackWidget.vue","mod::happy/webdesigns/happy/frontend/lib/menu.ts","/opt/whdata/generated/platform/ap/happy.happy/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/MenuBar.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/MenuBar.vue?type=template","mod::happy/webdesigns/happy/frontend/components/MenuBar.vue","/opt/whdata/generated/platform/ap/happy.happy/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/AppHeader.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/AppHeader.vue?type=template","mod::happy/webdesigns/happy/frontend/components/AppHeader.vue","/opt/whdata/generated/platform/ap/happy.happy/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/BootSplash.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/BootSplash.vue?type=template","mod::happy/webdesigns/happy/frontend/components/BootSplash.vue","/opt/whdata/generated/platform/ap/happy.happy/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/AppDialog.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/AppDialog.vue?type=template","mod::happy/webdesigns/happy/frontend/components/AppDialog.vue","/opt/whdata/generated/platform/ap/happy.happy/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/ShortcutsOverlay.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/ShortcutsOverlay.vue?type=template","mod::happy/webdesigns/happy/frontend/components/ShortcutsOverlay.vue","/opt/whdata/generated/platform/ap/happy.happy/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/AboutDialog.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/AboutDialog.vue?type=template","mod::happy/webdesigns/happy/frontend/components/AboutDialog.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/Toast.vue?type=template","mod::happy/webdesigns/happy/frontend/components/Toast.vue","/opt/whdata/generated/platform/ap/happy.happy/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/App.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/App.vue?type=template","mod::happy/webdesigns/happy/frontend/App.vue","/opt/whdata/generated/platform/ap/happy.happy/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/OrganizationUsersView.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/OrganizationUsersView.vue?type=template","mod::happy/webdesigns/happy/frontend/views/OrganizationUsersView.vue","/opt/whdata/generated/platform/ap/happy.happy/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/InvitationView.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/InvitationView.vue?type=template","mod::happy/webdesigns/happy/frontend/views/InvitationView.vue","mod::happy/webdesigns/happy/frontend/lib/dashboard/registry.ts","mod::happy/webdesigns/happy/frontend/lib/dashboard/quickActions.ts","mod::happy/webdesigns/happy/frontend/lib/dashboard/layout.ts","mod::happy/webdesigns/happy/frontend/lib/dashboard/useDashboardLayout.ts","/opt/whdata/generated/platform/ap/happy.happy/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/WidgetShell.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/WidgetShell.vue?type=template","mod::happy/webdesigns/happy/frontend/components/dashboard/WidgetShell.vue","mod::happy/js/internal/domain.ts","mod::happy/webdesigns/happy/frontend/lib/format.ts","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/HoursWeekWidget.vue?type=template","mod::happy/webdesigns/happy/frontend/components/dashboard/widgets/HoursWeekWidget.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/OutstandingWidget.vue?type=template","mod::happy/webdesigns/happy/frontend/components/dashboard/widgets/OutstandingWidget.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/RevenueYtdWidget.vue?type=template","mod::happy/webdesigns/happy/frontend/components/dashboard/widgets/RevenueYtdWidget.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/WipWidget.vue?type=template","mod::happy/webdesigns/happy/frontend/components/dashboard/widgets/WipWidget.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/VatQuarterWidget.vue?type=template","mod::happy/webdesigns/happy/frontend/components/dashboard/widgets/VatQuarterWidget.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/CustomersWidget.vue?type=template","mod::happy/webdesigns/happy/frontend/components/dashboard/widgets/CustomersWidget.vue","/opt/whdata/generated/platform/ap/happy.happy/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/DsoWidget.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/DsoWidget.vue?type=template","mod::happy/webdesigns/happy/frontend/components/dashboard/widgets/DsoWidget.vue","/opt/whdata/generated/platform/ap/happy.happy/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/ToDeclareWidget.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/ToDeclareWidget.vue?type=template","mod::happy/webdesigns/happy/frontend/components/dashboard/widgets/ToDeclareWidget.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/RecentEntriesWidget.vue?type=template","mod::happy/webdesigns/happy/frontend/components/dashboard/widgets/RecentEntriesWidget.vue","/opt/whdata/generated/platform/ap/happy.happy/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/RevenueChartWidget.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/RevenueChartWidget.vue?type=template","mod::happy/webdesigns/happy/frontend/components/dashboard/widgets/RevenueChartWidget.vue","/opt/whdata/generated/platform/ap/happy.happy/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/AgingWidget.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/AgingWidget.vue?type=template","mod::happy/webdesigns/happy/frontend/components/dashboard/widgets/AgingWidget.vue","/opt/whdata/generated/platform/ap/happy.happy/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/DebtorsWidget.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/DebtorsWidget.vue?type=template","mod::happy/webdesigns/happy/frontend/components/dashboard/widgets/DebtorsWidget.vue","/opt/whdata/generated/platform/ap/happy.happy/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/HoursEmployeeWidget.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/HoursEmployeeWidget.vue?type=template","mod::happy/webdesigns/happy/frontend/components/dashboard/widgets/HoursEmployeeWidget.vue","/opt/whdata/generated/platform/ap/happy.happy/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/BudgetWidget.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/BudgetWidget.vue?type=template","mod::happy/webdesigns/happy/frontend/components/dashboard/widgets/BudgetWidget.vue","/opt/whdata/generated/platform/ap/happy.happy/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/QuickActionsWidget.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/QuickActionsWidget.vue?type=template","mod::happy/webdesigns/happy/frontend/components/dashboard/widgets/QuickActionsWidget.vue","/opt/whdata/generated/platform/ap/happy.happy/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/DashboardGrid.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/DashboardGrid.vue?type=template","mod::happy/webdesigns/happy/frontend/components/dashboard/DashboardGrid.vue","/opt/whdata/generated/platform/ap/happy.happy/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/WidgetManager.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/WidgetManager.vue?type=template","mod::happy/webdesigns/happy/frontend/components/dashboard/WidgetManager.vue","/opt/whdata/generated/platform/ap/happy.happy/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/DashboardView.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/DashboardView.vue?type=template","mod::happy/webdesigns/happy/frontend/views/DashboardView.vue","mod::happy/webdesigns/happy/frontend/lib/useListKeyboard.ts","mod::happy/webdesigns/happy/frontend/lib/usePagedRows.ts","mod::happy/webdesigns/happy/frontend/lib/customerListState.ts","mod::happy/webdesigns/happy/frontend/lib/customerAddress.ts","mod::happy/webdesigns/happy/frontend/lib/dates.ts","/opt/whdata/generated/platform/ap/happy.happy/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/CustomerFormDialog.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/CustomerFormDialog.vue?type=template","mod::happy/webdesigns/happy/frontend/components/CustomerFormDialog.vue","/opt/whdata/generated/platform/ap/happy.happy/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/PrintDocument.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/PrintDocument.vue?type=template","mod::happy/webdesigns/happy/frontend/components/PrintDocument.vue","/opt/whdata/generated/platform/ap/happy.happy/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/CustomerPrintDialog.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/CustomerPrintDialog.vue?type=template","mod::happy/webdesigns/happy/frontend/components/CustomerPrintDialog.vue","/opt/whdata/generated/platform/ap/happy.happy/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/CustomersView.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/CustomersView.vue?type=template","mod::happy/webdesigns/happy/frontend/views/CustomersView.vue","mod::happy/webdesigns/happy/frontend/lib/customerReports.ts","mod::happy/webdesigns/happy/frontend/lib/useEscapeBack.ts","/opt/whdata/generated/platform/ap/happy.happy/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/CustomerBalanceTable.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/CustomerBalanceTable.vue?type=template","mod::happy/webdesigns/happy/frontend/components/CustomerBalanceTable.vue","/opt/whdata/generated/platform/ap/happy.happy/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/CustomerReportsView.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/CustomerReportsView.vue?type=template","mod::happy/webdesigns/happy/frontend/views/CustomerReportsView.vue","mod::happy/webdesigns/happy/frontend/lib/expenseTransfer.ts","mod::happy/webdesigns/happy/frontend/lib/production.ts","mod::happy/webdesigns/happy/frontend/lib/customerDetailState.ts","mod::vue/node_modules/@vueuse/shared/dist/index.js","mod::vue/node_modules/@vueuse/core/dist/index.js","mod::happy/node_modules/@floating-ui/utils/dist/floating-ui.utils.mjs","mod::happy/node_modules/@floating-ui/core/dist/floating-ui.core.mjs","mod::happy/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.mjs","mod::happy/node_modules/@floating-ui/dom/dist/floating-ui.dom.mjs","mod::happy/node_modules/@floating-ui/vue/dist/floating-ui.vue.mjs","mod::happy/node_modules/date-fns/constants.js","mod::happy/node_modules/date-fns/constructFrom.js","mod::happy/node_modules/date-fns/toDate.js","mod::happy/node_modules/date-fns/addDays.js","mod::happy/node_modules/date-fns/addMonths.js","mod::happy/node_modules/date-fns/add.js","mod::happy/node_modules/date-fns/_lib/defaultOptions.js","mod::happy/node_modules/date-fns/startOfWeek.js","mod::happy/node_modules/date-fns/startOfISOWeek.js","mod::happy/node_modules/date-fns/getISOWeekYear.js","mod::happy/node_modules/date-fns/_lib/getTimezoneOffsetInMilliseconds.js","mod::happy/node_modules/date-fns/_lib/normalizeDates.js","mod::happy/node_modules/date-fns/startOfDay.js","mod::happy/node_modules/date-fns/differenceInCalendarDays.js","mod::happy/node_modules/date-fns/startOfISOWeekYear.js","mod::happy/node_modules/date-fns/addQuarters.js","mod::happy/node_modules/date-fns/addYears.js","mod::happy/node_modules/date-fns/compareAsc.js","mod::happy/node_modules/date-fns/isDate.js","mod::happy/node_modules/date-fns/isValid.js","mod::happy/node_modules/date-fns/getQuarter.js","mod::happy/node_modules/date-fns/differenceInCalendarYears.js","mod::happy/node_modules/date-fns/_lib/getRoundingMethod.js","mod::happy/node_modules/date-fns/differenceInYears.js","mod::happy/node_modules/date-fns/_lib/normalizeInterval.js","mod::happy/node_modules/date-fns/eachDayOfInterval.js","mod::happy/node_modules/date-fns/startOfQuarter.js","mod::happy/node_modules/date-fns/eachQuarterOfInterval.js","mod::happy/node_modules/date-fns/startOfMonth.js","mod::happy/node_modules/date-fns/endOfYear.js","mod::happy/node_modules/date-fns/startOfYear.js","mod::happy/node_modules/date-fns/endOfWeek.js","mod::happy/node_modules/date-fns/endOfQuarter.js","mod::happy/node_modules/date-fns/locale/en-US/_lib/formatDistance.js","mod::happy/node_modules/date-fns/locale/_lib/buildFormatLongFn.js","mod::happy/node_modules/date-fns/locale/en-US/_lib/formatLong.js","mod::happy/node_modules/date-fns/locale/en-US/_lib/formatRelative.js","mod::happy/node_modules/date-fns/locale/_lib/buildLocalizeFn.js","mod::happy/node_modules/date-fns/locale/en-US/_lib/localize.js","mod::happy/node_modules/date-fns/locale/_lib/buildMatchFn.js","mod::happy/node_modules/date-fns/locale/_lib/buildMatchPatternFn.js","mod::happy/node_modules/date-fns/locale/en-US/_lib/match.js","mod::happy/node_modules/date-fns/locale/en-US.js","mod::happy/node_modules/date-fns/getDayOfYear.js","mod::happy/node_modules/date-fns/getISOWeek.js","mod::happy/node_modules/date-fns/getWeekYear.js","mod::happy/node_modules/date-fns/startOfWeekYear.js","mod::happy/node_modules/date-fns/getWeek.js","mod::happy/node_modules/date-fns/_lib/addLeadingZeros.js","mod::happy/node_modules/date-fns/_lib/format/lightFormatters.js","mod::happy/node_modules/date-fns/_lib/format/formatters.js","mod::happy/node_modules/date-fns/_lib/format/longFormatters.js","mod::happy/node_modules/date-fns/_lib/protectedTokens.js","mod::happy/node_modules/date-fns/format.js","mod::happy/node_modules/date-fns/getDay.js","mod::happy/node_modules/date-fns/getDaysInMonth.js","mod::happy/node_modules/date-fns/getDefaultOptions.js","mod::happy/node_modules/date-fns/getHours.js","mod::happy/node_modules/date-fns/getISODay.js","mod::happy/node_modules/date-fns/getMinutes.js","mod::happy/node_modules/date-fns/getMonth.js","mod::happy/node_modules/date-fns/getSeconds.js","mod::happy/node_modules/date-fns/getYear.js","mod::happy/node_modules/date-fns/isAfter.js","mod::happy/node_modules/date-fns/isBefore.js","mod::happy/node_modules/date-fns/isEqual.js","mod::happy/node_modules/date-fns/transpose.js","mod::happy/node_modules/date-fns/parse/_lib/Setter.js","mod::happy/node_modules/date-fns/parse/_lib/Parser.js","mod::happy/node_modules/date-fns/parse/_lib/parsers/EraParser.js","mod::happy/node_modules/date-fns/parse/_lib/constants.js","mod::happy/node_modules/date-fns/parse/_lib/utils.js","mod::happy/node_modules/date-fns/parse/_lib/parsers/YearParser.js","mod::happy/node_modules/date-fns/parse/_lib/parsers/LocalWeekYearParser.js","mod::happy/node_modules/date-fns/parse/_lib/parsers/ISOWeekYearParser.js","mod::happy/node_modules/date-fns/parse/_lib/parsers/ExtendedYearParser.js","mod::happy/node_modules/date-fns/parse/_lib/parsers/QuarterParser.js","mod::happy/node_modules/date-fns/parse/_lib/parsers/StandAloneQuarterParser.js","mod::happy/node_modules/date-fns/parse/_lib/parsers/MonthParser.js","mod::happy/node_modules/date-fns/parse/_lib/parsers/StandAloneMonthParser.js","mod::happy/node_modules/date-fns/setWeek.js","mod::happy/node_modules/date-fns/parse/_lib/parsers/LocalWeekParser.js","mod::happy/node_modules/date-fns/setISOWeek.js","mod::happy/node_modules/date-fns/parse/_lib/parsers/ISOWeekParser.js","mod::happy/node_modules/date-fns/parse/_lib/parsers/DateParser.js","mod::happy/node_modules/date-fns/parse/_lib/parsers/DayOfYearParser.js","mod::happy/node_modules/date-fns/setDay.js","mod::happy/node_modules/date-fns/parse/_lib/parsers/DayParser.js","mod::happy/node_modules/date-fns/parse/_lib/parsers/LocalDayParser.js","mod::happy/node_modules/date-fns/parse/_lib/parsers/StandAloneLocalDayParser.js","mod::happy/node_modules/date-fns/setISODay.js","mod::happy/node_modules/date-fns/parse/_lib/parsers/ISODayParser.js","mod::happy/node_modules/date-fns/parse/_lib/parsers/AMPMParser.js","mod::happy/node_modules/date-fns/parse/_lib/parsers/AMPMMidnightParser.js","mod::happy/node_modules/date-fns/parse/_lib/parsers/DayPeriodParser.js","mod::happy/node_modules/date-fns/parse/_lib/parsers/Hour1to12Parser.js","mod::happy/node_modules/date-fns/parse/_lib/parsers/Hour0to23Parser.js","mod::happy/node_modules/date-fns/parse/_lib/parsers/Hour0To11Parser.js","mod::happy/node_modules/date-fns/parse/_lib/parsers/Hour1To24Parser.js","mod::happy/node_modules/date-fns/parse/_lib/parsers/MinuteParser.js","mod::happy/node_modules/date-fns/parse/_lib/parsers/SecondParser.js","mod::happy/node_modules/date-fns/parse/_lib/parsers/FractionOfSecondParser.js","mod::happy/node_modules/date-fns/parse/_lib/parsers/ISOTimezoneWithZParser.js","mod::happy/node_modules/date-fns/parse/_lib/parsers/ISOTimezoneParser.js","mod::happy/node_modules/date-fns/parse/_lib/parsers/TimestampSecondsParser.js","mod::happy/node_modules/date-fns/parse/_lib/parsers/TimestampMillisecondsParser.js","mod::happy/node_modules/date-fns/parse/_lib/parsers.js","mod::happy/node_modules/date-fns/parse.js","mod::happy/node_modules/date-fns/isSameQuarter.js","mod::happy/node_modules/date-fns/subDays.js","mod::happy/node_modules/date-fns/parseISO.js","mod::happy/node_modules/date-fns/roundToNearestMinutes.js","mod::happy/node_modules/date-fns/setMonth.js","mod::happy/node_modules/date-fns/set.js","mod::happy/node_modules/date-fns/setMilliseconds.js","mod::happy/node_modules/date-fns/setSeconds.js","mod::happy/node_modules/date-fns/setYear.js","mod::happy/node_modules/date-fns/subMonths.js","mod::happy/node_modules/date-fns/sub.js","mod::happy/node_modules/date-fns/subYears.js","mod::happy/node_modules/@date-fns/tz/tzName/index.js","mod::happy/node_modules/@date-fns/tz/tzOffset/index.js","mod::happy/node_modules/@date-fns/tz/date/mini.js","mod::happy/node_modules/@date-fns/tz/date/index.js","mod::happy/node_modules/@vuepic/vue-datepicker/dist/vue-datepicker.js","mod::happy/node_modules/date-fns/locale/nl/_lib/formatDistance.js","mod::happy/node_modules/date-fns/locale/nl/_lib/formatLong.js","mod::happy/node_modules/date-fns/locale/nl/_lib/formatRelative.js","mod::happy/node_modules/date-fns/locale/nl/_lib/localize.js","mod::happy/node_modules/date-fns/locale/nl/_lib/match.js","mod::happy/node_modules/date-fns/locale/nl.js","/opt/whdata/generated/platform/ap/happy.happy/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/DateInput.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/DateInput.vue?type=template","mod::happy/webdesigns/happy/frontend/components/DateInput.vue","/opt/whdata/generated/platform/ap/happy.happy/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/ReminderFormDialog.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/ReminderFormDialog.vue?type=template","mod::happy/webdesigns/happy/frontend/components/ReminderFormDialog.vue","/opt/whdata/generated/platform/ap/happy.happy/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/CustomerDetailView.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/CustomerDetailView.vue?type=template","mod::happy/webdesigns/happy/frontend/views/CustomerDetailView.vue","mod::happy/webdesigns/happy/frontend/lib/archiveListState.ts","/opt/whdata/generated/platform/ap/happy.happy/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/EmployeeForm.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/EmployeeForm.vue?type=template","mod::happy/webdesigns/happy/frontend/components/EmployeeForm.vue","/opt/whdata/generated/platform/ap/happy.happy/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/EmployeesView.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/EmployeesView.vue?type=template","mod::happy/webdesigns/happy/frontend/views/EmployeesView.vue","/opt/whdata/generated/platform/ap/happy.happy/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/EmployeeDetailView.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/EmployeeDetailView.vue?type=template","mod::happy/webdesigns/happy/frontend/views/EmployeeDetailView.vue","/opt/whdata/generated/platform/ap/happy.happy/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/ActivityForm.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/ActivityForm.vue?type=template","mod::happy/webdesigns/happy/frontend/components/ActivityForm.vue","/opt/whdata/generated/platform/ap/happy.happy/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/ActivitiesView.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/ActivitiesView.vue?type=template","mod::happy/webdesigns/happy/frontend/views/ActivitiesView.vue","/opt/whdata/generated/platform/ap/happy.happy/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/ActivityDetailView.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/ActivityDetailView.vue?type=template","mod::happy/webdesigns/happy/frontend/views/ActivityDetailView.vue","mod::happy/webdesigns/happy/frontend/lib/hoursInput.ts","/opt/whdata/generated/platform/ap/happy.happy/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/Combobox.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/Combobox.vue?type=template","mod::happy/webdesigns/happy/frontend/components/Combobox.vue","/opt/whdata/generated/platform/ap/happy.happy/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/HoursEntryView.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/HoursEntryView.vue?type=template","mod::happy/webdesigns/happy/frontend/views/HoursEntryView.vue","mod::happy/webdesigns/happy/frontend/lib/hoursOverviewState.ts","/opt/whdata/generated/platform/ap/happy.happy/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/TimeEntryFormDialog.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/TimeEntryFormDialog.vue?type=template","mod::happy/webdesigns/happy/frontend/components/TimeEntryFormDialog.vue","/opt/whdata/generated/platform/ap/happy.happy/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/HoursOverviewView.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/HoursOverviewView.vue?type=template","mod::happy/webdesigns/happy/frontend/views/HoursOverviewView.vue","mod::happy/webdesigns/happy/frontend/lib/weekOverview.ts","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/WeekEntriesTable.vue?type=template","mod::happy/webdesigns/happy/frontend/components/WeekEntriesTable.vue","/opt/whdata/generated/platform/ap/happy.happy/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/HoursWeekView.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/HoursWeekView.vue?type=template","mod::happy/webdesigns/happy/frontend/views/HoursWeekView.vue","mod::happy/webdesigns/happy/frontend/lib/period.ts","mod::happy/webdesigns/happy/frontend/lib/invoiceListState.ts","/opt/whdata/generated/platform/ap/happy.happy/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/InvoicesView.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/InvoicesView.vue?type=template","mod::happy/webdesigns/happy/frontend/views/InvoicesView.vue","mod::happy/webdesigns/happy/frontend/lib/invoicing.ts","/opt/whdata/generated/platform/ap/happy.happy/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/InvoiceWizardView.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/InvoiceWizardView.vue?type=template","mod::happy/webdesigns/happy/frontend/views/InvoiceWizardView.vue","mod::happy/webdesigns/happy/frontend/lib/invoiceActivity.ts","mod::happy/webdesigns/happy/frontend/lib/download.ts","/opt/whdata/generated/platform/ap/happy.happy/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/InvoiceMailDialog.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/InvoiceMailDialog.vue?type=template","mod::happy/webdesigns/happy/frontend/components/InvoiceMailDialog.vue","/opt/whdata/generated/platform/ap/happy.happy/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/InvoicePreview.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/InvoicePreview.vue?type=template","mod::happy/webdesigns/happy/frontend/components/InvoicePreview.vue","/opt/whdata/generated/platform/ap/happy.happy/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/InvoiceDetailView.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/InvoiceDetailView.vue?type=template","mod::happy/webdesigns/happy/frontend/views/InvoiceDetailView.vue","mod::happy/webdesigns/happy/frontend/lib/customerStatement.ts","/opt/whdata/generated/platform/ap/happy.happy/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/CustomerStatementView.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/CustomerStatementView.vue?type=template","mod::happy/webdesigns/happy/frontend/views/CustomerStatementView.vue","/opt/whdata/generated/platform/ap/happy.happy/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/ReminderMailDialog.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/ReminderMailDialog.vue?type=template","mod::happy/webdesigns/happy/frontend/components/ReminderMailDialog.vue","/opt/whdata/generated/platform/ap/happy.happy/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/ReminderDetailView.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/ReminderDetailView.vue?type=template","mod::happy/webdesigns/happy/frontend/views/ReminderDetailView.vue","mod::happy/webdesigns/happy/frontend/lib/expenseKinds.ts","mod::happy/webdesigns/happy/frontend/lib/expensesState.ts","/opt/whdata/generated/platform/ap/happy.happy/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/ExpensesView.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/ExpensesView.vue?type=template","mod::happy/webdesigns/happy/frontend/views/ExpensesView.vue","/opt/whdata/generated/platform/ap/happy.happy/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/ExpenseEntryView.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/ExpenseEntryView.vue?type=template","mod::happy/webdesigns/happy/frontend/views/ExpenseEntryView.vue","/opt/whdata/generated/platform/ap/happy.happy/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/ExpenseKindSettings.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/ExpenseKindSettings.vue?type=template","mod::happy/webdesigns/happy/frontend/components/ExpenseKindSettings.vue","mod::happy/js/internal/invoice-layout.ts","mod::happy/webdesigns/happy/frontend/lib/invoiceDesigner.ts","/opt/whdata/generated/platform/ap/happy.happy/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/InvoiceStyleSenderFields.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/InvoiceStyleSenderFields.vue?type=template","mod::happy/webdesigns/happy/frontend/components/InvoiceStyleSenderFields.vue","/opt/whdata/generated/platform/ap/happy.happy/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/InvoiceDesigner.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/InvoiceDesigner.vue?type=template","mod::happy/webdesigns/happy/frontend/components/InvoiceDesigner.vue","/opt/whdata/generated/platform/ap/happy.happy/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/InvoiceStyleSettings.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/InvoiceStyleSettings.vue?type=template","mod::happy/webdesigns/happy/frontend/components/InvoiceStyleSettings.vue","/opt/whdata/generated/platform/ap/happy.happy/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/SettingsView.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/SettingsView.vue?type=template","mod::happy/webdesigns/happy/frontend/views/SettingsView.vue","/opt/whdata/generated/platform/ap/happy.happy/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/ProfileView.vue","/opt/whdata/generated/platform/ap/happy.happy/build/sfc-template:/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/ProfileView.vue?type=template","mod::happy/webdesigns/happy/frontend/views/ProfileView.vue","mod::happy/webdesigns/happy/frontend/lib/router.ts","mod::happy/webdesigns/happy/frontend/frontend.ts","/entrypoint.js"],"sourcesContent":["//We implement the backend version of getWHDebugFlags so bridge can access us without going through a recursive dep\n\nimport type { DTAPStage } from \"./concepts\";\n\n/// List global polyfills currently active. This may be needed to align TypeScript hosts configuration\nexport const globalPolyfills: string[] = [];\n\n/// An object with string keys and typed values\nexport interface WellKnownFlags {\n  /** Log RPcs */\n  rpc?: boolean;\n  /** Log web traffic */\n  wrq?: boolean;\n  /** Autoprofile */\n  apr?: boolean;\n  /** IPC */\n  ipc?: boolean;\n  /** async */\n  async?: boolean;\n}\nexport type DebugFlags = WellKnownFlags & { [key: string]: boolean | undefined };\n\nexport type DebugConfig = {\n  tags: readonly string[];\n  outputsession: string;\n  context: string;\n};\n\n/// Empty or no parameter lang is get, otherwise it's a set\nexport type GetSetAssetBase = (assetBase?: string | null) => string | null;\n\nexport type EnvHooks = {\n  currentAssetBase: GetSetAssetBase;\n};\n\n\nconst settingschangedcallbacks = new Array<() => void>;\n\n/* Global debug flags are set by `wh debug`, local flags are prefilled by environment variables.\n   Edits to the debug flags will be applied to the local flags (unless setDebugFlagsOverrideCB returns\n   override records).\n*/\nconst globalDebugFlags: DebugFlags = {}, localDebugFlags: DebugFlags = {};\n\n/** Returns the flag override records. The first record is examined first, then the second, etc. */\nlet debugFlagsOverridesCB: undefined | (() => DebugFlags[]);\n\n/** Override the debug flag override getter. */\nexport function setDebugFlagsOverrideCB(cb: undefined | (() => DebugFlags[])) {\n  debugFlagsOverridesCB = cb;\n}\n\n/* Proxy handler for the published debug flags. Uses the override records (with the first record\n   examined first, then the second, etc.) to override the flags from baseDebugFlags. Setting to `true` sets\n   the flag, `false` disables it and setting to `undefined` has the same effect as deleting the property in the\n   current top record (exposing any value from a lower record, like the debug settings from `wh debug`).\n*/\nclass DebugFlagsProxyHandler implements ProxyHandler<DebugFlags> {\n  private getRecordList(): DebugFlags[] {\n    return [...debugFlagsOverridesCB?.() ?? [], localDebugFlags, globalDebugFlags];\n  }\n\n  get(target: DebugFlags, p: string) {\n    for (const record of this.getRecordList())\n      if (p in record && typeof record[p] !== \"undefined\")\n        return record[p];\n    return undefined;\n  }\n  has(target: DebugFlags, p: string): boolean {\n    return this.get(target, p) !== undefined;\n  }\n  ownKeys(target: DebugFlags): Array<string | symbol> {\n    const keys = new Array<string | symbol>;\n    for (const record of this.getRecordList())\n      for (const key of Reflect.ownKeys(record))\n        if (typeof key === \"string\" && record[key] !== undefined && !keys.includes(key))\n          keys.push(key);\n    return keys;\n  }\n  set(target: DebugFlags, p: string, newValue: boolean | undefined): boolean {\n    const toModify = this.getRecordList()[0];\n    if (typeof newValue === \"boolean\")\n      toModify[p] = newValue;\n    else\n      delete toModify[p];\n\n    runSettingsCallbacks();\n    return true;\n  }\n  deleteProperty(target: DebugFlags, p: string): boolean {\n    const toModify = this.getRecordList()[0];\n    delete toModify[p];\n\n    runSettingsCallbacks();\n    return true;\n  }\n  getOwnPropertyDescriptor(target: DebugFlags, p: string): PropertyDescriptor | undefined {\n    const value = this.get(target, p);\n    return value !== undefined ? { enumerable: true, value, configurable: true } : undefined;\n  }\n}\n\nexport const debugFlags = new Proxy<DebugFlags>({\n  [Symbol.for('nodejs.util.inspect.custom')]: formatForConsoleLogs\n}, new DebugFlagsProxyHandler());\n\nfunction formatForConsoleLogs() {\n  return `DebugFlags [${[...Object.keys(debugFlags)].filter(key => debugFlags[key]).join(\", \")}]`;\n}\n\nfunction runSettingsCallbacks() {\n  for (const cb of [...settingschangedcallbacks]) {\n    try {\n      cb();\n    } catch (e) {\n      console.error(\"Error invoking settings change callback\", cb?.name, e);\n      //ignore, debugFlags can change due to external updates so they're basically signal handlers and there's no real point in crashing whatever was really running\n    }\n  }\n}\n\n/** Update the debugconfig as present in the system configuration record\n    @param settings - debugconfig cell of the system configuration record\n*/\nexport function updateDebugConfig(settings: DebugConfig | null) {\n  const oldenabledflags = Object.keys(globalDebugFlags).sort();\n  const newenabledflags = settings?.tags ? [...settings.tags].sort() : [];\n\n  if (oldenabledflags.join(\",\") !== newenabledflags.join(\",\")) {\n    for (const flag of newenabledflags)\n      globalDebugFlags[flag] = true;\n    for (const flag of oldenabledflags)\n      if (!newenabledflags.includes(flag))\n        delete globalDebugFlags[flag];\n\n    runSettingsCallbacks();\n  }\n  if (debugFlags.async && Error.stackTraceLimit < 100)\n    Error.stackTraceLimit = 100;\n}\n\nexport function registerDebugConfigChangedCallback(cb: () => void) {\n  settingschangedcallbacks.push(cb);\n}\n\nexport function updateLocalDebugFlags(mode: \"enable\" | \"disable\" | \"clear\", flags: string[]): DebugFlags {\n  switch (mode) {\n    case \"enable\":\n    case \"disable\":\n      for (const flag of flags)\n        localDebugFlags[flag] = mode === \"enable\";\n      break;\n    case \"clear\":\n      for (const flag of Object.keys(localDebugFlags))\n        delete localDebugFlags[flag];\n  }\n  runSettingsCallbacks();\n  return { ...globalDebugFlags, ...localDebugFlags };\n}\n\n/** DTAP stage set for this WebHare */\nlet dtapStage: DTAPStage = \"production\";\n\n/** @deprecated We now recommend checking dtapStage against production/acceptance Explicitly */\nlet isLive: boolean = dtapStage === \"production\" || dtapStage === \"acceptance\";\n\n/** The backend base URL. Used for eg. autoconfiguring JSON/RPC */\nlet backendBase = \"\";\n\n/** The global assetbase */\nlet assetBase: string | null = null;\n\n//deprecated variants\n/** @deprecated For WH5.4 and up use 'dtapStage' */\nlet dtapstage: DTAPStage = dtapStage;\n/** @deprecated For WH5.4 and up compare 'dtapStage' for production or acceptance */\nlet islive: boolean = isLive;\n\nlet hooks: EnvHooks | undefined;\nlet hookFactory: (() => EnvHooks) | undefined;\nlet gotHooks = false;\n\nexport function initEnv(setDtapStage: DTAPStage, setBackendBase: string) {\n  dtapStage = setDtapStage;\n  isLive = dtapStage === \"production\" || dtapStage === \"acceptance\";\n  backendBase = setBackendBase;\n\n  dtapstage = dtapStage;\n  islive = isLive;\n}\n\nexport function setEnvHooksFactory(newHookFactory: () => EnvHooks) {\n  if (gotHooks)\n    throw new Error(`The call to setEnvHooksFactory was too late - hooks have already been retrieved once`);\n  hookFactory = newHookFactory;\n}\n\nexport function getEnvHooks() {\n  gotHooks = true;\n  return hookFactory?.();\n}\n\nfunction ensureHooks(): EnvHooks {\n  return hooks ??= getEnvHooks?.() ?? {\n    currentAssetBase: (newAssetBase) => {\n      if (newAssetBase !== undefined)\n        assetBase = newAssetBase;\n      return assetBase;\n    }\n  };\n}\n\n/** Get the base url for assets. This may point towards eg. a CDN\n * @returns The base url for assets, ending with a '/'. null if not set\n */\nexport function getAssetBase(): string | null {\n  return ensureHooks().currentAssetBase();\n}\n\n/** Get the base url for a module's public assets (those located in the module's `public` folder)\n */\nexport function getModulePublicAssetBase(module: string) {\n  return `${getAssetBase() || \"/\"}.wh/mod/${encodeURIComponent(module)}/public/`;\n}\n\n/** Set the base url for assets */\nexport function setAssetBase(base: string | null): void {\n  if (base && !base.endsWith(\"/\"))\n    throw new Error(`Asset base must end with a '/'`);\n\n  ensureHooks().currentAssetBase(base);\n}\n\nexport { dtapStage, isLive, backendBase, localDebugFlags };\nexport { dtapstage, islive }; //deprecated variants\n","\n//Note that @webhare/env does not invoke this API itself. In WebHare @webhare/frontend/src/init uses this to initialize\nexport function getBrowserDebugFlags(varname: string): string[] {\n  const flags = [];\n  const urldebugvar = new URL(location.href).searchParams.get(varname);\n  if (urldebugvar)\n    flags.push(...urldebugvar.split(','));\n\n  //not importing getCookie to solve some import ordering issues\n  if (typeof document !== \"undefined\") { //'document' is undefined in a worker but assetpacks compiled for a ServiceWorker will also load us\n    const debugcookie = document.cookie.match(`(?:^|;)\\\\s*${varname}=([^;]*)`); //TODO escape varname\n    if (debugcookie) {\n      const debugcookievalue = decodeURIComponent(debugcookie[1]);\n      if (debugcookievalue)\n        flags.push(... (debugcookievalue.split('.').filter(flag => !flag.startsWith('sig='))));\n    }\n  }\n\n  if (typeof sessionStorage !== \"undefined\") {\n    const sessionDebug = sessionStorage.getItem(varname);\n    if (sessionDebug)\n      flags.push(...sessionDebug.split(','));\n  }\n\n  return flags;\n}\n","/** Rect describing an elements position */\nexport type Rect = {\n  top: number;\n  bottom: number;\n  left: number;\n  right: number;\n  width: number;\n  height: number;\n};\n\n/** Elements you can set a value on and would have to trigger change and/or input events */\nexport type FormControlElement = HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\n\n/** Types that support querySelector(All) */\ntype QuerySelectorAble = ParentNode | ShadowRoot;\n\nexport function qS<E extends Element = HTMLElement>(startnode: QuerySelectorAble, selector: string): E | null;\nexport function qS<E extends Element = HTMLElement>(selector: string): E | null;\n\n/** Match the first element using a CSS selector\n * @param node_or_selector - The starting node or selector\n * @param selector - The selector to match if the starting node was specified\n * @returns The first matching element or null\n */\nexport function qS<E extends Element>(node_or_selector: QuerySelectorAble | string, selector?: string): E | null {\n  if (typeof node_or_selector === 'string')\n    return document.querySelector<E>(node_or_selector);\n  else if (selector)\n    return node_or_selector.querySelector<E>(selector);\n  return null;\n}\n\n\nexport function qR<E extends Element = HTMLElement>(startnode: QuerySelectorAble, selector: string): E;\nexport function qR<E extends Element = HTMLElement>(selector: string): E;\n\n/** Match a specific element using a CSS selector, requiring it to exist and be unique\n * @param node_or_selector - The starting node or selector\n * @param selector - The selector to match if the starting node was specified\n * @returns The requested element. Throw it the selector doesn't match exactly one element\n */\nexport function qR<E extends Element>(node_or_selector: QuerySelectorAble | string, selector?: string): E {\n  const matches = qSA<E>(node_or_selector as QuerySelectorAble, selector as string);\n  if (matches.length === 1)\n    return matches[0];\n\n  if (typeof node_or_selector !== 'string') {\n    console.error(`${matches.length} elements match selector \\`${selector}\\` with startingpoint`, node_or_selector, matches);\n    throw new Error(`${matches.length} elements match selector \\`${selector}\\` given startingpoint '${node_or_selector.nodeName}'`);\n  } else {\n    console.error(`${matches.length} elements match selector \\`${node_or_selector}\\` in the document`, matches);\n    throw new Error(`${matches.length} elements match selector \\`${node_or_selector}\\` in the document`);\n  }\n}\n\nexport function qSA<E extends Element = HTMLElement>(startnode: QuerySelectorAble, selector: string): E[];\nexport function qSA<E extends Element = HTMLElement>(selector: string): E[];\n\n/** Find multiple elements using a CSS selector\n * @param node_or_selector - The starting node or selector\n * @param selector - The selector to match if the starting node was specified\n * @returns The requested elements.\n */\nexport function qSA<E extends Element>(node_or_selector: QuerySelectorAble | string, selector?: string): E[] {\n  if (typeof node_or_selector === 'string')\n    return Array.from(document.querySelectorAll(node_or_selector));\n  else if (selector)\n    return Array.from(node_or_selector.querySelectorAll(selector));\n\n  return [];\n}\n\n/** Return whether the passed element is a FormControlElement */\nexport function isFormControl(field: Element): field is FormControlElement {\n  return isHTMLElement(field) && [\"INPUT\", \"SELECT\", \"TEXTAREA\"].includes(field.tagName);\n}\n\n/** Return whether the passed element is an editable text field */\nexport function isEditControl(field: Element): field is HTMLElement {\n  return isHTMLElement(field) && ([\"INPUT\", \"TEXTAREA\"].includes(field.tagName) || field.isContentEditable);\n}\n\n/** Test whether node is an Element, even if it's in a different iframe */\nexport function isElement(node: unknown): node is Element {\n  //TODO What is actually going on if defaultView is missing?\n  if (!node || typeof node !== \"object\")\n    return false;\n\n  /* Getting the proto doesn't always work:\n  const proto = (node as Element).ownerDocument.defaultView?.Element;\n  (because our iframes derive off about? not sure) so until someone finds the real answer, we'll do a heuristic\n  */\n\n  /** Analyzing node.constructor.name doesn't work because custom elements don't necessarily have their constructor's name ending in Element\n  return Boolean(\"ownerDocument\" in node && node.constructor.name.match(/Element$/));\n  */\n\n  return Boolean(\"ownerDocument\" in node && (node as Element).nodeType === 1);\n\n}\n\n/** Test whether node is a HTMLElement, even if it's in a different iframe */\nexport function isHTMLElement(node: unknown): node is HTMLElement {\n  return isElement(node) && \"accessKey\" in node;\n}\n\n/**\n * get the relative bound difference between two elements, and return a writable copy\n *\n * @param node - The node for which you need coordinates\n * @param relativeto - Optional reference point. If not set, you just get a 'normal' coordinate object\n */\nexport function getRelativeBounds(node: Element, relativeto?: Element): Rect {\n  if (!relativeto)\n    relativeto = node.ownerDocument.documentElement;\n\n  const nodecoords = node.getBoundingClientRect();\n  const relcoords = relativeto.getBoundingClientRect();\n  return {\n    top: nodecoords.top - relcoords.top,\n    left: nodecoords.left - relcoords.left,\n    right: nodecoords.right - relcoords.left,\n    bottom: nodecoords.bottom - relcoords.top,\n    width: nodecoords.width,\n    height: nodecoords.height\n  };\n}\n\nexport type ParsedLanguageTag = {\n  /** The full tag, eg en-US */\n  tag: string;\n  /** The language code, eg 'en' */\n  language: string;\n  region?: string;\n  /** The script, eg 'Hant' */\n  script?: string;\n};\n\n/** Parse a BCP47 language tag */\nexport function parseLanguageTag(languageTag: string): ParsedLanguageTag {\n  /* https://datatracker.ietf.org/doc/html/rfc5646#section-2.1\n     langtag       = language\n                 [\"-\" script]\n                 [\"-\" region]\n                 *(\"-\" variant)\n                 *(\"-\" extension)\n                 [\"-\" privateuse]\n     BUT: we're limiting ourselves to language, script and region for now\n\n     language      = 2*3ALPHA           ; shortest ISO 639 code\n                    [\"-\" extlang]       ; sometimes followed by\n                                          extended language subtags\n\n                                           extlang       = 3ALPHA              ; selected ISO 639 codes\n                 *2(\"-\" 3ALPHA)      ; permanently reserved\n\n      script        = 4ALPHA              ; ISO 15924 code\n\n      region        = 2ALPHA              ; ISO 3166-1 code\n                    / 3DIGIT              ; UN M.49 code\n\n     Note that we're not yet fully implementing the spec, just the parts we expect to encounter in practice\n  */\n  const match = languageTag.match(/^([a-z]{2,}(-[a-z]{3})?)(-[A-Za-z]{4,})?(-[A-Z]{2}|-\\d{3})?$/);\n  if (!match)\n    throw new Error(`Invalid language tag: ${languageTag}`);\n\n  return {\n    tag: languageTag,\n    language: match[1],\n    ...(match[3] ? { script: match[3].substring(1) } : {}),\n    ...(match[4] ? { region: match[4].substring(1) } : {})\n  };\n}\n\n/** Get the effective language for an element (or the document)\n * @param node - The element for which to get the effective language. If not specified, the documentElement and finally the browser is used\n * @returns The language code, eg. \"nl\" or \"en-GB\"\n */\nexport function getLang(node?: Element): ParsedLanguageTag {\n  if (!node && typeof document !== \"undefined\")\n    node = document.documentElement;\n  const tag = (node?.closest('[lang]')?.getAttribute(\"lang\") || navigator.language || \"en\");\n  return parseLanguageTag(tag);\n}\n","//TODO can we replace ourselves with nodejs util.types in a pure NodeJS environment?\n\nimport type { Money } from \"./money.ts\";\n\nexport function getWHType(obj: unknown): string | null { //not exporting this directly as we hope JS comes up with better solutions for instanceOf not being compatible with realms/reloading\n  // Ideally we'd use symbol but it breaks tree shaking in esbuild, so this is our workaround. Reported as https://github.com/evanw/esbuild/issues/3940\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Can't cleanly type this it seems and it's low level anyway\n  return (obj as any)?.constructor?.[\"__ $whTypeSymbol\"] ?? null;\n}\n\nfunction isCrossRealm(value: unknown): value is object {\n  return Boolean(value // it's not null\n    && typeof value === \"object\" //and it's an object\n    && !(value instanceof Object)); //and it's not an instance of our Object\n}\n\n/** Test whether a value looks like an instance of Money */\nexport function isMoney(value: unknown): value is Money {\n  return getWHType(value) === \"Money\";\n}\n\n/** Test whether a value looks like an instance of Temporal.Instant */\nexport function isTemporalInstant(value: unknown): value is Temporal.Instant {\n  return Boolean(value && typeof value === \"object\" && Symbol.toStringTag in value && value?.[Symbol.toStringTag] === 'Temporal.Instant');\n}\n\n/** Test whether a value looks like an instance of Temporal.PlainDateTime */\nexport function isTemporalPlainDateTime(value: unknown): value is Temporal.PlainDateTime {\n  return Boolean(value && typeof value === \"object\" && Symbol.toStringTag in value && value?.[Symbol.toStringTag] === 'Temporal.PlainDateTime');\n}\n\n/** Test whether a value looks like an instance of Temporal.PlainDate */\nexport function isTemporalPlainDate(value: unknown): value is Temporal.PlainDate {\n  return Boolean(value && typeof value === \"object\" && Symbol.toStringTag in value && value?.[Symbol.toStringTag] === 'Temporal.PlainDate');\n}\n\n/** Test whether a value looks like an instance of Temporal.PlainTime */\nexport function isTemporalPlainTime(value: unknown): value is Temporal.PlainTime {\n  return Boolean(value && typeof value === \"object\" && Symbol.toStringTag in value && value?.[Symbol.toStringTag] === 'Temporal.PlainTime');\n}\n\n/** Test whether a value looks like an instance of Temporal.ZonedDateTime */\nexport function isTemporalZonedDateTime(value: unknown): value is Temporal.ZonedDateTime {\n  return Boolean(value && typeof value === \"object\" && Symbol.toStringTag in value && value?.[Symbol.toStringTag] === 'Temporal.ZonedDateTime');\n}\n\n/** Test whether a value looks like an instance of Date (assumes no subclasses) */\nexport function isDate(value: unknown): value is Date {\n  return value instanceof Date || (isCrossRealm(value) && value.constructor.name === \"Date\");\n}\n\n/** Test whether a value appears to implement the Blob interface */\nexport function isBlob(value: unknown): value is Blob {\n  return value instanceof Blob || Boolean(value && typeof value === \"object\" && \"size\" in value && \"type\" in value && \"slice\" in value && typeof value.slice === \"function\" && \"stream\" in value && typeof value.stream === \"function\");\n}\n\n/** Test whether a value appears to implement the File interface */\nexport function isFile(value: unknown): value is File {\n  return isBlob(value) && \"name\" in value;\n}\n\n/** Check if the object is probably an Error object. Can't use 'instanceof Error' as an Error might come from a different frame */\nexport function isError(e: unknown): e is Error {\n  return e instanceof Error || (isCrossRealm(e) && \"name\" in e && \"stack\" in e && \"message\" in e);\n}\n\n/** Check if the object looks like a promise */\nexport function isPromise<T>(e: T | Promise<T>): e is Promise<Awaited<T>> {\n  return Boolean(e && typeof (e as Promise<unknown>).then === \"function\" && typeof (e as Promise<unknown>).catch === \"function\");\n}\n\n/** Check the type of a value, return its JS or STD type\n * @param value - The value to check\n * @returns The type of the value. If the value is an object but recognized as any of Money, Date, Blob, Temporal.Instant/PlainDate/PlainDateTime, that type is returned.\n */\nexport function stdTypeOf(value: unknown): \"string\" | \"number\" | \"boolean\" | \"null\" | \"symbol\" | \"bigint\" | \"function\" | \"object\" | \"undefined\" | \"Date\" | \"Money\" | \"Array\" | \"Instant\" | \"PlainDate\" | \"PlainDateTime\" | \"PlainTime\" | \"ZonedDateTime\" | \"File\" | \"Blob\" {\n  const t = typeof value;\n  if (t === \"object\") {\n    if (!value)\n      return \"null\";\n    if (Array.isArray(value))\n      return \"Array\";\n    if (isMoney(value))\n      return \"Money\";\n    if (isBlob(value))\n      return isFile(value) ? \"File\" : \"Blob\";\n    if (isDate(value))\n      return \"Date\";\n    if (isTemporalInstant(value))\n      return \"Instant\";\n    if (isTemporalPlainTime(value))\n      return \"PlainTime\";\n    if (isTemporalPlainDate(value))\n      return \"PlainDate\";\n    if (isTemporalPlainDateTime(value))\n      return \"PlainDateTime\";\n    if (isTemporalZonedDateTime(value))\n      return \"ZonedDateTime\";\n  }\n  return t;\n}\n","/* A math library for safe calculation with money amounts in JS. If you don't\n   know why we need this, try to predict what the following code would print:\n   var cents=0;for(var i=0;i<100;++i)cents+=0.01;cents-=1;console.log(cents);\n   and think twice about whether you want to code anything financial in JS.\n\n   Money values supplied from HareScript should be formatted using FormatJSFinmathMoney\n*/\n\nexport type FinmathInput = string | number;\n\nexport type RoundMode = \"none\" | \"toward-zero\" | \"down\" | \"up\" | \"half-toward-zero\" | \"half-down\" | \"half-up\" | \"toward-infinity\" | \"half-toward-infinity\";\n\nexport interface SplitNumber {\n  num: number;\n  decimals: number;\n}\n\n//a 'price' is a string of the form \"nnn[.NNNN]\"\n\nfunction stripUnneededDecimals(num: number, decimals: number) {\n  //we have a maximum of 5 digits of external precision\n  if (decimals > 5) {\n    // math.round rounds toward positive infinity\n    const isneg = num < 0;\n    if (isneg)\n      num = -num;\n\n    while (decimals > 6) { //truncate excess digits\n      num = Math.floor(num / 10);\n      --decimals;\n    }\n    //round up if 6th decimal >= 5\n    num = Math.round(num / 10);\n    decimals = 5;\n\n    if (isneg)\n      num = -num;\n  }\n\n  //strip unneeded decimals\n  while (decimals > 0 && !(num % 10)) {\n    num /= 10;\n    --decimals;\n  }\n\n  return { num, decimals };\n}\n\nfunction toText(amount: SplitNumber, decimalpoint: string, mindecimals: number) {\n  if (!Number.isSafeInteger(amount.num))\n    throw new Error(\"Result would overflow the safe value range\");\n\n  let num, decimals;\n  ({ num, decimals } = stripUnneededDecimals(amount.num, amount.decimals));\n\n  // Strip sign from number, may need to prefix it\n  const isnegative = num < 0;\n  if (isnegative)\n    num = -num;\n\n  let astext = String(num);\n\n  // Ensure we have enough leading 0's to render the first integer digit\n  if (astext.length <= decimals)\n    astext = '00000000000000000000'.substr(0, decimals + 1 - astext.length) + astext;\n  // make sure we have enough 0's to show mindecimals\n  if (decimals < mindecimals) {\n    astext += '00000000000000000000'.substr(0, mindecimals - decimals);\n    decimals = mindecimals;\n  }\n\n  // insert decimal point if needed\n  if (decimals)\n    astext = astext.substr(0, astext.length - decimals) + decimalpoint + astext.substr(-decimals);\n\n  // add sign if needed\n  astext = (isnegative ? \"-\" : \"\") + astext;\n  return astext;\n}\n\n/** Convert a money of any format to a split number object\n    @param money - Either an integer number or string with a number\n    @returns Split number object\n*/\nfunction splitValue(money: FinmathInput): SplitNumber {\n  if (typeof money === 'number') {\n    if (money !== Math.floor(money))\n      throw new Error(\"Non-integer number passed\");\n    if (!Number.isSafeInteger(money))\n      throw new Error(`The value ${money} is outside the safe value range`);\n    return { num: money, decimals: 0 };\n  }\n  if (typeof money !== 'string')\n    throw new Error(\"Number or string expected, got \" + money);\n\n  const split = money.match(/^(-)?([0-9]*)(\\.([0-9]{0,5})([0-9]*))?$/);\n  if (!split)\n    throw new Error(`Illegal money value received: '${money}'`);\n\n  const sign = split[1] === '-' ? -1 : 1;\n  const decimals = split[3] ? split[4].length : 0;\n  // If there are more than 5 decimals, round up (using halfExpand strategy)\n  const num = sign * (parseInt(split[2] || \"0\") * Math.pow(10, decimals) + (parseInt((split[4] || '')) || 0) + (split[5]?.[0] >= '5' ? 1 : 0));\n  if (!Number.isSafeInteger(num))\n    throw new Error(`The value '${money}' is outside the safe value range`);\n\n  return stripUnneededDecimals(num, decimals);\n}\n\n/** Convert split number into a string\n*/\nfunction joinPrice(parts: SplitNumber): string {\n  return toText(parts, '.', 0);\n}\n\nfunction adjustDecimals(amount: SplitNumber, requiredecimals: number) {\n  const toadd = requiredecimals - amount.decimals;\n  if (toadd <= 0)\n    return;\n\n  let multiplier = 1;\n  for (let idx = 0; idx < toadd; ++idx)\n    multiplier *= 10;\n\n  if (!Number.isSafeInteger(amount.num * multiplier))\n    throw new Error(\"adjustDecimals would overflow the safe value range\");\n\n  amount.num *= multiplier;\n  amount.decimals += toadd;\n}\n\n/** Returns if a price string is valid\n*/\nexport function isValidPrice(money: string) {\n  if (typeof money !== 'string' || !money.match(/[0-9]+(\\.[0-9]{0,5})?$/))\n    return false;\n  return true;\n}\n\nfunction __add(lhs: SplitNumber, rhs: SplitNumber) {\n  //equalize # of decimals, and then it's a simple addition\n  const requiredecimals = Math.max(lhs.decimals, rhs.decimals);\n  adjustDecimals(lhs, requiredecimals);\n  adjustDecimals(rhs, requiredecimals);\n  return { num: lhs.num + rhs.num, decimals: requiredecimals };\n}\n\n/** Adds two numbers together\n*/\nexport function add(amount1: FinmathInput, amount2: FinmathInput): string {\n  return joinPrice(__add(splitValue(amount1), splitValue(amount2)));\n}\n\n/** Subtracts a number from another number\n*/\nexport function subtract(amount: FinmathInput, tosubtract: FinmathInput) {\n  const lhs = splitValue(amount), rhs = splitValue(tosubtract);\n  rhs.num = -rhs.num;\n  return joinPrice(__add(lhs, rhs));\n}\n\nfunction __multiply(lhs: SplitNumber, rhs: SplitNumber) {\n  //ADDME the naive 'add decimals, multiple nums' approach gets you out of the safe range real fast. needs tests\n  return { num: lhs.num * rhs.num, decimals: lhs.decimals + rhs.decimals };\n}\n\n/** Multiplies two numbers together\n*/\nexport function multiply(amount1: FinmathInput, amount2: FinmathInput): string {\n  const lhs = splitValue(amount1), rhs = splitValue(amount2);\n  return joinPrice(__multiply(lhs, rhs));\n}\n\n/** Compares two numbers\n    @param amount1 - Left hand value\n    @param amount2 - Right hand value\n    @returns Returns 0 if amount1 === amount2, -1 if amount1 \\< amount2, 1 if amount1 \\> amount2\n*/\nexport function cmp(amount1: FinmathInput, amount2: FinmathInput) {\n  const diff = __add(splitValue(amount1), __multiply(splitValue(amount2), { num: -1, decimals: 0 }));\n  return diff.num < 0 ? -1 : diff.num === 0 ? 0 : 1;\n}\n\n/** Returns a percentage of an amount\n    @param amount - Original amount\n    @param perc - Percentage of the amount to return\n    @returns Percentage of the amount\n*/\nexport function getPercentageOfAmount(amount: FinmathInput, perc: FinmathInput) {\n  const lhs = splitValue(amount), rhs = splitValue(perc);\n  const result = __multiply(lhs, rhs);\n  result.decimals += 2;\n  return joinPrice(normalize(result));\n}\n\nfunction normalize(amount: SplitNumber) {\n  while (amount.decimals && (amount.num % 10) === 0) {\n    amount.num /= 10;\n    --amount.decimals;\n  }\n  return amount;\n}\n\n/// format a price amount. extend # of decimals to specified # if not enough\nexport function formatPrice(money: FinmathInput, decimalpoint: string, decimals: number) {\n  return toText(splitValue(money), decimalpoint, decimals);\n}\n\n/** Rounds integer to multiple, exposed for testing only\n*/\nexport function __roundIntegerToMultiple(value: number, roundunit: number, mode: RoundMode) {\n  switch (mode) {\n    case \"none\":\n      {\n        // no rounding\n      } break;\n    case \"toward-zero\":\n      {\n        value = Math.trunc(value / roundunit) * roundunit;\n      } break;\n    case \"toward-infinity\":\n      {\n        if (value > 0)\n          value = Math.trunc((value + roundunit - 1) / roundunit) * roundunit;\n        else\n          value = Math.trunc((value - roundunit + 1) / roundunit) * roundunit;\n      } break;\n    case \"down\":\n      {\n        if (value > 0)\n          value = Math.trunc(value / roundunit) * roundunit;\n        else\n          value = Math.trunc((value - roundunit + 1) / roundunit) * roundunit;\n      } break;\n    case \"up\":\n      {\n        if (value > 0)\n          value = Math.trunc((value + roundunit - 1) / roundunit) * roundunit;\n        else\n          value = Math.trunc(value / roundunit) * roundunit;\n      } break;\n    case \"half-toward-zero\":\n      {\n        if (value > 0)\n          value = Math.trunc((value + (roundunit - 1) / 2) / roundunit) * roundunit;\n        else\n          value = Math.trunc((value - (roundunit - 1) / 2) / roundunit) * roundunit;\n      } break;\n    case \"half-toward-infinity\":\n      {\n        if (value > 0)\n          value = Math.trunc((value + roundunit / 2) / roundunit) * roundunit;\n        else\n          value = Math.trunc((value - roundunit / 2) / roundunit) * roundunit;\n      } break;\n    case \"half-down\":\n      {\n        if (value > 0)\n          value = Math.trunc((value + (roundunit - 1) / 2) / roundunit) * roundunit;\n        else\n          value = Math.trunc((value - roundunit / 2) / roundunit) * roundunit;\n      } break;\n    case \"half-up\":\n      {\n        if (value > 0)\n          value = Math.trunc((value + roundunit / 2) / roundunit) * roundunit;\n        else\n          value = Math.trunc((value - (roundunit - 1) / 2) / roundunit) * roundunit;\n      } break;\n    default:\n      {\n        throw new Error(`Unknown rounding mode ${mode}`);\n      }\n  }\n  return value;\n}\n\n/** Rounds a value to a multiple of a unit, with a specific rounding mode\n    @param value - Value to round\n    @param unit - The value will be rounded to a mulitple of this unit (except when rounding mode is 'none')\n    @param mode - Rounding mode. Possible values:\n      <ul>\n        <li>none: No rounding</li>\n        <li>toward-zero: Round toward zero</li>\n        <li>down: Round toward negative infity</li>\n        <li>up: Round toward positive infity</li>\n        <li>half-toward-zero: Round nearest multiple, round half of a multiple toward zero</li>\n        <li>half-down: Round nearest multiple, round half of a multiple toward negative infinity</li>\n        <li>half-up: Round nearest multiple, round half of a multiple toward positive infity</li>\n      </ul>\n    @returns The rounded value\n*/\nexport function roundToMultiple(value: FinmathInput, unit: FinmathInput, mode: RoundMode) {\n  const split_value = splitValue(value);\n  const split_unit = splitValue(unit);\n\n  const requiredecimals = Math.max(split_value.decimals, split_unit.decimals);\n  adjustDecimals(split_value, requiredecimals);\n  adjustDecimals(split_unit, requiredecimals);\n\n  const result = { num: __roundIntegerToMultiple(split_value.num, split_unit.num, mode), decimals: split_value.decimals };\n  return joinPrice(result);\n}\n\n/** Returns the minimum of all the arguments\n    @param amount - First value\n    @param amounts - Rest of the values\n    @returns The lowest value among amount and amounts\n*/\nexport function min(amount: FinmathInput, ...amounts: FinmathInput[]) {\n  for (const val of amounts)\n    if (cmp(amount, val) > 0)\n      amount = val;\n  return joinPrice(splitValue(amount));\n}\n\n/** Returns the maximum of all the arguments\n    @param amount - First value\n    @param amounts - Rest of the values\n    @returns The highest value among amount and amounts\n*/\nexport function max(amount: FinmathInput, ...amounts: FinmathInput[]) {\n  for (const val of amounts)\n    if (cmp(amount, val) < 0)\n      amount = val;\n  return joinPrice(splitValue(amount));\n}\n\n/** Returns a power of 10\n    @param exp - Integer power, must be 0 or bigger\n    @returns Requested power of 10\n*/\nfunction getNonNegativePowerOf10(exp: number) {\n  let retval = 1, running_exp = 10;\n  while (exp) {\n    if (exp & 1)\n      retval *= running_exp;\n    running_exp *= running_exp;\n    exp = exp >> 1;\n  }\n  return retval;\n}\n\n/** Divides two values, with 5 decimals of precision\n    @param value - Value To divide\n    @param divisor - Divisor\n    @returns Divided value, with 5 decimals of precision\n*/\nexport function divide(value: FinmathInput, divisor: FinmathInput) {\n  const lhs = splitValue(value), rhs = splitValue(divisor);\n  const mul10exp = lhs.decimals - rhs.decimals - 5;\n  const mulfactor = mul10exp < 0 ? getNonNegativePowerOf10(-mul10exp) : 1;\n  const roundunit = mul10exp > 0 ? getNonNegativePowerOf10(mul10exp) : 1;\n  return joinPrice({ num: __roundIntegerToMultiple(mulfactor * lhs.num / rhs.num, roundunit, \"half-toward-infinity\"), decimals: 5 });\n}\n\nexport function moneyDivide(value: FinmathInput, divisor: FinmathInput) { //divide was added in 5.0. remove this old name eventually\n  return divide(value, divisor);\n}\n\n/** Test whether two values have a specific relation\n    @param lhs - Left hand value\n    @param relation - One of '\\<', '\\<=', '==', '!=', '\\>', '\\>=''\n    @param rhs - Right hand value\n    @returns TRUE if the relation holds\n    @example\n      console.log(finmath.test(1, '\\<', 2)); // prints 'true'\n*/\nexport function test(lhs: FinmathInput, relation: \"<\" | \"<=\" | \"==\" | \"!=\" | \">\" | \">=\", rhs: FinmathInput) {\n  const compareresult = cmp(lhs, rhs);\n  switch (relation) {\n    case '<': return compareresult < 0;\n    case '<=': return compareresult <= 0;\n    case '==': return compareresult === 0;\n    case '!=': return compareresult !== 0;\n    case '>': return compareresult > 0;\n    case '>=': return compareresult >= 0;\n  }\n  throw Error(`Cannot test for unknown relation '${relation}'`);\n}\n","/* A Money type library for safe calculation with money amounts in JS. If you don't\n   know why we need this, try to predict what the following code would print:\n   var cents=0;for(var i=0;i<100;++i)cents+=0.01;cents-=1;console.log(cents);\n   and think twice about whether you want to code anything financial in JS.\n\n   We haven't decideded yet what range Money should support. To keep our options open and keep HS compatbility for now\n   we will fix ourselves to 5 digits (HS compat) and not allow values bigger than 900_000_000 (2**53 / 100000 'number' compatbiility clamped to a more readable number)\n\n  Users should not rely on JS Money keeping this smaller range in the future. Money values supplied from HareScript should be formatted using FormatJSFinmathMoney\n*/\n\nimport * as finmath from \"./finmath.ts\"; //TODO absorb into us as soon as noone externally depends on finmath anymore\nimport { isMoney } from \"./quacks.ts\";\n\nexport type MoneyRoundingMode = \"none\" | \"toward-zero\" | \"down\" | \"up\" | \"half-toward-zero\" | \"half-down\" | \"half-up\" | \"toward-infinity\" | \"half-toward-infinity\";\nexport type MoneyTestTypes = \"<\" | \"<=\" | \"==\" | \"!=\" | \">\" | \">=\";\n\ntype MoneyParameter = Money | string;\n\ninterface SplitNumber {\n  num: number;\n  decimals: number;\n}\n\nexport interface MoneyFormatOptions {\n  //thousand separator. defaults to \"\"\n  thousandsSeparator?: string;\n  //decimal separator. defaults to \".\"\n  decimalSeparator?: string;\n  //minimum # of decimals. defaults to 2\n  minDecimals?: number;\n}\n\nfunction stripUnneededDecimals(num: number, decimals: number) {\n  //we have a maximum of 5 digits of external precision\n  if (decimals > 5) {\n    // math.round rounds toward positive infinity\n    const isneg = num < 0;\n    if (isneg)\n      num = -num;\n\n    while (decimals > 6) { //truncate excess digits\n      num = Math.floor(num / 10);\n      --decimals;\n    }\n    //round up if 6th decimal >= 5\n    num = Math.round(num / 10);\n    decimals = 5;\n\n    if (isneg)\n      num = -num;\n  }\n\n  //strip unneeded decimals\n  while (decimals > 0 && !(num % 10)) {\n    num /= 10;\n    --decimals;\n  }\n\n  return { num, decimals };\n}\n\n/** Convert a money of any format to a split number object\n    @param money - Either an integer number or string with a number\n    @returns Split number object\n*/\nfunction splitValue(money: MoneyParameter): SplitNumber {\n  if (typeof money === 'number') {\n    if (money !== Math.floor(money))\n      throw new Error(\"Non-integer number passed\");\n    if (!Number.isSafeInteger(money))\n      throw new Error(`The value ${money} is outside the safe value range`);\n    return { num: money, decimals: 0 };\n  }\n  if (typeof money !== 'string')\n    throw new Error(\"Number or string expected, got \" + money);\n\n  const split = money.match(/^(-)?([0-9]*)(\\.([0-9]{0,5})([0-9]*))?$/);\n  if (!split)\n    throw new Error(`Illegal money value received: '${money}'`);\n\n  const sign = split[1] === '-' ? -1 : 1;\n  const decimals = split[3] ? split[4].length : 0;\n  // If there are more than 5 decimals, round up (using halfExpand strategy)\n  const num = sign * (parseInt(split[2] || \"0\") * Math.pow(10, decimals) + (parseInt((split[4] || '')) || 0) + (split[5]?.[0] >= '5' ? 1 : 0));\n  if (!Number.isSafeInteger(num))\n    throw new Error(`The value '${money}' is outside the safe value range`);\n\n  return stripUnneededDecimals(num, decimals);\n}\n\nfunction toText(amount: SplitNumber, decimalpoint: string, mindecimals: number, thousandpoint: string) {\n  if (!Number.isSafeInteger(amount.num))\n    throw new Error(\"Result would overflow the safe value range\");\n\n  let { num, decimals } = stripUnneededDecimals(amount.num, amount.decimals);\n\n  // Strip sign from number, may need to prefix it\n  const isnegative = num < 0;\n  if (isnegative)\n    num = -num;\n\n  let astext = String(num);\n\n  // Ensure we have enough leading 0's to render the first integer digit\n  if (astext.length <= decimals)\n    astext = '00000000000000000000'.substring(0, decimals + 1 - astext.length) + astext;\n  // make sure we have enough 0's to show mindecimals\n  if (decimals < mindecimals) {\n    astext += '00000000000000000000'.substring(0, mindecimals - decimals);\n    decimals = mindecimals;\n  }\n\n  let beforepoint = astext.substring(0, astext.length - decimals);\n  const afterpoint = astext.substring(astext.length - decimals);\n\n  // Add thouands points if neeed\n  if (thousandpoint)\n    beforepoint = beforepoint.replaceAll(/\\B(?=(\\d{3})+(?!\\d))/g, thousandpoint);\n\n  return (isnegative ? \"-\" : \"\") + beforepoint + (afterpoint.length ? decimalpoint + afterpoint : \"\");\n}\n\n/** A decimal based JS money type*/\nexport class Money {\n  /** finmath-compatible value */\n  readonly value: string;\n  private static \"__ $whTypeSymbol\" = \"Money\";\n\n  constructor(value: MoneyParameter = \"0\") {\n    this.value = Money.parseParameter(value);\n\n    const intvalue = parseInt(this.value);\n    //We need the number to be in the safe range even after adding 5 decimals\n    if (intvalue <= (Number.MIN_SAFE_INTEGER / 100000) || intvalue >= (Number.MAX_SAFE_INTEGER / 100000))\n      throw new TypeError(`Money value '${value}' is out of range`);\n  }\n\n  private static parseParameter(param: MoneyParameter): string {\n    if (typeof param === \"string\")\n      return toText(splitValue(param), \".\", 0, \"\");\n    if (Money.isMoney(param))\n      return (param as unknown as { value: string }).value;\n\n    throw new TypeError(`Money cannot be constructed out of a value of type ${typeof param}`);\n  }\n\n  static isMoney(value: unknown): value is Money {\n    return isMoney(value);\n  }\n\n  static fromNumber(value: number): Money {\n    return new Money(String(value));\n  }\n\n  /** Adds numbers together\n  */\n  static add(left: MoneyParameter, ...right: MoneyParameter[]): Money {\n    let sum = Money.parseParameter(left);\n    for (const item of right)\n      sum = finmath.add(sum, Money.parseParameter(item));\n    return new Money(sum);\n  }\n\n  /** Subtracts a number from another number\n  */\n  static subtract(left: MoneyParameter, right: MoneyParameter): Money {\n    return new Money(finmath.subtract(Money.parseParameter(left), Money.parseParameter(right)));\n  }\n\n  /** Rounds a value to a multiple of a unit, with a specific rounding mode\n      @param amount - Value to round\n      @param roundto - The value will be rounded to a mulitple of this unit (except when rounding mode is 'none')\n      @param mode - Rounding mode. Possible values:<br>\n        <ul>\n          <li>none: No rounding</li>\n          <li>toward-zero: Round toward zero</li>\n          <li>down: Round toward negative infity</li>\n          <li>up: Round toward positive infity</li>\n          <li>half-toward-zero: Round nearest multiple, round half of a multiple toward zero</li>\n          <li>half-down: Round nearest multiple, round half of a multiple toward negative infinity</li>\n          <li>half-up: Round nearest multiple, round half of a multiple toward positive infity</li>\n        </ul>\n      @returns The rounded value\n  */\n  static roundToMultiple(amount: MoneyParameter, roundto: MoneyParameter, mode: MoneyRoundingMode): Money {\n    return new Money(finmath.roundToMultiple(Money.parseParameter(amount), Money.parseParameter(roundto), mode));\n  }\n\n  /** Compares two numbers\n      @param lhs - Left hand value\n      @param rhs - Right hand value\n      @returns Returns 0 if amount1 === amount2, -1 if amount1 \\< amount2, 1 if amount1 \\> amount2\n  */\n  static cmp(lhs: MoneyParameter, rhs: MoneyParameter): -1 | 0 | 1 {\n    return finmath.cmp(Money.parseParameter(lhs), Money.parseParameter(rhs));\n  }\n\n  /** Test whether two values have a specific relation\n      @param lhs - Left hand value\n      @param relation - One of '\\<', '\\<=', '==', '!=', '\\>', '\\>=''\n      @param rhs - Right hand value\n      @returns TRUE if the relation holds\n      @example\n        console.log(Money.check(1, '\\<', 2)); // prints 'true'\n  */\n  static check(lhs: MoneyParameter, relation: MoneyTestTypes, rhs: MoneyParameter): boolean {\n    return finmath.test(Money.parseParameter(lhs), relation, Money.parseParameter(rhs));\n  }\n\n  /** Multiplies two numbers together\n  */\n  static multiply(left: MoneyParameter, right: MoneyParameter): Money {\n    return new Money(finmath.multiply(Money.parseParameter(left), Money.parseParameter(right)));\n  }\n\n  /** Returns a percentage of an amount\n      @param amount - Original amount\n      @param percentage - Percentage of the amount to return\n      @returns Percentage of the amount\n  */\n  static getPercentage(amount: MoneyParameter, percentage: MoneyParameter): Money {\n    return new Money(finmath.getPercentageOfAmount(Money.parseParameter(amount), Money.parseParameter(percentage)));\n  }\n\n  /** Divides two values, (currently with up to 5 decimals of precision)\n      @param numerator - Value to divide\n      @param divisor - Divisor\n      @returns Divided value\n  */\n  static divide(numerator: MoneyParameter, divisor: MoneyParameter): Money {\n    return new Money(finmath.divide(Money.parseParameter(numerator), Money.parseParameter(divisor)));\n  }\n  /** Returns the minimum of all the arguments\n      @param amount - First value\n      @param amounts - Rest of the values\n      @returns The lowest value among amount and amounts\n  */\n  static min(amount: MoneyParameter, ...amounts: MoneyParameter[]): Money {\n    return new Money(finmath.min(Money.parseParameter(amount), ...(amounts.map(Money.parseParameter))));\n\n  }\n\n  /** Returns the maximum of all the arguments\n      @param amount - First value\n      @param amounts - Rest of the values\n      @returns The highest value among amount and amounts\n  */\n  static max(amount: MoneyParameter, ...amounts: MoneyParameter[]): Money {\n    return new Money(finmath.max(Money.parseParameter(amount), ...(amounts.map(Money.parseParameter))));\n  }\n\n  /** format a price amount. extend # of decimals to specified # if not enough */\n  format(format?: MoneyFormatOptions): string {\n    return toText(splitValue(this.value),\n      format?.decimalSeparator ?? \".\",\n      format?.minDecimals ?? 2,\n      format?.thousandsSeparator ?? \"\");\n  }\n\n  toJSON(): string {\n    return this.value;\n  }\n\n  toString(): string {\n    return this.value;\n  }\n\n  toNumber(): number {\n    return parseFloat(this.value);\n  }\n}\n","import { stdTypeOf } from \"./quacks.ts\";\nimport { Money } from \"./money.ts\";\n\nexport type WildcardTypes = \"?*\";\n\n/** Encode string for use in a regexp\n * @param text - Text to encode\n * @param options - Options for encoding\n * @param options.wildcards - Type of wildcards to encode (defaults to none)\n * @returns Encoded for safe use in a RegExp\n*/\nexport function escapeRegExp(text: string, options?: { wildcards?: WildcardTypes }): string {\n  let mask = text.replaceAll(/[/\\-\\\\^$*+?.()|[\\]{}]/g, '\\\\$&'); // $& means the whole matched string\n  if (options?.wildcards === \"?*\") {\n    mask = mask.replaceAll(\"\\\\*\", \".*\");\n    mask = mask.replaceAll(\"\\\\?\", \".\");\n  }\n  return mask;\n}\n\n/** Create a regular expression from one or more wildcard masks\n * @param masks - One or more masks with '?' and/or '*' wildcards\n * @returns Regular expression string\n*/\nexport function regExpFromWildcards(masks: string | string[], options?: { wildcards?: WildcardTypes; caseInsensitive?: boolean }): RegExp {\n  if (Array.isArray(masks) && masks.length === 0)\n    throw new Error(\"Empty mask list\");\n\n  const code = Array.isArray(masks)\n    ? `^(${masks.map(mask => escapeRegExp(mask, { wildcards: options?.wildcards || \"?*\" })).join('|')})$`\n    : `^${escapeRegExp(masks, { wildcards: options?.wildcards || \"?*\" })}$`;\n  return new RegExp(code, options?.caseInsensitive ? \"i\" : undefined);\n}\n\nfunction isHTMLUnrepresentableChar(curch: number) {\n  return (curch < 32 && curch !== 9 && curch !== 10 && curch !== 13)\n    || (curch >= 128 && curch <= 159);\n}\n\nfunction encodeEntities(str: string, html: boolean) {\n  let s = \"\";\n  for (const char of str) {\n    const curch = char.codePointAt(0);\n    if (curch === undefined || isHTMLUnrepresentableChar(curch))\n      continue;\n    if (curch >= 32 && curch < 128 && curch !== 38 && curch !== 60 && curch !== 62 && (html || curch !== 34 && curch !== 39)) {\n      s += String.fromCodePoint(curch);\n      continue;\n    }\n\n    switch (curch) {\n      case 10:\n        {\n          if (html) {\n            s += \"<br>\";\n            continue;\n          }\n          break;\n        }\n      case 13:\n        {\n          if (html)\n            continue;\n          break;\n        }\n      case 34:\n        {\n          s += \"&quot;\";\n          continue;\n        }\n      case 38:\n        {\n          s += \"&amp;\";\n          continue;\n        }\n      case 39:\n        {\n          s += \"&apos;\";\n          continue;\n        }\n      case 60:\n        {\n          s += \"&lt;\";\n          continue;\n        }\n      case 62:\n        {\n          s += \"&gt;\";\n          continue;\n        }\n    }\n\n    s += \"&#\" + curch + \";\";\n  }\n  return s;\n}\n\nfunction decodeEntities(str: string, html: boolean) {\n  if (html)\n    str = str.replace(/<br *\\/?>/g, \"\\n\");\n\n  str = str.replace(/&#(\\d+);/g, (_, dec) => String.fromCharCode(dec))\n    .replace(/&lt;/g, \"<\")\n    .replace(/&gt;/g, \">\")\n    .replace(/&quot;/g, '\"')\n    .replace(/&apos;/g, \"'\")\n    .replace(/&amp;/g, \"&\");\n\n  return str;\n}\n\nexport type StringEncodings = \"base64url\" | \"attribute\" | \"html\";\n\nexport function encodeString(str: string, encoding: StringEncodings): string {\n  if (encoding === \"base64url\")\n    return btoa(str).replaceAll(\"=\", \"\").replaceAll(\"+\", \"-\").replaceAll(\"/\", \"_\");\n  if (encoding === \"attribute\")\n    return encodeEntities(str, false);\n  if (encoding === \"html\")\n    return encodeEntities(str, true);\n\n  throw new Error(`Invalid encoding '${encoding}'`);\n}\n\nexport function decodeString(str: string, encoding: StringEncodings): string {\n  if (encoding === \"base64url\")\n    return atob(str.replaceAll(\"-\", \"+\").replaceAll(\"_\", \"/\"));\n  if (encoding === \"attribute\")\n    return decodeEntities(str, false);\n  if (encoding === \"html\")\n    return decodeEntities(str, true);\n\n  throw new Error(`Invalid encoding '${encoding}'`);\n}\n\ntype JSONReplacerArgument = ((this: unknown, key: string, value: unknown) => unknown) | undefined;\n\nexport interface StringifyOptions {\n  replacer?: JSONReplacerArgument;\n  space?: string | number;\n  stable?: boolean;\n  ///Encode with types (preserve Money, Date, BigInt). Needs std.parseTyped\n  typed?: boolean;\n  ///What to target: string (like JSON.stringify), script (escapes '/') or attribute (escapes '/' and applies attribute encoding)\n  target?: \"string\" | \"script\" | \"attribute\";\n}\n\n/** Improved JSON encoder\n * @param arg - Object to encode\n * @param options - Encoding options\n*/\nexport function stringify(arg: unknown, options?: StringifyOptions) {\n  const usereplacer: JSONReplacerArgument = options?.stable || options?.typed ? (function (this: unknown, key: string, value: unknown) {\n    if (options.typed) {\n      const origvalue = (this as Record<string, unknown>)[key]; //We can't use 'value' as .toJSON() will already have been invoked\n      const type = stdTypeOf(origvalue);\n      switch (type) {\n        case \"function\":\n          throw new Error(`Cannot stringify property '${key}' of type \"${type}'`);\n        case \"Date\":\n          value = { \"$stdType\": \"Date\", date: (origvalue as Date).toISOString() };\n          break;\n        case \"Money\":\n        case \"bigint\":\n        case \"Instant\":\n        case \"PlainDate\":\n        case \"PlainTime\":\n        case \"PlainDateTime\":\n        case \"ZonedDateTime\":\n          value = { \"$stdType\": type, [type.toLowerCase()]: (origvalue as { toString: () => string }).toString() };\n          break;\n        case \"object\":\n          if (\"$stdType\" in (origvalue as { \"$stdType\": string }))\n            throw new Error(`Cannot encode objects with already embedded '$stdType's`);\n        //fallthrough\n      }\n    }\n    if (options.stable && value && typeof value === \"object\" && !Array.isArray(value))\n      value = Object.fromEntries(Object.entries(value).sort((lhs, rhs) => lhs < rhs ? -1 : lhs === rhs ? 0 : 1));\n    if (options.replacer)\n      value = options.replacer.call(this, key, value);\n    return value;\n  }) : options?.replacer ?? undefined;\n\n  let result = JSON.stringify(arg, usereplacer, options?.space);\n  if (options?.target && [\"script\", \"attribute\"].includes(options.target)) {\n    result = result.replaceAll(\"/\", \"\\\\/\");\n    if (options.target === \"attribute\")\n      result = encodeEntities(result, false);\n  }\n  return result;\n}\n\n/** Decode JSON with types (Generated using stringify with typed:true ) */\nexport function parseTyped(input: string) {\n  return JSON.parse(input, (key, value) => {\n    switch (value?.[\"$stdType\"]) {\n      case \"Money\":\n        return new Money(value.money);\n      case \"Date\":\n        return new Date(value.date);\n      case \"bigint\":\n      case \"BigInt\": //pre wh5.7 spelling\n        return BigInt(value.bigint as string);\n      case \"Instant\":\n      case \"PlainDate\":\n      case \"PlainTime\":\n      case \"PlainDateTime\":\n      case \"ZonedDateTime\":\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any -- we just assume/require you to have Temporal installed if you expect to receive/decode Temporal types. browsers should catch up eventually\n        if (!(globalThis as any).Temporal)\n          throw new Error(`Temporal is not available in this environment, cannot deserialize value of type Temporal.${value[\"$stdType\"]}. Load eg. @webhare/deps/temporal-polyfill to use Temporal types in browsers`);\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any -- we just assume/require you to have Temporal installed if you expect to receive/decode Temporal types. browsers should catch up eventually\n        return (globalThis as any).Temporal[value[\"$stdType\"]].from(value[value[\"$stdType\"].toLowerCase()]);\n      case undefined:\n        return value;\n      default:\n        throw new Error(`Unrecognized type '${value[\"$stdType\"]}'`);\n    }\n  });\n}\n\n/** Generate a slug from a (suggested) (file)name\n * @param text - Text to convert\n * @param options - Options for slugification\n * @param options.separator - Separator to use between words (defaults to '-')\n * @param options.keep - Set of characters to keep in addition to a-z0-9\n * @returns Slugified text or null if we couldn't generate anything reeadable\n */\nexport function slugify(text: string, { separator = \"-\", keep = \"\" }: {\n  separator?: string;\n  keep?: string;\n} = {}): string | null {\n  //This function mixes HS getSafeName with a few more modern approaches\n  const keepclass = `[^a-z0-9${escapeRegExp(keep)}]`;\n  text = text\n    .normalize('NFD')                   // split an accented letter in the base letter and the acent\n    // eslint-disable-next-line no-control-regex\n    .replaceAll(/[\\u0000-\\u001F]/g, '')\n    .replaceAll(/[\\u0300-\\u036f]/g, '')   // remove all previously split accents\n    .replaceAll(/ß/g, 'ss')               // german ss\n    .toLowerCase()\n    .replace(new RegExp(`^${keepclass}+`), \"\") //replace bad characters at the start\n    .replace(new RegExp(`${keepclass}+$`), \"\") //.. and end\n    .replaceAll(new RegExp(`${keepclass}+`, \"g\"), separator); // replace all non alphanumeric/space with a single dash\n\n  return text || null; //we return 'null' on purpose so callers realize we won't necessarily give them a string!\n}\n\n/** Check if an email address is valid in modern times (an emailcheck much closer to what a browser would do, with additional sanity checks. No attempt to allow all legacy styles supported by the RFCs but 99.9%+ sure to be an error if seen submitted in a form\n    @returns True if the email address appears to be a well-formed email address to a non-greybeard\n*/\nexport function isValidEmail(email: string): boolean {\n  if (email.length > 254) //TODO count bytes instead of characters\n    return false;\n\n  return /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]{1,64}@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*(?:\\.[a-zA-Z0-9-]{2,})$/.test(email);\n}\n\n/** Uppercases a string using the C-locale (so only the ASCII characters a-z are uppercased)\n * @param str - String to uppercase\n * @returns Uppercased string\n */\nexport function toCLocaleUppercase(str: string) {\n  return str.replaceAll(/[a-z]+/g, part => part.toUpperCase());\n}\n\n/** Lowercases a string using the C-locale (so only the ASCII characters A-Z are lowercased)\n * @param str - String to lowercase\n * @returns Lowercased string\n */\nexport function toCLocaleLowercase(str: string) {\n  return str.replaceAll(/[A-Z]+/g, part => part.toLowerCase());\n}\n\n/** Calculate the levenshtein distance between two strings */\nexport function levenshteinDistance(a: string, b: string): number {\n  /* calculateLevenshteinDistance is adopted from https://github.com/gustf/js-levenshtein/blob/master/index.js, licensed MIT © Gustaf Andersson\n    Picked over fastest-levenshtein because a permanent 256KB memory area for a bit more speed doesn't seem worth it\n  */\n  function _min(d0: number, d1: number, d2: number, bx: number, ay: number) {\n    return d0 < d1 || d2 < d1\n      ? d0 > d2\n        ? d2 + 1\n        : d0 + 1\n      : bx === ay\n        ? d1\n        : d1 + 1;\n  }\n\n  if (a === b) {\n    return 0;\n  }\n\n  if (a.length > b.length) {\n    const tmp = a;\n    a = b;\n    b = tmp;\n  }\n\n  let la = a.length;\n  let lb = b.length;\n\n  while (la > 0 && (a.charCodeAt(la - 1) === b.charCodeAt(lb - 1))) {\n    la--;\n    lb--;\n  }\n\n  let offset = 0;\n\n  while (offset < la && (a.charCodeAt(offset) === b.charCodeAt(offset))) {\n    offset++;\n  }\n\n  la -= offset;\n  lb -= offset;\n\n  if (la === 0 || lb < 3) {\n    return lb;\n  }\n\n  let x = 0;\n  let y, d0, d1, d2, d3, dd = 0, dy, ay, bx0, bx1, bx2, bx3;\n\n  const vector: number[] = [];\n\n  for (y = 0; y < la; y++) {\n    vector.push(y + 1);\n    vector.push(a.charCodeAt(offset + y));\n  }\n\n  const len = vector.length - 1;\n\n  for (; x < lb - 3;) {\n    bx0 = b.charCodeAt(offset + (d0 = x));\n    bx1 = b.charCodeAt(offset + (d1 = x + 1));\n    bx2 = b.charCodeAt(offset + (d2 = x + 2));\n    bx3 = b.charCodeAt(offset + (d3 = x + 3));\n    dd = (x += 4);\n    for (y = 0; y < len; y += 2) {\n      dy = vector[y];\n      ay = vector[y + 1];\n      d0 = _min(dy, d0, d1, bx0, ay);\n      d1 = _min(d0, d1, d2, bx1, ay);\n      d2 = _min(d1, d2, d3, bx2, ay);\n      dd = _min(d2, d3, dd, bx3, ay);\n      vector[y] = dd;\n      d3 = d2;\n      d2 = d1;\n      d1 = d0;\n      d0 = dy;\n    }\n  }\n\n  for (; x < lb;) {\n    bx0 = b.charCodeAt(offset + (d0 = x));\n    dd = ++x;\n    for (y = 0; y < len; y += 2) {\n      dy = vector[y];\n      vector[y] = dd = _min(dy, d0, dd, bx0, vector[y + 1]);\n      d0 = dy;\n    }\n  }\n\n  return dd;\n}\n\n/** Return the length of the string in bytes when UTF-8 encoded */\nexport function getUTF8Length(str: string) {\n  return new TextEncoder().encode(str).length;\n}\n\n/** Truncate the string so it's at most len UTF-8 bytes long */\nexport function limitUTF8Length(str: string, len: number) {\n  // TextEncoder.encodeInto writes into the given array until there's no more room to add more valid UTF-8 sequences from the\n  // source. We can use this property to limit the number of bytes by creating an array that has room for at most the given\n  // number of bytes.\n  const utf8array = new Uint8Array(len);\n  // This function returns the actual number of bytes written to the array\n  const { written } = new TextEncoder().encodeInto(str, utf8array);\n  // Decode only the actually written bytes\n  return new TextDecoder().decode(utf8array.subarray(0, written));\n}\n\n/** Update the search parameters in a URL\n * @param inUrl - URL to update\n * @param updates - Updates to apply, use 'null' to delete a variable\n * @returns Updated URL\n */\nexport function updateURL(inUrl: string | URL, updates: Record<string, string | null>): URL {\n  const u = new URL(inUrl);\n  for (const [k, v] of Object.entries(updates)) {\n    if (v === null) {\n      u.searchParams.delete(k);\n    } else {\n      u.searchParams.set(k, v);\n    }\n  }\n  return u;\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any -- Cannot specify this without using any */\n\nexport interface EmplaceHandler<ValueType> {\n  insert?: () => ValueType;\n  update?: (current: ValueType) => ValueType;\n}\n\nfunction binarySearchImpl<A, K>(compareFn: (element: A, key: K) => number, contents: A[], searchfor: K, upper_bound: boolean): { present: boolean; index: number } {\n  let first = 0;\n  let len = contents.length;\n  let present = false;\n\n  const cmpbound = upper_bound ? 1 : 0;\n  let unsorted_cmp = 0; // if this is non-0 and cmp is this value, we have an unsorted list\n  while (len > 0) {\n    const half = Math.floor(len / 2);\n    const middle = first + half;\n    const cmp = compareFn(contents[middle], searchfor);\n    if (cmp === 0) {\n      present = true;\n      unsorted_cmp = upper_bound ? -1 : 1;\n    } else if (cmp === unsorted_cmp)\n      throw new Error(`The provided array was not properly sorted!`);\n\n    if (cmp < cmpbound) {\n      first = middle + 1;\n      len -= half;\n      --len;\n    } else {\n      len = half;\n    }\n  }\n  return { present, index: first };\n}\n\n//emplace is based on https://github.com/tc39/proposal-upsert (a Map.prototype.emplace)\n/** Place a value into a Map\n * @param map - The map to place the value into\n * @param key - The key to add/replace\n * @param handler - Callbacks for inserting or updating the value\n * @returns The value that was placed into the map.\n * @throws If the key is not found and no insert handler is provided\n */\nexport function emplace<T extends Map<any, any> | WeakMap<any, any>>(\n  map: T,\n  key: T extends Map<infer K, any> ? K : T extends WeakMap<infer K, any> ? K : never,\n  handler?: T extends Map<any, infer V> ? EmplaceHandler<V> : T extends WeakMap<any, infer V> ? EmplaceHandler<V> : never):\n  T extends Map<any, infer V> ? V : T extends WeakMap<any, infer V> ? V : never {\n  let current = map.get(key);\n  if (current !== undefined) {\n    if (handler?.update) {\n      current = handler.update(current);\n      map.set(key, current);\n    }\n    return current;\n  }\n\n  if (!handler?.insert)\n    throw new Error(\"Key not found and no insert handler provided\");\n\n  const setvalue = handler.insert();\n  map.set(key, setvalue);\n  return setvalue;\n}\n\n// the `| keyof X` is needed to be able to use a `keyof X` type as key parameter in DistributedPick or DistributedOmit in generics\nexport type DistributedKeys<X extends object> = (X extends object ? keyof X : never) | keyof X;\n\n/** Applies Pick to all types in a union. Allows all keys that are present in any object in the union. Warning: You might not be\n    able to use all keys of the union if TypeScript has narrowed the union to a specific type. Eg:\n```typescript\ntype A = { x: number; t: \"a\"; a: number } | { x: number; t: \"b\"; b: number };\nconst a: A = { t: \"a\", a: 1 };\nconst b = pick(a, [\"t\", \"a\", \"b\"]); // No overload matches this call. <snip> Type '\"b\"' is not assignable to type '\"a\" | \"t\" | \"d\"'.\n```\n    @typeParam T - Type of the supplied object\n    @typeParam K - Type of the property keys to return\n    @returns Type with only the specified keys (distributed over the union if present)\n*/\nexport type DistributedPick<X extends object, Y extends DistributedKeys<X>> = X extends object ? Pick<X, keyof X & Y> : never;\n\n/** Applies Omit to all types in a union. Allows all keys that are not present in any object in the union. Warning: You might not be\n    able to use all keys of the union if TypeScript has narrowed the union to a specific type. Eg:\n```typescript\ntype A = { x: number; t: \"a\"; a: number } | { x: number; t: \"b\"; b: number };\nconst a: A = { t: \"a\", a: 1 };\nconst b = omit(a, [\"b\"]); // No overload matches this call. <snip> Type '\"b\"' is not assignable to type '\"a\" | \"t\" | \"d\"'.\n```\n    @typeParam T - Type of the supplied object\n    @typeParam K - Type of the property keys to leave out\n    @returns Type with only the specified keys left out (distributed over the union if present)\n*/\nexport type DistributedOmit<X extends object, Y extends DistributedKeys<X>> = X extends object ? Omit<X, keyof X & Y> : never;\n\n/** Returns an object with a selection of properties\n    @typeParam T - Type of the supplied object\n    @typeParam K - Type of the property keys to return\n    @param obj - Object to pick properties out of\n    @param keys - Names of the properties to pick\n    @returns Resulting object\n*/\nexport function pick<T extends object, K extends string & NoInfer<DistributedKeys<T>>>(obj: T, keys: readonly K[]): DistributedPick<T, K>;\n\n/** Returns an array with a selection of properties\n    @typeParam T - Type of the supplied array\n    @typeParam K - Type of the property keys to return\n    @param arr - Array to pick properties out of\n    @param keys - Names of the properties to pick\n    @returns Resulting array\n*/\nexport function pick<T extends object, K extends string & NoInfer<DistributedKeys<T>>>(arr: T[], keys: readonly K[]): Array<DistributedPick<T, K>>;\n\nexport function pick<T extends object, K extends string & NoInfer<DistributedKeys<T>>>(value: T | T[], keys: readonly K[]): DistributedPick<T, K> | Array<DistributedPick<T, K>> {\n  if (Array.isArray(value))\n    return value.map((elt: T) => pick(elt, keys));\n  const ret = {} as T;\n  keys.forEach((key: K) => {\n    if (key in value)\n      ret[key] = value[key];\n  });\n  return ret as object as DistributedPick<T, K>;\n}\n\n/** Returns an object with a selection of properties left out\n    @typeParam T - Type of the supplied object\n    @typeParam K - Type of the property keys to leave out\n    @param obj - Object to leave properties out of\n    @param keys - Names of the properties to remove\n    @returns Resulting object\n*/\nexport function omit<T extends object, K extends string & NoInfer<DistributedKeys<T>>>(obj: T, keys: readonly K[]): DistributedOmit<T, K>;\n\n/** Returns an array with a selection of properties left out\n    @typeParam T - Type of the supplied array\n    @typeParam K - Type of the property keys to leave out\n    @param arr - Array to leave properties out of\n    @param keys - Names of the properties to leave out\n    @returns Resulting array\n*/\nexport function omit<T extends object, K extends string & NoInfer<DistributedKeys<T>>>(arr: T[], keys: readonly K[]): Array<DistributedOmit<T, K>>;\n\nexport function omit<T extends object, K extends string & NoInfer<DistributedKeys<T>>>(value: T | T[], keys: readonly K[]): DistributedOmit<T, K> | Array<DistributedOmit<T, K>> {\n  if (Array.isArray(value))\n    return value.map((elt: T) => omit(elt, keys));\n  const ret = {} as T;\n  for (const [key, val] of Object.entries(value)) {\n    if (!keys.includes(key as K))\n      ret[key as K] = val;\n  }\n  return ret as object as DistributedOmit<T, K>;\n}\n\n/** Shuffle an array in-place\n * @param array - Array to shuffle\n * @returns The shuffled array\n*/\nexport function shuffle<T>(array: T[]): T[] {\n  for (let i = array.length - 1; i > 0; i--) {\n    const j = Math.floor(Math.random() * (i + 1));\n    [array[i], array[j]] = [array[j], array[i]];\n  }\n  return array;\n}\n\n/** Returns (and TypeScript-asserts) that the specified function is truthy. Handy for adjusting the type of an array when\n * filtering out falsy values\n * @example\n * const myarray: Array&lt;number | null&gt; = [0, null];\n * const filtered: number[] = myarray.filter(isTruthy);\n **/\nexport function isTruthy<T>(a: T): a is (T & {}) {\n  return Boolean(a);\n}\n\n/** Append to array, without overflowing the stack (eg V8 overflows at more than 32K entries)\n * @param array - Array to append to\n * @param values - Values to append\n*/\nexport function appendToArray<T>(array: T[], values: ReadonlyArray<NoInfer<T>>): void {\n  if (values.length < 1000)\n    array.push(...values); //push should be safe enough\n  else for (const value of values) //performance wise this appears just as fast as tricks with pushing blocks of slices\n    array.push(value);\n\n  //not returning the original array to make it clear we're not creating a new one\n}\n\ntype TypedEntriesInternal<T extends object, K extends keyof T> = K extends keyof T ? [K, T[K]] : never;\n\n/** Returns a union of [ key, value ] types for an object */\nexport type TypedEntries<T extends object> = T extends object ? TypedEntriesInternal<T, keyof T & string> : never;\n\n/** Returns an array of key/values of the enumerable own properties of an object, with exact types. Use when\n * no extra properties are expected on the object. Exists because Object.entries returns always string as key type.\n * @param obj - Object that contains the properties and methods\n */\nexport function typedEntries<T extends object>(obj: T): Array<TypedEntries<T>> {\n  return Object.entries(obj) as Array<TypedEntries<T>>;\n}\n\n/** Returns an array of keys of the enumerable own properties of an object, with exact types. Use when\n * no extra properties are expected on the object. Exists because Object.keys returns always string as key type.\n * @param obj - Object that contains the properties and methods\n */\nexport function typedKeys<T extends object>(obj: T): Array<keyof T & string> {\n  return Object.keys(obj) as Array<keyof T & string>;\n}\n\n/** Given a union of [key, value] types, returns the object constructed from those pairs. Exists because\n *  Object.fromEntries does not take the type of the keys and values into account.\n * @typeParam T - Union of [key, value] pairs\n */\nexport type TypedFromEntries<T extends [string, unknown]> = { [C in T as C[0]]: C[1] };\n\n/** Returns an object from an iterable of [key, value] pairs, with exact types. Exists because Object.fromEntries\n * doesn't take the type of the keys and values into account.\n * @param entries - Iterable of [key, value] pairs\n * @returns An object with the same keys and values as the input\n */\nexport function typedFromEntries<T extends [string, unknown]>(entries: Iterable<T>): TypedFromEntries<T> {\n  return Object.fromEntries(entries) as TypedFromEntries<T>;\n}\n\n\nexport class SortedMultiSet<V> {\n  private contents: V[] = [];\n  private compareFn;\n\n  constructor(compareFn: (lhs: V, rhs: V) => number, contents?: V[]) {\n    this.compareFn = compareFn;\n    if (contents)\n      this.addMultiple(contents);\n  }\n\n  get size() {\n    return this.contents.length;\n  }\n\n  at(index: number): V | undefined {\n    return this.contents.at(index);\n  }\n\n  add(value: V): number {\n    const pos = this.upperBound(value);\n    this.contents.splice(pos, 0, value);\n    return pos;\n  }\n\n  addMultiple(values: V[]): void {\n    for (const value of values) {\n      this.add(value);\n    }\n  }\n\n  delete(key: V): void {\n    const [start, limit] = this.range(key);\n    this.contents.splice(start, limit - start);\n  }\n\n  clear() {\n    this.contents.splice(0, this.contents.length);\n  }\n\n  lowerBound(key: Readonly<V>): { present: boolean; index: number } {\n    return binarySearchImpl(this.compareFn, this.contents, key, false);\n  }\n\n  upperBound(key: Readonly<V>): number {\n    return binarySearchImpl(this.compareFn, this.contents, key, true).index;\n  }\n\n  range(key: Readonly<V>): [number, number] {\n    return [this.lowerBound(key).index, this.upperBound(key)];\n  }\n\n  slice(start: number, limit: number): V[] {\n    return this.contents.slice(start, limit);\n  }\n\n  *#sliceIterator(start: number, limit: number): Generator<V, void> {\n    for (let idx = start; idx < limit; ++idx)\n      yield this.contents[idx];\n  }\n\n  sliceRange(key: Readonly<V>): V[] {\n    const [start, limit] = this.range(key);\n    return this.slice(start, limit);\n  }\n\n  rangeIterator(key: Readonly<V>): Iterable<V> {\n    const [start, limit] = this.range(key);\n    return this.#sliceIterator(start, limit);\n  }\n}\n\nexport class SortedMultiMap<K, V> {\n  private compareFn;\n  private contents: Array<[K, V]> = [];\n\n  constructor(compareFn: (lhs: K, rhs: K) => number, contents?: Array<[K, V]>) {\n    this.compareFn = (element: [K, V], key: K) => compareFn(element[0], key);\n    if (contents)\n      this.addMultiple(contents);\n  }\n\n  get size() {\n    return this.contents.length;\n  }\n\n  at(index: number): [K, V] | undefined {\n    return this.contents.at(index);\n  }\n\n  add(key: K, value: V): number {\n    const pos = this.upperBound(key);\n    this.contents.splice(pos, 0, [key, value]);\n    return pos;\n  }\n\n  addMultiple(values: Array<[K, V]>) {\n    for (const [key, value] of values) {\n      this.add(key, value);\n    }\n  }\n\n  delete(key: K): void {\n    const [start, limit] = this.range(key);\n    this.contents.splice(start, limit - start);\n  }\n\n  clear() {\n    this.contents.splice(0, this.contents.length);\n  }\n\n  lowerBound(key: Readonly<K>): { present: boolean; index: number } {\n    return binarySearchImpl(this.compareFn, this.contents, key, false);\n  }\n\n  upperBound(key: Readonly<K>): number {\n    return binarySearchImpl(this.compareFn, this.contents, key, true).index;\n  }\n\n  range(key: Readonly<K>): [number, number] {\n    return [this.lowerBound(key).index, this.upperBound(key)];\n  }\n\n  slice(start: number, limit: number): Array<[K, V]> {\n    return this.contents.slice(start, limit);\n  }\n\n  *#sliceIterator(start: number, limit: number): Generator<[K, V], void> {\n    for (let idx = start; idx < limit; ++idx)\n      yield this.contents[idx];\n  }\n\n  sliceRange(key: Readonly<K>): Array<[K, V]> {\n    const [start, limit] = this.range(key);\n    return this.slice(start, limit);\n  }\n\n  rangeIterator(key: Readonly<K>): Iterable<[K, V]> {\n    const [start, limit] = this.range(key);\n    return this.#sliceIterator(start, limit);\n  }\n}\n","const unlock = Symbol(\"unlock\");\n\n/** A mutex which is only visible in the current JavaScript VM\n\n    @example\n```ts\nconst mutex = new LocalMutex;\n\nusing lock = await mutex.lock();\nlock.release();\n\n// If you'll be relying on automatic release\nusing lock = await mutex.lock();\nvoid(lock);\n```\n\n*/\nexport class LocalMutex {\n  private locked = false;\n  private unlockList = new Array<() => void>;\n\n  /** Lock this mutex\n   * @returns Lock object. Use with `using` to ensure automatic unlock\n   */\n  async lock() {\n    if (this.locked) {\n      const defer = Promise.withResolvers<void>();\n      this.unlockList.push(() => defer.resolve());\n      await defer.promise;\n    } else {\n      this.locked = true;\n    }\n    return new LocalLock(this);\n  }\n\n  [unlock](): void {\n    if (this.unlockList.length > 0)\n      (this.unlockList.shift()!)(); //we're fair... unlock longest waiter\n    else\n      this.locked = false;\n  }\n}\n\n/** Instance of a LocalMutex lock */\nclass LocalLock implements Disposable {\n  private mutex: LocalMutex | null;\n\n  constructor(mutex: LocalMutex) {\n    this.mutex = mutex;\n  }\n  /** Explicitly release the lock\n   * @throws Error if the lock is already released\n  */\n  release() {\n    if (!this.mutex)\n      throw new Error(\"Lock already released\");\n\n    this.mutex[unlock]();\n    this.mutex = null;\n  }\n  [Symbol.dispose]() {\n    this.mutex?.[unlock]();\n  }\n}\n\nexport type { LocalLock };\n","/* frontend-config parses the wh-config object in the browser and mocks any missing data. @webhare/env does not actually expose this config, @webhare/frontend does\n   The frontend configuration is built in PageBuildRequest's 'frontendConfig' member */\n\nimport type { DTAPStage } from \"@webhare/env/src/concepts\";\nimport { debugFlags, initEnv } from \"@webhare/env/src/envbackend\";\nimport { getBrowserDebugFlags } from \"@webhare/env/src/init-browser\";\nimport { getLang } from \"@webhare/dompack/src/tree\";\nimport type { FrontendDataTypes } from \"@webhare/frontend\";\nimport { omit } from \"@webhare/std\";\n\n\n/** The format of the <script id=\"wh-config\"> object  */\nexport type WHConfigScriptData = {\n  //NOTE: existing frontend code doesn't expect site/obj to ever be null. not sure if 'object' provides the best interface or whether we need some sort of 'unknown but an existing object'\n  /** Page (targetobject) specific settings\n   *  @deprecated Use setFrontendData for type-safe settings\n  */\n  obj: { [key: string]: unknown };\n  /** Site specific settings\n   *  @deprecated Use setFrontendData for type-safe settings\n   */\n  site: { [key: string]: unknown };\n\n  /** Numeric server version number (eg 5.02.24 = 50224)\n   *  @deprecated Interpreting numbers (or version strings) is dangerous. Feature flags/testing or limiting your entire module to compatible versions is safer\n  */\n  server: number;\n  /** Root URL of this site */\n  siteRoot: string;\n} & {\n  ///Plugins may add keys at this level\n  [key in keyof FrontendDataTypes]?: FrontendDataTypes[key];\n};\n\nexport type WHConfigScriptData_FromServer = WHConfigScriptData & { dtapStage: DTAPStage };\n\n//names fields can still have when not yet republished\nexport interface WHConfigScriptData_OldPublishFields {\n  islive: boolean;\n  dtapstage: DTAPStage;\n  siteroot: string;\n}\n\n//fallback names with deprecation warnings\nexport interface WHConfigScriptData_LegacyFields {\n  /** @deprecated Use dtapStage in WH5.4+ */\n  islive: boolean;\n  /** @deprecated Use `dtapStage` from \"\\@webhare/env\"; in WH5.4+ */\n  dtapstage: DTAPStage;\n  /** @deprecated Use `getSiteRoot` from \"\\@webhare/frontend\"; in WH5.7+ */\n  siteroot: string;\n}\n\nlet config: WHConfigScriptData_FromServer | undefined;\nlet siteroot;\nlet dtapStage: DTAPStage = \"production\";\n\n//if document is undefined, we're serverside or in a worker\nconst whconfigel = typeof document !== \"undefined\" ? document.querySelector('script#wh-config') : null;\nif (whconfigel?.textContent) {\n  const parsedConfig: WHConfigScriptData_FromServer & WHConfigScriptData_OldPublishFields = JSON.parse(whconfigel.textContent);\n  config = omit(parsedConfig, [\"siteroot\", \"dtapstage\", \"islive\"]);\n\n  //Fallbacks for pages last published with WH5.3 *and* pages published from HareScript which still emit lowercase props\n  siteroot = parsedConfig.siteRoot ?? parsedConfig.siteroot!;\n  dtapStage = parsedConfig.dtapStage ?? parsedConfig.dtapstage;\n}\n\ninitEnv(dtapStage, '/');\n\nif (typeof location !== \"undefined\")\n  for (const flag of getBrowserDebugFlags('wh-debug'))\n    debugFlags[flag] = true;\n\n\n/** @deprecated frontendConfig has been deprecated. Switch to the getFrontendData system */\n// Make sure we have obj/site as some sort of object, to prevent crashes on naive 'if ($wh.config.obj.x)' tests'\nexport const frontendConfig: WHConfigScriptData & WHConfigScriptData_LegacyFields = {\n  server: 0,\n  ...config,\n  obj: config?.obj || {},\n  site: config?.site || {},\n  siteRoot: siteroot || \"\",\n  dtapstage: dtapStage,\n  islive: dtapStage === \"production\" || dtapStage === \"acceptance\",\n  siteroot: siteroot || \"\",\n};\n\nif (typeof document !== \"undefined\") {\n  //@ts-expect-error -- locale isn't supposed to exist - but some old code is still referring to it\n  frontendConfig.locale = getLang().tag;\n}\n\nif (dtapStage === \"development\") { //WH6.0: it's time to hard phase-out the old fields\n  for (const prop of [\"islive\", \"dtapstage\", \"siteroot\", \"locale\"] as const)\n    Object.defineProperty(frontendConfig, prop, {\n      get() { throw new Error(`frontendConfig.${prop} will be removed`); }\n    });\n}\n\n//NOTE: These APIs need to live in init.ts so eg gtm.ts can access us without triggering a CSS reset through frontend.ts. When frontend.ts stops auto-resetting we might move it back\n\nexport function getFrontendData<Type extends keyof FrontendDataTypes>(type: Type, options: { allowMissing: true }): FrontendDataTypes[Type] | null;\nexport function getFrontendData<Type extends keyof FrontendDataTypes>(type: Type, options?: { allowMissing: boolean }): FrontendDataTypes[Type];\n\n/** Get data exported by the response\n * @typeParam Type - The type of data to get\n * @param dataObject - The data object of data to get\n * @param allowMissing - If true, return null if the data object is missing. Otherwise throw an error\n * @example\n```\n  declare module \"@webhare/frontend\" {\n    interface FrontendDataTypes {\n      \"mymodule:type\": {\n        test: number;\n      };\n    }\n  }\n\n  const data = getFrontendData(\"mymodule:type\");\n```\n*/\nexport function getFrontendData<Type extends keyof FrontendDataTypes>(dataObject: Type, { allowMissing = false } = {}): FrontendDataTypes[Type] | null {\n  const retval = config?.[dataObject] as FrontendDataTypes[Type];\n  if (!retval)\n    if (allowMissing)\n      return null;\n    else\n      throw new Error(`Missing frontend data object: ${dataObject}`);\n\n  return retval;\n}\n\n/** Get the current site root\n *\n * @returns The site root URL (ending with a slash)\n*/\nexport function getSiteRoot() { //now an API to improve treeshaking\n  return frontendConfig.siteRoot;\n}\n","// Set up dispose symbols - https://github.com/evanw/esbuild/pull/3192 \"you'll need to polyfill Symbol.dispose if it's not present before you use it.\n\n//@ts-expect-error -- It's marked readonly\nSymbol.dispose ||= Symbol.for('Symbol.dispose');\n//@ts-expect-error -- It's marked readonly\nSymbol.asyncDispose ||= Symbol.for('Symbol.asyncDispose');\n\n// Set up promise resolvers (ES2024)\nPromise.withResolvers ||= function <T>(): PromiseWithResolvers<T> {\n  let resolve: (value: T | PromiseLike<T>) => void;\n  let reject: (reason: Error) => void;\n  const promise = new Promise<T>((_resolve, _reject) => { resolve = _resolve; reject = _reject; });\n  // @ts-expect-error `resolve` and `reject` are assigned synchronously, which isn't picked up by the TypeScript compiler (see\n  // https://github.com/Microsoft/TypeScript/issues/30053)\n  return { promise, resolve, reject };\n};\n\n// Polyfills for https://caniuse.com/?search=groupby - needed until we can assume safari 17.4 as global baseline\nif (!Map.groupBy)\n  Map.groupBy = function <Item, Key>(items: Iterable<Item>, callbackfn: (item: Item, idx: number) => Key): Map<Key, Item[]> {\n    const retval = new Map<Key, Item[]>;\n    let idx = 0;\n    for (const item of items) {\n      const key = callbackfn(item, idx++);\n      let list = retval.get(key);\n      if (!list)\n        retval.set(key, list = []);\n      list.push(item);\n    }\n    return retval;\n  };\n\nif (!Object.groupBy)\n  Object.groupBy = function <Item, Key extends string | number | symbol>(items: Iterable<Item>, callbackfn: (item: Item, idx: number) => Key): Partial<Record<Key, Item[]>> {\n    return Object.fromEntries(Map.groupBy(items, callbackfn).entries()) as Partial<Record<Key, Item[]>>;\n  };\n","/* eslint-disable @typescript-eslint/no-loop-func */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-this-alias */\n\n/* Iterator polyfills (https://caniuse.com/?search=iterator) - stage 4 ES but not in all browsers yet\n   Based on https://github.com/alkihis/iterator-polyfill/tree/master but we removed all the AsyncIterator\n   stuff as that's still stage 2 AND not implemented in TypeScript (as of 5.6)\n\n   We're ignoring a few linting/any issues as we really don't care to maintain this much\n   Fixed an issue with .some - reported as https://github.com/alkihis/iterator-polyfill/issues/6\n*/\n\n(function () {\n  // polyfill already applied / proposal implemented\n  if ('Iterator' in globalThis) {\n    return;\n  }\n\n  // Polyfill for Iterator\n  const IteratorPrototype = {};\n\n  const ArrayIteratorPrototype = Object.getPrototypeOf([][Symbol.iterator]());\n  const OriginalIteratorPrototype = Object.getPrototypeOf(ArrayIteratorPrototype);\n\n  Object.setPrototypeOf(OriginalIteratorPrototype, IteratorPrototype);\n\n  Object.defineProperties(IteratorPrototype, {\n    [Symbol.iterator]: {\n      value() {\n        return this;\n      }\n    },\n    map: {\n      *value<T, R>(callback: (value: T) => R): Generator<any, any, any> {\n        const it = this;\n        let value = it.next();\n\n        while (!value.done) {\n          const real_value = callback(value.value);\n          const next_value = yield real_value;\n          value = it.next(next_value);\n        }\n\n        return value.value;\n      },\n    },\n    filter: {\n      *value<T>(callback: (value: T) => boolean): Generator<any, any, any> {\n        const it = this;\n        let value = it.next();\n        let next_value;\n\n        while (!value.done) {\n          const real_value = value.value;\n          if (callback(real_value)) {\n            next_value = yield real_value;\n            value = it.next(next_value);\n          } else {\n            value = it.next(next_value);\n          }\n        }\n\n        return value.value;\n      },\n    },\n    find: {\n      value<T>(callback: (value: boolean) => T) {\n        const it = this;\n        let value = it.next();\n\n        while (!value.done) {\n          const real_value = value.value;\n\n          if (callback(real_value))\n            return real_value;\n\n          value = it.next();\n        }\n      }\n    },\n    every: {\n      value<T>(callback: (value: T) => boolean) {\n        const it = this;\n        let value = it.next();\n\n        while (!value.done) {\n          const real_value = value.value;\n\n          if (!callback(real_value))\n            return false;\n\n          value = it.next();\n        }\n\n        return true;\n      }\n    },\n    some: {\n      value<T>(callback: (value: T) => boolean) {\n        const it = this;\n        let value = it.next();\n\n        while (!value.done) {\n          const real_value = value.value;\n\n          if (callback(real_value)) {\n            it.return();\n            return true;\n          }\n\n          value = it.next();\n        }\n\n        return false;\n      }\n    },\n    toArray: {\n      value(max_count = Infinity) {\n        const values = [];\n\n        const it = this;\n        let value = it.next();\n\n        while (!value.done) {\n          const real_value = value.value;\n\n          if (max_count <= 0)\n            return values;\n\n          values.push(real_value);\n\n          if (max_count !== Infinity)\n            max_count--;\n\n          value = it.next();\n        }\n\n        return values;\n      }\n    },\n    take: {\n      *value(limit: number): Generator<any, any, any> {\n        limit = Number(limit);\n        if (limit < 0)\n          throw new RangeError('Invalid limit.');\n\n        const it = this;\n        let value = it.next();\n        let remaining = limit;\n        let next_value;\n\n        while (!value.done) {\n          const real_value = value.value;\n\n          if (remaining <= 0)\n            return;\n\n          next_value = yield real_value;\n          value = it.next(next_value);\n          remaining--;\n        }\n\n        return value.value;\n      },\n    },\n    drop: {\n      *value(limit: number): Generator<any, any, any> {\n        limit = Number(limit);\n        if (limit < 0)\n          throw new RangeError('Invalid limit.');\n\n        const it = this;\n        let value = it.next();\n        let remaining = limit;\n        let next_value;\n\n        while (!value.done) {\n          const real_value = value.value;\n\n          if (remaining > 0) {\n            value = it.next(next_value);\n            remaining--;\n            continue;\n          }\n\n          next_value = yield real_value;\n          value = it.next(next_value);\n        }\n\n        return value.value;\n      },\n    },\n    asIndexedPairs: {\n      *value(): Generator<any, any, any> {\n        const it = this;\n        let value = it.next();\n        let index = 0;\n\n        while (!value.done) {\n          const real_value = value.value;\n          const next_value = yield [index, real_value];\n          value = it.next(next_value);\n          index++;\n        }\n\n        return value.value;\n      }\n    },\n    flatMap: {\n      *value<T, R extends object>(mapper: (value: T) => IterableIterator<R> | R): Generator<any, any, any> {\n        if (typeof mapper !== 'function') {\n          throw new TypeError('Mapper must be a function.');\n        }\n\n        const it = this;\n        let value = it.next();\n        let next_value;\n\n        while (!value.done) {\n          const real_value = value.value;\n          const mapped = mapper(real_value);\n\n          if (Symbol.iterator in mapped) {\n            next_value = yield* mapped[Symbol.iterator]();\n          } else {\n            next_value = yield mapped;\n          }\n\n          value = it.next(next_value);\n        }\n\n        return value.value;\n      },\n    },\n    reduce: {\n      value<T, V>(reducer: (acc: V, value: T) => V, initial_value?: V) {\n        let acc = initial_value;\n\n        const it = this;\n        if (acc === undefined) {\n          acc = it.next().value;\n        }\n\n        let value = it.next();\n        while (!value.done) {\n          const real_value = value.value;\n\n          acc = reducer(acc!, real_value);\n\n          value = it.next();\n        }\n\n        return acc;\n      }\n    },\n    forEach: {\n      value<T>(callback: (value: T) => any) {\n        const it = this;\n        let value = it.next();\n\n        while (!value.done) {\n          const real_value = value.value;\n\n          callback(real_value);\n\n          value = it.next();\n        }\n      }\n    },\n    [Symbol.toStringTag]: {\n      value: 'IteratorPrototype'\n    },\n\n    /* OUTSIDE PROPOSAL */\n    count: {\n      value() {\n        let count = 0;\n\n        const it = this;\n        let value = it.next();\n\n        while (!value.done) {\n          count++;\n          value = it.next();\n        }\n\n        return count;\n      },\n    },\n    join: {\n      value(string: string) {\n        let final = '';\n        let first = true;\n\n        const it = this;\n        let value = it.next();\n\n        while (!value.done) {\n          const real_value = value.value;\n\n          if (first) {\n            first = false;\n            final += real_value;\n          } else {\n            final += string + real_value;\n          }\n\n          value = it.next();\n        }\n\n        return final;\n      }\n    },\n    chain: {\n      *value<I>(...iterables: IterableIterator<I>[]) {\n        yield* this;\n\n        for (const it of iterables) {\n          yield* it;\n        }\n      }\n    },\n    zip: {\n      *value<T, O>(...others: IterableIterator<O>[]): Iterator<(T | O)[]> {\n        const it_array = [this, ...others].map((e: any) => Symbol.iterator in e ? e[Symbol.iterator]() : e as Iterator<T | O>);\n        let values = it_array.map(e => e.next());\n        let next_value: any;\n\n        while (values.every(e => !e.done)) {\n          next_value = yield values.map(e => e.value);\n          values = it_array.map(e => e.next(next_value));\n        }\n      },\n    },\n    takeWhile: {\n      *value<T>(callback: (value: T) => boolean): Generator<any, any, any> {\n        const it = this;\n        let value = it.next();\n        let next_value;\n\n        while (!value.done) {\n          const real_value = value.value;\n\n          if (callback(real_value))\n            next_value = yield real_value;\n          else\n            return;\n\n          value = it.next(next_value);\n        }\n\n        return value.value;\n      }\n    },\n    dropWhile: {\n      *value<T>(callback: (value: T) => boolean): Generator<any, any, any> {\n        const it = this;\n        let value = it.next();\n        let next_value;\n        let finished = false;\n\n        while (!value.done) {\n          const real_value = value.value;\n\n          if (!finished && callback(real_value)) {\n            value = it.next(next_value);\n            continue;\n          }\n\n          finished = true;\n          next_value = yield real_value;\n\n          value = it.next(next_value);\n        }\n\n        return value.value;\n      }\n    },\n    fuse: {\n      *value(): Generator<any, any, any> {\n        const it = this;\n        let value = it.next();\n        let next_value;\n\n        while (!value.done) {\n          const real_value = value.value;\n\n          if (real_value !== undefined && real_value !== null)\n            next_value = yield real_value;\n          else\n            return;\n\n          value = it.next(next_value);\n        }\n\n        return value.value;\n      }\n    },\n    partition: {\n      value<T>(callback: (value: T) => boolean) {\n        const partition1 = [], partition2 = [];\n\n        const it = this;\n        let value = it.next();\n\n        while (!value.done) {\n          const real_value = value.value;\n\n          if (callback(real_value))\n            partition1.push(real_value);\n          else\n            partition2.push(real_value);\n\n          value = it.next();\n        }\n\n        return [partition1, partition2];\n      },\n    },\n    findIndex: {\n      value<T>(callback: (value: T) => boolean) {\n        const it = this;\n        let i = 0;\n        let value = it.next();\n\n        while (!value.done) {\n          const real_value = value.value;\n\n          if (callback(real_value))\n            return i;\n\n          value = it.next();\n          i++;\n        }\n\n        return -1;\n      }\n    },\n    max: {\n      value() {\n        let max = -Infinity;\n\n        const it = this;\n        let value = it.next();\n\n        while (!value.done) {\n          const real_value = value.value;\n\n          if (max < real_value)\n            max = real_value;\n\n          value = it.next();\n        }\n\n        return max;\n      },\n    },\n    min: {\n      value() {\n        let min = Infinity;\n\n        const it = this;\n        let value = it.next();\n\n        while (!value.done) {\n          const real_value = value.value;\n\n          if (min > real_value)\n            min = real_value;\n\n          value = it.next();\n        }\n\n        return min;\n      },\n    },\n    cycle: {\n      *value(): Generator<any, any, any> {\n        const values = [];\n\n        const it = this;\n        let value = it.next();\n\n        while (!value.done) {\n          const real_value = value.value;\n          values.push(real_value);\n\n          const next_value = yield real_value;\n          value = it.next(next_value);\n        }\n\n        while (true) {\n          yield* values;\n        }\n      },\n    },\n  });\n\n  //iterator.from from https://github.com/rauschma/iterator-helpers-polyfill/\n\n  function isObject(value: unknown) {\n    if (value === null) return false;\n    const t = typeof value;\n    return t === 'object' || t === 'function';\n  }\n\n  function GetIteratorFlattenable<T>(obj: Record<symbol, any>): T {\n    if (!isObject(obj)) {\n      throw new TypeError();\n    }\n    const method = obj[Symbol.iterator];\n    let iterator = undefined;\n    if (typeof method !== 'function') {\n      iterator = obj;\n    } else {\n      iterator = method.call(obj);\n    }\n    if (!isObject(iterator)) {\n      throw new TypeError();\n    }\n    return iterator;\n  }\n\n  if (!('Iterator' in globalThis)) {\n    const Iterator = function Iterator() { };\n\n    Iterator.prototype = IteratorPrototype;\n\n    // @ts-expect-error We're still missing From in this poyfill\n    (globalThis).Iterator = Iterator;\n  }\n\n\n  //----- Static method -----\n  // Must be done after Iterator.prototype was set up,\n  // so that `extends Iterator` works below\n\n  class WrappedIterator<T, TReturn = any, TNext = undefined> extends Iterator<T, TReturn, TNext> {\n    #iterator;\n    constructor(iterator: Iterator<T, TReturn, TNext>) {\n      super();\n      this.#iterator = iterator;\n    }\n    override next(...args: [] | [TNext]): any {\n      return this.#iterator.next(...args);\n    }\n    // `async` helps with line (*)\n    override return(value?: TReturn | PromiseLike<TReturn>): any {\n      const returnMethod = this.#iterator.return;\n      if (returnMethod === undefined) {\n        return { done: true, value: value as any }; // (*)\n      }\n      return returnMethod.call(this.#iterator);\n    }\n  }\n\n  function Iterator_from<T>(value: any) {\n    const iterator = GetIteratorFlattenable<Iterator<T>>(value);\n    if (iterator instanceof Iterator) {\n      return iterator;\n    }\n    // `iterator´ does not support the new API – wrap it so that it does\n    return new WrappedIterator(iterator);\n  }\n\n  Object.defineProperty(\n    Iterator, 'from',\n    {\n      writable: true,\n      enumerable: false,\n      configurable: true,\n      value: Iterator_from,\n    }\n  );\n})();\n","type FormValueList = Array<{ name: string; value: string }>;\n\n/** A navigation instruction encapsulates the next step that a client has to take in eg. a login, payment or wizard flow.\n * Use navigateTo to execute a navigation in a browser\n*/\n\nexport type NavigateInstruction =\n  {\n    type: \"redirect\";\n    url: string;\n  } | {\n    type: \"form\";\n    form: {\n      action: string;\n      vars: FormValueList;\n      method?: \"POST\";\n    };\n  } | {\n    type: \"reload\";\n  } | {\n    type: \"postmessage\";\n    message: unknown;\n    target?: \"parent\" | \"opener\";\n  } | {\n    type: \"close\";\n  };\n\nfunction submitForm(action: string, values: FormValueList, method = \"POST\") {\n  const form = document.createElement(\"form\");\n  form.method = method;\n  form.action = action;\n  form.append(...values.map(item => {\n    const input = document.createElement(\"input\");\n    input.type = \"hidden\";\n    input.name = item.name;\n    input.value = item.value;\n    return input;\n  }));\n  document.body.appendChild(form);\n  form.submit();\n}\n\n/** Navigate to a specific URL (may be hookable by other scripts)\n* @param navigation - Target URL or NavigateInstruction\n*/\nexport function navigateTo(navigation: string | NavigateInstruction) {\n  if (typeof window === \"undefined\")\n    throw new Error(`navigateTo() is not available in this environment`);\n\n  if (typeof navigation === \"string\")\n    navigation = { type: \"redirect\", url: navigation };\n\n  switch (navigation.type) {\n    case \"redirect\":\n      {\n        location.href = navigation.url;\n      } break;\n\n    case \"form\":\n      {\n        submitForm(navigation.form.action, navigation.form.vars, navigation.form.method);\n      } break;\n\n    case \"reload\":\n      {\n        window.location.reload();\n      } break;\n\n    case \"postmessage\":\n      {\n        if (!navigation.target || navigation.target === \"parent\")\n          window.parent.postMessage(navigation.message, \"*\");\n        else if (navigation.target === \"opener\") {\n          window.opener.postMessage(navigation.message, \"*\");\n          window.close();\n        } else\n          throw Error(\"Unknown postmessage target '\" + navigation.target + \"' received\");\n      } break;\n\n    case \"close\":\n      {\n        window.close();\n      } break;\n\n    default:\n      throw new Error(`Unknown navigation type '${(navigation as { type: string }).type}'`);\n  }\n}\n","/* Manages the $wh global, an API for just-in-time debugging */\nimport type { DebugRegistry } from \"@webhare/env\";\nimport { debugFlags } from \"./envbackend\";\n\nlet debugRegFinalizer: FinalizationRegistry<{ type: keyof DebugRegistry; key: string }> | undefined;\n\nexport type WHGlobal = DebugRegistry & {\n  debugFlags: typeof debugFlags;\n  /** Global counter to avoid HMRs from duplicating IDs */\n  nextId: number;\n};\n\ndeclare global {\n  var $wh: WHGlobal;\n}\n\nglobalThis.$wh = {\n  debugFlags,\n  nextId: 1\n} satisfies WHGlobal;\n\nexport function addToDebugRegistry<T extends keyof DebugRegistry>(type: T, key: string, value: NonNullable<ReturnType<NonNullable<DebugRegistry[T]>[string][\"deref\"]>>) {\n  const debugRegistry = globalThis.$wh as unknown as DebugRegistry;\n  //@ts-ignore prevents '>   Type '{}' is not assignable to type 'never'. in jssdk builds, probably because noone yet extends DebugRegistry there\n  debugRegistry[type] ||= {};\n  debugRegFinalizer ||= new FinalizationRegistry(({ type: t, key: k }) => {\n    delete debugRegistry![t]?.[k];\n  });\n\n  if (debugRegistry[type][key])\n    console.error(`Debug registry key ${key} already exists, overwriting it`);\n\n  (debugRegistry[type] as Record<string, unknown>)[key] = new WeakRef(value);\n  debugRegFinalizer.register(value, { type, key });\n}\n","import type { FormControlElement } from \"@webhare/dompack\";\n\nexport const CustomEvent = globalThis.CustomEvent;\n/** Wrap an event to ensure it's target is a HTMLElement\n * @typeParam EventType - The expected event type\n * @typeParam CurrentTargetType - The type of the elemnt you're binding the event to. Optional, defaults to HTMLElement\n * @typeParam RelatedTargetType - The type of the elemnt you're binding the event to. Optional, defaults to HTMLElement\n*/\nexport type DocEvent<EventType extends Event, CurrentTargetType extends HTMLElement = HTMLElement, RelatedTargetType extends HTMLElement = HTMLElement> = EventType & {\n  target: HTMLElement;\n  currentTarget: CurrentTargetType;\n  relatedTarget: RelatedTargetType | null;\n};\n\nexport type DomEventOptions =\n  {\n    bubbles?: boolean;\n    cancelable?: boolean;\n    relatedTarget?: EventTarget;\n    detail?: object;\n  };\n\nexport function dispatchDomEvent(element: EventTarget, eventtype: string, options?: DomEventOptions) {\n  //see here https://developer.mozilla.org/en-US/docs/Web/Events whether an event is bubbles/cancelabel\n  options = {\n    bubbles: [\n      \"input\", \"change\", \"click\", \"contextmenu\", \"dblclick\",\n      \"reset\", \"submit\"\n    ].includes(eventtype),\n    cancelable: [\n      \"animationstart\", \"animationcancel\", \"animationend\", \"animationiteration\",\n      \"beforeunload\",\n      \"click\", \"contextmenu\", \"dblclick\",\n      \"reset\", \"submit\",\n      \"transitionstart\", \"transitioncancel\", \"transitionend\", \"transitionrun\"\n    ].includes(eventtype),\n    ...options\n  };\n\n  if (!element || !(element as Node).ownerDocument)\n    return true; //the element has left the dom... so there's no more bubbling. just drop it\n\n  //FIXME the load/scroll is buggy and we should be probably be using new Event (but an earlier attempt at that triggered quite a few test failures)\n  const createtype = /*[\"load\",\"scroll\"].includes(eventtype) === \"load\" ? \"UIEvents\" :*/[\"focus\", \"blur\", \"focusin\", \"focusout\"].includes(eventtype) ? \"FocusEvent\" : eventtype === \"click\" ? \"MouseEvents\" : \"HTMLEvents\";\n  //we verified its non-null ness above but TS doesn't really understand that\n  const evt = (element as Node).ownerDocument!.createEvent(createtype);\n  evt.initEvent(eventtype, options.bubbles, options.cancelable);\n  if (options.detail)\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any -- we should just rewrite to new Event\n    (evt as any).detail = options.detail;\n  if (options.relatedTarget) //its a readonly prop, so redefine it\n    Object.defineProperty(evt, 'relatedTarget', { value: options.relatedTarget, writable: false });\n\n  //TODO: Should we keep this code?\n  // @ts-expect-error IScroll is a custom Window property set by IScroll\n  if (eventtype === 'click' && window.IScroll)\n    // @ts-expect-error _constructed is a custom Event property used by IScroll\n    evt._constructed = true; //ensure IScroll doesn't blindly cancel our synthetic clicks\n\n  return element.dispatchEvent(evt);\n}\n\n/** Fire the proper modified events (input and/or change) on the element after changing its value\n * @param element - Element to receive event\n * @param options - Event options\n * @deprecated Use changeValue so we can figure out the proper events to fire\n */\nexport function fireModifiedEvents(element: FormControlElement, options?: DomEventOptions) {\n  dispatchDomEvent(element, 'input', options);\n  dispatchDomEvent(element, 'change', options);\n}\n\n//manually fire 'onchange' events. needed for event simulation - DEPRECATED\n/**\n * @param element - Element to receive event\n * @param type - Event type\n * @param options - Event options\n * @deprecated Use dispatchDomEvent instead\n */\nexport function fireHTMLEvent(element: EventTarget, type: string, options?: DomEventOptions) {\n  return dispatchDomEvent(element, type, options);\n}\n\ntype CustomEventParams =\n  {\n    /** Whether this event should bubble up in the DOM */\n    bubbles: boolean;\n    /** Whether this event can be cancelled */\n    cancelable: boolean;\n    /** Custom event information */\n    detail?: unknown;\n    /** Handler to execute if the default isn't prevented by a event listener */\n    defaulthandler?: (evt: CustomEvent) => void;\n  };\n\n/** Fire a custom event\n    @param node - node to fire the event on\n    @param event - event type. You should add this event to the GlobalEventHandlersEventMap for validation in dispatchCustomEvent calls and addEventListener callbacks.\n    @param params - Event options\n    @returns true if the default wasn't prevented\n */\n\nexport function dispatchCustomEvent<K extends string>(\n  node: EventTarget,\n  event: K,\n  params: CustomEventParams & (K extends keyof GlobalEventHandlersEventMap ?\n    GlobalEventHandlersEventMap[K] extends CustomEvent ?\n    { detail: GlobalEventHandlersEventMap[K][\"detail\"] } : unknown : unknown)) {\n\n  if (!params)\n    throw new Error(`Missing dispatchCustomEvent params`);\n  ['bubbles', 'cancelable'].forEach(prop => {\n    if (!(prop in params))\n      throw new Error(`Missing '${prop}' in dispatchCustomEvent params`);\n  });\n\n  const evt = new CustomEvent(event, {\n    bubbles: params.bubbles,\n    cancelable: params.cancelable,\n    detail: params.detail\n  });\n  let defaultaction = true;\n  try {\n    if (!node.dispatchEvent(evt))\n      defaultaction = false; //defaultPrevented is unreliable on IE11, so double check\n  } finally {\n    if (!evt.defaultPrevented && params.defaulthandler && defaultaction) {\n      params.defaulthandler(evt);\n    }\n  }\n  return defaultaction && !evt.defaultPrevented;\n}\n\n/**\n     Change the value of a form element, and fire the correct events as if it were a user change\n *\n    @param element - Element to change\n    @param newvalue - New value\n */\nexport function changeValue(element: FormControlElement, newvalue: string | number | boolean) {\n  if (element.matches(`input[type=radio], input[type=checkbox]`)) {\n    if (Boolean((element as HTMLInputElement).checked) === Boolean(newvalue))\n      return;\n    (element as HTMLInputElement).checked = Boolean(newvalue);\n  } else {\n    //FIXME it's not really clean to assume that this element is changeable - throw for non input/select..\n    const asString = String(newvalue);\n    if ((element as HTMLInputElement).value === asString)\n      return;\n\n    (element as HTMLInputElement).value = String(newvalue);\n  }\n  dispatchDomEvent(element as EventTarget, 'input');\n  dispatchDomEvent(element as EventTarget, 'change');\n}\n\nlet keydata: { mapping: { [key: string]: string } };\n\nfunction initKeyMapping() {\n  keydata =\n  {\n    // Mapping from keyIdentifier/key to key. If not found, translate U+XXXX to the unicode char and return that.\n\n    // List of all current key mappings (and current inconsistencies\n    // at https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key/Key_Values\n    mapping:\n    {\n      \"Del\": \"Delete\", // IE/edge use 'Del' instead of 'Delete'\n      \"Esc\": \"Escape\", // IE/edge use 'Esc' instead of 'Escape'\n      \"OS\": \"Meta\", // Meta key is called OS on IE 9 and Firefox (tested v50)\n      \"Win\": \"Meta\", // Meta key is called Win on IE/Edge\n      \"Scroll\": \"ScrollLock\", // More IE/Edge, from tests\n      \"PrintScreen\": \"Print\", // More IE/Edge, from tests\n      \"MozHomeScreen\": \"GoHome\", // Prior to Firefox 37, the Home button generated a key code of \"Exit\". Starting in Firefox 37, the button generates the key code \"MozHomeScreen\".\n\n      // Internet Explorer 9 and Firefox 36 and earlier return \"Left\", \"Right\", \"Up\", and \"Down\" for the arrow keys, instead of \"ArrowLeft\", \"ArrowRight\", \"ArrowUp\", and \"ArrowDown\".\n      \"Left\": \"ArrowLeft\",\n      \"Right\": \"ArrowRight\",\n      \"Up\": \"ArrowUp\",\n      \"Down\": \"ArrowDown\",\n      // More IE and old Firefox stuff\n      \"Crsel\": \"CrSel\",\n      \"Exsel\": \"ExSel\",\n      \"Nonconvert\": \"NonConvert\",\n      // Internet Explorer 9 and Firefox 36 and earlier report \"Apps\" instead of \"ContextMenu\" for the context menu key.\n      \"Apps\": \"ContextMenu\",\n      // Internet Explorer 9 and Firefox 36 and earlier use \"MediaNextTrack\" and \"MediaPreviousTrack\" instead of \"MediaTrackNext\" and \"MediaTrackPrevious\".\n      \"MediaNextTrack\": \"MediaTrackNext\",\n      \"MediaPreviousTrack\": \"MediaTrackPrevious\",\n      // In Internet Explorer 9, and prior to Firefox 49, \"AudioVolumeUp\", \"AudioVolumeDown\", and \"AudioVolumeMute\" were \"VolumeUp\", \"VolumeDown\", and \"VolumeMute\".\n      // In Firefox 49 they were updated to match the latest specification. The old names are still used on Boot to Gecko.\n      \"VolumeUp\": \"AudioVolumeUp\",\n      \"VolumeDown\": \"AudioVolumeDown\",\n      \"VolumeMute\": \"AudioVolumeMute\",\n      // Firefox added proper support for the \"TV\" key in Firefox 37; before that, this key generated the key code \"Live\".\n      \"Live\": \"TV\",\n      // Internet Explorer 9 and Firefox 36 and earlier identify the zoom toggle button as \"Zoom\". Firefox 37 corrects this to \"ZoomToggle\".\n      \"Zoom\": \"ZoomToggle\",\n      // Internet Explorer 9 and Firefox 36 and earlier use \"SelectMedia\" instead of \"LaunchMediaPlayer\". Firefox 37 through Firefox 48 use \"MediaSelect\". Firefox 49 has been updated to match the latest specification, and to return \"LaunchMediaPlayer\".\n      \"SelectMedia\": \"LaunchMediaPlayer\",\n      \"MediaSelect\": \"LaunchMediaPlayer\",\n      // Google Chrome returns \"LaunchCalculator\" instead of \"LaunchApplication1\". See Chromium bug 612743 for more information.\n      // Google Chrome returns \"LaunchMyComputer\" instead of \"LaunchApplication2\". See Chromium bug 612743 for more information.\n      // (LaunchCalculator and LaunchMyComputer are valid too, so no translation)\n\n      // While older browsers used words like \"Add\", \"Decimal\", \"Multiply\", and so forth modern browsers identify these using the actual character (\"+\", \".\", \"*\", and so forth).\n      \"Multiply\": \"*\",\n      \"Add\": \"+\",\n      \"Divide\": \"/\",\n      \"Subtract\": \"-\",\n      \"Decimal\": \".\", // (mozilla Key_Values doc says depends on region)\n      \"Separator\": \".\", // (mozilla Key_Values doc says depends on region)\n\n      // keyIdenfier spec mapping of non-printable keys: https://www.w3.org/TR/2009/WD-DOM-Level-3-Events-20090908/#keyset-keyidentifiers\n      // Used in safari\n      \"U+0008\": \"Backspace\",\n      \"U+0009\": \"Tab\",\n      \"U+000D\": \"Enter\",\n      \"U+0018\": \"Cancel\",\n      \"U+001B\": \"Escape\",\n      \"U+007F\": \"Delete\",\n      \"U+0300\": \"DeadGrave\",\n      \"U+0301\": \"DeadEacute\",\n      \"U+0302\": \"DeadCircumflex\",\n      \"U+0303\": \"DeadTilde\",\n      \"U+0304\": \"DeadMacron\",\n      \"U+0306\": \"DeadBreve\",\n      \"U+0307\": \"DeadAboveDot\",\n      \"U+0308\": \"DeadUmlaut\",\n      \"U+030A\": \"DeadAboveRing\",\n      \"U+030B\": \"DeadDoubleacute\",\n      \"U+030C\": \"DeadCaron\",\n      \"U+0327\": \"DeadCedilla\",\n      \"U+0328\": \"DeadOgonek\",\n      \"U+0345\": \"DeadIota\",\n      \"U+3099\": \"DeadVoicedSound\",\n      \"U+309A\": \"DeadSemivoicedSound\",\n\n      // keyIdenfier spec mapping to characters: https://www.w3.org/TR/2009/WD-DOM-Level-3-Events-20090908/#keyset-keyidentifiers\n      \"Exclamation\": \"!\",\n      \"DoubleQuote\": \"\\\"\",\n      \"Hash\": \"#\",\n      \"Dollar\": \"$\",\n      \"Ampersand\": \"&\",\n      \"LeftParen\": \"(\",\n      \"RightParen\": \")\",\n      \"Asterisk\": \"*\",\n      \"Plus\": \"+\",\n      \"Percent\": \"%\",\n      \"Comma\": \",\",\n      \"HyphenMinus\": \"-\",\n      \"Period\": \".\",\n      \"Solidus\": \"/\",\n      \"Colon\": \":\",\n      \"Semicolon\": \";\",\n      \"LessThan\": \"<\",\n      \"Equals\": \"=\",\n      \"GreaterThan\": \">\",\n      \"QuestionMark\": \"?\",\n      \"At\": \"@\",\n      \"LeftSquareBracket\": \"[\",\n      \"Backslash\": \"\\\\\",\n      \"RightSquareBracket\": \"]\",\n      \"Circumflex\": \"^\",\n      \"Underscore\": \"_\",\n      \"Grave\": \"`\",\n      \"LeftCurlyBracket\": \"{\",\n      \"Pipe\": \"|\",\n      \"RightCurlyBracket\": \"}\",\n      \"Euro\": \"€\",\n      \"InvertedExclamation\": \"¡\",\n\n      // Safari fixes: viewed in local tests\n      \"U+0010\": \"ContextMenu\"\n    }\n  };\n}\n\nexport type NormalizedKeyboardEvent =\n  {\n    type: string;\n    target: EventTarget | null;\n    key: string;\n    code: string;\n    ctrlKey: boolean;\n    altKey: boolean;\n    location: number;\n    shiftKey: boolean;\n    metaKey: boolean;\n    repeat: boolean;\n    isComposing: boolean;\n  };\n\n/**\n     Returns normalized keyboard event properties, following the current W3C UI Events spec\n *\n    @param evt - Keyboard event\n    @returns Normalized keyboard event data\n */\nexport function normalizeKeyboardEventData(evt: KeyboardEvent): NormalizedKeyboardEvent {\n  // event.key is supported from chrome:51, edge, ff: 29, ie: 9, not in safari\n  // event.keyIdentifier in chrome 26-54, opera 15-41, safara: 5.1\n  // safari doesn't provide either in keypress events, use U+evt.keyCode (uppercase 4-byte hex)\n\n  let key = evt.key;\n  if (!keydata)\n    initKeyMapping();\n  if (keydata.mapping[key])\n    key = keydata.mapping[key];\n  else if (key.startsWith(\"U+\")) // U+xxxx code\n    key = String.fromCodePoint(parseInt(key.substring(2), 16));\n\n  // Seen in chrome 56.0.2924.76 on linux, numpad '.' without numlock returns key \"\\u0000\"\n  if (evt.key === \"\\u0000\" && evt.code === \"NumpadDecimal\")\n    key = \".\";\n\n  return (\n    {\n      type: evt.type,\n      target: evt.target,\n      key: key,\n      code: evt.code || \"Unidentified\",\n      ctrlKey: evt.ctrlKey,\n      altKey: evt.altKey,\n      location: evt.location,\n      shiftKey: evt.shiftKey,\n      metaKey: evt.metaKey,\n      repeat: evt.repeat,\n      isComposing: evt.isComposing\n    });\n}\n\n/**\n * Stop, fully, an event\n *\n * @param event - Event to stop\n */\nexport function stop(event: Event) {\n  event.preventDefault();\n  event.stopImmediatePropagation();\n}\n\n/** Add an event listener to HTMLElements inside a document (which allows us to ensure that 'target' is a HTMLElement for easier typings) */\nexport function addDocEventListener<CurrentTargetType extends HTMLElement, Type extends keyof HTMLElementEventMap>(node: CurrentTargetType, type: Type, listener: (this: CurrentTargetType, ev: DocEvent<HTMLElementEventMap[Type], CurrentTargetType>) => void | Promise<void>, options?: AddEventListenerOptions): void;\nexport function addDocEventListener<CurrentTargetType extends HTMLElement>(node: CurrentTargetType, type: string, listener: (this: CurrentTargetType, evt: DocEvent<Event, CurrentTargetType>) => void | Promise<void>, options?: AddEventListenerOptions): void;\n\nexport function addDocEventListener<CurrentTargetType extends HTMLElement>(node: CurrentTargetType, type: string, listener: (this: CurrentTargetType, evt: DocEvent<Event, CurrentTargetType>) => void | Promise<void>, options?: AddEventListenerOptions): void {\n  node.addEventListener(type, listener as EventListener, options);\n}\n","import { debugFlags } from '@webhare/env';\nimport * as domevents from '../../../modules/system/js/dompack/src/events';\nimport \"@webhare/tsrun/src/polyfills\";\n\nlet locallocks: BusyLock[] = [];\nlet modallocked = false;\nlet uiwatcher: NodeJS.Timeout | null = null;\nlet installedanticancelhandler = false;\n\nlet currentbusymodaldialog: HTMLDialogElement | null = null;\nlet currentbusymodaluserdialog: HTMLDialogElement | null = null;\nlet busymodalcontent: string | HTMLElement | HTMLDialogElement | undefined;\nlet mylockmgr: LockManager | undefined;\n\nexport type BusyModalEvent = CustomEvent<{ show: boolean }>;\n\n// As 'Lock' already exists on the Web (https://developer.mozilla.org/docs/Web/API/Lock) and it's seldom used just use a longer name. Available since WH 5.4\nexport interface UIBusyLock extends Disposable {\n  release(): void;\n  [Symbol.dispose](): void;\n}\n\ndeclare global {\n  interface GlobalEventHandlersEventMap {\n    \"dompack:busymodal\": BusyModalEvent;\n  }\n  interface Window {\n    __dompack_busylockmanager?: LockManager;\n  }\n\n  // __dompack_busylockmanager: LockManager | undefined;  //\n}\n\nfunction getLockmgr(): LockManager {\n  if (!mylockmgr) {\n    mylockmgr = getParentLockManager() || new LockManager;\n    if (typeof window !== \"undefined\")\n      window.__dompack_busylockmanager = mylockmgr;\n  }\n  return mylockmgr;\n}\n\nfunction anyModalLocks() {\n  return locallocks.some(l => l.modal);\n}\n\n/* scheduleCheckUIFree is invoked by release() or when waitUIFree is explicitly called. the call from release() should\n   be a 'fast' path. We schedule a full check for the next tick if there's a chance it might actually find a free UI */\nfunction scheduleCheckUIFree() {\n  if (!uiwatcher && locallocks.length === 0)\n    uiwatcher = setTimeout(() => checkUIFree(), 0);\n}\n\n/* check if the UI is actually free. if so, remove busymodals and resolve waitUIFrees for the benefit of testfw  */\nfunction checkUIFree() {\n  uiwatcher = null;\n\n  if (modallocked && !anyModalLocks()) { //did the last frame-level *modal* lock just get released?\n    modallocked = false;\n    toggleBusyModal(false);\n  }\n\n  if (locallocks.length === 0) {\n    const lockmgr = getLockmgr();\n    lockmgr.busyframes.delete(window); //we won't release our block in the lockmanager until we've had a chance to remove our modal layer\n    lockmgr.checkUIFree(); //to resolve any waitUIFrees. runs in the top-level frame. note that lockmgr cares about ALL ui locks, not just modals\n  }\n}\n\nfunction isDialogElement(el: unknown): boolean {\n  return typeof el === \"object\" && (el as HTMLElement).matches?.(\"dialog\") || false;\n}\n\nfunction checkCancelEvent(evt: Event) {\n  if (modallocked)\n    evt.preventDefault();\n}\n\nfunction toggleBusyModal(show: boolean) {\n  //'islock' is legacy non-camel version. TypeScript typing should help us transition (since 5.3). 'as' shuts up the warning TODO remove 'islock' and the 'as'\n  if (!domevents.dispatchCustomEvent(window, 'dompack:busymodal', { bubbles: true, cancelable: true, detail: { show: show, islock: show } as BusyModalEvent['detail'] }))\n    return; //cancelled!\n\n  if (!installedanticancelhandler) {\n    //capture cancel, as it doesn't bubble up\n    addEventListener(\"cancel\", evt => checkCancelEvent(evt), { capture: true });\n    installedanticancelhandler = true;\n  }\n\n  if (show) {\n    if (isDialogElement(busymodalcontent)) { //the user provided us with an element\n      currentbusymodaluserdialog = busymodalcontent as HTMLDialogElement;\n      currentbusymodaluserdialog.showModal();\n    } else if (busymodalcontent) { //we'll create our own dialog\n      const dialog = document.createElement('dialog');\n      const toembed = typeof busymodalcontent === \"string\" ? document.createTextNode(busymodalcontent) : busymodalcontent.cloneNode(true);\n      dialog.className = \"dompack-busydialog\";\n      dialog.role = \"status\";\n      dialog.ariaLive = \"off\";\n      dialog.append(toembed);\n      document.body.appendChild(dialog);\n      currentbusymodaldialog = dialog;\n      dialog.showModal();\n      return;\n    }\n\n    document.documentElement.classList.add(\"dompack--busymodal\");\n    return;\n  }\n\n  //hiding\n  document.documentElement.classList.remove(\"dompack--busymodal\");\n  if (currentbusymodaluserdialog)\n    currentbusymodaluserdialog.close();\n  if (currentbusymodaldialog) { //we added a dialog to the dom\n    currentbusymodaldialog.close();\n    document.body.removeChild(currentbusymodaldialog);\n    currentbusymodaldialog = null;\n  }\n}\n\nclass LockManager {\n  locks: BusyLock[];\n  busyframes: Set<Window> = new Set;\n  busycounter: number;\n  deferreduipromise: PromiseWithResolvers<boolean> | null;\n\n  //this object is not for external consumption\n  constructor() {\n    this.locks = [];\n    this.busycounter = 0;\n    this.deferreduipromise = null;\n  }\n  add(lock: BusyLock) {\n    this.locks.push(lock);\n    const returnvalue = this.busycounter++;\n    return returnvalue;\n  }\n  release(lock: BusyLock) {\n    const pos = this.locks.indexOf(lock);\n    if (pos === -1) {\n      if (debugFlags.bus) {\n        console.error(\"Duplicate release of busy lock #\" + lock.locknum);\n        console.log(\"Lock allocated:\");\n        console.log(lock.acquirestack);\n        console.log(\"Lock first released:\");\n        console.log(lock.releasestack);\n      }\n      throw new Error(\"Duplicate release of busy lock\");\n    }\n\n    this.locks.splice(pos, 1);\n  }\n  getNumLocks() {\n    return this.locks.length;\n  }\n  //used by child windows to schedule a check in *our* frame (eg before they themselves are unloaded)\n  scheduleCheckUIFree() {\n    scheduleCheckUIFree();\n  }\n  checkUIFree() {\n    if (this.locks.length === 0 && this.busyframes.size === 0 && this.deferreduipromise) {\n      this.deferreduipromise.resolve(true);\n      this.deferreduipromise = null;\n    }\n  }\n  waitUIFree() {\n    if (!this.deferreduipromise)\n      this.deferreduipromise = Promise.withResolvers();\n\n    scheduleCheckUIFree(); //ensures uiwait is released at next tick if no locks are present at all\n    return this.deferreduipromise.promise;\n  }\n  logLocks() {\n    this.locks.forEach(lock => console.log('[bus] lock #' + lock.locknum, lock.acquirestack, lock));\n    console.log(\"[bus] total \" + this.locks.length + \" locks\");\n  }\n  getLockIds() {\n    return this.locks.map(l => \"#\" + l.locknum).join(\", \");\n  }\n}\n\n/** Configure an (accessible) modal dialog\n * @param bmc - What to show in the dialog: either a text or DOM fragment to clone.\n *              If a <dialog> element is passed, this dialog will be used instead of creating a new one.\n */\nexport function setupBusyModal(bmc: NonNullable<typeof busymodalcontent>) {\n  busymodalcontent = bmc;\n}\n\ninterface LockOptions {\n  ///Whether this lock should enable a modality laayer\n  modal?: boolean;\n}\n\nclass BusyLock implements UIBusyLock {\n  modal: boolean;\n  locknum: number;\n  acquirestack: string | undefined;\n  releasestack: string | undefined;\n\n  constructor(options?: LockOptions) {\n    //legacy non-camel name is 'ismodal'\n    this.modal = options?.modal ?? (options as { ismodal?: boolean })?.ismodal ?? false;\n\n    const lockmgr = getLockmgr();\n    this.locknum = lockmgr.add(this);\n    lockmgr.busyframes.add(window);\n    locallocks.push(this);\n\n    if (this.modal && !modallocked) {\n      modallocked = true;\n      toggleBusyModal(true);\n    }\n\n    if (debugFlags.bus) {\n      this.acquirestack = (new Error).stack;\n      console.trace('[bus] Busy lock #' + this.locknum + ' taken. ' + lockmgr.getNumLocks() + \" locks active now: \" + lockmgr.getLockIds());\n    }\n  }\n\n  [Symbol.dispose]() {\n    if (debugFlags.bus)\n      this.releasestack = (new Error).stack;\n\n    const lockmgr = getLockmgr();\n    lockmgr.release(this);\n    const lockpos = locallocks.indexOf(this);\n    locallocks.splice(lockpos, 1);\n\n    if (debugFlags.bus) {\n      console.trace('[bus] Busy lock #' + this.locknum + ' released. ' + lockmgr.getNumLocks() + \" locks active now: \" + lockmgr.getLockIds());\n    }\n\n    scheduleCheckUIFree();\n  }\n\n  release() {\n    this[Symbol.dispose]();\n  }\n}\n\n/** Return a promise resolving as soon as the UI (any accessible frame) is free for at least one tick */\nexport function waitUIFree() {\n  return getLockmgr().waitUIFree();\n}\n\n/**\n     flag userinterface as busy. tests then know not to interact with the UI until the busy flag is released\n *\n    @param options - Options.<br>\n                   - modal: true/false - Whether the lock is a modal lock\n */\nexport function flagUIBusy(options?: LockOptions): UIBusyLock {\n  return new BusyLock(options);\n}\n\nexport function getUIBusyCounter() {\n  return getLockmgr().busycounter;\n}\n\nfunction getParentLockManager(): LockManager | null {\n  try { //we're accessing a parent window, so we may hit security exceptions\n    if (!(window.parent?.__dompack_busylockmanager))\n      return null;\n\n    //if we connected to a parent...  deregister our locks, eg. if parent navigated our frame away\n    window.addEventListener(\"pagehide\", () => {\n      if (debugFlags.bus)\n        console.log(\"[bus] Frame unloading, \" + locallocks.length + \" locks pending.\", locallocks.map(l => \"#\" + l.locknum).join(\", \"), locallocks);\n\n      //switch to local instance in case anyone still tries to touch these locks during unload\n      const lockmgr = getLockmgr();\n      const locallockmgr = new LockManager;\n      locallocks.forEach(lock => { lockmgr.release(lock); locallockmgr.add(lock); });\n      locallocks = [];\n\n      lockmgr.busyframes.delete(window); //explicitly remove us so we won't be waited upon\n      lockmgr.scheduleCheckUIFree();\n      mylockmgr = locallockmgr;\n    });\n\n    return window.parent.__dompack_busylockmanager;\n  } catch (e) {\n    return null;\n  }\n}\n","\n/* Regex to identify dimensionless style sttributes. copied from old version of preact/src/constants.js (MIT)\n   meant to capture:\n  { boxFlex:1, boxFlexGroup:1, columnCount:1, fillOpacity:1, flex:1, flexGrow:1,\n    flexPositive:1, flexShrink:1, flexNegative:1, fontWeight:1, lineClamp:1, lineHeight:1,\n    opacity:1, order:1, orphans:1, strokeOpacity:1, widows:1, zIndex:1, zoom:1\n*/\nconst IS_NON_DIMENSIONAL = /acit|ex(?:s|g|n|p|$)|rph|ows|mnc|ntw|ine[ch]|zoo|^ord/i;\n\nexport { qS, qSA } from '@webhare/dompack/src/tree.ts';\n\nfunction generateInsertList(nodes: Array<string | Node>) {\n  if (nodes.length === 1)\n    return typeof nodes[0] === 'string' ? document.createTextNode(nodes[0]) : nodes[0];\n\n  const frag = document.createDocumentFragment();\n  nodes.forEach(node => frag.appendChild(typeof node === 'string' ? document.createTextNode(node) : node));\n  return frag;\n}\n\n/** @deprecated Use node.matches() */\nexport function matches(node: Element, selector: string): boolean {\n  //only invoke 'matches' if it exists. it *should* but past versions of dompack.matches would check for it too (and thus not fail if you passed in a string instead of a Node)\n  return node.matches?.(selector);\n}\n/** @deprecated Use node.closest() */\nexport function closest(node: Element, selector: string) {\n  if (node.closest)\n    return node.closest(selector);\n  //TODO: Warn about out-of-date browser?\n  let testNode: Element | null = node;\n  for (; testNode && !matches(testNode, selector); testNode = testNode.parentElement)\n    /*iterate*/;\n  return testNode;\n}\n//implements contains. TODO we only really need this on IE11, which doesn't consider a text node a child, we can probably fall back to native elsewhere ?\n/** @deprecated Use node.contains() */\nexport function contains(ancestor: Node, child: Node) {\n  if (ancestor.contains)\n    return ancestor.contains(child);\n  //TODO: Warn about out-of-date browser?\n  for (let testNode: Node | null = child; testNode; testNode = testNode.parentNode)\n    if (testNode === ancestor)\n      return true;\n  return false;\n}\n//insert a range of nodes before a node: https://dom.spec.whatwg.org/#dom-childnode-before\n/** @deprecated Use node.before() */\nexport function before(node: ChildNode, ...nodes: Array<string | Node>) {\n  if (node.before) {\n    node.before(...nodes);\n    return;\n  }\n  //TODO: Warn about out-of-date browser?\n  if (node.parentNode)\n    node.parentNode.insertBefore(generateInsertList(nodes), node);\n}\n//insert a range of nodes after a node: https://dom.spec.whatwg.org/#dom-childnode-after\n/** @deprecated Use node.after() */\nexport function after(node: ChildNode, ...nodes: Array<string | Node>) {\n  if (node.after) {\n    node.after(...nodes);\n    return;\n  }\n  //TODO: Warn about out-of-date browser?\n  if (node.parentNode)\n    node.parentNode.insertBefore(generateInsertList(nodes), node.nextSibling);\n}\n//replace node with a set of nodes : https://dom.spec.whatwg.org/#dom-childnode-replacewith\n/** @deprecated Use node.replaceWith() */\nexport function replaceWith(node: ChildNode, ...nodes: Array<string | Node>) {\n  if (node.replaceWith) {\n    node.replaceWith(...nodes);\n    return;\n  }\n  //TODO: Warn about out-of-date browser?\n  if (node.parentNode)\n    node.parentNode.replaceChild(generateInsertList(nodes), node);\n}\n//remove node with a set of nodes : https://dom.spec.whatwg.org/#dom-childnode-remove\n/** @deprecated Use node.remove() */\nexport function remove(node: ChildNode) {\n  if (node.remove) {\n    node.remove();\n    return;\n  }\n  //TODO: Warn about out-of-date browser?\n  if (node.parentNode)\n    node.parentNode.removeChild(node);\n}\n//insert nodes at start: https://dom.spec.whatwg.org/#dom-parentnode-prepend\n/** @deprecated Use node.prepend() */\nexport function prepend(node: ParentNode, ...nodes: Array<string | Node>) {\n  if (node.prepend) {\n    node.prepend(...nodes);\n    return;\n  }\n  //TODO: Warn about out-of-date browser?\n  node.insertBefore(generateInsertList(nodes), node.firstChild);\n}\n//insert nodes at end: https://dom.spec.whatwg.org/#dom-parentnode-append\n/** @deprecated Use node.append() */\nexport function append(node: ParentNode, ...nodes: Array<string | Node>) {\n  if (node.append) {\n    node.append(...nodes);\n    return;\n  }\n  //TODO: Warn about out-of-date browser?\n  node.appendChild(generateInsertList(nodes));\n}\n\n/**\n * Toggle a single class\n *\n * @param node - Node to modify\n * @param classname - Class to toggle\n * @param settoggle - true to enable, false to disable, undefined to toggle\n * @deprecated Just use classList.toggle on the node itself\n */\n/** @deprecated Use classList.toggle() */\nexport function toggleClass(node: Element, classname: string, settoggle?: boolean) {\n  if (arguments.length === 2) //in old dompack, 2 argument version toggled and 3 argument version toggled off. match that behavior\n    node.classList.toggle(classname);\n  else\n    node.classList.toggle(classname, settoggle);\n}\n\n/**\n     Toggle classes in a node\n *\n    @param node - Node which classes to toggle\n    @param toggles - Object, all keys will be added/removed based on the truthyness of their values\n */\nexport function toggleClasses(node: Element, toggles: { [key: string]: boolean }) {\n  if (typeof (toggles) !== \"object\")\n    throw new Error(\"Expected an object with keys as classnames\");\n  Object.keys(toggles).forEach(key => node.classList[toggles[key] ? \"add\" : \"remove\"](key));\n}\n\n/* remove the contents of an existing node */\n/** @deprecated Use node.replaceChildren() */\nexport function empty(node: Element) {\n  if (node.replaceChildren) {\n    node.replaceChildren();\n    return;\n  }\n  //TODO: Warn about out-of-date browser?\n  while (node.lastChild)\n    node.removeChild(node.lastChild);\n}\n\nexport function isDomReady() {\n  //ensure no domready events can run if there will never be a dom\n  return typeof document !== \"undefined\" && (document.readyState === \"interactive\" || document.readyState === \"complete\");\n}\n\n/* run the specified function 'on ready'. adds to DOMContentLoaded if dom is not ready yet. Exceptions/rejections from the ready handler will not be fatal to the rest of code execution */\nexport function onDomReady(callback: () => unknown | Promise<unknown>) {\n  if (isDomReady()) {\n    try {\n      void callback(); //Ignore unhandled rejections\n    } catch (e) { // We don't want our caller to 'stop' due to a domready exception as its usually the toplevel initialization code, so log the exception ourselves\n      void Promise.reject(new Error(\"Synchronous onDomReady handler failed\", { cause: e })); //Let it propagate as a standard unhandled rejection\n    }\n  } else\n    document.addEventListener(\"DOMContentLoaded\", () => void callback());\n}\n\n//parse JSON data, throw with more info on parse failure\nexport function getJSONAttribute<T>(node: Element, attributename: string): T | null {\n  try {\n    if (node.hasAttribute(attributename))\n      return JSON.parse(node.getAttribute(attributename) as string);\n  } catch (e) {\n    console.error(\"JSON parse failure on attribute '\" + attributename + \"' of node\", node);\n    throw e;\n  }\n  return null;\n}\n\n/**\n     Get the base URI of the current document. IE11 doesn't implement document.baseURI\n *\n    @param doc - Document to query. Defaults to window.document\n    @deprecated Use document.baseURI\n */\nexport function getBaseURI(doc: Document | undefined) {\n  if (!doc)\n    doc = window.document;\n  if (doc.baseURI)\n    return doc.baseURI;\n\n  const base = doc.querySelector('base');\n  if (base && base.href)\n    return base.href;\n  return doc.URL;\n}\n\n/**\n     Sets multiple styles on a node, automatically adding 'px' to numbers when appropriate\n    (can be used as replacement for Mootools .setStyles)\n *\n * @param node - Node to update\n * @param value - Styles to set\n */\nexport function setStyles(node: HTMLElement, value?: string | { [key: string]: string | number }) {\n  if (!value)\n    node.style.cssText = '';\n  else if (typeof value === 'string')\n    node.style.cssText = value || '';\n  else {\n    for (const [key, propvalue] of Object.entries(value)) {\n      // for numbers, add 'px' if the constant isn't dimensionless (eg zIndex)\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any -- we don't know which keys will be set\n      (node.style as any)[key] = typeof value[key] === 'number' && IS_NON_DIMENSIONAL.test(key) === false\n        ? propvalue + 'px'\n        : propvalue;\n    }\n  }\n}\n","import * as domtree from './tree';\nimport * as domevents from './events';\n\nexport type TakeFocusEvent = CustomEvent<{ options?: FocusOptions }>;\n\ndeclare global {\n  interface GlobalEventHandlersEventMap {\n    \"dompack:takefocus\": TakeFocusEvent;\n  }\n}\n\ntype RegistrationHandler<E extends Element = HTMLElement> = (node: E, index?: number) => void;\ntype ComponentRegistration<E extends Element = HTMLElement> =\n  {\n    selector: string;\n    handler: RegistrationHandler<E>;\n    index: number;\n    num: number;\n    afterdomready: boolean;\n  };\n\nconst components: Array<ComponentRegistration<Element>> = [];\nconst map = new WeakMap();\n\n//is a node completely in the dom? if we can find a sibling anywhere, it must be closed\nfunction isNodeCompletelyInDom(node: Element | null) {\n  for (; node; node = node.parentElement)\n    if (node.nextSibling)\n      return true;\n  return false;\n}\nfunction processRegistration<E extends Element>(item: E, reg: ComponentRegistration<E>, domready: boolean) {\n  if (!domready && !isNodeCompletelyInDom(item))\n    return; //not safe to register\n\n  if (!map.has(item))\n    map.set(item, [reg.num]);\n  else {\n    const list = map.get(item);\n    if (list.includes(reg.num))\n      return;\n    list.push(reg.num);\n  }\n  reg.handler(item, reg.index++); //note: if an exception is reported from Object.handler,\n}\nfunction applyRegistration<E extends Element>(reg: ComponentRegistration<E>, startnode?: Element) {\n  const domready = domtree.isDomReady();\n  if (reg.afterdomready && !domready)\n    return;\n\n  const items = Array.from((startnode || document).querySelectorAll(reg.selector)) as E[];\n  if (startnode?.matches(reg.selector))\n    items.unshift(startnode as E); //if startnode matches it has to be an E\n\n  items.forEach(item => {\n    try {\n      processRegistration<E>(item, reg, domready);\n    } catch (e) {\n      console.error(\"Exception handling registration of\", item, \"for rule\", reg.selector);\n      console.log(\"Registration\", reg);\n      if (e instanceof Error) {\n        console.log(e, e.stack);\n        if (window.onerror) {\n          // Send to onerror to trigger exception reporting\n          try {\n            // @ts-expect-error: fileName, lineNumber and columnNumber are non-standard\n            window.onerror(e.message, e.fileName || \"\", e.lineNumber || 1, e.columNumber || 1, e);\n          } catch (e2) { }\n        }\n      } else\n        console.log(e);\n    }\n  });\n}\n\n/* A focus implementation that allows the node to intercept focused, allowing eg\n   radio/checkbox replacements to redirect focus but also explicitly preventing\n   focus of a disabled element\n   Returns true when the focus operation was successfull or handled by an event handler.\n   @param node Node to focus\n   @param options.preventScroll Prevent scroll to focused element\n*/\nexport function focus(node: Element, options?: FocusOptions) {\n  if (!domevents.dispatchCustomEvent(node, 'dompack:takefocus', { bubbles: true, cancelable: true, detail: { options } }))\n    return true;\n\n  if (typeof (node as HTMLElement).focus !== \"function\" || (node as HTMLInputElement).disabled)\n    return false;\n\n  (node as HTMLInputElement).focus(options);\n  return true;\n}\n\n/**\n * @param node - Node to show\n * @param options - Scroll options\n * @deprecated invoke scrollIntoView directly  on the nodes\n */\nexport function scrollIntoView(node: Element, options?: ScrollIntoViewOptions) {\n  node.scrollIntoView(options);\n  return true;\n}\n\n/**\n    Register a component for auto-initialization.\n\n    @param selector - Selector the component must match\n    @param handler - Handler\n    @param options - Any unrecognized options are passed to the handler\n\n    The handler will be invoked with two parameters\n    - the node to register\n    - the index of the node (a unique counter for this selector - first is 0)\n */\n\nexport function register<E extends Element = HTMLElement>(selector: string, handler: RegistrationHandler<E>, options?: { afterdomready: boolean }) {\n  const newreg: ComponentRegistration<E> =\n  {\n    selector: selector,\n    handler: handler,\n    index: 0,\n    num: components.length,\n    afterdomready: !options || options.afterdomready\n  };\n  if (components.length === 0 && !domtree.isDomReady()) //first component... we'll need a ready handler\n    domtree.onDomReady(() => registerMissed());\n\n  components.push(newreg as ComponentRegistration<Element>);\n  applyRegistration(newreg);\n}\n\n// register any components we missed on previous scans\nexport function registerMissed(startnode?: Element) {\n  const todo = components.slice(0);\n  todo.forEach(item => applyRegistration(item, startnode));\n}\n","import { buildCookieHeader, type CookieOptions } from '@webhare/dompack/src/cookiebuilder';\nimport { escapeRegExp, parseTyped, stringify } from '@webhare/std';\n\nconst backup: {\n  sessionStorage?: Record<string, string>;\n  localStorage?: Record<string, string>;\n} = {};\ntype BrowserStorage = keyof typeof backup;\n\nexport function listCookies() {\n  return document.cookie.split(';').map(cookie => {\n    const parts = cookie.split('=');\n    return { name: decodeURIComponent(parts[0].trim()), value: decodeURIComponent(parts[1] || '') };\n  });\n}\n\nexport function setCookie(key: string, value: string, options?: CookieOptions) {\n  document.cookie = buildCookieHeader(key, value, options);\n}\n\nexport function getCookie(key: string): string | null {\n  const value = document.cookie.match('(?:^|;)\\\\s*' + escapeRegExp(key) + '=([^;]*)');\n  return (value) ? decodeURIComponent(value[1]) : null;\n}\n\nexport function deleteCookie(key: string, options?: CookieOptions) {\n  setCookie(key, '', { ...options, duration: -1, expires: undefined });\n}\n\nfunction get(storage: BrowserStorage, key: string): unknown | null {\n  let foundvalue: string | undefined | null = backup[storage]?.[key];\n  if (foundvalue) //if it's in the backups storage encoding can't fail either\n    return parseTyped(foundvalue);\n\n  try {\n    foundvalue = window[storage].getItem(key);\n    if (foundvalue)\n      return parseTyped(foundvalue);\n  } catch (e) {\n    //we ignore parse failures\n  }\n  return null;\n}\n\nfunction set(storage: BrowserStorage, key: string, value: unknown) {\n  const tostore = value !== null && value !== undefined ? stringify(value, { typed: true }) : null;\n  try {\n    if (tostore !== null)\n      window[storage].setItem(key, tostore);\n    else\n      window[storage].removeItem(key);\n    return;\n  } catch (e) {\n    //ignore\n  }\n\n  const store = (backup[storage] ||= {});\n  if (tostore !== null)\n    store[key] = tostore;\n  else\n    delete store[key];\n}\n\nexport function getSession<T>(key: string): T | null {\n  return get(\"sessionStorage\", key) as T | null;\n}\nexport function setSession<T>(key: string, value: T | null) {\n  set(\"sessionStorage\", key, value);\n}\nexport function getLocal<T>(key: string): T | null {\n  return get(\"localStorage\", key) as T | null;\n}\nexport function setLocal<T>(key: string, value: T | null) {\n  set(\"localStorage\", key, value);\n}\nexport function listSessionKeys() {\n  try {\n    return Object.keys(window.sessionStorage);\n  } catch (e) {\n    return Object.keys(backup.sessionStorage || {});\n  }\n}\nexport function listLocalKeys() {\n  try {\n    return Object.keys(window.localStorage);\n  } catch (e) {\n    return Object.keys(backup.localStorage || {});\n  }\n}\n","/* Identify devices for the purpose of analytics/tracing\n   NOT a library for feature detection!\n   Originally based on Mootools.Browser\n*/\n\nexport type Platform = \"windows\" | \"ios\" | \"webos\" | \"android\" | \"linux\" | \"mac\" | \"other\";\nexport type Device = \"desktop\" | \"mobile\" | \"tablet\" | \"\";\n\n/** Valid KeyboardEvent.key values (next to 'plain' keys)\n    This list was built from https://www.w3.org/TR/uievents-key/\n    using `console.log([...new Set([...document.querySelectorAll(\".key-table-key .key\")].map(_ => _.textContent))].toSorted().join(' | '))`\n*/\nexport type KeyAttributeValue = \"AVRInput\" | \"AVRPower\" | \"Accept\" | \"Again\" | \"AllCandidates\" | \"Alphanumeric\" | \"Alt\" | \"AltGraph\" | \"AppSwitch\" | \"ArrowDown\" | \"ArrowLeft\" | \"ArrowRight\" | \"ArrowUp\" | \"Attn\" | \"AudioBalanceLeft\" | \"AudioBalanceRight\" | \"AudioBassBoostDown\" | \"AudioBassBoostToggle\" | \"AudioBassBoostUp\" | \"AudioFaderFront\" | \"AudioFaderRear\" | \"AudioSurroundModeNext\" | \"AudioTrebleDown\" | \"AudioTrebleUp\" | \"AudioVolumeDown\" | \"AudioVolumeMute\" | \"AudioVolumeUp\" | \"Backspace\" | \"BrightnessDown\" | \"BrightnessUp\" | \"BrowserBack\" | \"BrowserFavorites\" | \"BrowserForward\" | \"BrowserHome\" | \"BrowserRefresh\" | \"BrowserSearch\" | \"BrowserStop\" | \"Call\" | \"Camera\" | \"CameraFocus\" | \"Cancel\" | \"CapsLock\" | \"ChannelDown\" | \"ChannelUp\" | \"Clear\" | \"Close\" | \"ClosedCaptionToggle\" | \"CodeInput\" | \"ColorF0Red\" | \"ColorF1Green\" | \"ColorF2Yellow\" | \"ColorF3Blue\" | \"ColorF4Grey\" | \"ColorF5Brown\" | \"Compose\" | \"ContextMenu\" | \"Control\" | \"Convert\" | \"Copy\" | \"CrSel\" | \"Cut\" | \"DVR\" | \"Dead\" | \"Delete\" | \"Dimmer\" | \"DisplaySwap\" | \"Eisu\" | \"Eject\" | \"End\" | \"EndCall\" | \"Enter\" | \"EraseEof\" | \"Escape\" | \"ExSel\" | \"Execute\" | \"Exit\" | \"F1\" | \"F10\" | \"F11\" | \"F12\" | \"F2\" | \"F3\" | \"F4\" | \"F5\" | \"F6\" | \"F7\" | \"F8\" | \"F9\" | \"FavoriteClear0\" | \"FavoriteClear1\" | \"FavoriteClear2\" | \"FavoriteClear3\" | \"FavoriteRecall0\" | \"FavoriteRecall1\" | \"FavoriteRecall2\" | \"FavoriteRecall3\" | \"FavoriteStore0\" | \"FavoriteStore1\" | \"FavoriteStore2\" | \"FavoriteStore3\" | \"FinalMode\" | \"Find\" | \"Fn\" | \"FnLock\" | \"GoBack\" | \"GoHome\" | \"GroupFirst\" | \"GroupLast\" | \"GroupNext\" | \"GroupPrevious\" | \"Guide\" | \"GuideNextDay\" | \"GuidePreviousDay\" | \"HangulMode\" | \"HanjaMode\" | \"Hankaku\" | \"HeadsetHook\" | \"Help\" | \"Hibernate\" | \"Hiragana\" | \"HiraganaKatakana\" | \"Home\" | \"Hyper\" | \"Info\" | \"Insert\" | \"InstantReplay\" | \"JunjaMode\" | \"KanaMode\" | \"KanjiMode\" | \"Katakana\" | \"Key11\" | \"Key12\" | \"LastNumberRedial\" | \"LaunchApplication1\" | \"LaunchApplication2\" | \"LaunchCalendar\" | \"LaunchContacts\" | \"LaunchMail\" | \"LaunchMediaPlayer\" | \"LaunchMusicPlayer\" | \"LaunchPhone\" | \"LaunchScreenSaver\" | \"LaunchSpreadsheet\" | \"LaunchWebBrowser\" | \"LaunchWebCam\" | \"LaunchWordProcessor\" | \"Link\" | \"ListProgram\" | \"LiveContent\" | \"Lock\" | \"LogOff\" | \"MailForward\" | \"MailReply\" | \"MailSend\" | \"MannerMode\" | \"MediaApps\" | \"MediaAudioTrack\" | \"MediaClose\" | \"MediaFastForward\" | \"MediaLast\" | \"MediaNextTrack\" | \"MediaPause\" | \"MediaPlay\" | \"MediaPlayPause\" | \"MediaPreviousTrack\" | \"MediaRecord\" | \"MediaRewind\" | \"MediaSkipBackward\" | \"MediaSkipForward\" | \"MediaStepBackward\" | \"MediaStepForward\" | \"MediaStop\" | \"MediaTopMenu\" | \"MediaTrackNext\" | \"MediaTrackPrevious\" | \"Meta\" | \"MicrophoneToggle\" | \"MicrophoneVolumeDown\" | \"MicrophoneVolumeMute\" | \"MicrophoneVolumeUp\" | \"ModeChange\" | \"NavigateIn\" | \"NavigateNext\" | \"NavigateOut\" | \"NavigatePrevious\" | \"New\" | \"NextCandidate\" | \"NextFavoriteChannel\" | \"NextUserProfile\" | \"NonConvert\" | \"Notification\" | \"NumLock\" | \"OnDemand\" | \"Open\" | \"PageDown\" | \"PageUp\" | \"Pairing\" | \"Paste\" | \"Pause\" | \"PinPDown\" | \"PinPMove\" | \"PinPToggle\" | \"PinPUp\" | \"Play\" | \"PlaySpeedDown\" | \"PlaySpeedReset\" | \"PlaySpeedUp\" | \"Power\" | \"PowerOff\" | \"PreviousCandidate\" | \"Print\" | \"PrintScreen\" | \"Process\" | \"Props\" | \"RandomToggle\" | \"RcLowBattery\" | \"RecordSpeedNext\" | \"Redo\" | \"RfBypass\" | \"Romaji\" | \"STBInput\" | \"STBPower\" | \"Save\" | \"ScanChannelsToggle\" | \"ScreenModeNext\" | \"ScrollLock\" | \"Select\" | \"Settings\" | \"Shift\" | \"SingleCandidate\" | \"Soft1\" | \"Soft2\" | \"Soft3\" | \"Soft4\" | \"SpeechCorrectionList\" | \"SpeechInputToggle\" | \"SpellCheck\" | \"SplitScreenToggle\" | \"Standby\" | \"Subtitle\" | \"Super\" | \"Symbol\" | \"SymbolLock\" | \"TV\" | \"TV3DMode\" | \"TVAntennaCable\" | \"TVAudioDescription\" | \"TVAudioDescriptionMixDown\" | \"TVAudioDescriptionMixUp\" | \"TVContentsMenu\" | \"TVDataService\" | \"TVInput\" | \"TVInputComponent1\" | \"TVInputComponent2\" | \"TVInputComposite1\" | \"TVInputComposite2\" | \"TVInputHDMI1\" | \"TVInputHDMI2\" | \"TVInputHDMI3\" | \"TVInputHDMI4\" | \"TVInputVGA1\" | \"TVMediaContext\" | \"TVNetwork\" | \"TVNumberEntry\" | \"TVPower\" | \"TVRadioService\" | \"TVSatellite\" | \"TVSatelliteBS\" | \"TVSatelliteCS\" | \"TVSatelliteToggle\" | \"TVTerrestrialAnalog\" | \"TVTerrestrialDigital\" | \"TVTimer\" | \"Tab\" | \"Teletext\" | \"Undo\" | \"Unidentified\" | \"VideoModeNext\" | \"VoiceDial\" | \"WakeUp\" | \"Wink\" | \"Zenkaku\" | \"ZenkakuHankaku\" | \"ZoomIn\" | \"ZoomOut\" | \"ZoomToggle\";\n\nexport type UserAgentInfo =\n  {\n    /** Browser name, eg 'chrome' or 'firefox' */\n    name: string;\n    /** Browser numeric version (eg 97) */\n    version: number;\n    /** Platform the browser is running on (eg 'windows') */\n    platform: Platform;\n    /** Type of device (eg 'desktop' or 'tablet' for an iPad) */\n    device: Device;\n    /** platform-browsername-version eg ios-safari-11 */\n    triplet: string;\n  };\n\nexport function parseUserAgent(ua: string): UserAgentInfo {\n  ua = ua.toLowerCase();\n\n  // chrome is included in the edge UA, so need to check for edge first, before checking if it's chrome.\n  // safari is included in the miuibrowser UA, so need to check for miuibrowser first, before checking if it's safari.\n  let UA: RegExpMatchArray | null = ua.match(/(edge|miuibrowser)[\\s/:]([\\w\\d.]+)/);\n  if (!UA)\n    UA = ua.match(/(opera|ie|firefox|chrome|trident|crios|version)[\\s/:]([\\w\\d.]+)?.*?(safari|(?:rv[\\s/:]|version[\\s/:])([\\w\\d.]+)|$)/);\n  if (!UA) { //try ios 11.4.1\n    UA = ua.match(/; cpu os ([\\d]+)/);\n    if (UA)\n      UA = ['', 'safari', UA[1]];\n  }\n  if (!UA)\n    UA = ['', 'unknown', \"0\"];\n\n  if (UA[1] === 'trident') {\n    UA[1] = 'ie';\n    if (UA[4]) UA[2] = UA[4];\n  } else if (UA[1] === 'crios') {\n    UA[1] = 'chrome';\n  }\n\n  let platform = ua.match(/ip(?:ad|od|hone)/) ? 'ios' : (ua.match(/(?:webos|android)/) || ua.match(/mac|win|linux/) || ['other'])[0];\n  if (platform === 'win')\n    platform = 'windows';\n\n  const name = (UA[1] === 'version') ? UA[3] : UA[1];\n  const version = parseInt((UA[1] === 'opera' && UA[4]) ? UA[4] : UA[2]);\n  const device = ua.match(/ipad/) ? 'tablet' : ['ios', 'webos', 'android'].includes(platform) ? 'mobile' : ['mac', 'windows', 'linux'].includes(platform) ? 'desktop' : '';\n\n  return {\n    name,\n    version,\n    platform: platform as Platform,\n    device,\n    triplet: platform + '-' + name + '-' + version\n  };\n}\n\n/**\n * Is the native 'multiselect' modifier for this platform pressed? (Cmd for Mac, Ctrl for Windows/Linux)\n *\n * @param event - Event to check\n */\nexport function isMultiSelectKey(event: KeyboardEvent | MouseEvent): boolean {\n  return browser.platform === 'mac' ? event.metaKey : event.ctrlKey;\n}\n\n/**\n * Is the native 'copy' modifier for this platform pressed?\n *\n * @param event - Event to check\n */\nexport function isCopyKey(event: KeyboardEvent | MouseEvent): boolean {\n  return browser.platform === 'mac' ? event.altKey : event.ctrlKey;\n}\n\n/** @deprecated Use getBrowser() instead, available since WH5.6.3. We will remove `browser` in the future to improve tree shaking */\nexport const browser: Readonly<UserAgentInfo> = Object.freeze(parseUserAgent(globalThis.navigator?.userAgent || \"\"));\n\n/** Get browser information */\nexport function getBrowser(): Readonly<UserAgentInfo> {\n  //Offer this as a function to improve treeshakability\n  return browser;\n}\n\n//CSS Query used to find valid submittors\nexport const submitselector = 'input[type=submit],input[type=image],button[type=submit],button:not([type])';\n//Must match possible types returned by the submitselector\nexport type SubmitSelectorType = HTMLInputElement | HTMLButtonElement;\n","import { isHTMLElement } from \"@webhare/dompack\";\nimport type { CMSConfig } from \"@mod-system/js/internal/generation/gen_misc_ts\";\n\nlet config: CMSConfig | undefined;\n\nfunction forwardPublisherNavigation(event: Event) {\n  /* we watch for clicks.. as we only want to update the Publisher's selection for user triggered actions (otherwise we'd\n     start navigation in response to JS or internal link autoredirects) */\n  if (!isHTMLElement(event.target) || !config?.interfaceServers)\n    return;\n\n  const navaction = event.target.closest<HTMLAnchorElement>('a[href]');\n  if (!navaction)\n    return;\n\n  const desturl = navaction.href;\n  if (desturl.split('#')[0] !== location.href.split('#')[0]) { //it's actual navigation...\n    for (const origin of config.interfaceServers) {\n      try {\n        window.top?.postMessage({ type: \"webhare-navigation\", location: desturl }, origin);\n      } catch (ignore) {\n        //ignore crossdomain errors\n      }\n    }\n  }\n}\n\nasync function configureForCMS() {\n  try {\n    const res = await fetch(\"/.wh/ea/config/cms.json\");\n    config = await res.json();\n  } catch (e) {\n    console.log(\"Failed to get CMS configuration\", e);\n    return;\n  }\n  window.addEventListener(\"click\", forwardPublisherNavigation);\n}\n\nif (typeof window !== \"undefined\" && window !== window.top) { //if we're in an iframe, we may be running in WebHare and need to forward navigation events\n  //we have no way to detect whether we're in a WebHare iframe or a 3rd party iframe. assume it's webhare and grab the interface servers\n  void configureForCMS();\n}\n","/**\n* @vue/shared v3.5.18\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/\n/*! #__NO_SIDE_EFFECTS__ */\n// @__NO_SIDE_EFFECTS__\nfunction makeMap(str) {\n  const map = /* @__PURE__ */ Object.create(null);\n  for (const key of str.split(\",\")) map[key] = 1;\n  return (val) => val in map;\n}\n\nconst EMPTY_OBJ = !!(process.env.NODE_ENV !== \"production\") ? Object.freeze({}) : {};\nconst EMPTY_ARR = !!(process.env.NODE_ENV !== \"production\") ? Object.freeze([]) : [];\nconst NOOP = () => {\n};\nconst NO = () => false;\nconst isOn = (key) => key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && // uppercase letter\n(key.charCodeAt(2) > 122 || key.charCodeAt(2) < 97);\nconst isModelListener = (key) => key.startsWith(\"onUpdate:\");\nconst extend = Object.assign;\nconst remove = (arr, el) => {\n  const i = arr.indexOf(el);\n  if (i > -1) {\n    arr.splice(i, 1);\n  }\n};\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\nconst hasOwn = (val, key) => hasOwnProperty.call(val, key);\nconst isArray = Array.isArray;\nconst isMap = (val) => toTypeString(val) === \"[object Map]\";\nconst isSet = (val) => toTypeString(val) === \"[object Set]\";\nconst isDate = (val) => toTypeString(val) === \"[object Date]\";\nconst isRegExp = (val) => toTypeString(val) === \"[object RegExp]\";\nconst isFunction = (val) => typeof val === \"function\";\nconst isString = (val) => typeof val === \"string\";\nconst isSymbol = (val) => typeof val === \"symbol\";\nconst isObject = (val) => val !== null && typeof val === \"object\";\nconst isPromise = (val) => {\n  return (isObject(val) || isFunction(val)) && isFunction(val.then) && isFunction(val.catch);\n};\nconst objectToString = Object.prototype.toString;\nconst toTypeString = (value) => objectToString.call(value);\nconst toRawType = (value) => {\n  return toTypeString(value).slice(8, -1);\n};\nconst isPlainObject = (val) => toTypeString(val) === \"[object Object]\";\nconst isIntegerKey = (key) => isString(key) && key !== \"NaN\" && key[0] !== \"-\" && \"\" + parseInt(key, 10) === key;\nconst isReservedProp = /* @__PURE__ */ makeMap(\n  // the leading comma is intentional so empty string \"\" is also included\n  \",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted\"\n);\nconst isBuiltInDirective = /* @__PURE__ */ makeMap(\n  \"bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo\"\n);\nconst cacheStringFunction = (fn) => {\n  const cache = /* @__PURE__ */ Object.create(null);\n  return (str) => {\n    const hit = cache[str];\n    return hit || (cache[str] = fn(str));\n  };\n};\nconst camelizeRE = /-(\\w)/g;\nconst camelize = cacheStringFunction(\n  (str) => {\n    return str.replace(camelizeRE, (_, c) => c ? c.toUpperCase() : \"\");\n  }\n);\nconst hyphenateRE = /\\B([A-Z])/g;\nconst hyphenate = cacheStringFunction(\n  (str) => str.replace(hyphenateRE, \"-$1\").toLowerCase()\n);\nconst capitalize = cacheStringFunction((str) => {\n  return str.charAt(0).toUpperCase() + str.slice(1);\n});\nconst toHandlerKey = cacheStringFunction(\n  (str) => {\n    const s = str ? `on${capitalize(str)}` : ``;\n    return s;\n  }\n);\nconst hasChanged = (value, oldValue) => !Object.is(value, oldValue);\nconst invokeArrayFns = (fns, ...arg) => {\n  for (let i = 0; i < fns.length; i++) {\n    fns[i](...arg);\n  }\n};\nconst def = (obj, key, value, writable = false) => {\n  Object.defineProperty(obj, key, {\n    configurable: true,\n    enumerable: false,\n    writable,\n    value\n  });\n};\nconst looseToNumber = (val) => {\n  const n = parseFloat(val);\n  return isNaN(n) ? val : n;\n};\nconst toNumber = (val) => {\n  const n = isString(val) ? Number(val) : NaN;\n  return isNaN(n) ? val : n;\n};\nlet _globalThis;\nconst getGlobalThis = () => {\n  return _globalThis || (_globalThis = typeof globalThis !== \"undefined\" ? globalThis : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : typeof global !== \"undefined\" ? global : {});\n};\nconst identRE = /^[_$a-zA-Z\\xA0-\\uFFFF][_$a-zA-Z0-9\\xA0-\\uFFFF]*$/;\nfunction genPropsAccessExp(name) {\n  return identRE.test(name) ? `__props.${name}` : `__props[${JSON.stringify(name)}]`;\n}\nfunction genCacheKey(source, options) {\n  return source + JSON.stringify(\n    options,\n    (_, val) => typeof val === \"function\" ? val.toString() : val\n  );\n}\n\nconst PatchFlags = {\n  \"TEXT\": 1,\n  \"1\": \"TEXT\",\n  \"CLASS\": 2,\n  \"2\": \"CLASS\",\n  \"STYLE\": 4,\n  \"4\": \"STYLE\",\n  \"PROPS\": 8,\n  \"8\": \"PROPS\",\n  \"FULL_PROPS\": 16,\n  \"16\": \"FULL_PROPS\",\n  \"NEED_HYDRATION\": 32,\n  \"32\": \"NEED_HYDRATION\",\n  \"STABLE_FRAGMENT\": 64,\n  \"64\": \"STABLE_FRAGMENT\",\n  \"KEYED_FRAGMENT\": 128,\n  \"128\": \"KEYED_FRAGMENT\",\n  \"UNKEYED_FRAGMENT\": 256,\n  \"256\": \"UNKEYED_FRAGMENT\",\n  \"NEED_PATCH\": 512,\n  \"512\": \"NEED_PATCH\",\n  \"DYNAMIC_SLOTS\": 1024,\n  \"1024\": \"DYNAMIC_SLOTS\",\n  \"DEV_ROOT_FRAGMENT\": 2048,\n  \"2048\": \"DEV_ROOT_FRAGMENT\",\n  \"CACHED\": -1,\n  \"-1\": \"CACHED\",\n  \"BAIL\": -2,\n  \"-2\": \"BAIL\"\n};\nconst PatchFlagNames = {\n  [1]: `TEXT`,\n  [2]: `CLASS`,\n  [4]: `STYLE`,\n  [8]: `PROPS`,\n  [16]: `FULL_PROPS`,\n  [32]: `NEED_HYDRATION`,\n  [64]: `STABLE_FRAGMENT`,\n  [128]: `KEYED_FRAGMENT`,\n  [256]: `UNKEYED_FRAGMENT`,\n  [512]: `NEED_PATCH`,\n  [1024]: `DYNAMIC_SLOTS`,\n  [2048]: `DEV_ROOT_FRAGMENT`,\n  [-1]: `CACHED`,\n  [-2]: `BAIL`\n};\n\nconst ShapeFlags = {\n  \"ELEMENT\": 1,\n  \"1\": \"ELEMENT\",\n  \"FUNCTIONAL_COMPONENT\": 2,\n  \"2\": \"FUNCTIONAL_COMPONENT\",\n  \"STATEFUL_COMPONENT\": 4,\n  \"4\": \"STATEFUL_COMPONENT\",\n  \"TEXT_CHILDREN\": 8,\n  \"8\": \"TEXT_CHILDREN\",\n  \"ARRAY_CHILDREN\": 16,\n  \"16\": \"ARRAY_CHILDREN\",\n  \"SLOTS_CHILDREN\": 32,\n  \"32\": \"SLOTS_CHILDREN\",\n  \"TELEPORT\": 64,\n  \"64\": \"TELEPORT\",\n  \"SUSPENSE\": 128,\n  \"128\": \"SUSPENSE\",\n  \"COMPONENT_SHOULD_KEEP_ALIVE\": 256,\n  \"256\": \"COMPONENT_SHOULD_KEEP_ALIVE\",\n  \"COMPONENT_KEPT_ALIVE\": 512,\n  \"512\": \"COMPONENT_KEPT_ALIVE\",\n  \"COMPONENT\": 6,\n  \"6\": \"COMPONENT\"\n};\n\nconst SlotFlags = {\n  \"STABLE\": 1,\n  \"1\": \"STABLE\",\n  \"DYNAMIC\": 2,\n  \"2\": \"DYNAMIC\",\n  \"FORWARDED\": 3,\n  \"3\": \"FORWARDED\"\n};\nconst slotFlagsText = {\n  [1]: \"STABLE\",\n  [2]: \"DYNAMIC\",\n  [3]: \"FORWARDED\"\n};\n\nconst GLOBALS_ALLOWED = \"Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console,Error,Symbol\";\nconst isGloballyAllowed = /* @__PURE__ */ makeMap(GLOBALS_ALLOWED);\nconst isGloballyWhitelisted = isGloballyAllowed;\n\nconst range = 2;\nfunction generateCodeFrame(source, start = 0, end = source.length) {\n  start = Math.max(0, Math.min(start, source.length));\n  end = Math.max(0, Math.min(end, source.length));\n  if (start > end) return \"\";\n  let lines = source.split(/(\\r?\\n)/);\n  const newlineSequences = lines.filter((_, idx) => idx % 2 === 1);\n  lines = lines.filter((_, idx) => idx % 2 === 0);\n  let count = 0;\n  const res = [];\n  for (let i = 0; i < lines.length; i++) {\n    count += lines[i].length + (newlineSequences[i] && newlineSequences[i].length || 0);\n    if (count >= start) {\n      for (let j = i - range; j <= i + range || end > count; j++) {\n        if (j < 0 || j >= lines.length) continue;\n        const line = j + 1;\n        res.push(\n          `${line}${\" \".repeat(Math.max(3 - String(line).length, 0))}|  ${lines[j]}`\n        );\n        const lineLength = lines[j].length;\n        const newLineSeqLength = newlineSequences[j] && newlineSequences[j].length || 0;\n        if (j === i) {\n          const pad = start - (count - (lineLength + newLineSeqLength));\n          const length = Math.max(\n            1,\n            end > count ? lineLength - pad : end - start\n          );\n          res.push(`   |  ` + \" \".repeat(pad) + \"^\".repeat(length));\n        } else if (j > i) {\n          if (end > count) {\n            const length = Math.max(Math.min(end - count, lineLength), 1);\n            res.push(`   |  ` + \"^\".repeat(length));\n          }\n          count += lineLength + newLineSeqLength;\n        }\n      }\n      break;\n    }\n  }\n  return res.join(\"\\n\");\n}\n\nfunction normalizeStyle(value) {\n  if (isArray(value)) {\n    const res = {};\n    for (let i = 0; i < value.length; i++) {\n      const item = value[i];\n      const normalized = isString(item) ? parseStringStyle(item) : normalizeStyle(item);\n      if (normalized) {\n        for (const key in normalized) {\n          res[key] = normalized[key];\n        }\n      }\n    }\n    return res;\n  } else if (isString(value) || isObject(value)) {\n    return value;\n  }\n}\nconst listDelimiterRE = /;(?![^(]*\\))/g;\nconst propertyDelimiterRE = /:([^]+)/;\nconst styleCommentRE = /\\/\\*[^]*?\\*\\//g;\nfunction parseStringStyle(cssText) {\n  const ret = {};\n  cssText.replace(styleCommentRE, \"\").split(listDelimiterRE).forEach((item) => {\n    if (item) {\n      const tmp = item.split(propertyDelimiterRE);\n      tmp.length > 1 && (ret[tmp[0].trim()] = tmp[1].trim());\n    }\n  });\n  return ret;\n}\nfunction stringifyStyle(styles) {\n  if (!styles) return \"\";\n  if (isString(styles)) return styles;\n  let ret = \"\";\n  for (const key in styles) {\n    const value = styles[key];\n    if (isString(value) || typeof value === \"number\") {\n      const normalizedKey = key.startsWith(`--`) ? key : hyphenate(key);\n      ret += `${normalizedKey}:${value};`;\n    }\n  }\n  return ret;\n}\nfunction normalizeClass(value) {\n  let res = \"\";\n  if (isString(value)) {\n    res = value;\n  } else if (isArray(value)) {\n    for (let i = 0; i < value.length; i++) {\n      const normalized = normalizeClass(value[i]);\n      if (normalized) {\n        res += normalized + \" \";\n      }\n    }\n  } else if (isObject(value)) {\n    for (const name in value) {\n      if (value[name]) {\n        res += name + \" \";\n      }\n    }\n  }\n  return res.trim();\n}\nfunction normalizeProps(props) {\n  if (!props) return null;\n  let { class: klass, style } = props;\n  if (klass && !isString(klass)) {\n    props.class = normalizeClass(klass);\n  }\n  if (style) {\n    props.style = normalizeStyle(style);\n  }\n  return props;\n}\n\nconst HTML_TAGS = \"html,body,base,head,link,meta,style,title,address,article,aside,footer,header,hgroup,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,summary,template,blockquote,iframe,tfoot\";\nconst SVG_TAGS = \"svg,animate,animateMotion,animateTransform,circle,clipPath,color-profile,defs,desc,discard,ellipse,feBlend,feColorMatrix,feComponentTransfer,feComposite,feConvolveMatrix,feDiffuseLighting,feDisplacementMap,feDistantLight,feDropShadow,feFlood,feFuncA,feFuncB,feFuncG,feFuncR,feGaussianBlur,feImage,feMerge,feMergeNode,feMorphology,feOffset,fePointLight,feSpecularLighting,feSpotLight,feTile,feTurbulence,filter,foreignObject,g,hatch,hatchpath,image,line,linearGradient,marker,mask,mesh,meshgradient,meshpatch,meshrow,metadata,mpath,path,pattern,polygon,polyline,radialGradient,rect,set,solidcolor,stop,switch,symbol,text,textPath,title,tspan,unknown,use,view\";\nconst MATH_TAGS = \"annotation,annotation-xml,maction,maligngroup,malignmark,math,menclose,merror,mfenced,mfrac,mfraction,mglyph,mi,mlabeledtr,mlongdiv,mmultiscripts,mn,mo,mover,mpadded,mphantom,mprescripts,mroot,mrow,ms,mscarries,mscarry,msgroup,msline,mspace,msqrt,msrow,mstack,mstyle,msub,msubsup,msup,mtable,mtd,mtext,mtr,munder,munderover,none,semantics\";\nconst VOID_TAGS = \"area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr\";\nconst isHTMLTag = /* @__PURE__ */ makeMap(HTML_TAGS);\nconst isSVGTag = /* @__PURE__ */ makeMap(SVG_TAGS);\nconst isMathMLTag = /* @__PURE__ */ makeMap(MATH_TAGS);\nconst isVoidTag = /* @__PURE__ */ makeMap(VOID_TAGS);\n\nconst specialBooleanAttrs = `itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly`;\nconst isSpecialBooleanAttr = /* @__PURE__ */ makeMap(specialBooleanAttrs);\nconst isBooleanAttr = /* @__PURE__ */ makeMap(\n  specialBooleanAttrs + `,async,autofocus,autoplay,controls,default,defer,disabled,hidden,inert,loop,open,required,reversed,scoped,seamless,checked,muted,multiple,selected`\n);\nfunction includeBooleanAttr(value) {\n  return !!value || value === \"\";\n}\nconst unsafeAttrCharRE = /[>/=\"'\\u0009\\u000a\\u000c\\u0020]/;\nconst attrValidationCache = {};\nfunction isSSRSafeAttrName(name) {\n  if (attrValidationCache.hasOwnProperty(name)) {\n    return attrValidationCache[name];\n  }\n  const isUnsafe = unsafeAttrCharRE.test(name);\n  if (isUnsafe) {\n    console.error(`unsafe attribute name: ${name}`);\n  }\n  return attrValidationCache[name] = !isUnsafe;\n}\nconst propsToAttrMap = {\n  acceptCharset: \"accept-charset\",\n  className: \"class\",\n  htmlFor: \"for\",\n  httpEquiv: \"http-equiv\"\n};\nconst isKnownHtmlAttr = /* @__PURE__ */ makeMap(\n  `accept,accept-charset,accesskey,action,align,allow,alt,async,autocapitalize,autocomplete,autofocus,autoplay,background,bgcolor,border,buffered,capture,challenge,charset,checked,cite,class,code,codebase,color,cols,colspan,content,contenteditable,contextmenu,controls,coords,crossorigin,csp,data,datetime,decoding,default,defer,dir,dirname,disabled,download,draggable,dropzone,enctype,enterkeyhint,for,form,formaction,formenctype,formmethod,formnovalidate,formtarget,headers,height,hidden,high,href,hreflang,http-equiv,icon,id,importance,inert,integrity,ismap,itemprop,keytype,kind,label,lang,language,loading,list,loop,low,manifest,max,maxlength,minlength,media,min,multiple,muted,name,novalidate,open,optimum,pattern,ping,placeholder,poster,preload,radiogroup,readonly,referrerpolicy,rel,required,reversed,rows,rowspan,sandbox,scope,scoped,selected,shape,size,sizes,slot,span,spellcheck,src,srcdoc,srclang,srcset,start,step,style,summary,tabindex,target,title,translate,type,usemap,value,width,wrap`\n);\nconst isKnownSvgAttr = /* @__PURE__ */ makeMap(\n  `xmlns,accent-height,accumulate,additive,alignment-baseline,alphabetic,amplitude,arabic-form,ascent,attributeName,attributeType,azimuth,baseFrequency,baseline-shift,baseProfile,bbox,begin,bias,by,calcMode,cap-height,class,clip,clipPathUnits,clip-path,clip-rule,color,color-interpolation,color-interpolation-filters,color-profile,color-rendering,contentScriptType,contentStyleType,crossorigin,cursor,cx,cy,d,decelerate,descent,diffuseConstant,direction,display,divisor,dominant-baseline,dur,dx,dy,edgeMode,elevation,enable-background,end,exponent,fill,fill-opacity,fill-rule,filter,filterRes,filterUnits,flood-color,flood-opacity,font-family,font-size,font-size-adjust,font-stretch,font-style,font-variant,font-weight,format,from,fr,fx,fy,g1,g2,glyph-name,glyph-orientation-horizontal,glyph-orientation-vertical,glyphRef,gradientTransform,gradientUnits,hanging,height,href,hreflang,horiz-adv-x,horiz-origin-x,id,ideographic,image-rendering,in,in2,intercept,k,k1,k2,k3,k4,kernelMatrix,kernelUnitLength,kerning,keyPoints,keySplines,keyTimes,lang,lengthAdjust,letter-spacing,lighting-color,limitingConeAngle,local,marker-end,marker-mid,marker-start,markerHeight,markerUnits,markerWidth,mask,maskContentUnits,maskUnits,mathematical,max,media,method,min,mode,name,numOctaves,offset,opacity,operator,order,orient,orientation,origin,overflow,overline-position,overline-thickness,panose-1,paint-order,path,pathLength,patternContentUnits,patternTransform,patternUnits,ping,pointer-events,points,pointsAtX,pointsAtY,pointsAtZ,preserveAlpha,preserveAspectRatio,primitiveUnits,r,radius,referrerPolicy,refX,refY,rel,rendering-intent,repeatCount,repeatDur,requiredExtensions,requiredFeatures,restart,result,rotate,rx,ry,scale,seed,shape-rendering,slope,spacing,specularConstant,specularExponent,speed,spreadMethod,startOffset,stdDeviation,stemh,stemv,stitchTiles,stop-color,stop-opacity,strikethrough-position,strikethrough-thickness,string,stroke,stroke-dasharray,stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,stroke-opacity,stroke-width,style,surfaceScale,systemLanguage,tabindex,tableValues,target,targetX,targetY,text-anchor,text-decoration,text-rendering,textLength,to,transform,transform-origin,type,u1,u2,underline-position,underline-thickness,unicode,unicode-bidi,unicode-range,units-per-em,v-alphabetic,v-hanging,v-ideographic,v-mathematical,values,vector-effect,version,vert-adv-y,vert-origin-x,vert-origin-y,viewBox,viewTarget,visibility,width,widths,word-spacing,writing-mode,x,x-height,x1,x2,xChannelSelector,xlink:actuate,xlink:arcrole,xlink:href,xlink:role,xlink:show,xlink:title,xlink:type,xmlns:xlink,xml:base,xml:lang,xml:space,y,y1,y2,yChannelSelector,z,zoomAndPan`\n);\nconst isKnownMathMLAttr = /* @__PURE__ */ makeMap(\n  `accent,accentunder,actiontype,align,alignmentscope,altimg,altimg-height,altimg-valign,altimg-width,alttext,bevelled,close,columnsalign,columnlines,columnspan,denomalign,depth,dir,display,displaystyle,encoding,equalcolumns,equalrows,fence,fontstyle,fontweight,form,frame,framespacing,groupalign,height,href,id,indentalign,indentalignfirst,indentalignlast,indentshift,indentshiftfirst,indentshiftlast,indextype,justify,largetop,largeop,lquote,lspace,mathbackground,mathcolor,mathsize,mathvariant,maxsize,minlabelspacing,mode,other,overflow,position,rowalign,rowlines,rowspan,rquote,rspace,scriptlevel,scriptminsize,scriptsizemultiplier,selection,separator,separators,shift,side,src,stackalign,stretchy,subscriptshift,superscriptshift,symmetric,voffset,width,widths,xlink:href,xlink:show,xlink:type,xmlns`\n);\nfunction isRenderableAttrValue(value) {\n  if (value == null) {\n    return false;\n  }\n  const type = typeof value;\n  return type === \"string\" || type === \"number\" || type === \"boolean\";\n}\n\nconst escapeRE = /[\"'&<>]/;\nfunction escapeHtml(string) {\n  const str = \"\" + string;\n  const match = escapeRE.exec(str);\n  if (!match) {\n    return str;\n  }\n  let html = \"\";\n  let escaped;\n  let index;\n  let lastIndex = 0;\n  for (index = match.index; index < str.length; index++) {\n    switch (str.charCodeAt(index)) {\n      case 34:\n        escaped = \"&quot;\";\n        break;\n      case 38:\n        escaped = \"&amp;\";\n        break;\n      case 39:\n        escaped = \"&#39;\";\n        break;\n      case 60:\n        escaped = \"&lt;\";\n        break;\n      case 62:\n        escaped = \"&gt;\";\n        break;\n      default:\n        continue;\n    }\n    if (lastIndex !== index) {\n      html += str.slice(lastIndex, index);\n    }\n    lastIndex = index + 1;\n    html += escaped;\n  }\n  return lastIndex !== index ? html + str.slice(lastIndex, index) : html;\n}\nconst commentStripRE = /^-?>|<!--|-->|--!>|<!-$/g;\nfunction escapeHtmlComment(src) {\n  return src.replace(commentStripRE, \"\");\n}\nconst cssVarNameEscapeSymbolsRE = /[ !\"#$%&'()*+,./:;<=>?@[\\\\\\]^`{|}~]/g;\nfunction getEscapedCssVarName(key, doubleEscape) {\n  return key.replace(\n    cssVarNameEscapeSymbolsRE,\n    (s) => doubleEscape ? s === '\"' ? '\\\\\\\\\\\\\"' : `\\\\\\\\${s}` : `\\\\${s}`\n  );\n}\n\nfunction looseCompareArrays(a, b) {\n  if (a.length !== b.length) return false;\n  let equal = true;\n  for (let i = 0; equal && i < a.length; i++) {\n    equal = looseEqual(a[i], b[i]);\n  }\n  return equal;\n}\nfunction looseEqual(a, b) {\n  if (a === b) return true;\n  let aValidType = isDate(a);\n  let bValidType = isDate(b);\n  if (aValidType || bValidType) {\n    return aValidType && bValidType ? a.getTime() === b.getTime() : false;\n  }\n  aValidType = isSymbol(a);\n  bValidType = isSymbol(b);\n  if (aValidType || bValidType) {\n    return a === b;\n  }\n  aValidType = isArray(a);\n  bValidType = isArray(b);\n  if (aValidType || bValidType) {\n    return aValidType && bValidType ? looseCompareArrays(a, b) : false;\n  }\n  aValidType = isObject(a);\n  bValidType = isObject(b);\n  if (aValidType || bValidType) {\n    if (!aValidType || !bValidType) {\n      return false;\n    }\n    const aKeysCount = Object.keys(a).length;\n    const bKeysCount = Object.keys(b).length;\n    if (aKeysCount !== bKeysCount) {\n      return false;\n    }\n    for (const key in a) {\n      const aHasKey = a.hasOwnProperty(key);\n      const bHasKey = b.hasOwnProperty(key);\n      if (aHasKey && !bHasKey || !aHasKey && bHasKey || !looseEqual(a[key], b[key])) {\n        return false;\n      }\n    }\n  }\n  return String(a) === String(b);\n}\nfunction looseIndexOf(arr, val) {\n  return arr.findIndex((item) => looseEqual(item, val));\n}\n\nconst isRef = (val) => {\n  return !!(val && val[\"__v_isRef\"] === true);\n};\nconst toDisplayString = (val) => {\n  return isString(val) ? val : val == null ? \"\" : isArray(val) || isObject(val) && (val.toString === objectToString || !isFunction(val.toString)) ? isRef(val) ? toDisplayString(val.value) : JSON.stringify(val, replacer, 2) : String(val);\n};\nconst replacer = (_key, val) => {\n  if (isRef(val)) {\n    return replacer(_key, val.value);\n  } else if (isMap(val)) {\n    return {\n      [`Map(${val.size})`]: [...val.entries()].reduce(\n        (entries, [key, val2], i) => {\n          entries[stringifySymbol(key, i) + \" =>\"] = val2;\n          return entries;\n        },\n        {}\n      )\n    };\n  } else if (isSet(val)) {\n    return {\n      [`Set(${val.size})`]: [...val.values()].map((v) => stringifySymbol(v))\n    };\n  } else if (isSymbol(val)) {\n    return stringifySymbol(val);\n  } else if (isObject(val) && !isArray(val) && !isPlainObject(val)) {\n    return String(val);\n  }\n  return val;\n};\nconst stringifySymbol = (v, i = \"\") => {\n  var _a;\n  return (\n    // Symbol.description in es2019+ so we need to cast here to pass\n    // the lib: es2016 check\n    isSymbol(v) ? `Symbol(${(_a = v.description) != null ? _a : i})` : v\n  );\n};\n\nfunction normalizeCssVarValue(value) {\n  if (value == null) {\n    return \"initial\";\n  }\n  if (typeof value === \"string\") {\n    return value === \"\" ? \" \" : value;\n  }\n  if (typeof value !== \"number\" || !Number.isFinite(value)) {\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      console.warn(\n        \"[Vue warn] Invalid value used for CSS binding. Expected a string or a finite number but received:\",\n        value\n      );\n    }\n  }\n  return String(value);\n}\n\nexport { EMPTY_ARR, EMPTY_OBJ, NO, NOOP, PatchFlagNames, PatchFlags, ShapeFlags, SlotFlags, camelize, capitalize, cssVarNameEscapeSymbolsRE, def, escapeHtml, escapeHtmlComment, extend, genCacheKey, genPropsAccessExp, generateCodeFrame, getEscapedCssVarName, getGlobalThis, hasChanged, hasOwn, hyphenate, includeBooleanAttr, invokeArrayFns, isArray, isBooleanAttr, isBuiltInDirective, isDate, isFunction, isGloballyAllowed, isGloballyWhitelisted, isHTMLTag, isIntegerKey, isKnownHtmlAttr, isKnownMathMLAttr, isKnownSvgAttr, isMap, isMathMLTag, isModelListener, isObject, isOn, isPlainObject, isPromise, isRegExp, isRenderableAttrValue, isReservedProp, isSSRSafeAttrName, isSVGTag, isSet, isSpecialBooleanAttr, isString, isSymbol, isVoidTag, looseEqual, looseIndexOf, looseToNumber, makeMap, normalizeClass, normalizeCssVarValue, normalizeProps, normalizeStyle, objectToString, parseStringStyle, propsToAttrMap, remove, slotFlagsText, stringifyStyle, toDisplayString, toHandlerKey, toNumber, toRawType, toTypeString };\n","/**\n* @vue/reactivity v3.5.18\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/\nimport { extend, hasChanged, isArray, isIntegerKey, isSymbol, isMap, hasOwn, makeMap, isObject, capitalize, toRawType, def, isFunction, EMPTY_OBJ, isSet, isPlainObject, remove, NOOP } from '@vue/shared';\n\nfunction warn(msg, ...args) {\n  console.warn(`[Vue warn] ${msg}`, ...args);\n}\n\nlet activeEffectScope;\nclass EffectScope {\n  constructor(detached = false) {\n    this.detached = detached;\n    /**\n     * @internal\n     */\n    this._active = true;\n    /**\n     * @internal track `on` calls, allow `on` call multiple times\n     */\n    this._on = 0;\n    /**\n     * @internal\n     */\n    this.effects = [];\n    /**\n     * @internal\n     */\n    this.cleanups = [];\n    this._isPaused = false;\n    this.parent = activeEffectScope;\n    if (!detached && activeEffectScope) {\n      this.index = (activeEffectScope.scopes || (activeEffectScope.scopes = [])).push(\n        this\n      ) - 1;\n    }\n  }\n  get active() {\n    return this._active;\n  }\n  pause() {\n    if (this._active) {\n      this._isPaused = true;\n      let i, l;\n      if (this.scopes) {\n        for (i = 0, l = this.scopes.length; i < l; i++) {\n          this.scopes[i].pause();\n        }\n      }\n      for (i = 0, l = this.effects.length; i < l; i++) {\n        this.effects[i].pause();\n      }\n    }\n  }\n  /**\n   * Resumes the effect scope, including all child scopes and effects.\n   */\n  resume() {\n    if (this._active) {\n      if (this._isPaused) {\n        this._isPaused = false;\n        let i, l;\n        if (this.scopes) {\n          for (i = 0, l = this.scopes.length; i < l; i++) {\n            this.scopes[i].resume();\n          }\n        }\n        for (i = 0, l = this.effects.length; i < l; i++) {\n          this.effects[i].resume();\n        }\n      }\n    }\n  }\n  run(fn) {\n    if (this._active) {\n      const currentEffectScope = activeEffectScope;\n      try {\n        activeEffectScope = this;\n        return fn();\n      } finally {\n        activeEffectScope = currentEffectScope;\n      }\n    } else if (!!(process.env.NODE_ENV !== \"production\")) {\n      warn(`cannot run an inactive effect scope.`);\n    }\n  }\n  /**\n   * This should only be called on non-detached scopes\n   * @internal\n   */\n  on() {\n    if (++this._on === 1) {\n      this.prevScope = activeEffectScope;\n      activeEffectScope = this;\n    }\n  }\n  /**\n   * This should only be called on non-detached scopes\n   * @internal\n   */\n  off() {\n    if (this._on > 0 && --this._on === 0) {\n      activeEffectScope = this.prevScope;\n      this.prevScope = void 0;\n    }\n  }\n  stop(fromParent) {\n    if (this._active) {\n      this._active = false;\n      let i, l;\n      for (i = 0, l = this.effects.length; i < l; i++) {\n        this.effects[i].stop();\n      }\n      this.effects.length = 0;\n      for (i = 0, l = this.cleanups.length; i < l; i++) {\n        this.cleanups[i]();\n      }\n      this.cleanups.length = 0;\n      if (this.scopes) {\n        for (i = 0, l = this.scopes.length; i < l; i++) {\n          this.scopes[i].stop(true);\n        }\n        this.scopes.length = 0;\n      }\n      if (!this.detached && this.parent && !fromParent) {\n        const last = this.parent.scopes.pop();\n        if (last && last !== this) {\n          this.parent.scopes[this.index] = last;\n          last.index = this.index;\n        }\n      }\n      this.parent = void 0;\n    }\n  }\n}\nfunction effectScope(detached) {\n  return new EffectScope(detached);\n}\nfunction getCurrentScope() {\n  return activeEffectScope;\n}\nfunction onScopeDispose(fn, failSilently = false) {\n  if (activeEffectScope) {\n    activeEffectScope.cleanups.push(fn);\n  } else if (!!(process.env.NODE_ENV !== \"production\") && !failSilently) {\n    warn(\n      `onScopeDispose() is called when there is no active effect scope to be associated with.`\n    );\n  }\n}\n\nlet activeSub;\nconst EffectFlags = {\n  \"ACTIVE\": 1,\n  \"1\": \"ACTIVE\",\n  \"RUNNING\": 2,\n  \"2\": \"RUNNING\",\n  \"TRACKING\": 4,\n  \"4\": \"TRACKING\",\n  \"NOTIFIED\": 8,\n  \"8\": \"NOTIFIED\",\n  \"DIRTY\": 16,\n  \"16\": \"DIRTY\",\n  \"ALLOW_RECURSE\": 32,\n  \"32\": \"ALLOW_RECURSE\",\n  \"PAUSED\": 64,\n  \"64\": \"PAUSED\",\n  \"EVALUATED\": 128,\n  \"128\": \"EVALUATED\"\n};\nconst pausedQueueEffects = /* @__PURE__ */ new WeakSet();\nclass ReactiveEffect {\n  constructor(fn) {\n    this.fn = fn;\n    /**\n     * @internal\n     */\n    this.deps = void 0;\n    /**\n     * @internal\n     */\n    this.depsTail = void 0;\n    /**\n     * @internal\n     */\n    this.flags = 1 | 4;\n    /**\n     * @internal\n     */\n    this.next = void 0;\n    /**\n     * @internal\n     */\n    this.cleanup = void 0;\n    this.scheduler = void 0;\n    if (activeEffectScope && activeEffectScope.active) {\n      activeEffectScope.effects.push(this);\n    }\n  }\n  pause() {\n    this.flags |= 64;\n  }\n  resume() {\n    if (this.flags & 64) {\n      this.flags &= -65;\n      if (pausedQueueEffects.has(this)) {\n        pausedQueueEffects.delete(this);\n        this.trigger();\n      }\n    }\n  }\n  /**\n   * @internal\n   */\n  notify() {\n    if (this.flags & 2 && !(this.flags & 32)) {\n      return;\n    }\n    if (!(this.flags & 8)) {\n      batch(this);\n    }\n  }\n  run() {\n    if (!(this.flags & 1)) {\n      return this.fn();\n    }\n    this.flags |= 2;\n    cleanupEffect(this);\n    prepareDeps(this);\n    const prevEffect = activeSub;\n    const prevShouldTrack = shouldTrack;\n    activeSub = this;\n    shouldTrack = true;\n    try {\n      return this.fn();\n    } finally {\n      if (!!(process.env.NODE_ENV !== \"production\") && activeSub !== this) {\n        warn(\n          \"Active effect was not restored correctly - this is likely a Vue internal bug.\"\n        );\n      }\n      cleanupDeps(this);\n      activeSub = prevEffect;\n      shouldTrack = prevShouldTrack;\n      this.flags &= -3;\n    }\n  }\n  stop() {\n    if (this.flags & 1) {\n      for (let link = this.deps; link; link = link.nextDep) {\n        removeSub(link);\n      }\n      this.deps = this.depsTail = void 0;\n      cleanupEffect(this);\n      this.onStop && this.onStop();\n      this.flags &= -2;\n    }\n  }\n  trigger() {\n    if (this.flags & 64) {\n      pausedQueueEffects.add(this);\n    } else if (this.scheduler) {\n      this.scheduler();\n    } else {\n      this.runIfDirty();\n    }\n  }\n  /**\n   * @internal\n   */\n  runIfDirty() {\n    if (isDirty(this)) {\n      this.run();\n    }\n  }\n  get dirty() {\n    return isDirty(this);\n  }\n}\nlet batchDepth = 0;\nlet batchedSub;\nlet batchedComputed;\nfunction batch(sub, isComputed = false) {\n  sub.flags |= 8;\n  if (isComputed) {\n    sub.next = batchedComputed;\n    batchedComputed = sub;\n    return;\n  }\n  sub.next = batchedSub;\n  batchedSub = sub;\n}\nfunction startBatch() {\n  batchDepth++;\n}\nfunction endBatch() {\n  if (--batchDepth > 0) {\n    return;\n  }\n  if (batchedComputed) {\n    let e = batchedComputed;\n    batchedComputed = void 0;\n    while (e) {\n      const next = e.next;\n      e.next = void 0;\n      e.flags &= -9;\n      e = next;\n    }\n  }\n  let error;\n  while (batchedSub) {\n    let e = batchedSub;\n    batchedSub = void 0;\n    while (e) {\n      const next = e.next;\n      e.next = void 0;\n      e.flags &= -9;\n      if (e.flags & 1) {\n        try {\n          ;\n          e.trigger();\n        } catch (err) {\n          if (!error) error = err;\n        }\n      }\n      e = next;\n    }\n  }\n  if (error) throw error;\n}\nfunction prepareDeps(sub) {\n  for (let link = sub.deps; link; link = link.nextDep) {\n    link.version = -1;\n    link.prevActiveLink = link.dep.activeLink;\n    link.dep.activeLink = link;\n  }\n}\nfunction cleanupDeps(sub) {\n  let head;\n  let tail = sub.depsTail;\n  let link = tail;\n  while (link) {\n    const prev = link.prevDep;\n    if (link.version === -1) {\n      if (link === tail) tail = prev;\n      removeSub(link);\n      removeDep(link);\n    } else {\n      head = link;\n    }\n    link.dep.activeLink = link.prevActiveLink;\n    link.prevActiveLink = void 0;\n    link = prev;\n  }\n  sub.deps = head;\n  sub.depsTail = tail;\n}\nfunction isDirty(sub) {\n  for (let link = sub.deps; link; link = link.nextDep) {\n    if (link.dep.version !== link.version || link.dep.computed && (refreshComputed(link.dep.computed) || link.dep.version !== link.version)) {\n      return true;\n    }\n  }\n  if (sub._dirty) {\n    return true;\n  }\n  return false;\n}\nfunction refreshComputed(computed) {\n  if (computed.flags & 4 && !(computed.flags & 16)) {\n    return;\n  }\n  computed.flags &= -17;\n  if (computed.globalVersion === globalVersion) {\n    return;\n  }\n  computed.globalVersion = globalVersion;\n  if (!computed.isSSR && computed.flags & 128 && (!computed.deps && !computed._dirty || !isDirty(computed))) {\n    return;\n  }\n  computed.flags |= 2;\n  const dep = computed.dep;\n  const prevSub = activeSub;\n  const prevShouldTrack = shouldTrack;\n  activeSub = computed;\n  shouldTrack = true;\n  try {\n    prepareDeps(computed);\n    const value = computed.fn(computed._value);\n    if (dep.version === 0 || hasChanged(value, computed._value)) {\n      computed.flags |= 128;\n      computed._value = value;\n      dep.version++;\n    }\n  } catch (err) {\n    dep.version++;\n    throw err;\n  } finally {\n    activeSub = prevSub;\n    shouldTrack = prevShouldTrack;\n    cleanupDeps(computed);\n    computed.flags &= -3;\n  }\n}\nfunction removeSub(link, soft = false) {\n  const { dep, prevSub, nextSub } = link;\n  if (prevSub) {\n    prevSub.nextSub = nextSub;\n    link.prevSub = void 0;\n  }\n  if (nextSub) {\n    nextSub.prevSub = prevSub;\n    link.nextSub = void 0;\n  }\n  if (!!(process.env.NODE_ENV !== \"production\") && dep.subsHead === link) {\n    dep.subsHead = nextSub;\n  }\n  if (dep.subs === link) {\n    dep.subs = prevSub;\n    if (!prevSub && dep.computed) {\n      dep.computed.flags &= -5;\n      for (let l = dep.computed.deps; l; l = l.nextDep) {\n        removeSub(l, true);\n      }\n    }\n  }\n  if (!soft && !--dep.sc && dep.map) {\n    dep.map.delete(dep.key);\n  }\n}\nfunction removeDep(link) {\n  const { prevDep, nextDep } = link;\n  if (prevDep) {\n    prevDep.nextDep = nextDep;\n    link.prevDep = void 0;\n  }\n  if (nextDep) {\n    nextDep.prevDep = prevDep;\n    link.nextDep = void 0;\n  }\n}\nfunction effect(fn, options) {\n  if (fn.effect instanceof ReactiveEffect) {\n    fn = fn.effect.fn;\n  }\n  const e = new ReactiveEffect(fn);\n  if (options) {\n    extend(e, options);\n  }\n  try {\n    e.run();\n  } catch (err) {\n    e.stop();\n    throw err;\n  }\n  const runner = e.run.bind(e);\n  runner.effect = e;\n  return runner;\n}\nfunction stop(runner) {\n  runner.effect.stop();\n}\nlet shouldTrack = true;\nconst trackStack = [];\nfunction pauseTracking() {\n  trackStack.push(shouldTrack);\n  shouldTrack = false;\n}\nfunction enableTracking() {\n  trackStack.push(shouldTrack);\n  shouldTrack = true;\n}\nfunction resetTracking() {\n  const last = trackStack.pop();\n  shouldTrack = last === void 0 ? true : last;\n}\nfunction onEffectCleanup(fn, failSilently = false) {\n  if (activeSub instanceof ReactiveEffect) {\n    activeSub.cleanup = fn;\n  } else if (!!(process.env.NODE_ENV !== \"production\") && !failSilently) {\n    warn(\n      `onEffectCleanup() was called when there was no active effect to associate with.`\n    );\n  }\n}\nfunction cleanupEffect(e) {\n  const { cleanup } = e;\n  e.cleanup = void 0;\n  if (cleanup) {\n    const prevSub = activeSub;\n    activeSub = void 0;\n    try {\n      cleanup();\n    } finally {\n      activeSub = prevSub;\n    }\n  }\n}\n\nlet globalVersion = 0;\nclass Link {\n  constructor(sub, dep) {\n    this.sub = sub;\n    this.dep = dep;\n    this.version = dep.version;\n    this.nextDep = this.prevDep = this.nextSub = this.prevSub = this.prevActiveLink = void 0;\n  }\n}\nclass Dep {\n  // TODO isolatedDeclarations \"__v_skip\"\n  constructor(computed) {\n    this.computed = computed;\n    this.version = 0;\n    /**\n     * Link between this dep and the current active effect\n     */\n    this.activeLink = void 0;\n    /**\n     * Doubly linked list representing the subscribing effects (tail)\n     */\n    this.subs = void 0;\n    /**\n     * For object property deps cleanup\n     */\n    this.map = void 0;\n    this.key = void 0;\n    /**\n     * Subscriber counter\n     */\n    this.sc = 0;\n    /**\n     * @internal\n     */\n    this.__v_skip = true;\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      this.subsHead = void 0;\n    }\n  }\n  track(debugInfo) {\n    if (!activeSub || !shouldTrack || activeSub === this.computed) {\n      return;\n    }\n    let link = this.activeLink;\n    if (link === void 0 || link.sub !== activeSub) {\n      link = this.activeLink = new Link(activeSub, this);\n      if (!activeSub.deps) {\n        activeSub.deps = activeSub.depsTail = link;\n      } else {\n        link.prevDep = activeSub.depsTail;\n        activeSub.depsTail.nextDep = link;\n        activeSub.depsTail = link;\n      }\n      addSub(link);\n    } else if (link.version === -1) {\n      link.version = this.version;\n      if (link.nextDep) {\n        const next = link.nextDep;\n        next.prevDep = link.prevDep;\n        if (link.prevDep) {\n          link.prevDep.nextDep = next;\n        }\n        link.prevDep = activeSub.depsTail;\n        link.nextDep = void 0;\n        activeSub.depsTail.nextDep = link;\n        activeSub.depsTail = link;\n        if (activeSub.deps === link) {\n          activeSub.deps = next;\n        }\n      }\n    }\n    if (!!(process.env.NODE_ENV !== \"production\") && activeSub.onTrack) {\n      activeSub.onTrack(\n        extend(\n          {\n            effect: activeSub\n          },\n          debugInfo\n        )\n      );\n    }\n    return link;\n  }\n  trigger(debugInfo) {\n    this.version++;\n    globalVersion++;\n    this.notify(debugInfo);\n  }\n  notify(debugInfo) {\n    startBatch();\n    try {\n      if (!!(process.env.NODE_ENV !== \"production\")) {\n        for (let head = this.subsHead; head; head = head.nextSub) {\n          if (head.sub.onTrigger && !(head.sub.flags & 8)) {\n            head.sub.onTrigger(\n              extend(\n                {\n                  effect: head.sub\n                },\n                debugInfo\n              )\n            );\n          }\n        }\n      }\n      for (let link = this.subs; link; link = link.prevSub) {\n        if (link.sub.notify()) {\n          ;\n          link.sub.dep.notify();\n        }\n      }\n    } finally {\n      endBatch();\n    }\n  }\n}\nfunction addSub(link) {\n  link.dep.sc++;\n  if (link.sub.flags & 4) {\n    const computed = link.dep.computed;\n    if (computed && !link.dep.subs) {\n      computed.flags |= 4 | 16;\n      for (let l = computed.deps; l; l = l.nextDep) {\n        addSub(l);\n      }\n    }\n    const currentTail = link.dep.subs;\n    if (currentTail !== link) {\n      link.prevSub = currentTail;\n      if (currentTail) currentTail.nextSub = link;\n    }\n    if (!!(process.env.NODE_ENV !== \"production\") && link.dep.subsHead === void 0) {\n      link.dep.subsHead = link;\n    }\n    link.dep.subs = link;\n  }\n}\nconst targetMap = /* @__PURE__ */ new WeakMap();\nconst ITERATE_KEY = Symbol(\n  !!(process.env.NODE_ENV !== \"production\") ? \"Object iterate\" : \"\"\n);\nconst MAP_KEY_ITERATE_KEY = Symbol(\n  !!(process.env.NODE_ENV !== \"production\") ? \"Map keys iterate\" : \"\"\n);\nconst ARRAY_ITERATE_KEY = Symbol(\n  !!(process.env.NODE_ENV !== \"production\") ? \"Array iterate\" : \"\"\n);\nfunction track(target, type, key) {\n  if (shouldTrack && activeSub) {\n    let depsMap = targetMap.get(target);\n    if (!depsMap) {\n      targetMap.set(target, depsMap = /* @__PURE__ */ new Map());\n    }\n    let dep = depsMap.get(key);\n    if (!dep) {\n      depsMap.set(key, dep = new Dep());\n      dep.map = depsMap;\n      dep.key = key;\n    }\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      dep.track({\n        target,\n        type,\n        key\n      });\n    } else {\n      dep.track();\n    }\n  }\n}\nfunction trigger(target, type, key, newValue, oldValue, oldTarget) {\n  const depsMap = targetMap.get(target);\n  if (!depsMap) {\n    globalVersion++;\n    return;\n  }\n  const run = (dep) => {\n    if (dep) {\n      if (!!(process.env.NODE_ENV !== \"production\")) {\n        dep.trigger({\n          target,\n          type,\n          key,\n          newValue,\n          oldValue,\n          oldTarget\n        });\n      } else {\n        dep.trigger();\n      }\n    }\n  };\n  startBatch();\n  if (type === \"clear\") {\n    depsMap.forEach(run);\n  } else {\n    const targetIsArray = isArray(target);\n    const isArrayIndex = targetIsArray && isIntegerKey(key);\n    if (targetIsArray && key === \"length\") {\n      const newLength = Number(newValue);\n      depsMap.forEach((dep, key2) => {\n        if (key2 === \"length\" || key2 === ARRAY_ITERATE_KEY || !isSymbol(key2) && key2 >= newLength) {\n          run(dep);\n        }\n      });\n    } else {\n      if (key !== void 0 || depsMap.has(void 0)) {\n        run(depsMap.get(key));\n      }\n      if (isArrayIndex) {\n        run(depsMap.get(ARRAY_ITERATE_KEY));\n      }\n      switch (type) {\n        case \"add\":\n          if (!targetIsArray) {\n            run(depsMap.get(ITERATE_KEY));\n            if (isMap(target)) {\n              run(depsMap.get(MAP_KEY_ITERATE_KEY));\n            }\n          } else if (isArrayIndex) {\n            run(depsMap.get(\"length\"));\n          }\n          break;\n        case \"delete\":\n          if (!targetIsArray) {\n            run(depsMap.get(ITERATE_KEY));\n            if (isMap(target)) {\n              run(depsMap.get(MAP_KEY_ITERATE_KEY));\n            }\n          }\n          break;\n        case \"set\":\n          if (isMap(target)) {\n            run(depsMap.get(ITERATE_KEY));\n          }\n          break;\n      }\n    }\n  }\n  endBatch();\n}\nfunction getDepFromReactive(object, key) {\n  const depMap = targetMap.get(object);\n  return depMap && depMap.get(key);\n}\n\nfunction reactiveReadArray(array) {\n  const raw = toRaw(array);\n  if (raw === array) return raw;\n  track(raw, \"iterate\", ARRAY_ITERATE_KEY);\n  return isShallow(array) ? raw : raw.map(toReactive);\n}\nfunction shallowReadArray(arr) {\n  track(arr = toRaw(arr), \"iterate\", ARRAY_ITERATE_KEY);\n  return arr;\n}\nconst arrayInstrumentations = {\n  __proto__: null,\n  [Symbol.iterator]() {\n    return iterator(this, Symbol.iterator, toReactive);\n  },\n  concat(...args) {\n    return reactiveReadArray(this).concat(\n      ...args.map((x) => isArray(x) ? reactiveReadArray(x) : x)\n    );\n  },\n  entries() {\n    return iterator(this, \"entries\", (value) => {\n      value[1] = toReactive(value[1]);\n      return value;\n    });\n  },\n  every(fn, thisArg) {\n    return apply(this, \"every\", fn, thisArg, void 0, arguments);\n  },\n  filter(fn, thisArg) {\n    return apply(this, \"filter\", fn, thisArg, (v) => v.map(toReactive), arguments);\n  },\n  find(fn, thisArg) {\n    return apply(this, \"find\", fn, thisArg, toReactive, arguments);\n  },\n  findIndex(fn, thisArg) {\n    return apply(this, \"findIndex\", fn, thisArg, void 0, arguments);\n  },\n  findLast(fn, thisArg) {\n    return apply(this, \"findLast\", fn, thisArg, toReactive, arguments);\n  },\n  findLastIndex(fn, thisArg) {\n    return apply(this, \"findLastIndex\", fn, thisArg, void 0, arguments);\n  },\n  // flat, flatMap could benefit from ARRAY_ITERATE but are not straight-forward to implement\n  forEach(fn, thisArg) {\n    return apply(this, \"forEach\", fn, thisArg, void 0, arguments);\n  },\n  includes(...args) {\n    return searchProxy(this, \"includes\", args);\n  },\n  indexOf(...args) {\n    return searchProxy(this, \"indexOf\", args);\n  },\n  join(separator) {\n    return reactiveReadArray(this).join(separator);\n  },\n  // keys() iterator only reads `length`, no optimisation required\n  lastIndexOf(...args) {\n    return searchProxy(this, \"lastIndexOf\", args);\n  },\n  map(fn, thisArg) {\n    return apply(this, \"map\", fn, thisArg, void 0, arguments);\n  },\n  pop() {\n    return noTracking(this, \"pop\");\n  },\n  push(...args) {\n    return noTracking(this, \"push\", args);\n  },\n  reduce(fn, ...args) {\n    return reduce(this, \"reduce\", fn, args);\n  },\n  reduceRight(fn, ...args) {\n    return reduce(this, \"reduceRight\", fn, args);\n  },\n  shift() {\n    return noTracking(this, \"shift\");\n  },\n  // slice could use ARRAY_ITERATE but also seems to beg for range tracking\n  some(fn, thisArg) {\n    return apply(this, \"some\", fn, thisArg, void 0, arguments);\n  },\n  splice(...args) {\n    return noTracking(this, \"splice\", args);\n  },\n  toReversed() {\n    return reactiveReadArray(this).toReversed();\n  },\n  toSorted(comparer) {\n    return reactiveReadArray(this).toSorted(comparer);\n  },\n  toSpliced(...args) {\n    return reactiveReadArray(this).toSpliced(...args);\n  },\n  unshift(...args) {\n    return noTracking(this, \"unshift\", args);\n  },\n  values() {\n    return iterator(this, \"values\", toReactive);\n  }\n};\nfunction iterator(self, method, wrapValue) {\n  const arr = shallowReadArray(self);\n  const iter = arr[method]();\n  if (arr !== self && !isShallow(self)) {\n    iter._next = iter.next;\n    iter.next = () => {\n      const result = iter._next();\n      if (result.value) {\n        result.value = wrapValue(result.value);\n      }\n      return result;\n    };\n  }\n  return iter;\n}\nconst arrayProto = Array.prototype;\nfunction apply(self, method, fn, thisArg, wrappedRetFn, args) {\n  const arr = shallowReadArray(self);\n  const needsWrap = arr !== self && !isShallow(self);\n  const methodFn = arr[method];\n  if (methodFn !== arrayProto[method]) {\n    const result2 = methodFn.apply(self, args);\n    return needsWrap ? toReactive(result2) : result2;\n  }\n  let wrappedFn = fn;\n  if (arr !== self) {\n    if (needsWrap) {\n      wrappedFn = function(item, index) {\n        return fn.call(this, toReactive(item), index, self);\n      };\n    } else if (fn.length > 2) {\n      wrappedFn = function(item, index) {\n        return fn.call(this, item, index, self);\n      };\n    }\n  }\n  const result = methodFn.call(arr, wrappedFn, thisArg);\n  return needsWrap && wrappedRetFn ? wrappedRetFn(result) : result;\n}\nfunction reduce(self, method, fn, args) {\n  const arr = shallowReadArray(self);\n  let wrappedFn = fn;\n  if (arr !== self) {\n    if (!isShallow(self)) {\n      wrappedFn = function(acc, item, index) {\n        return fn.call(this, acc, toReactive(item), index, self);\n      };\n    } else if (fn.length > 3) {\n      wrappedFn = function(acc, item, index) {\n        return fn.call(this, acc, item, index, self);\n      };\n    }\n  }\n  return arr[method](wrappedFn, ...args);\n}\nfunction searchProxy(self, method, args) {\n  const arr = toRaw(self);\n  track(arr, \"iterate\", ARRAY_ITERATE_KEY);\n  const res = arr[method](...args);\n  if ((res === -1 || res === false) && isProxy(args[0])) {\n    args[0] = toRaw(args[0]);\n    return arr[method](...args);\n  }\n  return res;\n}\nfunction noTracking(self, method, args = []) {\n  pauseTracking();\n  startBatch();\n  const res = toRaw(self)[method].apply(self, args);\n  endBatch();\n  resetTracking();\n  return res;\n}\n\nconst isNonTrackableKeys = /* @__PURE__ */ makeMap(`__proto__,__v_isRef,__isVue`);\nconst builtInSymbols = new Set(\n  /* @__PURE__ */ Object.getOwnPropertyNames(Symbol).filter((key) => key !== \"arguments\" && key !== \"caller\").map((key) => Symbol[key]).filter(isSymbol)\n);\nfunction hasOwnProperty(key) {\n  if (!isSymbol(key)) key = String(key);\n  const obj = toRaw(this);\n  track(obj, \"has\", key);\n  return obj.hasOwnProperty(key);\n}\nclass BaseReactiveHandler {\n  constructor(_isReadonly = false, _isShallow = false) {\n    this._isReadonly = _isReadonly;\n    this._isShallow = _isShallow;\n  }\n  get(target, key, receiver) {\n    if (key === \"__v_skip\") return target[\"__v_skip\"];\n    const isReadonly2 = this._isReadonly, isShallow2 = this._isShallow;\n    if (key === \"__v_isReactive\") {\n      return !isReadonly2;\n    } else if (key === \"__v_isReadonly\") {\n      return isReadonly2;\n    } else if (key === \"__v_isShallow\") {\n      return isShallow2;\n    } else if (key === \"__v_raw\") {\n      if (receiver === (isReadonly2 ? isShallow2 ? shallowReadonlyMap : readonlyMap : isShallow2 ? shallowReactiveMap : reactiveMap).get(target) || // receiver is not the reactive proxy, but has the same prototype\n      // this means the receiver is a user proxy of the reactive proxy\n      Object.getPrototypeOf(target) === Object.getPrototypeOf(receiver)) {\n        return target;\n      }\n      return;\n    }\n    const targetIsArray = isArray(target);\n    if (!isReadonly2) {\n      let fn;\n      if (targetIsArray && (fn = arrayInstrumentations[key])) {\n        return fn;\n      }\n      if (key === \"hasOwnProperty\") {\n        return hasOwnProperty;\n      }\n    }\n    const res = Reflect.get(\n      target,\n      key,\n      // if this is a proxy wrapping a ref, return methods using the raw ref\n      // as receiver so that we don't have to call `toRaw` on the ref in all\n      // its class methods\n      isRef(target) ? target : receiver\n    );\n    if (isSymbol(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key)) {\n      return res;\n    }\n    if (!isReadonly2) {\n      track(target, \"get\", key);\n    }\n    if (isShallow2) {\n      return res;\n    }\n    if (isRef(res)) {\n      return targetIsArray && isIntegerKey(key) ? res : res.value;\n    }\n    if (isObject(res)) {\n      return isReadonly2 ? readonly(res) : reactive(res);\n    }\n    return res;\n  }\n}\nclass MutableReactiveHandler extends BaseReactiveHandler {\n  constructor(isShallow2 = false) {\n    super(false, isShallow2);\n  }\n  set(target, key, value, receiver) {\n    let oldValue = target[key];\n    if (!this._isShallow) {\n      const isOldValueReadonly = isReadonly(oldValue);\n      if (!isShallow(value) && !isReadonly(value)) {\n        oldValue = toRaw(oldValue);\n        value = toRaw(value);\n      }\n      if (!isArray(target) && isRef(oldValue) && !isRef(value)) {\n        if (isOldValueReadonly) {\n          return false;\n        } else {\n          oldValue.value = value;\n          return true;\n        }\n      }\n    }\n    const hadKey = isArray(target) && isIntegerKey(key) ? Number(key) < target.length : hasOwn(target, key);\n    const result = Reflect.set(\n      target,\n      key,\n      value,\n      isRef(target) ? target : receiver\n    );\n    if (target === toRaw(receiver)) {\n      if (!hadKey) {\n        trigger(target, \"add\", key, value);\n      } else if (hasChanged(value, oldValue)) {\n        trigger(target, \"set\", key, value, oldValue);\n      }\n    }\n    return result;\n  }\n  deleteProperty(target, key) {\n    const hadKey = hasOwn(target, key);\n    const oldValue = target[key];\n    const result = Reflect.deleteProperty(target, key);\n    if (result && hadKey) {\n      trigger(target, \"delete\", key, void 0, oldValue);\n    }\n    return result;\n  }\n  has(target, key) {\n    const result = Reflect.has(target, key);\n    if (!isSymbol(key) || !builtInSymbols.has(key)) {\n      track(target, \"has\", key);\n    }\n    return result;\n  }\n  ownKeys(target) {\n    track(\n      target,\n      \"iterate\",\n      isArray(target) ? \"length\" : ITERATE_KEY\n    );\n    return Reflect.ownKeys(target);\n  }\n}\nclass ReadonlyReactiveHandler extends BaseReactiveHandler {\n  constructor(isShallow2 = false) {\n    super(true, isShallow2);\n  }\n  set(target, key) {\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      warn(\n        `Set operation on key \"${String(key)}\" failed: target is readonly.`,\n        target\n      );\n    }\n    return true;\n  }\n  deleteProperty(target, key) {\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      warn(\n        `Delete operation on key \"${String(key)}\" failed: target is readonly.`,\n        target\n      );\n    }\n    return true;\n  }\n}\nconst mutableHandlers = /* @__PURE__ */ new MutableReactiveHandler();\nconst readonlyHandlers = /* @__PURE__ */ new ReadonlyReactiveHandler();\nconst shallowReactiveHandlers = /* @__PURE__ */ new MutableReactiveHandler(true);\nconst shallowReadonlyHandlers = /* @__PURE__ */ new ReadonlyReactiveHandler(true);\n\nconst toShallow = (value) => value;\nconst getProto = (v) => Reflect.getPrototypeOf(v);\nfunction createIterableMethod(method, isReadonly2, isShallow2) {\n  return function(...args) {\n    const target = this[\"__v_raw\"];\n    const rawTarget = toRaw(target);\n    const targetIsMap = isMap(rawTarget);\n    const isPair = method === \"entries\" || method === Symbol.iterator && targetIsMap;\n    const isKeyOnly = method === \"keys\" && targetIsMap;\n    const innerIterator = target[method](...args);\n    const wrap = isShallow2 ? toShallow : isReadonly2 ? toReadonly : toReactive;\n    !isReadonly2 && track(\n      rawTarget,\n      \"iterate\",\n      isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY\n    );\n    return {\n      // iterator protocol\n      next() {\n        const { value, done } = innerIterator.next();\n        return done ? { value, done } : {\n          value: isPair ? [wrap(value[0]), wrap(value[1])] : wrap(value),\n          done\n        };\n      },\n      // iterable protocol\n      [Symbol.iterator]() {\n        return this;\n      }\n    };\n  };\n}\nfunction createReadonlyMethod(type) {\n  return function(...args) {\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      const key = args[0] ? `on key \"${args[0]}\" ` : ``;\n      warn(\n        `${capitalize(type)} operation ${key}failed: target is readonly.`,\n        toRaw(this)\n      );\n    }\n    return type === \"delete\" ? false : type === \"clear\" ? void 0 : this;\n  };\n}\nfunction createInstrumentations(readonly, shallow) {\n  const instrumentations = {\n    get(key) {\n      const target = this[\"__v_raw\"];\n      const rawTarget = toRaw(target);\n      const rawKey = toRaw(key);\n      if (!readonly) {\n        if (hasChanged(key, rawKey)) {\n          track(rawTarget, \"get\", key);\n        }\n        track(rawTarget, \"get\", rawKey);\n      }\n      const { has } = getProto(rawTarget);\n      const wrap = shallow ? toShallow : readonly ? toReadonly : toReactive;\n      if (has.call(rawTarget, key)) {\n        return wrap(target.get(key));\n      } else if (has.call(rawTarget, rawKey)) {\n        return wrap(target.get(rawKey));\n      } else if (target !== rawTarget) {\n        target.get(key);\n      }\n    },\n    get size() {\n      const target = this[\"__v_raw\"];\n      !readonly && track(toRaw(target), \"iterate\", ITERATE_KEY);\n      return Reflect.get(target, \"size\", target);\n    },\n    has(key) {\n      const target = this[\"__v_raw\"];\n      const rawTarget = toRaw(target);\n      const rawKey = toRaw(key);\n      if (!readonly) {\n        if (hasChanged(key, rawKey)) {\n          track(rawTarget, \"has\", key);\n        }\n        track(rawTarget, \"has\", rawKey);\n      }\n      return key === rawKey ? target.has(key) : target.has(key) || target.has(rawKey);\n    },\n    forEach(callback, thisArg) {\n      const observed = this;\n      const target = observed[\"__v_raw\"];\n      const rawTarget = toRaw(target);\n      const wrap = shallow ? toShallow : readonly ? toReadonly : toReactive;\n      !readonly && track(rawTarget, \"iterate\", ITERATE_KEY);\n      return target.forEach((value, key) => {\n        return callback.call(thisArg, wrap(value), wrap(key), observed);\n      });\n    }\n  };\n  extend(\n    instrumentations,\n    readonly ? {\n      add: createReadonlyMethod(\"add\"),\n      set: createReadonlyMethod(\"set\"),\n      delete: createReadonlyMethod(\"delete\"),\n      clear: createReadonlyMethod(\"clear\")\n    } : {\n      add(value) {\n        if (!shallow && !isShallow(value) && !isReadonly(value)) {\n          value = toRaw(value);\n        }\n        const target = toRaw(this);\n        const proto = getProto(target);\n        const hadKey = proto.has.call(target, value);\n        if (!hadKey) {\n          target.add(value);\n          trigger(target, \"add\", value, value);\n        }\n        return this;\n      },\n      set(key, value) {\n        if (!shallow && !isShallow(value) && !isReadonly(value)) {\n          value = toRaw(value);\n        }\n        const target = toRaw(this);\n        const { has, get } = getProto(target);\n        let hadKey = has.call(target, key);\n        if (!hadKey) {\n          key = toRaw(key);\n          hadKey = has.call(target, key);\n        } else if (!!(process.env.NODE_ENV !== \"production\")) {\n          checkIdentityKeys(target, has, key);\n        }\n        const oldValue = get.call(target, key);\n        target.set(key, value);\n        if (!hadKey) {\n          trigger(target, \"add\", key, value);\n        } else if (hasChanged(value, oldValue)) {\n          trigger(target, \"set\", key, value, oldValue);\n        }\n        return this;\n      },\n      delete(key) {\n        const target = toRaw(this);\n        const { has, get } = getProto(target);\n        let hadKey = has.call(target, key);\n        if (!hadKey) {\n          key = toRaw(key);\n          hadKey = has.call(target, key);\n        } else if (!!(process.env.NODE_ENV !== \"production\")) {\n          checkIdentityKeys(target, has, key);\n        }\n        const oldValue = get ? get.call(target, key) : void 0;\n        const result = target.delete(key);\n        if (hadKey) {\n          trigger(target, \"delete\", key, void 0, oldValue);\n        }\n        return result;\n      },\n      clear() {\n        const target = toRaw(this);\n        const hadItems = target.size !== 0;\n        const oldTarget = !!(process.env.NODE_ENV !== \"production\") ? isMap(target) ? new Map(target) : new Set(target) : void 0;\n        const result = target.clear();\n        if (hadItems) {\n          trigger(\n            target,\n            \"clear\",\n            void 0,\n            void 0,\n            oldTarget\n          );\n        }\n        return result;\n      }\n    }\n  );\n  const iteratorMethods = [\n    \"keys\",\n    \"values\",\n    \"entries\",\n    Symbol.iterator\n  ];\n  iteratorMethods.forEach((method) => {\n    instrumentations[method] = createIterableMethod(method, readonly, shallow);\n  });\n  return instrumentations;\n}\nfunction createInstrumentationGetter(isReadonly2, shallow) {\n  const instrumentations = createInstrumentations(isReadonly2, shallow);\n  return (target, key, receiver) => {\n    if (key === \"__v_isReactive\") {\n      return !isReadonly2;\n    } else if (key === \"__v_isReadonly\") {\n      return isReadonly2;\n    } else if (key === \"__v_raw\") {\n      return target;\n    }\n    return Reflect.get(\n      hasOwn(instrumentations, key) && key in target ? instrumentations : target,\n      key,\n      receiver\n    );\n  };\n}\nconst mutableCollectionHandlers = {\n  get: /* @__PURE__ */ createInstrumentationGetter(false, false)\n};\nconst shallowCollectionHandlers = {\n  get: /* @__PURE__ */ createInstrumentationGetter(false, true)\n};\nconst readonlyCollectionHandlers = {\n  get: /* @__PURE__ */ createInstrumentationGetter(true, false)\n};\nconst shallowReadonlyCollectionHandlers = {\n  get: /* @__PURE__ */ createInstrumentationGetter(true, true)\n};\nfunction checkIdentityKeys(target, has, key) {\n  const rawKey = toRaw(key);\n  if (rawKey !== key && has.call(target, rawKey)) {\n    const type = toRawType(target);\n    warn(\n      `Reactive ${type} contains both the raw and reactive versions of the same object${type === `Map` ? ` as keys` : ``}, which can lead to inconsistencies. Avoid differentiating between the raw and reactive versions of an object and only use the reactive version if possible.`\n    );\n  }\n}\n\nconst reactiveMap = /* @__PURE__ */ new WeakMap();\nconst shallowReactiveMap = /* @__PURE__ */ new WeakMap();\nconst readonlyMap = /* @__PURE__ */ new WeakMap();\nconst shallowReadonlyMap = /* @__PURE__ */ new WeakMap();\nfunction targetTypeMap(rawType) {\n  switch (rawType) {\n    case \"Object\":\n    case \"Array\":\n      return 1 /* COMMON */;\n    case \"Map\":\n    case \"Set\":\n    case \"WeakMap\":\n    case \"WeakSet\":\n      return 2 /* COLLECTION */;\n    default:\n      return 0 /* INVALID */;\n  }\n}\nfunction getTargetType(value) {\n  return value[\"__v_skip\"] || !Object.isExtensible(value) ? 0 /* INVALID */ : targetTypeMap(toRawType(value));\n}\nfunction reactive(target) {\n  if (isReadonly(target)) {\n    return target;\n  }\n  return createReactiveObject(\n    target,\n    false,\n    mutableHandlers,\n    mutableCollectionHandlers,\n    reactiveMap\n  );\n}\nfunction shallowReactive(target) {\n  return createReactiveObject(\n    target,\n    false,\n    shallowReactiveHandlers,\n    shallowCollectionHandlers,\n    shallowReactiveMap\n  );\n}\nfunction readonly(target) {\n  return createReactiveObject(\n    target,\n    true,\n    readonlyHandlers,\n    readonlyCollectionHandlers,\n    readonlyMap\n  );\n}\nfunction shallowReadonly(target) {\n  return createReactiveObject(\n    target,\n    true,\n    shallowReadonlyHandlers,\n    shallowReadonlyCollectionHandlers,\n    shallowReadonlyMap\n  );\n}\nfunction createReactiveObject(target, isReadonly2, baseHandlers, collectionHandlers, proxyMap) {\n  if (!isObject(target)) {\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      warn(\n        `value cannot be made ${isReadonly2 ? \"readonly\" : \"reactive\"}: ${String(\n          target\n        )}`\n      );\n    }\n    return target;\n  }\n  if (target[\"__v_raw\"] && !(isReadonly2 && target[\"__v_isReactive\"])) {\n    return target;\n  }\n  const targetType = getTargetType(target);\n  if (targetType === 0 /* INVALID */) {\n    return target;\n  }\n  const existingProxy = proxyMap.get(target);\n  if (existingProxy) {\n    return existingProxy;\n  }\n  const proxy = new Proxy(\n    target,\n    targetType === 2 /* COLLECTION */ ? collectionHandlers : baseHandlers\n  );\n  proxyMap.set(target, proxy);\n  return proxy;\n}\nfunction isReactive(value) {\n  if (isReadonly(value)) {\n    return isReactive(value[\"__v_raw\"]);\n  }\n  return !!(value && value[\"__v_isReactive\"]);\n}\nfunction isReadonly(value) {\n  return !!(value && value[\"__v_isReadonly\"]);\n}\nfunction isShallow(value) {\n  return !!(value && value[\"__v_isShallow\"]);\n}\nfunction isProxy(value) {\n  return value ? !!value[\"__v_raw\"] : false;\n}\nfunction toRaw(observed) {\n  const raw = observed && observed[\"__v_raw\"];\n  return raw ? toRaw(raw) : observed;\n}\nfunction markRaw(value) {\n  if (!hasOwn(value, \"__v_skip\") && Object.isExtensible(value)) {\n    def(value, \"__v_skip\", true);\n  }\n  return value;\n}\nconst toReactive = (value) => isObject(value) ? reactive(value) : value;\nconst toReadonly = (value) => isObject(value) ? readonly(value) : value;\n\nfunction isRef(r) {\n  return r ? r[\"__v_isRef\"] === true : false;\n}\nfunction ref(value) {\n  return createRef(value, false);\n}\nfunction shallowRef(value) {\n  return createRef(value, true);\n}\nfunction createRef(rawValue, shallow) {\n  if (isRef(rawValue)) {\n    return rawValue;\n  }\n  return new RefImpl(rawValue, shallow);\n}\nclass RefImpl {\n  constructor(value, isShallow2) {\n    this.dep = new Dep();\n    this[\"__v_isRef\"] = true;\n    this[\"__v_isShallow\"] = false;\n    this._rawValue = isShallow2 ? value : toRaw(value);\n    this._value = isShallow2 ? value : toReactive(value);\n    this[\"__v_isShallow\"] = isShallow2;\n  }\n  get value() {\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      this.dep.track({\n        target: this,\n        type: \"get\",\n        key: \"value\"\n      });\n    } else {\n      this.dep.track();\n    }\n    return this._value;\n  }\n  set value(newValue) {\n    const oldValue = this._rawValue;\n    const useDirectValue = this[\"__v_isShallow\"] || isShallow(newValue) || isReadonly(newValue);\n    newValue = useDirectValue ? newValue : toRaw(newValue);\n    if (hasChanged(newValue, oldValue)) {\n      this._rawValue = newValue;\n      this._value = useDirectValue ? newValue : toReactive(newValue);\n      if (!!(process.env.NODE_ENV !== \"production\")) {\n        this.dep.trigger({\n          target: this,\n          type: \"set\",\n          key: \"value\",\n          newValue,\n          oldValue\n        });\n      } else {\n        this.dep.trigger();\n      }\n    }\n  }\n}\nfunction triggerRef(ref2) {\n  if (ref2.dep) {\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      ref2.dep.trigger({\n        target: ref2,\n        type: \"set\",\n        key: \"value\",\n        newValue: ref2._value\n      });\n    } else {\n      ref2.dep.trigger();\n    }\n  }\n}\nfunction unref(ref2) {\n  return isRef(ref2) ? ref2.value : ref2;\n}\nfunction toValue(source) {\n  return isFunction(source) ? source() : unref(source);\n}\nconst shallowUnwrapHandlers = {\n  get: (target, key, receiver) => key === \"__v_raw\" ? target : unref(Reflect.get(target, key, receiver)),\n  set: (target, key, value, receiver) => {\n    const oldValue = target[key];\n    if (isRef(oldValue) && !isRef(value)) {\n      oldValue.value = value;\n      return true;\n    } else {\n      return Reflect.set(target, key, value, receiver);\n    }\n  }\n};\nfunction proxyRefs(objectWithRefs) {\n  return isReactive(objectWithRefs) ? objectWithRefs : new Proxy(objectWithRefs, shallowUnwrapHandlers);\n}\nclass CustomRefImpl {\n  constructor(factory) {\n    this[\"__v_isRef\"] = true;\n    this._value = void 0;\n    const dep = this.dep = new Dep();\n    const { get, set } = factory(dep.track.bind(dep), dep.trigger.bind(dep));\n    this._get = get;\n    this._set = set;\n  }\n  get value() {\n    return this._value = this._get();\n  }\n  set value(newVal) {\n    this._set(newVal);\n  }\n}\nfunction customRef(factory) {\n  return new CustomRefImpl(factory);\n}\nfunction toRefs(object) {\n  if (!!(process.env.NODE_ENV !== \"production\") && !isProxy(object)) {\n    warn(`toRefs() expects a reactive object but received a plain one.`);\n  }\n  const ret = isArray(object) ? new Array(object.length) : {};\n  for (const key in object) {\n    ret[key] = propertyToRef(object, key);\n  }\n  return ret;\n}\nclass ObjectRefImpl {\n  constructor(_object, _key, _defaultValue) {\n    this._object = _object;\n    this._key = _key;\n    this._defaultValue = _defaultValue;\n    this[\"__v_isRef\"] = true;\n    this._value = void 0;\n  }\n  get value() {\n    const val = this._object[this._key];\n    return this._value = val === void 0 ? this._defaultValue : val;\n  }\n  set value(newVal) {\n    this._object[this._key] = newVal;\n  }\n  get dep() {\n    return getDepFromReactive(toRaw(this._object), this._key);\n  }\n}\nclass GetterRefImpl {\n  constructor(_getter) {\n    this._getter = _getter;\n    this[\"__v_isRef\"] = true;\n    this[\"__v_isReadonly\"] = true;\n    this._value = void 0;\n  }\n  get value() {\n    return this._value = this._getter();\n  }\n}\nfunction toRef(source, key, defaultValue) {\n  if (isRef(source)) {\n    return source;\n  } else if (isFunction(source)) {\n    return new GetterRefImpl(source);\n  } else if (isObject(source) && arguments.length > 1) {\n    return propertyToRef(source, key, defaultValue);\n  } else {\n    return ref(source);\n  }\n}\nfunction propertyToRef(source, key, defaultValue) {\n  const val = source[key];\n  return isRef(val) ? val : new ObjectRefImpl(source, key, defaultValue);\n}\n\nclass ComputedRefImpl {\n  constructor(fn, setter, isSSR) {\n    this.fn = fn;\n    this.setter = setter;\n    /**\n     * @internal\n     */\n    this._value = void 0;\n    /**\n     * @internal\n     */\n    this.dep = new Dep(this);\n    /**\n     * @internal\n     */\n    this.__v_isRef = true;\n    // TODO isolatedDeclarations \"__v_isReadonly\"\n    // A computed is also a subscriber that tracks other deps\n    /**\n     * @internal\n     */\n    this.deps = void 0;\n    /**\n     * @internal\n     */\n    this.depsTail = void 0;\n    /**\n     * @internal\n     */\n    this.flags = 16;\n    /**\n     * @internal\n     */\n    this.globalVersion = globalVersion - 1;\n    /**\n     * @internal\n     */\n    this.next = void 0;\n    // for backwards compat\n    this.effect = this;\n    this[\"__v_isReadonly\"] = !setter;\n    this.isSSR = isSSR;\n  }\n  /**\n   * @internal\n   */\n  notify() {\n    this.flags |= 16;\n    if (!(this.flags & 8) && // avoid infinite self recursion\n    activeSub !== this) {\n      batch(this, true);\n      return true;\n    } else if (!!(process.env.NODE_ENV !== \"production\")) ;\n  }\n  get value() {\n    const link = !!(process.env.NODE_ENV !== \"production\") ? this.dep.track({\n      target: this,\n      type: \"get\",\n      key: \"value\"\n    }) : this.dep.track();\n    refreshComputed(this);\n    if (link) {\n      link.version = this.dep.version;\n    }\n    return this._value;\n  }\n  set value(newValue) {\n    if (this.setter) {\n      this.setter(newValue);\n    } else if (!!(process.env.NODE_ENV !== \"production\")) {\n      warn(\"Write operation failed: computed value is readonly\");\n    }\n  }\n}\nfunction computed(getterOrOptions, debugOptions, isSSR = false) {\n  let getter;\n  let setter;\n  if (isFunction(getterOrOptions)) {\n    getter = getterOrOptions;\n  } else {\n    getter = getterOrOptions.get;\n    setter = getterOrOptions.set;\n  }\n  const cRef = new ComputedRefImpl(getter, setter, isSSR);\n  if (!!(process.env.NODE_ENV !== \"production\") && debugOptions && !isSSR) {\n    cRef.onTrack = debugOptions.onTrack;\n    cRef.onTrigger = debugOptions.onTrigger;\n  }\n  return cRef;\n}\n\nconst TrackOpTypes = {\n  \"GET\": \"get\",\n  \"HAS\": \"has\",\n  \"ITERATE\": \"iterate\"\n};\nconst TriggerOpTypes = {\n  \"SET\": \"set\",\n  \"ADD\": \"add\",\n  \"DELETE\": \"delete\",\n  \"CLEAR\": \"clear\"\n};\nconst ReactiveFlags = {\n  \"SKIP\": \"__v_skip\",\n  \"IS_REACTIVE\": \"__v_isReactive\",\n  \"IS_READONLY\": \"__v_isReadonly\",\n  \"IS_SHALLOW\": \"__v_isShallow\",\n  \"RAW\": \"__v_raw\",\n  \"IS_REF\": \"__v_isRef\"\n};\n\nconst WatchErrorCodes = {\n  \"WATCH_GETTER\": 2,\n  \"2\": \"WATCH_GETTER\",\n  \"WATCH_CALLBACK\": 3,\n  \"3\": \"WATCH_CALLBACK\",\n  \"WATCH_CLEANUP\": 4,\n  \"4\": \"WATCH_CLEANUP\"\n};\nconst INITIAL_WATCHER_VALUE = {};\nconst cleanupMap = /* @__PURE__ */ new WeakMap();\nlet activeWatcher = void 0;\nfunction getCurrentWatcher() {\n  return activeWatcher;\n}\nfunction onWatcherCleanup(cleanupFn, failSilently = false, owner = activeWatcher) {\n  if (owner) {\n    let cleanups = cleanupMap.get(owner);\n    if (!cleanups) cleanupMap.set(owner, cleanups = []);\n    cleanups.push(cleanupFn);\n  } else if (!!(process.env.NODE_ENV !== \"production\") && !failSilently) {\n    warn(\n      `onWatcherCleanup() was called when there was no active watcher to associate with.`\n    );\n  }\n}\nfunction watch(source, cb, options = EMPTY_OBJ) {\n  const { immediate, deep, once, scheduler, augmentJob, call } = options;\n  const warnInvalidSource = (s) => {\n    (options.onWarn || warn)(\n      `Invalid watch source: `,\n      s,\n      `A watch source can only be a getter/effect function, a ref, a reactive object, or an array of these types.`\n    );\n  };\n  const reactiveGetter = (source2) => {\n    if (deep) return source2;\n    if (isShallow(source2) || deep === false || deep === 0)\n      return traverse(source2, 1);\n    return traverse(source2);\n  };\n  let effect;\n  let getter;\n  let cleanup;\n  let boundCleanup;\n  let forceTrigger = false;\n  let isMultiSource = false;\n  if (isRef(source)) {\n    getter = () => source.value;\n    forceTrigger = isShallow(source);\n  } else if (isReactive(source)) {\n    getter = () => reactiveGetter(source);\n    forceTrigger = true;\n  } else if (isArray(source)) {\n    isMultiSource = true;\n    forceTrigger = source.some((s) => isReactive(s) || isShallow(s));\n    getter = () => source.map((s) => {\n      if (isRef(s)) {\n        return s.value;\n      } else if (isReactive(s)) {\n        return reactiveGetter(s);\n      } else if (isFunction(s)) {\n        return call ? call(s, 2) : s();\n      } else {\n        !!(process.env.NODE_ENV !== \"production\") && warnInvalidSource(s);\n      }\n    });\n  } else if (isFunction(source)) {\n    if (cb) {\n      getter = call ? () => call(source, 2) : source;\n    } else {\n      getter = () => {\n        if (cleanup) {\n          pauseTracking();\n          try {\n            cleanup();\n          } finally {\n            resetTracking();\n          }\n        }\n        const currentEffect = activeWatcher;\n        activeWatcher = effect;\n        try {\n          return call ? call(source, 3, [boundCleanup]) : source(boundCleanup);\n        } finally {\n          activeWatcher = currentEffect;\n        }\n      };\n    }\n  } else {\n    getter = NOOP;\n    !!(process.env.NODE_ENV !== \"production\") && warnInvalidSource(source);\n  }\n  if (cb && deep) {\n    const baseGetter = getter;\n    const depth = deep === true ? Infinity : deep;\n    getter = () => traverse(baseGetter(), depth);\n  }\n  const scope = getCurrentScope();\n  const watchHandle = () => {\n    effect.stop();\n    if (scope && scope.active) {\n      remove(scope.effects, effect);\n    }\n  };\n  if (once && cb) {\n    const _cb = cb;\n    cb = (...args) => {\n      _cb(...args);\n      watchHandle();\n    };\n  }\n  let oldValue = isMultiSource ? new Array(source.length).fill(INITIAL_WATCHER_VALUE) : INITIAL_WATCHER_VALUE;\n  const job = (immediateFirstRun) => {\n    if (!(effect.flags & 1) || !effect.dirty && !immediateFirstRun) {\n      return;\n    }\n    if (cb) {\n      const newValue = effect.run();\n      if (deep || forceTrigger || (isMultiSource ? newValue.some((v, i) => hasChanged(v, oldValue[i])) : hasChanged(newValue, oldValue))) {\n        if (cleanup) {\n          cleanup();\n        }\n        const currentWatcher = activeWatcher;\n        activeWatcher = effect;\n        try {\n          const args = [\n            newValue,\n            // pass undefined as the old value when it's changed for the first time\n            oldValue === INITIAL_WATCHER_VALUE ? void 0 : isMultiSource && oldValue[0] === INITIAL_WATCHER_VALUE ? [] : oldValue,\n            boundCleanup\n          ];\n          oldValue = newValue;\n          call ? call(cb, 3, args) : (\n            // @ts-expect-error\n            cb(...args)\n          );\n        } finally {\n          activeWatcher = currentWatcher;\n        }\n      }\n    } else {\n      effect.run();\n    }\n  };\n  if (augmentJob) {\n    augmentJob(job);\n  }\n  effect = new ReactiveEffect(getter);\n  effect.scheduler = scheduler ? () => scheduler(job, false) : job;\n  boundCleanup = (fn) => onWatcherCleanup(fn, false, effect);\n  cleanup = effect.onStop = () => {\n    const cleanups = cleanupMap.get(effect);\n    if (cleanups) {\n      if (call) {\n        call(cleanups, 4);\n      } else {\n        for (const cleanup2 of cleanups) cleanup2();\n      }\n      cleanupMap.delete(effect);\n    }\n  };\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    effect.onTrack = options.onTrack;\n    effect.onTrigger = options.onTrigger;\n  }\n  if (cb) {\n    if (immediate) {\n      job(true);\n    } else {\n      oldValue = effect.run();\n    }\n  } else if (scheduler) {\n    scheduler(job.bind(null, true), true);\n  } else {\n    effect.run();\n  }\n  watchHandle.pause = effect.pause.bind(effect);\n  watchHandle.resume = effect.resume.bind(effect);\n  watchHandle.stop = watchHandle;\n  return watchHandle;\n}\nfunction traverse(value, depth = Infinity, seen) {\n  if (depth <= 0 || !isObject(value) || value[\"__v_skip\"]) {\n    return value;\n  }\n  seen = seen || /* @__PURE__ */ new Set();\n  if (seen.has(value)) {\n    return value;\n  }\n  seen.add(value);\n  depth--;\n  if (isRef(value)) {\n    traverse(value.value, depth, seen);\n  } else if (isArray(value)) {\n    for (let i = 0; i < value.length; i++) {\n      traverse(value[i], depth, seen);\n    }\n  } else if (isSet(value) || isMap(value)) {\n    value.forEach((v) => {\n      traverse(v, depth, seen);\n    });\n  } else if (isPlainObject(value)) {\n    for (const key in value) {\n      traverse(value[key], depth, seen);\n    }\n    for (const key of Object.getOwnPropertySymbols(value)) {\n      if (Object.prototype.propertyIsEnumerable.call(value, key)) {\n        traverse(value[key], depth, seen);\n      }\n    }\n  }\n  return value;\n}\n\nexport { ARRAY_ITERATE_KEY, EffectFlags, EffectScope, ITERATE_KEY, MAP_KEY_ITERATE_KEY, ReactiveEffect, ReactiveFlags, TrackOpTypes, TriggerOpTypes, WatchErrorCodes, computed, customRef, effect, effectScope, enableTracking, getCurrentScope, getCurrentWatcher, isProxy, isReactive, isReadonly, isRef, isShallow, markRaw, onEffectCleanup, onScopeDispose, onWatcherCleanup, pauseTracking, proxyRefs, reactive, reactiveReadArray, readonly, ref, resetTracking, shallowReactive, shallowReadArray, shallowReadonly, shallowRef, stop, toRaw, toReactive, toReadonly, toRef, toRefs, toValue, track, traverse, trigger, triggerRef, unref, watch };\n","/**\n* @vue/runtime-core v3.5.18\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/\nimport { pauseTracking, resetTracking, isRef, toRaw, traverse, shallowRef, readonly, isReactive, ref, isShallow, isReadonly, shallowReadArray, toReadonly, toReactive, shallowReadonly, track, reactive, shallowReactive, trigger, ReactiveEffect, watch as watch$1, customRef, isProxy, proxyRefs, markRaw, EffectScope, computed as computed$1 } from '@vue/reactivity';\nexport { EffectScope, ReactiveEffect, TrackOpTypes, TriggerOpTypes, customRef, effect, effectScope, getCurrentScope, getCurrentWatcher, isProxy, isReactive, isReadonly, isRef, isShallow, markRaw, onScopeDispose, onWatcherCleanup, proxyRefs, reactive, readonly, ref, shallowReactive, shallowReadonly, shallowRef, stop, toRaw, toRef, toRefs, toValue, triggerRef, unref } from '@vue/reactivity';\nimport { isString, isFunction, EMPTY_OBJ, isPromise, isArray, NOOP, getGlobalThis, extend, isBuiltInDirective, hasOwn, remove, def, isOn, isReservedProp, normalizeClass, stringifyStyle, normalizeStyle, isKnownSvgAttr, isBooleanAttr, isKnownHtmlAttr, includeBooleanAttr, isRenderableAttrValue, normalizeCssVarValue, getEscapedCssVarName, isObject, isRegExp, invokeArrayFns, toHandlerKey, camelize, capitalize, isSymbol, isGloballyAllowed, NO, EMPTY_ARR, hyphenate, makeMap, toRawType, hasChanged, looseToNumber, isModelListener, toNumber } from '@vue/shared';\nexport { camelize, capitalize, normalizeClass, normalizeProps, normalizeStyle, toDisplayString, toHandlerKey } from '@vue/shared';\n\nconst stack = [];\nfunction pushWarningContext(vnode) {\n  stack.push(vnode);\n}\nfunction popWarningContext() {\n  stack.pop();\n}\nlet isWarning = false;\nfunction warn$1(msg, ...args) {\n  if (isWarning) return;\n  isWarning = true;\n  pauseTracking();\n  const instance = stack.length ? stack[stack.length - 1].component : null;\n  const appWarnHandler = instance && instance.appContext.config.warnHandler;\n  const trace = getComponentTrace();\n  if (appWarnHandler) {\n    callWithErrorHandling(\n      appWarnHandler,\n      instance,\n      11,\n      [\n        // eslint-disable-next-line no-restricted-syntax\n        msg + args.map((a) => {\n          var _a, _b;\n          return (_b = (_a = a.toString) == null ? void 0 : _a.call(a)) != null ? _b : JSON.stringify(a);\n        }).join(\"\"),\n        instance && instance.proxy,\n        trace.map(\n          ({ vnode }) => `at <${formatComponentName(instance, vnode.type)}>`\n        ).join(\"\\n\"),\n        trace\n      ]\n    );\n  } else {\n    const warnArgs = [`[Vue warn]: ${msg}`, ...args];\n    if (trace.length && // avoid spamming console during tests\n    true) {\n      warnArgs.push(`\n`, ...formatTrace(trace));\n    }\n    console.warn(...warnArgs);\n  }\n  resetTracking();\n  isWarning = false;\n}\nfunction getComponentTrace() {\n  let currentVNode = stack[stack.length - 1];\n  if (!currentVNode) {\n    return [];\n  }\n  const normalizedStack = [];\n  while (currentVNode) {\n    const last = normalizedStack[0];\n    if (last && last.vnode === currentVNode) {\n      last.recurseCount++;\n    } else {\n      normalizedStack.push({\n        vnode: currentVNode,\n        recurseCount: 0\n      });\n    }\n    const parentInstance = currentVNode.component && currentVNode.component.parent;\n    currentVNode = parentInstance && parentInstance.vnode;\n  }\n  return normalizedStack;\n}\nfunction formatTrace(trace) {\n  const logs = [];\n  trace.forEach((entry, i) => {\n    logs.push(...i === 0 ? [] : [`\n`], ...formatTraceEntry(entry));\n  });\n  return logs;\n}\nfunction formatTraceEntry({ vnode, recurseCount }) {\n  const postfix = recurseCount > 0 ? `... (${recurseCount} recursive calls)` : ``;\n  const isRoot = vnode.component ? vnode.component.parent == null : false;\n  const open = ` at <${formatComponentName(\n    vnode.component,\n    vnode.type,\n    isRoot\n  )}`;\n  const close = `>` + postfix;\n  return vnode.props ? [open, ...formatProps(vnode.props), close] : [open + close];\n}\nfunction formatProps(props) {\n  const res = [];\n  const keys = Object.keys(props);\n  keys.slice(0, 3).forEach((key) => {\n    res.push(...formatProp(key, props[key]));\n  });\n  if (keys.length > 3) {\n    res.push(` ...`);\n  }\n  return res;\n}\nfunction formatProp(key, value, raw) {\n  if (isString(value)) {\n    value = JSON.stringify(value);\n    return raw ? value : [`${key}=${value}`];\n  } else if (typeof value === \"number\" || typeof value === \"boolean\" || value == null) {\n    return raw ? value : [`${key}=${value}`];\n  } else if (isRef(value)) {\n    value = formatProp(key, toRaw(value.value), true);\n    return raw ? value : [`${key}=Ref<`, value, `>`];\n  } else if (isFunction(value)) {\n    return [`${key}=fn${value.name ? `<${value.name}>` : ``}`];\n  } else {\n    value = toRaw(value);\n    return raw ? value : [`${key}=`, value];\n  }\n}\nfunction assertNumber(val, type) {\n  if (!!!(process.env.NODE_ENV !== \"production\")) return;\n  if (val === void 0) {\n    return;\n  } else if (typeof val !== \"number\") {\n    warn$1(`${type} is not a valid number - got ${JSON.stringify(val)}.`);\n  } else if (isNaN(val)) {\n    warn$1(`${type} is NaN - the duration expression might be incorrect.`);\n  }\n}\n\nconst ErrorCodes = {\n  \"SETUP_FUNCTION\": 0,\n  \"0\": \"SETUP_FUNCTION\",\n  \"RENDER_FUNCTION\": 1,\n  \"1\": \"RENDER_FUNCTION\",\n  \"NATIVE_EVENT_HANDLER\": 5,\n  \"5\": \"NATIVE_EVENT_HANDLER\",\n  \"COMPONENT_EVENT_HANDLER\": 6,\n  \"6\": \"COMPONENT_EVENT_HANDLER\",\n  \"VNODE_HOOK\": 7,\n  \"7\": \"VNODE_HOOK\",\n  \"DIRECTIVE_HOOK\": 8,\n  \"8\": \"DIRECTIVE_HOOK\",\n  \"TRANSITION_HOOK\": 9,\n  \"9\": \"TRANSITION_HOOK\",\n  \"APP_ERROR_HANDLER\": 10,\n  \"10\": \"APP_ERROR_HANDLER\",\n  \"APP_WARN_HANDLER\": 11,\n  \"11\": \"APP_WARN_HANDLER\",\n  \"FUNCTION_REF\": 12,\n  \"12\": \"FUNCTION_REF\",\n  \"ASYNC_COMPONENT_LOADER\": 13,\n  \"13\": \"ASYNC_COMPONENT_LOADER\",\n  \"SCHEDULER\": 14,\n  \"14\": \"SCHEDULER\",\n  \"COMPONENT_UPDATE\": 15,\n  \"15\": \"COMPONENT_UPDATE\",\n  \"APP_UNMOUNT_CLEANUP\": 16,\n  \"16\": \"APP_UNMOUNT_CLEANUP\"\n};\nconst ErrorTypeStrings$1 = {\n  [\"sp\"]: \"serverPrefetch hook\",\n  [\"bc\"]: \"beforeCreate hook\",\n  [\"c\"]: \"created hook\",\n  [\"bm\"]: \"beforeMount hook\",\n  [\"m\"]: \"mounted hook\",\n  [\"bu\"]: \"beforeUpdate hook\",\n  [\"u\"]: \"updated\",\n  [\"bum\"]: \"beforeUnmount hook\",\n  [\"um\"]: \"unmounted hook\",\n  [\"a\"]: \"activated hook\",\n  [\"da\"]: \"deactivated hook\",\n  [\"ec\"]: \"errorCaptured hook\",\n  [\"rtc\"]: \"renderTracked hook\",\n  [\"rtg\"]: \"renderTriggered hook\",\n  [0]: \"setup function\",\n  [1]: \"render function\",\n  [2]: \"watcher getter\",\n  [3]: \"watcher callback\",\n  [4]: \"watcher cleanup function\",\n  [5]: \"native event handler\",\n  [6]: \"component event handler\",\n  [7]: \"vnode hook\",\n  [8]: \"directive hook\",\n  [9]: \"transition hook\",\n  [10]: \"app errorHandler\",\n  [11]: \"app warnHandler\",\n  [12]: \"ref function\",\n  [13]: \"async component loader\",\n  [14]: \"scheduler flush\",\n  [15]: \"component update\",\n  [16]: \"app unmount cleanup function\"\n};\nfunction callWithErrorHandling(fn, instance, type, args) {\n  try {\n    return args ? fn(...args) : fn();\n  } catch (err) {\n    handleError(err, instance, type);\n  }\n}\nfunction callWithAsyncErrorHandling(fn, instance, type, args) {\n  if (isFunction(fn)) {\n    const res = callWithErrorHandling(fn, instance, type, args);\n    if (res && isPromise(res)) {\n      res.catch((err) => {\n        handleError(err, instance, type);\n      });\n    }\n    return res;\n  }\n  if (isArray(fn)) {\n    const values = [];\n    for (let i = 0; i < fn.length; i++) {\n      values.push(callWithAsyncErrorHandling(fn[i], instance, type, args));\n    }\n    return values;\n  } else if (!!(process.env.NODE_ENV !== \"production\")) {\n    warn$1(\n      `Invalid value type passed to callWithAsyncErrorHandling(): ${typeof fn}`\n    );\n  }\n}\nfunction handleError(err, instance, type, throwInDev = true) {\n  const contextVNode = instance ? instance.vnode : null;\n  const { errorHandler, throwUnhandledErrorInProduction } = instance && instance.appContext.config || EMPTY_OBJ;\n  if (instance) {\n    let cur = instance.parent;\n    const exposedInstance = instance.proxy;\n    const errorInfo = !!(process.env.NODE_ENV !== \"production\") ? ErrorTypeStrings$1[type] : `https://vuejs.org/error-reference/#runtime-${type}`;\n    while (cur) {\n      const errorCapturedHooks = cur.ec;\n      if (errorCapturedHooks) {\n        for (let i = 0; i < errorCapturedHooks.length; i++) {\n          if (errorCapturedHooks[i](err, exposedInstance, errorInfo) === false) {\n            return;\n          }\n        }\n      }\n      cur = cur.parent;\n    }\n    if (errorHandler) {\n      pauseTracking();\n      callWithErrorHandling(errorHandler, null, 10, [\n        err,\n        exposedInstance,\n        errorInfo\n      ]);\n      resetTracking();\n      return;\n    }\n  }\n  logError(err, type, contextVNode, throwInDev, throwUnhandledErrorInProduction);\n}\nfunction logError(err, type, contextVNode, throwInDev = true, throwInProd = false) {\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    const info = ErrorTypeStrings$1[type];\n    if (contextVNode) {\n      pushWarningContext(contextVNode);\n    }\n    warn$1(`Unhandled error${info ? ` during execution of ${info}` : ``}`);\n    if (contextVNode) {\n      popWarningContext();\n    }\n    if (throwInDev) {\n      throw err;\n    } else {\n      console.error(err);\n    }\n  } else if (throwInProd) {\n    throw err;\n  } else {\n    console.error(err);\n  }\n}\n\nconst queue = [];\nlet flushIndex = -1;\nconst pendingPostFlushCbs = [];\nlet activePostFlushCbs = null;\nlet postFlushIndex = 0;\nconst resolvedPromise = /* @__PURE__ */ Promise.resolve();\nlet currentFlushPromise = null;\nconst RECURSION_LIMIT = 100;\nfunction nextTick(fn) {\n  const p = currentFlushPromise || resolvedPromise;\n  return fn ? p.then(this ? fn.bind(this) : fn) : p;\n}\nfunction findInsertionIndex(id) {\n  let start = flushIndex + 1;\n  let end = queue.length;\n  while (start < end) {\n    const middle = start + end >>> 1;\n    const middleJob = queue[middle];\n    const middleJobId = getId(middleJob);\n    if (middleJobId < id || middleJobId === id && middleJob.flags & 2) {\n      start = middle + 1;\n    } else {\n      end = middle;\n    }\n  }\n  return start;\n}\nfunction queueJob(job) {\n  if (!(job.flags & 1)) {\n    const jobId = getId(job);\n    const lastJob = queue[queue.length - 1];\n    if (!lastJob || // fast path when the job id is larger than the tail\n    !(job.flags & 2) && jobId >= getId(lastJob)) {\n      queue.push(job);\n    } else {\n      queue.splice(findInsertionIndex(jobId), 0, job);\n    }\n    job.flags |= 1;\n    queueFlush();\n  }\n}\nfunction queueFlush() {\n  if (!currentFlushPromise) {\n    currentFlushPromise = resolvedPromise.then(flushJobs);\n  }\n}\nfunction queuePostFlushCb(cb) {\n  if (!isArray(cb)) {\n    if (activePostFlushCbs && cb.id === -1) {\n      activePostFlushCbs.splice(postFlushIndex + 1, 0, cb);\n    } else if (!(cb.flags & 1)) {\n      pendingPostFlushCbs.push(cb);\n      cb.flags |= 1;\n    }\n  } else {\n    pendingPostFlushCbs.push(...cb);\n  }\n  queueFlush();\n}\nfunction flushPreFlushCbs(instance, seen, i = flushIndex + 1) {\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    seen = seen || /* @__PURE__ */ new Map();\n  }\n  for (; i < queue.length; i++) {\n    const cb = queue[i];\n    if (cb && cb.flags & 2) {\n      if (instance && cb.id !== instance.uid) {\n        continue;\n      }\n      if (!!(process.env.NODE_ENV !== \"production\") && checkRecursiveUpdates(seen, cb)) {\n        continue;\n      }\n      queue.splice(i, 1);\n      i--;\n      if (cb.flags & 4) {\n        cb.flags &= -2;\n      }\n      cb();\n      if (!(cb.flags & 4)) {\n        cb.flags &= -2;\n      }\n    }\n  }\n}\nfunction flushPostFlushCbs(seen) {\n  if (pendingPostFlushCbs.length) {\n    const deduped = [...new Set(pendingPostFlushCbs)].sort(\n      (a, b) => getId(a) - getId(b)\n    );\n    pendingPostFlushCbs.length = 0;\n    if (activePostFlushCbs) {\n      activePostFlushCbs.push(...deduped);\n      return;\n    }\n    activePostFlushCbs = deduped;\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      seen = seen || /* @__PURE__ */ new Map();\n    }\n    for (postFlushIndex = 0; postFlushIndex < activePostFlushCbs.length; postFlushIndex++) {\n      const cb = activePostFlushCbs[postFlushIndex];\n      if (!!(process.env.NODE_ENV !== \"production\") && checkRecursiveUpdates(seen, cb)) {\n        continue;\n      }\n      if (cb.flags & 4) {\n        cb.flags &= -2;\n      }\n      if (!(cb.flags & 8)) cb();\n      cb.flags &= -2;\n    }\n    activePostFlushCbs = null;\n    postFlushIndex = 0;\n  }\n}\nconst getId = (job) => job.id == null ? job.flags & 2 ? -1 : Infinity : job.id;\nfunction flushJobs(seen) {\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    seen = seen || /* @__PURE__ */ new Map();\n  }\n  const check = !!(process.env.NODE_ENV !== \"production\") ? (job) => checkRecursiveUpdates(seen, job) : NOOP;\n  try {\n    for (flushIndex = 0; flushIndex < queue.length; flushIndex++) {\n      const job = queue[flushIndex];\n      if (job && !(job.flags & 8)) {\n        if (!!(process.env.NODE_ENV !== \"production\") && check(job)) {\n          continue;\n        }\n        if (job.flags & 4) {\n          job.flags &= ~1;\n        }\n        callWithErrorHandling(\n          job,\n          job.i,\n          job.i ? 15 : 14\n        );\n        if (!(job.flags & 4)) {\n          job.flags &= ~1;\n        }\n      }\n    }\n  } finally {\n    for (; flushIndex < queue.length; flushIndex++) {\n      const job = queue[flushIndex];\n      if (job) {\n        job.flags &= -2;\n      }\n    }\n    flushIndex = -1;\n    queue.length = 0;\n    flushPostFlushCbs(seen);\n    currentFlushPromise = null;\n    if (queue.length || pendingPostFlushCbs.length) {\n      flushJobs(seen);\n    }\n  }\n}\nfunction checkRecursiveUpdates(seen, fn) {\n  const count = seen.get(fn) || 0;\n  if (count > RECURSION_LIMIT) {\n    const instance = fn.i;\n    const componentName = instance && getComponentName(instance.type);\n    handleError(\n      `Maximum recursive updates exceeded${componentName ? ` in component <${componentName}>` : ``}. This means you have a reactive effect that is mutating its own dependencies and thus recursively triggering itself. Possible sources include component template, render function, updated hook or watcher source function.`,\n      null,\n      10\n    );\n    return true;\n  }\n  seen.set(fn, count + 1);\n  return false;\n}\n\nlet isHmrUpdating = false;\nconst hmrDirtyComponents = /* @__PURE__ */ new Map();\nif (!!(process.env.NODE_ENV !== \"production\")) {\n  getGlobalThis().__VUE_HMR_RUNTIME__ = {\n    createRecord: tryWrap(createRecord),\n    rerender: tryWrap(rerender),\n    reload: tryWrap(reload)\n  };\n}\nconst map = /* @__PURE__ */ new Map();\nfunction registerHMR(instance) {\n  const id = instance.type.__hmrId;\n  let record = map.get(id);\n  if (!record) {\n    createRecord(id, instance.type);\n    record = map.get(id);\n  }\n  record.instances.add(instance);\n}\nfunction unregisterHMR(instance) {\n  map.get(instance.type.__hmrId).instances.delete(instance);\n}\nfunction createRecord(id, initialDef) {\n  if (map.has(id)) {\n    return false;\n  }\n  map.set(id, {\n    initialDef: normalizeClassComponent(initialDef),\n    instances: /* @__PURE__ */ new Set()\n  });\n  return true;\n}\nfunction normalizeClassComponent(component) {\n  return isClassComponent(component) ? component.__vccOpts : component;\n}\nfunction rerender(id, newRender) {\n  const record = map.get(id);\n  if (!record) {\n    return;\n  }\n  record.initialDef.render = newRender;\n  [...record.instances].forEach((instance) => {\n    if (newRender) {\n      instance.render = newRender;\n      normalizeClassComponent(instance.type).render = newRender;\n    }\n    instance.renderCache = [];\n    isHmrUpdating = true;\n    instance.update();\n    isHmrUpdating = false;\n  });\n}\nfunction reload(id, newComp) {\n  const record = map.get(id);\n  if (!record) return;\n  newComp = normalizeClassComponent(newComp);\n  updateComponentDef(record.initialDef, newComp);\n  const instances = [...record.instances];\n  for (let i = 0; i < instances.length; i++) {\n    const instance = instances[i];\n    const oldComp = normalizeClassComponent(instance.type);\n    let dirtyInstances = hmrDirtyComponents.get(oldComp);\n    if (!dirtyInstances) {\n      if (oldComp !== record.initialDef) {\n        updateComponentDef(oldComp, newComp);\n      }\n      hmrDirtyComponents.set(oldComp, dirtyInstances = /* @__PURE__ */ new Set());\n    }\n    dirtyInstances.add(instance);\n    instance.appContext.propsCache.delete(instance.type);\n    instance.appContext.emitsCache.delete(instance.type);\n    instance.appContext.optionsCache.delete(instance.type);\n    if (instance.ceReload) {\n      dirtyInstances.add(instance);\n      instance.ceReload(newComp.styles);\n      dirtyInstances.delete(instance);\n    } else if (instance.parent) {\n      queueJob(() => {\n        isHmrUpdating = true;\n        instance.parent.update();\n        isHmrUpdating = false;\n        dirtyInstances.delete(instance);\n      });\n    } else if (instance.appContext.reload) {\n      instance.appContext.reload();\n    } else if (typeof window !== \"undefined\") {\n      window.location.reload();\n    } else {\n      console.warn(\n        \"[HMR] Root or manually mounted instance modified. Full reload required.\"\n      );\n    }\n    if (instance.root.ce && instance !== instance.root) {\n      instance.root.ce._removeChildStyle(oldComp);\n    }\n  }\n  queuePostFlushCb(() => {\n    hmrDirtyComponents.clear();\n  });\n}\nfunction updateComponentDef(oldComp, newComp) {\n  extend(oldComp, newComp);\n  for (const key in oldComp) {\n    if (key !== \"__file\" && !(key in newComp)) {\n      delete oldComp[key];\n    }\n  }\n}\nfunction tryWrap(fn) {\n  return (id, arg) => {\n    try {\n      return fn(id, arg);\n    } catch (e) {\n      console.error(e);\n      console.warn(\n        `[HMR] Something went wrong during Vue component hot-reload. Full reload required.`\n      );\n    }\n  };\n}\n\nlet devtools$1;\nlet buffer = [];\nlet devtoolsNotInstalled = false;\nfunction emit$1(event, ...args) {\n  if (devtools$1) {\n    devtools$1.emit(event, ...args);\n  } else if (!devtoolsNotInstalled) {\n    buffer.push({ event, args });\n  }\n}\nfunction setDevtoolsHook$1(hook, target) {\n  var _a, _b;\n  devtools$1 = hook;\n  if (devtools$1) {\n    devtools$1.enabled = true;\n    buffer.forEach(({ event, args }) => devtools$1.emit(event, ...args));\n    buffer = [];\n  } else if (\n    // handle late devtools injection - only do this if we are in an actual\n    // browser environment to avoid the timer handle stalling test runner exit\n    // (#4815)\n    typeof window !== \"undefined\" && // some envs mock window but not fully\n    window.HTMLElement && // also exclude jsdom\n    // eslint-disable-next-line no-restricted-syntax\n    !((_b = (_a = window.navigator) == null ? void 0 : _a.userAgent) == null ? void 0 : _b.includes(\"jsdom\"))\n  ) {\n    const replay = target.__VUE_DEVTOOLS_HOOK_REPLAY__ = target.__VUE_DEVTOOLS_HOOK_REPLAY__ || [];\n    replay.push((newHook) => {\n      setDevtoolsHook$1(newHook, target);\n    });\n    setTimeout(() => {\n      if (!devtools$1) {\n        target.__VUE_DEVTOOLS_HOOK_REPLAY__ = null;\n        devtoolsNotInstalled = true;\n        buffer = [];\n      }\n    }, 3e3);\n  } else {\n    devtoolsNotInstalled = true;\n    buffer = [];\n  }\n}\nfunction devtoolsInitApp(app, version) {\n  emit$1(\"app:init\" /* APP_INIT */, app, version, {\n    Fragment,\n    Text,\n    Comment,\n    Static\n  });\n}\nfunction devtoolsUnmountApp(app) {\n  emit$1(\"app:unmount\" /* APP_UNMOUNT */, app);\n}\nconst devtoolsComponentAdded = /* @__PURE__ */ createDevtoolsComponentHook(\"component:added\" /* COMPONENT_ADDED */);\nconst devtoolsComponentUpdated = /* @__PURE__ */ createDevtoolsComponentHook(\"component:updated\" /* COMPONENT_UPDATED */);\nconst _devtoolsComponentRemoved = /* @__PURE__ */ createDevtoolsComponentHook(\n  \"component:removed\" /* COMPONENT_REMOVED */\n);\nconst devtoolsComponentRemoved = (component) => {\n  if (devtools$1 && typeof devtools$1.cleanupBuffer === \"function\" && // remove the component if it wasn't buffered\n  !devtools$1.cleanupBuffer(component)) {\n    _devtoolsComponentRemoved(component);\n  }\n};\n/*! #__NO_SIDE_EFFECTS__ */\n// @__NO_SIDE_EFFECTS__\nfunction createDevtoolsComponentHook(hook) {\n  return (component) => {\n    emit$1(\n      hook,\n      component.appContext.app,\n      component.uid,\n      component.parent ? component.parent.uid : void 0,\n      component\n    );\n  };\n}\nconst devtoolsPerfStart = /* @__PURE__ */ createDevtoolsPerformanceHook(\"perf:start\" /* PERFORMANCE_START */);\nconst devtoolsPerfEnd = /* @__PURE__ */ createDevtoolsPerformanceHook(\"perf:end\" /* PERFORMANCE_END */);\nfunction createDevtoolsPerformanceHook(hook) {\n  return (component, type, time) => {\n    emit$1(hook, component.appContext.app, component.uid, component, type, time);\n  };\n}\nfunction devtoolsComponentEmit(component, event, params) {\n  emit$1(\n    \"component:emit\" /* COMPONENT_EMIT */,\n    component.appContext.app,\n    component,\n    event,\n    params\n  );\n}\n\nlet currentRenderingInstance = null;\nlet currentScopeId = null;\nfunction setCurrentRenderingInstance(instance) {\n  const prev = currentRenderingInstance;\n  currentRenderingInstance = instance;\n  currentScopeId = instance && instance.type.__scopeId || null;\n  return prev;\n}\nfunction pushScopeId(id) {\n  currentScopeId = id;\n}\nfunction popScopeId() {\n  currentScopeId = null;\n}\nconst withScopeId = (_id) => withCtx;\nfunction withCtx(fn, ctx = currentRenderingInstance, isNonScopedSlot) {\n  if (!ctx) return fn;\n  if (fn._n) {\n    return fn;\n  }\n  const renderFnWithContext = (...args) => {\n    if (renderFnWithContext._d) {\n      setBlockTracking(-1);\n    }\n    const prevInstance = setCurrentRenderingInstance(ctx);\n    let res;\n    try {\n      res = fn(...args);\n    } finally {\n      setCurrentRenderingInstance(prevInstance);\n      if (renderFnWithContext._d) {\n        setBlockTracking(1);\n      }\n    }\n    if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n      devtoolsComponentUpdated(ctx);\n    }\n    return res;\n  };\n  renderFnWithContext._n = true;\n  renderFnWithContext._c = true;\n  renderFnWithContext._d = true;\n  return renderFnWithContext;\n}\n\nfunction validateDirectiveName(name) {\n  if (isBuiltInDirective(name)) {\n    warn$1(\"Do not use built-in directive ids as custom directive id: \" + name);\n  }\n}\nfunction withDirectives(vnode, directives) {\n  if (currentRenderingInstance === null) {\n    !!(process.env.NODE_ENV !== \"production\") && warn$1(`withDirectives can only be used inside render functions.`);\n    return vnode;\n  }\n  const instance = getComponentPublicInstance(currentRenderingInstance);\n  const bindings = vnode.dirs || (vnode.dirs = []);\n  for (let i = 0; i < directives.length; i++) {\n    let [dir, value, arg, modifiers = EMPTY_OBJ] = directives[i];\n    if (dir) {\n      if (isFunction(dir)) {\n        dir = {\n          mounted: dir,\n          updated: dir\n        };\n      }\n      if (dir.deep) {\n        traverse(value);\n      }\n      bindings.push({\n        dir,\n        instance,\n        value,\n        oldValue: void 0,\n        arg,\n        modifiers\n      });\n    }\n  }\n  return vnode;\n}\nfunction invokeDirectiveHook(vnode, prevVNode, instance, name) {\n  const bindings = vnode.dirs;\n  const oldBindings = prevVNode && prevVNode.dirs;\n  for (let i = 0; i < bindings.length; i++) {\n    const binding = bindings[i];\n    if (oldBindings) {\n      binding.oldValue = oldBindings[i].value;\n    }\n    let hook = binding.dir[name];\n    if (hook) {\n      pauseTracking();\n      callWithAsyncErrorHandling(hook, instance, 8, [\n        vnode.el,\n        binding,\n        vnode,\n        prevVNode\n      ]);\n      resetTracking();\n    }\n  }\n}\n\nconst TeleportEndKey = Symbol(\"_vte\");\nconst isTeleport = (type) => type.__isTeleport;\nconst isTeleportDisabled = (props) => props && (props.disabled || props.disabled === \"\");\nconst isTeleportDeferred = (props) => props && (props.defer || props.defer === \"\");\nconst isTargetSVG = (target) => typeof SVGElement !== \"undefined\" && target instanceof SVGElement;\nconst isTargetMathML = (target) => typeof MathMLElement === \"function\" && target instanceof MathMLElement;\nconst resolveTarget = (props, select) => {\n  const targetSelector = props && props.to;\n  if (isString(targetSelector)) {\n    if (!select) {\n      !!(process.env.NODE_ENV !== \"production\") && warn$1(\n        `Current renderer does not support string target for Teleports. (missing querySelector renderer option)`\n      );\n      return null;\n    } else {\n      const target = select(targetSelector);\n      if (!!(process.env.NODE_ENV !== \"production\") && !target && !isTeleportDisabled(props)) {\n        warn$1(\n          `Failed to locate Teleport target with selector \"${targetSelector}\". Note the target element must exist before the component is mounted - i.e. the target cannot be rendered by the component itself, and ideally should be outside of the entire Vue component tree.`\n        );\n      }\n      return target;\n    }\n  } else {\n    if (!!(process.env.NODE_ENV !== \"production\") && !targetSelector && !isTeleportDisabled(props)) {\n      warn$1(`Invalid Teleport target: ${targetSelector}`);\n    }\n    return targetSelector;\n  }\n};\nconst TeleportImpl = {\n  name: \"Teleport\",\n  __isTeleport: true,\n  process(n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, internals) {\n    const {\n      mc: mountChildren,\n      pc: patchChildren,\n      pbc: patchBlockChildren,\n      o: { insert, querySelector, createText, createComment }\n    } = internals;\n    const disabled = isTeleportDisabled(n2.props);\n    let { shapeFlag, children, dynamicChildren } = n2;\n    if (!!(process.env.NODE_ENV !== \"production\") && isHmrUpdating) {\n      optimized = false;\n      dynamicChildren = null;\n    }\n    if (n1 == null) {\n      const placeholder = n2.el = !!(process.env.NODE_ENV !== \"production\") ? createComment(\"teleport start\") : createText(\"\");\n      const mainAnchor = n2.anchor = !!(process.env.NODE_ENV !== \"production\") ? createComment(\"teleport end\") : createText(\"\");\n      insert(placeholder, container, anchor);\n      insert(mainAnchor, container, anchor);\n      const mount = (container2, anchor2) => {\n        if (shapeFlag & 16) {\n          if (parentComponent && parentComponent.isCE) {\n            parentComponent.ce._teleportTarget = container2;\n          }\n          mountChildren(\n            children,\n            container2,\n            anchor2,\n            parentComponent,\n            parentSuspense,\n            namespace,\n            slotScopeIds,\n            optimized\n          );\n        }\n      };\n      const mountToTarget = () => {\n        const target = n2.target = resolveTarget(n2.props, querySelector);\n        const targetAnchor = prepareAnchor(target, n2, createText, insert);\n        if (target) {\n          if (namespace !== \"svg\" && isTargetSVG(target)) {\n            namespace = \"svg\";\n          } else if (namespace !== \"mathml\" && isTargetMathML(target)) {\n            namespace = \"mathml\";\n          }\n          if (!disabled) {\n            mount(target, targetAnchor);\n            updateCssVars(n2, false);\n          }\n        } else if (!!(process.env.NODE_ENV !== \"production\") && !disabled) {\n          warn$1(\n            \"Invalid Teleport target on mount:\",\n            target,\n            `(${typeof target})`\n          );\n        }\n      };\n      if (disabled) {\n        mount(container, mainAnchor);\n        updateCssVars(n2, true);\n      }\n      if (isTeleportDeferred(n2.props)) {\n        n2.el.__isMounted = false;\n        queuePostRenderEffect(() => {\n          mountToTarget();\n          delete n2.el.__isMounted;\n        }, parentSuspense);\n      } else {\n        mountToTarget();\n      }\n    } else {\n      if (isTeleportDeferred(n2.props) && n1.el.__isMounted === false) {\n        queuePostRenderEffect(() => {\n          TeleportImpl.process(\n            n1,\n            n2,\n            container,\n            anchor,\n            parentComponent,\n            parentSuspense,\n            namespace,\n            slotScopeIds,\n            optimized,\n            internals\n          );\n        }, parentSuspense);\n        return;\n      }\n      n2.el = n1.el;\n      n2.targetStart = n1.targetStart;\n      const mainAnchor = n2.anchor = n1.anchor;\n      const target = n2.target = n1.target;\n      const targetAnchor = n2.targetAnchor = n1.targetAnchor;\n      const wasDisabled = isTeleportDisabled(n1.props);\n      const currentContainer = wasDisabled ? container : target;\n      const currentAnchor = wasDisabled ? mainAnchor : targetAnchor;\n      if (namespace === \"svg\" || isTargetSVG(target)) {\n        namespace = \"svg\";\n      } else if (namespace === \"mathml\" || isTargetMathML(target)) {\n        namespace = \"mathml\";\n      }\n      if (dynamicChildren) {\n        patchBlockChildren(\n          n1.dynamicChildren,\n          dynamicChildren,\n          currentContainer,\n          parentComponent,\n          parentSuspense,\n          namespace,\n          slotScopeIds\n        );\n        traverseStaticChildren(n1, n2, !!!(process.env.NODE_ENV !== \"production\"));\n      } else if (!optimized) {\n        patchChildren(\n          n1,\n          n2,\n          currentContainer,\n          currentAnchor,\n          parentComponent,\n          parentSuspense,\n          namespace,\n          slotScopeIds,\n          false\n        );\n      }\n      if (disabled) {\n        if (!wasDisabled) {\n          moveTeleport(\n            n2,\n            container,\n            mainAnchor,\n            internals,\n            1\n          );\n        } else {\n          if (n2.props && n1.props && n2.props.to !== n1.props.to) {\n            n2.props.to = n1.props.to;\n          }\n        }\n      } else {\n        if ((n2.props && n2.props.to) !== (n1.props && n1.props.to)) {\n          const nextTarget = n2.target = resolveTarget(\n            n2.props,\n            querySelector\n          );\n          if (nextTarget) {\n            moveTeleport(\n              n2,\n              nextTarget,\n              null,\n              internals,\n              0\n            );\n          } else if (!!(process.env.NODE_ENV !== \"production\")) {\n            warn$1(\n              \"Invalid Teleport target on update:\",\n              target,\n              `(${typeof target})`\n            );\n          }\n        } else if (wasDisabled) {\n          moveTeleport(\n            n2,\n            target,\n            targetAnchor,\n            internals,\n            1\n          );\n        }\n      }\n      updateCssVars(n2, disabled);\n    }\n  },\n  remove(vnode, parentComponent, parentSuspense, { um: unmount, o: { remove: hostRemove } }, doRemove) {\n    const {\n      shapeFlag,\n      children,\n      anchor,\n      targetStart,\n      targetAnchor,\n      target,\n      props\n    } = vnode;\n    if (target) {\n      hostRemove(targetStart);\n      hostRemove(targetAnchor);\n    }\n    doRemove && hostRemove(anchor);\n    if (shapeFlag & 16) {\n      const shouldRemove = doRemove || !isTeleportDisabled(props);\n      for (let i = 0; i < children.length; i++) {\n        const child = children[i];\n        unmount(\n          child,\n          parentComponent,\n          parentSuspense,\n          shouldRemove,\n          !!child.dynamicChildren\n        );\n      }\n    }\n  },\n  move: moveTeleport,\n  hydrate: hydrateTeleport\n};\nfunction moveTeleport(vnode, container, parentAnchor, { o: { insert }, m: move }, moveType = 2) {\n  if (moveType === 0) {\n    insert(vnode.targetAnchor, container, parentAnchor);\n  }\n  const { el, anchor, shapeFlag, children, props } = vnode;\n  const isReorder = moveType === 2;\n  if (isReorder) {\n    insert(el, container, parentAnchor);\n  }\n  if (!isReorder || isTeleportDisabled(props)) {\n    if (shapeFlag & 16) {\n      for (let i = 0; i < children.length; i++) {\n        move(\n          children[i],\n          container,\n          parentAnchor,\n          2\n        );\n      }\n    }\n  }\n  if (isReorder) {\n    insert(anchor, container, parentAnchor);\n  }\n}\nfunction hydrateTeleport(node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized, {\n  o: { nextSibling, parentNode, querySelector, insert, createText }\n}, hydrateChildren) {\n  const target = vnode.target = resolveTarget(\n    vnode.props,\n    querySelector\n  );\n  if (target) {\n    const disabled = isTeleportDisabled(vnode.props);\n    const targetNode = target._lpa || target.firstChild;\n    if (vnode.shapeFlag & 16) {\n      if (disabled) {\n        vnode.anchor = hydrateChildren(\n          nextSibling(node),\n          vnode,\n          parentNode(node),\n          parentComponent,\n          parentSuspense,\n          slotScopeIds,\n          optimized\n        );\n        vnode.targetStart = targetNode;\n        vnode.targetAnchor = targetNode && nextSibling(targetNode);\n      } else {\n        vnode.anchor = nextSibling(node);\n        let targetAnchor = targetNode;\n        while (targetAnchor) {\n          if (targetAnchor && targetAnchor.nodeType === 8) {\n            if (targetAnchor.data === \"teleport start anchor\") {\n              vnode.targetStart = targetAnchor;\n            } else if (targetAnchor.data === \"teleport anchor\") {\n              vnode.targetAnchor = targetAnchor;\n              target._lpa = vnode.targetAnchor && nextSibling(vnode.targetAnchor);\n              break;\n            }\n          }\n          targetAnchor = nextSibling(targetAnchor);\n        }\n        if (!vnode.targetAnchor) {\n          prepareAnchor(target, vnode, createText, insert);\n        }\n        hydrateChildren(\n          targetNode && nextSibling(targetNode),\n          vnode,\n          target,\n          parentComponent,\n          parentSuspense,\n          slotScopeIds,\n          optimized\n        );\n      }\n    }\n    updateCssVars(vnode, disabled);\n  }\n  return vnode.anchor && nextSibling(vnode.anchor);\n}\nconst Teleport = TeleportImpl;\nfunction updateCssVars(vnode, isDisabled) {\n  const ctx = vnode.ctx;\n  if (ctx && ctx.ut) {\n    let node, anchor;\n    if (isDisabled) {\n      node = vnode.el;\n      anchor = vnode.anchor;\n    } else {\n      node = vnode.targetStart;\n      anchor = vnode.targetAnchor;\n    }\n    while (node && node !== anchor) {\n      if (node.nodeType === 1) node.setAttribute(\"data-v-owner\", ctx.uid);\n      node = node.nextSibling;\n    }\n    ctx.ut();\n  }\n}\nfunction prepareAnchor(target, vnode, createText, insert) {\n  const targetStart = vnode.targetStart = createText(\"\");\n  const targetAnchor = vnode.targetAnchor = createText(\"\");\n  targetStart[TeleportEndKey] = targetAnchor;\n  if (target) {\n    insert(targetStart, target);\n    insert(targetAnchor, target);\n  }\n  return targetAnchor;\n}\n\nconst leaveCbKey = Symbol(\"_leaveCb\");\nconst enterCbKey = Symbol(\"_enterCb\");\nfunction useTransitionState() {\n  const state = {\n    isMounted: false,\n    isLeaving: false,\n    isUnmounting: false,\n    leavingVNodes: /* @__PURE__ */ new Map()\n  };\n  onMounted(() => {\n    state.isMounted = true;\n  });\n  onBeforeUnmount(() => {\n    state.isUnmounting = true;\n  });\n  return state;\n}\nconst TransitionHookValidator = [Function, Array];\nconst BaseTransitionPropsValidators = {\n  mode: String,\n  appear: Boolean,\n  persisted: Boolean,\n  // enter\n  onBeforeEnter: TransitionHookValidator,\n  onEnter: TransitionHookValidator,\n  onAfterEnter: TransitionHookValidator,\n  onEnterCancelled: TransitionHookValidator,\n  // leave\n  onBeforeLeave: TransitionHookValidator,\n  onLeave: TransitionHookValidator,\n  onAfterLeave: TransitionHookValidator,\n  onLeaveCancelled: TransitionHookValidator,\n  // appear\n  onBeforeAppear: TransitionHookValidator,\n  onAppear: TransitionHookValidator,\n  onAfterAppear: TransitionHookValidator,\n  onAppearCancelled: TransitionHookValidator\n};\nconst recursiveGetSubtree = (instance) => {\n  const subTree = instance.subTree;\n  return subTree.component ? recursiveGetSubtree(subTree.component) : subTree;\n};\nconst BaseTransitionImpl = {\n  name: `BaseTransition`,\n  props: BaseTransitionPropsValidators,\n  setup(props, { slots }) {\n    const instance = getCurrentInstance();\n    const state = useTransitionState();\n    return () => {\n      const children = slots.default && getTransitionRawChildren(slots.default(), true);\n      if (!children || !children.length) {\n        return;\n      }\n      const child = findNonCommentChild(children);\n      const rawProps = toRaw(props);\n      const { mode } = rawProps;\n      if (!!(process.env.NODE_ENV !== \"production\") && mode && mode !== \"in-out\" && mode !== \"out-in\" && mode !== \"default\") {\n        warn$1(`invalid <transition> mode: ${mode}`);\n      }\n      if (state.isLeaving) {\n        return emptyPlaceholder(child);\n      }\n      const innerChild = getInnerChild$1(child);\n      if (!innerChild) {\n        return emptyPlaceholder(child);\n      }\n      let enterHooks = resolveTransitionHooks(\n        innerChild,\n        rawProps,\n        state,\n        instance,\n        // #11061, ensure enterHooks is fresh after clone\n        (hooks) => enterHooks = hooks\n      );\n      if (innerChild.type !== Comment) {\n        setTransitionHooks(innerChild, enterHooks);\n      }\n      let oldInnerChild = instance.subTree && getInnerChild$1(instance.subTree);\n      if (oldInnerChild && oldInnerChild.type !== Comment && !isSameVNodeType(innerChild, oldInnerChild) && recursiveGetSubtree(instance).type !== Comment) {\n        let leavingHooks = resolveTransitionHooks(\n          oldInnerChild,\n          rawProps,\n          state,\n          instance\n        );\n        setTransitionHooks(oldInnerChild, leavingHooks);\n        if (mode === \"out-in\" && innerChild.type !== Comment) {\n          state.isLeaving = true;\n          leavingHooks.afterLeave = () => {\n            state.isLeaving = false;\n            if (!(instance.job.flags & 8)) {\n              instance.update();\n            }\n            delete leavingHooks.afterLeave;\n            oldInnerChild = void 0;\n          };\n          return emptyPlaceholder(child);\n        } else if (mode === \"in-out\" && innerChild.type !== Comment) {\n          leavingHooks.delayLeave = (el, earlyRemove, delayedLeave) => {\n            const leavingVNodesCache = getLeavingNodesForType(\n              state,\n              oldInnerChild\n            );\n            leavingVNodesCache[String(oldInnerChild.key)] = oldInnerChild;\n            el[leaveCbKey] = () => {\n              earlyRemove();\n              el[leaveCbKey] = void 0;\n              delete enterHooks.delayedLeave;\n              oldInnerChild = void 0;\n            };\n            enterHooks.delayedLeave = () => {\n              delayedLeave();\n              delete enterHooks.delayedLeave;\n              oldInnerChild = void 0;\n            };\n          };\n        } else {\n          oldInnerChild = void 0;\n        }\n      } else if (oldInnerChild) {\n        oldInnerChild = void 0;\n      }\n      return child;\n    };\n  }\n};\nfunction findNonCommentChild(children) {\n  let child = children[0];\n  if (children.length > 1) {\n    let hasFound = false;\n    for (const c of children) {\n      if (c.type !== Comment) {\n        if (!!(process.env.NODE_ENV !== \"production\") && hasFound) {\n          warn$1(\n            \"<transition> can only be used on a single element or component. Use <transition-group> for lists.\"\n          );\n          break;\n        }\n        child = c;\n        hasFound = true;\n        if (!!!(process.env.NODE_ENV !== \"production\")) break;\n      }\n    }\n  }\n  return child;\n}\nconst BaseTransition = BaseTransitionImpl;\nfunction getLeavingNodesForType(state, vnode) {\n  const { leavingVNodes } = state;\n  let leavingVNodesCache = leavingVNodes.get(vnode.type);\n  if (!leavingVNodesCache) {\n    leavingVNodesCache = /* @__PURE__ */ Object.create(null);\n    leavingVNodes.set(vnode.type, leavingVNodesCache);\n  }\n  return leavingVNodesCache;\n}\nfunction resolveTransitionHooks(vnode, props, state, instance, postClone) {\n  const {\n    appear,\n    mode,\n    persisted = false,\n    onBeforeEnter,\n    onEnter,\n    onAfterEnter,\n    onEnterCancelled,\n    onBeforeLeave,\n    onLeave,\n    onAfterLeave,\n    onLeaveCancelled,\n    onBeforeAppear,\n    onAppear,\n    onAfterAppear,\n    onAppearCancelled\n  } = props;\n  const key = String(vnode.key);\n  const leavingVNodesCache = getLeavingNodesForType(state, vnode);\n  const callHook = (hook, args) => {\n    hook && callWithAsyncErrorHandling(\n      hook,\n      instance,\n      9,\n      args\n    );\n  };\n  const callAsyncHook = (hook, args) => {\n    const done = args[1];\n    callHook(hook, args);\n    if (isArray(hook)) {\n      if (hook.every((hook2) => hook2.length <= 1)) done();\n    } else if (hook.length <= 1) {\n      done();\n    }\n  };\n  const hooks = {\n    mode,\n    persisted,\n    beforeEnter(el) {\n      let hook = onBeforeEnter;\n      if (!state.isMounted) {\n        if (appear) {\n          hook = onBeforeAppear || onBeforeEnter;\n        } else {\n          return;\n        }\n      }\n      if (el[leaveCbKey]) {\n        el[leaveCbKey](\n          true\n          /* cancelled */\n        );\n      }\n      const leavingVNode = leavingVNodesCache[key];\n      if (leavingVNode && isSameVNodeType(vnode, leavingVNode) && leavingVNode.el[leaveCbKey]) {\n        leavingVNode.el[leaveCbKey]();\n      }\n      callHook(hook, [el]);\n    },\n    enter(el) {\n      let hook = onEnter;\n      let afterHook = onAfterEnter;\n      let cancelHook = onEnterCancelled;\n      if (!state.isMounted) {\n        if (appear) {\n          hook = onAppear || onEnter;\n          afterHook = onAfterAppear || onAfterEnter;\n          cancelHook = onAppearCancelled || onEnterCancelled;\n        } else {\n          return;\n        }\n      }\n      let called = false;\n      const done = el[enterCbKey] = (cancelled) => {\n        if (called) return;\n        called = true;\n        if (cancelled) {\n          callHook(cancelHook, [el]);\n        } else {\n          callHook(afterHook, [el]);\n        }\n        if (hooks.delayedLeave) {\n          hooks.delayedLeave();\n        }\n        el[enterCbKey] = void 0;\n      };\n      if (hook) {\n        callAsyncHook(hook, [el, done]);\n      } else {\n        done();\n      }\n    },\n    leave(el, remove) {\n      const key2 = String(vnode.key);\n      if (el[enterCbKey]) {\n        el[enterCbKey](\n          true\n          /* cancelled */\n        );\n      }\n      if (state.isUnmounting) {\n        return remove();\n      }\n      callHook(onBeforeLeave, [el]);\n      let called = false;\n      const done = el[leaveCbKey] = (cancelled) => {\n        if (called) return;\n        called = true;\n        remove();\n        if (cancelled) {\n          callHook(onLeaveCancelled, [el]);\n        } else {\n          callHook(onAfterLeave, [el]);\n        }\n        el[leaveCbKey] = void 0;\n        if (leavingVNodesCache[key2] === vnode) {\n          delete leavingVNodesCache[key2];\n        }\n      };\n      leavingVNodesCache[key2] = vnode;\n      if (onLeave) {\n        callAsyncHook(onLeave, [el, done]);\n      } else {\n        done();\n      }\n    },\n    clone(vnode2) {\n      const hooks2 = resolveTransitionHooks(\n        vnode2,\n        props,\n        state,\n        instance,\n        postClone\n      );\n      if (postClone) postClone(hooks2);\n      return hooks2;\n    }\n  };\n  return hooks;\n}\nfunction emptyPlaceholder(vnode) {\n  if (isKeepAlive(vnode)) {\n    vnode = cloneVNode(vnode);\n    vnode.children = null;\n    return vnode;\n  }\n}\nfunction getInnerChild$1(vnode) {\n  if (!isKeepAlive(vnode)) {\n    if (isTeleport(vnode.type) && vnode.children) {\n      return findNonCommentChild(vnode.children);\n    }\n    return vnode;\n  }\n  if (vnode.component) {\n    return vnode.component.subTree;\n  }\n  const { shapeFlag, children } = vnode;\n  if (children) {\n    if (shapeFlag & 16) {\n      return children[0];\n    }\n    if (shapeFlag & 32 && isFunction(children.default)) {\n      return children.default();\n    }\n  }\n}\nfunction setTransitionHooks(vnode, hooks) {\n  if (vnode.shapeFlag & 6 && vnode.component) {\n    vnode.transition = hooks;\n    setTransitionHooks(vnode.component.subTree, hooks);\n  } else if (vnode.shapeFlag & 128) {\n    vnode.ssContent.transition = hooks.clone(vnode.ssContent);\n    vnode.ssFallback.transition = hooks.clone(vnode.ssFallback);\n  } else {\n    vnode.transition = hooks;\n  }\n}\nfunction getTransitionRawChildren(children, keepComment = false, parentKey) {\n  let ret = [];\n  let keyedFragmentCount = 0;\n  for (let i = 0; i < children.length; i++) {\n    let child = children[i];\n    const key = parentKey == null ? child.key : String(parentKey) + String(child.key != null ? child.key : i);\n    if (child.type === Fragment) {\n      if (child.patchFlag & 128) keyedFragmentCount++;\n      ret = ret.concat(\n        getTransitionRawChildren(child.children, keepComment, key)\n      );\n    } else if (keepComment || child.type !== Comment) {\n      ret.push(key != null ? cloneVNode(child, { key }) : child);\n    }\n  }\n  if (keyedFragmentCount > 1) {\n    for (let i = 0; i < ret.length; i++) {\n      ret[i].patchFlag = -2;\n    }\n  }\n  return ret;\n}\n\n/*! #__NO_SIDE_EFFECTS__ */\n// @__NO_SIDE_EFFECTS__\nfunction defineComponent(options, extraOptions) {\n  return isFunction(options) ? (\n    // #8236: extend call and options.name access are considered side-effects\n    // by Rollup, so we have to wrap it in a pure-annotated IIFE.\n    /* @__PURE__ */ (() => extend({ name: options.name }, extraOptions, { setup: options }))()\n  ) : options;\n}\n\nfunction useId() {\n  const i = getCurrentInstance();\n  if (i) {\n    return (i.appContext.config.idPrefix || \"v\") + \"-\" + i.ids[0] + i.ids[1]++;\n  } else if (!!(process.env.NODE_ENV !== \"production\")) {\n    warn$1(\n      `useId() is called when there is no active component instance to be associated with.`\n    );\n  }\n  return \"\";\n}\nfunction markAsyncBoundary(instance) {\n  instance.ids = [instance.ids[0] + instance.ids[2]++ + \"-\", 0, 0];\n}\n\nconst knownTemplateRefs = /* @__PURE__ */ new WeakSet();\nfunction useTemplateRef(key) {\n  const i = getCurrentInstance();\n  const r = shallowRef(null);\n  if (i) {\n    const refs = i.refs === EMPTY_OBJ ? i.refs = {} : i.refs;\n    let desc;\n    if (!!(process.env.NODE_ENV !== \"production\") && (desc = Object.getOwnPropertyDescriptor(refs, key)) && !desc.configurable) {\n      warn$1(`useTemplateRef('${key}') already exists.`);\n    } else {\n      Object.defineProperty(refs, key, {\n        enumerable: true,\n        get: () => r.value,\n        set: (val) => r.value = val\n      });\n    }\n  } else if (!!(process.env.NODE_ENV !== \"production\")) {\n    warn$1(\n      `useTemplateRef() is called when there is no active component instance to be associated with.`\n    );\n  }\n  const ret = !!(process.env.NODE_ENV !== \"production\") ? readonly(r) : r;\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    knownTemplateRefs.add(ret);\n  }\n  return ret;\n}\n\nfunction setRef(rawRef, oldRawRef, parentSuspense, vnode, isUnmount = false) {\n  if (isArray(rawRef)) {\n    rawRef.forEach(\n      (r, i) => setRef(\n        r,\n        oldRawRef && (isArray(oldRawRef) ? oldRawRef[i] : oldRawRef),\n        parentSuspense,\n        vnode,\n        isUnmount\n      )\n    );\n    return;\n  }\n  if (isAsyncWrapper(vnode) && !isUnmount) {\n    if (vnode.shapeFlag & 512 && vnode.type.__asyncResolved && vnode.component.subTree.component) {\n      setRef(rawRef, oldRawRef, parentSuspense, vnode.component.subTree);\n    }\n    return;\n  }\n  const refValue = vnode.shapeFlag & 4 ? getComponentPublicInstance(vnode.component) : vnode.el;\n  const value = isUnmount ? null : refValue;\n  const { i: owner, r: ref } = rawRef;\n  if (!!(process.env.NODE_ENV !== \"production\") && !owner) {\n    warn$1(\n      `Missing ref owner context. ref cannot be used on hoisted vnodes. A vnode with ref must be created inside the render function.`\n    );\n    return;\n  }\n  const oldRef = oldRawRef && oldRawRef.r;\n  const refs = owner.refs === EMPTY_OBJ ? owner.refs = {} : owner.refs;\n  const setupState = owner.setupState;\n  const rawSetupState = toRaw(setupState);\n  const canSetSetupRef = setupState === EMPTY_OBJ ? () => false : (key) => {\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      if (hasOwn(rawSetupState, key) && !isRef(rawSetupState[key])) {\n        warn$1(\n          `Template ref \"${key}\" used on a non-ref value. It will not work in the production build.`\n        );\n      }\n      if (knownTemplateRefs.has(rawSetupState[key])) {\n        return false;\n      }\n    }\n    return hasOwn(rawSetupState, key);\n  };\n  if (oldRef != null && oldRef !== ref) {\n    if (isString(oldRef)) {\n      refs[oldRef] = null;\n      if (canSetSetupRef(oldRef)) {\n        setupState[oldRef] = null;\n      }\n    } else if (isRef(oldRef)) {\n      oldRef.value = null;\n    }\n  }\n  if (isFunction(ref)) {\n    callWithErrorHandling(ref, owner, 12, [value, refs]);\n  } else {\n    const _isString = isString(ref);\n    const _isRef = isRef(ref);\n    if (_isString || _isRef) {\n      const doSet = () => {\n        if (rawRef.f) {\n          const existing = _isString ? canSetSetupRef(ref) ? setupState[ref] : refs[ref] : ref.value;\n          if (isUnmount) {\n            isArray(existing) && remove(existing, refValue);\n          } else {\n            if (!isArray(existing)) {\n              if (_isString) {\n                refs[ref] = [refValue];\n                if (canSetSetupRef(ref)) {\n                  setupState[ref] = refs[ref];\n                }\n              } else {\n                ref.value = [refValue];\n                if (rawRef.k) refs[rawRef.k] = ref.value;\n              }\n            } else if (!existing.includes(refValue)) {\n              existing.push(refValue);\n            }\n          }\n        } else if (_isString) {\n          refs[ref] = value;\n          if (canSetSetupRef(ref)) {\n            setupState[ref] = value;\n          }\n        } else if (_isRef) {\n          ref.value = value;\n          if (rawRef.k) refs[rawRef.k] = value;\n        } else if (!!(process.env.NODE_ENV !== \"production\")) {\n          warn$1(\"Invalid template ref type:\", ref, `(${typeof ref})`);\n        }\n      };\n      if (value) {\n        doSet.id = -1;\n        queuePostRenderEffect(doSet, parentSuspense);\n      } else {\n        doSet();\n      }\n    } else if (!!(process.env.NODE_ENV !== \"production\")) {\n      warn$1(\"Invalid template ref type:\", ref, `(${typeof ref})`);\n    }\n  }\n}\n\nlet hasLoggedMismatchError = false;\nconst logMismatchError = () => {\n  if (hasLoggedMismatchError) {\n    return;\n  }\n  console.error(\"Hydration completed but contains mismatches.\");\n  hasLoggedMismatchError = true;\n};\nconst isSVGContainer = (container) => container.namespaceURI.includes(\"svg\") && container.tagName !== \"foreignObject\";\nconst isMathMLContainer = (container) => container.namespaceURI.includes(\"MathML\");\nconst getContainerType = (container) => {\n  if (container.nodeType !== 1) return void 0;\n  if (isSVGContainer(container)) return \"svg\";\n  if (isMathMLContainer(container)) return \"mathml\";\n  return void 0;\n};\nconst isComment = (node) => node.nodeType === 8;\nfunction createHydrationFunctions(rendererInternals) {\n  const {\n    mt: mountComponent,\n    p: patch,\n    o: {\n      patchProp,\n      createText,\n      nextSibling,\n      parentNode,\n      remove,\n      insert,\n      createComment\n    }\n  } = rendererInternals;\n  const hydrate = (vnode, container) => {\n    if (!container.hasChildNodes()) {\n      (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && warn$1(\n        `Attempting to hydrate existing markup but container is empty. Performing full mount instead.`\n      );\n      patch(null, vnode, container);\n      flushPostFlushCbs();\n      container._vnode = vnode;\n      return;\n    }\n    hydrateNode(container.firstChild, vnode, null, null, null);\n    flushPostFlushCbs();\n    container._vnode = vnode;\n  };\n  const hydrateNode = (node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized = false) => {\n    optimized = optimized || !!vnode.dynamicChildren;\n    const isFragmentStart = isComment(node) && node.data === \"[\";\n    const onMismatch = () => handleMismatch(\n      node,\n      vnode,\n      parentComponent,\n      parentSuspense,\n      slotScopeIds,\n      isFragmentStart\n    );\n    const { type, ref, shapeFlag, patchFlag } = vnode;\n    let domType = node.nodeType;\n    vnode.el = node;\n    if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n      def(node, \"__vnode\", vnode, true);\n      def(node, \"__vueParentComponent\", parentComponent, true);\n    }\n    if (patchFlag === -2) {\n      optimized = false;\n      vnode.dynamicChildren = null;\n    }\n    let nextNode = null;\n    switch (type) {\n      case Text:\n        if (domType !== 3) {\n          if (vnode.children === \"\") {\n            insert(vnode.el = createText(\"\"), parentNode(node), node);\n            nextNode = node;\n          } else {\n            nextNode = onMismatch();\n          }\n        } else {\n          if (node.data !== vnode.children) {\n            (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && warn$1(\n              `Hydration text mismatch in`,\n              node.parentNode,\n              `\n  - rendered on server: ${JSON.stringify(\n                node.data\n              )}\n  - expected on client: ${JSON.stringify(vnode.children)}`\n            );\n            logMismatchError();\n            node.data = vnode.children;\n          }\n          nextNode = nextSibling(node);\n        }\n        break;\n      case Comment:\n        if (isTemplateNode(node)) {\n          nextNode = nextSibling(node);\n          replaceNode(\n            vnode.el = node.content.firstChild,\n            node,\n            parentComponent\n          );\n        } else if (domType !== 8 || isFragmentStart) {\n          nextNode = onMismatch();\n        } else {\n          nextNode = nextSibling(node);\n        }\n        break;\n      case Static:\n        if (isFragmentStart) {\n          node = nextSibling(node);\n          domType = node.nodeType;\n        }\n        if (domType === 1 || domType === 3) {\n          nextNode = node;\n          const needToAdoptContent = !vnode.children.length;\n          for (let i = 0; i < vnode.staticCount; i++) {\n            if (needToAdoptContent)\n              vnode.children += nextNode.nodeType === 1 ? nextNode.outerHTML : nextNode.data;\n            if (i === vnode.staticCount - 1) {\n              vnode.anchor = nextNode;\n            }\n            nextNode = nextSibling(nextNode);\n          }\n          return isFragmentStart ? nextSibling(nextNode) : nextNode;\n        } else {\n          onMismatch();\n        }\n        break;\n      case Fragment:\n        if (!isFragmentStart) {\n          nextNode = onMismatch();\n        } else {\n          nextNode = hydrateFragment(\n            node,\n            vnode,\n            parentComponent,\n            parentSuspense,\n            slotScopeIds,\n            optimized\n          );\n        }\n        break;\n      default:\n        if (shapeFlag & 1) {\n          if ((domType !== 1 || vnode.type.toLowerCase() !== node.tagName.toLowerCase()) && !isTemplateNode(node)) {\n            nextNode = onMismatch();\n          } else {\n            nextNode = hydrateElement(\n              node,\n              vnode,\n              parentComponent,\n              parentSuspense,\n              slotScopeIds,\n              optimized\n            );\n          }\n        } else if (shapeFlag & 6) {\n          vnode.slotScopeIds = slotScopeIds;\n          const container = parentNode(node);\n          if (isFragmentStart) {\n            nextNode = locateClosingAnchor(node);\n          } else if (isComment(node) && node.data === \"teleport start\") {\n            nextNode = locateClosingAnchor(node, node.data, \"teleport end\");\n          } else {\n            nextNode = nextSibling(node);\n          }\n          mountComponent(\n            vnode,\n            container,\n            null,\n            parentComponent,\n            parentSuspense,\n            getContainerType(container),\n            optimized\n          );\n          if (isAsyncWrapper(vnode) && !vnode.type.__asyncResolved) {\n            let subTree;\n            if (isFragmentStart) {\n              subTree = createVNode(Fragment);\n              subTree.anchor = nextNode ? nextNode.previousSibling : container.lastChild;\n            } else {\n              subTree = node.nodeType === 3 ? createTextVNode(\"\") : createVNode(\"div\");\n            }\n            subTree.el = node;\n            vnode.component.subTree = subTree;\n          }\n        } else if (shapeFlag & 64) {\n          if (domType !== 8) {\n            nextNode = onMismatch();\n          } else {\n            nextNode = vnode.type.hydrate(\n              node,\n              vnode,\n              parentComponent,\n              parentSuspense,\n              slotScopeIds,\n              optimized,\n              rendererInternals,\n              hydrateChildren\n            );\n          }\n        } else if (shapeFlag & 128) {\n          nextNode = vnode.type.hydrate(\n            node,\n            vnode,\n            parentComponent,\n            parentSuspense,\n            getContainerType(parentNode(node)),\n            slotScopeIds,\n            optimized,\n            rendererInternals,\n            hydrateNode\n          );\n        } else if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) {\n          warn$1(\"Invalid HostVNode type:\", type, `(${typeof type})`);\n        }\n    }\n    if (ref != null) {\n      setRef(ref, null, parentSuspense, vnode);\n    }\n    return nextNode;\n  };\n  const hydrateElement = (el, vnode, parentComponent, parentSuspense, slotScopeIds, optimized) => {\n    optimized = optimized || !!vnode.dynamicChildren;\n    const { type, props, patchFlag, shapeFlag, dirs, transition } = vnode;\n    const forcePatch = type === \"input\" || type === \"option\";\n    if (!!(process.env.NODE_ENV !== \"production\") || forcePatch || patchFlag !== -1) {\n      if (dirs) {\n        invokeDirectiveHook(vnode, null, parentComponent, \"created\");\n      }\n      let needCallTransitionHooks = false;\n      if (isTemplateNode(el)) {\n        needCallTransitionHooks = needTransition(\n          null,\n          // no need check parentSuspense in hydration\n          transition\n        ) && parentComponent && parentComponent.vnode.props && parentComponent.vnode.props.appear;\n        const content = el.content.firstChild;\n        if (needCallTransitionHooks) {\n          const cls = content.getAttribute(\"class\");\n          if (cls) content.$cls = cls;\n          transition.beforeEnter(content);\n        }\n        replaceNode(content, el, parentComponent);\n        vnode.el = el = content;\n      }\n      if (shapeFlag & 16 && // skip if element has innerHTML / textContent\n      !(props && (props.innerHTML || props.textContent))) {\n        let next = hydrateChildren(\n          el.firstChild,\n          vnode,\n          el,\n          parentComponent,\n          parentSuspense,\n          slotScopeIds,\n          optimized\n        );\n        let hasWarned = false;\n        while (next) {\n          if (!isMismatchAllowed(el, 1 /* CHILDREN */)) {\n            if ((!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && !hasWarned) {\n              warn$1(\n                `Hydration children mismatch on`,\n                el,\n                `\nServer rendered element contains more child nodes than client vdom.`\n              );\n              hasWarned = true;\n            }\n            logMismatchError();\n          }\n          const cur = next;\n          next = next.nextSibling;\n          remove(cur);\n        }\n      } else if (shapeFlag & 8) {\n        let clientText = vnode.children;\n        if (clientText[0] === \"\\n\" && (el.tagName === \"PRE\" || el.tagName === \"TEXTAREA\")) {\n          clientText = clientText.slice(1);\n        }\n        if (el.textContent !== clientText) {\n          if (!isMismatchAllowed(el, 0 /* TEXT */)) {\n            (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && warn$1(\n              `Hydration text content mismatch on`,\n              el,\n              `\n  - rendered on server: ${el.textContent}\n  - expected on client: ${vnode.children}`\n            );\n            logMismatchError();\n          }\n          el.textContent = vnode.children;\n        }\n      }\n      if (props) {\n        if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__ || forcePatch || !optimized || patchFlag & (16 | 32)) {\n          const isCustomElement = el.tagName.includes(\"-\");\n          for (const key in props) {\n            if ((!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && // #11189 skip if this node has directives that have created hooks\n            // as it could have mutated the DOM in any possible way\n            !(dirs && dirs.some((d) => d.dir.created)) && propHasMismatch(el, key, props[key], vnode, parentComponent)) {\n              logMismatchError();\n            }\n            if (forcePatch && (key.endsWith(\"value\") || key === \"indeterminate\") || isOn(key) && !isReservedProp(key) || // force hydrate v-bind with .prop modifiers\n            key[0] === \".\" || isCustomElement) {\n              patchProp(el, key, null, props[key], void 0, parentComponent);\n            }\n          }\n        } else if (props.onClick) {\n          patchProp(\n            el,\n            \"onClick\",\n            null,\n            props.onClick,\n            void 0,\n            parentComponent\n          );\n        } else if (patchFlag & 4 && isReactive(props.style)) {\n          for (const key in props.style) props.style[key];\n        }\n      }\n      let vnodeHooks;\n      if (vnodeHooks = props && props.onVnodeBeforeMount) {\n        invokeVNodeHook(vnodeHooks, parentComponent, vnode);\n      }\n      if (dirs) {\n        invokeDirectiveHook(vnode, null, parentComponent, \"beforeMount\");\n      }\n      if ((vnodeHooks = props && props.onVnodeMounted) || dirs || needCallTransitionHooks) {\n        queueEffectWithSuspense(() => {\n          vnodeHooks && invokeVNodeHook(vnodeHooks, parentComponent, vnode);\n          needCallTransitionHooks && transition.enter(el);\n          dirs && invokeDirectiveHook(vnode, null, parentComponent, \"mounted\");\n        }, parentSuspense);\n      }\n    }\n    return el.nextSibling;\n  };\n  const hydrateChildren = (node, parentVNode, container, parentComponent, parentSuspense, slotScopeIds, optimized) => {\n    optimized = optimized || !!parentVNode.dynamicChildren;\n    const children = parentVNode.children;\n    const l = children.length;\n    let hasWarned = false;\n    for (let i = 0; i < l; i++) {\n      const vnode = optimized ? children[i] : children[i] = normalizeVNode(children[i]);\n      const isText = vnode.type === Text;\n      if (node) {\n        if (isText && !optimized) {\n          if (i + 1 < l && normalizeVNode(children[i + 1]).type === Text) {\n            insert(\n              createText(\n                node.data.slice(vnode.children.length)\n              ),\n              container,\n              nextSibling(node)\n            );\n            node.data = vnode.children;\n          }\n        }\n        node = hydrateNode(\n          node,\n          vnode,\n          parentComponent,\n          parentSuspense,\n          slotScopeIds,\n          optimized\n        );\n      } else if (isText && !vnode.children) {\n        insert(vnode.el = createText(\"\"), container);\n      } else {\n        if (!isMismatchAllowed(container, 1 /* CHILDREN */)) {\n          if ((!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && !hasWarned) {\n            warn$1(\n              `Hydration children mismatch on`,\n              container,\n              `\nServer rendered element contains fewer child nodes than client vdom.`\n            );\n            hasWarned = true;\n          }\n          logMismatchError();\n        }\n        patch(\n          null,\n          vnode,\n          container,\n          null,\n          parentComponent,\n          parentSuspense,\n          getContainerType(container),\n          slotScopeIds\n        );\n      }\n    }\n    return node;\n  };\n  const hydrateFragment = (node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized) => {\n    const { slotScopeIds: fragmentSlotScopeIds } = vnode;\n    if (fragmentSlotScopeIds) {\n      slotScopeIds = slotScopeIds ? slotScopeIds.concat(fragmentSlotScopeIds) : fragmentSlotScopeIds;\n    }\n    const container = parentNode(node);\n    const next = hydrateChildren(\n      nextSibling(node),\n      vnode,\n      container,\n      parentComponent,\n      parentSuspense,\n      slotScopeIds,\n      optimized\n    );\n    if (next && isComment(next) && next.data === \"]\") {\n      return nextSibling(vnode.anchor = next);\n    } else {\n      logMismatchError();\n      insert(vnode.anchor = createComment(`]`), container, next);\n      return next;\n    }\n  };\n  const handleMismatch = (node, vnode, parentComponent, parentSuspense, slotScopeIds, isFragment) => {\n    if (!isMismatchAllowed(node.parentElement, 1 /* CHILDREN */)) {\n      (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && warn$1(\n        `Hydration node mismatch:\n- rendered on server:`,\n        node,\n        node.nodeType === 3 ? `(text)` : isComment(node) && node.data === \"[\" ? `(start of fragment)` : ``,\n        `\n- expected on client:`,\n        vnode.type\n      );\n      logMismatchError();\n    }\n    vnode.el = null;\n    if (isFragment) {\n      const end = locateClosingAnchor(node);\n      while (true) {\n        const next2 = nextSibling(node);\n        if (next2 && next2 !== end) {\n          remove(next2);\n        } else {\n          break;\n        }\n      }\n    }\n    const next = nextSibling(node);\n    const container = parentNode(node);\n    remove(node);\n    patch(\n      null,\n      vnode,\n      container,\n      next,\n      parentComponent,\n      parentSuspense,\n      getContainerType(container),\n      slotScopeIds\n    );\n    if (parentComponent) {\n      parentComponent.vnode.el = vnode.el;\n      updateHOCHostEl(parentComponent, vnode.el);\n    }\n    return next;\n  };\n  const locateClosingAnchor = (node, open = \"[\", close = \"]\") => {\n    let match = 0;\n    while (node) {\n      node = nextSibling(node);\n      if (node && isComment(node)) {\n        if (node.data === open) match++;\n        if (node.data === close) {\n          if (match === 0) {\n            return nextSibling(node);\n          } else {\n            match--;\n          }\n        }\n      }\n    }\n    return node;\n  };\n  const replaceNode = (newNode, oldNode, parentComponent) => {\n    const parentNode2 = oldNode.parentNode;\n    if (parentNode2) {\n      parentNode2.replaceChild(newNode, oldNode);\n    }\n    let parent = parentComponent;\n    while (parent) {\n      if (parent.vnode.el === oldNode) {\n        parent.vnode.el = parent.subTree.el = newNode;\n      }\n      parent = parent.parent;\n    }\n  };\n  const isTemplateNode = (node) => {\n    return node.nodeType === 1 && node.tagName === \"TEMPLATE\";\n  };\n  return [hydrate, hydrateNode];\n}\nfunction propHasMismatch(el, key, clientValue, vnode, instance) {\n  let mismatchType;\n  let mismatchKey;\n  let actual;\n  let expected;\n  if (key === \"class\") {\n    if (el.$cls) {\n      actual = el.$cls;\n      delete el.$cls;\n    } else {\n      actual = el.getAttribute(\"class\");\n    }\n    expected = normalizeClass(clientValue);\n    if (!isSetEqual(toClassSet(actual || \"\"), toClassSet(expected))) {\n      mismatchType = 2 /* CLASS */;\n      mismatchKey = `class`;\n    }\n  } else if (key === \"style\") {\n    actual = el.getAttribute(\"style\") || \"\";\n    expected = isString(clientValue) ? clientValue : stringifyStyle(normalizeStyle(clientValue));\n    const actualMap = toStyleMap(actual);\n    const expectedMap = toStyleMap(expected);\n    if (vnode.dirs) {\n      for (const { dir, value } of vnode.dirs) {\n        if (dir.name === \"show\" && !value) {\n          expectedMap.set(\"display\", \"none\");\n        }\n      }\n    }\n    if (instance) {\n      resolveCssVars(instance, vnode, expectedMap);\n    }\n    if (!isMapEqual(actualMap, expectedMap)) {\n      mismatchType = 3 /* STYLE */;\n      mismatchKey = \"style\";\n    }\n  } else if (el instanceof SVGElement && isKnownSvgAttr(key) || el instanceof HTMLElement && (isBooleanAttr(key) || isKnownHtmlAttr(key))) {\n    if (isBooleanAttr(key)) {\n      actual = el.hasAttribute(key);\n      expected = includeBooleanAttr(clientValue);\n    } else if (clientValue == null) {\n      actual = el.hasAttribute(key);\n      expected = false;\n    } else {\n      if (el.hasAttribute(key)) {\n        actual = el.getAttribute(key);\n      } else if (key === \"value\" && el.tagName === \"TEXTAREA\") {\n        actual = el.value;\n      } else {\n        actual = false;\n      }\n      expected = isRenderableAttrValue(clientValue) ? String(clientValue) : false;\n    }\n    if (actual !== expected) {\n      mismatchType = 4 /* ATTRIBUTE */;\n      mismatchKey = key;\n    }\n  }\n  if (mismatchType != null && !isMismatchAllowed(el, mismatchType)) {\n    const format = (v) => v === false ? `(not rendered)` : `${mismatchKey}=\"${v}\"`;\n    const preSegment = `Hydration ${MismatchTypeString[mismatchType]} mismatch on`;\n    const postSegment = `\n  - rendered on server: ${format(actual)}\n  - expected on client: ${format(expected)}\n  Note: this mismatch is check-only. The DOM will not be rectified in production due to performance overhead.\n  You should fix the source of the mismatch.`;\n    {\n      warn$1(preSegment, el, postSegment);\n    }\n    return true;\n  }\n  return false;\n}\nfunction toClassSet(str) {\n  return new Set(str.trim().split(/\\s+/));\n}\nfunction isSetEqual(a, b) {\n  if (a.size !== b.size) {\n    return false;\n  }\n  for (const s of a) {\n    if (!b.has(s)) {\n      return false;\n    }\n  }\n  return true;\n}\nfunction toStyleMap(str) {\n  const styleMap = /* @__PURE__ */ new Map();\n  for (const item of str.split(\";\")) {\n    let [key, value] = item.split(\":\");\n    key = key.trim();\n    value = value && value.trim();\n    if (key && value) {\n      styleMap.set(key, value);\n    }\n  }\n  return styleMap;\n}\nfunction isMapEqual(a, b) {\n  if (a.size !== b.size) {\n    return false;\n  }\n  for (const [key, value] of a) {\n    if (value !== b.get(key)) {\n      return false;\n    }\n  }\n  return true;\n}\nfunction resolveCssVars(instance, vnode, expectedMap) {\n  const root = instance.subTree;\n  if (instance.getCssVars && (vnode === root || root && root.type === Fragment && root.children.includes(vnode))) {\n    const cssVars = instance.getCssVars();\n    for (const key in cssVars) {\n      const value = normalizeCssVarValue(cssVars[key]);\n      expectedMap.set(`--${getEscapedCssVarName(key, false)}`, value);\n    }\n  }\n  if (vnode === root && instance.parent) {\n    resolveCssVars(instance.parent, instance.vnode, expectedMap);\n  }\n}\nconst allowMismatchAttr = \"data-allow-mismatch\";\nconst MismatchTypeString = {\n  [0 /* TEXT */]: \"text\",\n  [1 /* CHILDREN */]: \"children\",\n  [2 /* CLASS */]: \"class\",\n  [3 /* STYLE */]: \"style\",\n  [4 /* ATTRIBUTE */]: \"attribute\"\n};\nfunction isMismatchAllowed(el, allowedType) {\n  if (allowedType === 0 /* TEXT */ || allowedType === 1 /* CHILDREN */) {\n    while (el && !el.hasAttribute(allowMismatchAttr)) {\n      el = el.parentElement;\n    }\n  }\n  const allowedAttr = el && el.getAttribute(allowMismatchAttr);\n  if (allowedAttr == null) {\n    return false;\n  } else if (allowedAttr === \"\") {\n    return true;\n  } else {\n    const list = allowedAttr.split(\",\");\n    if (allowedType === 0 /* TEXT */ && list.includes(\"children\")) {\n      return true;\n    }\n    return list.includes(MismatchTypeString[allowedType]);\n  }\n}\n\nconst requestIdleCallback = getGlobalThis().requestIdleCallback || ((cb) => setTimeout(cb, 1));\nconst cancelIdleCallback = getGlobalThis().cancelIdleCallback || ((id) => clearTimeout(id));\nconst hydrateOnIdle = (timeout = 1e4) => (hydrate) => {\n  const id = requestIdleCallback(hydrate, { timeout });\n  return () => cancelIdleCallback(id);\n};\nfunction elementIsVisibleInViewport(el) {\n  const { top, left, bottom, right } = el.getBoundingClientRect();\n  const { innerHeight, innerWidth } = window;\n  return (top > 0 && top < innerHeight || bottom > 0 && bottom < innerHeight) && (left > 0 && left < innerWidth || right > 0 && right < innerWidth);\n}\nconst hydrateOnVisible = (opts) => (hydrate, forEach) => {\n  const ob = new IntersectionObserver((entries) => {\n    for (const e of entries) {\n      if (!e.isIntersecting) continue;\n      ob.disconnect();\n      hydrate();\n      break;\n    }\n  }, opts);\n  forEach((el) => {\n    if (!(el instanceof Element)) return;\n    if (elementIsVisibleInViewport(el)) {\n      hydrate();\n      ob.disconnect();\n      return false;\n    }\n    ob.observe(el);\n  });\n  return () => ob.disconnect();\n};\nconst hydrateOnMediaQuery = (query) => (hydrate) => {\n  if (query) {\n    const mql = matchMedia(query);\n    if (mql.matches) {\n      hydrate();\n    } else {\n      mql.addEventListener(\"change\", hydrate, { once: true });\n      return () => mql.removeEventListener(\"change\", hydrate);\n    }\n  }\n};\nconst hydrateOnInteraction = (interactions = []) => (hydrate, forEach) => {\n  if (isString(interactions)) interactions = [interactions];\n  let hasHydrated = false;\n  const doHydrate = (e) => {\n    if (!hasHydrated) {\n      hasHydrated = true;\n      teardown();\n      hydrate();\n      e.target.dispatchEvent(new e.constructor(e.type, e));\n    }\n  };\n  const teardown = () => {\n    forEach((el) => {\n      for (const i of interactions) {\n        el.removeEventListener(i, doHydrate);\n      }\n    });\n  };\n  forEach((el) => {\n    for (const i of interactions) {\n      el.addEventListener(i, doHydrate, { once: true });\n    }\n  });\n  return teardown;\n};\nfunction forEachElement(node, cb) {\n  if (isComment(node) && node.data === \"[\") {\n    let depth = 1;\n    let next = node.nextSibling;\n    while (next) {\n      if (next.nodeType === 1) {\n        const result = cb(next);\n        if (result === false) {\n          break;\n        }\n      } else if (isComment(next)) {\n        if (next.data === \"]\") {\n          if (--depth === 0) break;\n        } else if (next.data === \"[\") {\n          depth++;\n        }\n      }\n      next = next.nextSibling;\n    }\n  } else {\n    cb(node);\n  }\n}\n\nconst isAsyncWrapper = (i) => !!i.type.__asyncLoader;\n/*! #__NO_SIDE_EFFECTS__ */\n// @__NO_SIDE_EFFECTS__\nfunction defineAsyncComponent(source) {\n  if (isFunction(source)) {\n    source = { loader: source };\n  }\n  const {\n    loader,\n    loadingComponent,\n    errorComponent,\n    delay = 200,\n    hydrate: hydrateStrategy,\n    timeout,\n    // undefined = never times out\n    suspensible = true,\n    onError: userOnError\n  } = source;\n  let pendingRequest = null;\n  let resolvedComp;\n  let retries = 0;\n  const retry = () => {\n    retries++;\n    pendingRequest = null;\n    return load();\n  };\n  const load = () => {\n    let thisRequest;\n    return pendingRequest || (thisRequest = pendingRequest = loader().catch((err) => {\n      err = err instanceof Error ? err : new Error(String(err));\n      if (userOnError) {\n        return new Promise((resolve, reject) => {\n          const userRetry = () => resolve(retry());\n          const userFail = () => reject(err);\n          userOnError(err, userRetry, userFail, retries + 1);\n        });\n      } else {\n        throw err;\n      }\n    }).then((comp) => {\n      if (thisRequest !== pendingRequest && pendingRequest) {\n        return pendingRequest;\n      }\n      if (!!(process.env.NODE_ENV !== \"production\") && !comp) {\n        warn$1(\n          `Async component loader resolved to undefined. If you are using retry(), make sure to return its return value.`\n        );\n      }\n      if (comp && (comp.__esModule || comp[Symbol.toStringTag] === \"Module\")) {\n        comp = comp.default;\n      }\n      if (!!(process.env.NODE_ENV !== \"production\") && comp && !isObject(comp) && !isFunction(comp)) {\n        throw new Error(`Invalid async component load result: ${comp}`);\n      }\n      resolvedComp = comp;\n      return comp;\n    }));\n  };\n  return defineComponent({\n    name: \"AsyncComponentWrapper\",\n    __asyncLoader: load,\n    __asyncHydrate(el, instance, hydrate) {\n      let patched = false;\n      (instance.bu || (instance.bu = [])).push(() => patched = true);\n      const performHydrate = () => {\n        if (patched) {\n          if (!!(process.env.NODE_ENV !== \"production\")) {\n            warn$1(\n              `Skipping lazy hydration for component '${getComponentName(resolvedComp) || resolvedComp.__file}': it was updated before lazy hydration performed.`\n            );\n          }\n          return;\n        }\n        hydrate();\n      };\n      const doHydrate = hydrateStrategy ? () => {\n        const teardown = hydrateStrategy(\n          performHydrate,\n          (cb) => forEachElement(el, cb)\n        );\n        if (teardown) {\n          (instance.bum || (instance.bum = [])).push(teardown);\n        }\n      } : performHydrate;\n      if (resolvedComp) {\n        doHydrate();\n      } else {\n        load().then(() => !instance.isUnmounted && doHydrate());\n      }\n    },\n    get __asyncResolved() {\n      return resolvedComp;\n    },\n    setup() {\n      const instance = currentInstance;\n      markAsyncBoundary(instance);\n      if (resolvedComp) {\n        return () => createInnerComp(resolvedComp, instance);\n      }\n      const onError = (err) => {\n        pendingRequest = null;\n        handleError(\n          err,\n          instance,\n          13,\n          !errorComponent\n        );\n      };\n      if (suspensible && instance.suspense || isInSSRComponentSetup) {\n        return load().then((comp) => {\n          return () => createInnerComp(comp, instance);\n        }).catch((err) => {\n          onError(err);\n          return () => errorComponent ? createVNode(errorComponent, {\n            error: err\n          }) : null;\n        });\n      }\n      const loaded = ref(false);\n      const error = ref();\n      const delayed = ref(!!delay);\n      if (delay) {\n        setTimeout(() => {\n          delayed.value = false;\n        }, delay);\n      }\n      if (timeout != null) {\n        setTimeout(() => {\n          if (!loaded.value && !error.value) {\n            const err = new Error(\n              `Async component timed out after ${timeout}ms.`\n            );\n            onError(err);\n            error.value = err;\n          }\n        }, timeout);\n      }\n      load().then(() => {\n        loaded.value = true;\n        if (instance.parent && isKeepAlive(instance.parent.vnode)) {\n          instance.parent.update();\n        }\n      }).catch((err) => {\n        onError(err);\n        error.value = err;\n      });\n      return () => {\n        if (loaded.value && resolvedComp) {\n          return createInnerComp(resolvedComp, instance);\n        } else if (error.value && errorComponent) {\n          return createVNode(errorComponent, {\n            error: error.value\n          });\n        } else if (loadingComponent && !delayed.value) {\n          return createVNode(loadingComponent);\n        }\n      };\n    }\n  });\n}\nfunction createInnerComp(comp, parent) {\n  const { ref: ref2, props, children, ce } = parent.vnode;\n  const vnode = createVNode(comp, props, children);\n  vnode.ref = ref2;\n  vnode.ce = ce;\n  delete parent.vnode.ce;\n  return vnode;\n}\n\nconst isKeepAlive = (vnode) => vnode.type.__isKeepAlive;\nconst KeepAliveImpl = {\n  name: `KeepAlive`,\n  // Marker for special handling inside the renderer. We are not using a ===\n  // check directly on KeepAlive in the renderer, because importing it directly\n  // would prevent it from being tree-shaken.\n  __isKeepAlive: true,\n  props: {\n    include: [String, RegExp, Array],\n    exclude: [String, RegExp, Array],\n    max: [String, Number]\n  },\n  setup(props, { slots }) {\n    const instance = getCurrentInstance();\n    const sharedContext = instance.ctx;\n    if (!sharedContext.renderer) {\n      return () => {\n        const children = slots.default && slots.default();\n        return children && children.length === 1 ? children[0] : children;\n      };\n    }\n    const cache = /* @__PURE__ */ new Map();\n    const keys = /* @__PURE__ */ new Set();\n    let current = null;\n    if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n      instance.__v_cache = cache;\n    }\n    const parentSuspense = instance.suspense;\n    const {\n      renderer: {\n        p: patch,\n        m: move,\n        um: _unmount,\n        o: { createElement }\n      }\n    } = sharedContext;\n    const storageContainer = createElement(\"div\");\n    sharedContext.activate = (vnode, container, anchor, namespace, optimized) => {\n      const instance2 = vnode.component;\n      move(vnode, container, anchor, 0, parentSuspense);\n      patch(\n        instance2.vnode,\n        vnode,\n        container,\n        anchor,\n        instance2,\n        parentSuspense,\n        namespace,\n        vnode.slotScopeIds,\n        optimized\n      );\n      queuePostRenderEffect(() => {\n        instance2.isDeactivated = false;\n        if (instance2.a) {\n          invokeArrayFns(instance2.a);\n        }\n        const vnodeHook = vnode.props && vnode.props.onVnodeMounted;\n        if (vnodeHook) {\n          invokeVNodeHook(vnodeHook, instance2.parent, vnode);\n        }\n      }, parentSuspense);\n      if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n        devtoolsComponentAdded(instance2);\n      }\n    };\n    sharedContext.deactivate = (vnode) => {\n      const instance2 = vnode.component;\n      invalidateMount(instance2.m);\n      invalidateMount(instance2.a);\n      move(vnode, storageContainer, null, 1, parentSuspense);\n      queuePostRenderEffect(() => {\n        if (instance2.da) {\n          invokeArrayFns(instance2.da);\n        }\n        const vnodeHook = vnode.props && vnode.props.onVnodeUnmounted;\n        if (vnodeHook) {\n          invokeVNodeHook(vnodeHook, instance2.parent, vnode);\n        }\n        instance2.isDeactivated = true;\n      }, parentSuspense);\n      if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n        devtoolsComponentAdded(instance2);\n      }\n      if (!!(process.env.NODE_ENV !== \"production\") && true) {\n        instance2.__keepAliveStorageContainer = storageContainer;\n      }\n    };\n    function unmount(vnode) {\n      resetShapeFlag(vnode);\n      _unmount(vnode, instance, parentSuspense, true);\n    }\n    function pruneCache(filter) {\n      cache.forEach((vnode, key) => {\n        const name = getComponentName(vnode.type);\n        if (name && !filter(name)) {\n          pruneCacheEntry(key);\n        }\n      });\n    }\n    function pruneCacheEntry(key) {\n      const cached = cache.get(key);\n      if (cached && (!current || !isSameVNodeType(cached, current))) {\n        unmount(cached);\n      } else if (current) {\n        resetShapeFlag(current);\n      }\n      cache.delete(key);\n      keys.delete(key);\n    }\n    watch(\n      () => [props.include, props.exclude],\n      ([include, exclude]) => {\n        include && pruneCache((name) => matches(include, name));\n        exclude && pruneCache((name) => !matches(exclude, name));\n      },\n      // prune post-render after `current` has been updated\n      { flush: \"post\", deep: true }\n    );\n    let pendingCacheKey = null;\n    const cacheSubtree = () => {\n      if (pendingCacheKey != null) {\n        if (isSuspense(instance.subTree.type)) {\n          queuePostRenderEffect(() => {\n            cache.set(pendingCacheKey, getInnerChild(instance.subTree));\n          }, instance.subTree.suspense);\n        } else {\n          cache.set(pendingCacheKey, getInnerChild(instance.subTree));\n        }\n      }\n    };\n    onMounted(cacheSubtree);\n    onUpdated(cacheSubtree);\n    onBeforeUnmount(() => {\n      cache.forEach((cached) => {\n        const { subTree, suspense } = instance;\n        const vnode = getInnerChild(subTree);\n        if (cached.type === vnode.type && cached.key === vnode.key) {\n          resetShapeFlag(vnode);\n          const da = vnode.component.da;\n          da && queuePostRenderEffect(da, suspense);\n          return;\n        }\n        unmount(cached);\n      });\n    });\n    return () => {\n      pendingCacheKey = null;\n      if (!slots.default) {\n        return current = null;\n      }\n      const children = slots.default();\n      const rawVNode = children[0];\n      if (children.length > 1) {\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          warn$1(`KeepAlive should contain exactly one component child.`);\n        }\n        current = null;\n        return children;\n      } else if (!isVNode(rawVNode) || !(rawVNode.shapeFlag & 4) && !(rawVNode.shapeFlag & 128)) {\n        current = null;\n        return rawVNode;\n      }\n      let vnode = getInnerChild(rawVNode);\n      if (vnode.type === Comment) {\n        current = null;\n        return vnode;\n      }\n      const comp = vnode.type;\n      const name = getComponentName(\n        isAsyncWrapper(vnode) ? vnode.type.__asyncResolved || {} : comp\n      );\n      const { include, exclude, max } = props;\n      if (include && (!name || !matches(include, name)) || exclude && name && matches(exclude, name)) {\n        vnode.shapeFlag &= -257;\n        current = vnode;\n        return rawVNode;\n      }\n      const key = vnode.key == null ? comp : vnode.key;\n      const cachedVNode = cache.get(key);\n      if (vnode.el) {\n        vnode = cloneVNode(vnode);\n        if (rawVNode.shapeFlag & 128) {\n          rawVNode.ssContent = vnode;\n        }\n      }\n      pendingCacheKey = key;\n      if (cachedVNode) {\n        vnode.el = cachedVNode.el;\n        vnode.component = cachedVNode.component;\n        if (vnode.transition) {\n          setTransitionHooks(vnode, vnode.transition);\n        }\n        vnode.shapeFlag |= 512;\n        keys.delete(key);\n        keys.add(key);\n      } else {\n        keys.add(key);\n        if (max && keys.size > parseInt(max, 10)) {\n          pruneCacheEntry(keys.values().next().value);\n        }\n      }\n      vnode.shapeFlag |= 256;\n      current = vnode;\n      return isSuspense(rawVNode.type) ? rawVNode : vnode;\n    };\n  }\n};\nconst KeepAlive = KeepAliveImpl;\nfunction matches(pattern, name) {\n  if (isArray(pattern)) {\n    return pattern.some((p) => matches(p, name));\n  } else if (isString(pattern)) {\n    return pattern.split(\",\").includes(name);\n  } else if (isRegExp(pattern)) {\n    pattern.lastIndex = 0;\n    return pattern.test(name);\n  }\n  return false;\n}\nfunction onActivated(hook, target) {\n  registerKeepAliveHook(hook, \"a\", target);\n}\nfunction onDeactivated(hook, target) {\n  registerKeepAliveHook(hook, \"da\", target);\n}\nfunction registerKeepAliveHook(hook, type, target = currentInstance) {\n  const wrappedHook = hook.__wdc || (hook.__wdc = () => {\n    let current = target;\n    while (current) {\n      if (current.isDeactivated) {\n        return;\n      }\n      current = current.parent;\n    }\n    return hook();\n  });\n  injectHook(type, wrappedHook, target);\n  if (target) {\n    let current = target.parent;\n    while (current && current.parent) {\n      if (isKeepAlive(current.parent.vnode)) {\n        injectToKeepAliveRoot(wrappedHook, type, target, current);\n      }\n      current = current.parent;\n    }\n  }\n}\nfunction injectToKeepAliveRoot(hook, type, target, keepAliveRoot) {\n  const injected = injectHook(\n    type,\n    hook,\n    keepAliveRoot,\n    true\n    /* prepend */\n  );\n  onUnmounted(() => {\n    remove(keepAliveRoot[type], injected);\n  }, target);\n}\nfunction resetShapeFlag(vnode) {\n  vnode.shapeFlag &= -257;\n  vnode.shapeFlag &= -513;\n}\nfunction getInnerChild(vnode) {\n  return vnode.shapeFlag & 128 ? vnode.ssContent : vnode;\n}\n\nfunction injectHook(type, hook, target = currentInstance, prepend = false) {\n  if (target) {\n    const hooks = target[type] || (target[type] = []);\n    const wrappedHook = hook.__weh || (hook.__weh = (...args) => {\n      pauseTracking();\n      const reset = setCurrentInstance(target);\n      const res = callWithAsyncErrorHandling(hook, target, type, args);\n      reset();\n      resetTracking();\n      return res;\n    });\n    if (prepend) {\n      hooks.unshift(wrappedHook);\n    } else {\n      hooks.push(wrappedHook);\n    }\n    return wrappedHook;\n  } else if (!!(process.env.NODE_ENV !== \"production\")) {\n    const apiName = toHandlerKey(ErrorTypeStrings$1[type].replace(/ hook$/, \"\"));\n    warn$1(\n      `${apiName} is called when there is no active component instance to be associated with. Lifecycle injection APIs can only be used during execution of setup().` + (` If you are using async setup(), make sure to register lifecycle hooks before the first await statement.` )\n    );\n  }\n}\nconst createHook = (lifecycle) => (hook, target = currentInstance) => {\n  if (!isInSSRComponentSetup || lifecycle === \"sp\") {\n    injectHook(lifecycle, (...args) => hook(...args), target);\n  }\n};\nconst onBeforeMount = createHook(\"bm\");\nconst onMounted = createHook(\"m\");\nconst onBeforeUpdate = createHook(\n  \"bu\"\n);\nconst onUpdated = createHook(\"u\");\nconst onBeforeUnmount = createHook(\n  \"bum\"\n);\nconst onUnmounted = createHook(\"um\");\nconst onServerPrefetch = createHook(\n  \"sp\"\n);\nconst onRenderTriggered = createHook(\"rtg\");\nconst onRenderTracked = createHook(\"rtc\");\nfunction onErrorCaptured(hook, target = currentInstance) {\n  injectHook(\"ec\", hook, target);\n}\n\nconst COMPONENTS = \"components\";\nconst DIRECTIVES = \"directives\";\nfunction resolveComponent(name, maybeSelfReference) {\n  return resolveAsset(COMPONENTS, name, true, maybeSelfReference) || name;\n}\nconst NULL_DYNAMIC_COMPONENT = Symbol.for(\"v-ndc\");\nfunction resolveDynamicComponent(component) {\n  if (isString(component)) {\n    return resolveAsset(COMPONENTS, component, false) || component;\n  } else {\n    return component || NULL_DYNAMIC_COMPONENT;\n  }\n}\nfunction resolveDirective(name) {\n  return resolveAsset(DIRECTIVES, name);\n}\nfunction resolveAsset(type, name, warnMissing = true, maybeSelfReference = false) {\n  const instance = currentRenderingInstance || currentInstance;\n  if (instance) {\n    const Component = instance.type;\n    if (type === COMPONENTS) {\n      const selfName = getComponentName(\n        Component,\n        false\n      );\n      if (selfName && (selfName === name || selfName === camelize(name) || selfName === capitalize(camelize(name)))) {\n        return Component;\n      }\n    }\n    const res = (\n      // local registration\n      // check instance[type] first which is resolved for options API\n      resolve(instance[type] || Component[type], name) || // global registration\n      resolve(instance.appContext[type], name)\n    );\n    if (!res && maybeSelfReference) {\n      return Component;\n    }\n    if (!!(process.env.NODE_ENV !== \"production\") && warnMissing && !res) {\n      const extra = type === COMPONENTS ? `\nIf this is a native custom element, make sure to exclude it from component resolution via compilerOptions.isCustomElement.` : ``;\n      warn$1(`Failed to resolve ${type.slice(0, -1)}: ${name}${extra}`);\n    }\n    return res;\n  } else if (!!(process.env.NODE_ENV !== \"production\")) {\n    warn$1(\n      `resolve${capitalize(type.slice(0, -1))} can only be used in render() or setup().`\n    );\n  }\n}\nfunction resolve(registry, name) {\n  return registry && (registry[name] || registry[camelize(name)] || registry[capitalize(camelize(name))]);\n}\n\nfunction renderList(source, renderItem, cache, index) {\n  let ret;\n  const cached = cache && cache[index];\n  const sourceIsArray = isArray(source);\n  if (sourceIsArray || isString(source)) {\n    const sourceIsReactiveArray = sourceIsArray && isReactive(source);\n    let needsWrap = false;\n    let isReadonlySource = false;\n    if (sourceIsReactiveArray) {\n      needsWrap = !isShallow(source);\n      isReadonlySource = isReadonly(source);\n      source = shallowReadArray(source);\n    }\n    ret = new Array(source.length);\n    for (let i = 0, l = source.length; i < l; i++) {\n      ret[i] = renderItem(\n        needsWrap ? isReadonlySource ? toReadonly(toReactive(source[i])) : toReactive(source[i]) : source[i],\n        i,\n        void 0,\n        cached && cached[i]\n      );\n    }\n  } else if (typeof source === \"number\") {\n    if (!!(process.env.NODE_ENV !== \"production\") && !Number.isInteger(source)) {\n      warn$1(`The v-for range expect an integer value but got ${source}.`);\n    }\n    ret = new Array(source);\n    for (let i = 0; i < source; i++) {\n      ret[i] = renderItem(i + 1, i, void 0, cached && cached[i]);\n    }\n  } else if (isObject(source)) {\n    if (source[Symbol.iterator]) {\n      ret = Array.from(\n        source,\n        (item, i) => renderItem(item, i, void 0, cached && cached[i])\n      );\n    } else {\n      const keys = Object.keys(source);\n      ret = new Array(keys.length);\n      for (let i = 0, l = keys.length; i < l; i++) {\n        const key = keys[i];\n        ret[i] = renderItem(source[key], key, i, cached && cached[i]);\n      }\n    }\n  } else {\n    ret = [];\n  }\n  if (cache) {\n    cache[index] = ret;\n  }\n  return ret;\n}\n\nfunction createSlots(slots, dynamicSlots) {\n  for (let i = 0; i < dynamicSlots.length; i++) {\n    const slot = dynamicSlots[i];\n    if (isArray(slot)) {\n      for (let j = 0; j < slot.length; j++) {\n        slots[slot[j].name] = slot[j].fn;\n      }\n    } else if (slot) {\n      slots[slot.name] = slot.key ? (...args) => {\n        const res = slot.fn(...args);\n        if (res) res.key = slot.key;\n        return res;\n      } : slot.fn;\n    }\n  }\n  return slots;\n}\n\nfunction renderSlot(slots, name, props = {}, fallback, noSlotted) {\n  if (currentRenderingInstance.ce || currentRenderingInstance.parent && isAsyncWrapper(currentRenderingInstance.parent) && currentRenderingInstance.parent.ce) {\n    if (name !== \"default\") props.name = name;\n    return openBlock(), createBlock(\n      Fragment,\n      null,\n      [createVNode(\"slot\", props, fallback && fallback())],\n      64\n    );\n  }\n  let slot = slots[name];\n  if (!!(process.env.NODE_ENV !== \"production\") && slot && slot.length > 1) {\n    warn$1(\n      `SSR-optimized slot function detected in a non-SSR-optimized render function. You need to mark this component with $dynamic-slots in the parent template.`\n    );\n    slot = () => [];\n  }\n  if (slot && slot._c) {\n    slot._d = false;\n  }\n  openBlock();\n  const validSlotContent = slot && ensureValidVNode(slot(props));\n  const slotKey = props.key || // slot content array of a dynamic conditional slot may have a branch\n  // key attached in the `createSlots` helper, respect that\n  validSlotContent && validSlotContent.key;\n  const rendered = createBlock(\n    Fragment,\n    {\n      key: (slotKey && !isSymbol(slotKey) ? slotKey : `_${name}`) + // #7256 force differentiate fallback content from actual content\n      (!validSlotContent && fallback ? \"_fb\" : \"\")\n    },\n    validSlotContent || (fallback ? fallback() : []),\n    validSlotContent && slots._ === 1 ? 64 : -2\n  );\n  if (!noSlotted && rendered.scopeId) {\n    rendered.slotScopeIds = [rendered.scopeId + \"-s\"];\n  }\n  if (slot && slot._c) {\n    slot._d = true;\n  }\n  return rendered;\n}\nfunction ensureValidVNode(vnodes) {\n  return vnodes.some((child) => {\n    if (!isVNode(child)) return true;\n    if (child.type === Comment) return false;\n    if (child.type === Fragment && !ensureValidVNode(child.children))\n      return false;\n    return true;\n  }) ? vnodes : null;\n}\n\nfunction toHandlers(obj, preserveCaseIfNecessary) {\n  const ret = {};\n  if (!!(process.env.NODE_ENV !== \"production\") && !isObject(obj)) {\n    warn$1(`v-on with no argument expects an object value.`);\n    return ret;\n  }\n  for (const key in obj) {\n    ret[preserveCaseIfNecessary && /[A-Z]/.test(key) ? `on:${key}` : toHandlerKey(key)] = obj[key];\n  }\n  return ret;\n}\n\nconst getPublicInstance = (i) => {\n  if (!i) return null;\n  if (isStatefulComponent(i)) return getComponentPublicInstance(i);\n  return getPublicInstance(i.parent);\n};\nconst publicPropertiesMap = (\n  // Move PURE marker to new line to workaround compiler discarding it\n  // due to type annotation\n  /* @__PURE__ */ extend(/* @__PURE__ */ Object.create(null), {\n    $: (i) => i,\n    $el: (i) => i.vnode.el,\n    $data: (i) => i.data,\n    $props: (i) => !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(i.props) : i.props,\n    $attrs: (i) => !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(i.attrs) : i.attrs,\n    $slots: (i) => !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(i.slots) : i.slots,\n    $refs: (i) => !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(i.refs) : i.refs,\n    $parent: (i) => getPublicInstance(i.parent),\n    $root: (i) => getPublicInstance(i.root),\n    $host: (i) => i.ce,\n    $emit: (i) => i.emit,\n    $options: (i) => __VUE_OPTIONS_API__ ? resolveMergedOptions(i) : i.type,\n    $forceUpdate: (i) => i.f || (i.f = () => {\n      queueJob(i.update);\n    }),\n    $nextTick: (i) => i.n || (i.n = nextTick.bind(i.proxy)),\n    $watch: (i) => __VUE_OPTIONS_API__ ? instanceWatch.bind(i) : NOOP\n  })\n);\nconst isReservedPrefix = (key) => key === \"_\" || key === \"$\";\nconst hasSetupBinding = (state, key) => state !== EMPTY_OBJ && !state.__isScriptSetup && hasOwn(state, key);\nconst PublicInstanceProxyHandlers = {\n  get({ _: instance }, key) {\n    if (key === \"__v_skip\") {\n      return true;\n    }\n    const { ctx, setupState, data, props, accessCache, type, appContext } = instance;\n    if (!!(process.env.NODE_ENV !== \"production\") && key === \"__isVue\") {\n      return true;\n    }\n    let normalizedProps;\n    if (key[0] !== \"$\") {\n      const n = accessCache[key];\n      if (n !== void 0) {\n        switch (n) {\n          case 1 /* SETUP */:\n            return setupState[key];\n          case 2 /* DATA */:\n            return data[key];\n          case 4 /* CONTEXT */:\n            return ctx[key];\n          case 3 /* PROPS */:\n            return props[key];\n        }\n      } else if (hasSetupBinding(setupState, key)) {\n        accessCache[key] = 1 /* SETUP */;\n        return setupState[key];\n      } else if (data !== EMPTY_OBJ && hasOwn(data, key)) {\n        accessCache[key] = 2 /* DATA */;\n        return data[key];\n      } else if (\n        // only cache other properties when instance has declared (thus stable)\n        // props\n        (normalizedProps = instance.propsOptions[0]) && hasOwn(normalizedProps, key)\n      ) {\n        accessCache[key] = 3 /* PROPS */;\n        return props[key];\n      } else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) {\n        accessCache[key] = 4 /* CONTEXT */;\n        return ctx[key];\n      } else if (!__VUE_OPTIONS_API__ || shouldCacheAccess) {\n        accessCache[key] = 0 /* OTHER */;\n      }\n    }\n    const publicGetter = publicPropertiesMap[key];\n    let cssModule, globalProperties;\n    if (publicGetter) {\n      if (key === \"$attrs\") {\n        track(instance.attrs, \"get\", \"\");\n        !!(process.env.NODE_ENV !== \"production\") && markAttrsAccessed();\n      } else if (!!(process.env.NODE_ENV !== \"production\") && key === \"$slots\") {\n        track(instance, \"get\", key);\n      }\n      return publicGetter(instance);\n    } else if (\n      // css module (injected by vue-loader)\n      (cssModule = type.__cssModules) && (cssModule = cssModule[key])\n    ) {\n      return cssModule;\n    } else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) {\n      accessCache[key] = 4 /* CONTEXT */;\n      return ctx[key];\n    } else if (\n      // global properties\n      globalProperties = appContext.config.globalProperties, hasOwn(globalProperties, key)\n    ) {\n      {\n        return globalProperties[key];\n      }\n    } else if (!!(process.env.NODE_ENV !== \"production\") && currentRenderingInstance && (!isString(key) || // #1091 avoid internal isRef/isVNode checks on component instance leading\n    // to infinite warning loop\n    key.indexOf(\"__v\") !== 0)) {\n      if (data !== EMPTY_OBJ && isReservedPrefix(key[0]) && hasOwn(data, key)) {\n        warn$1(\n          `Property ${JSON.stringify(\n            key\n          )} must be accessed via $data because it starts with a reserved character (\"$\" or \"_\") and is not proxied on the render context.`\n        );\n      } else if (instance === currentRenderingInstance) {\n        warn$1(\n          `Property ${JSON.stringify(key)} was accessed during render but is not defined on instance.`\n        );\n      }\n    }\n  },\n  set({ _: instance }, key, value) {\n    const { data, setupState, ctx } = instance;\n    if (hasSetupBinding(setupState, key)) {\n      setupState[key] = value;\n      return true;\n    } else if (!!(process.env.NODE_ENV !== \"production\") && setupState.__isScriptSetup && hasOwn(setupState, key)) {\n      warn$1(`Cannot mutate <script setup> binding \"${key}\" from Options API.`);\n      return false;\n    } else if (data !== EMPTY_OBJ && hasOwn(data, key)) {\n      data[key] = value;\n      return true;\n    } else if (hasOwn(instance.props, key)) {\n      !!(process.env.NODE_ENV !== \"production\") && warn$1(`Attempting to mutate prop \"${key}\". Props are readonly.`);\n      return false;\n    }\n    if (key[0] === \"$\" && key.slice(1) in instance) {\n      !!(process.env.NODE_ENV !== \"production\") && warn$1(\n        `Attempting to mutate public property \"${key}\". Properties starting with $ are reserved and readonly.`\n      );\n      return false;\n    } else {\n      if (!!(process.env.NODE_ENV !== \"production\") && key in instance.appContext.config.globalProperties) {\n        Object.defineProperty(ctx, key, {\n          enumerable: true,\n          configurable: true,\n          value\n        });\n      } else {\n        ctx[key] = value;\n      }\n    }\n    return true;\n  },\n  has({\n    _: { data, setupState, accessCache, ctx, appContext, propsOptions }\n  }, key) {\n    let normalizedProps;\n    return !!accessCache[key] || data !== EMPTY_OBJ && hasOwn(data, key) || hasSetupBinding(setupState, key) || (normalizedProps = propsOptions[0]) && hasOwn(normalizedProps, key) || hasOwn(ctx, key) || hasOwn(publicPropertiesMap, key) || hasOwn(appContext.config.globalProperties, key);\n  },\n  defineProperty(target, key, descriptor) {\n    if (descriptor.get != null) {\n      target._.accessCache[key] = 0;\n    } else if (hasOwn(descriptor, \"value\")) {\n      this.set(target, key, descriptor.value, null);\n    }\n    return Reflect.defineProperty(target, key, descriptor);\n  }\n};\nif (!!(process.env.NODE_ENV !== \"production\") && true) {\n  PublicInstanceProxyHandlers.ownKeys = (target) => {\n    warn$1(\n      `Avoid app logic that relies on enumerating keys on a component instance. The keys will be empty in production mode to avoid performance overhead.`\n    );\n    return Reflect.ownKeys(target);\n  };\n}\nconst RuntimeCompiledPublicInstanceProxyHandlers = /* @__PURE__ */ extend({}, PublicInstanceProxyHandlers, {\n  get(target, key) {\n    if (key === Symbol.unscopables) {\n      return;\n    }\n    return PublicInstanceProxyHandlers.get(target, key, target);\n  },\n  has(_, key) {\n    const has = key[0] !== \"_\" && !isGloballyAllowed(key);\n    if (!!(process.env.NODE_ENV !== \"production\") && !has && PublicInstanceProxyHandlers.has(_, key)) {\n      warn$1(\n        `Property ${JSON.stringify(\n          key\n        )} should not start with _ which is a reserved prefix for Vue internals.`\n      );\n    }\n    return has;\n  }\n});\nfunction createDevRenderContext(instance) {\n  const target = {};\n  Object.defineProperty(target, `_`, {\n    configurable: true,\n    enumerable: false,\n    get: () => instance\n  });\n  Object.keys(publicPropertiesMap).forEach((key) => {\n    Object.defineProperty(target, key, {\n      configurable: true,\n      enumerable: false,\n      get: () => publicPropertiesMap[key](instance),\n      // intercepted by the proxy so no need for implementation,\n      // but needed to prevent set errors\n      set: NOOP\n    });\n  });\n  return target;\n}\nfunction exposePropsOnRenderContext(instance) {\n  const {\n    ctx,\n    propsOptions: [propsOptions]\n  } = instance;\n  if (propsOptions) {\n    Object.keys(propsOptions).forEach((key) => {\n      Object.defineProperty(ctx, key, {\n        enumerable: true,\n        configurable: true,\n        get: () => instance.props[key],\n        set: NOOP\n      });\n    });\n  }\n}\nfunction exposeSetupStateOnRenderContext(instance) {\n  const { ctx, setupState } = instance;\n  Object.keys(toRaw(setupState)).forEach((key) => {\n    if (!setupState.__isScriptSetup) {\n      if (isReservedPrefix(key[0])) {\n        warn$1(\n          `setup() return property ${JSON.stringify(\n            key\n          )} should not start with \"$\" or \"_\" which are reserved prefixes for Vue internals.`\n        );\n        return;\n      }\n      Object.defineProperty(ctx, key, {\n        enumerable: true,\n        configurable: true,\n        get: () => setupState[key],\n        set: NOOP\n      });\n    }\n  });\n}\n\nconst warnRuntimeUsage = (method) => warn$1(\n  `${method}() is a compiler-hint helper that is only usable inside <script setup> of a single file component. Its arguments should be compiled away and passing it at runtime has no effect.`\n);\nfunction defineProps() {\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    warnRuntimeUsage(`defineProps`);\n  }\n  return null;\n}\nfunction defineEmits() {\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    warnRuntimeUsage(`defineEmits`);\n  }\n  return null;\n}\nfunction defineExpose(exposed) {\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    warnRuntimeUsage(`defineExpose`);\n  }\n}\nfunction defineOptions(options) {\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    warnRuntimeUsage(`defineOptions`);\n  }\n}\nfunction defineSlots() {\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    warnRuntimeUsage(`defineSlots`);\n  }\n  return null;\n}\nfunction defineModel() {\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    warnRuntimeUsage(\"defineModel\");\n  }\n}\nfunction withDefaults(props, defaults) {\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    warnRuntimeUsage(`withDefaults`);\n  }\n  return null;\n}\nfunction useSlots() {\n  return getContext(\"useSlots\").slots;\n}\nfunction useAttrs() {\n  return getContext(\"useAttrs\").attrs;\n}\nfunction getContext(calledFunctionName) {\n  const i = getCurrentInstance();\n  if (!!(process.env.NODE_ENV !== \"production\") && !i) {\n    warn$1(`${calledFunctionName}() called without active instance.`);\n  }\n  return i.setupContext || (i.setupContext = createSetupContext(i));\n}\nfunction normalizePropsOrEmits(props) {\n  return isArray(props) ? props.reduce(\n    (normalized, p) => (normalized[p] = null, normalized),\n    {}\n  ) : props;\n}\nfunction mergeDefaults(raw, defaults) {\n  const props = normalizePropsOrEmits(raw);\n  for (const key in defaults) {\n    if (key.startsWith(\"__skip\")) continue;\n    let opt = props[key];\n    if (opt) {\n      if (isArray(opt) || isFunction(opt)) {\n        opt = props[key] = { type: opt, default: defaults[key] };\n      } else {\n        opt.default = defaults[key];\n      }\n    } else if (opt === null) {\n      opt = props[key] = { default: defaults[key] };\n    } else if (!!(process.env.NODE_ENV !== \"production\")) {\n      warn$1(`props default key \"${key}\" has no corresponding declaration.`);\n    }\n    if (opt && defaults[`__skip_${key}`]) {\n      opt.skipFactory = true;\n    }\n  }\n  return props;\n}\nfunction mergeModels(a, b) {\n  if (!a || !b) return a || b;\n  if (isArray(a) && isArray(b)) return a.concat(b);\n  return extend({}, normalizePropsOrEmits(a), normalizePropsOrEmits(b));\n}\nfunction createPropsRestProxy(props, excludedKeys) {\n  const ret = {};\n  for (const key in props) {\n    if (!excludedKeys.includes(key)) {\n      Object.defineProperty(ret, key, {\n        enumerable: true,\n        get: () => props[key]\n      });\n    }\n  }\n  return ret;\n}\nfunction withAsyncContext(getAwaitable) {\n  const ctx = getCurrentInstance();\n  if (!!(process.env.NODE_ENV !== \"production\") && !ctx) {\n    warn$1(\n      `withAsyncContext called without active current instance. This is likely a bug.`\n    );\n  }\n  let awaitable = getAwaitable();\n  unsetCurrentInstance();\n  if (isPromise(awaitable)) {\n    awaitable = awaitable.catch((e) => {\n      setCurrentInstance(ctx);\n      throw e;\n    });\n  }\n  return [awaitable, () => setCurrentInstance(ctx)];\n}\n\nfunction createDuplicateChecker() {\n  const cache = /* @__PURE__ */ Object.create(null);\n  return (type, key) => {\n    if (cache[key]) {\n      warn$1(`${type} property \"${key}\" is already defined in ${cache[key]}.`);\n    } else {\n      cache[key] = type;\n    }\n  };\n}\nlet shouldCacheAccess = true;\nfunction applyOptions(instance) {\n  const options = resolveMergedOptions(instance);\n  const publicThis = instance.proxy;\n  const ctx = instance.ctx;\n  shouldCacheAccess = false;\n  if (options.beforeCreate) {\n    callHook(options.beforeCreate, instance, \"bc\");\n  }\n  const {\n    // state\n    data: dataOptions,\n    computed: computedOptions,\n    methods,\n    watch: watchOptions,\n    provide: provideOptions,\n    inject: injectOptions,\n    // lifecycle\n    created,\n    beforeMount,\n    mounted,\n    beforeUpdate,\n    updated,\n    activated,\n    deactivated,\n    beforeDestroy,\n    beforeUnmount,\n    destroyed,\n    unmounted,\n    render,\n    renderTracked,\n    renderTriggered,\n    errorCaptured,\n    serverPrefetch,\n    // public API\n    expose,\n    inheritAttrs,\n    // assets\n    components,\n    directives,\n    filters\n  } = options;\n  const checkDuplicateProperties = !!(process.env.NODE_ENV !== \"production\") ? createDuplicateChecker() : null;\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    const [propsOptions] = instance.propsOptions;\n    if (propsOptions) {\n      for (const key in propsOptions) {\n        checkDuplicateProperties(\"Props\" /* PROPS */, key);\n      }\n    }\n  }\n  if (injectOptions) {\n    resolveInjections(injectOptions, ctx, checkDuplicateProperties);\n  }\n  if (methods) {\n    for (const key in methods) {\n      const methodHandler = methods[key];\n      if (isFunction(methodHandler)) {\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          Object.defineProperty(ctx, key, {\n            value: methodHandler.bind(publicThis),\n            configurable: true,\n            enumerable: true,\n            writable: true\n          });\n        } else {\n          ctx[key] = methodHandler.bind(publicThis);\n        }\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          checkDuplicateProperties(\"Methods\" /* METHODS */, key);\n        }\n      } else if (!!(process.env.NODE_ENV !== \"production\")) {\n        warn$1(\n          `Method \"${key}\" has type \"${typeof methodHandler}\" in the component definition. Did you reference the function correctly?`\n        );\n      }\n    }\n  }\n  if (dataOptions) {\n    if (!!(process.env.NODE_ENV !== \"production\") && !isFunction(dataOptions)) {\n      warn$1(\n        `The data option must be a function. Plain object usage is no longer supported.`\n      );\n    }\n    const data = dataOptions.call(publicThis, publicThis);\n    if (!!(process.env.NODE_ENV !== \"production\") && isPromise(data)) {\n      warn$1(\n        `data() returned a Promise - note data() cannot be async; If you intend to perform data fetching before component renders, use async setup() + <Suspense>.`\n      );\n    }\n    if (!isObject(data)) {\n      !!(process.env.NODE_ENV !== \"production\") && warn$1(`data() should return an object.`);\n    } else {\n      instance.data = reactive(data);\n      if (!!(process.env.NODE_ENV !== \"production\")) {\n        for (const key in data) {\n          checkDuplicateProperties(\"Data\" /* DATA */, key);\n          if (!isReservedPrefix(key[0])) {\n            Object.defineProperty(ctx, key, {\n              configurable: true,\n              enumerable: true,\n              get: () => data[key],\n              set: NOOP\n            });\n          }\n        }\n      }\n    }\n  }\n  shouldCacheAccess = true;\n  if (computedOptions) {\n    for (const key in computedOptions) {\n      const opt = computedOptions[key];\n      const get = isFunction(opt) ? opt.bind(publicThis, publicThis) : isFunction(opt.get) ? opt.get.bind(publicThis, publicThis) : NOOP;\n      if (!!(process.env.NODE_ENV !== \"production\") && get === NOOP) {\n        warn$1(`Computed property \"${key}\" has no getter.`);\n      }\n      const set = !isFunction(opt) && isFunction(opt.set) ? opt.set.bind(publicThis) : !!(process.env.NODE_ENV !== \"production\") ? () => {\n        warn$1(\n          `Write operation failed: computed property \"${key}\" is readonly.`\n        );\n      } : NOOP;\n      const c = computed({\n        get,\n        set\n      });\n      Object.defineProperty(ctx, key, {\n        enumerable: true,\n        configurable: true,\n        get: () => c.value,\n        set: (v) => c.value = v\n      });\n      if (!!(process.env.NODE_ENV !== \"production\")) {\n        checkDuplicateProperties(\"Computed\" /* COMPUTED */, key);\n      }\n    }\n  }\n  if (watchOptions) {\n    for (const key in watchOptions) {\n      createWatcher(watchOptions[key], ctx, publicThis, key);\n    }\n  }\n  if (provideOptions) {\n    const provides = isFunction(provideOptions) ? provideOptions.call(publicThis) : provideOptions;\n    Reflect.ownKeys(provides).forEach((key) => {\n      provide(key, provides[key]);\n    });\n  }\n  if (created) {\n    callHook(created, instance, \"c\");\n  }\n  function registerLifecycleHook(register, hook) {\n    if (isArray(hook)) {\n      hook.forEach((_hook) => register(_hook.bind(publicThis)));\n    } else if (hook) {\n      register(hook.bind(publicThis));\n    }\n  }\n  registerLifecycleHook(onBeforeMount, beforeMount);\n  registerLifecycleHook(onMounted, mounted);\n  registerLifecycleHook(onBeforeUpdate, beforeUpdate);\n  registerLifecycleHook(onUpdated, updated);\n  registerLifecycleHook(onActivated, activated);\n  registerLifecycleHook(onDeactivated, deactivated);\n  registerLifecycleHook(onErrorCaptured, errorCaptured);\n  registerLifecycleHook(onRenderTracked, renderTracked);\n  registerLifecycleHook(onRenderTriggered, renderTriggered);\n  registerLifecycleHook(onBeforeUnmount, beforeUnmount);\n  registerLifecycleHook(onUnmounted, unmounted);\n  registerLifecycleHook(onServerPrefetch, serverPrefetch);\n  if (isArray(expose)) {\n    if (expose.length) {\n      const exposed = instance.exposed || (instance.exposed = {});\n      expose.forEach((key) => {\n        Object.defineProperty(exposed, key, {\n          get: () => publicThis[key],\n          set: (val) => publicThis[key] = val,\n          enumerable: true\n        });\n      });\n    } else if (!instance.exposed) {\n      instance.exposed = {};\n    }\n  }\n  if (render && instance.render === NOOP) {\n    instance.render = render;\n  }\n  if (inheritAttrs != null) {\n    instance.inheritAttrs = inheritAttrs;\n  }\n  if (components) instance.components = components;\n  if (directives) instance.directives = directives;\n  if (serverPrefetch) {\n    markAsyncBoundary(instance);\n  }\n}\nfunction resolveInjections(injectOptions, ctx, checkDuplicateProperties = NOOP) {\n  if (isArray(injectOptions)) {\n    injectOptions = normalizeInject(injectOptions);\n  }\n  for (const key in injectOptions) {\n    const opt = injectOptions[key];\n    let injected;\n    if (isObject(opt)) {\n      if (\"default\" in opt) {\n        injected = inject(\n          opt.from || key,\n          opt.default,\n          true\n        );\n      } else {\n        injected = inject(opt.from || key);\n      }\n    } else {\n      injected = inject(opt);\n    }\n    if (isRef(injected)) {\n      Object.defineProperty(ctx, key, {\n        enumerable: true,\n        configurable: true,\n        get: () => injected.value,\n        set: (v) => injected.value = v\n      });\n    } else {\n      ctx[key] = injected;\n    }\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      checkDuplicateProperties(\"Inject\" /* INJECT */, key);\n    }\n  }\n}\nfunction callHook(hook, instance, type) {\n  callWithAsyncErrorHandling(\n    isArray(hook) ? hook.map((h) => h.bind(instance.proxy)) : hook.bind(instance.proxy),\n    instance,\n    type\n  );\n}\nfunction createWatcher(raw, ctx, publicThis, key) {\n  let getter = key.includes(\".\") ? createPathGetter(publicThis, key) : () => publicThis[key];\n  if (isString(raw)) {\n    const handler = ctx[raw];\n    if (isFunction(handler)) {\n      {\n        watch(getter, handler);\n      }\n    } else if (!!(process.env.NODE_ENV !== \"production\")) {\n      warn$1(`Invalid watch handler specified by key \"${raw}\"`, handler);\n    }\n  } else if (isFunction(raw)) {\n    {\n      watch(getter, raw.bind(publicThis));\n    }\n  } else if (isObject(raw)) {\n    if (isArray(raw)) {\n      raw.forEach((r) => createWatcher(r, ctx, publicThis, key));\n    } else {\n      const handler = isFunction(raw.handler) ? raw.handler.bind(publicThis) : ctx[raw.handler];\n      if (isFunction(handler)) {\n        watch(getter, handler, raw);\n      } else if (!!(process.env.NODE_ENV !== \"production\")) {\n        warn$1(`Invalid watch handler specified by key \"${raw.handler}\"`, handler);\n      }\n    }\n  } else if (!!(process.env.NODE_ENV !== \"production\")) {\n    warn$1(`Invalid watch option: \"${key}\"`, raw);\n  }\n}\nfunction resolveMergedOptions(instance) {\n  const base = instance.type;\n  const { mixins, extends: extendsOptions } = base;\n  const {\n    mixins: globalMixins,\n    optionsCache: cache,\n    config: { optionMergeStrategies }\n  } = instance.appContext;\n  const cached = cache.get(base);\n  let resolved;\n  if (cached) {\n    resolved = cached;\n  } else if (!globalMixins.length && !mixins && !extendsOptions) {\n    {\n      resolved = base;\n    }\n  } else {\n    resolved = {};\n    if (globalMixins.length) {\n      globalMixins.forEach(\n        (m) => mergeOptions(resolved, m, optionMergeStrategies, true)\n      );\n    }\n    mergeOptions(resolved, base, optionMergeStrategies);\n  }\n  if (isObject(base)) {\n    cache.set(base, resolved);\n  }\n  return resolved;\n}\nfunction mergeOptions(to, from, strats, asMixin = false) {\n  const { mixins, extends: extendsOptions } = from;\n  if (extendsOptions) {\n    mergeOptions(to, extendsOptions, strats, true);\n  }\n  if (mixins) {\n    mixins.forEach(\n      (m) => mergeOptions(to, m, strats, true)\n    );\n  }\n  for (const key in from) {\n    if (asMixin && key === \"expose\") {\n      !!(process.env.NODE_ENV !== \"production\") && warn$1(\n        `\"expose\" option is ignored when declared in mixins or extends. It should only be declared in the base component itself.`\n      );\n    } else {\n      const strat = internalOptionMergeStrats[key] || strats && strats[key];\n      to[key] = strat ? strat(to[key], from[key]) : from[key];\n    }\n  }\n  return to;\n}\nconst internalOptionMergeStrats = {\n  data: mergeDataFn,\n  props: mergeEmitsOrPropsOptions,\n  emits: mergeEmitsOrPropsOptions,\n  // objects\n  methods: mergeObjectOptions,\n  computed: mergeObjectOptions,\n  // lifecycle\n  beforeCreate: mergeAsArray,\n  created: mergeAsArray,\n  beforeMount: mergeAsArray,\n  mounted: mergeAsArray,\n  beforeUpdate: mergeAsArray,\n  updated: mergeAsArray,\n  beforeDestroy: mergeAsArray,\n  beforeUnmount: mergeAsArray,\n  destroyed: mergeAsArray,\n  unmounted: mergeAsArray,\n  activated: mergeAsArray,\n  deactivated: mergeAsArray,\n  errorCaptured: mergeAsArray,\n  serverPrefetch: mergeAsArray,\n  // assets\n  components: mergeObjectOptions,\n  directives: mergeObjectOptions,\n  // watch\n  watch: mergeWatchOptions,\n  // provide / inject\n  provide: mergeDataFn,\n  inject: mergeInject\n};\nfunction mergeDataFn(to, from) {\n  if (!from) {\n    return to;\n  }\n  if (!to) {\n    return from;\n  }\n  return function mergedDataFn() {\n    return (extend)(\n      isFunction(to) ? to.call(this, this) : to,\n      isFunction(from) ? from.call(this, this) : from\n    );\n  };\n}\nfunction mergeInject(to, from) {\n  return mergeObjectOptions(normalizeInject(to), normalizeInject(from));\n}\nfunction normalizeInject(raw) {\n  if (isArray(raw)) {\n    const res = {};\n    for (let i = 0; i < raw.length; i++) {\n      res[raw[i]] = raw[i];\n    }\n    return res;\n  }\n  return raw;\n}\nfunction mergeAsArray(to, from) {\n  return to ? [...new Set([].concat(to, from))] : from;\n}\nfunction mergeObjectOptions(to, from) {\n  return to ? extend(/* @__PURE__ */ Object.create(null), to, from) : from;\n}\nfunction mergeEmitsOrPropsOptions(to, from) {\n  if (to) {\n    if (isArray(to) && isArray(from)) {\n      return [.../* @__PURE__ */ new Set([...to, ...from])];\n    }\n    return extend(\n      /* @__PURE__ */ Object.create(null),\n      normalizePropsOrEmits(to),\n      normalizePropsOrEmits(from != null ? from : {})\n    );\n  } else {\n    return from;\n  }\n}\nfunction mergeWatchOptions(to, from) {\n  if (!to) return from;\n  if (!from) return to;\n  const merged = extend(/* @__PURE__ */ Object.create(null), to);\n  for (const key in from) {\n    merged[key] = mergeAsArray(to[key], from[key]);\n  }\n  return merged;\n}\n\nfunction createAppContext() {\n  return {\n    app: null,\n    config: {\n      isNativeTag: NO,\n      performance: false,\n      globalProperties: {},\n      optionMergeStrategies: {},\n      errorHandler: void 0,\n      warnHandler: void 0,\n      compilerOptions: {}\n    },\n    mixins: [],\n    components: {},\n    directives: {},\n    provides: /* @__PURE__ */ Object.create(null),\n    optionsCache: /* @__PURE__ */ new WeakMap(),\n    propsCache: /* @__PURE__ */ new WeakMap(),\n    emitsCache: /* @__PURE__ */ new WeakMap()\n  };\n}\nlet uid$1 = 0;\nfunction createAppAPI(render, hydrate) {\n  return function createApp(rootComponent, rootProps = null) {\n    if (!isFunction(rootComponent)) {\n      rootComponent = extend({}, rootComponent);\n    }\n    if (rootProps != null && !isObject(rootProps)) {\n      !!(process.env.NODE_ENV !== \"production\") && warn$1(`root props passed to app.mount() must be an object.`);\n      rootProps = null;\n    }\n    const context = createAppContext();\n    const installedPlugins = /* @__PURE__ */ new WeakSet();\n    const pluginCleanupFns = [];\n    let isMounted = false;\n    const app = context.app = {\n      _uid: uid$1++,\n      _component: rootComponent,\n      _props: rootProps,\n      _container: null,\n      _context: context,\n      _instance: null,\n      version,\n      get config() {\n        return context.config;\n      },\n      set config(v) {\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          warn$1(\n            `app.config cannot be replaced. Modify individual options instead.`\n          );\n        }\n      },\n      use(plugin, ...options) {\n        if (installedPlugins.has(plugin)) {\n          !!(process.env.NODE_ENV !== \"production\") && warn$1(`Plugin has already been applied to target app.`);\n        } else if (plugin && isFunction(plugin.install)) {\n          installedPlugins.add(plugin);\n          plugin.install(app, ...options);\n        } else if (isFunction(plugin)) {\n          installedPlugins.add(plugin);\n          plugin(app, ...options);\n        } else if (!!(process.env.NODE_ENV !== \"production\")) {\n          warn$1(\n            `A plugin must either be a function or an object with an \"install\" function.`\n          );\n        }\n        return app;\n      },\n      mixin(mixin) {\n        if (__VUE_OPTIONS_API__) {\n          if (!context.mixins.includes(mixin)) {\n            context.mixins.push(mixin);\n          } else if (!!(process.env.NODE_ENV !== \"production\")) {\n            warn$1(\n              \"Mixin has already been applied to target app\" + (mixin.name ? `: ${mixin.name}` : \"\")\n            );\n          }\n        } else if (!!(process.env.NODE_ENV !== \"production\")) {\n          warn$1(\"Mixins are only available in builds supporting Options API\");\n        }\n        return app;\n      },\n      component(name, component) {\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          validateComponentName(name, context.config);\n        }\n        if (!component) {\n          return context.components[name];\n        }\n        if (!!(process.env.NODE_ENV !== \"production\") && context.components[name]) {\n          warn$1(`Component \"${name}\" has already been registered in target app.`);\n        }\n        context.components[name] = component;\n        return app;\n      },\n      directive(name, directive) {\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          validateDirectiveName(name);\n        }\n        if (!directive) {\n          return context.directives[name];\n        }\n        if (!!(process.env.NODE_ENV !== \"production\") && context.directives[name]) {\n          warn$1(`Directive \"${name}\" has already been registered in target app.`);\n        }\n        context.directives[name] = directive;\n        return app;\n      },\n      mount(rootContainer, isHydrate, namespace) {\n        if (!isMounted) {\n          if (!!(process.env.NODE_ENV !== \"production\") && rootContainer.__vue_app__) {\n            warn$1(\n              `There is already an app instance mounted on the host container.\n If you want to mount another app on the same host container, you need to unmount the previous app by calling \\`app.unmount()\\` first.`\n            );\n          }\n          const vnode = app._ceVNode || createVNode(rootComponent, rootProps);\n          vnode.appContext = context;\n          if (namespace === true) {\n            namespace = \"svg\";\n          } else if (namespace === false) {\n            namespace = void 0;\n          }\n          if (!!(process.env.NODE_ENV !== \"production\")) {\n            context.reload = () => {\n              const cloned = cloneVNode(vnode);\n              cloned.el = null;\n              render(cloned, rootContainer, namespace);\n            };\n          }\n          if (isHydrate && hydrate) {\n            hydrate(vnode, rootContainer);\n          } else {\n            render(vnode, rootContainer, namespace);\n          }\n          isMounted = true;\n          app._container = rootContainer;\n          rootContainer.__vue_app__ = app;\n          if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n            app._instance = vnode.component;\n            devtoolsInitApp(app, version);\n          }\n          return getComponentPublicInstance(vnode.component);\n        } else if (!!(process.env.NODE_ENV !== \"production\")) {\n          warn$1(\n            `App has already been mounted.\nIf you want to remount the same app, move your app creation logic into a factory function and create fresh app instances for each mount - e.g. \\`const createMyApp = () => createApp(App)\\``\n          );\n        }\n      },\n      onUnmount(cleanupFn) {\n        if (!!(process.env.NODE_ENV !== \"production\") && typeof cleanupFn !== \"function\") {\n          warn$1(\n            `Expected function as first argument to app.onUnmount(), but got ${typeof cleanupFn}`\n          );\n        }\n        pluginCleanupFns.push(cleanupFn);\n      },\n      unmount() {\n        if (isMounted) {\n          callWithAsyncErrorHandling(\n            pluginCleanupFns,\n            app._instance,\n            16\n          );\n          render(null, app._container);\n          if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n            app._instance = null;\n            devtoolsUnmountApp(app);\n          }\n          delete app._container.__vue_app__;\n        } else if (!!(process.env.NODE_ENV !== \"production\")) {\n          warn$1(`Cannot unmount an app that is not mounted.`);\n        }\n      },\n      provide(key, value) {\n        if (!!(process.env.NODE_ENV !== \"production\") && key in context.provides) {\n          if (hasOwn(context.provides, key)) {\n            warn$1(\n              `App already provides property with key \"${String(key)}\". It will be overwritten with the new value.`\n            );\n          } else {\n            warn$1(\n              `App already provides property with key \"${String(key)}\" inherited from its parent element. It will be overwritten with the new value.`\n            );\n          }\n        }\n        context.provides[key] = value;\n        return app;\n      },\n      runWithContext(fn) {\n        const lastApp = currentApp;\n        currentApp = app;\n        try {\n          return fn();\n        } finally {\n          currentApp = lastApp;\n        }\n      }\n    };\n    return app;\n  };\n}\nlet currentApp = null;\n\nfunction provide(key, value) {\n  if (!currentInstance) {\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      warn$1(`provide() can only be used inside setup().`);\n    }\n  } else {\n    let provides = currentInstance.provides;\n    const parentProvides = currentInstance.parent && currentInstance.parent.provides;\n    if (parentProvides === provides) {\n      provides = currentInstance.provides = Object.create(parentProvides);\n    }\n    provides[key] = value;\n  }\n}\nfunction inject(key, defaultValue, treatDefaultAsFactory = false) {\n  const instance = getCurrentInstance();\n  if (instance || currentApp) {\n    let provides = currentApp ? currentApp._context.provides : instance ? instance.parent == null || instance.ce ? instance.vnode.appContext && instance.vnode.appContext.provides : instance.parent.provides : void 0;\n    if (provides && key in provides) {\n      return provides[key];\n    } else if (arguments.length > 1) {\n      return treatDefaultAsFactory && isFunction(defaultValue) ? defaultValue.call(instance && instance.proxy) : defaultValue;\n    } else if (!!(process.env.NODE_ENV !== \"production\")) {\n      warn$1(`injection \"${String(key)}\" not found.`);\n    }\n  } else if (!!(process.env.NODE_ENV !== \"production\")) {\n    warn$1(`inject() can only be used inside setup() or functional components.`);\n  }\n}\nfunction hasInjectionContext() {\n  return !!(getCurrentInstance() || currentApp);\n}\n\nconst internalObjectProto = {};\nconst createInternalObject = () => Object.create(internalObjectProto);\nconst isInternalObject = (obj) => Object.getPrototypeOf(obj) === internalObjectProto;\n\nfunction initProps(instance, rawProps, isStateful, isSSR = false) {\n  const props = {};\n  const attrs = createInternalObject();\n  instance.propsDefaults = /* @__PURE__ */ Object.create(null);\n  setFullProps(instance, rawProps, props, attrs);\n  for (const key in instance.propsOptions[0]) {\n    if (!(key in props)) {\n      props[key] = void 0;\n    }\n  }\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    validateProps(rawProps || {}, props, instance);\n  }\n  if (isStateful) {\n    instance.props = isSSR ? props : shallowReactive(props);\n  } else {\n    if (!instance.type.props) {\n      instance.props = attrs;\n    } else {\n      instance.props = props;\n    }\n  }\n  instance.attrs = attrs;\n}\nfunction isInHmrContext(instance) {\n  while (instance) {\n    if (instance.type.__hmrId) return true;\n    instance = instance.parent;\n  }\n}\nfunction updateProps(instance, rawProps, rawPrevProps, optimized) {\n  const {\n    props,\n    attrs,\n    vnode: { patchFlag }\n  } = instance;\n  const rawCurrentProps = toRaw(props);\n  const [options] = instance.propsOptions;\n  let hasAttrsChanged = false;\n  if (\n    // always force full diff in dev\n    // - #1942 if hmr is enabled with sfc component\n    // - vite#872 non-sfc component used by sfc component\n    !(!!(process.env.NODE_ENV !== \"production\") && isInHmrContext(instance)) && (optimized || patchFlag > 0) && !(patchFlag & 16)\n  ) {\n    if (patchFlag & 8) {\n      const propsToUpdate = instance.vnode.dynamicProps;\n      for (let i = 0; i < propsToUpdate.length; i++) {\n        let key = propsToUpdate[i];\n        if (isEmitListener(instance.emitsOptions, key)) {\n          continue;\n        }\n        const value = rawProps[key];\n        if (options) {\n          if (hasOwn(attrs, key)) {\n            if (value !== attrs[key]) {\n              attrs[key] = value;\n              hasAttrsChanged = true;\n            }\n          } else {\n            const camelizedKey = camelize(key);\n            props[camelizedKey] = resolvePropValue(\n              options,\n              rawCurrentProps,\n              camelizedKey,\n              value,\n              instance,\n              false\n            );\n          }\n        } else {\n          if (value !== attrs[key]) {\n            attrs[key] = value;\n            hasAttrsChanged = true;\n          }\n        }\n      }\n    }\n  } else {\n    if (setFullProps(instance, rawProps, props, attrs)) {\n      hasAttrsChanged = true;\n    }\n    let kebabKey;\n    for (const key in rawCurrentProps) {\n      if (!rawProps || // for camelCase\n      !hasOwn(rawProps, key) && // it's possible the original props was passed in as kebab-case\n      // and converted to camelCase (#955)\n      ((kebabKey = hyphenate(key)) === key || !hasOwn(rawProps, kebabKey))) {\n        if (options) {\n          if (rawPrevProps && // for camelCase\n          (rawPrevProps[key] !== void 0 || // for kebab-case\n          rawPrevProps[kebabKey] !== void 0)) {\n            props[key] = resolvePropValue(\n              options,\n              rawCurrentProps,\n              key,\n              void 0,\n              instance,\n              true\n            );\n          }\n        } else {\n          delete props[key];\n        }\n      }\n    }\n    if (attrs !== rawCurrentProps) {\n      for (const key in attrs) {\n        if (!rawProps || !hasOwn(rawProps, key) && true) {\n          delete attrs[key];\n          hasAttrsChanged = true;\n        }\n      }\n    }\n  }\n  if (hasAttrsChanged) {\n    trigger(instance.attrs, \"set\", \"\");\n  }\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    validateProps(rawProps || {}, props, instance);\n  }\n}\nfunction setFullProps(instance, rawProps, props, attrs) {\n  const [options, needCastKeys] = instance.propsOptions;\n  let hasAttrsChanged = false;\n  let rawCastValues;\n  if (rawProps) {\n    for (let key in rawProps) {\n      if (isReservedProp(key)) {\n        continue;\n      }\n      const value = rawProps[key];\n      let camelKey;\n      if (options && hasOwn(options, camelKey = camelize(key))) {\n        if (!needCastKeys || !needCastKeys.includes(camelKey)) {\n          props[camelKey] = value;\n        } else {\n          (rawCastValues || (rawCastValues = {}))[camelKey] = value;\n        }\n      } else if (!isEmitListener(instance.emitsOptions, key)) {\n        if (!(key in attrs) || value !== attrs[key]) {\n          attrs[key] = value;\n          hasAttrsChanged = true;\n        }\n      }\n    }\n  }\n  if (needCastKeys) {\n    const rawCurrentProps = toRaw(props);\n    const castValues = rawCastValues || EMPTY_OBJ;\n    for (let i = 0; i < needCastKeys.length; i++) {\n      const key = needCastKeys[i];\n      props[key] = resolvePropValue(\n        options,\n        rawCurrentProps,\n        key,\n        castValues[key],\n        instance,\n        !hasOwn(castValues, key)\n      );\n    }\n  }\n  return hasAttrsChanged;\n}\nfunction resolvePropValue(options, props, key, value, instance, isAbsent) {\n  const opt = options[key];\n  if (opt != null) {\n    const hasDefault = hasOwn(opt, \"default\");\n    if (hasDefault && value === void 0) {\n      const defaultValue = opt.default;\n      if (opt.type !== Function && !opt.skipFactory && isFunction(defaultValue)) {\n        const { propsDefaults } = instance;\n        if (key in propsDefaults) {\n          value = propsDefaults[key];\n        } else {\n          const reset = setCurrentInstance(instance);\n          value = propsDefaults[key] = defaultValue.call(\n            null,\n            props\n          );\n          reset();\n        }\n      } else {\n        value = defaultValue;\n      }\n      if (instance.ce) {\n        instance.ce._setProp(key, value);\n      }\n    }\n    if (opt[0 /* shouldCast */]) {\n      if (isAbsent && !hasDefault) {\n        value = false;\n      } else if (opt[1 /* shouldCastTrue */] && (value === \"\" || value === hyphenate(key))) {\n        value = true;\n      }\n    }\n  }\n  return value;\n}\nconst mixinPropsCache = /* @__PURE__ */ new WeakMap();\nfunction normalizePropsOptions(comp, appContext, asMixin = false) {\n  const cache = __VUE_OPTIONS_API__ && asMixin ? mixinPropsCache : appContext.propsCache;\n  const cached = cache.get(comp);\n  if (cached) {\n    return cached;\n  }\n  const raw = comp.props;\n  const normalized = {};\n  const needCastKeys = [];\n  let hasExtends = false;\n  if (__VUE_OPTIONS_API__ && !isFunction(comp)) {\n    const extendProps = (raw2) => {\n      hasExtends = true;\n      const [props, keys] = normalizePropsOptions(raw2, appContext, true);\n      extend(normalized, props);\n      if (keys) needCastKeys.push(...keys);\n    };\n    if (!asMixin && appContext.mixins.length) {\n      appContext.mixins.forEach(extendProps);\n    }\n    if (comp.extends) {\n      extendProps(comp.extends);\n    }\n    if (comp.mixins) {\n      comp.mixins.forEach(extendProps);\n    }\n  }\n  if (!raw && !hasExtends) {\n    if (isObject(comp)) {\n      cache.set(comp, EMPTY_ARR);\n    }\n    return EMPTY_ARR;\n  }\n  if (isArray(raw)) {\n    for (let i = 0; i < raw.length; i++) {\n      if (!!(process.env.NODE_ENV !== \"production\") && !isString(raw[i])) {\n        warn$1(`props must be strings when using array syntax.`, raw[i]);\n      }\n      const normalizedKey = camelize(raw[i]);\n      if (validatePropName(normalizedKey)) {\n        normalized[normalizedKey] = EMPTY_OBJ;\n      }\n    }\n  } else if (raw) {\n    if (!!(process.env.NODE_ENV !== \"production\") && !isObject(raw)) {\n      warn$1(`invalid props options`, raw);\n    }\n    for (const key in raw) {\n      const normalizedKey = camelize(key);\n      if (validatePropName(normalizedKey)) {\n        const opt = raw[key];\n        const prop = normalized[normalizedKey] = isArray(opt) || isFunction(opt) ? { type: opt } : extend({}, opt);\n        const propType = prop.type;\n        let shouldCast = false;\n        let shouldCastTrue = true;\n        if (isArray(propType)) {\n          for (let index = 0; index < propType.length; ++index) {\n            const type = propType[index];\n            const typeName = isFunction(type) && type.name;\n            if (typeName === \"Boolean\") {\n              shouldCast = true;\n              break;\n            } else if (typeName === \"String\") {\n              shouldCastTrue = false;\n            }\n          }\n        } else {\n          shouldCast = isFunction(propType) && propType.name === \"Boolean\";\n        }\n        prop[0 /* shouldCast */] = shouldCast;\n        prop[1 /* shouldCastTrue */] = shouldCastTrue;\n        if (shouldCast || hasOwn(prop, \"default\")) {\n          needCastKeys.push(normalizedKey);\n        }\n      }\n    }\n  }\n  const res = [normalized, needCastKeys];\n  if (isObject(comp)) {\n    cache.set(comp, res);\n  }\n  return res;\n}\nfunction validatePropName(key) {\n  if (key[0] !== \"$\" && !isReservedProp(key)) {\n    return true;\n  } else if (!!(process.env.NODE_ENV !== \"production\")) {\n    warn$1(`Invalid prop name: \"${key}\" is a reserved property.`);\n  }\n  return false;\n}\nfunction getType(ctor) {\n  if (ctor === null) {\n    return \"null\";\n  }\n  if (typeof ctor === \"function\") {\n    return ctor.name || \"\";\n  } else if (typeof ctor === \"object\") {\n    const name = ctor.constructor && ctor.constructor.name;\n    return name || \"\";\n  }\n  return \"\";\n}\nfunction validateProps(rawProps, props, instance) {\n  const resolvedValues = toRaw(props);\n  const options = instance.propsOptions[0];\n  const camelizePropsKey = Object.keys(rawProps).map((key) => camelize(key));\n  for (const key in options) {\n    let opt = options[key];\n    if (opt == null) continue;\n    validateProp(\n      key,\n      resolvedValues[key],\n      opt,\n      !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(resolvedValues) : resolvedValues,\n      !camelizePropsKey.includes(key)\n    );\n  }\n}\nfunction validateProp(name, value, prop, props, isAbsent) {\n  const { type, required, validator, skipCheck } = prop;\n  if (required && isAbsent) {\n    warn$1('Missing required prop: \"' + name + '\"');\n    return;\n  }\n  if (value == null && !required) {\n    return;\n  }\n  if (type != null && type !== true && !skipCheck) {\n    let isValid = false;\n    const types = isArray(type) ? type : [type];\n    const expectedTypes = [];\n    for (let i = 0; i < types.length && !isValid; i++) {\n      const { valid, expectedType } = assertType(value, types[i]);\n      expectedTypes.push(expectedType || \"\");\n      isValid = valid;\n    }\n    if (!isValid) {\n      warn$1(getInvalidTypeMessage(name, value, expectedTypes));\n      return;\n    }\n  }\n  if (validator && !validator(value, props)) {\n    warn$1('Invalid prop: custom validator check failed for prop \"' + name + '\".');\n  }\n}\nconst isSimpleType = /* @__PURE__ */ makeMap(\n  \"String,Number,Boolean,Function,Symbol,BigInt\"\n);\nfunction assertType(value, type) {\n  let valid;\n  const expectedType = getType(type);\n  if (expectedType === \"null\") {\n    valid = value === null;\n  } else if (isSimpleType(expectedType)) {\n    const t = typeof value;\n    valid = t === expectedType.toLowerCase();\n    if (!valid && t === \"object\") {\n      valid = value instanceof type;\n    }\n  } else if (expectedType === \"Object\") {\n    valid = isObject(value);\n  } else if (expectedType === \"Array\") {\n    valid = isArray(value);\n  } else {\n    valid = value instanceof type;\n  }\n  return {\n    valid,\n    expectedType\n  };\n}\nfunction getInvalidTypeMessage(name, value, expectedTypes) {\n  if (expectedTypes.length === 0) {\n    return `Prop type [] for prop \"${name}\" won't match anything. Did you mean to use type Array instead?`;\n  }\n  let message = `Invalid prop: type check failed for prop \"${name}\". Expected ${expectedTypes.map(capitalize).join(\" | \")}`;\n  const expectedType = expectedTypes[0];\n  const receivedType = toRawType(value);\n  const expectedValue = styleValue(value, expectedType);\n  const receivedValue = styleValue(value, receivedType);\n  if (expectedTypes.length === 1 && isExplicable(expectedType) && !isBoolean(expectedType, receivedType)) {\n    message += ` with value ${expectedValue}`;\n  }\n  message += `, got ${receivedType} `;\n  if (isExplicable(receivedType)) {\n    message += `with value ${receivedValue}.`;\n  }\n  return message;\n}\nfunction styleValue(value, type) {\n  if (type === \"String\") {\n    return `\"${value}\"`;\n  } else if (type === \"Number\") {\n    return `${Number(value)}`;\n  } else {\n    return `${value}`;\n  }\n}\nfunction isExplicable(type) {\n  const explicitTypes = [\"string\", \"number\", \"boolean\"];\n  return explicitTypes.some((elem) => type.toLowerCase() === elem);\n}\nfunction isBoolean(...args) {\n  return args.some((elem) => elem.toLowerCase() === \"boolean\");\n}\n\nconst isInternalKey = (key) => key === \"_\" || key === \"__\" || key === \"_ctx\" || key === \"$stable\";\nconst normalizeSlotValue = (value) => isArray(value) ? value.map(normalizeVNode) : [normalizeVNode(value)];\nconst normalizeSlot = (key, rawSlot, ctx) => {\n  if (rawSlot._n) {\n    return rawSlot;\n  }\n  const normalized = withCtx((...args) => {\n    if (!!(process.env.NODE_ENV !== \"production\") && currentInstance && !(ctx === null && currentRenderingInstance) && !(ctx && ctx.root !== currentInstance.root)) {\n      warn$1(\n        `Slot \"${key}\" invoked outside of the render function: this will not track dependencies used in the slot. Invoke the slot function inside the render function instead.`\n      );\n    }\n    return normalizeSlotValue(rawSlot(...args));\n  }, ctx);\n  normalized._c = false;\n  return normalized;\n};\nconst normalizeObjectSlots = (rawSlots, slots, instance) => {\n  const ctx = rawSlots._ctx;\n  for (const key in rawSlots) {\n    if (isInternalKey(key)) continue;\n    const value = rawSlots[key];\n    if (isFunction(value)) {\n      slots[key] = normalizeSlot(key, value, ctx);\n    } else if (value != null) {\n      if (!!(process.env.NODE_ENV !== \"production\") && true) {\n        warn$1(\n          `Non-function value encountered for slot \"${key}\". Prefer function slots for better performance.`\n        );\n      }\n      const normalized = normalizeSlotValue(value);\n      slots[key] = () => normalized;\n    }\n  }\n};\nconst normalizeVNodeSlots = (instance, children) => {\n  if (!!(process.env.NODE_ENV !== \"production\") && !isKeepAlive(instance.vnode) && true) {\n    warn$1(\n      `Non-function value encountered for default slot. Prefer function slots for better performance.`\n    );\n  }\n  const normalized = normalizeSlotValue(children);\n  instance.slots.default = () => normalized;\n};\nconst assignSlots = (slots, children, optimized) => {\n  for (const key in children) {\n    if (optimized || !isInternalKey(key)) {\n      slots[key] = children[key];\n    }\n  }\n};\nconst initSlots = (instance, children, optimized) => {\n  const slots = instance.slots = createInternalObject();\n  if (instance.vnode.shapeFlag & 32) {\n    const cacheIndexes = children.__;\n    if (cacheIndexes) def(slots, \"__\", cacheIndexes, true);\n    const type = children._;\n    if (type) {\n      assignSlots(slots, children, optimized);\n      if (optimized) {\n        def(slots, \"_\", type, true);\n      }\n    } else {\n      normalizeObjectSlots(children, slots);\n    }\n  } else if (children) {\n    normalizeVNodeSlots(instance, children);\n  }\n};\nconst updateSlots = (instance, children, optimized) => {\n  const { vnode, slots } = instance;\n  let needDeletionCheck = true;\n  let deletionComparisonTarget = EMPTY_OBJ;\n  if (vnode.shapeFlag & 32) {\n    const type = children._;\n    if (type) {\n      if (!!(process.env.NODE_ENV !== \"production\") && isHmrUpdating) {\n        assignSlots(slots, children, optimized);\n        trigger(instance, \"set\", \"$slots\");\n      } else if (optimized && type === 1) {\n        needDeletionCheck = false;\n      } else {\n        assignSlots(slots, children, optimized);\n      }\n    } else {\n      needDeletionCheck = !children.$stable;\n      normalizeObjectSlots(children, slots);\n    }\n    deletionComparisonTarget = children;\n  } else if (children) {\n    normalizeVNodeSlots(instance, children);\n    deletionComparisonTarget = { default: 1 };\n  }\n  if (needDeletionCheck) {\n    for (const key in slots) {\n      if (!isInternalKey(key) && deletionComparisonTarget[key] == null) {\n        delete slots[key];\n      }\n    }\n  }\n};\n\nlet supported;\nlet perf;\nfunction startMeasure(instance, type) {\n  if (instance.appContext.config.performance && isSupported()) {\n    perf.mark(`vue-${type}-${instance.uid}`);\n  }\n  if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n    devtoolsPerfStart(instance, type, isSupported() ? perf.now() : Date.now());\n  }\n}\nfunction endMeasure(instance, type) {\n  if (instance.appContext.config.performance && isSupported()) {\n    const startTag = `vue-${type}-${instance.uid}`;\n    const endTag = startTag + `:end`;\n    perf.mark(endTag);\n    perf.measure(\n      `<${formatComponentName(instance, instance.type)}> ${type}`,\n      startTag,\n      endTag\n    );\n    perf.clearMarks(startTag);\n    perf.clearMarks(endTag);\n  }\n  if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n    devtoolsPerfEnd(instance, type, isSupported() ? perf.now() : Date.now());\n  }\n}\nfunction isSupported() {\n  if (supported !== void 0) {\n    return supported;\n  }\n  if (typeof window !== \"undefined\" && window.performance) {\n    supported = true;\n    perf = window.performance;\n  } else {\n    supported = false;\n  }\n  return supported;\n}\n\nfunction initFeatureFlags() {\n  const needWarn = [];\n  if (typeof __VUE_OPTIONS_API__ !== \"boolean\") {\n    !!(process.env.NODE_ENV !== \"production\") && needWarn.push(`__VUE_OPTIONS_API__`);\n    getGlobalThis().__VUE_OPTIONS_API__ = true;\n  }\n  if (typeof __VUE_PROD_DEVTOOLS__ !== \"boolean\") {\n    !!(process.env.NODE_ENV !== \"production\") && needWarn.push(`__VUE_PROD_DEVTOOLS__`);\n    getGlobalThis().__VUE_PROD_DEVTOOLS__ = false;\n  }\n  if (typeof __VUE_PROD_HYDRATION_MISMATCH_DETAILS__ !== \"boolean\") {\n    !!(process.env.NODE_ENV !== \"production\") && needWarn.push(`__VUE_PROD_HYDRATION_MISMATCH_DETAILS__`);\n    getGlobalThis().__VUE_PROD_HYDRATION_MISMATCH_DETAILS__ = false;\n  }\n  if (!!(process.env.NODE_ENV !== \"production\") && needWarn.length) {\n    const multi = needWarn.length > 1;\n    console.warn(\n      `Feature flag${multi ? `s` : ``} ${needWarn.join(\", \")} ${multi ? `are` : `is`} not explicitly defined. You are running the esm-bundler build of Vue, which expects these compile-time feature flags to be globally injected via the bundler config in order to get better tree-shaking in the production bundle.\n\nFor more details, see https://link.vuejs.org/feature-flags.`\n    );\n  }\n}\n\nconst queuePostRenderEffect = queueEffectWithSuspense ;\nfunction createRenderer(options) {\n  return baseCreateRenderer(options);\n}\nfunction createHydrationRenderer(options) {\n  return baseCreateRenderer(options, createHydrationFunctions);\n}\nfunction baseCreateRenderer(options, createHydrationFns) {\n  {\n    initFeatureFlags();\n  }\n  const target = getGlobalThis();\n  target.__VUE__ = true;\n  if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n    setDevtoolsHook$1(target.__VUE_DEVTOOLS_GLOBAL_HOOK__, target);\n  }\n  const {\n    insert: hostInsert,\n    remove: hostRemove,\n    patchProp: hostPatchProp,\n    createElement: hostCreateElement,\n    createText: hostCreateText,\n    createComment: hostCreateComment,\n    setText: hostSetText,\n    setElementText: hostSetElementText,\n    parentNode: hostParentNode,\n    nextSibling: hostNextSibling,\n    setScopeId: hostSetScopeId = NOOP,\n    insertStaticContent: hostInsertStaticContent\n  } = options;\n  const patch = (n1, n2, container, anchor = null, parentComponent = null, parentSuspense = null, namespace = void 0, slotScopeIds = null, optimized = !!(process.env.NODE_ENV !== \"production\") && isHmrUpdating ? false : !!n2.dynamicChildren) => {\n    if (n1 === n2) {\n      return;\n    }\n    if (n1 && !isSameVNodeType(n1, n2)) {\n      anchor = getNextHostNode(n1);\n      unmount(n1, parentComponent, parentSuspense, true);\n      n1 = null;\n    }\n    if (n2.patchFlag === -2) {\n      optimized = false;\n      n2.dynamicChildren = null;\n    }\n    const { type, ref, shapeFlag } = n2;\n    switch (type) {\n      case Text:\n        processText(n1, n2, container, anchor);\n        break;\n      case Comment:\n        processCommentNode(n1, n2, container, anchor);\n        break;\n      case Static:\n        if (n1 == null) {\n          mountStaticNode(n2, container, anchor, namespace);\n        } else if (!!(process.env.NODE_ENV !== \"production\")) {\n          patchStaticNode(n1, n2, container, namespace);\n        }\n        break;\n      case Fragment:\n        processFragment(\n          n1,\n          n2,\n          container,\n          anchor,\n          parentComponent,\n          parentSuspense,\n          namespace,\n          slotScopeIds,\n          optimized\n        );\n        break;\n      default:\n        if (shapeFlag & 1) {\n          processElement(\n            n1,\n            n2,\n            container,\n            anchor,\n            parentComponent,\n            parentSuspense,\n            namespace,\n            slotScopeIds,\n            optimized\n          );\n        } else if (shapeFlag & 6) {\n          processComponent(\n            n1,\n            n2,\n            container,\n            anchor,\n            parentComponent,\n            parentSuspense,\n            namespace,\n            slotScopeIds,\n            optimized\n          );\n        } else if (shapeFlag & 64) {\n          type.process(\n            n1,\n            n2,\n            container,\n            anchor,\n            parentComponent,\n            parentSuspense,\n            namespace,\n            slotScopeIds,\n            optimized,\n            internals\n          );\n        } else if (shapeFlag & 128) {\n          type.process(\n            n1,\n            n2,\n            container,\n            anchor,\n            parentComponent,\n            parentSuspense,\n            namespace,\n            slotScopeIds,\n            optimized,\n            internals\n          );\n        } else if (!!(process.env.NODE_ENV !== \"production\")) {\n          warn$1(\"Invalid VNode type:\", type, `(${typeof type})`);\n        }\n    }\n    if (ref != null && parentComponent) {\n      setRef(ref, n1 && n1.ref, parentSuspense, n2 || n1, !n2);\n    } else if (ref == null && n1 && n1.ref != null) {\n      setRef(n1.ref, null, parentSuspense, n1, true);\n    }\n  };\n  const processText = (n1, n2, container, anchor) => {\n    if (n1 == null) {\n      hostInsert(\n        n2.el = hostCreateText(n2.children),\n        container,\n        anchor\n      );\n    } else {\n      const el = n2.el = n1.el;\n      if (n2.children !== n1.children) {\n        hostSetText(el, n2.children);\n      }\n    }\n  };\n  const processCommentNode = (n1, n2, container, anchor) => {\n    if (n1 == null) {\n      hostInsert(\n        n2.el = hostCreateComment(n2.children || \"\"),\n        container,\n        anchor\n      );\n    } else {\n      n2.el = n1.el;\n    }\n  };\n  const mountStaticNode = (n2, container, anchor, namespace) => {\n    [n2.el, n2.anchor] = hostInsertStaticContent(\n      n2.children,\n      container,\n      anchor,\n      namespace,\n      n2.el,\n      n2.anchor\n    );\n  };\n  const patchStaticNode = (n1, n2, container, namespace) => {\n    if (n2.children !== n1.children) {\n      const anchor = hostNextSibling(n1.anchor);\n      removeStaticNode(n1);\n      [n2.el, n2.anchor] = hostInsertStaticContent(\n        n2.children,\n        container,\n        anchor,\n        namespace\n      );\n    } else {\n      n2.el = n1.el;\n      n2.anchor = n1.anchor;\n    }\n  };\n  const moveStaticNode = ({ el, anchor }, container, nextSibling) => {\n    let next;\n    while (el && el !== anchor) {\n      next = hostNextSibling(el);\n      hostInsert(el, container, nextSibling);\n      el = next;\n    }\n    hostInsert(anchor, container, nextSibling);\n  };\n  const removeStaticNode = ({ el, anchor }) => {\n    let next;\n    while (el && el !== anchor) {\n      next = hostNextSibling(el);\n      hostRemove(el);\n      el = next;\n    }\n    hostRemove(anchor);\n  };\n  const processElement = (n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => {\n    if (n2.type === \"svg\") {\n      namespace = \"svg\";\n    } else if (n2.type === \"math\") {\n      namespace = \"mathml\";\n    }\n    if (n1 == null) {\n      mountElement(\n        n2,\n        container,\n        anchor,\n        parentComponent,\n        parentSuspense,\n        namespace,\n        slotScopeIds,\n        optimized\n      );\n    } else {\n      patchElement(\n        n1,\n        n2,\n        parentComponent,\n        parentSuspense,\n        namespace,\n        slotScopeIds,\n        optimized\n      );\n    }\n  };\n  const mountElement = (vnode, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => {\n    let el;\n    let vnodeHook;\n    const { props, shapeFlag, transition, dirs } = vnode;\n    el = vnode.el = hostCreateElement(\n      vnode.type,\n      namespace,\n      props && props.is,\n      props\n    );\n    if (shapeFlag & 8) {\n      hostSetElementText(el, vnode.children);\n    } else if (shapeFlag & 16) {\n      mountChildren(\n        vnode.children,\n        el,\n        null,\n        parentComponent,\n        parentSuspense,\n        resolveChildrenNamespace(vnode, namespace),\n        slotScopeIds,\n        optimized\n      );\n    }\n    if (dirs) {\n      invokeDirectiveHook(vnode, null, parentComponent, \"created\");\n    }\n    setScopeId(el, vnode, vnode.scopeId, slotScopeIds, parentComponent);\n    if (props) {\n      for (const key in props) {\n        if (key !== \"value\" && !isReservedProp(key)) {\n          hostPatchProp(el, key, null, props[key], namespace, parentComponent);\n        }\n      }\n      if (\"value\" in props) {\n        hostPatchProp(el, \"value\", null, props.value, namespace);\n      }\n      if (vnodeHook = props.onVnodeBeforeMount) {\n        invokeVNodeHook(vnodeHook, parentComponent, vnode);\n      }\n    }\n    if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n      def(el, \"__vnode\", vnode, true);\n      def(el, \"__vueParentComponent\", parentComponent, true);\n    }\n    if (dirs) {\n      invokeDirectiveHook(vnode, null, parentComponent, \"beforeMount\");\n    }\n    const needCallTransitionHooks = needTransition(parentSuspense, transition);\n    if (needCallTransitionHooks) {\n      transition.beforeEnter(el);\n    }\n    hostInsert(el, container, anchor);\n    if ((vnodeHook = props && props.onVnodeMounted) || needCallTransitionHooks || dirs) {\n      queuePostRenderEffect(() => {\n        vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, vnode);\n        needCallTransitionHooks && transition.enter(el);\n        dirs && invokeDirectiveHook(vnode, null, parentComponent, \"mounted\");\n      }, parentSuspense);\n    }\n  };\n  const setScopeId = (el, vnode, scopeId, slotScopeIds, parentComponent) => {\n    if (scopeId) {\n      hostSetScopeId(el, scopeId);\n    }\n    if (slotScopeIds) {\n      for (let i = 0; i < slotScopeIds.length; i++) {\n        hostSetScopeId(el, slotScopeIds[i]);\n      }\n    }\n    if (parentComponent) {\n      let subTree = parentComponent.subTree;\n      if (!!(process.env.NODE_ENV !== \"production\") && subTree.patchFlag > 0 && subTree.patchFlag & 2048) {\n        subTree = filterSingleRoot(subTree.children) || subTree;\n      }\n      if (vnode === subTree || isSuspense(subTree.type) && (subTree.ssContent === vnode || subTree.ssFallback === vnode)) {\n        const parentVNode = parentComponent.vnode;\n        setScopeId(\n          el,\n          parentVNode,\n          parentVNode.scopeId,\n          parentVNode.slotScopeIds,\n          parentComponent.parent\n        );\n      }\n    }\n  };\n  const mountChildren = (children, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, start = 0) => {\n    for (let i = start; i < children.length; i++) {\n      const child = children[i] = optimized ? cloneIfMounted(children[i]) : normalizeVNode(children[i]);\n      patch(\n        null,\n        child,\n        container,\n        anchor,\n        parentComponent,\n        parentSuspense,\n        namespace,\n        slotScopeIds,\n        optimized\n      );\n    }\n  };\n  const patchElement = (n1, n2, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => {\n    const el = n2.el = n1.el;\n    if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n      el.__vnode = n2;\n    }\n    let { patchFlag, dynamicChildren, dirs } = n2;\n    patchFlag |= n1.patchFlag & 16;\n    const oldProps = n1.props || EMPTY_OBJ;\n    const newProps = n2.props || EMPTY_OBJ;\n    let vnodeHook;\n    parentComponent && toggleRecurse(parentComponent, false);\n    if (vnodeHook = newProps.onVnodeBeforeUpdate) {\n      invokeVNodeHook(vnodeHook, parentComponent, n2, n1);\n    }\n    if (dirs) {\n      invokeDirectiveHook(n2, n1, parentComponent, \"beforeUpdate\");\n    }\n    parentComponent && toggleRecurse(parentComponent, true);\n    if (!!(process.env.NODE_ENV !== \"production\") && isHmrUpdating) {\n      patchFlag = 0;\n      optimized = false;\n      dynamicChildren = null;\n    }\n    if (oldProps.innerHTML && newProps.innerHTML == null || oldProps.textContent && newProps.textContent == null) {\n      hostSetElementText(el, \"\");\n    }\n    if (dynamicChildren) {\n      patchBlockChildren(\n        n1.dynamicChildren,\n        dynamicChildren,\n        el,\n        parentComponent,\n        parentSuspense,\n        resolveChildrenNamespace(n2, namespace),\n        slotScopeIds\n      );\n      if (!!(process.env.NODE_ENV !== \"production\")) {\n        traverseStaticChildren(n1, n2);\n      }\n    } else if (!optimized) {\n      patchChildren(\n        n1,\n        n2,\n        el,\n        null,\n        parentComponent,\n        parentSuspense,\n        resolveChildrenNamespace(n2, namespace),\n        slotScopeIds,\n        false\n      );\n    }\n    if (patchFlag > 0) {\n      if (patchFlag & 16) {\n        patchProps(el, oldProps, newProps, parentComponent, namespace);\n      } else {\n        if (patchFlag & 2) {\n          if (oldProps.class !== newProps.class) {\n            hostPatchProp(el, \"class\", null, newProps.class, namespace);\n          }\n        }\n        if (patchFlag & 4) {\n          hostPatchProp(el, \"style\", oldProps.style, newProps.style, namespace);\n        }\n        if (patchFlag & 8) {\n          const propsToUpdate = n2.dynamicProps;\n          for (let i = 0; i < propsToUpdate.length; i++) {\n            const key = propsToUpdate[i];\n            const prev = oldProps[key];\n            const next = newProps[key];\n            if (next !== prev || key === \"value\") {\n              hostPatchProp(el, key, prev, next, namespace, parentComponent);\n            }\n          }\n        }\n      }\n      if (patchFlag & 1) {\n        if (n1.children !== n2.children) {\n          hostSetElementText(el, n2.children);\n        }\n      }\n    } else if (!optimized && dynamicChildren == null) {\n      patchProps(el, oldProps, newProps, parentComponent, namespace);\n    }\n    if ((vnodeHook = newProps.onVnodeUpdated) || dirs) {\n      queuePostRenderEffect(() => {\n        vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, n2, n1);\n        dirs && invokeDirectiveHook(n2, n1, parentComponent, \"updated\");\n      }, parentSuspense);\n    }\n  };\n  const patchBlockChildren = (oldChildren, newChildren, fallbackContainer, parentComponent, parentSuspense, namespace, slotScopeIds) => {\n    for (let i = 0; i < newChildren.length; i++) {\n      const oldVNode = oldChildren[i];\n      const newVNode = newChildren[i];\n      const container = (\n        // oldVNode may be an errored async setup() component inside Suspense\n        // which will not have a mounted element\n        oldVNode.el && // - In the case of a Fragment, we need to provide the actual parent\n        // of the Fragment itself so it can move its children.\n        (oldVNode.type === Fragment || // - In the case of different nodes, there is going to be a replacement\n        // which also requires the correct parent container\n        !isSameVNodeType(oldVNode, newVNode) || // - In the case of a component, it could contain anything.\n        oldVNode.shapeFlag & (6 | 64 | 128)) ? hostParentNode(oldVNode.el) : (\n          // In other cases, the parent container is not actually used so we\n          // just pass the block element here to avoid a DOM parentNode call.\n          fallbackContainer\n        )\n      );\n      patch(\n        oldVNode,\n        newVNode,\n        container,\n        null,\n        parentComponent,\n        parentSuspense,\n        namespace,\n        slotScopeIds,\n        true\n      );\n    }\n  };\n  const patchProps = (el, oldProps, newProps, parentComponent, namespace) => {\n    if (oldProps !== newProps) {\n      if (oldProps !== EMPTY_OBJ) {\n        for (const key in oldProps) {\n          if (!isReservedProp(key) && !(key in newProps)) {\n            hostPatchProp(\n              el,\n              key,\n              oldProps[key],\n              null,\n              namespace,\n              parentComponent\n            );\n          }\n        }\n      }\n      for (const key in newProps) {\n        if (isReservedProp(key)) continue;\n        const next = newProps[key];\n        const prev = oldProps[key];\n        if (next !== prev && key !== \"value\") {\n          hostPatchProp(el, key, prev, next, namespace, parentComponent);\n        }\n      }\n      if (\"value\" in newProps) {\n        hostPatchProp(el, \"value\", oldProps.value, newProps.value, namespace);\n      }\n    }\n  };\n  const processFragment = (n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => {\n    const fragmentStartAnchor = n2.el = n1 ? n1.el : hostCreateText(\"\");\n    const fragmentEndAnchor = n2.anchor = n1 ? n1.anchor : hostCreateText(\"\");\n    let { patchFlag, dynamicChildren, slotScopeIds: fragmentSlotScopeIds } = n2;\n    if (!!(process.env.NODE_ENV !== \"production\") && // #5523 dev root fragment may inherit directives\n    (isHmrUpdating || patchFlag & 2048)) {\n      patchFlag = 0;\n      optimized = false;\n      dynamicChildren = null;\n    }\n    if (fragmentSlotScopeIds) {\n      slotScopeIds = slotScopeIds ? slotScopeIds.concat(fragmentSlotScopeIds) : fragmentSlotScopeIds;\n    }\n    if (n1 == null) {\n      hostInsert(fragmentStartAnchor, container, anchor);\n      hostInsert(fragmentEndAnchor, container, anchor);\n      mountChildren(\n        // #10007\n        // such fragment like `<></>` will be compiled into\n        // a fragment which doesn't have a children.\n        // In this case fallback to an empty array\n        n2.children || [],\n        container,\n        fragmentEndAnchor,\n        parentComponent,\n        parentSuspense,\n        namespace,\n        slotScopeIds,\n        optimized\n      );\n    } else {\n      if (patchFlag > 0 && patchFlag & 64 && dynamicChildren && // #2715 the previous fragment could've been a BAILed one as a result\n      // of renderSlot() with no valid children\n      n1.dynamicChildren) {\n        patchBlockChildren(\n          n1.dynamicChildren,\n          dynamicChildren,\n          container,\n          parentComponent,\n          parentSuspense,\n          namespace,\n          slotScopeIds\n        );\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          traverseStaticChildren(n1, n2);\n        } else if (\n          // #2080 if the stable fragment has a key, it's a <template v-for> that may\n          //  get moved around. Make sure all root level vnodes inherit el.\n          // #2134 or if it's a component root, it may also get moved around\n          // as the component is being moved.\n          n2.key != null || parentComponent && n2 === parentComponent.subTree\n        ) {\n          traverseStaticChildren(\n            n1,\n            n2,\n            true\n            /* shallow */\n          );\n        }\n      } else {\n        patchChildren(\n          n1,\n          n2,\n          container,\n          fragmentEndAnchor,\n          parentComponent,\n          parentSuspense,\n          namespace,\n          slotScopeIds,\n          optimized\n        );\n      }\n    }\n  };\n  const processComponent = (n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => {\n    n2.slotScopeIds = slotScopeIds;\n    if (n1 == null) {\n      if (n2.shapeFlag & 512) {\n        parentComponent.ctx.activate(\n          n2,\n          container,\n          anchor,\n          namespace,\n          optimized\n        );\n      } else {\n        mountComponent(\n          n2,\n          container,\n          anchor,\n          parentComponent,\n          parentSuspense,\n          namespace,\n          optimized\n        );\n      }\n    } else {\n      updateComponent(n1, n2, optimized);\n    }\n  };\n  const mountComponent = (initialVNode, container, anchor, parentComponent, parentSuspense, namespace, optimized) => {\n    const instance = (initialVNode.component = createComponentInstance(\n      initialVNode,\n      parentComponent,\n      parentSuspense\n    ));\n    if (!!(process.env.NODE_ENV !== \"production\") && instance.type.__hmrId) {\n      registerHMR(instance);\n    }\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      pushWarningContext(initialVNode);\n      startMeasure(instance, `mount`);\n    }\n    if (isKeepAlive(initialVNode)) {\n      instance.ctx.renderer = internals;\n    }\n    {\n      if (!!(process.env.NODE_ENV !== \"production\")) {\n        startMeasure(instance, `init`);\n      }\n      setupComponent(instance, false, optimized);\n      if (!!(process.env.NODE_ENV !== \"production\")) {\n        endMeasure(instance, `init`);\n      }\n    }\n    if (!!(process.env.NODE_ENV !== \"production\") && isHmrUpdating) initialVNode.el = null;\n    if (instance.asyncDep) {\n      parentSuspense && parentSuspense.registerDep(instance, setupRenderEffect, optimized);\n      if (!initialVNode.el) {\n        const placeholder = instance.subTree = createVNode(Comment);\n        processCommentNode(null, placeholder, container, anchor);\n        initialVNode.placeholder = placeholder.el;\n      }\n    } else {\n      setupRenderEffect(\n        instance,\n        initialVNode,\n        container,\n        anchor,\n        parentSuspense,\n        namespace,\n        optimized\n      );\n    }\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      popWarningContext();\n      endMeasure(instance, `mount`);\n    }\n  };\n  const updateComponent = (n1, n2, optimized) => {\n    const instance = n2.component = n1.component;\n    if (shouldUpdateComponent(n1, n2, optimized)) {\n      if (instance.asyncDep && !instance.asyncResolved) {\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          pushWarningContext(n2);\n        }\n        updateComponentPreRender(instance, n2, optimized);\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          popWarningContext();\n        }\n        return;\n      } else {\n        instance.next = n2;\n        instance.update();\n      }\n    } else {\n      n2.el = n1.el;\n      instance.vnode = n2;\n    }\n  };\n  const setupRenderEffect = (instance, initialVNode, container, anchor, parentSuspense, namespace, optimized) => {\n    const componentUpdateFn = () => {\n      if (!instance.isMounted) {\n        let vnodeHook;\n        const { el, props } = initialVNode;\n        const { bm, m, parent, root, type } = instance;\n        const isAsyncWrapperVNode = isAsyncWrapper(initialVNode);\n        toggleRecurse(instance, false);\n        if (bm) {\n          invokeArrayFns(bm);\n        }\n        if (!isAsyncWrapperVNode && (vnodeHook = props && props.onVnodeBeforeMount)) {\n          invokeVNodeHook(vnodeHook, parent, initialVNode);\n        }\n        toggleRecurse(instance, true);\n        if (el && hydrateNode) {\n          const hydrateSubTree = () => {\n            if (!!(process.env.NODE_ENV !== \"production\")) {\n              startMeasure(instance, `render`);\n            }\n            instance.subTree = renderComponentRoot(instance);\n            if (!!(process.env.NODE_ENV !== \"production\")) {\n              endMeasure(instance, `render`);\n            }\n            if (!!(process.env.NODE_ENV !== \"production\")) {\n              startMeasure(instance, `hydrate`);\n            }\n            hydrateNode(\n              el,\n              instance.subTree,\n              instance,\n              parentSuspense,\n              null\n            );\n            if (!!(process.env.NODE_ENV !== \"production\")) {\n              endMeasure(instance, `hydrate`);\n            }\n          };\n          if (isAsyncWrapperVNode && type.__asyncHydrate) {\n            type.__asyncHydrate(\n              el,\n              instance,\n              hydrateSubTree\n            );\n          } else {\n            hydrateSubTree();\n          }\n        } else {\n          if (root.ce && // @ts-expect-error _def is private\n          root.ce._def.shadowRoot !== false) {\n            root.ce._injectChildStyle(type);\n          }\n          if (!!(process.env.NODE_ENV !== \"production\")) {\n            startMeasure(instance, `render`);\n          }\n          const subTree = instance.subTree = renderComponentRoot(instance);\n          if (!!(process.env.NODE_ENV !== \"production\")) {\n            endMeasure(instance, `render`);\n          }\n          if (!!(process.env.NODE_ENV !== \"production\")) {\n            startMeasure(instance, `patch`);\n          }\n          patch(\n            null,\n            subTree,\n            container,\n            anchor,\n            instance,\n            parentSuspense,\n            namespace\n          );\n          if (!!(process.env.NODE_ENV !== \"production\")) {\n            endMeasure(instance, `patch`);\n          }\n          initialVNode.el = subTree.el;\n        }\n        if (m) {\n          queuePostRenderEffect(m, parentSuspense);\n        }\n        if (!isAsyncWrapperVNode && (vnodeHook = props && props.onVnodeMounted)) {\n          const scopedInitialVNode = initialVNode;\n          queuePostRenderEffect(\n            () => invokeVNodeHook(vnodeHook, parent, scopedInitialVNode),\n            parentSuspense\n          );\n        }\n        if (initialVNode.shapeFlag & 256 || parent && isAsyncWrapper(parent.vnode) && parent.vnode.shapeFlag & 256) {\n          instance.a && queuePostRenderEffect(instance.a, parentSuspense);\n        }\n        instance.isMounted = true;\n        if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n          devtoolsComponentAdded(instance);\n        }\n        initialVNode = container = anchor = null;\n      } else {\n        let { next, bu, u, parent, vnode } = instance;\n        {\n          const nonHydratedAsyncRoot = locateNonHydratedAsyncRoot(instance);\n          if (nonHydratedAsyncRoot) {\n            if (next) {\n              next.el = vnode.el;\n              updateComponentPreRender(instance, next, optimized);\n            }\n            nonHydratedAsyncRoot.asyncDep.then(() => {\n              if (!instance.isUnmounted) {\n                componentUpdateFn();\n              }\n            });\n            return;\n          }\n        }\n        let originNext = next;\n        let vnodeHook;\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          pushWarningContext(next || instance.vnode);\n        }\n        toggleRecurse(instance, false);\n        if (next) {\n          next.el = vnode.el;\n          updateComponentPreRender(instance, next, optimized);\n        } else {\n          next = vnode;\n        }\n        if (bu) {\n          invokeArrayFns(bu);\n        }\n        if (vnodeHook = next.props && next.props.onVnodeBeforeUpdate) {\n          invokeVNodeHook(vnodeHook, parent, next, vnode);\n        }\n        toggleRecurse(instance, true);\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          startMeasure(instance, `render`);\n        }\n        const nextTree = renderComponentRoot(instance);\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          endMeasure(instance, `render`);\n        }\n        const prevTree = instance.subTree;\n        instance.subTree = nextTree;\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          startMeasure(instance, `patch`);\n        }\n        patch(\n          prevTree,\n          nextTree,\n          // parent may have changed if it's in a teleport\n          hostParentNode(prevTree.el),\n          // anchor may have changed if it's in a fragment\n          getNextHostNode(prevTree),\n          instance,\n          parentSuspense,\n          namespace\n        );\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          endMeasure(instance, `patch`);\n        }\n        next.el = nextTree.el;\n        if (originNext === null) {\n          updateHOCHostEl(instance, nextTree.el);\n        }\n        if (u) {\n          queuePostRenderEffect(u, parentSuspense);\n        }\n        if (vnodeHook = next.props && next.props.onVnodeUpdated) {\n          queuePostRenderEffect(\n            () => invokeVNodeHook(vnodeHook, parent, next, vnode),\n            parentSuspense\n          );\n        }\n        if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n          devtoolsComponentUpdated(instance);\n        }\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          popWarningContext();\n        }\n      }\n    };\n    instance.scope.on();\n    const effect = instance.effect = new ReactiveEffect(componentUpdateFn);\n    instance.scope.off();\n    const update = instance.update = effect.run.bind(effect);\n    const job = instance.job = effect.runIfDirty.bind(effect);\n    job.i = instance;\n    job.id = instance.uid;\n    effect.scheduler = () => queueJob(job);\n    toggleRecurse(instance, true);\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      effect.onTrack = instance.rtc ? (e) => invokeArrayFns(instance.rtc, e) : void 0;\n      effect.onTrigger = instance.rtg ? (e) => invokeArrayFns(instance.rtg, e) : void 0;\n    }\n    update();\n  };\n  const updateComponentPreRender = (instance, nextVNode, optimized) => {\n    nextVNode.component = instance;\n    const prevProps = instance.vnode.props;\n    instance.vnode = nextVNode;\n    instance.next = null;\n    updateProps(instance, nextVNode.props, prevProps, optimized);\n    updateSlots(instance, nextVNode.children, optimized);\n    pauseTracking();\n    flushPreFlushCbs(instance);\n    resetTracking();\n  };\n  const patchChildren = (n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized = false) => {\n    const c1 = n1 && n1.children;\n    const prevShapeFlag = n1 ? n1.shapeFlag : 0;\n    const c2 = n2.children;\n    const { patchFlag, shapeFlag } = n2;\n    if (patchFlag > 0) {\n      if (patchFlag & 128) {\n        patchKeyedChildren(\n          c1,\n          c2,\n          container,\n          anchor,\n          parentComponent,\n          parentSuspense,\n          namespace,\n          slotScopeIds,\n          optimized\n        );\n        return;\n      } else if (patchFlag & 256) {\n        patchUnkeyedChildren(\n          c1,\n          c2,\n          container,\n          anchor,\n          parentComponent,\n          parentSuspense,\n          namespace,\n          slotScopeIds,\n          optimized\n        );\n        return;\n      }\n    }\n    if (shapeFlag & 8) {\n      if (prevShapeFlag & 16) {\n        unmountChildren(c1, parentComponent, parentSuspense);\n      }\n      if (c2 !== c1) {\n        hostSetElementText(container, c2);\n      }\n    } else {\n      if (prevShapeFlag & 16) {\n        if (shapeFlag & 16) {\n          patchKeyedChildren(\n            c1,\n            c2,\n            container,\n            anchor,\n            parentComponent,\n            parentSuspense,\n            namespace,\n            slotScopeIds,\n            optimized\n          );\n        } else {\n          unmountChildren(c1, parentComponent, parentSuspense, true);\n        }\n      } else {\n        if (prevShapeFlag & 8) {\n          hostSetElementText(container, \"\");\n        }\n        if (shapeFlag & 16) {\n          mountChildren(\n            c2,\n            container,\n            anchor,\n            parentComponent,\n            parentSuspense,\n            namespace,\n            slotScopeIds,\n            optimized\n          );\n        }\n      }\n    }\n  };\n  const patchUnkeyedChildren = (c1, c2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => {\n    c1 = c1 || EMPTY_ARR;\n    c2 = c2 || EMPTY_ARR;\n    const oldLength = c1.length;\n    const newLength = c2.length;\n    const commonLength = Math.min(oldLength, newLength);\n    let i;\n    for (i = 0; i < commonLength; i++) {\n      const nextChild = c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]);\n      patch(\n        c1[i],\n        nextChild,\n        container,\n        null,\n        parentComponent,\n        parentSuspense,\n        namespace,\n        slotScopeIds,\n        optimized\n      );\n    }\n    if (oldLength > newLength) {\n      unmountChildren(\n        c1,\n        parentComponent,\n        parentSuspense,\n        true,\n        false,\n        commonLength\n      );\n    } else {\n      mountChildren(\n        c2,\n        container,\n        anchor,\n        parentComponent,\n        parentSuspense,\n        namespace,\n        slotScopeIds,\n        optimized,\n        commonLength\n      );\n    }\n  };\n  const patchKeyedChildren = (c1, c2, container, parentAnchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => {\n    let i = 0;\n    const l2 = c2.length;\n    let e1 = c1.length - 1;\n    let e2 = l2 - 1;\n    while (i <= e1 && i <= e2) {\n      const n1 = c1[i];\n      const n2 = c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]);\n      if (isSameVNodeType(n1, n2)) {\n        patch(\n          n1,\n          n2,\n          container,\n          null,\n          parentComponent,\n          parentSuspense,\n          namespace,\n          slotScopeIds,\n          optimized\n        );\n      } else {\n        break;\n      }\n      i++;\n    }\n    while (i <= e1 && i <= e2) {\n      const n1 = c1[e1];\n      const n2 = c2[e2] = optimized ? cloneIfMounted(c2[e2]) : normalizeVNode(c2[e2]);\n      if (isSameVNodeType(n1, n2)) {\n        patch(\n          n1,\n          n2,\n          container,\n          null,\n          parentComponent,\n          parentSuspense,\n          namespace,\n          slotScopeIds,\n          optimized\n        );\n      } else {\n        break;\n      }\n      e1--;\n      e2--;\n    }\n    if (i > e1) {\n      if (i <= e2) {\n        const nextPos = e2 + 1;\n        const anchor = nextPos < l2 ? c2[nextPos].el : parentAnchor;\n        while (i <= e2) {\n          patch(\n            null,\n            c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]),\n            container,\n            anchor,\n            parentComponent,\n            parentSuspense,\n            namespace,\n            slotScopeIds,\n            optimized\n          );\n          i++;\n        }\n      }\n    } else if (i > e2) {\n      while (i <= e1) {\n        unmount(c1[i], parentComponent, parentSuspense, true);\n        i++;\n      }\n    } else {\n      const s1 = i;\n      const s2 = i;\n      const keyToNewIndexMap = /* @__PURE__ */ new Map();\n      for (i = s2; i <= e2; i++) {\n        const nextChild = c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]);\n        if (nextChild.key != null) {\n          if (!!(process.env.NODE_ENV !== \"production\") && keyToNewIndexMap.has(nextChild.key)) {\n            warn$1(\n              `Duplicate keys found during update:`,\n              JSON.stringify(nextChild.key),\n              `Make sure keys are unique.`\n            );\n          }\n          keyToNewIndexMap.set(nextChild.key, i);\n        }\n      }\n      let j;\n      let patched = 0;\n      const toBePatched = e2 - s2 + 1;\n      let moved = false;\n      let maxNewIndexSoFar = 0;\n      const newIndexToOldIndexMap = new Array(toBePatched);\n      for (i = 0; i < toBePatched; i++) newIndexToOldIndexMap[i] = 0;\n      for (i = s1; i <= e1; i++) {\n        const prevChild = c1[i];\n        if (patched >= toBePatched) {\n          unmount(prevChild, parentComponent, parentSuspense, true);\n          continue;\n        }\n        let newIndex;\n        if (prevChild.key != null) {\n          newIndex = keyToNewIndexMap.get(prevChild.key);\n        } else {\n          for (j = s2; j <= e2; j++) {\n            if (newIndexToOldIndexMap[j - s2] === 0 && isSameVNodeType(prevChild, c2[j])) {\n              newIndex = j;\n              break;\n            }\n          }\n        }\n        if (newIndex === void 0) {\n          unmount(prevChild, parentComponent, parentSuspense, true);\n        } else {\n          newIndexToOldIndexMap[newIndex - s2] = i + 1;\n          if (newIndex >= maxNewIndexSoFar) {\n            maxNewIndexSoFar = newIndex;\n          } else {\n            moved = true;\n          }\n          patch(\n            prevChild,\n            c2[newIndex],\n            container,\n            null,\n            parentComponent,\n            parentSuspense,\n            namespace,\n            slotScopeIds,\n            optimized\n          );\n          patched++;\n        }\n      }\n      const increasingNewIndexSequence = moved ? getSequence(newIndexToOldIndexMap) : EMPTY_ARR;\n      j = increasingNewIndexSequence.length - 1;\n      for (i = toBePatched - 1; i >= 0; i--) {\n        const nextIndex = s2 + i;\n        const nextChild = c2[nextIndex];\n        const anchorVNode = c2[nextIndex + 1];\n        const anchor = nextIndex + 1 < l2 ? (\n          // #13559, fallback to el placeholder for unresolved async component\n          anchorVNode.el || anchorVNode.placeholder\n        ) : parentAnchor;\n        if (newIndexToOldIndexMap[i] === 0) {\n          patch(\n            null,\n            nextChild,\n            container,\n            anchor,\n            parentComponent,\n            parentSuspense,\n            namespace,\n            slotScopeIds,\n            optimized\n          );\n        } else if (moved) {\n          if (j < 0 || i !== increasingNewIndexSequence[j]) {\n            move(nextChild, container, anchor, 2);\n          } else {\n            j--;\n          }\n        }\n      }\n    }\n  };\n  const move = (vnode, container, anchor, moveType, parentSuspense = null) => {\n    const { el, type, transition, children, shapeFlag } = vnode;\n    if (shapeFlag & 6) {\n      move(vnode.component.subTree, container, anchor, moveType);\n      return;\n    }\n    if (shapeFlag & 128) {\n      vnode.suspense.move(container, anchor, moveType);\n      return;\n    }\n    if (shapeFlag & 64) {\n      type.move(vnode, container, anchor, internals);\n      return;\n    }\n    if (type === Fragment) {\n      hostInsert(el, container, anchor);\n      for (let i = 0; i < children.length; i++) {\n        move(children[i], container, anchor, moveType);\n      }\n      hostInsert(vnode.anchor, container, anchor);\n      return;\n    }\n    if (type === Static) {\n      moveStaticNode(vnode, container, anchor);\n      return;\n    }\n    const needTransition2 = moveType !== 2 && shapeFlag & 1 && transition;\n    if (needTransition2) {\n      if (moveType === 0) {\n        transition.beforeEnter(el);\n        hostInsert(el, container, anchor);\n        queuePostRenderEffect(() => transition.enter(el), parentSuspense);\n      } else {\n        const { leave, delayLeave, afterLeave } = transition;\n        const remove2 = () => {\n          if (vnode.ctx.isUnmounted) {\n            hostRemove(el);\n          } else {\n            hostInsert(el, container, anchor);\n          }\n        };\n        const performLeave = () => {\n          leave(el, () => {\n            remove2();\n            afterLeave && afterLeave();\n          });\n        };\n        if (delayLeave) {\n          delayLeave(el, remove2, performLeave);\n        } else {\n          performLeave();\n        }\n      }\n    } else {\n      hostInsert(el, container, anchor);\n    }\n  };\n  const unmount = (vnode, parentComponent, parentSuspense, doRemove = false, optimized = false) => {\n    const {\n      type,\n      props,\n      ref,\n      children,\n      dynamicChildren,\n      shapeFlag,\n      patchFlag,\n      dirs,\n      cacheIndex\n    } = vnode;\n    if (patchFlag === -2) {\n      optimized = false;\n    }\n    if (ref != null) {\n      pauseTracking();\n      setRef(ref, null, parentSuspense, vnode, true);\n      resetTracking();\n    }\n    if (cacheIndex != null) {\n      parentComponent.renderCache[cacheIndex] = void 0;\n    }\n    if (shapeFlag & 256) {\n      parentComponent.ctx.deactivate(vnode);\n      return;\n    }\n    const shouldInvokeDirs = shapeFlag & 1 && dirs;\n    const shouldInvokeVnodeHook = !isAsyncWrapper(vnode);\n    let vnodeHook;\n    if (shouldInvokeVnodeHook && (vnodeHook = props && props.onVnodeBeforeUnmount)) {\n      invokeVNodeHook(vnodeHook, parentComponent, vnode);\n    }\n    if (shapeFlag & 6) {\n      unmountComponent(vnode.component, parentSuspense, doRemove);\n    } else {\n      if (shapeFlag & 128) {\n        vnode.suspense.unmount(parentSuspense, doRemove);\n        return;\n      }\n      if (shouldInvokeDirs) {\n        invokeDirectiveHook(vnode, null, parentComponent, \"beforeUnmount\");\n      }\n      if (shapeFlag & 64) {\n        vnode.type.remove(\n          vnode,\n          parentComponent,\n          parentSuspense,\n          internals,\n          doRemove\n        );\n      } else if (dynamicChildren && // #5154\n      // when v-once is used inside a block, setBlockTracking(-1) marks the\n      // parent block with hasOnce: true\n      // so that it doesn't take the fast path during unmount - otherwise\n      // components nested in v-once are never unmounted.\n      !dynamicChildren.hasOnce && // #1153: fast path should not be taken for non-stable (v-for) fragments\n      (type !== Fragment || patchFlag > 0 && patchFlag & 64)) {\n        unmountChildren(\n          dynamicChildren,\n          parentComponent,\n          parentSuspense,\n          false,\n          true\n        );\n      } else if (type === Fragment && patchFlag & (128 | 256) || !optimized && shapeFlag & 16) {\n        unmountChildren(children, parentComponent, parentSuspense);\n      }\n      if (doRemove) {\n        remove(vnode);\n      }\n    }\n    if (shouldInvokeVnodeHook && (vnodeHook = props && props.onVnodeUnmounted) || shouldInvokeDirs) {\n      queuePostRenderEffect(() => {\n        vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, vnode);\n        shouldInvokeDirs && invokeDirectiveHook(vnode, null, parentComponent, \"unmounted\");\n      }, parentSuspense);\n    }\n  };\n  const remove = (vnode) => {\n    const { type, el, anchor, transition } = vnode;\n    if (type === Fragment) {\n      if (!!(process.env.NODE_ENV !== \"production\") && vnode.patchFlag > 0 && vnode.patchFlag & 2048 && transition && !transition.persisted) {\n        vnode.children.forEach((child) => {\n          if (child.type === Comment) {\n            hostRemove(child.el);\n          } else {\n            remove(child);\n          }\n        });\n      } else {\n        removeFragment(el, anchor);\n      }\n      return;\n    }\n    if (type === Static) {\n      removeStaticNode(vnode);\n      return;\n    }\n    const performRemove = () => {\n      hostRemove(el);\n      if (transition && !transition.persisted && transition.afterLeave) {\n        transition.afterLeave();\n      }\n    };\n    if (vnode.shapeFlag & 1 && transition && !transition.persisted) {\n      const { leave, delayLeave } = transition;\n      const performLeave = () => leave(el, performRemove);\n      if (delayLeave) {\n        delayLeave(vnode.el, performRemove, performLeave);\n      } else {\n        performLeave();\n      }\n    } else {\n      performRemove();\n    }\n  };\n  const removeFragment = (cur, end) => {\n    let next;\n    while (cur !== end) {\n      next = hostNextSibling(cur);\n      hostRemove(cur);\n      cur = next;\n    }\n    hostRemove(end);\n  };\n  const unmountComponent = (instance, parentSuspense, doRemove) => {\n    if (!!(process.env.NODE_ENV !== \"production\") && instance.type.__hmrId) {\n      unregisterHMR(instance);\n    }\n    const {\n      bum,\n      scope,\n      job,\n      subTree,\n      um,\n      m,\n      a,\n      parent,\n      slots: { __: slotCacheKeys }\n    } = instance;\n    invalidateMount(m);\n    invalidateMount(a);\n    if (bum) {\n      invokeArrayFns(bum);\n    }\n    if (parent && isArray(slotCacheKeys)) {\n      slotCacheKeys.forEach((v) => {\n        parent.renderCache[v] = void 0;\n      });\n    }\n    scope.stop();\n    if (job) {\n      job.flags |= 8;\n      unmount(subTree, instance, parentSuspense, doRemove);\n    }\n    if (um) {\n      queuePostRenderEffect(um, parentSuspense);\n    }\n    queuePostRenderEffect(() => {\n      instance.isUnmounted = true;\n    }, parentSuspense);\n    if (parentSuspense && parentSuspense.pendingBranch && !parentSuspense.isUnmounted && instance.asyncDep && !instance.asyncResolved && instance.suspenseId === parentSuspense.pendingId) {\n      parentSuspense.deps--;\n      if (parentSuspense.deps === 0) {\n        parentSuspense.resolve();\n      }\n    }\n    if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n      devtoolsComponentRemoved(instance);\n    }\n  };\n  const unmountChildren = (children, parentComponent, parentSuspense, doRemove = false, optimized = false, start = 0) => {\n    for (let i = start; i < children.length; i++) {\n      unmount(children[i], parentComponent, parentSuspense, doRemove, optimized);\n    }\n  };\n  const getNextHostNode = (vnode) => {\n    if (vnode.shapeFlag & 6) {\n      return getNextHostNode(vnode.component.subTree);\n    }\n    if (vnode.shapeFlag & 128) {\n      return vnode.suspense.next();\n    }\n    const el = hostNextSibling(vnode.anchor || vnode.el);\n    const teleportEnd = el && el[TeleportEndKey];\n    return teleportEnd ? hostNextSibling(teleportEnd) : el;\n  };\n  let isFlushing = false;\n  const render = (vnode, container, namespace) => {\n    if (vnode == null) {\n      if (container._vnode) {\n        unmount(container._vnode, null, null, true);\n      }\n    } else {\n      patch(\n        container._vnode || null,\n        vnode,\n        container,\n        null,\n        null,\n        null,\n        namespace\n      );\n    }\n    container._vnode = vnode;\n    if (!isFlushing) {\n      isFlushing = true;\n      flushPreFlushCbs();\n      flushPostFlushCbs();\n      isFlushing = false;\n    }\n  };\n  const internals = {\n    p: patch,\n    um: unmount,\n    m: move,\n    r: remove,\n    mt: mountComponent,\n    mc: mountChildren,\n    pc: patchChildren,\n    pbc: patchBlockChildren,\n    n: getNextHostNode,\n    o: options\n  };\n  let hydrate;\n  let hydrateNode;\n  if (createHydrationFns) {\n    [hydrate, hydrateNode] = createHydrationFns(\n      internals\n    );\n  }\n  return {\n    render,\n    hydrate,\n    createApp: createAppAPI(render, hydrate)\n  };\n}\nfunction resolveChildrenNamespace({ type, props }, currentNamespace) {\n  return currentNamespace === \"svg\" && type === \"foreignObject\" || currentNamespace === \"mathml\" && type === \"annotation-xml\" && props && props.encoding && props.encoding.includes(\"html\") ? void 0 : currentNamespace;\n}\nfunction toggleRecurse({ effect, job }, allowed) {\n  if (allowed) {\n    effect.flags |= 32;\n    job.flags |= 4;\n  } else {\n    effect.flags &= -33;\n    job.flags &= -5;\n  }\n}\nfunction needTransition(parentSuspense, transition) {\n  return (!parentSuspense || parentSuspense && !parentSuspense.pendingBranch) && transition && !transition.persisted;\n}\nfunction traverseStaticChildren(n1, n2, shallow = false) {\n  const ch1 = n1.children;\n  const ch2 = n2.children;\n  if (isArray(ch1) && isArray(ch2)) {\n    for (let i = 0; i < ch1.length; i++) {\n      const c1 = ch1[i];\n      let c2 = ch2[i];\n      if (c2.shapeFlag & 1 && !c2.dynamicChildren) {\n        if (c2.patchFlag <= 0 || c2.patchFlag === 32) {\n          c2 = ch2[i] = cloneIfMounted(ch2[i]);\n          c2.el = c1.el;\n        }\n        if (!shallow && c2.patchFlag !== -2)\n          traverseStaticChildren(c1, c2);\n      }\n      if (c2.type === Text) {\n        c2.el = c1.el;\n      }\n      if (c2.type === Comment && !c2.el) {\n        c2.el = c1.el;\n      }\n      if (!!(process.env.NODE_ENV !== \"production\")) {\n        c2.el && (c2.el.__vnode = c2);\n      }\n    }\n  }\n}\nfunction getSequence(arr) {\n  const p = arr.slice();\n  const result = [0];\n  let i, j, u, v, c;\n  const len = arr.length;\n  for (i = 0; i < len; i++) {\n    const arrI = arr[i];\n    if (arrI !== 0) {\n      j = result[result.length - 1];\n      if (arr[j] < arrI) {\n        p[i] = j;\n        result.push(i);\n        continue;\n      }\n      u = 0;\n      v = result.length - 1;\n      while (u < v) {\n        c = u + v >> 1;\n        if (arr[result[c]] < arrI) {\n          u = c + 1;\n        } else {\n          v = c;\n        }\n      }\n      if (arrI < arr[result[u]]) {\n        if (u > 0) {\n          p[i] = result[u - 1];\n        }\n        result[u] = i;\n      }\n    }\n  }\n  u = result.length;\n  v = result[u - 1];\n  while (u-- > 0) {\n    result[u] = v;\n    v = p[v];\n  }\n  return result;\n}\nfunction locateNonHydratedAsyncRoot(instance) {\n  const subComponent = instance.subTree.component;\n  if (subComponent) {\n    if (subComponent.asyncDep && !subComponent.asyncResolved) {\n      return subComponent;\n    } else {\n      return locateNonHydratedAsyncRoot(subComponent);\n    }\n  }\n}\nfunction invalidateMount(hooks) {\n  if (hooks) {\n    for (let i = 0; i < hooks.length; i++)\n      hooks[i].flags |= 8;\n  }\n}\n\nconst ssrContextKey = Symbol.for(\"v-scx\");\nconst useSSRContext = () => {\n  {\n    const ctx = inject(ssrContextKey);\n    if (!ctx) {\n      !!(process.env.NODE_ENV !== \"production\") && warn$1(\n        `Server rendering context not provided. Make sure to only call useSSRContext() conditionally in the server build.`\n      );\n    }\n    return ctx;\n  }\n};\n\nfunction watchEffect(effect, options) {\n  return doWatch(effect, null, options);\n}\nfunction watchPostEffect(effect, options) {\n  return doWatch(\n    effect,\n    null,\n    !!(process.env.NODE_ENV !== \"production\") ? extend({}, options, { flush: \"post\" }) : { flush: \"post\" }\n  );\n}\nfunction watchSyncEffect(effect, options) {\n  return doWatch(\n    effect,\n    null,\n    !!(process.env.NODE_ENV !== \"production\") ? extend({}, options, { flush: \"sync\" }) : { flush: \"sync\" }\n  );\n}\nfunction watch(source, cb, options) {\n  if (!!(process.env.NODE_ENV !== \"production\") && !isFunction(cb)) {\n    warn$1(\n      `\\`watch(fn, options?)\\` signature has been moved to a separate API. Use \\`watchEffect(fn, options?)\\` instead. \\`watch\\` now only supports \\`watch(source, cb, options?) signature.`\n    );\n  }\n  return doWatch(source, cb, options);\n}\nfunction doWatch(source, cb, options = EMPTY_OBJ) {\n  const { immediate, deep, flush, once } = options;\n  if (!!(process.env.NODE_ENV !== \"production\") && !cb) {\n    if (immediate !== void 0) {\n      warn$1(\n        `watch() \"immediate\" option is only respected when using the watch(source, callback, options?) signature.`\n      );\n    }\n    if (deep !== void 0) {\n      warn$1(\n        `watch() \"deep\" option is only respected when using the watch(source, callback, options?) signature.`\n      );\n    }\n    if (once !== void 0) {\n      warn$1(\n        `watch() \"once\" option is only respected when using the watch(source, callback, options?) signature.`\n      );\n    }\n  }\n  const baseWatchOptions = extend({}, options);\n  if (!!(process.env.NODE_ENV !== \"production\")) baseWatchOptions.onWarn = warn$1;\n  const runsImmediately = cb && immediate || !cb && flush !== \"post\";\n  let ssrCleanup;\n  if (isInSSRComponentSetup) {\n    if (flush === \"sync\") {\n      const ctx = useSSRContext();\n      ssrCleanup = ctx.__watcherHandles || (ctx.__watcherHandles = []);\n    } else if (!runsImmediately) {\n      const watchStopHandle = () => {\n      };\n      watchStopHandle.stop = NOOP;\n      watchStopHandle.resume = NOOP;\n      watchStopHandle.pause = NOOP;\n      return watchStopHandle;\n    }\n  }\n  const instance = currentInstance;\n  baseWatchOptions.call = (fn, type, args) => callWithAsyncErrorHandling(fn, instance, type, args);\n  let isPre = false;\n  if (flush === \"post\") {\n    baseWatchOptions.scheduler = (job) => {\n      queuePostRenderEffect(job, instance && instance.suspense);\n    };\n  } else if (flush !== \"sync\") {\n    isPre = true;\n    baseWatchOptions.scheduler = (job, isFirstRun) => {\n      if (isFirstRun) {\n        job();\n      } else {\n        queueJob(job);\n      }\n    };\n  }\n  baseWatchOptions.augmentJob = (job) => {\n    if (cb) {\n      job.flags |= 4;\n    }\n    if (isPre) {\n      job.flags |= 2;\n      if (instance) {\n        job.id = instance.uid;\n        job.i = instance;\n      }\n    }\n  };\n  const watchHandle = watch$1(source, cb, baseWatchOptions);\n  if (isInSSRComponentSetup) {\n    if (ssrCleanup) {\n      ssrCleanup.push(watchHandle);\n    } else if (runsImmediately) {\n      watchHandle();\n    }\n  }\n  return watchHandle;\n}\nfunction instanceWatch(source, value, options) {\n  const publicThis = this.proxy;\n  const getter = isString(source) ? source.includes(\".\") ? createPathGetter(publicThis, source) : () => publicThis[source] : source.bind(publicThis, publicThis);\n  let cb;\n  if (isFunction(value)) {\n    cb = value;\n  } else {\n    cb = value.handler;\n    options = value;\n  }\n  const reset = setCurrentInstance(this);\n  const res = doWatch(getter, cb.bind(publicThis), options);\n  reset();\n  return res;\n}\nfunction createPathGetter(ctx, path) {\n  const segments = path.split(\".\");\n  return () => {\n    let cur = ctx;\n    for (let i = 0; i < segments.length && cur; i++) {\n      cur = cur[segments[i]];\n    }\n    return cur;\n  };\n}\n\nfunction useModel(props, name, options = EMPTY_OBJ) {\n  const i = getCurrentInstance();\n  if (!!(process.env.NODE_ENV !== \"production\") && !i) {\n    warn$1(`useModel() called without active instance.`);\n    return ref();\n  }\n  const camelizedName = camelize(name);\n  if (!!(process.env.NODE_ENV !== \"production\") && !i.propsOptions[0][camelizedName]) {\n    warn$1(`useModel() called with prop \"${name}\" which is not declared.`);\n    return ref();\n  }\n  const hyphenatedName = hyphenate(name);\n  const modifiers = getModelModifiers(props, camelizedName);\n  const res = customRef((track, trigger) => {\n    let localValue;\n    let prevSetValue = EMPTY_OBJ;\n    let prevEmittedValue;\n    watchSyncEffect(() => {\n      const propValue = props[camelizedName];\n      if (hasChanged(localValue, propValue)) {\n        localValue = propValue;\n        trigger();\n      }\n    });\n    return {\n      get() {\n        track();\n        return options.get ? options.get(localValue) : localValue;\n      },\n      set(value) {\n        const emittedValue = options.set ? options.set(value) : value;\n        if (!hasChanged(emittedValue, localValue) && !(prevSetValue !== EMPTY_OBJ && hasChanged(value, prevSetValue))) {\n          return;\n        }\n        const rawProps = i.vnode.props;\n        if (!(rawProps && // check if parent has passed v-model\n        (name in rawProps || camelizedName in rawProps || hyphenatedName in rawProps) && (`onUpdate:${name}` in rawProps || `onUpdate:${camelizedName}` in rawProps || `onUpdate:${hyphenatedName}` in rawProps))) {\n          localValue = value;\n          trigger();\n        }\n        i.emit(`update:${name}`, emittedValue);\n        if (hasChanged(value, emittedValue) && hasChanged(value, prevSetValue) && !hasChanged(emittedValue, prevEmittedValue)) {\n          trigger();\n        }\n        prevSetValue = value;\n        prevEmittedValue = emittedValue;\n      }\n    };\n  });\n  res[Symbol.iterator] = () => {\n    let i2 = 0;\n    return {\n      next() {\n        if (i2 < 2) {\n          return { value: i2++ ? modifiers || EMPTY_OBJ : res, done: false };\n        } else {\n          return { done: true };\n        }\n      }\n    };\n  };\n  return res;\n}\nconst getModelModifiers = (props, modelName) => {\n  return modelName === \"modelValue\" || modelName === \"model-value\" ? props.modelModifiers : props[`${modelName}Modifiers`] || props[`${camelize(modelName)}Modifiers`] || props[`${hyphenate(modelName)}Modifiers`];\n};\n\nfunction emit(instance, event, ...rawArgs) {\n  if (instance.isUnmounted) return;\n  const props = instance.vnode.props || EMPTY_OBJ;\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    const {\n      emitsOptions,\n      propsOptions: [propsOptions]\n    } = instance;\n    if (emitsOptions) {\n      if (!(event in emitsOptions) && true) {\n        if (!propsOptions || !(toHandlerKey(camelize(event)) in propsOptions)) {\n          warn$1(\n            `Component emitted event \"${event}\" but it is neither declared in the emits option nor as an \"${toHandlerKey(camelize(event))}\" prop.`\n          );\n        }\n      } else {\n        const validator = emitsOptions[event];\n        if (isFunction(validator)) {\n          const isValid = validator(...rawArgs);\n          if (!isValid) {\n            warn$1(\n              `Invalid event arguments: event validation failed for event \"${event}\".`\n            );\n          }\n        }\n      }\n    }\n  }\n  let args = rawArgs;\n  const isModelListener = event.startsWith(\"update:\");\n  const modifiers = isModelListener && getModelModifiers(props, event.slice(7));\n  if (modifiers) {\n    if (modifiers.trim) {\n      args = rawArgs.map((a) => isString(a) ? a.trim() : a);\n    }\n    if (modifiers.number) {\n      args = rawArgs.map(looseToNumber);\n    }\n  }\n  if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n    devtoolsComponentEmit(instance, event, args);\n  }\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    const lowerCaseEvent = event.toLowerCase();\n    if (lowerCaseEvent !== event && props[toHandlerKey(lowerCaseEvent)]) {\n      warn$1(\n        `Event \"${lowerCaseEvent}\" is emitted in component ${formatComponentName(\n          instance,\n          instance.type\n        )} but the handler is registered for \"${event}\". Note that HTML attributes are case-insensitive and you cannot use v-on to listen to camelCase events when using in-DOM templates. You should probably use \"${hyphenate(\n          event\n        )}\" instead of \"${event}\".`\n      );\n    }\n  }\n  let handlerName;\n  let handler = props[handlerName = toHandlerKey(event)] || // also try camelCase event handler (#2249)\n  props[handlerName = toHandlerKey(camelize(event))];\n  if (!handler && isModelListener) {\n    handler = props[handlerName = toHandlerKey(hyphenate(event))];\n  }\n  if (handler) {\n    callWithAsyncErrorHandling(\n      handler,\n      instance,\n      6,\n      args\n    );\n  }\n  const onceHandler = props[handlerName + `Once`];\n  if (onceHandler) {\n    if (!instance.emitted) {\n      instance.emitted = {};\n    } else if (instance.emitted[handlerName]) {\n      return;\n    }\n    instance.emitted[handlerName] = true;\n    callWithAsyncErrorHandling(\n      onceHandler,\n      instance,\n      6,\n      args\n    );\n  }\n}\nfunction normalizeEmitsOptions(comp, appContext, asMixin = false) {\n  const cache = appContext.emitsCache;\n  const cached = cache.get(comp);\n  if (cached !== void 0) {\n    return cached;\n  }\n  const raw = comp.emits;\n  let normalized = {};\n  let hasExtends = false;\n  if (__VUE_OPTIONS_API__ && !isFunction(comp)) {\n    const extendEmits = (raw2) => {\n      const normalizedFromExtend = normalizeEmitsOptions(raw2, appContext, true);\n      if (normalizedFromExtend) {\n        hasExtends = true;\n        extend(normalized, normalizedFromExtend);\n      }\n    };\n    if (!asMixin && appContext.mixins.length) {\n      appContext.mixins.forEach(extendEmits);\n    }\n    if (comp.extends) {\n      extendEmits(comp.extends);\n    }\n    if (comp.mixins) {\n      comp.mixins.forEach(extendEmits);\n    }\n  }\n  if (!raw && !hasExtends) {\n    if (isObject(comp)) {\n      cache.set(comp, null);\n    }\n    return null;\n  }\n  if (isArray(raw)) {\n    raw.forEach((key) => normalized[key] = null);\n  } else {\n    extend(normalized, raw);\n  }\n  if (isObject(comp)) {\n    cache.set(comp, normalized);\n  }\n  return normalized;\n}\nfunction isEmitListener(options, key) {\n  if (!options || !isOn(key)) {\n    return false;\n  }\n  key = key.slice(2).replace(/Once$/, \"\");\n  return hasOwn(options, key[0].toLowerCase() + key.slice(1)) || hasOwn(options, hyphenate(key)) || hasOwn(options, key);\n}\n\nlet accessedAttrs = false;\nfunction markAttrsAccessed() {\n  accessedAttrs = true;\n}\nfunction renderComponentRoot(instance) {\n  const {\n    type: Component,\n    vnode,\n    proxy,\n    withProxy,\n    propsOptions: [propsOptions],\n    slots,\n    attrs,\n    emit,\n    render,\n    renderCache,\n    props,\n    data,\n    setupState,\n    ctx,\n    inheritAttrs\n  } = instance;\n  const prev = setCurrentRenderingInstance(instance);\n  let result;\n  let fallthroughAttrs;\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    accessedAttrs = false;\n  }\n  try {\n    if (vnode.shapeFlag & 4) {\n      const proxyToUse = withProxy || proxy;\n      const thisProxy = !!(process.env.NODE_ENV !== \"production\") && setupState.__isScriptSetup ? new Proxy(proxyToUse, {\n        get(target, key, receiver) {\n          warn$1(\n            `Property '${String(\n              key\n            )}' was accessed via 'this'. Avoid using 'this' in templates.`\n          );\n          return Reflect.get(target, key, receiver);\n        }\n      }) : proxyToUse;\n      result = normalizeVNode(\n        render.call(\n          thisProxy,\n          proxyToUse,\n          renderCache,\n          !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(props) : props,\n          setupState,\n          data,\n          ctx\n        )\n      );\n      fallthroughAttrs = attrs;\n    } else {\n      const render2 = Component;\n      if (!!(process.env.NODE_ENV !== \"production\") && attrs === props) {\n        markAttrsAccessed();\n      }\n      result = normalizeVNode(\n        render2.length > 1 ? render2(\n          !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(props) : props,\n          !!(process.env.NODE_ENV !== \"production\") ? {\n            get attrs() {\n              markAttrsAccessed();\n              return shallowReadonly(attrs);\n            },\n            slots,\n            emit\n          } : { attrs, slots, emit }\n        ) : render2(\n          !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(props) : props,\n          null\n        )\n      );\n      fallthroughAttrs = Component.props ? attrs : getFunctionalFallthrough(attrs);\n    }\n  } catch (err) {\n    blockStack.length = 0;\n    handleError(err, instance, 1);\n    result = createVNode(Comment);\n  }\n  let root = result;\n  let setRoot = void 0;\n  if (!!(process.env.NODE_ENV !== \"production\") && result.patchFlag > 0 && result.patchFlag & 2048) {\n    [root, setRoot] = getChildRoot(result);\n  }\n  if (fallthroughAttrs && inheritAttrs !== false) {\n    const keys = Object.keys(fallthroughAttrs);\n    const { shapeFlag } = root;\n    if (keys.length) {\n      if (shapeFlag & (1 | 6)) {\n        if (propsOptions && keys.some(isModelListener)) {\n          fallthroughAttrs = filterModelListeners(\n            fallthroughAttrs,\n            propsOptions\n          );\n        }\n        root = cloneVNode(root, fallthroughAttrs, false, true);\n      } else if (!!(process.env.NODE_ENV !== \"production\") && !accessedAttrs && root.type !== Comment) {\n        const allAttrs = Object.keys(attrs);\n        const eventAttrs = [];\n        const extraAttrs = [];\n        for (let i = 0, l = allAttrs.length; i < l; i++) {\n          const key = allAttrs[i];\n          if (isOn(key)) {\n            if (!isModelListener(key)) {\n              eventAttrs.push(key[2].toLowerCase() + key.slice(3));\n            }\n          } else {\n            extraAttrs.push(key);\n          }\n        }\n        if (extraAttrs.length) {\n          warn$1(\n            `Extraneous non-props attributes (${extraAttrs.join(\", \")}) were passed to component but could not be automatically inherited because component renders fragment or text or teleport root nodes.`\n          );\n        }\n        if (eventAttrs.length) {\n          warn$1(\n            `Extraneous non-emits event listeners (${eventAttrs.join(\", \")}) were passed to component but could not be automatically inherited because component renders fragment or text root nodes. If the listener is intended to be a component custom event listener only, declare it using the \"emits\" option.`\n          );\n        }\n      }\n    }\n  }\n  if (vnode.dirs) {\n    if (!!(process.env.NODE_ENV !== \"production\") && !isElementRoot(root)) {\n      warn$1(\n        `Runtime directive used on component with non-element root node. The directives will not function as intended.`\n      );\n    }\n    root = cloneVNode(root, null, false, true);\n    root.dirs = root.dirs ? root.dirs.concat(vnode.dirs) : vnode.dirs;\n  }\n  if (vnode.transition) {\n    if (!!(process.env.NODE_ENV !== \"production\") && !isElementRoot(root)) {\n      warn$1(\n        `Component inside <Transition> renders non-element root node that cannot be animated.`\n      );\n    }\n    setTransitionHooks(root, vnode.transition);\n  }\n  if (!!(process.env.NODE_ENV !== \"production\") && setRoot) {\n    setRoot(root);\n  } else {\n    result = root;\n  }\n  setCurrentRenderingInstance(prev);\n  return result;\n}\nconst getChildRoot = (vnode) => {\n  const rawChildren = vnode.children;\n  const dynamicChildren = vnode.dynamicChildren;\n  const childRoot = filterSingleRoot(rawChildren, false);\n  if (!childRoot) {\n    return [vnode, void 0];\n  } else if (!!(process.env.NODE_ENV !== \"production\") && childRoot.patchFlag > 0 && childRoot.patchFlag & 2048) {\n    return getChildRoot(childRoot);\n  }\n  const index = rawChildren.indexOf(childRoot);\n  const dynamicIndex = dynamicChildren ? dynamicChildren.indexOf(childRoot) : -1;\n  const setRoot = (updatedRoot) => {\n    rawChildren[index] = updatedRoot;\n    if (dynamicChildren) {\n      if (dynamicIndex > -1) {\n        dynamicChildren[dynamicIndex] = updatedRoot;\n      } else if (updatedRoot.patchFlag > 0) {\n        vnode.dynamicChildren = [...dynamicChildren, updatedRoot];\n      }\n    }\n  };\n  return [normalizeVNode(childRoot), setRoot];\n};\nfunction filterSingleRoot(children, recurse = true) {\n  let singleRoot;\n  for (let i = 0; i < children.length; i++) {\n    const child = children[i];\n    if (isVNode(child)) {\n      if (child.type !== Comment || child.children === \"v-if\") {\n        if (singleRoot) {\n          return;\n        } else {\n          singleRoot = child;\n          if (!!(process.env.NODE_ENV !== \"production\") && recurse && singleRoot.patchFlag > 0 && singleRoot.patchFlag & 2048) {\n            return filterSingleRoot(singleRoot.children);\n          }\n        }\n      }\n    } else {\n      return;\n    }\n  }\n  return singleRoot;\n}\nconst getFunctionalFallthrough = (attrs) => {\n  let res;\n  for (const key in attrs) {\n    if (key === \"class\" || key === \"style\" || isOn(key)) {\n      (res || (res = {}))[key] = attrs[key];\n    }\n  }\n  return res;\n};\nconst filterModelListeners = (attrs, props) => {\n  const res = {};\n  for (const key in attrs) {\n    if (!isModelListener(key) || !(key.slice(9) in props)) {\n      res[key] = attrs[key];\n    }\n  }\n  return res;\n};\nconst isElementRoot = (vnode) => {\n  return vnode.shapeFlag & (6 | 1) || vnode.type === Comment;\n};\nfunction shouldUpdateComponent(prevVNode, nextVNode, optimized) {\n  const { props: prevProps, children: prevChildren, component } = prevVNode;\n  const { props: nextProps, children: nextChildren, patchFlag } = nextVNode;\n  const emits = component.emitsOptions;\n  if (!!(process.env.NODE_ENV !== \"production\") && (prevChildren || nextChildren) && isHmrUpdating) {\n    return true;\n  }\n  if (nextVNode.dirs || nextVNode.transition) {\n    return true;\n  }\n  if (optimized && patchFlag >= 0) {\n    if (patchFlag & 1024) {\n      return true;\n    }\n    if (patchFlag & 16) {\n      if (!prevProps) {\n        return !!nextProps;\n      }\n      return hasPropsChanged(prevProps, nextProps, emits);\n    } else if (patchFlag & 8) {\n      const dynamicProps = nextVNode.dynamicProps;\n      for (let i = 0; i < dynamicProps.length; i++) {\n        const key = dynamicProps[i];\n        if (nextProps[key] !== prevProps[key] && !isEmitListener(emits, key)) {\n          return true;\n        }\n      }\n    }\n  } else {\n    if (prevChildren || nextChildren) {\n      if (!nextChildren || !nextChildren.$stable) {\n        return true;\n      }\n    }\n    if (prevProps === nextProps) {\n      return false;\n    }\n    if (!prevProps) {\n      return !!nextProps;\n    }\n    if (!nextProps) {\n      return true;\n    }\n    return hasPropsChanged(prevProps, nextProps, emits);\n  }\n  return false;\n}\nfunction hasPropsChanged(prevProps, nextProps, emitsOptions) {\n  const nextKeys = Object.keys(nextProps);\n  if (nextKeys.length !== Object.keys(prevProps).length) {\n    return true;\n  }\n  for (let i = 0; i < nextKeys.length; i++) {\n    const key = nextKeys[i];\n    if (nextProps[key] !== prevProps[key] && !isEmitListener(emitsOptions, key)) {\n      return true;\n    }\n  }\n  return false;\n}\nfunction updateHOCHostEl({ vnode, parent }, el) {\n  while (parent) {\n    const root = parent.subTree;\n    if (root.suspense && root.suspense.activeBranch === vnode) {\n      root.el = vnode.el;\n    }\n    if (root === vnode) {\n      (vnode = parent.vnode).el = el;\n      parent = parent.parent;\n    } else {\n      break;\n    }\n  }\n}\n\nconst isSuspense = (type) => type.__isSuspense;\nlet suspenseId = 0;\nconst SuspenseImpl = {\n  name: \"Suspense\",\n  // In order to make Suspense tree-shakable, we need to avoid importing it\n  // directly in the renderer. The renderer checks for the __isSuspense flag\n  // on a vnode's type and calls the `process` method, passing in renderer\n  // internals.\n  __isSuspense: true,\n  process(n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, rendererInternals) {\n    if (n1 == null) {\n      mountSuspense(\n        n2,\n        container,\n        anchor,\n        parentComponent,\n        parentSuspense,\n        namespace,\n        slotScopeIds,\n        optimized,\n        rendererInternals\n      );\n    } else {\n      if (parentSuspense && parentSuspense.deps > 0 && !n1.suspense.isInFallback) {\n        n2.suspense = n1.suspense;\n        n2.suspense.vnode = n2;\n        n2.el = n1.el;\n        return;\n      }\n      patchSuspense(\n        n1,\n        n2,\n        container,\n        anchor,\n        parentComponent,\n        namespace,\n        slotScopeIds,\n        optimized,\n        rendererInternals\n      );\n    }\n  },\n  hydrate: hydrateSuspense,\n  normalize: normalizeSuspenseChildren\n};\nconst Suspense = SuspenseImpl ;\nfunction triggerEvent(vnode, name) {\n  const eventListener = vnode.props && vnode.props[name];\n  if (isFunction(eventListener)) {\n    eventListener();\n  }\n}\nfunction mountSuspense(vnode, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, rendererInternals) {\n  const {\n    p: patch,\n    o: { createElement }\n  } = rendererInternals;\n  const hiddenContainer = createElement(\"div\");\n  const suspense = vnode.suspense = createSuspenseBoundary(\n    vnode,\n    parentSuspense,\n    parentComponent,\n    container,\n    hiddenContainer,\n    anchor,\n    namespace,\n    slotScopeIds,\n    optimized,\n    rendererInternals\n  );\n  patch(\n    null,\n    suspense.pendingBranch = vnode.ssContent,\n    hiddenContainer,\n    null,\n    parentComponent,\n    suspense,\n    namespace,\n    slotScopeIds\n  );\n  if (suspense.deps > 0) {\n    triggerEvent(vnode, \"onPending\");\n    triggerEvent(vnode, \"onFallback\");\n    patch(\n      null,\n      vnode.ssFallback,\n      container,\n      anchor,\n      parentComponent,\n      null,\n      // fallback tree will not have suspense context\n      namespace,\n      slotScopeIds\n    );\n    setActiveBranch(suspense, vnode.ssFallback);\n  } else {\n    suspense.resolve(false, true);\n  }\n}\nfunction patchSuspense(n1, n2, container, anchor, parentComponent, namespace, slotScopeIds, optimized, { p: patch, um: unmount, o: { createElement } }) {\n  const suspense = n2.suspense = n1.suspense;\n  suspense.vnode = n2;\n  n2.el = n1.el;\n  const newBranch = n2.ssContent;\n  const newFallback = n2.ssFallback;\n  const { activeBranch, pendingBranch, isInFallback, isHydrating } = suspense;\n  if (pendingBranch) {\n    suspense.pendingBranch = newBranch;\n    if (isSameVNodeType(newBranch, pendingBranch)) {\n      patch(\n        pendingBranch,\n        newBranch,\n        suspense.hiddenContainer,\n        null,\n        parentComponent,\n        suspense,\n        namespace,\n        slotScopeIds,\n        optimized\n      );\n      if (suspense.deps <= 0) {\n        suspense.resolve();\n      } else if (isInFallback) {\n        if (!isHydrating) {\n          patch(\n            activeBranch,\n            newFallback,\n            container,\n            anchor,\n            parentComponent,\n            null,\n            // fallback tree will not have suspense context\n            namespace,\n            slotScopeIds,\n            optimized\n          );\n          setActiveBranch(suspense, newFallback);\n        }\n      }\n    } else {\n      suspense.pendingId = suspenseId++;\n      if (isHydrating) {\n        suspense.isHydrating = false;\n        suspense.activeBranch = pendingBranch;\n      } else {\n        unmount(pendingBranch, parentComponent, suspense);\n      }\n      suspense.deps = 0;\n      suspense.effects.length = 0;\n      suspense.hiddenContainer = createElement(\"div\");\n      if (isInFallback) {\n        patch(\n          null,\n          newBranch,\n          suspense.hiddenContainer,\n          null,\n          parentComponent,\n          suspense,\n          namespace,\n          slotScopeIds,\n          optimized\n        );\n        if (suspense.deps <= 0) {\n          suspense.resolve();\n        } else {\n          patch(\n            activeBranch,\n            newFallback,\n            container,\n            anchor,\n            parentComponent,\n            null,\n            // fallback tree will not have suspense context\n            namespace,\n            slotScopeIds,\n            optimized\n          );\n          setActiveBranch(suspense, newFallback);\n        }\n      } else if (activeBranch && isSameVNodeType(newBranch, activeBranch)) {\n        patch(\n          activeBranch,\n          newBranch,\n          container,\n          anchor,\n          parentComponent,\n          suspense,\n          namespace,\n          slotScopeIds,\n          optimized\n        );\n        suspense.resolve(true);\n      } else {\n        patch(\n          null,\n          newBranch,\n          suspense.hiddenContainer,\n          null,\n          parentComponent,\n          suspense,\n          namespace,\n          slotScopeIds,\n          optimized\n        );\n        if (suspense.deps <= 0) {\n          suspense.resolve();\n        }\n      }\n    }\n  } else {\n    if (activeBranch && isSameVNodeType(newBranch, activeBranch)) {\n      patch(\n        activeBranch,\n        newBranch,\n        container,\n        anchor,\n        parentComponent,\n        suspense,\n        namespace,\n        slotScopeIds,\n        optimized\n      );\n      setActiveBranch(suspense, newBranch);\n    } else {\n      triggerEvent(n2, \"onPending\");\n      suspense.pendingBranch = newBranch;\n      if (newBranch.shapeFlag & 512) {\n        suspense.pendingId = newBranch.component.suspenseId;\n      } else {\n        suspense.pendingId = suspenseId++;\n      }\n      patch(\n        null,\n        newBranch,\n        suspense.hiddenContainer,\n        null,\n        parentComponent,\n        suspense,\n        namespace,\n        slotScopeIds,\n        optimized\n      );\n      if (suspense.deps <= 0) {\n        suspense.resolve();\n      } else {\n        const { timeout, pendingId } = suspense;\n        if (timeout > 0) {\n          setTimeout(() => {\n            if (suspense.pendingId === pendingId) {\n              suspense.fallback(newFallback);\n            }\n          }, timeout);\n        } else if (timeout === 0) {\n          suspense.fallback(newFallback);\n        }\n      }\n    }\n  }\n}\nlet hasWarned = false;\nfunction createSuspenseBoundary(vnode, parentSuspense, parentComponent, container, hiddenContainer, anchor, namespace, slotScopeIds, optimized, rendererInternals, isHydrating = false) {\n  if (!!(process.env.NODE_ENV !== \"production\") && true && !hasWarned) {\n    hasWarned = true;\n    console[console.info ? \"info\" : \"log\"](\n      `<Suspense> is an experimental feature and its API will likely change.`\n    );\n  }\n  const {\n    p: patch,\n    m: move,\n    um: unmount,\n    n: next,\n    o: { parentNode, remove }\n  } = rendererInternals;\n  let parentSuspenseId;\n  const isSuspensible = isVNodeSuspensible(vnode);\n  if (isSuspensible) {\n    if (parentSuspense && parentSuspense.pendingBranch) {\n      parentSuspenseId = parentSuspense.pendingId;\n      parentSuspense.deps++;\n    }\n  }\n  const timeout = vnode.props ? toNumber(vnode.props.timeout) : void 0;\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    assertNumber(timeout, `Suspense timeout`);\n  }\n  const initialAnchor = anchor;\n  const suspense = {\n    vnode,\n    parent: parentSuspense,\n    parentComponent,\n    namespace,\n    container,\n    hiddenContainer,\n    deps: 0,\n    pendingId: suspenseId++,\n    timeout: typeof timeout === \"number\" ? timeout : -1,\n    activeBranch: null,\n    pendingBranch: null,\n    isInFallback: !isHydrating,\n    isHydrating,\n    isUnmounted: false,\n    effects: [],\n    resolve(resume = false, sync = false) {\n      if (!!(process.env.NODE_ENV !== \"production\")) {\n        if (!resume && !suspense.pendingBranch) {\n          throw new Error(\n            `suspense.resolve() is called without a pending branch.`\n          );\n        }\n        if (suspense.isUnmounted) {\n          throw new Error(\n            `suspense.resolve() is called on an already unmounted suspense boundary.`\n          );\n        }\n      }\n      const {\n        vnode: vnode2,\n        activeBranch,\n        pendingBranch,\n        pendingId,\n        effects,\n        parentComponent: parentComponent2,\n        container: container2\n      } = suspense;\n      let delayEnter = false;\n      if (suspense.isHydrating) {\n        suspense.isHydrating = false;\n      } else if (!resume) {\n        delayEnter = activeBranch && pendingBranch.transition && pendingBranch.transition.mode === \"out-in\";\n        if (delayEnter) {\n          activeBranch.transition.afterLeave = () => {\n            if (pendingId === suspense.pendingId) {\n              move(\n                pendingBranch,\n                container2,\n                anchor === initialAnchor ? next(activeBranch) : anchor,\n                0\n              );\n              queuePostFlushCb(effects);\n            }\n          };\n        }\n        if (activeBranch) {\n          if (parentNode(activeBranch.el) === container2) {\n            anchor = next(activeBranch);\n          }\n          unmount(activeBranch, parentComponent2, suspense, true);\n        }\n        if (!delayEnter) {\n          move(pendingBranch, container2, anchor, 0);\n        }\n      }\n      setActiveBranch(suspense, pendingBranch);\n      suspense.pendingBranch = null;\n      suspense.isInFallback = false;\n      let parent = suspense.parent;\n      let hasUnresolvedAncestor = false;\n      while (parent) {\n        if (parent.pendingBranch) {\n          parent.effects.push(...effects);\n          hasUnresolvedAncestor = true;\n          break;\n        }\n        parent = parent.parent;\n      }\n      if (!hasUnresolvedAncestor && !delayEnter) {\n        queuePostFlushCb(effects);\n      }\n      suspense.effects = [];\n      if (isSuspensible) {\n        if (parentSuspense && parentSuspense.pendingBranch && parentSuspenseId === parentSuspense.pendingId) {\n          parentSuspense.deps--;\n          if (parentSuspense.deps === 0 && !sync) {\n            parentSuspense.resolve();\n          }\n        }\n      }\n      triggerEvent(vnode2, \"onResolve\");\n    },\n    fallback(fallbackVNode) {\n      if (!suspense.pendingBranch) {\n        return;\n      }\n      const { vnode: vnode2, activeBranch, parentComponent: parentComponent2, container: container2, namespace: namespace2 } = suspense;\n      triggerEvent(vnode2, \"onFallback\");\n      const anchor2 = next(activeBranch);\n      const mountFallback = () => {\n        if (!suspense.isInFallback) {\n          return;\n        }\n        patch(\n          null,\n          fallbackVNode,\n          container2,\n          anchor2,\n          parentComponent2,\n          null,\n          // fallback tree will not have suspense context\n          namespace2,\n          slotScopeIds,\n          optimized\n        );\n        setActiveBranch(suspense, fallbackVNode);\n      };\n      const delayEnter = fallbackVNode.transition && fallbackVNode.transition.mode === \"out-in\";\n      if (delayEnter) {\n        activeBranch.transition.afterLeave = mountFallback;\n      }\n      suspense.isInFallback = true;\n      unmount(\n        activeBranch,\n        parentComponent2,\n        null,\n        // no suspense so unmount hooks fire now\n        true\n        // shouldRemove\n      );\n      if (!delayEnter) {\n        mountFallback();\n      }\n    },\n    move(container2, anchor2, type) {\n      suspense.activeBranch && move(suspense.activeBranch, container2, anchor2, type);\n      suspense.container = container2;\n    },\n    next() {\n      return suspense.activeBranch && next(suspense.activeBranch);\n    },\n    registerDep(instance, setupRenderEffect, optimized2) {\n      const isInPendingSuspense = !!suspense.pendingBranch;\n      if (isInPendingSuspense) {\n        suspense.deps++;\n      }\n      const hydratedEl = instance.vnode.el;\n      instance.asyncDep.catch((err) => {\n        handleError(err, instance, 0);\n      }).then((asyncSetupResult) => {\n        if (instance.isUnmounted || suspense.isUnmounted || suspense.pendingId !== instance.suspenseId) {\n          return;\n        }\n        instance.asyncResolved = true;\n        const { vnode: vnode2 } = instance;\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          pushWarningContext(vnode2);\n        }\n        handleSetupResult(instance, asyncSetupResult, false);\n        if (hydratedEl) {\n          vnode2.el = hydratedEl;\n        }\n        const placeholder = !hydratedEl && instance.subTree.el;\n        setupRenderEffect(\n          instance,\n          vnode2,\n          // component may have been moved before resolve.\n          // if this is not a hydration, instance.subTree will be the comment\n          // placeholder.\n          parentNode(hydratedEl || instance.subTree.el),\n          // anchor will not be used if this is hydration, so only need to\n          // consider the comment placeholder case.\n          hydratedEl ? null : next(instance.subTree),\n          suspense,\n          namespace,\n          optimized2\n        );\n        if (placeholder) {\n          remove(placeholder);\n        }\n        updateHOCHostEl(instance, vnode2.el);\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          popWarningContext();\n        }\n        if (isInPendingSuspense && --suspense.deps === 0) {\n          suspense.resolve();\n        }\n      });\n    },\n    unmount(parentSuspense2, doRemove) {\n      suspense.isUnmounted = true;\n      if (suspense.activeBranch) {\n        unmount(\n          suspense.activeBranch,\n          parentComponent,\n          parentSuspense2,\n          doRemove\n        );\n      }\n      if (suspense.pendingBranch) {\n        unmount(\n          suspense.pendingBranch,\n          parentComponent,\n          parentSuspense2,\n          doRemove\n        );\n      }\n    }\n  };\n  return suspense;\n}\nfunction hydrateSuspense(node, vnode, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, rendererInternals, hydrateNode) {\n  const suspense = vnode.suspense = createSuspenseBoundary(\n    vnode,\n    parentSuspense,\n    parentComponent,\n    node.parentNode,\n    // eslint-disable-next-line no-restricted-globals\n    document.createElement(\"div\"),\n    null,\n    namespace,\n    slotScopeIds,\n    optimized,\n    rendererInternals,\n    true\n  );\n  const result = hydrateNode(\n    node,\n    suspense.pendingBranch = vnode.ssContent,\n    parentComponent,\n    suspense,\n    slotScopeIds,\n    optimized\n  );\n  if (suspense.deps === 0) {\n    suspense.resolve(false, true);\n  }\n  return result;\n}\nfunction normalizeSuspenseChildren(vnode) {\n  const { shapeFlag, children } = vnode;\n  const isSlotChildren = shapeFlag & 32;\n  vnode.ssContent = normalizeSuspenseSlot(\n    isSlotChildren ? children.default : children\n  );\n  vnode.ssFallback = isSlotChildren ? normalizeSuspenseSlot(children.fallback) : createVNode(Comment);\n}\nfunction normalizeSuspenseSlot(s) {\n  let block;\n  if (isFunction(s)) {\n    const trackBlock = isBlockTreeEnabled && s._c;\n    if (trackBlock) {\n      s._d = false;\n      openBlock();\n    }\n    s = s();\n    if (trackBlock) {\n      s._d = true;\n      block = currentBlock;\n      closeBlock();\n    }\n  }\n  if (isArray(s)) {\n    const singleChild = filterSingleRoot(s);\n    if (!!(process.env.NODE_ENV !== \"production\") && !singleChild && s.filter((child) => child !== NULL_DYNAMIC_COMPONENT).length > 0) {\n      warn$1(`<Suspense> slots expect a single root node.`);\n    }\n    s = singleChild;\n  }\n  s = normalizeVNode(s);\n  if (block && !s.dynamicChildren) {\n    s.dynamicChildren = block.filter((c) => c !== s);\n  }\n  return s;\n}\nfunction queueEffectWithSuspense(fn, suspense) {\n  if (suspense && suspense.pendingBranch) {\n    if (isArray(fn)) {\n      suspense.effects.push(...fn);\n    } else {\n      suspense.effects.push(fn);\n    }\n  } else {\n    queuePostFlushCb(fn);\n  }\n}\nfunction setActiveBranch(suspense, branch) {\n  suspense.activeBranch = branch;\n  const { vnode, parentComponent } = suspense;\n  let el = branch.el;\n  while (!el && branch.component) {\n    branch = branch.component.subTree;\n    el = branch.el;\n  }\n  vnode.el = el;\n  if (parentComponent && parentComponent.subTree === vnode) {\n    parentComponent.vnode.el = el;\n    updateHOCHostEl(parentComponent, el);\n  }\n}\nfunction isVNodeSuspensible(vnode) {\n  const suspensible = vnode.props && vnode.props.suspensible;\n  return suspensible != null && suspensible !== false;\n}\n\nconst Fragment = Symbol.for(\"v-fgt\");\nconst Text = Symbol.for(\"v-txt\");\nconst Comment = Symbol.for(\"v-cmt\");\nconst Static = Symbol.for(\"v-stc\");\nconst blockStack = [];\nlet currentBlock = null;\nfunction openBlock(disableTracking = false) {\n  blockStack.push(currentBlock = disableTracking ? null : []);\n}\nfunction closeBlock() {\n  blockStack.pop();\n  currentBlock = blockStack[blockStack.length - 1] || null;\n}\nlet isBlockTreeEnabled = 1;\nfunction setBlockTracking(value, inVOnce = false) {\n  isBlockTreeEnabled += value;\n  if (value < 0 && currentBlock && inVOnce) {\n    currentBlock.hasOnce = true;\n  }\n}\nfunction setupBlock(vnode) {\n  vnode.dynamicChildren = isBlockTreeEnabled > 0 ? currentBlock || EMPTY_ARR : null;\n  closeBlock();\n  if (isBlockTreeEnabled > 0 && currentBlock) {\n    currentBlock.push(vnode);\n  }\n  return vnode;\n}\nfunction createElementBlock(type, props, children, patchFlag, dynamicProps, shapeFlag) {\n  return setupBlock(\n    createBaseVNode(\n      type,\n      props,\n      children,\n      patchFlag,\n      dynamicProps,\n      shapeFlag,\n      true\n    )\n  );\n}\nfunction createBlock(type, props, children, patchFlag, dynamicProps) {\n  return setupBlock(\n    createVNode(\n      type,\n      props,\n      children,\n      patchFlag,\n      dynamicProps,\n      true\n    )\n  );\n}\nfunction isVNode(value) {\n  return value ? value.__v_isVNode === true : false;\n}\nfunction isSameVNodeType(n1, n2) {\n  if (!!(process.env.NODE_ENV !== \"production\") && n2.shapeFlag & 6 && n1.component) {\n    const dirtyInstances = hmrDirtyComponents.get(n2.type);\n    if (dirtyInstances && dirtyInstances.has(n1.component)) {\n      n1.shapeFlag &= -257;\n      n2.shapeFlag &= -513;\n      return false;\n    }\n  }\n  return n1.type === n2.type && n1.key === n2.key;\n}\nlet vnodeArgsTransformer;\nfunction transformVNodeArgs(transformer) {\n  vnodeArgsTransformer = transformer;\n}\nconst createVNodeWithArgsTransform = (...args) => {\n  return _createVNode(\n    ...vnodeArgsTransformer ? vnodeArgsTransformer(args, currentRenderingInstance) : args\n  );\n};\nconst normalizeKey = ({ key }) => key != null ? key : null;\nconst normalizeRef = ({\n  ref,\n  ref_key,\n  ref_for\n}) => {\n  if (typeof ref === \"number\") {\n    ref = \"\" + ref;\n  }\n  return ref != null ? isString(ref) || isRef(ref) || isFunction(ref) ? { i: currentRenderingInstance, r: ref, k: ref_key, f: !!ref_for } : ref : null;\n};\nfunction createBaseVNode(type, props = null, children = null, patchFlag = 0, dynamicProps = null, shapeFlag = type === Fragment ? 0 : 1, isBlockNode = false, needFullChildrenNormalization = false) {\n  const vnode = {\n    __v_isVNode: true,\n    __v_skip: true,\n    type,\n    props,\n    key: props && normalizeKey(props),\n    ref: props && normalizeRef(props),\n    scopeId: currentScopeId,\n    slotScopeIds: null,\n    children,\n    component: null,\n    suspense: null,\n    ssContent: null,\n    ssFallback: null,\n    dirs: null,\n    transition: null,\n    el: null,\n    anchor: null,\n    target: null,\n    targetStart: null,\n    targetAnchor: null,\n    staticCount: 0,\n    shapeFlag,\n    patchFlag,\n    dynamicProps,\n    dynamicChildren: null,\n    appContext: null,\n    ctx: currentRenderingInstance\n  };\n  if (needFullChildrenNormalization) {\n    normalizeChildren(vnode, children);\n    if (shapeFlag & 128) {\n      type.normalize(vnode);\n    }\n  } else if (children) {\n    vnode.shapeFlag |= isString(children) ? 8 : 16;\n  }\n  if (!!(process.env.NODE_ENV !== \"production\") && vnode.key !== vnode.key) {\n    warn$1(`VNode created with invalid key (NaN). VNode type:`, vnode.type);\n  }\n  if (isBlockTreeEnabled > 0 && // avoid a block node from tracking itself\n  !isBlockNode && // has current parent block\n  currentBlock && // presence of a patch flag indicates this node needs patching on updates.\n  // component nodes also should always be patched, because even if the\n  // component doesn't need to update, it needs to persist the instance on to\n  // the next vnode so that it can be properly unmounted later.\n  (vnode.patchFlag > 0 || shapeFlag & 6) && // the EVENTS flag is only for hydration and if it is the only flag, the\n  // vnode should not be considered dynamic due to handler caching.\n  vnode.patchFlag !== 32) {\n    currentBlock.push(vnode);\n  }\n  return vnode;\n}\nconst createVNode = !!(process.env.NODE_ENV !== \"production\") ? createVNodeWithArgsTransform : _createVNode;\nfunction _createVNode(type, props = null, children = null, patchFlag = 0, dynamicProps = null, isBlockNode = false) {\n  if (!type || type === NULL_DYNAMIC_COMPONENT) {\n    if (!!(process.env.NODE_ENV !== \"production\") && !type) {\n      warn$1(`Invalid vnode type when creating vnode: ${type}.`);\n    }\n    type = Comment;\n  }\n  if (isVNode(type)) {\n    const cloned = cloneVNode(\n      type,\n      props,\n      true\n      /* mergeRef: true */\n    );\n    if (children) {\n      normalizeChildren(cloned, children);\n    }\n    if (isBlockTreeEnabled > 0 && !isBlockNode && currentBlock) {\n      if (cloned.shapeFlag & 6) {\n        currentBlock[currentBlock.indexOf(type)] = cloned;\n      } else {\n        currentBlock.push(cloned);\n      }\n    }\n    cloned.patchFlag = -2;\n    return cloned;\n  }\n  if (isClassComponent(type)) {\n    type = type.__vccOpts;\n  }\n  if (props) {\n    props = guardReactiveProps(props);\n    let { class: klass, style } = props;\n    if (klass && !isString(klass)) {\n      props.class = normalizeClass(klass);\n    }\n    if (isObject(style)) {\n      if (isProxy(style) && !isArray(style)) {\n        style = extend({}, style);\n      }\n      props.style = normalizeStyle(style);\n    }\n  }\n  const shapeFlag = isString(type) ? 1 : isSuspense(type) ? 128 : isTeleport(type) ? 64 : isObject(type) ? 4 : isFunction(type) ? 2 : 0;\n  if (!!(process.env.NODE_ENV !== \"production\") && shapeFlag & 4 && isProxy(type)) {\n    type = toRaw(type);\n    warn$1(\n      `Vue received a Component that was made a reactive object. This can lead to unnecessary performance overhead and should be avoided by marking the component with \\`markRaw\\` or using \\`shallowRef\\` instead of \\`ref\\`.`,\n      `\nComponent that was made reactive: `,\n      type\n    );\n  }\n  return createBaseVNode(\n    type,\n    props,\n    children,\n    patchFlag,\n    dynamicProps,\n    shapeFlag,\n    isBlockNode,\n    true\n  );\n}\nfunction guardReactiveProps(props) {\n  if (!props) return null;\n  return isProxy(props) || isInternalObject(props) ? extend({}, props) : props;\n}\nfunction cloneVNode(vnode, extraProps, mergeRef = false, cloneTransition = false) {\n  const { props, ref, patchFlag, children, transition } = vnode;\n  const mergedProps = extraProps ? mergeProps(props || {}, extraProps) : props;\n  const cloned = {\n    __v_isVNode: true,\n    __v_skip: true,\n    type: vnode.type,\n    props: mergedProps,\n    key: mergedProps && normalizeKey(mergedProps),\n    ref: extraProps && extraProps.ref ? (\n      // #2078 in the case of <component :is=\"vnode\" ref=\"extra\"/>\n      // if the vnode itself already has a ref, cloneVNode will need to merge\n      // the refs so the single vnode can be set on multiple refs\n      mergeRef && ref ? isArray(ref) ? ref.concat(normalizeRef(extraProps)) : [ref, normalizeRef(extraProps)] : normalizeRef(extraProps)\n    ) : ref,\n    scopeId: vnode.scopeId,\n    slotScopeIds: vnode.slotScopeIds,\n    children: !!(process.env.NODE_ENV !== \"production\") && patchFlag === -1 && isArray(children) ? children.map(deepCloneVNode) : children,\n    target: vnode.target,\n    targetStart: vnode.targetStart,\n    targetAnchor: vnode.targetAnchor,\n    staticCount: vnode.staticCount,\n    shapeFlag: vnode.shapeFlag,\n    // if the vnode is cloned with extra props, we can no longer assume its\n    // existing patch flag to be reliable and need to add the FULL_PROPS flag.\n    // note: preserve flag for fragments since they use the flag for children\n    // fast paths only.\n    patchFlag: extraProps && vnode.type !== Fragment ? patchFlag === -1 ? 16 : patchFlag | 16 : patchFlag,\n    dynamicProps: vnode.dynamicProps,\n    dynamicChildren: vnode.dynamicChildren,\n    appContext: vnode.appContext,\n    dirs: vnode.dirs,\n    transition,\n    // These should technically only be non-null on mounted VNodes. However,\n    // they *should* be copied for kept-alive vnodes. So we just always copy\n    // them since them being non-null during a mount doesn't affect the logic as\n    // they will simply be overwritten.\n    component: vnode.component,\n    suspense: vnode.suspense,\n    ssContent: vnode.ssContent && cloneVNode(vnode.ssContent),\n    ssFallback: vnode.ssFallback && cloneVNode(vnode.ssFallback),\n    placeholder: vnode.placeholder,\n    el: vnode.el,\n    anchor: vnode.anchor,\n    ctx: vnode.ctx,\n    ce: vnode.ce\n  };\n  if (transition && cloneTransition) {\n    setTransitionHooks(\n      cloned,\n      transition.clone(cloned)\n    );\n  }\n  return cloned;\n}\nfunction deepCloneVNode(vnode) {\n  const cloned = cloneVNode(vnode);\n  if (isArray(vnode.children)) {\n    cloned.children = vnode.children.map(deepCloneVNode);\n  }\n  return cloned;\n}\nfunction createTextVNode(text = \" \", flag = 0) {\n  return createVNode(Text, null, text, flag);\n}\nfunction createStaticVNode(content, numberOfNodes) {\n  const vnode = createVNode(Static, null, content);\n  vnode.staticCount = numberOfNodes;\n  return vnode;\n}\nfunction createCommentVNode(text = \"\", asBlock = false) {\n  return asBlock ? (openBlock(), createBlock(Comment, null, text)) : createVNode(Comment, null, text);\n}\nfunction normalizeVNode(child) {\n  if (child == null || typeof child === \"boolean\") {\n    return createVNode(Comment);\n  } else if (isArray(child)) {\n    return createVNode(\n      Fragment,\n      null,\n      // #3666, avoid reference pollution when reusing vnode\n      child.slice()\n    );\n  } else if (isVNode(child)) {\n    return cloneIfMounted(child);\n  } else {\n    return createVNode(Text, null, String(child));\n  }\n}\nfunction cloneIfMounted(child) {\n  return child.el === null && child.patchFlag !== -1 || child.memo ? child : cloneVNode(child);\n}\nfunction normalizeChildren(vnode, children) {\n  let type = 0;\n  const { shapeFlag } = vnode;\n  if (children == null) {\n    children = null;\n  } else if (isArray(children)) {\n    type = 16;\n  } else if (typeof children === \"object\") {\n    if (shapeFlag & (1 | 64)) {\n      const slot = children.default;\n      if (slot) {\n        slot._c && (slot._d = false);\n        normalizeChildren(vnode, slot());\n        slot._c && (slot._d = true);\n      }\n      return;\n    } else {\n      type = 32;\n      const slotFlag = children._;\n      if (!slotFlag && !isInternalObject(children)) {\n        children._ctx = currentRenderingInstance;\n      } else if (slotFlag === 3 && currentRenderingInstance) {\n        if (currentRenderingInstance.slots._ === 1) {\n          children._ = 1;\n        } else {\n          children._ = 2;\n          vnode.patchFlag |= 1024;\n        }\n      }\n    }\n  } else if (isFunction(children)) {\n    children = { default: children, _ctx: currentRenderingInstance };\n    type = 32;\n  } else {\n    children = String(children);\n    if (shapeFlag & 64) {\n      type = 16;\n      children = [createTextVNode(children)];\n    } else {\n      type = 8;\n    }\n  }\n  vnode.children = children;\n  vnode.shapeFlag |= type;\n}\nfunction mergeProps(...args) {\n  const ret = {};\n  for (let i = 0; i < args.length; i++) {\n    const toMerge = args[i];\n    for (const key in toMerge) {\n      if (key === \"class\") {\n        if (ret.class !== toMerge.class) {\n          ret.class = normalizeClass([ret.class, toMerge.class]);\n        }\n      } else if (key === \"style\") {\n        ret.style = normalizeStyle([ret.style, toMerge.style]);\n      } else if (isOn(key)) {\n        const existing = ret[key];\n        const incoming = toMerge[key];\n        if (incoming && existing !== incoming && !(isArray(existing) && existing.includes(incoming))) {\n          ret[key] = existing ? [].concat(existing, incoming) : incoming;\n        }\n      } else if (key !== \"\") {\n        ret[key] = toMerge[key];\n      }\n    }\n  }\n  return ret;\n}\nfunction invokeVNodeHook(hook, instance, vnode, prevVNode = null) {\n  callWithAsyncErrorHandling(hook, instance, 7, [\n    vnode,\n    prevVNode\n  ]);\n}\n\nconst emptyAppContext = createAppContext();\nlet uid = 0;\nfunction createComponentInstance(vnode, parent, suspense) {\n  const type = vnode.type;\n  const appContext = (parent ? parent.appContext : vnode.appContext) || emptyAppContext;\n  const instance = {\n    uid: uid++,\n    vnode,\n    type,\n    parent,\n    appContext,\n    root: null,\n    // to be immediately set\n    next: null,\n    subTree: null,\n    // will be set synchronously right after creation\n    effect: null,\n    update: null,\n    // will be set synchronously right after creation\n    job: null,\n    scope: new EffectScope(\n      true\n      /* detached */\n    ),\n    render: null,\n    proxy: null,\n    exposed: null,\n    exposeProxy: null,\n    withProxy: null,\n    provides: parent ? parent.provides : Object.create(appContext.provides),\n    ids: parent ? parent.ids : [\"\", 0, 0],\n    accessCache: null,\n    renderCache: [],\n    // local resolved assets\n    components: null,\n    directives: null,\n    // resolved props and emits options\n    propsOptions: normalizePropsOptions(type, appContext),\n    emitsOptions: normalizeEmitsOptions(type, appContext),\n    // emit\n    emit: null,\n    // to be set immediately\n    emitted: null,\n    // props default value\n    propsDefaults: EMPTY_OBJ,\n    // inheritAttrs\n    inheritAttrs: type.inheritAttrs,\n    // state\n    ctx: EMPTY_OBJ,\n    data: EMPTY_OBJ,\n    props: EMPTY_OBJ,\n    attrs: EMPTY_OBJ,\n    slots: EMPTY_OBJ,\n    refs: EMPTY_OBJ,\n    setupState: EMPTY_OBJ,\n    setupContext: null,\n    // suspense related\n    suspense,\n    suspenseId: suspense ? suspense.pendingId : 0,\n    asyncDep: null,\n    asyncResolved: false,\n    // lifecycle hooks\n    // not using enums here because it results in computed properties\n    isMounted: false,\n    isUnmounted: false,\n    isDeactivated: false,\n    bc: null,\n    c: null,\n    bm: null,\n    m: null,\n    bu: null,\n    u: null,\n    um: null,\n    bum: null,\n    da: null,\n    a: null,\n    rtg: null,\n    rtc: null,\n    ec: null,\n    sp: null\n  };\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    instance.ctx = createDevRenderContext(instance);\n  } else {\n    instance.ctx = { _: instance };\n  }\n  instance.root = parent ? parent.root : instance;\n  instance.emit = emit.bind(null, instance);\n  if (vnode.ce) {\n    vnode.ce(instance);\n  }\n  return instance;\n}\nlet currentInstance = null;\nconst getCurrentInstance = () => currentInstance || currentRenderingInstance;\nlet internalSetCurrentInstance;\nlet setInSSRSetupState;\n{\n  const g = getGlobalThis();\n  const registerGlobalSetter = (key, setter) => {\n    let setters;\n    if (!(setters = g[key])) setters = g[key] = [];\n    setters.push(setter);\n    return (v) => {\n      if (setters.length > 1) setters.forEach((set) => set(v));\n      else setters[0](v);\n    };\n  };\n  internalSetCurrentInstance = registerGlobalSetter(\n    `__VUE_INSTANCE_SETTERS__`,\n    (v) => currentInstance = v\n  );\n  setInSSRSetupState = registerGlobalSetter(\n    `__VUE_SSR_SETTERS__`,\n    (v) => isInSSRComponentSetup = v\n  );\n}\nconst setCurrentInstance = (instance) => {\n  const prev = currentInstance;\n  internalSetCurrentInstance(instance);\n  instance.scope.on();\n  return () => {\n    instance.scope.off();\n    internalSetCurrentInstance(prev);\n  };\n};\nconst unsetCurrentInstance = () => {\n  currentInstance && currentInstance.scope.off();\n  internalSetCurrentInstance(null);\n};\nconst isBuiltInTag = /* @__PURE__ */ makeMap(\"slot,component\");\nfunction validateComponentName(name, { isNativeTag }) {\n  if (isBuiltInTag(name) || isNativeTag(name)) {\n    warn$1(\n      \"Do not use built-in or reserved HTML elements as component id: \" + name\n    );\n  }\n}\nfunction isStatefulComponent(instance) {\n  return instance.vnode.shapeFlag & 4;\n}\nlet isInSSRComponentSetup = false;\nfunction setupComponent(instance, isSSR = false, optimized = false) {\n  isSSR && setInSSRSetupState(isSSR);\n  const { props, children } = instance.vnode;\n  const isStateful = isStatefulComponent(instance);\n  initProps(instance, props, isStateful, isSSR);\n  initSlots(instance, children, optimized || isSSR);\n  const setupResult = isStateful ? setupStatefulComponent(instance, isSSR) : void 0;\n  isSSR && setInSSRSetupState(false);\n  return setupResult;\n}\nfunction setupStatefulComponent(instance, isSSR) {\n  var _a;\n  const Component = instance.type;\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    if (Component.name) {\n      validateComponentName(Component.name, instance.appContext.config);\n    }\n    if (Component.components) {\n      const names = Object.keys(Component.components);\n      for (let i = 0; i < names.length; i++) {\n        validateComponentName(names[i], instance.appContext.config);\n      }\n    }\n    if (Component.directives) {\n      const names = Object.keys(Component.directives);\n      for (let i = 0; i < names.length; i++) {\n        validateDirectiveName(names[i]);\n      }\n    }\n    if (Component.compilerOptions && isRuntimeOnly()) {\n      warn$1(\n        `\"compilerOptions\" is only supported when using a build of Vue that includes the runtime compiler. Since you are using a runtime-only build, the options should be passed via your build tool config instead.`\n      );\n    }\n  }\n  instance.accessCache = /* @__PURE__ */ Object.create(null);\n  instance.proxy = new Proxy(instance.ctx, PublicInstanceProxyHandlers);\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    exposePropsOnRenderContext(instance);\n  }\n  const { setup } = Component;\n  if (setup) {\n    pauseTracking();\n    const setupContext = instance.setupContext = setup.length > 1 ? createSetupContext(instance) : null;\n    const reset = setCurrentInstance(instance);\n    const setupResult = callWithErrorHandling(\n      setup,\n      instance,\n      0,\n      [\n        !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(instance.props) : instance.props,\n        setupContext\n      ]\n    );\n    const isAsyncSetup = isPromise(setupResult);\n    resetTracking();\n    reset();\n    if ((isAsyncSetup || instance.sp) && !isAsyncWrapper(instance)) {\n      markAsyncBoundary(instance);\n    }\n    if (isAsyncSetup) {\n      setupResult.then(unsetCurrentInstance, unsetCurrentInstance);\n      if (isSSR) {\n        return setupResult.then((resolvedResult) => {\n          handleSetupResult(instance, resolvedResult, isSSR);\n        }).catch((e) => {\n          handleError(e, instance, 0);\n        });\n      } else {\n        instance.asyncDep = setupResult;\n        if (!!(process.env.NODE_ENV !== \"production\") && !instance.suspense) {\n          const name = (_a = Component.name) != null ? _a : \"Anonymous\";\n          warn$1(\n            `Component <${name}>: setup function returned a promise, but no <Suspense> boundary was found in the parent component tree. A component with async setup() must be nested in a <Suspense> in order to be rendered.`\n          );\n        }\n      }\n    } else {\n      handleSetupResult(instance, setupResult, isSSR);\n    }\n  } else {\n    finishComponentSetup(instance, isSSR);\n  }\n}\nfunction handleSetupResult(instance, setupResult, isSSR) {\n  if (isFunction(setupResult)) {\n    if (instance.type.__ssrInlineRender) {\n      instance.ssrRender = setupResult;\n    } else {\n      instance.render = setupResult;\n    }\n  } else if (isObject(setupResult)) {\n    if (!!(process.env.NODE_ENV !== \"production\") && isVNode(setupResult)) {\n      warn$1(\n        `setup() should not return VNodes directly - return a render function instead.`\n      );\n    }\n    if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n      instance.devtoolsRawSetupState = setupResult;\n    }\n    instance.setupState = proxyRefs(setupResult);\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      exposeSetupStateOnRenderContext(instance);\n    }\n  } else if (!!(process.env.NODE_ENV !== \"production\") && setupResult !== void 0) {\n    warn$1(\n      `setup() should return an object. Received: ${setupResult === null ? \"null\" : typeof setupResult}`\n    );\n  }\n  finishComponentSetup(instance, isSSR);\n}\nlet compile;\nlet installWithProxy;\nfunction registerRuntimeCompiler(_compile) {\n  compile = _compile;\n  installWithProxy = (i) => {\n    if (i.render._rc) {\n      i.withProxy = new Proxy(i.ctx, RuntimeCompiledPublicInstanceProxyHandlers);\n    }\n  };\n}\nconst isRuntimeOnly = () => !compile;\nfunction finishComponentSetup(instance, isSSR, skipOptions) {\n  const Component = instance.type;\n  if (!instance.render) {\n    if (!isSSR && compile && !Component.render) {\n      const template = Component.template || __VUE_OPTIONS_API__ && resolveMergedOptions(instance).template;\n      if (template) {\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          startMeasure(instance, `compile`);\n        }\n        const { isCustomElement, compilerOptions } = instance.appContext.config;\n        const { delimiters, compilerOptions: componentCompilerOptions } = Component;\n        const finalCompilerOptions = extend(\n          extend(\n            {\n              isCustomElement,\n              delimiters\n            },\n            compilerOptions\n          ),\n          componentCompilerOptions\n        );\n        Component.render = compile(template, finalCompilerOptions);\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          endMeasure(instance, `compile`);\n        }\n      }\n    }\n    instance.render = Component.render || NOOP;\n    if (installWithProxy) {\n      installWithProxy(instance);\n    }\n  }\n  if (__VUE_OPTIONS_API__ && true) {\n    const reset = setCurrentInstance(instance);\n    pauseTracking();\n    try {\n      applyOptions(instance);\n    } finally {\n      resetTracking();\n      reset();\n    }\n  }\n  if (!!(process.env.NODE_ENV !== \"production\") && !Component.render && instance.render === NOOP && !isSSR) {\n    if (!compile && Component.template) {\n      warn$1(\n        `Component provided template option but runtime compilation is not supported in this build of Vue.` + (` Configure your bundler to alias \"vue\" to \"vue/dist/vue.esm-bundler.js\".` )\n      );\n    } else {\n      warn$1(`Component is missing template or render function: `, Component);\n    }\n  }\n}\nconst attrsProxyHandlers = !!(process.env.NODE_ENV !== \"production\") ? {\n  get(target, key) {\n    markAttrsAccessed();\n    track(target, \"get\", \"\");\n    return target[key];\n  },\n  set() {\n    warn$1(`setupContext.attrs is readonly.`);\n    return false;\n  },\n  deleteProperty() {\n    warn$1(`setupContext.attrs is readonly.`);\n    return false;\n  }\n} : {\n  get(target, key) {\n    track(target, \"get\", \"\");\n    return target[key];\n  }\n};\nfunction getSlotsProxy(instance) {\n  return new Proxy(instance.slots, {\n    get(target, key) {\n      track(instance, \"get\", \"$slots\");\n      return target[key];\n    }\n  });\n}\nfunction createSetupContext(instance) {\n  const expose = (exposed) => {\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      if (instance.exposed) {\n        warn$1(`expose() should be called only once per setup().`);\n      }\n      if (exposed != null) {\n        let exposedType = typeof exposed;\n        if (exposedType === \"object\") {\n          if (isArray(exposed)) {\n            exposedType = \"array\";\n          } else if (isRef(exposed)) {\n            exposedType = \"ref\";\n          }\n        }\n        if (exposedType !== \"object\") {\n          warn$1(\n            `expose() should be passed a plain object, received ${exposedType}.`\n          );\n        }\n      }\n    }\n    instance.exposed = exposed || {};\n  };\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    let attrsProxy;\n    let slotsProxy;\n    return Object.freeze({\n      get attrs() {\n        return attrsProxy || (attrsProxy = new Proxy(instance.attrs, attrsProxyHandlers));\n      },\n      get slots() {\n        return slotsProxy || (slotsProxy = getSlotsProxy(instance));\n      },\n      get emit() {\n        return (event, ...args) => instance.emit(event, ...args);\n      },\n      expose\n    });\n  } else {\n    return {\n      attrs: new Proxy(instance.attrs, attrsProxyHandlers),\n      slots: instance.slots,\n      emit: instance.emit,\n      expose\n    };\n  }\n}\nfunction getComponentPublicInstance(instance) {\n  if (instance.exposed) {\n    return instance.exposeProxy || (instance.exposeProxy = new Proxy(proxyRefs(markRaw(instance.exposed)), {\n      get(target, key) {\n        if (key in target) {\n          return target[key];\n        } else if (key in publicPropertiesMap) {\n          return publicPropertiesMap[key](instance);\n        }\n      },\n      has(target, key) {\n        return key in target || key in publicPropertiesMap;\n      }\n    }));\n  } else {\n    return instance.proxy;\n  }\n}\nconst classifyRE = /(?:^|[-_])(\\w)/g;\nconst classify = (str) => str.replace(classifyRE, (c) => c.toUpperCase()).replace(/[-_]/g, \"\");\nfunction getComponentName(Component, includeInferred = true) {\n  return isFunction(Component) ? Component.displayName || Component.name : Component.name || includeInferred && Component.__name;\n}\nfunction formatComponentName(instance, Component, isRoot = false) {\n  let name = getComponentName(Component);\n  if (!name && Component.__file) {\n    const match = Component.__file.match(/([^/\\\\]+)\\.\\w+$/);\n    if (match) {\n      name = match[1];\n    }\n  }\n  if (!name && instance && instance.parent) {\n    const inferFromRegistry = (registry) => {\n      for (const key in registry) {\n        if (registry[key] === Component) {\n          return key;\n        }\n      }\n    };\n    name = inferFromRegistry(\n      instance.components || instance.parent.type.components\n    ) || inferFromRegistry(instance.appContext.components);\n  }\n  return name ? classify(name) : isRoot ? `App` : `Anonymous`;\n}\nfunction isClassComponent(value) {\n  return isFunction(value) && \"__vccOpts\" in value;\n}\n\nconst computed = (getterOrOptions, debugOptions) => {\n  const c = computed$1(getterOrOptions, debugOptions, isInSSRComponentSetup);\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    const i = getCurrentInstance();\n    if (i && i.appContext.config.warnRecursiveComputed) {\n      c._warnRecursive = true;\n    }\n  }\n  return c;\n};\n\nfunction h(type, propsOrChildren, children) {\n  const l = arguments.length;\n  if (l === 2) {\n    if (isObject(propsOrChildren) && !isArray(propsOrChildren)) {\n      if (isVNode(propsOrChildren)) {\n        return createVNode(type, null, [propsOrChildren]);\n      }\n      return createVNode(type, propsOrChildren);\n    } else {\n      return createVNode(type, null, propsOrChildren);\n    }\n  } else {\n    if (l > 3) {\n      children = Array.prototype.slice.call(arguments, 2);\n    } else if (l === 3 && isVNode(children)) {\n      children = [children];\n    }\n    return createVNode(type, propsOrChildren, children);\n  }\n}\n\nfunction initCustomFormatter() {\n  if (!!!(process.env.NODE_ENV !== \"production\") || typeof window === \"undefined\") {\n    return;\n  }\n  const vueStyle = { style: \"color:#3ba776\" };\n  const numberStyle = { style: \"color:#1677ff\" };\n  const stringStyle = { style: \"color:#f5222d\" };\n  const keywordStyle = { style: \"color:#eb2f96\" };\n  const formatter = {\n    __vue_custom_formatter: true,\n    header(obj) {\n      if (!isObject(obj)) {\n        return null;\n      }\n      if (obj.__isVue) {\n        return [\"div\", vueStyle, `VueInstance`];\n      } else if (isRef(obj)) {\n        pauseTracking();\n        const value = obj.value;\n        resetTracking();\n        return [\n          \"div\",\n          {},\n          [\"span\", vueStyle, genRefFlag(obj)],\n          \"<\",\n          formatValue(value),\n          `>`\n        ];\n      } else if (isReactive(obj)) {\n        return [\n          \"div\",\n          {},\n          [\"span\", vueStyle, isShallow(obj) ? \"ShallowReactive\" : \"Reactive\"],\n          \"<\",\n          formatValue(obj),\n          `>${isReadonly(obj) ? ` (readonly)` : ``}`\n        ];\n      } else if (isReadonly(obj)) {\n        return [\n          \"div\",\n          {},\n          [\"span\", vueStyle, isShallow(obj) ? \"ShallowReadonly\" : \"Readonly\"],\n          \"<\",\n          formatValue(obj),\n          \">\"\n        ];\n      }\n      return null;\n    },\n    hasBody(obj) {\n      return obj && obj.__isVue;\n    },\n    body(obj) {\n      if (obj && obj.__isVue) {\n        return [\n          \"div\",\n          {},\n          ...formatInstance(obj.$)\n        ];\n      }\n    }\n  };\n  function formatInstance(instance) {\n    const blocks = [];\n    if (instance.type.props && instance.props) {\n      blocks.push(createInstanceBlock(\"props\", toRaw(instance.props)));\n    }\n    if (instance.setupState !== EMPTY_OBJ) {\n      blocks.push(createInstanceBlock(\"setup\", instance.setupState));\n    }\n    if (instance.data !== EMPTY_OBJ) {\n      blocks.push(createInstanceBlock(\"data\", toRaw(instance.data)));\n    }\n    const computed = extractKeys(instance, \"computed\");\n    if (computed) {\n      blocks.push(createInstanceBlock(\"computed\", computed));\n    }\n    const injected = extractKeys(instance, \"inject\");\n    if (injected) {\n      blocks.push(createInstanceBlock(\"injected\", injected));\n    }\n    blocks.push([\n      \"div\",\n      {},\n      [\n        \"span\",\n        {\n          style: keywordStyle.style + \";opacity:0.66\"\n        },\n        \"$ (internal): \"\n      ],\n      [\"object\", { object: instance }]\n    ]);\n    return blocks;\n  }\n  function createInstanceBlock(type, target) {\n    target = extend({}, target);\n    if (!Object.keys(target).length) {\n      return [\"span\", {}];\n    }\n    return [\n      \"div\",\n      { style: \"line-height:1.25em;margin-bottom:0.6em\" },\n      [\n        \"div\",\n        {\n          style: \"color:#476582\"\n        },\n        type\n      ],\n      [\n        \"div\",\n        {\n          style: \"padding-left:1.25em\"\n        },\n        ...Object.keys(target).map((key) => {\n          return [\n            \"div\",\n            {},\n            [\"span\", keywordStyle, key + \": \"],\n            formatValue(target[key], false)\n          ];\n        })\n      ]\n    ];\n  }\n  function formatValue(v, asRaw = true) {\n    if (typeof v === \"number\") {\n      return [\"span\", numberStyle, v];\n    } else if (typeof v === \"string\") {\n      return [\"span\", stringStyle, JSON.stringify(v)];\n    } else if (typeof v === \"boolean\") {\n      return [\"span\", keywordStyle, v];\n    } else if (isObject(v)) {\n      return [\"object\", { object: asRaw ? toRaw(v) : v }];\n    } else {\n      return [\"span\", stringStyle, String(v)];\n    }\n  }\n  function extractKeys(instance, type) {\n    const Comp = instance.type;\n    if (isFunction(Comp)) {\n      return;\n    }\n    const extracted = {};\n    for (const key in instance.ctx) {\n      if (isKeyOfType(Comp, key, type)) {\n        extracted[key] = instance.ctx[key];\n      }\n    }\n    return extracted;\n  }\n  function isKeyOfType(Comp, key, type) {\n    const opts = Comp[type];\n    if (isArray(opts) && opts.includes(key) || isObject(opts) && key in opts) {\n      return true;\n    }\n    if (Comp.extends && isKeyOfType(Comp.extends, key, type)) {\n      return true;\n    }\n    if (Comp.mixins && Comp.mixins.some((m) => isKeyOfType(m, key, type))) {\n      return true;\n    }\n  }\n  function genRefFlag(v) {\n    if (isShallow(v)) {\n      return `ShallowRef`;\n    }\n    if (v.effect) {\n      return `ComputedRef`;\n    }\n    return `Ref`;\n  }\n  if (window.devtoolsFormatters) {\n    window.devtoolsFormatters.push(formatter);\n  } else {\n    window.devtoolsFormatters = [formatter];\n  }\n}\n\nfunction withMemo(memo, render, cache, index) {\n  const cached = cache[index];\n  if (cached && isMemoSame(cached, memo)) {\n    return cached;\n  }\n  const ret = render();\n  ret.memo = memo.slice();\n  ret.cacheIndex = index;\n  return cache[index] = ret;\n}\nfunction isMemoSame(cached, memo) {\n  const prev = cached.memo;\n  if (prev.length != memo.length) {\n    return false;\n  }\n  for (let i = 0; i < prev.length; i++) {\n    if (hasChanged(prev[i], memo[i])) {\n      return false;\n    }\n  }\n  if (isBlockTreeEnabled > 0 && currentBlock) {\n    currentBlock.push(cached);\n  }\n  return true;\n}\n\nconst version = \"3.5.18\";\nconst warn = !!(process.env.NODE_ENV !== \"production\") ? warn$1 : NOOP;\nconst ErrorTypeStrings = ErrorTypeStrings$1 ;\nconst devtools = !!(process.env.NODE_ENV !== \"production\") || true ? devtools$1 : void 0;\nconst setDevtoolsHook = !!(process.env.NODE_ENV !== \"production\") || true ? setDevtoolsHook$1 : NOOP;\nconst _ssrUtils = {\n  createComponentInstance,\n  setupComponent,\n  renderComponentRoot,\n  setCurrentRenderingInstance,\n  isVNode: isVNode,\n  normalizeVNode,\n  getComponentPublicInstance,\n  ensureValidVNode,\n  pushWarningContext,\n  popWarningContext\n};\nconst ssrUtils = _ssrUtils ;\nconst resolveFilter = null;\nconst compatUtils = null;\nconst DeprecationTypes = null;\n\nexport { BaseTransition, BaseTransitionPropsValidators, Comment, DeprecationTypes, ErrorCodes, ErrorTypeStrings, Fragment, KeepAlive, Static, Suspense, Teleport, Text, assertNumber, callWithAsyncErrorHandling, callWithErrorHandling, cloneVNode, compatUtils, computed, createBlock, createCommentVNode, createElementBlock, createBaseVNode as createElementVNode, createHydrationRenderer, createPropsRestProxy, createRenderer, createSlots, createStaticVNode, createTextVNode, createVNode, defineAsyncComponent, defineComponent, defineEmits, defineExpose, defineModel, defineOptions, defineProps, defineSlots, devtools, getCurrentInstance, getTransitionRawChildren, guardReactiveProps, h, handleError, hasInjectionContext, hydrateOnIdle, hydrateOnInteraction, hydrateOnMediaQuery, hydrateOnVisible, initCustomFormatter, inject, isMemoSame, isRuntimeOnly, isVNode, mergeDefaults, mergeModels, mergeProps, nextTick, onActivated, onBeforeMount, onBeforeUnmount, onBeforeUpdate, onDeactivated, onErrorCaptured, onMounted, onRenderTracked, onRenderTriggered, onServerPrefetch, onUnmounted, onUpdated, openBlock, popScopeId, provide, pushScopeId, queuePostFlushCb, registerRuntimeCompiler, renderList, renderSlot, resolveComponent, resolveDirective, resolveDynamicComponent, resolveFilter, resolveTransitionHooks, setBlockTracking, setDevtoolsHook, setTransitionHooks, ssrContextKey, ssrUtils, toHandlers, transformVNodeArgs, useAttrs, useId, useModel, useSSRContext, useSlots, useTemplateRef, useTransitionState, version, warn, watch, watchEffect, watchPostEffect, watchSyncEffect, withAsyncContext, withCtx, withDefaults, withDirectives, withMemo, withScopeId };\n","/**\n* @vue/runtime-dom v3.5.18\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/\nimport { warn, BaseTransitionPropsValidators, h, BaseTransition, assertNumber, getCurrentInstance, onBeforeUpdate, queuePostFlushCb, onMounted, watch, onUnmounted, Fragment, Static, camelize, callWithAsyncErrorHandling, defineComponent, nextTick, unref, createVNode, useTransitionState, onUpdated, toRaw, getTransitionRawChildren, setTransitionHooks, resolveTransitionHooks, Text, createRenderer, createHydrationRenderer, isRuntimeOnly } from '@vue/runtime-core';\nexport * from '@vue/runtime-core';\nimport { extend, isObject, toNumber, isArray, NOOP, normalizeCssVarValue, isString, hyphenate, capitalize, isSpecialBooleanAttr, includeBooleanAttr, isSymbol, isFunction, isOn, isModelListener, camelize as camelize$1, isPlainObject, hasOwn, EMPTY_OBJ, looseToNumber, looseIndexOf, isSet, looseEqual, invokeArrayFns, isHTMLTag, isSVGTag, isMathMLTag } from '@vue/shared';\n\nlet policy = void 0;\nconst tt = typeof window !== \"undefined\" && window.trustedTypes;\nif (tt) {\n  try {\n    policy = /* @__PURE__ */ tt.createPolicy(\"vue\", {\n      createHTML: (val) => val\n    });\n  } catch (e) {\n    !!(process.env.NODE_ENV !== \"production\") && warn(`Error creating trusted types policy: ${e}`);\n  }\n}\nconst unsafeToTrustedHTML = policy ? (val) => policy.createHTML(val) : (val) => val;\nconst svgNS = \"http://www.w3.org/2000/svg\";\nconst mathmlNS = \"http://www.w3.org/1998/Math/MathML\";\nconst doc = typeof document !== \"undefined\" ? document : null;\nconst templateContainer = doc && /* @__PURE__ */ doc.createElement(\"template\");\nconst nodeOps = {\n  insert: (child, parent, anchor) => {\n    parent.insertBefore(child, anchor || null);\n  },\n  remove: (child) => {\n    const parent = child.parentNode;\n    if (parent) {\n      parent.removeChild(child);\n    }\n  },\n  createElement: (tag, namespace, is, props) => {\n    const el = namespace === \"svg\" ? doc.createElementNS(svgNS, tag) : namespace === \"mathml\" ? doc.createElementNS(mathmlNS, tag) : is ? doc.createElement(tag, { is }) : doc.createElement(tag);\n    if (tag === \"select\" && props && props.multiple != null) {\n      el.setAttribute(\"multiple\", props.multiple);\n    }\n    return el;\n  },\n  createText: (text) => doc.createTextNode(text),\n  createComment: (text) => doc.createComment(text),\n  setText: (node, text) => {\n    node.nodeValue = text;\n  },\n  setElementText: (el, text) => {\n    el.textContent = text;\n  },\n  parentNode: (node) => node.parentNode,\n  nextSibling: (node) => node.nextSibling,\n  querySelector: (selector) => doc.querySelector(selector),\n  setScopeId(el, id) {\n    el.setAttribute(id, \"\");\n  },\n  // __UNSAFE__\n  // Reason: innerHTML.\n  // Static content here can only come from compiled templates.\n  // As long as the user only uses trusted templates, this is safe.\n  insertStaticContent(content, parent, anchor, namespace, start, end) {\n    const before = anchor ? anchor.previousSibling : parent.lastChild;\n    if (start && (start === end || start.nextSibling)) {\n      while (true) {\n        parent.insertBefore(start.cloneNode(true), anchor);\n        if (start === end || !(start = start.nextSibling)) break;\n      }\n    } else {\n      templateContainer.innerHTML = unsafeToTrustedHTML(\n        namespace === \"svg\" ? `<svg>${content}</svg>` : namespace === \"mathml\" ? `<math>${content}</math>` : content\n      );\n      const template = templateContainer.content;\n      if (namespace === \"svg\" || namespace === \"mathml\") {\n        const wrapper = template.firstChild;\n        while (wrapper.firstChild) {\n          template.appendChild(wrapper.firstChild);\n        }\n        template.removeChild(wrapper);\n      }\n      parent.insertBefore(template, anchor);\n    }\n    return [\n      // first\n      before ? before.nextSibling : parent.firstChild,\n      // last\n      anchor ? anchor.previousSibling : parent.lastChild\n    ];\n  }\n};\n\nconst TRANSITION = \"transition\";\nconst ANIMATION = \"animation\";\nconst vtcKey = Symbol(\"_vtc\");\nconst DOMTransitionPropsValidators = {\n  name: String,\n  type: String,\n  css: {\n    type: Boolean,\n    default: true\n  },\n  duration: [String, Number, Object],\n  enterFromClass: String,\n  enterActiveClass: String,\n  enterToClass: String,\n  appearFromClass: String,\n  appearActiveClass: String,\n  appearToClass: String,\n  leaveFromClass: String,\n  leaveActiveClass: String,\n  leaveToClass: String\n};\nconst TransitionPropsValidators = /* @__PURE__ */ extend(\n  {},\n  BaseTransitionPropsValidators,\n  DOMTransitionPropsValidators\n);\nconst decorate$1 = (t) => {\n  t.displayName = \"Transition\";\n  t.props = TransitionPropsValidators;\n  return t;\n};\nconst Transition = /* @__PURE__ */ decorate$1(\n  (props, { slots }) => h(BaseTransition, resolveTransitionProps(props), slots)\n);\nconst callHook = (hook, args = []) => {\n  if (isArray(hook)) {\n    hook.forEach((h2) => h2(...args));\n  } else if (hook) {\n    hook(...args);\n  }\n};\nconst hasExplicitCallback = (hook) => {\n  return hook ? isArray(hook) ? hook.some((h2) => h2.length > 1) : hook.length > 1 : false;\n};\nfunction resolveTransitionProps(rawProps) {\n  const baseProps = {};\n  for (const key in rawProps) {\n    if (!(key in DOMTransitionPropsValidators)) {\n      baseProps[key] = rawProps[key];\n    }\n  }\n  if (rawProps.css === false) {\n    return baseProps;\n  }\n  const {\n    name = \"v\",\n    type,\n    duration,\n    enterFromClass = `${name}-enter-from`,\n    enterActiveClass = `${name}-enter-active`,\n    enterToClass = `${name}-enter-to`,\n    appearFromClass = enterFromClass,\n    appearActiveClass = enterActiveClass,\n    appearToClass = enterToClass,\n    leaveFromClass = `${name}-leave-from`,\n    leaveActiveClass = `${name}-leave-active`,\n    leaveToClass = `${name}-leave-to`\n  } = rawProps;\n  const durations = normalizeDuration(duration);\n  const enterDuration = durations && durations[0];\n  const leaveDuration = durations && durations[1];\n  const {\n    onBeforeEnter,\n    onEnter,\n    onEnterCancelled,\n    onLeave,\n    onLeaveCancelled,\n    onBeforeAppear = onBeforeEnter,\n    onAppear = onEnter,\n    onAppearCancelled = onEnterCancelled\n  } = baseProps;\n  const finishEnter = (el, isAppear, done, isCancelled) => {\n    el._enterCancelled = isCancelled;\n    removeTransitionClass(el, isAppear ? appearToClass : enterToClass);\n    removeTransitionClass(el, isAppear ? appearActiveClass : enterActiveClass);\n    done && done();\n  };\n  const finishLeave = (el, done) => {\n    el._isLeaving = false;\n    removeTransitionClass(el, leaveFromClass);\n    removeTransitionClass(el, leaveToClass);\n    removeTransitionClass(el, leaveActiveClass);\n    done && done();\n  };\n  const makeEnterHook = (isAppear) => {\n    return (el, done) => {\n      const hook = isAppear ? onAppear : onEnter;\n      const resolve = () => finishEnter(el, isAppear, done);\n      callHook(hook, [el, resolve]);\n      nextFrame(() => {\n        removeTransitionClass(el, isAppear ? appearFromClass : enterFromClass);\n        addTransitionClass(el, isAppear ? appearToClass : enterToClass);\n        if (!hasExplicitCallback(hook)) {\n          whenTransitionEnds(el, type, enterDuration, resolve);\n        }\n      });\n    };\n  };\n  return extend(baseProps, {\n    onBeforeEnter(el) {\n      callHook(onBeforeEnter, [el]);\n      addTransitionClass(el, enterFromClass);\n      addTransitionClass(el, enterActiveClass);\n    },\n    onBeforeAppear(el) {\n      callHook(onBeforeAppear, [el]);\n      addTransitionClass(el, appearFromClass);\n      addTransitionClass(el, appearActiveClass);\n    },\n    onEnter: makeEnterHook(false),\n    onAppear: makeEnterHook(true),\n    onLeave(el, done) {\n      el._isLeaving = true;\n      const resolve = () => finishLeave(el, done);\n      addTransitionClass(el, leaveFromClass);\n      if (!el._enterCancelled) {\n        forceReflow();\n        addTransitionClass(el, leaveActiveClass);\n      } else {\n        addTransitionClass(el, leaveActiveClass);\n        forceReflow();\n      }\n      nextFrame(() => {\n        if (!el._isLeaving) {\n          return;\n        }\n        removeTransitionClass(el, leaveFromClass);\n        addTransitionClass(el, leaveToClass);\n        if (!hasExplicitCallback(onLeave)) {\n          whenTransitionEnds(el, type, leaveDuration, resolve);\n        }\n      });\n      callHook(onLeave, [el, resolve]);\n    },\n    onEnterCancelled(el) {\n      finishEnter(el, false, void 0, true);\n      callHook(onEnterCancelled, [el]);\n    },\n    onAppearCancelled(el) {\n      finishEnter(el, true, void 0, true);\n      callHook(onAppearCancelled, [el]);\n    },\n    onLeaveCancelled(el) {\n      finishLeave(el);\n      callHook(onLeaveCancelled, [el]);\n    }\n  });\n}\nfunction normalizeDuration(duration) {\n  if (duration == null) {\n    return null;\n  } else if (isObject(duration)) {\n    return [NumberOf(duration.enter), NumberOf(duration.leave)];\n  } else {\n    const n = NumberOf(duration);\n    return [n, n];\n  }\n}\nfunction NumberOf(val) {\n  const res = toNumber(val);\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    assertNumber(res, \"<transition> explicit duration\");\n  }\n  return res;\n}\nfunction addTransitionClass(el, cls) {\n  cls.split(/\\s+/).forEach((c) => c && el.classList.add(c));\n  (el[vtcKey] || (el[vtcKey] = /* @__PURE__ */ new Set())).add(cls);\n}\nfunction removeTransitionClass(el, cls) {\n  cls.split(/\\s+/).forEach((c) => c && el.classList.remove(c));\n  const _vtc = el[vtcKey];\n  if (_vtc) {\n    _vtc.delete(cls);\n    if (!_vtc.size) {\n      el[vtcKey] = void 0;\n    }\n  }\n}\nfunction nextFrame(cb) {\n  requestAnimationFrame(() => {\n    requestAnimationFrame(cb);\n  });\n}\nlet endId = 0;\nfunction whenTransitionEnds(el, expectedType, explicitTimeout, resolve) {\n  const id = el._endId = ++endId;\n  const resolveIfNotStale = () => {\n    if (id === el._endId) {\n      resolve();\n    }\n  };\n  if (explicitTimeout != null) {\n    return setTimeout(resolveIfNotStale, explicitTimeout);\n  }\n  const { type, timeout, propCount } = getTransitionInfo(el, expectedType);\n  if (!type) {\n    return resolve();\n  }\n  const endEvent = type + \"end\";\n  let ended = 0;\n  const end = () => {\n    el.removeEventListener(endEvent, onEnd);\n    resolveIfNotStale();\n  };\n  const onEnd = (e) => {\n    if (e.target === el && ++ended >= propCount) {\n      end();\n    }\n  };\n  setTimeout(() => {\n    if (ended < propCount) {\n      end();\n    }\n  }, timeout + 1);\n  el.addEventListener(endEvent, onEnd);\n}\nfunction getTransitionInfo(el, expectedType) {\n  const styles = window.getComputedStyle(el);\n  const getStyleProperties = (key) => (styles[key] || \"\").split(\", \");\n  const transitionDelays = getStyleProperties(`${TRANSITION}Delay`);\n  const transitionDurations = getStyleProperties(`${TRANSITION}Duration`);\n  const transitionTimeout = getTimeout(transitionDelays, transitionDurations);\n  const animationDelays = getStyleProperties(`${ANIMATION}Delay`);\n  const animationDurations = getStyleProperties(`${ANIMATION}Duration`);\n  const animationTimeout = getTimeout(animationDelays, animationDurations);\n  let type = null;\n  let timeout = 0;\n  let propCount = 0;\n  if (expectedType === TRANSITION) {\n    if (transitionTimeout > 0) {\n      type = TRANSITION;\n      timeout = transitionTimeout;\n      propCount = transitionDurations.length;\n    }\n  } else if (expectedType === ANIMATION) {\n    if (animationTimeout > 0) {\n      type = ANIMATION;\n      timeout = animationTimeout;\n      propCount = animationDurations.length;\n    }\n  } else {\n    timeout = Math.max(transitionTimeout, animationTimeout);\n    type = timeout > 0 ? transitionTimeout > animationTimeout ? TRANSITION : ANIMATION : null;\n    propCount = type ? type === TRANSITION ? transitionDurations.length : animationDurations.length : 0;\n  }\n  const hasTransform = type === TRANSITION && /\\b(transform|all)(,|$)/.test(\n    getStyleProperties(`${TRANSITION}Property`).toString()\n  );\n  return {\n    type,\n    timeout,\n    propCount,\n    hasTransform\n  };\n}\nfunction getTimeout(delays, durations) {\n  while (delays.length < durations.length) {\n    delays = delays.concat(delays);\n  }\n  return Math.max(...durations.map((d, i) => toMs(d) + toMs(delays[i])));\n}\nfunction toMs(s) {\n  if (s === \"auto\") return 0;\n  return Number(s.slice(0, -1).replace(\",\", \".\")) * 1e3;\n}\nfunction forceReflow() {\n  return document.body.offsetHeight;\n}\n\nfunction patchClass(el, value, isSVG) {\n  const transitionClasses = el[vtcKey];\n  if (transitionClasses) {\n    value = (value ? [value, ...transitionClasses] : [...transitionClasses]).join(\" \");\n  }\n  if (value == null) {\n    el.removeAttribute(\"class\");\n  } else if (isSVG) {\n    el.setAttribute(\"class\", value);\n  } else {\n    el.className = value;\n  }\n}\n\nconst vShowOriginalDisplay = Symbol(\"_vod\");\nconst vShowHidden = Symbol(\"_vsh\");\nconst vShow = {\n  beforeMount(el, { value }, { transition }) {\n    el[vShowOriginalDisplay] = el.style.display === \"none\" ? \"\" : el.style.display;\n    if (transition && value) {\n      transition.beforeEnter(el);\n    } else {\n      setDisplay(el, value);\n    }\n  },\n  mounted(el, { value }, { transition }) {\n    if (transition && value) {\n      transition.enter(el);\n    }\n  },\n  updated(el, { value, oldValue }, { transition }) {\n    if (!value === !oldValue) return;\n    if (transition) {\n      if (value) {\n        transition.beforeEnter(el);\n        setDisplay(el, true);\n        transition.enter(el);\n      } else {\n        transition.leave(el, () => {\n          setDisplay(el, false);\n        });\n      }\n    } else {\n      setDisplay(el, value);\n    }\n  },\n  beforeUnmount(el, { value }) {\n    setDisplay(el, value);\n  }\n};\nif (!!(process.env.NODE_ENV !== \"production\")) {\n  vShow.name = \"show\";\n}\nfunction setDisplay(el, value) {\n  el.style.display = value ? el[vShowOriginalDisplay] : \"none\";\n  el[vShowHidden] = !value;\n}\nfunction initVShowForSSR() {\n  vShow.getSSRProps = ({ value }) => {\n    if (!value) {\n      return { style: { display: \"none\" } };\n    }\n  };\n}\n\nconst CSS_VAR_TEXT = Symbol(!!(process.env.NODE_ENV !== \"production\") ? \"CSS_VAR_TEXT\" : \"\");\nfunction useCssVars(getter) {\n  const instance = getCurrentInstance();\n  if (!instance) {\n    !!(process.env.NODE_ENV !== \"production\") && warn(`useCssVars is called without current active component instance.`);\n    return;\n  }\n  const updateTeleports = instance.ut = (vars = getter(instance.proxy)) => {\n    Array.from(\n      document.querySelectorAll(`[data-v-owner=\"${instance.uid}\"]`)\n    ).forEach((node) => setVarsOnNode(node, vars));\n  };\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    instance.getCssVars = () => getter(instance.proxy);\n  }\n  const setVars = () => {\n    const vars = getter(instance.proxy);\n    if (instance.ce) {\n      setVarsOnNode(instance.ce, vars);\n    } else {\n      setVarsOnVNode(instance.subTree, vars);\n    }\n    updateTeleports(vars);\n  };\n  onBeforeUpdate(() => {\n    queuePostFlushCb(setVars);\n  });\n  onMounted(() => {\n    watch(setVars, NOOP, { flush: \"post\" });\n    const ob = new MutationObserver(setVars);\n    ob.observe(instance.subTree.el.parentNode, { childList: true });\n    onUnmounted(() => ob.disconnect());\n  });\n}\nfunction setVarsOnVNode(vnode, vars) {\n  if (vnode.shapeFlag & 128) {\n    const suspense = vnode.suspense;\n    vnode = suspense.activeBranch;\n    if (suspense.pendingBranch && !suspense.isHydrating) {\n      suspense.effects.push(() => {\n        setVarsOnVNode(suspense.activeBranch, vars);\n      });\n    }\n  }\n  while (vnode.component) {\n    vnode = vnode.component.subTree;\n  }\n  if (vnode.shapeFlag & 1 && vnode.el) {\n    setVarsOnNode(vnode.el, vars);\n  } else if (vnode.type === Fragment) {\n    vnode.children.forEach((c) => setVarsOnVNode(c, vars));\n  } else if (vnode.type === Static) {\n    let { el, anchor } = vnode;\n    while (el) {\n      setVarsOnNode(el, vars);\n      if (el === anchor) break;\n      el = el.nextSibling;\n    }\n  }\n}\nfunction setVarsOnNode(el, vars) {\n  if (el.nodeType === 1) {\n    const style = el.style;\n    let cssText = \"\";\n    for (const key in vars) {\n      const value = normalizeCssVarValue(vars[key]);\n      style.setProperty(`--${key}`, value);\n      cssText += `--${key}: ${value};`;\n    }\n    style[CSS_VAR_TEXT] = cssText;\n  }\n}\n\nconst displayRE = /(^|;)\\s*display\\s*:/;\nfunction patchStyle(el, prev, next) {\n  const style = el.style;\n  const isCssString = isString(next);\n  let hasControlledDisplay = false;\n  if (next && !isCssString) {\n    if (prev) {\n      if (!isString(prev)) {\n        for (const key in prev) {\n          if (next[key] == null) {\n            setStyle(style, key, \"\");\n          }\n        }\n      } else {\n        for (const prevStyle of prev.split(\";\")) {\n          const key = prevStyle.slice(0, prevStyle.indexOf(\":\")).trim();\n          if (next[key] == null) {\n            setStyle(style, key, \"\");\n          }\n        }\n      }\n    }\n    for (const key in next) {\n      if (key === \"display\") {\n        hasControlledDisplay = true;\n      }\n      setStyle(style, key, next[key]);\n    }\n  } else {\n    if (isCssString) {\n      if (prev !== next) {\n        const cssVarText = style[CSS_VAR_TEXT];\n        if (cssVarText) {\n          next += \";\" + cssVarText;\n        }\n        style.cssText = next;\n        hasControlledDisplay = displayRE.test(next);\n      }\n    } else if (prev) {\n      el.removeAttribute(\"style\");\n    }\n  }\n  if (vShowOriginalDisplay in el) {\n    el[vShowOriginalDisplay] = hasControlledDisplay ? style.display : \"\";\n    if (el[vShowHidden]) {\n      style.display = \"none\";\n    }\n  }\n}\nconst semicolonRE = /[^\\\\];\\s*$/;\nconst importantRE = /\\s*!important$/;\nfunction setStyle(style, name, val) {\n  if (isArray(val)) {\n    val.forEach((v) => setStyle(style, name, v));\n  } else {\n    if (val == null) val = \"\";\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      if (semicolonRE.test(val)) {\n        warn(\n          `Unexpected semicolon at the end of '${name}' style value: '${val}'`\n        );\n      }\n    }\n    if (name.startsWith(\"--\")) {\n      style.setProperty(name, val);\n    } else {\n      const prefixed = autoPrefix(style, name);\n      if (importantRE.test(val)) {\n        style.setProperty(\n          hyphenate(prefixed),\n          val.replace(importantRE, \"\"),\n          \"important\"\n        );\n      } else {\n        style[prefixed] = val;\n      }\n    }\n  }\n}\nconst prefixes = [\"Webkit\", \"Moz\", \"ms\"];\nconst prefixCache = {};\nfunction autoPrefix(style, rawName) {\n  const cached = prefixCache[rawName];\n  if (cached) {\n    return cached;\n  }\n  let name = camelize(rawName);\n  if (name !== \"filter\" && name in style) {\n    return prefixCache[rawName] = name;\n  }\n  name = capitalize(name);\n  for (let i = 0; i < prefixes.length; i++) {\n    const prefixed = prefixes[i] + name;\n    if (prefixed in style) {\n      return prefixCache[rawName] = prefixed;\n    }\n  }\n  return rawName;\n}\n\nconst xlinkNS = \"http://www.w3.org/1999/xlink\";\nfunction patchAttr(el, key, value, isSVG, instance, isBoolean = isSpecialBooleanAttr(key)) {\n  if (isSVG && key.startsWith(\"xlink:\")) {\n    if (value == null) {\n      el.removeAttributeNS(xlinkNS, key.slice(6, key.length));\n    } else {\n      el.setAttributeNS(xlinkNS, key, value);\n    }\n  } else {\n    if (value == null || isBoolean && !includeBooleanAttr(value)) {\n      el.removeAttribute(key);\n    } else {\n      el.setAttribute(\n        key,\n        isBoolean ? \"\" : isSymbol(value) ? String(value) : value\n      );\n    }\n  }\n}\n\nfunction patchDOMProp(el, key, value, parentComponent, attrName) {\n  if (key === \"innerHTML\" || key === \"textContent\") {\n    if (value != null) {\n      el[key] = key === \"innerHTML\" ? unsafeToTrustedHTML(value) : value;\n    }\n    return;\n  }\n  const tag = el.tagName;\n  if (key === \"value\" && tag !== \"PROGRESS\" && // custom elements may use _value internally\n  !tag.includes(\"-\")) {\n    const oldValue = tag === \"OPTION\" ? el.getAttribute(\"value\") || \"\" : el.value;\n    const newValue = value == null ? (\n      // #11647: value should be set as empty string for null and undefined,\n      // but <input type=\"checkbox\"> should be set as 'on'.\n      el.type === \"checkbox\" ? \"on\" : \"\"\n    ) : String(value);\n    if (oldValue !== newValue || !(\"_value\" in el)) {\n      el.value = newValue;\n    }\n    if (value == null) {\n      el.removeAttribute(key);\n    }\n    el._value = value;\n    return;\n  }\n  let needRemove = false;\n  if (value === \"\" || value == null) {\n    const type = typeof el[key];\n    if (type === \"boolean\") {\n      value = includeBooleanAttr(value);\n    } else if (value == null && type === \"string\") {\n      value = \"\";\n      needRemove = true;\n    } else if (type === \"number\") {\n      value = 0;\n      needRemove = true;\n    }\n  }\n  try {\n    el[key] = value;\n  } catch (e) {\n    if (!!(process.env.NODE_ENV !== \"production\") && !needRemove) {\n      warn(\n        `Failed setting prop \"${key}\" on <${tag.toLowerCase()}>: value ${value} is invalid.`,\n        e\n      );\n    }\n  }\n  needRemove && el.removeAttribute(attrName || key);\n}\n\nfunction addEventListener(el, event, handler, options) {\n  el.addEventListener(event, handler, options);\n}\nfunction removeEventListener(el, event, handler, options) {\n  el.removeEventListener(event, handler, options);\n}\nconst veiKey = Symbol(\"_vei\");\nfunction patchEvent(el, rawName, prevValue, nextValue, instance = null) {\n  const invokers = el[veiKey] || (el[veiKey] = {});\n  const existingInvoker = invokers[rawName];\n  if (nextValue && existingInvoker) {\n    existingInvoker.value = !!(process.env.NODE_ENV !== \"production\") ? sanitizeEventValue(nextValue, rawName) : nextValue;\n  } else {\n    const [name, options] = parseName(rawName);\n    if (nextValue) {\n      const invoker = invokers[rawName] = createInvoker(\n        !!(process.env.NODE_ENV !== \"production\") ? sanitizeEventValue(nextValue, rawName) : nextValue,\n        instance\n      );\n      addEventListener(el, name, invoker, options);\n    } else if (existingInvoker) {\n      removeEventListener(el, name, existingInvoker, options);\n      invokers[rawName] = void 0;\n    }\n  }\n}\nconst optionsModifierRE = /(?:Once|Passive|Capture)$/;\nfunction parseName(name) {\n  let options;\n  if (optionsModifierRE.test(name)) {\n    options = {};\n    let m;\n    while (m = name.match(optionsModifierRE)) {\n      name = name.slice(0, name.length - m[0].length);\n      options[m[0].toLowerCase()] = true;\n    }\n  }\n  const event = name[2] === \":\" ? name.slice(3) : hyphenate(name.slice(2));\n  return [event, options];\n}\nlet cachedNow = 0;\nconst p = /* @__PURE__ */ Promise.resolve();\nconst getNow = () => cachedNow || (p.then(() => cachedNow = 0), cachedNow = Date.now());\nfunction createInvoker(initialValue, instance) {\n  const invoker = (e) => {\n    if (!e._vts) {\n      e._vts = Date.now();\n    } else if (e._vts <= invoker.attached) {\n      return;\n    }\n    callWithAsyncErrorHandling(\n      patchStopImmediatePropagation(e, invoker.value),\n      instance,\n      5,\n      [e]\n    );\n  };\n  invoker.value = initialValue;\n  invoker.attached = getNow();\n  return invoker;\n}\nfunction sanitizeEventValue(value, propName) {\n  if (isFunction(value) || isArray(value)) {\n    return value;\n  }\n  warn(\n    `Wrong type passed as event handler to ${propName} - did you forget @ or : in front of your prop?\nExpected function or array of functions, received type ${typeof value}.`\n  );\n  return NOOP;\n}\nfunction patchStopImmediatePropagation(e, value) {\n  if (isArray(value)) {\n    const originalStop = e.stopImmediatePropagation;\n    e.stopImmediatePropagation = () => {\n      originalStop.call(e);\n      e._stopped = true;\n    };\n    return value.map(\n      (fn) => (e2) => !e2._stopped && fn && fn(e2)\n    );\n  } else {\n    return value;\n  }\n}\n\nconst isNativeOn = (key) => key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && // lowercase letter\nkey.charCodeAt(2) > 96 && key.charCodeAt(2) < 123;\nconst patchProp = (el, key, prevValue, nextValue, namespace, parentComponent) => {\n  const isSVG = namespace === \"svg\";\n  if (key === \"class\") {\n    patchClass(el, nextValue, isSVG);\n  } else if (key === \"style\") {\n    patchStyle(el, prevValue, nextValue);\n  } else if (isOn(key)) {\n    if (!isModelListener(key)) {\n      patchEvent(el, key, prevValue, nextValue, parentComponent);\n    }\n  } else if (key[0] === \".\" ? (key = key.slice(1), true) : key[0] === \"^\" ? (key = key.slice(1), false) : shouldSetAsProp(el, key, nextValue, isSVG)) {\n    patchDOMProp(el, key, nextValue);\n    if (!el.tagName.includes(\"-\") && (key === \"value\" || key === \"checked\" || key === \"selected\")) {\n      patchAttr(el, key, nextValue, isSVG, parentComponent, key !== \"value\");\n    }\n  } else if (\n    // #11081 force set props for possible async custom element\n    el._isVueCE && (/[A-Z]/.test(key) || !isString(nextValue))\n  ) {\n    patchDOMProp(el, camelize$1(key), nextValue, parentComponent, key);\n  } else {\n    if (key === \"true-value\") {\n      el._trueValue = nextValue;\n    } else if (key === \"false-value\") {\n      el._falseValue = nextValue;\n    }\n    patchAttr(el, key, nextValue, isSVG);\n  }\n};\nfunction shouldSetAsProp(el, key, value, isSVG) {\n  if (isSVG) {\n    if (key === \"innerHTML\" || key === \"textContent\") {\n      return true;\n    }\n    if (key in el && isNativeOn(key) && isFunction(value)) {\n      return true;\n    }\n    return false;\n  }\n  if (key === \"spellcheck\" || key === \"draggable\" || key === \"translate\" || key === \"autocorrect\") {\n    return false;\n  }\n  if (key === \"form\") {\n    return false;\n  }\n  if (key === \"list\" && el.tagName === \"INPUT\") {\n    return false;\n  }\n  if (key === \"type\" && el.tagName === \"TEXTAREA\") {\n    return false;\n  }\n  if (key === \"width\" || key === \"height\") {\n    const tag = el.tagName;\n    if (tag === \"IMG\" || tag === \"VIDEO\" || tag === \"CANVAS\" || tag === \"SOURCE\") {\n      return false;\n    }\n  }\n  if (isNativeOn(key) && isString(value)) {\n    return false;\n  }\n  return key in el;\n}\n\nconst REMOVAL = {};\n/*! #__NO_SIDE_EFFECTS__ */\n// @__NO_SIDE_EFFECTS__\nfunction defineCustomElement(options, extraOptions, _createApp) {\n  const Comp = defineComponent(options, extraOptions);\n  if (isPlainObject(Comp)) extend(Comp, extraOptions);\n  class VueCustomElement extends VueElement {\n    constructor(initialProps) {\n      super(Comp, initialProps, _createApp);\n    }\n  }\n  VueCustomElement.def = Comp;\n  return VueCustomElement;\n}\n/*! #__NO_SIDE_EFFECTS__ */\nconst defineSSRCustomElement = /* @__NO_SIDE_EFFECTS__ */ (options, extraOptions) => {\n  return /* @__PURE__ */ defineCustomElement(options, extraOptions, createSSRApp);\n};\nconst BaseClass = typeof HTMLElement !== \"undefined\" ? HTMLElement : class {\n};\nclass VueElement extends BaseClass {\n  constructor(_def, _props = {}, _createApp = createApp) {\n    super();\n    this._def = _def;\n    this._props = _props;\n    this._createApp = _createApp;\n    this._isVueCE = true;\n    /**\n     * @internal\n     */\n    this._instance = null;\n    /**\n     * @internal\n     */\n    this._app = null;\n    /**\n     * @internal\n     */\n    this._nonce = this._def.nonce;\n    this._connected = false;\n    this._resolved = false;\n    this._numberProps = null;\n    this._styleChildren = /* @__PURE__ */ new WeakSet();\n    this._ob = null;\n    if (this.shadowRoot && _createApp !== createApp) {\n      this._root = this.shadowRoot;\n    } else {\n      if (!!(process.env.NODE_ENV !== \"production\") && this.shadowRoot) {\n        warn(\n          `Custom element has pre-rendered declarative shadow root but is not defined as hydratable. Use \\`defineSSRCustomElement\\`.`\n        );\n      }\n      if (_def.shadowRoot !== false) {\n        this.attachShadow({ mode: \"open\" });\n        this._root = this.shadowRoot;\n      } else {\n        this._root = this;\n      }\n    }\n  }\n  connectedCallback() {\n    if (!this.isConnected) return;\n    if (!this.shadowRoot && !this._resolved) {\n      this._parseSlots();\n    }\n    this._connected = true;\n    let parent = this;\n    while (parent = parent && (parent.parentNode || parent.host)) {\n      if (parent instanceof VueElement) {\n        this._parent = parent;\n        break;\n      }\n    }\n    if (!this._instance) {\n      if (this._resolved) {\n        this._mount(this._def);\n      } else {\n        if (parent && parent._pendingResolve) {\n          this._pendingResolve = parent._pendingResolve.then(() => {\n            this._pendingResolve = void 0;\n            this._resolveDef();\n          });\n        } else {\n          this._resolveDef();\n        }\n      }\n    }\n  }\n  _setParent(parent = this._parent) {\n    if (parent) {\n      this._instance.parent = parent._instance;\n      this._inheritParentContext(parent);\n    }\n  }\n  _inheritParentContext(parent = this._parent) {\n    if (parent && this._app) {\n      Object.setPrototypeOf(\n        this._app._context.provides,\n        parent._instance.provides\n      );\n    }\n  }\n  disconnectedCallback() {\n    this._connected = false;\n    nextTick(() => {\n      if (!this._connected) {\n        if (this._ob) {\n          this._ob.disconnect();\n          this._ob = null;\n        }\n        this._app && this._app.unmount();\n        if (this._instance) this._instance.ce = void 0;\n        this._app = this._instance = null;\n      }\n    });\n  }\n  /**\n   * resolve inner component definition (handle possible async component)\n   */\n  _resolveDef() {\n    if (this._pendingResolve) {\n      return;\n    }\n    for (let i = 0; i < this.attributes.length; i++) {\n      this._setAttr(this.attributes[i].name);\n    }\n    this._ob = new MutationObserver((mutations) => {\n      for (const m of mutations) {\n        this._setAttr(m.attributeName);\n      }\n    });\n    this._ob.observe(this, { attributes: true });\n    const resolve = (def, isAsync = false) => {\n      this._resolved = true;\n      this._pendingResolve = void 0;\n      const { props, styles } = def;\n      let numberProps;\n      if (props && !isArray(props)) {\n        for (const key in props) {\n          const opt = props[key];\n          if (opt === Number || opt && opt.type === Number) {\n            if (key in this._props) {\n              this._props[key] = toNumber(this._props[key]);\n            }\n            (numberProps || (numberProps = /* @__PURE__ */ Object.create(null)))[camelize$1(key)] = true;\n          }\n        }\n      }\n      this._numberProps = numberProps;\n      this._resolveProps(def);\n      if (this.shadowRoot) {\n        this._applyStyles(styles);\n      } else if (!!(process.env.NODE_ENV !== \"production\") && styles) {\n        warn(\n          \"Custom element style injection is not supported when using shadowRoot: false\"\n        );\n      }\n      this._mount(def);\n    };\n    const asyncDef = this._def.__asyncLoader;\n    if (asyncDef) {\n      this._pendingResolve = asyncDef().then((def) => {\n        def.configureApp = this._def.configureApp;\n        resolve(this._def = def, true);\n      });\n    } else {\n      resolve(this._def);\n    }\n  }\n  _mount(def) {\n    if ((!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) && !def.name) {\n      def.name = \"VueElement\";\n    }\n    this._app = this._createApp(def);\n    this._inheritParentContext();\n    if (def.configureApp) {\n      def.configureApp(this._app);\n    }\n    this._app._ceVNode = this._createVNode();\n    this._app.mount(this._root);\n    const exposed = this._instance && this._instance.exposed;\n    if (!exposed) return;\n    for (const key in exposed) {\n      if (!hasOwn(this, key)) {\n        Object.defineProperty(this, key, {\n          // unwrap ref to be consistent with public instance behavior\n          get: () => unref(exposed[key])\n        });\n      } else if (!!(process.env.NODE_ENV !== \"production\")) {\n        warn(`Exposed property \"${key}\" already exists on custom element.`);\n      }\n    }\n  }\n  _resolveProps(def) {\n    const { props } = def;\n    const declaredPropKeys = isArray(props) ? props : Object.keys(props || {});\n    for (const key of Object.keys(this)) {\n      if (key[0] !== \"_\" && declaredPropKeys.includes(key)) {\n        this._setProp(key, this[key]);\n      }\n    }\n    for (const key of declaredPropKeys.map(camelize$1)) {\n      Object.defineProperty(this, key, {\n        get() {\n          return this._getProp(key);\n        },\n        set(val) {\n          this._setProp(key, val, true, true);\n        }\n      });\n    }\n  }\n  _setAttr(key) {\n    if (key.startsWith(\"data-v-\")) return;\n    const has = this.hasAttribute(key);\n    let value = has ? this.getAttribute(key) : REMOVAL;\n    const camelKey = camelize$1(key);\n    if (has && this._numberProps && this._numberProps[camelKey]) {\n      value = toNumber(value);\n    }\n    this._setProp(camelKey, value, false, true);\n  }\n  /**\n   * @internal\n   */\n  _getProp(key) {\n    return this._props[key];\n  }\n  /**\n   * @internal\n   */\n  _setProp(key, val, shouldReflect = true, shouldUpdate = false) {\n    if (val !== this._props[key]) {\n      if (val === REMOVAL) {\n        delete this._props[key];\n      } else {\n        this._props[key] = val;\n        if (key === \"key\" && this._app) {\n          this._app._ceVNode.key = val;\n        }\n      }\n      if (shouldUpdate && this._instance) {\n        this._update();\n      }\n      if (shouldReflect) {\n        const ob = this._ob;\n        ob && ob.disconnect();\n        if (val === true) {\n          this.setAttribute(hyphenate(key), \"\");\n        } else if (typeof val === \"string\" || typeof val === \"number\") {\n          this.setAttribute(hyphenate(key), val + \"\");\n        } else if (!val) {\n          this.removeAttribute(hyphenate(key));\n        }\n        ob && ob.observe(this, { attributes: true });\n      }\n    }\n  }\n  _update() {\n    const vnode = this._createVNode();\n    if (this._app) vnode.appContext = this._app._context;\n    render(vnode, this._root);\n  }\n  _createVNode() {\n    const baseProps = {};\n    if (!this.shadowRoot) {\n      baseProps.onVnodeMounted = baseProps.onVnodeUpdated = this._renderSlots.bind(this);\n    }\n    const vnode = createVNode(this._def, extend(baseProps, this._props));\n    if (!this._instance) {\n      vnode.ce = (instance) => {\n        this._instance = instance;\n        instance.ce = this;\n        instance.isCE = true;\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          instance.ceReload = (newStyles) => {\n            if (this._styles) {\n              this._styles.forEach((s) => this._root.removeChild(s));\n              this._styles.length = 0;\n            }\n            this._applyStyles(newStyles);\n            this._instance = null;\n            this._update();\n          };\n        }\n        const dispatch = (event, args) => {\n          this.dispatchEvent(\n            new CustomEvent(\n              event,\n              isPlainObject(args[0]) ? extend({ detail: args }, args[0]) : { detail: args }\n            )\n          );\n        };\n        instance.emit = (event, ...args) => {\n          dispatch(event, args);\n          if (hyphenate(event) !== event) {\n            dispatch(hyphenate(event), args);\n          }\n        };\n        this._setParent();\n      };\n    }\n    return vnode;\n  }\n  _applyStyles(styles, owner) {\n    if (!styles) return;\n    if (owner) {\n      if (owner === this._def || this._styleChildren.has(owner)) {\n        return;\n      }\n      this._styleChildren.add(owner);\n    }\n    const nonce = this._nonce;\n    for (let i = styles.length - 1; i >= 0; i--) {\n      const s = document.createElement(\"style\");\n      if (nonce) s.setAttribute(\"nonce\", nonce);\n      s.textContent = styles[i];\n      this.shadowRoot.prepend(s);\n      if (!!(process.env.NODE_ENV !== \"production\")) {\n        if (owner) {\n          if (owner.__hmrId) {\n            if (!this._childStyles) this._childStyles = /* @__PURE__ */ new Map();\n            let entry = this._childStyles.get(owner.__hmrId);\n            if (!entry) {\n              this._childStyles.set(owner.__hmrId, entry = []);\n            }\n            entry.push(s);\n          }\n        } else {\n          (this._styles || (this._styles = [])).push(s);\n        }\n      }\n    }\n  }\n  /**\n   * Only called when shadowRoot is false\n   */\n  _parseSlots() {\n    const slots = this._slots = {};\n    let n;\n    while (n = this.firstChild) {\n      const slotName = n.nodeType === 1 && n.getAttribute(\"slot\") || \"default\";\n      (slots[slotName] || (slots[slotName] = [])).push(n);\n      this.removeChild(n);\n    }\n  }\n  /**\n   * Only called when shadowRoot is false\n   */\n  _renderSlots() {\n    const outlets = (this._teleportTarget || this).querySelectorAll(\"slot\");\n    const scopeId = this._instance.type.__scopeId;\n    for (let i = 0; i < outlets.length; i++) {\n      const o = outlets[i];\n      const slotName = o.getAttribute(\"name\") || \"default\";\n      const content = this._slots[slotName];\n      const parent = o.parentNode;\n      if (content) {\n        for (const n of content) {\n          if (scopeId && n.nodeType === 1) {\n            const id = scopeId + \"-s\";\n            const walker = document.createTreeWalker(n, 1);\n            n.setAttribute(id, \"\");\n            let child;\n            while (child = walker.nextNode()) {\n              child.setAttribute(id, \"\");\n            }\n          }\n          parent.insertBefore(n, o);\n        }\n      } else {\n        while (o.firstChild) parent.insertBefore(o.firstChild, o);\n      }\n      parent.removeChild(o);\n    }\n  }\n  /**\n   * @internal\n   */\n  _injectChildStyle(comp) {\n    this._applyStyles(comp.styles, comp);\n  }\n  /**\n   * @internal\n   */\n  _removeChildStyle(comp) {\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      this._styleChildren.delete(comp);\n      if (this._childStyles && comp.__hmrId) {\n        const oldStyles = this._childStyles.get(comp.__hmrId);\n        if (oldStyles) {\n          oldStyles.forEach((s) => this._root.removeChild(s));\n          oldStyles.length = 0;\n        }\n      }\n    }\n  }\n}\nfunction useHost(caller) {\n  const instance = getCurrentInstance();\n  const el = instance && instance.ce;\n  if (el) {\n    return el;\n  } else if (!!(process.env.NODE_ENV !== \"production\")) {\n    if (!instance) {\n      warn(\n        `${caller || \"useHost\"} called without an active component instance.`\n      );\n    } else {\n      warn(\n        `${caller || \"useHost\"} can only be used in components defined via defineCustomElement.`\n      );\n    }\n  }\n  return null;\n}\nfunction useShadowRoot() {\n  const el = !!(process.env.NODE_ENV !== \"production\") ? useHost(\"useShadowRoot\") : useHost();\n  return el && el.shadowRoot;\n}\n\nfunction useCssModule(name = \"$style\") {\n  {\n    const instance = getCurrentInstance();\n    if (!instance) {\n      !!(process.env.NODE_ENV !== \"production\") && warn(`useCssModule must be called inside setup()`);\n      return EMPTY_OBJ;\n    }\n    const modules = instance.type.__cssModules;\n    if (!modules) {\n      !!(process.env.NODE_ENV !== \"production\") && warn(`Current instance does not have CSS modules injected.`);\n      return EMPTY_OBJ;\n    }\n    const mod = modules[name];\n    if (!mod) {\n      !!(process.env.NODE_ENV !== \"production\") && warn(`Current instance does not have CSS module named \"${name}\".`);\n      return EMPTY_OBJ;\n    }\n    return mod;\n  }\n}\n\nconst positionMap = /* @__PURE__ */ new WeakMap();\nconst newPositionMap = /* @__PURE__ */ new WeakMap();\nconst moveCbKey = Symbol(\"_moveCb\");\nconst enterCbKey = Symbol(\"_enterCb\");\nconst decorate = (t) => {\n  delete t.props.mode;\n  return t;\n};\nconst TransitionGroupImpl = /* @__PURE__ */ decorate({\n  name: \"TransitionGroup\",\n  props: /* @__PURE__ */ extend({}, TransitionPropsValidators, {\n    tag: String,\n    moveClass: String\n  }),\n  setup(props, { slots }) {\n    const instance = getCurrentInstance();\n    const state = useTransitionState();\n    let prevChildren;\n    let children;\n    onUpdated(() => {\n      if (!prevChildren.length) {\n        return;\n      }\n      const moveClass = props.moveClass || `${props.name || \"v\"}-move`;\n      if (!hasCSSTransform(\n        prevChildren[0].el,\n        instance.vnode.el,\n        moveClass\n      )) {\n        prevChildren = [];\n        return;\n      }\n      prevChildren.forEach(callPendingCbs);\n      prevChildren.forEach(recordPosition);\n      const movedChildren = prevChildren.filter(applyTranslation);\n      forceReflow();\n      movedChildren.forEach((c) => {\n        const el = c.el;\n        const style = el.style;\n        addTransitionClass(el, moveClass);\n        style.transform = style.webkitTransform = style.transitionDuration = \"\";\n        const cb = el[moveCbKey] = (e) => {\n          if (e && e.target !== el) {\n            return;\n          }\n          if (!e || /transform$/.test(e.propertyName)) {\n            el.removeEventListener(\"transitionend\", cb);\n            el[moveCbKey] = null;\n            removeTransitionClass(el, moveClass);\n          }\n        };\n        el.addEventListener(\"transitionend\", cb);\n      });\n      prevChildren = [];\n    });\n    return () => {\n      const rawProps = toRaw(props);\n      const cssTransitionProps = resolveTransitionProps(rawProps);\n      let tag = rawProps.tag || Fragment;\n      prevChildren = [];\n      if (children) {\n        for (let i = 0; i < children.length; i++) {\n          const child = children[i];\n          if (child.el && child.el instanceof Element) {\n            prevChildren.push(child);\n            setTransitionHooks(\n              child,\n              resolveTransitionHooks(\n                child,\n                cssTransitionProps,\n                state,\n                instance\n              )\n            );\n            positionMap.set(\n              child,\n              child.el.getBoundingClientRect()\n            );\n          }\n        }\n      }\n      children = slots.default ? getTransitionRawChildren(slots.default()) : [];\n      for (let i = 0; i < children.length; i++) {\n        const child = children[i];\n        if (child.key != null) {\n          setTransitionHooks(\n            child,\n            resolveTransitionHooks(child, cssTransitionProps, state, instance)\n          );\n        } else if (!!(process.env.NODE_ENV !== \"production\") && child.type !== Text) {\n          warn(`<TransitionGroup> children must be keyed.`);\n        }\n      }\n      return createVNode(tag, null, children);\n    };\n  }\n});\nconst TransitionGroup = TransitionGroupImpl;\nfunction callPendingCbs(c) {\n  const el = c.el;\n  if (el[moveCbKey]) {\n    el[moveCbKey]();\n  }\n  if (el[enterCbKey]) {\n    el[enterCbKey]();\n  }\n}\nfunction recordPosition(c) {\n  newPositionMap.set(c, c.el.getBoundingClientRect());\n}\nfunction applyTranslation(c) {\n  const oldPos = positionMap.get(c);\n  const newPos = newPositionMap.get(c);\n  const dx = oldPos.left - newPos.left;\n  const dy = oldPos.top - newPos.top;\n  if (dx || dy) {\n    const s = c.el.style;\n    s.transform = s.webkitTransform = `translate(${dx}px,${dy}px)`;\n    s.transitionDuration = \"0s\";\n    return c;\n  }\n}\nfunction hasCSSTransform(el, root, moveClass) {\n  const clone = el.cloneNode();\n  const _vtc = el[vtcKey];\n  if (_vtc) {\n    _vtc.forEach((cls) => {\n      cls.split(/\\s+/).forEach((c) => c && clone.classList.remove(c));\n    });\n  }\n  moveClass.split(/\\s+/).forEach((c) => c && clone.classList.add(c));\n  clone.style.display = \"none\";\n  const container = root.nodeType === 1 ? root : root.parentNode;\n  container.appendChild(clone);\n  const { hasTransform } = getTransitionInfo(clone);\n  container.removeChild(clone);\n  return hasTransform;\n}\n\nconst getModelAssigner = (vnode) => {\n  const fn = vnode.props[\"onUpdate:modelValue\"] || false;\n  return isArray(fn) ? (value) => invokeArrayFns(fn, value) : fn;\n};\nfunction onCompositionStart(e) {\n  e.target.composing = true;\n}\nfunction onCompositionEnd(e) {\n  const target = e.target;\n  if (target.composing) {\n    target.composing = false;\n    target.dispatchEvent(new Event(\"input\"));\n  }\n}\nconst assignKey = Symbol(\"_assign\");\nconst vModelText = {\n  created(el, { modifiers: { lazy, trim, number } }, vnode) {\n    el[assignKey] = getModelAssigner(vnode);\n    const castToNumber = number || vnode.props && vnode.props.type === \"number\";\n    addEventListener(el, lazy ? \"change\" : \"input\", (e) => {\n      if (e.target.composing) return;\n      let domValue = el.value;\n      if (trim) {\n        domValue = domValue.trim();\n      }\n      if (castToNumber) {\n        domValue = looseToNumber(domValue);\n      }\n      el[assignKey](domValue);\n    });\n    if (trim) {\n      addEventListener(el, \"change\", () => {\n        el.value = el.value.trim();\n      });\n    }\n    if (!lazy) {\n      addEventListener(el, \"compositionstart\", onCompositionStart);\n      addEventListener(el, \"compositionend\", onCompositionEnd);\n      addEventListener(el, \"change\", onCompositionEnd);\n    }\n  },\n  // set value on mounted so it's after min/max for type=\"range\"\n  mounted(el, { value }) {\n    el.value = value == null ? \"\" : value;\n  },\n  beforeUpdate(el, { value, oldValue, modifiers: { lazy, trim, number } }, vnode) {\n    el[assignKey] = getModelAssigner(vnode);\n    if (el.composing) return;\n    const elValue = (number || el.type === \"number\") && !/^0\\d/.test(el.value) ? looseToNumber(el.value) : el.value;\n    const newValue = value == null ? \"\" : value;\n    if (elValue === newValue) {\n      return;\n    }\n    if (document.activeElement === el && el.type !== \"range\") {\n      if (lazy && value === oldValue) {\n        return;\n      }\n      if (trim && el.value.trim() === newValue) {\n        return;\n      }\n    }\n    el.value = newValue;\n  }\n};\nconst vModelCheckbox = {\n  // #4096 array checkboxes need to be deep traversed\n  deep: true,\n  created(el, _, vnode) {\n    el[assignKey] = getModelAssigner(vnode);\n    addEventListener(el, \"change\", () => {\n      const modelValue = el._modelValue;\n      const elementValue = getValue(el);\n      const checked = el.checked;\n      const assign = el[assignKey];\n      if (isArray(modelValue)) {\n        const index = looseIndexOf(modelValue, elementValue);\n        const found = index !== -1;\n        if (checked && !found) {\n          assign(modelValue.concat(elementValue));\n        } else if (!checked && found) {\n          const filtered = [...modelValue];\n          filtered.splice(index, 1);\n          assign(filtered);\n        }\n      } else if (isSet(modelValue)) {\n        const cloned = new Set(modelValue);\n        if (checked) {\n          cloned.add(elementValue);\n        } else {\n          cloned.delete(elementValue);\n        }\n        assign(cloned);\n      } else {\n        assign(getCheckboxValue(el, checked));\n      }\n    });\n  },\n  // set initial checked on mount to wait for true-value/false-value\n  mounted: setChecked,\n  beforeUpdate(el, binding, vnode) {\n    el[assignKey] = getModelAssigner(vnode);\n    setChecked(el, binding, vnode);\n  }\n};\nfunction setChecked(el, { value, oldValue }, vnode) {\n  el._modelValue = value;\n  let checked;\n  if (isArray(value)) {\n    checked = looseIndexOf(value, vnode.props.value) > -1;\n  } else if (isSet(value)) {\n    checked = value.has(vnode.props.value);\n  } else {\n    if (value === oldValue) return;\n    checked = looseEqual(value, getCheckboxValue(el, true));\n  }\n  if (el.checked !== checked) {\n    el.checked = checked;\n  }\n}\nconst vModelRadio = {\n  created(el, { value }, vnode) {\n    el.checked = looseEqual(value, vnode.props.value);\n    el[assignKey] = getModelAssigner(vnode);\n    addEventListener(el, \"change\", () => {\n      el[assignKey](getValue(el));\n    });\n  },\n  beforeUpdate(el, { value, oldValue }, vnode) {\n    el[assignKey] = getModelAssigner(vnode);\n    if (value !== oldValue) {\n      el.checked = looseEqual(value, vnode.props.value);\n    }\n  }\n};\nconst vModelSelect = {\n  // <select multiple> value need to be deep traversed\n  deep: true,\n  created(el, { value, modifiers: { number } }, vnode) {\n    const isSetModel = isSet(value);\n    addEventListener(el, \"change\", () => {\n      const selectedVal = Array.prototype.filter.call(el.options, (o) => o.selected).map(\n        (o) => number ? looseToNumber(getValue(o)) : getValue(o)\n      );\n      el[assignKey](\n        el.multiple ? isSetModel ? new Set(selectedVal) : selectedVal : selectedVal[0]\n      );\n      el._assigning = true;\n      nextTick(() => {\n        el._assigning = false;\n      });\n    });\n    el[assignKey] = getModelAssigner(vnode);\n  },\n  // set value in mounted & updated because <select> relies on its children\n  // <option>s.\n  mounted(el, { value }) {\n    setSelected(el, value);\n  },\n  beforeUpdate(el, _binding, vnode) {\n    el[assignKey] = getModelAssigner(vnode);\n  },\n  updated(el, { value }) {\n    if (!el._assigning) {\n      setSelected(el, value);\n    }\n  }\n};\nfunction setSelected(el, value) {\n  const isMultiple = el.multiple;\n  const isArrayValue = isArray(value);\n  if (isMultiple && !isArrayValue && !isSet(value)) {\n    !!(process.env.NODE_ENV !== \"production\") && warn(\n      `<select multiple v-model> expects an Array or Set value for its binding, but got ${Object.prototype.toString.call(value).slice(8, -1)}.`\n    );\n    return;\n  }\n  for (let i = 0, l = el.options.length; i < l; i++) {\n    const option = el.options[i];\n    const optionValue = getValue(option);\n    if (isMultiple) {\n      if (isArrayValue) {\n        const optionType = typeof optionValue;\n        if (optionType === \"string\" || optionType === \"number\") {\n          option.selected = value.some((v) => String(v) === String(optionValue));\n        } else {\n          option.selected = looseIndexOf(value, optionValue) > -1;\n        }\n      } else {\n        option.selected = value.has(optionValue);\n      }\n    } else if (looseEqual(getValue(option), value)) {\n      if (el.selectedIndex !== i) el.selectedIndex = i;\n      return;\n    }\n  }\n  if (!isMultiple && el.selectedIndex !== -1) {\n    el.selectedIndex = -1;\n  }\n}\nfunction getValue(el) {\n  return \"_value\" in el ? el._value : el.value;\n}\nfunction getCheckboxValue(el, checked) {\n  const key = checked ? \"_trueValue\" : \"_falseValue\";\n  return key in el ? el[key] : checked;\n}\nconst vModelDynamic = {\n  created(el, binding, vnode) {\n    callModelHook(el, binding, vnode, null, \"created\");\n  },\n  mounted(el, binding, vnode) {\n    callModelHook(el, binding, vnode, null, \"mounted\");\n  },\n  beforeUpdate(el, binding, vnode, prevVNode) {\n    callModelHook(el, binding, vnode, prevVNode, \"beforeUpdate\");\n  },\n  updated(el, binding, vnode, prevVNode) {\n    callModelHook(el, binding, vnode, prevVNode, \"updated\");\n  }\n};\nfunction resolveDynamicModel(tagName, type) {\n  switch (tagName) {\n    case \"SELECT\":\n      return vModelSelect;\n    case \"TEXTAREA\":\n      return vModelText;\n    default:\n      switch (type) {\n        case \"checkbox\":\n          return vModelCheckbox;\n        case \"radio\":\n          return vModelRadio;\n        default:\n          return vModelText;\n      }\n  }\n}\nfunction callModelHook(el, binding, vnode, prevVNode, hook) {\n  const modelToUse = resolveDynamicModel(\n    el.tagName,\n    vnode.props && vnode.props.type\n  );\n  const fn = modelToUse[hook];\n  fn && fn(el, binding, vnode, prevVNode);\n}\nfunction initVModelForSSR() {\n  vModelText.getSSRProps = ({ value }) => ({ value });\n  vModelRadio.getSSRProps = ({ value }, vnode) => {\n    if (vnode.props && looseEqual(vnode.props.value, value)) {\n      return { checked: true };\n    }\n  };\n  vModelCheckbox.getSSRProps = ({ value }, vnode) => {\n    if (isArray(value)) {\n      if (vnode.props && looseIndexOf(value, vnode.props.value) > -1) {\n        return { checked: true };\n      }\n    } else if (isSet(value)) {\n      if (vnode.props && value.has(vnode.props.value)) {\n        return { checked: true };\n      }\n    } else if (value) {\n      return { checked: true };\n    }\n  };\n  vModelDynamic.getSSRProps = (binding, vnode) => {\n    if (typeof vnode.type !== \"string\") {\n      return;\n    }\n    const modelToUse = resolveDynamicModel(\n      // resolveDynamicModel expects an uppercase tag name, but vnode.type is lowercase\n      vnode.type.toUpperCase(),\n      vnode.props && vnode.props.type\n    );\n    if (modelToUse.getSSRProps) {\n      return modelToUse.getSSRProps(binding, vnode);\n    }\n  };\n}\n\nconst systemModifiers = [\"ctrl\", \"shift\", \"alt\", \"meta\"];\nconst modifierGuards = {\n  stop: (e) => e.stopPropagation(),\n  prevent: (e) => e.preventDefault(),\n  self: (e) => e.target !== e.currentTarget,\n  ctrl: (e) => !e.ctrlKey,\n  shift: (e) => !e.shiftKey,\n  alt: (e) => !e.altKey,\n  meta: (e) => !e.metaKey,\n  left: (e) => \"button\" in e && e.button !== 0,\n  middle: (e) => \"button\" in e && e.button !== 1,\n  right: (e) => \"button\" in e && e.button !== 2,\n  exact: (e, modifiers) => systemModifiers.some((m) => e[`${m}Key`] && !modifiers.includes(m))\n};\nconst withModifiers = (fn, modifiers) => {\n  const cache = fn._withMods || (fn._withMods = {});\n  const cacheKey = modifiers.join(\".\");\n  return cache[cacheKey] || (cache[cacheKey] = (event, ...args) => {\n    for (let i = 0; i < modifiers.length; i++) {\n      const guard = modifierGuards[modifiers[i]];\n      if (guard && guard(event, modifiers)) return;\n    }\n    return fn(event, ...args);\n  });\n};\nconst keyNames = {\n  esc: \"escape\",\n  space: \" \",\n  up: \"arrow-up\",\n  left: \"arrow-left\",\n  right: \"arrow-right\",\n  down: \"arrow-down\",\n  delete: \"backspace\"\n};\nconst withKeys = (fn, modifiers) => {\n  const cache = fn._withKeys || (fn._withKeys = {});\n  const cacheKey = modifiers.join(\".\");\n  return cache[cacheKey] || (cache[cacheKey] = (event) => {\n    if (!(\"key\" in event)) {\n      return;\n    }\n    const eventKey = hyphenate(event.key);\n    if (modifiers.some(\n      (k) => k === eventKey || keyNames[k] === eventKey\n    )) {\n      return fn(event);\n    }\n  });\n};\n\nconst rendererOptions = /* @__PURE__ */ extend({ patchProp }, nodeOps);\nlet renderer;\nlet enabledHydration = false;\nfunction ensureRenderer() {\n  return renderer || (renderer = createRenderer(rendererOptions));\n}\nfunction ensureHydrationRenderer() {\n  renderer = enabledHydration ? renderer : createHydrationRenderer(rendererOptions);\n  enabledHydration = true;\n  return renderer;\n}\nconst render = (...args) => {\n  ensureRenderer().render(...args);\n};\nconst hydrate = (...args) => {\n  ensureHydrationRenderer().hydrate(...args);\n};\nconst createApp = (...args) => {\n  const app = ensureRenderer().createApp(...args);\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    injectNativeTagCheck(app);\n    injectCompilerOptionsCheck(app);\n  }\n  const { mount } = app;\n  app.mount = (containerOrSelector) => {\n    const container = normalizeContainer(containerOrSelector);\n    if (!container) return;\n    const component = app._component;\n    if (!isFunction(component) && !component.render && !component.template) {\n      component.template = container.innerHTML;\n    }\n    if (container.nodeType === 1) {\n      container.textContent = \"\";\n    }\n    const proxy = mount(container, false, resolveRootNamespace(container));\n    if (container instanceof Element) {\n      container.removeAttribute(\"v-cloak\");\n      container.setAttribute(\"data-v-app\", \"\");\n    }\n    return proxy;\n  };\n  return app;\n};\nconst createSSRApp = (...args) => {\n  const app = ensureHydrationRenderer().createApp(...args);\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    injectNativeTagCheck(app);\n    injectCompilerOptionsCheck(app);\n  }\n  const { mount } = app;\n  app.mount = (containerOrSelector) => {\n    const container = normalizeContainer(containerOrSelector);\n    if (container) {\n      return mount(container, true, resolveRootNamespace(container));\n    }\n  };\n  return app;\n};\nfunction resolveRootNamespace(container) {\n  if (container instanceof SVGElement) {\n    return \"svg\";\n  }\n  if (typeof MathMLElement === \"function\" && container instanceof MathMLElement) {\n    return \"mathml\";\n  }\n}\nfunction injectNativeTagCheck(app) {\n  Object.defineProperty(app.config, \"isNativeTag\", {\n    value: (tag) => isHTMLTag(tag) || isSVGTag(tag) || isMathMLTag(tag),\n    writable: false\n  });\n}\nfunction injectCompilerOptionsCheck(app) {\n  if (isRuntimeOnly()) {\n    const isCustomElement = app.config.isCustomElement;\n    Object.defineProperty(app.config, \"isCustomElement\", {\n      get() {\n        return isCustomElement;\n      },\n      set() {\n        warn(\n          `The \\`isCustomElement\\` config option is deprecated. Use \\`compilerOptions.isCustomElement\\` instead.`\n        );\n      }\n    });\n    const compilerOptions = app.config.compilerOptions;\n    const msg = `The \\`compilerOptions\\` config option is only respected when using a build of Vue.js that includes the runtime compiler (aka \"full build\"). Since you are using the runtime-only build, \\`compilerOptions\\` must be passed to \\`@vue/compiler-dom\\` in the build setup instead.\n- For vue-loader: pass it via vue-loader's \\`compilerOptions\\` loader option.\n- For vue-cli: see https://cli.vuejs.org/guide/webpack.html#modifying-options-of-a-loader\n- For vite: pass it via @vitejs/plugin-vue options. See https://github.com/vitejs/vite-plugin-vue/tree/main/packages/plugin-vue#example-for-passing-options-to-vuecompiler-sfc`;\n    Object.defineProperty(app.config, \"compilerOptions\", {\n      get() {\n        warn(msg);\n        return compilerOptions;\n      },\n      set() {\n        warn(msg);\n      }\n    });\n  }\n}\nfunction normalizeContainer(container) {\n  if (isString(container)) {\n    const res = document.querySelector(container);\n    if (!!(process.env.NODE_ENV !== \"production\") && !res) {\n      warn(\n        `Failed to mount app: mount target selector \"${container}\" returned null.`\n      );\n    }\n    return res;\n  }\n  if (!!(process.env.NODE_ENV !== \"production\") && window.ShadowRoot && container instanceof window.ShadowRoot && container.mode === \"closed\") {\n    warn(\n      `mounting on a ShadowRoot with \\`{mode: \"closed\"}\\` may lead to unpredictable bugs`\n    );\n  }\n  return container;\n}\nlet ssrDirectiveInitialized = false;\nconst initDirectivesForSSR = () => {\n  if (!ssrDirectiveInitialized) {\n    ssrDirectiveInitialized = true;\n    initVModelForSSR();\n    initVShowForSSR();\n  }\n} ;\n\nexport { Transition, TransitionGroup, VueElement, createApp, createSSRApp, defineCustomElement, defineSSRCustomElement, hydrate, initDirectivesForSSR, render, useCssModule, useCssVars, useHost, useShadowRoot, vModelCheckbox, vModelDynamic, vModelRadio, vModelSelect, vModelText, vShow, withKeys, withModifiers };\n","var UNKNOWN_FUNCTION = '<unknown>';\n/**\n * This parses the different stack traces and puts them into one format\n * This borrows heavily from TraceKit (https://github.com/csnover/TraceKit)\n */\n\nfunction parse(stackString) {\n  var lines = stackString.split('\\n');\n  return lines.reduce(function (stack, line) {\n    var parseResult = parseChrome(line) || parseWinjs(line) || parseGecko(line) || parseNode(line) || parseJSC(line);\n\n    if (parseResult) {\n      stack.push(parseResult);\n    }\n\n    return stack;\n  }, []);\n}\nvar chromeRe = /^\\s*at (.*?) ?\\(((?:file|https?|blob|chrome-extension|native|eval|webpack|rsc|<anonymous>|\\/|[a-z]:\\\\|\\\\\\\\).*?)(?::(\\d+))?(?::(\\d+))?\\)?\\s*$/i;\nvar chromeEvalRe = /\\((\\S*)(?::(\\d+))(?::(\\d+))\\)/;\n\nfunction parseChrome(line) {\n  var parts = chromeRe.exec(line);\n\n  if (!parts) {\n    return null;\n  }\n\n  var isNative = parts[2] && parts[2].indexOf('native') === 0; // start of line\n\n  var isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line\n\n  var submatch = chromeEvalRe.exec(parts[2]);\n\n  if (isEval && submatch != null) {\n    // throw out eval line/column and use top-most line/column number\n    parts[2] = submatch[1]; // url\n\n    parts[3] = submatch[2]; // line\n\n    parts[4] = submatch[3]; // column\n  }\n\n  return {\n    file: !isNative ? parts[2] : null,\n    methodName: parts[1] || UNKNOWN_FUNCTION,\n    arguments: isNative ? [parts[2]] : [],\n    lineNumber: parts[3] ? +parts[3] : null,\n    column: parts[4] ? +parts[4] : null\n  };\n}\n\nvar winjsRe = /^\\s*at (?:((?:\\[object object\\])?.+) )?\\(?((?:file|ms-appx|https?|webpack|rsc|blob):.*?):(\\d+)(?::(\\d+))?\\)?\\s*$/i;\n\nfunction parseWinjs(line) {\n  var parts = winjsRe.exec(line);\n\n  if (!parts) {\n    return null;\n  }\n\n  return {\n    file: parts[2],\n    methodName: parts[1] || UNKNOWN_FUNCTION,\n    arguments: [],\n    lineNumber: +parts[3],\n    column: parts[4] ? +parts[4] : null\n  };\n}\n\nvar geckoRe = /^\\s*(.*?)(?:\\((.*?)\\))?(?:^|@)((?:file|https?|blob|chrome|webpack|rsc|resource|\\[native).*?|[^@]*bundle)(?::(\\d+))?(?::(\\d+))?\\s*$/i;\nvar geckoEvalRe = /(\\S+) line (\\d+)(?: > eval line \\d+)* > eval/i;\n\nfunction parseGecko(line) {\n  var parts = geckoRe.exec(line);\n\n  if (!parts) {\n    return null;\n  }\n\n  var isEval = parts[3] && parts[3].indexOf(' > eval') > -1;\n  var submatch = geckoEvalRe.exec(parts[3]);\n\n  if (isEval && submatch != null) {\n    // throw out eval line/column and use top-most line number\n    parts[3] = submatch[1];\n    parts[4] = submatch[2];\n    parts[5] = null; // no column when eval\n  }\n\n  return {\n    file: parts[3],\n    methodName: parts[1] || UNKNOWN_FUNCTION,\n    arguments: parts[2] ? parts[2].split(',') : [],\n    lineNumber: parts[4] ? +parts[4] : null,\n    column: parts[5] ? +parts[5] : null\n  };\n}\n\nvar javaScriptCoreRe = /^\\s*(?:([^@]*)(?:\\((.*?)\\))?@)?(\\S.*?):(\\d+)(?::(\\d+))?\\s*$/i;\n\nfunction parseJSC(line) {\n  var parts = javaScriptCoreRe.exec(line);\n\n  if (!parts) {\n    return null;\n  }\n\n  return {\n    file: parts[3],\n    methodName: parts[1] || UNKNOWN_FUNCTION,\n    arguments: [],\n    lineNumber: +parts[4],\n    column: parts[5] ? +parts[5] : null\n  };\n}\n\nvar nodeRe = /^\\s*at (?:((?:\\[object object\\])?[^\\\\/]+(?: \\[as \\S+\\])?) )?\\(?(.*?):(\\d+)(?::(\\d+))?\\)?\\s*$/i;\n\nfunction parseNode(line) {\n  var parts = nodeRe.exec(line);\n\n  if (!parts) {\n    return null;\n  }\n\n  return {\n    file: parts[2],\n    methodName: parts[1] || UNKNOWN_FUNCTION,\n    arguments: [],\n    lineNumber: +parts[3],\n    column: parts[4] ? +parts[4] : null\n  };\n}\n\nexport { parse };\n","import * as stacktrace_parser from \"stacktrace-parser\";\n\nexport type StackTraceItem = {\n  filename: string;\n  line: number;\n  col: number;\n  func: string;\n};\n\nexport type StackTrace = StackTraceItem[];\n\nexport function parseTrace(e: Error): StackTrace {\n  if (!e?.stack)\n    return [];\n\n  const trace = stacktrace_parser.parse(e.stack);\n  return trace.map(i => ({ filename: i.file || \"\", line: i.lineNumber || 1, col: i.column || 1, func: (i.methodName || \"\") }));\n}\n\nexport function getStackTrace(): StackTrace {\n  return parseTrace(new Error()).slice(1);\n}\n\nexport function formatTrace(trace: StackTraceItem[]): string {\n  return trace.map(e =>\n    `    at ${e.func} (${e.filename}:${e.line}:${e.col})`).join(\"\\n\");\n}\n\nexport function prependStackTrace(error: Error, trace: StackTrace) {\n  if (!error.stack)\n    return; //no stack to manipulate\n\n  const stacklines = error.stack?.split(\"\\n\") || [];\n  const tracelines = formatTrace(trace);\n  error.stack = (stacklines[0] ? stacklines[0] + \"\\n\" : \"\") + tracelines + '\\n' + (stacklines.slice(1).join(\"\\n\"));\n  return error;\n}\n","// This gets TypeScript to refer to us by our @webhare/... name in auto imports:\ndeclare module \"@webhare/rpc\" {\n  export interface KnownRPCServices {\n    /* Filled by generated services.ts files */\n  }\n}\n\nimport { debugFlags, backendBase } from \"@webhare/env\";\nimport { type StackTrace, parseTrace, prependStackTrace, type PromisifyFunctionReturnType } from \"@webhare/js-api-tools\";\nimport { omit, parseTyped, stringify } from \"@webhare/std\";\n\n//Preload interface definitions. To solve this cleaner we would have to do some sort of auto-inject but how to robustly do that accross IDEs/Tscs ?\n\n//@ts-ignore Ignore if it doesn't exist. this line *must* remain a @ts-ignore\nimport type { } from \"@mod-platform/generated/ts/services.ts\";\n//@ts-ignore Ignore if it doesn't exist. this line *must* remain a @ts-ignore\nimport type { } from \"wh:ts/services.ts\";\n\nfunction isAbsolute(url: string) {\n  return url.startsWith(\"http:\") || url.startsWith(\"https:\");\n}\n\nfunction getBaseURL() {\n  if (!backendBase)\n    throw new Error(`You must set the baseUrl option when using the RPC Client outside Webhare`);\n  return isAbsolute(backendBase) ? backendBase : new URL(backendBase, location.origin);\n}\n\nexport interface RPCClientOptions {\n  /** Custom request update. Use to eg. set keepalive or add debug variables to the URL */\n  onBeforeRequest?: (url: URL, requestInit: RequestInit & { headers: Headers }) => void;\n  /** Response callback. Use this if you need to capture details on the incoming respones. May be invoked multiple times per request, eg due to 429 errors! */\n  onResponse?: (response: Response) => void;\n  /** Call timeout */\n  timeout?: number;\n  /** Abort signal to cancel the RPC */\n  signal?: AbortSignal;\n  /** Retry on 429 */\n  retry429?: boolean;\n  /** Silent - do not log errors */\n  silent?: boolean;\n  /** Debug (Follows 'rpc' debugflag if not explicity specified) */\n  debug?: boolean;\n  /** Headers to submit (Eg Authorization) */\n  headers?: Record<string, string>;\n  /** Base URL for service paths */\n  baseUrl?: string;\n}\n\n/** RPC Response format */\nexport type RPCResponse = ({\n  /** Result. Not present if the function didn't return anything */\n  result?: unknown;\n} | {\n  /** Error message */\n  error: string;\n  /** Captured stack trace (if 'etr' debugFlag is set) */\n  trace?: StackTrace;\n}) & {\n  /** Captured console log entries (if 'etr' debugFlag is set) */\n  consoleLog?: Array<{\n    //TODO this is Serialized<ConsoleLogItem[]> - should probably rename it to SerializedToJSON and move to std or env ?\n    /** Date when console function was called */\n    when: string;\n    /** `console` method that was called (eg 'log') */\n    method: string;\n    /** Logged data */\n    data: string;\n    /** Location of caller */\n    location?: {\n      filename: string;\n      line: number;\n      col: number;\n      func: string;\n    };\n    /** Codecontext */\n    codeContextId?: string;\n  }>;\n};\n\nclass ControlledCall {\n  client: RPCClient;\n  options: RPCClientOptions;\n  abortcontroller?: AbortController;\n  timeout?: number;\n  _callurl: string;\n  _fetchoptions: RequestInit;\n  promise: Promise<unknown>;\n  timedout?: boolean;\n  aborted?: boolean;\n\n  constructor(client: RPCClient, method: string, stack: StackTrace | null, options: RPCClientOptions, callurl: URL, fetchoptions: RequestInit) {\n    this.client = client;\n    this.options = options;\n\n    if (options.timeout || options.signal) {\n      this.abortcontroller = new AbortController;\n      fetchoptions.signal = this.abortcontroller.signal;\n\n      if (options.timeout && options.timeout > 0) {\n        this.timeout = options.timeout;\n        setTimeout(() => this._handleTimeout(), options.timeout);\n      }\n      if (options.signal) {\n        options.signal.addEventListener(\"abort\", () => this._abort());\n      }\n    }\n\n    this._callurl = callurl.toString();\n    this._fetchoptions = fetchoptions;\n\n    const fetchpromise = fetch(this._callurl, this._fetchoptions);\n    this.promise = this._completeCall(method, stack, fetchpromise) as Promise<unknown>;\n  }\n  _handleTimeout() {\n    this.timedout = true;\n    this.abortcontroller?.abort();\n  }\n  _abort() {\n    this.aborted = true;\n    this.abortcontroller?.abort();\n  }\n\n  async _completeCall(method: string, requestStack: StackTrace | null, fetchpromise: Promise<Response>) {\n    let response;\n    for (; ;) { //loop to handle \"429 Conflict\"s\n      try { //we should only guard the fetch call and specifically *not* the onResponse callback\n        response = await fetchpromise;\n      } catch (exception) {\n        if (this.client.debug)\n          console.log(`[rpc] Exception invoking '${method}'`, exception);\n\n        if (this.aborted)\n          throw new Error(`RPC Aborted`);\n        else if (this.timedout)\n          throw new Error(`RPC Timeout: timeout was set to ${this.timeout} milliseconds`);\n        else\n          throw new Error(`RPC Failed: exception: ` + exception);\n      }\n\n      this.options.onResponse?.(response); //allow hooks to capture headers\n\n      if (response.status === 429 && !(\"retry429\" in this.options && !this.options.retry429) && response.headers.get(\"Retry-After\")) {\n        const retryafter = parseInt(response.headers.get(\"Retry-After\") || \"\");\n        if (this.client.debug)\n          console.warn(`[rpc] We are being throttled (429 Too Many Requests) - retrying after ${retryafter} seconds`);\n\n        await new Promise(resolve => setTimeout(resolve, retryafter * 1000));\n        fetchpromise = fetch(this._callurl, this._fetchoptions);\n        continue;\n      }\n      break;\n    }\n\n    let jsonresponse: RPCResponse;\n    try {\n      jsonresponse = parseTyped(await response.text());\n      if (jsonresponse.consoleLog) {\n        for (const logitem of jsonresponse.consoleLog) {\n          //should we log 'when'? it's getting more and more noisy then though....\n          //TODO should we match the remote's method (after validating) or just keep everything at 'log' ?\n          console.log(`[remote:${logitem.method}] ${logitem.location ? `${logitem.location.filename.split(\"/\").at(-1)}:${logitem.location.line}: ` : ''}${logitem.data}`);\n        }\n      }\n\n      if (this.client.debug)\n        console.log(`[rpc] Received response to '${method}'`, omit(jsonresponse, [\"consoleLog\", \"trace\"]));\n    } catch (exception) {\n      if (this.client.debug)\n        console.warn(`[rpc] Response was not valid JSON`, exception);\n      throw new Error(\"RPC Failed: Invalid response received\", { cause: exception });\n    }\n\n    if (\"error\" in jsonresponse) {\n      const err = new Error(`RPC Error: ${jsonresponse.error}`);\n      if (jsonresponse.trace) {\n        try {\n          prependStackTrace(err, jsonresponse.trace);\n        } catch (err2) {\n          //ignore stacktrace manipulation error\n        }\n      }\n\n      if (this.options.debug) {\n        console.group();\n        console.warn(\"RPC failed:\", err);\n        if (requestStack) {\n          console.warn(\"Stack at calling point\");\n          console.log(requestStack);\n        }\n        console.groupEnd();\n      }\n\n      throw err;\n    }\n\n    return jsonresponse.result;\n  }\n}\n\nclass RPCClient {\n  readonly url: string;\n  options: RPCClientOptions;\n\n  constructor(url: string, options?: RPCClientOptions) {\n    this.url = url;\n    this.options = {\n      timeout: 0,\n      debug: false,\n      ...options\n    };\n  }\n\n  get debug() {\n    return this.options.debug || debugFlags.rpc;\n  }\n\n  _tryLogError(requestStack: StackTrace | null, error: Error) {\n  }\n\n  invoke(method: string, params: unknown[]) {\n    //build the URL, add profiling and function parameters where needed\n    //We'll delay the baseurl calculation until the first call to allow for the backendBase to be set up\n    const callurl = isAbsolute(this.url) ? new URL(this.url + method) : new URL(this.url + method, this.options.baseUrl || getBaseURL());\n\n    let requestStack: StackTrace | null = null;\n\n    const fetchoptions: RequestInit & { headers: Headers } = {\n      method: \"POST\",\n      headers: new Headers({\n        \"Accept\": \"application/json\",\n        \"Content-Type\": \"application/json; charset=utf-8\",\n        ...this.options.headers\n      }),\n      body: stringify(params, { typed: true }),\n    };\n\n    if (typeof location !== \"undefined\")\n      callurl.searchParams.set(\"pathname\", location.pathname);\n\n    if (this.debug) {\n      requestStack = parseTrace(new Error);\n      console.log(`[rpc] Invoking '${method}'`, params);\n    }\n\n    this.options.onBeforeRequest?.(callurl, fetchoptions);\n    return new ControlledCall(this, method, requestStack, this.options, callurl, fetchoptions).promise;\n  }\n}\n\ntype ServiceBase<T> = {\n  withOptions(options: RPCClientOptions): T & ServiceBase<T>;\n};\n\nclass ServiceProxy<Service extends keyof KnownRPCServices | object> {\n  client: RPCClient;\n\n  constructor(client: RPCClient) {\n    this.client = client;\n  }\n\n  get(target: object, prop: string, receiver: unknown) {\n    if ([\"then\", \"catch\", \"finally\"].includes(prop)) //do not appear like our object is a promise\n      return undefined;\n\n    if (prop === 'withOptions') { //create a withOptions function\n      return (options: RPCClientOptions) => {\n        const newoptions = {\n          ...this.client.options,\n          ...options,\n          headers: { ...this.client.options.headers, ...options.headers }\n        };\n        return rpc(this.client.url as (Service extends keyof KnownRPCServices ? Service : string), newoptions);\n      };\n    }\n\n    return (...args: unknown[]) => this.client.invoke(prop, args);\n  }\n}\n\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- need any to not worry about the actual first arg\ntype OmitFirstArg<F> = F extends (x: any, ...args: infer P) => infer R ? (...args: P) => R : never;\n\nexport type OmitRPCContextArgs<ServiceType> = {\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any -- need any to not worry about the actual first arg\n  [K in keyof ServiceType as ServiceType[K] extends (...a: any) => any ? K : never]: ServiceType[K] extends (...a: any[]) => void ? OmitFirstArg<ServiceType[K]> : never;\n};\n\n/** Creates an async version of the functions in a class, removes context parameters\n * @typeParam ServiceType - Type definition of the service class that implements this service.\n*/\ntype ConvertToRPCInterface<ServiceType> = {\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any -- using any is needed for this type definition\n  [K in keyof ServiceType as ServiceType[K] extends (...a: any) => any ? K : never]: ServiceType[K] extends (...a: any[]) => void ? PromisifyFunctionReturnType<ServiceType[K]> : never;\n};\n\ntype ExtractInterface<Service extends object> = ConvertToRPCInterface<Service> & ServiceBase<ConvertToRPCInterface<Service>>;\n\n/** Get the client interface type as would be returned by createClient\n * @typeParam Service - either the `module:service` name or the interface to implement. If you want to pass the implementation's type you should wrap it into `OmitRPCContextArgs`.\n*/\nexport type GetRPCClientInterface<Service extends (keyof KnownRPCServices) | object> = Service extends keyof KnownRPCServices ? ExtractInterface<OmitRPCContextArgs<KnownRPCServices[Service]>> : Service extends object ? ExtractInterface<Service> : never;\n\n/** Create a WebHare RPC client\n  @param service - URL (https://<ORIGIN>/.wh/rpc/module/service/) or service name (module:service) to invoke\n*/\nexport function rpc<Service extends keyof KnownRPCServices>(service: Service extends keyof KnownRPCServices ? Service : string, options?: RPCClientOptions): GetRPCClientInterface<Service>;\nexport function rpc<Service extends object>(service: Service extends keyof KnownRPCServices ? Service : string, options?: RPCClientOptions): GetRPCClientInterface<Service>;\n\nexport function rpc<Service extends keyof KnownRPCServices | object>(service: Service extends keyof KnownRPCServices ? Service : string, options?: RPCClientOptions): GetRPCClientInterface<Service> {\n  //NOTE: needed the separate overloads to get Intellisense to list the known services for createRPClient's first argument\n\n  if (!service)\n    throw new Error(`You must specify either a WebHare rpcService name or a full URL`);\n\n  const servicematch = service.match(/^([a-z0-9_]+):([a-z0-9_]+)$/);\n  if (servicematch)\n    service = `/.wh/rpc/${servicematch[1]}/${servicematch[2]}/` as (Service extends keyof KnownRPCServices ? Service : string);\n  else if (!service.endsWith('/'))\n    throw new Error(`Service URL must end in a slash`);\n\n  const rpcclient = new RPCClient(service, options);\n  return new Proxy({}, new ServiceProxy<GetRPCClientInterface<Service>>(rpcclient)) as GetRPCClientInterface<Service>;\n}\n","import type { NavigateInstruction } from \"@webhare/env\";\n\n/** Login failure reasons that can also be used by custom isLoginDenied checks */\nexport type LoginErrorCode = \"internal-error\" | \"incorrect-login-password\" | \"incorrect-email-password\" | \"account-disabled\" | \"unknown-account\" | \"require-external-login\";\n\n/** Login reasons that require further client side work but are not errors per-se */\nexport type LoginIncompleteCode = \"totp\" | \"incomplete-account\";\n\nexport type LoginTweaks = {\n  /** Limit session duration (development servers only) */\n  limitExpiry?: number;\n  /** Language code */\n  lang?: string;\n};\n\nexport type LoginResult = {\n  loggedIn: boolean;\n  navigateTo: NavigateInstruction;\n} | {\n  loggedIn: false;\n  code: LoginErrorCode;\n  error?: string;\n};\n\nexport type LogoutResult = { success: true } | {\n  error: string;\n  code: LoginErrorCode | LoginIncompleteCode;\n};\n\nexport const PublicCookieSuffix = \"_publicauthdata\";\n\n/* APIs and types shared between the client and server */\nexport function getCompleteAccountNavigation(token: string, pathname: string): NavigateInstruction {\n  return {\n    type: \"redirect\", //TODO or use a \"form\" too? went for a session now as an excursion to followup GET pages is much more likely in this procedure than with totp\n    url: \"/.wh/common/authpages/?wrd_pwdaction=completeaccount&token=\" + encodeURIComponent(token || '') + \"&pathname=\" + encodeURIComponent(pathname)\n  };\n}\n","import { createClient } from \"@webhare/jsonrpc-client\";\nimport { type NavigateInstruction, navigateTo } from \"@webhare/env\";\nimport * as dompack from '@webhare/dompack';\nimport type { LoginOptions } from \"@webhare/auth/src/identity\";\nimport { rpc } from \"@webhare/rpc\";\n\n//NOTE: Do *NOT* load @webhare/frontend or we enforce the new CSS reset!\nimport { getFrontendData } from '@webhare/frontend/src/init';\nimport { PublicCookieSuffix, type LoginErrorCode, type LoginResult, type LoginTweaks } from \"@webhare/auth/src/shared\";\nimport { parseTyped, toSnakeCase, type ToSnakeCase } from \"@webhare/std\";\nimport type WRDAuthenticationProvider from \"@mod-wrd/js/auth\";\nimport type { OAuth2PromptFlag } from \"@webhare/auth/src/oauth2-client\";\n\n/** WRDAuth configuration */\nexport interface WRDAuthOptions {\n  /** Callback that is invoked after a succesful login. If not set the page will be reloaded. */\n  onLogin?: () => Promise<void> | void;\n}\n\nexport interface PublicAuthData {\n  expiresMs: number;\n  userInfo?: object | null;\n  persistent?: boolean;\n}\n\ndeclare module \"@webhare/frontend\" {\n  interface FrontendDataTypes {\n    \"wrd:auth\": {\n      /** WRDAuth cookiename (used to store userinfo and expiry) */\n      cookiename: string;\n    };\n  }\n}\n\ndeclare global {\n  interface Window {\n    $wh$legacyAuthProvider: WRDAuthenticationProvider;\n    triggerWebHareSSO?: (tag: string, options?: SSOLoginOptions) => Promise<void>;\n  }\n}\n\n/** Current authoptions. undefined if setupWRDAuth hasn't been invoked yet */\nlet authOptions: WRDAuthOptions | undefined;\n\n/** Get current login cookie. If empty, wrdauth is not initialized here */\nfunction getCookieName(): string | null {\n  const settings = getFrontendData(\"wrd:auth\", { allowMissing: true });\n  return settings?.cookiename || null;\n}\n\nfunction getAuthLocalData(): PublicAuthData | null {\n  const c = getCookieName();\n  if (!c)\n    return null;\n\n  try {\n    return parseTyped(dompack.getCookie(c + PublicCookieSuffix)!) as PublicAuthData;\n  } catch {\n    return null;\n  }\n}\n\nasync function submitLoginForm(node: HTMLFormElement, event: SubmitEvent) {\n  if (node.propWhFormhandler)\n    return; //already handled by publisher forms so we'll defer to that\n  dompack.stop(event);\n\n  const username = (node.elements.namedItem(\"login\") as HTMLInputElement)?.value;\n  const password = (node.elements.namedItem(\"password\") as HTMLInputElement)?.value;\n  const site = (node.elements.namedItem(\"site\") as HTMLInputElement)?.value || undefined;\n  const returnto = (node.elements.namedItem(\"returnto\") as HTMLInputElement)?.value || undefined;\n  const persistentlogin = (node.elements.namedItem(\"persistent\") as HTMLInputElement)?.checked;\n  if (!login || !password)\n    throw new Error(`submitLoginForm: required elements login/password not set or missing`);\n\n  using lock = dompack.flagUIBusy({ modal: true });\n  void (lock);\n\n  const loginresult = await login(username, password, {\n    persistent: persistentlogin,\n    site,\n    returnTo: returnto ? new URL(returnto, location.href).toString() : location.href.split('#')[0]\n  });\n  if (loginresult.loggedIn) {\n    refreshLoginStatus();\n    if (loginresult.navigateTo.type === \"redirect\" && loginresult.navigateTo.url.split('#')[0] === location.href.split('#')[0]  //stay on same page\n      && authOptions?.onLogin) {\n\n      if (loginresult.navigateTo.url.includes('#')) //execute any #hash instruction\n        history.replaceState(null, \"\", loginresult.navigateTo.url.substring(loginresult.navigateTo.url.indexOf('#')));\n\n      await authOptions.onLogin();\n    } else {\n      //Reload the page to get the new login status - TODO put this behind a 'login state change' event and allow users to cancel it if they can deal with login/logout on-page\n      console.log(\"Post login redirect\", loginresult.navigateTo);\n      navigateTo(loginresult.navigateTo);\n    }\n  } else if (\"navigateTo\" in loginresult) {\n    console.log(\"Login incomplete, redirecting to\", loginresult.navigateTo);\n    navigateTo(loginresult.navigateTo);\n  } else\n    failLogin(loginresult.error ?? loginresult.code, { code: loginresult.code, data: \"\" }, node); //FIXME restore the code & data members from old wrdauth\n}\n\nfunction refreshLoginStatus() {\n  const loggedIn = isLoggedIn();\n  document.documentElement.classList.toggle(\"wh-wrdauth--isloggedin\", loggedIn);\n\n  window.$wh$legacyAuthProvider?.refresh();\n}\n\n/** Return whether a user's currently logged in */\nexport function isLoggedIn(): boolean {\n  return (getAuthLocalData()?.expiresMs || 0) > Date.now();\n}\n\n/** Setup WRDAuth frontend integration */\nexport function setupWRDAuth(options?: WRDAuthOptions) {\n  if (authOptions)\n    throw new Error(`Duplicate setupWRDAuth call`);\n\n  authOptions = { ...options };\n\n  dompack.register<HTMLFormElement>('form.wh-wrdauth__loginform,form.wh-wrdauth-login__form', node => {\n    node.setAttribute(\"data-wh-wrdauth-attached\", \"\");\n    dompack.addDocEventListener(node, \"submit\", evt => submitLoginForm(node, evt));\n  });\n  dompack.register('.wh-wrdauth__logout', node => {\n    function handleLogoutClick(event: Event) {\n      dompack.stop(event);\n\n      //letting rejections escape - our trigger is generally setup in HTML so there's nothing to catch but uncaught rejection handlers anyway\n      if (node instanceof HTMLAnchorElement && node.href && node.href.split('#')[0] !== location.href.split('#')[0]) { //logout link sending you elsewhere\n        void doLogout().then(() => {\n          console.log(\"Logout complete, redirecting to\", node.href);\n          navigateTo({ type: \"redirect\", url: node.href });\n        });\n      } else {\n        void logout(); //TODO what if the logout only changed the anchor? but what's the usecase for that?\n      }\n    }\n\n    dompack.addDocEventListener(node, \"click\", event => handleLogoutClick(event));\n  });\n\n  dompack.onDomReady(() => {\n    if (\"$wh$wrdauth\" in window) {\n      console.error(\"Both setupWRDAuth from @webhare/frontend and @mod-wrd/js/auth are present in this page. Mixing these is not supported!\");\n    }\n  });\n\n  refreshLoginStatus();\n}\n\nfunction failLogin(message: string, response: { code: LoginErrorCode; data: string }, form: HTMLFormElement) {\n  const evtdetail = {\n    message: message,\n    code: response.code,\n    data: response.data\n  };\n\n  const cancelled = !dompack.dispatchCustomEvent(form || document.documentElement, \"wh:wrdauth-loginfailed\", { bubbles: true, cancelable: true, detail: evtdetail });\n  if (!cancelled) {\n    //TODO depending on error we may need to change a different field?\n    const loginfield = dompack.qR<HTMLInputElement>(form, \"input[name=password]\");\n    loginfield.setCustomValidity(message);\n    // loginfield.reportValidity(); //this actually blocks wh-form error handling from showing the error in-page when so desired\n    loginfield.focus();\n  }\n}\n\n/** Retrieve userinfo if set by onFrontendUserInfo in your WRDAuth customizer */\nexport function getUserInfo<T extends object = object>(): T | null {\n  return isLoggedIn() ? getAuthLocalData()?.userInfo as T | null : null;\n}\n\nfunction getLoginTweaks(): LoginTweaks {\n  const tweaks: LoginTweaks = {\n    lang: dompack.getLang().tag\n  };\n\n  const urlvars = new URL(location.href);\n  if (urlvars.searchParams.has(\"wrdauth_limit_expiry\"))\n    tweaks.limitExpiry = parseInt(urlvars.searchParams.get(\"wrdauth_limit_expiry\") || '0') || undefined;\n\n  return tweaks;\n}\n\n/** Implements the common username/password flows */\nexport async function login(username: string, password: string, options: LoginOptions = {}): Promise<LoginResult> {\n  const cookieName = getCookieName();\n  if (!cookieName)\n    throw new Error(\"WRDAuth not initialized, please call setupWRDAuth first and ensure this page has a <wrdauth> rule\");\n\n  const result = await rpc(\"platform:authservice\").login(username, password, cookieName, dompack.getBrowser().triplet, { ...options, ...getLoginTweaks() });\n  if (result.loggedIn && !getAuthLocalData())\n    throw new Error(\"Login succeeded but no auth data was set in the cookie\");\n\n  return result;\n}\n\n/** Execute and verify cookie clearance to prepare for logging out */\nasync function doLogout() {\n  const cookieName = getCookieName();\n  if (!cookieName)\n    throw new Error(\"WRDAuth not initialized, please call setupWRDAuth first and ensure this page has a <wrdauth> rule\");\n\n  await rpc(\"platform:authservice\").logout(cookieName, dompack.getBrowser().triplet);\n\n  if (getAuthLocalData())\n    throw new Error(\"Logged out but we still have auth data in the cookie\");\n}\n\n/** Logout the current user */\nexport async function logout() {\n  await doLogout();\n  console.log(\"Reloading to process the new logged out status\");\n  navigateTo({ type: \"reload\" }); //TODO put this behind a 'login state change' event\n}\n\nexport interface MyService {\n  startLogin2(urlpath: string, tag: string, options: ToSnakeCase<SSOLoginOptions>): Promise<NavigateInstruction>;\n}\n\ninterface SSOLoginOptions {\n  /** @deprecated use prompt: \"none\" from WH6.0 up */\n  passive?: boolean;\n  /** Set the prompt flag for the authorize request */\n  prompt?: OAuth2PromptFlag;\n}\n\nexport function startSSOLogin(tag: string, options?: SSOLoginOptions): Promise<void> {\n  const client = createClient<MyService>(\"wrd:auth\");\n\n  if (options?.passive)\n    options = { prompt: \"none\", ...options, passive: undefined }; //force prompt to none in passive mode, and remove the passive flag since it doesn't mean anything to the server\n\n  const defer = Promise.withResolvers<void>();\n\n  //Launch SSO login for the current page.\n  //TODO also pass getLoginTweaks() at least to OIDC logins as soon as we've ported this to authservice\n  client.startLogin2(location.pathname + location.search + location.hash, tag, toSnakeCase(options) || {}).then(instr => {\n    //we leave the promise unresolved so any busy layers stay active during the actual redirect\n    //TODO can we have navigateTo detect failed navigations so we can throw ?\n    navigateTo(instr);\n  }).catch((e: Error) => {\n    defer.reject(e);\n  });\n\n  return defer.promise;\n}\n\n/** Configure WebHare external auth buttons (even hidden ones) to listen for bookmarklet login requests */\nexport function setupWebHareSSOTrigger(): void {\n  window.triggerWebHareSSO = startSSOLogin;\n}\n","import { qSA } from \"@webhare/dompack\";\nimport { debugFlags } from \"@webhare/env\";\nimport type { FormAnalyticsEvent } from \"@webhare/forms\";\nimport type { DataLayerEntry } from \"./gtm-types\";\nimport { omit } from \"@webhare/std\";\n\ndeclare global {\n  interface Window {\n    /** The google tag manager (GTM) datalayer */\n    dataLayer: DataLayerEntry[]; //technically window.dataLayer may not exist and should be optional, but we already used to declare it as existing from gtm.ts\n  }\n  //It's safer to access dataLayer through globalThis, which will always be available in all environments unlike 'window'\n  var dataLayer: DataLayerEntry[] | undefined;\n}\n\n//ADDME if we ever figure out a bundler trick to flush this command to the top of all imports/loads, that would be great (we could consider *ALWAYS* putting this in the generated startup code, or we'd need to do a tree pre-walk to see if gtm.es is loaded anywhere)\n(globalThis as unknown as Window).dataLayer ||= [];\nlet lastSeen: DataLayerEntry | undefined;\n\nfunction showDataLayerUpdates() {\n  if (!globalThis.dataLayer)\n    return; //not set up (yet?)\n\n  if (debugFlags.anl)\n    globalThis.dataLayer.slice(globalThis.dataLayer.indexOf(lastSeen!) + 1).forEach(entry => console.log(\"[anl] dataLayer.push:\", entry));\n\n  lastSeen = globalThis.dataLayer[globalThis.dataLayer.length - 1];\n}\n\n/** Push to the dataLayer\n * @param vars - The variables to push\n * @param options - Options for the push\n *   timeout Time before any eventCallback is forcibly called (default 200ms)\n*/\nexport function pushToDataLayer(vars: DataLayerEntry, options?: { timeout?: number }) {\n  if (vars.eventCallback) { //we'll wrap the callback into a promise to ensure it's only invoked once\n    const savecallback = vars.eventCallback;\n    let newcallback: () => void;\n    void (new Promise<void>(resolve => newcallback = resolve)).then(() => savecallback());\n    setTimeout(() => newcallback, options?.timeout || 200);\n  }\n\n  globalThis.dataLayer?.push(vars);\n  showDataLayerUpdates();\n}\n\nfunction collectFormValues(formnode: HTMLFormElement): Record<string, unknown> {\n  const donefields: Record<string, boolean> = {};\n  const outdata: Record<string, unknown> = {};\n\n  const multifields = qSA<HTMLInputElement>(formnode, 'input[type=radio], input[type=checkbox]');\n  for (const multifield of multifields) {\n    if (!multifield.name || donefields[multifield.name])\n      continue; //we did this one\n\n    donefields[multifield.name] = true;\n\n    let idx = 0;\n    const values = [];\n    const labels = [];\n    const checkboxes = multifields.filter(node => node.name === multifield.name);\n\n    for (const node of checkboxes.filter(cbox => cbox.checked)) {\n      const keyname = 'form_' + multifield.name + (idx ? '_' + idx : '');\n      let labelsfornode = node.dataset.gtmTag || qSA(`label[for=\"${CSS.escape(node.id)}\"]`).map(labelnode => labelnode.textContent).filter(labelnode => Boolean(labelnode)).join(' ');\n      labelsfornode = labelsfornode.trim(); //TODO normalize whitespace\n      outdata[keyname] = node.value;\n      outdata[keyname + '_label'] = labelsfornode;\n\n      ++idx;\n      values.push(node.value);\n      labels.push(labelsfornode);\n    }\n\n    if (values.length) {\n      const allkeyname = 'form_' + multifield.name + '_all';\n      outdata[allkeyname] = values.join(';');\n      outdata[allkeyname + '_label'] = labels.join(';');\n    }\n  }\n\n  for (const field of formnode.querySelectorAll<HTMLSelectElement | HTMLInputElement>('input:not([type=radio]):not([type=checkbox]),select,textarea')) {\n    if (!field.name || donefields[field.name])\n      continue;\n\n    donefields[field.name] = true;\n\n    const val = field.value;\n    outdata['form_' + field.name] = val;\n    if (field.matches('select')) {\n      const opt = (field as HTMLSelectElement).options[(field as HTMLSelectElement).selectedIndex];\n      if (opt)\n        outdata['form_' + field.name + '_label'] = opt.dataset.gtmTag || opt.textContent;\n    }\n  }\n  return outdata;\n}\n\n/** Setup the dataLayer */\nlet didinit: boolean | undefined;\nexport function setupGTM() {\n  if (!didinit) {\n    didinit = true;\n    if (debugFlags.anl)\n      setInterval(showDataLayerUpdates, 100);\n  }\n}\n\n/** Setup dataLayer events for form analytics events\n * @param options - Options for the form analytics setup\n     - `eventPrefix`. Prefix to use. Default is `wh-platform:form_` but existing integrations may (also) require `publisher:form`\n*/\nexport function setupFormAnalyticsForGTM(options?: { eventPrefix: string }): void {\n  setupGTM(); //ensurse the GTM basics are installed\n\n  addEventListener(\"wh:form-analytics\", (e: FormAnalyticsEvent) => {\n    //we use the same prefixing as pxl events would\n    const entry: DataLayerEntry = {\n      event: `${options?.eventPrefix || \"platform:form_\"}${e.detail.event}`\n    };\n\n    for (const [key, val] of Object.entries(e.detail))\n      if (key !== \"event\" && [\"string\", \"number\", \"boolean\"].includes(typeof val))\n        entry[`formmeta_${key}`] = val;\n\n    const form = e.target as HTMLFormElement | undefined;\n    if (form?.dataset.gtmSubmit) {\n      //When set, we push both the form: variable in gtmSubmit and the current form field avlues\n      Object.assign(entry, JSON.parse(form.dataset.gtmSubmit));\n      Object.assign(entry, collectFormValues(form));\n    }\n\n    pushToDataLayer(entry);\n  });\n}\n\nfunction processClickDataLayerTags(event: MouseEvent) {\n  const entry: Record<string, unknown> = {};\n\n  for (let node = event.target as HTMLElement | undefined | null; node; node = node?.parentElement)\n    for (const attr of node.attributes)\n      if (attr.nodeName.startsWith(\"data-wh-datalayer-onclick-\")) {\n        const key = attr.nodeName.substring(26);\n        if (key !== \"__proto__\" && !(key in entry)) //as we're working upwards, don't overwrite already set keys\n          entry[key] = attr.nodeValue || \"\";\n      } else if (attr.nodeName === \"data-wh-datalayer-onclick\") { //JSON setter\n        const data = JSON.parse(attr.nodeValue!);\n        for (const [key, value] of Object.entries(data))\n          if (key !== \"__proto__\" && !(key in entry)) //as we're working upwards, don't overwrite already set keys\n            entry[key] = value;\n      }\n\n  if (Object.keys(entry).length)\n    pushToDataLayer(entry as DataLayerEntry);\n}\n\n/** Setup support for data-wh-datalayer-onclick-xxx=\"yyy\" attributes. When clicking an element with these attributes the JSON from the attribute and all parents are merged together and pushed to the dataLayer  */\nexport function setupDataLayerTags() {\n  //we capture so we can also simply set variables for any existing GTM handlers\n  window.addEventListener(\"click\", processClickDataLayerTags, { capture: true });\n}\n\n/** Get the current variables in the GTM datalayer\n * @param win - The window to get the dataLayer from (default: current window)\n * @return The current variables in the GTM datalayer, merged together from all entries. Note that this is a snapshot and won't update as the dataLayer changes\n*/\nexport function getCurrentDataLayerVariables<DataLayerFormat extends object = Record<string, unknown>>(win: Window = window): DataLayerFormat {\n  const state: DataLayerFormat = {} as DataLayerFormat;\n  if (win.dataLayer)\n    win.dataLayer.forEach(entry =>\n      Object.assign(state, structuredClone(omit(entry, [\"event\", \"eventCallback\", \"gtm.uniqueEventId\"]))));\n  return state;\n}\n","/* To verify tree shaking viability, try:\n   whcd\n   cd whtree\n   echo 'import \"@webhare/frontend\"' | node_modules/.bin/esbuild --loader:.css=empty --tsconfig=tsconfig.json --bundle --minify\n*/\n\n// This gets TypeScript to refer to us by our @webhare/... name in auto imports:\ndeclare module \"@webhare/frontend\" {\n}\n\nimport { onDomReady } from \"@webhare/dompack\";\nexport { frontendConfig, getFrontendData, getSiteRoot } from \"./init\";\nexport { startSSOLogin, login, setupWRDAuth, isLoggedIn, logout, getUserInfo, setupWebHareSSOTrigger } from \"./auth\";\nexport { loadAssetPack, setupAuthorMode, type AuthorModeOptions } from \"./authormode\";\nexport { setPxlOptions, sendPxl, getPxlUserId, getPxlSessionId, setupFormAnalytics, type PxlData } from \"./pxl\";\nexport { getRemoteIPAddress, getGeoIPInfo, type GetIPInfoOptions, type GeoIPInfoResult } from \"./analytics\";\nexport { setupGTM, setupFormAnalyticsForGTM, pushToDataLayer, setupDataLayerTags, getCurrentDataLayerVariables } from \"./gtm\";\nexport { setupLinksInNewWindow, type LinkOpenOptions } from \"./linkhandler\";\n\nexport type * from \"./gtm-types\";\n\n// we shouldn't deprecate navigateTo exported from frontend. in fact it makes more sense to export it from frontend than env as it's browser-only\nexport { navigateTo } from \"@webhare/env\";\n\n/** Registry for data we receive from the backend */\nexport interface FrontendDataTypes {\n}\n\n/** Registry for expected PXL formats */\nexport interface PxlDataTypes {\n}\n\n/** Test whether the current page is being iframed in the WebHare test framework */\nexport function isInTestFramework(): boolean {\n  if (window.top !== window) { //in a frame\n    try {\n      if ((window.top as { __testframework?: unknown })?.__testframework)\n        return true;//we're inside a testframe, pretend to be the parent\n    } catch (ignore) {\n    }\n  }\n  return false;\n}\n\nfunction postRenderChecks() {\n  const log = document.getElementById(\"wh-console-log\");\n  if (log) {\n    const logtext = atob(log.textContent || \"\");\n    console.group(\"[etr] Server-side console output\");\n    console.log(logtext);\n    console.groupEnd();\n  }\n}\n\nonDomReady(postRenderChecks);\n","/*!\n  * vue-router v4.5.1\n  * (c) 2025 Eduardo San Martin Morote\n  * @license MIT\n  */\nimport { getCurrentInstance, inject, onUnmounted, onDeactivated, onActivated, computed, unref, watchEffect, defineComponent, reactive, h, provide, ref, watch, shallowRef, shallowReactive, nextTick } from 'vue';\nimport { setupDevtoolsPlugin } from '@vue/devtools-api';\n\nconst isBrowser = typeof document !== 'undefined';\n\n/**\n * Allows differentiating lazy components from functional components and vue-class-component\n * @internal\n *\n * @param component\n */\nfunction isRouteComponent(component) {\n    return (typeof component === 'object' ||\n        'displayName' in component ||\n        'props' in component ||\n        '__vccOpts' in component);\n}\nfunction isESModule(obj) {\n    return (obj.__esModule ||\n        obj[Symbol.toStringTag] === 'Module' ||\n        // support CF with dynamic imports that do not\n        // add the Module string tag\n        (obj.default && isRouteComponent(obj.default)));\n}\nconst assign = Object.assign;\nfunction applyToParams(fn, params) {\n    const newParams = {};\n    for (const key in params) {\n        const value = params[key];\n        newParams[key] = isArray(value)\n            ? value.map(fn)\n            : fn(value);\n    }\n    return newParams;\n}\nconst noop = () => { };\n/**\n * Typesafe alternative to Array.isArray\n * https://github.com/microsoft/TypeScript/pull/48228\n */\nconst isArray = Array.isArray;\n\nfunction warn(msg) {\n    // avoid using ...args as it breaks in older Edge builds\n    const args = Array.from(arguments).slice(1);\n    console.warn.apply(console, ['[Vue Router warn]: ' + msg].concat(args));\n}\n\n/**\n * Encoding Rules (␣ = Space)\n * - Path: ␣ \" < > # ? { }\n * - Query: ␣ \" < > # & =\n * - Hash: ␣ \" < > `\n *\n * On top of that, the RFC3986 (https://tools.ietf.org/html/rfc3986#section-2.2)\n * defines some extra characters to be encoded. Most browsers do not encode them\n * in encodeURI https://github.com/whatwg/url/issues/369, so it may be safer to\n * also encode `!'()*`. Leaving un-encoded only ASCII alphanumeric(`a-zA-Z0-9`)\n * plus `-._~`. This extra safety should be applied to query by patching the\n * string returned by encodeURIComponent encodeURI also encodes `[\\]^`. `\\`\n * should be encoded to avoid ambiguity. Browsers (IE, FF, C) transform a `\\`\n * into a `/` if directly typed in. The _backtick_ (`````) should also be\n * encoded everywhere because some browsers like FF encode it when directly\n * written while others don't. Safari and IE don't encode ``\"<>{}``` in hash.\n */\n// const EXTRA_RESERVED_RE = /[!'()*]/g\n// const encodeReservedReplacer = (c: string) => '%' + c.charCodeAt(0).toString(16)\nconst HASH_RE = /#/g; // %23\nconst AMPERSAND_RE = /&/g; // %26\nconst SLASH_RE = /\\//g; // %2F\nconst EQUAL_RE = /=/g; // %3D\nconst IM_RE = /\\?/g; // %3F\nconst PLUS_RE = /\\+/g; // %2B\n/**\n * NOTE: It's not clear to me if we should encode the + symbol in queries, it\n * seems to be less flexible than not doing so and I can't find out the legacy\n * systems requiring this for regular requests like text/html. In the standard,\n * the encoding of the plus character is only mentioned for\n * application/x-www-form-urlencoded\n * (https://url.spec.whatwg.org/#urlencoded-parsing) and most browsers seems lo\n * leave the plus character as is in queries. To be more flexible, we allow the\n * plus character on the query, but it can also be manually encoded by the user.\n *\n * Resources:\n * - https://url.spec.whatwg.org/#urlencoded-parsing\n * - https://stackoverflow.com/questions/1634271/url-encoding-the-space-character-or-20\n */\nconst ENC_BRACKET_OPEN_RE = /%5B/g; // [\nconst ENC_BRACKET_CLOSE_RE = /%5D/g; // ]\nconst ENC_CARET_RE = /%5E/g; // ^\nconst ENC_BACKTICK_RE = /%60/g; // `\nconst ENC_CURLY_OPEN_RE = /%7B/g; // {\nconst ENC_PIPE_RE = /%7C/g; // |\nconst ENC_CURLY_CLOSE_RE = /%7D/g; // }\nconst ENC_SPACE_RE = /%20/g; // }\n/**\n * Encode characters that need to be encoded on the path, search and hash\n * sections of the URL.\n *\n * @internal\n * @param text - string to encode\n * @returns encoded string\n */\nfunction commonEncode(text) {\n    return encodeURI('' + text)\n        .replace(ENC_PIPE_RE, '|')\n        .replace(ENC_BRACKET_OPEN_RE, '[')\n        .replace(ENC_BRACKET_CLOSE_RE, ']');\n}\n/**\n * Encode characters that need to be encoded on the hash section of the URL.\n *\n * @param text - string to encode\n * @returns encoded string\n */\nfunction encodeHash(text) {\n    return commonEncode(text)\n        .replace(ENC_CURLY_OPEN_RE, '{')\n        .replace(ENC_CURLY_CLOSE_RE, '}')\n        .replace(ENC_CARET_RE, '^');\n}\n/**\n * Encode characters that need to be encoded query values on the query\n * section of the URL.\n *\n * @param text - string to encode\n * @returns encoded string\n */\nfunction encodeQueryValue(text) {\n    return (commonEncode(text)\n        // Encode the space as +, encode the + to differentiate it from the space\n        .replace(PLUS_RE, '%2B')\n        .replace(ENC_SPACE_RE, '+')\n        .replace(HASH_RE, '%23')\n        .replace(AMPERSAND_RE, '%26')\n        .replace(ENC_BACKTICK_RE, '`')\n        .replace(ENC_CURLY_OPEN_RE, '{')\n        .replace(ENC_CURLY_CLOSE_RE, '}')\n        .replace(ENC_CARET_RE, '^'));\n}\n/**\n * Like `encodeQueryValue` but also encodes the `=` character.\n *\n * @param text - string to encode\n */\nfunction encodeQueryKey(text) {\n    return encodeQueryValue(text).replace(EQUAL_RE, '%3D');\n}\n/**\n * Encode characters that need to be encoded on the path section of the URL.\n *\n * @param text - string to encode\n * @returns encoded string\n */\nfunction encodePath(text) {\n    return commonEncode(text).replace(HASH_RE, '%23').replace(IM_RE, '%3F');\n}\n/**\n * Encode characters that need to be encoded on the path section of the URL as a\n * param. This function encodes everything {@link encodePath} does plus the\n * slash (`/`) character. If `text` is `null` or `undefined`, returns an empty\n * string instead.\n *\n * @param text - string to encode\n * @returns encoded string\n */\nfunction encodeParam(text) {\n    return text == null ? '' : encodePath(text).replace(SLASH_RE, '%2F');\n}\n/**\n * Decode text using `decodeURIComponent`. Returns the original text if it\n * fails.\n *\n * @param text - string to decode\n * @returns decoded string\n */\nfunction decode(text) {\n    try {\n        return decodeURIComponent('' + text);\n    }\n    catch (err) {\n        (process.env.NODE_ENV !== 'production') && warn(`Error decoding \"${text}\". Using original value`);\n    }\n    return '' + text;\n}\n\nconst TRAILING_SLASH_RE = /\\/$/;\nconst removeTrailingSlash = (path) => path.replace(TRAILING_SLASH_RE, '');\n/**\n * Transforms a URI into a normalized history location\n *\n * @param parseQuery\n * @param location - URI to normalize\n * @param currentLocation - current absolute location. Allows resolving relative\n * paths. Must start with `/`. Defaults to `/`\n * @returns a normalized history location\n */\nfunction parseURL(parseQuery, location, currentLocation = '/') {\n    let path, query = {}, searchString = '', hash = '';\n    // Could use URL and URLSearchParams but IE 11 doesn't support it\n    // TODO: move to new URL()\n    const hashPos = location.indexOf('#');\n    let searchPos = location.indexOf('?');\n    // the hash appears before the search, so it's not part of the search string\n    if (hashPos < searchPos && hashPos >= 0) {\n        searchPos = -1;\n    }\n    if (searchPos > -1) {\n        path = location.slice(0, searchPos);\n        searchString = location.slice(searchPos + 1, hashPos > -1 ? hashPos : location.length);\n        query = parseQuery(searchString);\n    }\n    if (hashPos > -1) {\n        path = path || location.slice(0, hashPos);\n        // keep the # character\n        hash = location.slice(hashPos, location.length);\n    }\n    // no search and no query\n    path = resolveRelativePath(path != null ? path : location, currentLocation);\n    // empty path means a relative query or hash `?foo=f`, `#thing`\n    return {\n        fullPath: path + (searchString && '?') + searchString + hash,\n        path,\n        query,\n        hash: decode(hash),\n    };\n}\n/**\n * Stringifies a URL object\n *\n * @param stringifyQuery\n * @param location\n */\nfunction stringifyURL(stringifyQuery, location) {\n    const query = location.query ? stringifyQuery(location.query) : '';\n    return location.path + (query && '?') + query + (location.hash || '');\n}\n/**\n * Strips off the base from the beginning of a location.pathname in a non-case-sensitive way.\n *\n * @param pathname - location.pathname\n * @param base - base to strip off\n */\nfunction stripBase(pathname, base) {\n    // no base or base is not found at the beginning\n    if (!base || !pathname.toLowerCase().startsWith(base.toLowerCase()))\n        return pathname;\n    return pathname.slice(base.length) || '/';\n}\n/**\n * Checks if two RouteLocation are equal. This means that both locations are\n * pointing towards the same {@link RouteRecord} and that all `params`, `query`\n * parameters and `hash` are the same\n *\n * @param stringifyQuery - A function that takes a query object of type LocationQueryRaw and returns a string representation of it.\n * @param a - first {@link RouteLocation}\n * @param b - second {@link RouteLocation}\n */\nfunction isSameRouteLocation(stringifyQuery, a, b) {\n    const aLastIndex = a.matched.length - 1;\n    const bLastIndex = b.matched.length - 1;\n    return (aLastIndex > -1 &&\n        aLastIndex === bLastIndex &&\n        isSameRouteRecord(a.matched[aLastIndex], b.matched[bLastIndex]) &&\n        isSameRouteLocationParams(a.params, b.params) &&\n        stringifyQuery(a.query) === stringifyQuery(b.query) &&\n        a.hash === b.hash);\n}\n/**\n * Check if two `RouteRecords` are equal. Takes into account aliases: they are\n * considered equal to the `RouteRecord` they are aliasing.\n *\n * @param a - first {@link RouteRecord}\n * @param b - second {@link RouteRecord}\n */\nfunction isSameRouteRecord(a, b) {\n    // since the original record has an undefined value for aliasOf\n    // but all aliases point to the original record, this will always compare\n    // the original record\n    return (a.aliasOf || a) === (b.aliasOf || b);\n}\nfunction isSameRouteLocationParams(a, b) {\n    if (Object.keys(a).length !== Object.keys(b).length)\n        return false;\n    for (const key in a) {\n        if (!isSameRouteLocationParamsValue(a[key], b[key]))\n            return false;\n    }\n    return true;\n}\nfunction isSameRouteLocationParamsValue(a, b) {\n    return isArray(a)\n        ? isEquivalentArray(a, b)\n        : isArray(b)\n            ? isEquivalentArray(b, a)\n            : a === b;\n}\n/**\n * Check if two arrays are the same or if an array with one single entry is the\n * same as another primitive value. Used to check query and parameters\n *\n * @param a - array of values\n * @param b - array of values or a single value\n */\nfunction isEquivalentArray(a, b) {\n    return isArray(b)\n        ? a.length === b.length && a.every((value, i) => value === b[i])\n        : a.length === 1 && a[0] === b;\n}\n/**\n * Resolves a relative path that starts with `.`.\n *\n * @param to - path location we are resolving\n * @param from - currentLocation.path, should start with `/`\n */\nfunction resolveRelativePath(to, from) {\n    if (to.startsWith('/'))\n        return to;\n    if ((process.env.NODE_ENV !== 'production') && !from.startsWith('/')) {\n        warn(`Cannot resolve a relative location without an absolute path. Trying to resolve \"${to}\" from \"${from}\". It should look like \"/${from}\".`);\n        return to;\n    }\n    if (!to)\n        return from;\n    const fromSegments = from.split('/');\n    const toSegments = to.split('/');\n    const lastToSegment = toSegments[toSegments.length - 1];\n    // make . and ./ the same (../ === .., ../../ === ../..)\n    // this is the same behavior as new URL()\n    if (lastToSegment === '..' || lastToSegment === '.') {\n        toSegments.push('');\n    }\n    let position = fromSegments.length - 1;\n    let toPosition;\n    let segment;\n    for (toPosition = 0; toPosition < toSegments.length; toPosition++) {\n        segment = toSegments[toPosition];\n        // we stay on the same position\n        if (segment === '.')\n            continue;\n        // go up in the from array\n        if (segment === '..') {\n            // we can't go below zero, but we still need to increment toPosition\n            if (position > 1)\n                position--;\n            // continue\n        }\n        // we reached a non-relative path, we stop here\n        else\n            break;\n    }\n    return (fromSegments.slice(0, position).join('/') +\n        '/' +\n        toSegments.slice(toPosition).join('/'));\n}\n/**\n * Initial route location where the router is. Can be used in navigation guards\n * to differentiate the initial navigation.\n *\n * @example\n * ```js\n * import { START_LOCATION } from 'vue-router'\n *\n * router.beforeEach((to, from) => {\n *   if (from === START_LOCATION) {\n *     // initial navigation\n *   }\n * })\n * ```\n */\nconst START_LOCATION_NORMALIZED = {\n    path: '/',\n    // TODO: could we use a symbol in the future?\n    name: undefined,\n    params: {},\n    query: {},\n    hash: '',\n    fullPath: '/',\n    matched: [],\n    meta: {},\n    redirectedFrom: undefined,\n};\n\nvar NavigationType;\n(function (NavigationType) {\n    NavigationType[\"pop\"] = \"pop\";\n    NavigationType[\"push\"] = \"push\";\n})(NavigationType || (NavigationType = {}));\nvar NavigationDirection;\n(function (NavigationDirection) {\n    NavigationDirection[\"back\"] = \"back\";\n    NavigationDirection[\"forward\"] = \"forward\";\n    NavigationDirection[\"unknown\"] = \"\";\n})(NavigationDirection || (NavigationDirection = {}));\n/**\n * Starting location for Histories\n */\nconst START = '';\n// Generic utils\n/**\n * Normalizes a base by removing any trailing slash and reading the base tag if\n * present.\n *\n * @param base - base to normalize\n */\nfunction normalizeBase(base) {\n    if (!base) {\n        if (isBrowser) {\n            // respect <base> tag\n            const baseEl = document.querySelector('base');\n            base = (baseEl && baseEl.getAttribute('href')) || '/';\n            // strip full URL origin\n            base = base.replace(/^\\w+:\\/\\/[^\\/]+/, '');\n        }\n        else {\n            base = '/';\n        }\n    }\n    // ensure leading slash when it was removed by the regex above avoid leading\n    // slash with hash because the file could be read from the disk like file://\n    // and the leading slash would cause problems\n    if (base[0] !== '/' && base[0] !== '#')\n        base = '/' + base;\n    // remove the trailing slash so all other method can just do `base + fullPath`\n    // to build an href\n    return removeTrailingSlash(base);\n}\n// remove any character before the hash\nconst BEFORE_HASH_RE = /^[^#]+#/;\nfunction createHref(base, location) {\n    return base.replace(BEFORE_HASH_RE, '#') + location;\n}\n\nfunction getElementPosition(el, offset) {\n    const docRect = document.documentElement.getBoundingClientRect();\n    const elRect = el.getBoundingClientRect();\n    return {\n        behavior: offset.behavior,\n        left: elRect.left - docRect.left - (offset.left || 0),\n        top: elRect.top - docRect.top - (offset.top || 0),\n    };\n}\nconst computeScrollPosition = () => ({\n    left: window.scrollX,\n    top: window.scrollY,\n});\nfunction scrollToPosition(position) {\n    let scrollToOptions;\n    if ('el' in position) {\n        const positionEl = position.el;\n        const isIdSelector = typeof positionEl === 'string' && positionEl.startsWith('#');\n        /**\n         * `id`s can accept pretty much any characters, including CSS combinators\n         * like `>` or `~`. It's still possible to retrieve elements using\n         * `document.getElementById('~')` but it needs to be escaped when using\n         * `document.querySelector('#\\\\~')` for it to be valid. The only\n         * requirements for `id`s are them to be unique on the page and to not be\n         * empty (`id=\"\"`). Because of that, when passing an id selector, it should\n         * be properly escaped for it to work with `querySelector`. We could check\n         * for the id selector to be simple (no CSS combinators `+ >~`) but that\n         * would make things inconsistent since they are valid characters for an\n         * `id` but would need to be escaped when using `querySelector`, breaking\n         * their usage and ending up in no selector returned. Selectors need to be\n         * escaped:\n         *\n         * - `#1-thing` becomes `#\\31 -thing`\n         * - `#with~symbols` becomes `#with\\\\~symbols`\n         *\n         * - More information about  the topic can be found at\n         *   https://mathiasbynens.be/notes/html5-id-class.\n         * - Practical example: https://mathiasbynens.be/demo/html5-id\n         */\n        if ((process.env.NODE_ENV !== 'production') && typeof position.el === 'string') {\n            if (!isIdSelector || !document.getElementById(position.el.slice(1))) {\n                try {\n                    const foundEl = document.querySelector(position.el);\n                    if (isIdSelector && foundEl) {\n                        warn(`The selector \"${position.el}\" should be passed as \"el: document.querySelector('${position.el}')\" because it starts with \"#\".`);\n                        // return to avoid other warnings\n                        return;\n                    }\n                }\n                catch (err) {\n                    warn(`The selector \"${position.el}\" is invalid. If you are using an id selector, make sure to escape it. You can find more information about escaping characters in selectors at https://mathiasbynens.be/notes/css-escapes or use CSS.escape (https://developer.mozilla.org/en-US/docs/Web/API/CSS/escape).`);\n                    // return to avoid other warnings\n                    return;\n                }\n            }\n        }\n        const el = typeof positionEl === 'string'\n            ? isIdSelector\n                ? document.getElementById(positionEl.slice(1))\n                : document.querySelector(positionEl)\n            : positionEl;\n        if (!el) {\n            (process.env.NODE_ENV !== 'production') &&\n                warn(`Couldn't find element using selector \"${position.el}\" returned by scrollBehavior.`);\n            return;\n        }\n        scrollToOptions = getElementPosition(el, position);\n    }\n    else {\n        scrollToOptions = position;\n    }\n    if ('scrollBehavior' in document.documentElement.style)\n        window.scrollTo(scrollToOptions);\n    else {\n        window.scrollTo(scrollToOptions.left != null ? scrollToOptions.left : window.scrollX, scrollToOptions.top != null ? scrollToOptions.top : window.scrollY);\n    }\n}\nfunction getScrollKey(path, delta) {\n    const position = history.state ? history.state.position - delta : -1;\n    return position + path;\n}\nconst scrollPositions = new Map();\nfunction saveScrollPosition(key, scrollPosition) {\n    scrollPositions.set(key, scrollPosition);\n}\nfunction getSavedScrollPosition(key) {\n    const scroll = scrollPositions.get(key);\n    // consume it so it's not used again\n    scrollPositions.delete(key);\n    return scroll;\n}\n// TODO: RFC about how to save scroll position\n/**\n * ScrollBehavior instance used by the router to compute and restore the scroll\n * position when navigating.\n */\n// export interface ScrollHandler<ScrollPositionEntry extends HistoryStateValue, ScrollPosition extends ScrollPositionEntry> {\n//   // returns a scroll position that can be saved in history\n//   compute(): ScrollPositionEntry\n//   // can take an extended ScrollPositionEntry\n//   scroll(position: ScrollPosition): void\n// }\n// export const scrollHandler: ScrollHandler<ScrollPosition> = {\n//   compute: computeScroll,\n//   scroll: scrollToPosition,\n// }\n\nlet createBaseLocation = () => location.protocol + '//' + location.host;\n/**\n * Creates a normalized history location from a window.location object\n * @param base - The base path\n * @param location - The window.location object\n */\nfunction createCurrentLocation(base, location) {\n    const { pathname, search, hash } = location;\n    // allows hash bases like #, /#, #/, #!, #!/, /#!/, or even /folder#end\n    const hashPos = base.indexOf('#');\n    if (hashPos > -1) {\n        let slicePos = hash.includes(base.slice(hashPos))\n            ? base.slice(hashPos).length\n            : 1;\n        let pathFromHash = hash.slice(slicePos);\n        // prepend the starting slash to hash so the url starts with /#\n        if (pathFromHash[0] !== '/')\n            pathFromHash = '/' + pathFromHash;\n        return stripBase(pathFromHash, '');\n    }\n    const path = stripBase(pathname, base);\n    return path + search + hash;\n}\nfunction useHistoryListeners(base, historyState, currentLocation, replace) {\n    let listeners = [];\n    let teardowns = [];\n    // TODO: should it be a stack? a Dict. Check if the popstate listener\n    // can trigger twice\n    let pauseState = null;\n    const popStateHandler = ({ state, }) => {\n        const to = createCurrentLocation(base, location);\n        const from = currentLocation.value;\n        const fromState = historyState.value;\n        let delta = 0;\n        if (state) {\n            currentLocation.value = to;\n            historyState.value = state;\n            // ignore the popstate and reset the pauseState\n            if (pauseState && pauseState === from) {\n                pauseState = null;\n                return;\n            }\n            delta = fromState ? state.position - fromState.position : 0;\n        }\n        else {\n            replace(to);\n        }\n        // Here we could also revert the navigation by calling history.go(-delta)\n        // this listener will have to be adapted to not trigger again and to wait for the url\n        // to be updated before triggering the listeners. Some kind of validation function would also\n        // need to be passed to the listeners so the navigation can be accepted\n        // call all listeners\n        listeners.forEach(listener => {\n            listener(currentLocation.value, from, {\n                delta,\n                type: NavigationType.pop,\n                direction: delta\n                    ? delta > 0\n                        ? NavigationDirection.forward\n                        : NavigationDirection.back\n                    : NavigationDirection.unknown,\n            });\n        });\n    };\n    function pauseListeners() {\n        pauseState = currentLocation.value;\n    }\n    function listen(callback) {\n        // set up the listener and prepare teardown callbacks\n        listeners.push(callback);\n        const teardown = () => {\n            const index = listeners.indexOf(callback);\n            if (index > -1)\n                listeners.splice(index, 1);\n        };\n        teardowns.push(teardown);\n        return teardown;\n    }\n    function beforeUnloadListener() {\n        const { history } = window;\n        if (!history.state)\n            return;\n        history.replaceState(assign({}, history.state, { scroll: computeScrollPosition() }), '');\n    }\n    function destroy() {\n        for (const teardown of teardowns)\n            teardown();\n        teardowns = [];\n        window.removeEventListener('popstate', popStateHandler);\n        window.removeEventListener('beforeunload', beforeUnloadListener);\n    }\n    // set up the listeners and prepare teardown callbacks\n    window.addEventListener('popstate', popStateHandler);\n    // TODO: could we use 'pagehide' or 'visibilitychange' instead?\n    // https://developer.chrome.com/blog/page-lifecycle-api/\n    window.addEventListener('beforeunload', beforeUnloadListener, {\n        passive: true,\n    });\n    return {\n        pauseListeners,\n        listen,\n        destroy,\n    };\n}\n/**\n * Creates a state object\n */\nfunction buildState(back, current, forward, replaced = false, computeScroll = false) {\n    return {\n        back,\n        current,\n        forward,\n        replaced,\n        position: window.history.length,\n        scroll: computeScroll ? computeScrollPosition() : null,\n    };\n}\nfunction useHistoryStateNavigation(base) {\n    const { history, location } = window;\n    // private variables\n    const currentLocation = {\n        value: createCurrentLocation(base, location),\n    };\n    const historyState = { value: history.state };\n    // build current history entry as this is a fresh navigation\n    if (!historyState.value) {\n        changeLocation(currentLocation.value, {\n            back: null,\n            current: currentLocation.value,\n            forward: null,\n            // the length is off by one, we need to decrease it\n            position: history.length - 1,\n            replaced: true,\n            // don't add a scroll as the user may have an anchor, and we want\n            // scrollBehavior to be triggered without a saved position\n            scroll: null,\n        }, true);\n    }\n    function changeLocation(to, state, replace) {\n        /**\n         * if a base tag is provided, and we are on a normal domain, we have to\n         * respect the provided `base` attribute because pushState() will use it and\n         * potentially erase anything before the `#` like at\n         * https://github.com/vuejs/router/issues/685 where a base of\n         * `/folder/#` but a base of `/` would erase the `/folder/` section. If\n         * there is no host, the `<base>` tag makes no sense and if there isn't a\n         * base tag we can just use everything after the `#`.\n         */\n        const hashIndex = base.indexOf('#');\n        const url = hashIndex > -1\n            ? (location.host && document.querySelector('base')\n                ? base\n                : base.slice(hashIndex)) + to\n            : createBaseLocation() + base + to;\n        try {\n            // BROWSER QUIRK\n            // NOTE: Safari throws a SecurityError when calling this function 100 times in 30 seconds\n            history[replace ? 'replaceState' : 'pushState'](state, '', url);\n            historyState.value = state;\n        }\n        catch (err) {\n            if ((process.env.NODE_ENV !== 'production')) {\n                warn('Error with push/replace State', err);\n            }\n            else {\n                console.error(err);\n            }\n            // Force the navigation, this also resets the call count\n            location[replace ? 'replace' : 'assign'](url);\n        }\n    }\n    function replace(to, data) {\n        const state = assign({}, history.state, buildState(historyState.value.back, \n        // keep back and forward entries but override current position\n        to, historyState.value.forward, true), data, { position: historyState.value.position });\n        changeLocation(to, state, true);\n        currentLocation.value = to;\n    }\n    function push(to, data) {\n        // Add to current entry the information of where we are going\n        // as well as saving the current position\n        const currentState = assign({}, \n        // use current history state to gracefully handle a wrong call to\n        // history.replaceState\n        // https://github.com/vuejs/router/issues/366\n        historyState.value, history.state, {\n            forward: to,\n            scroll: computeScrollPosition(),\n        });\n        if ((process.env.NODE_ENV !== 'production') && !history.state) {\n            warn(`history.state seems to have been manually replaced without preserving the necessary values. Make sure to preserve existing history state if you are manually calling history.replaceState:\\n\\n` +\n                `history.replaceState(history.state, '', url)\\n\\n` +\n                `You can find more information at https://router.vuejs.org/guide/migration/#Usage-of-history-state`);\n        }\n        changeLocation(currentState.current, currentState, true);\n        const state = assign({}, buildState(currentLocation.value, to, null), { position: currentState.position + 1 }, data);\n        changeLocation(to, state, false);\n        currentLocation.value = to;\n    }\n    return {\n        location: currentLocation,\n        state: historyState,\n        push,\n        replace,\n    };\n}\n/**\n * Creates an HTML5 history. Most common history for single page applications.\n *\n * @param base -\n */\nfunction createWebHistory(base) {\n    base = normalizeBase(base);\n    const historyNavigation = useHistoryStateNavigation(base);\n    const historyListeners = useHistoryListeners(base, historyNavigation.state, historyNavigation.location, historyNavigation.replace);\n    function go(delta, triggerListeners = true) {\n        if (!triggerListeners)\n            historyListeners.pauseListeners();\n        history.go(delta);\n    }\n    const routerHistory = assign({\n        // it's overridden right after\n        location: '',\n        base,\n        go,\n        createHref: createHref.bind(null, base),\n    }, historyNavigation, historyListeners);\n    Object.defineProperty(routerHistory, 'location', {\n        enumerable: true,\n        get: () => historyNavigation.location.value,\n    });\n    Object.defineProperty(routerHistory, 'state', {\n        enumerable: true,\n        get: () => historyNavigation.state.value,\n    });\n    return routerHistory;\n}\n\n/**\n * Creates an in-memory based history. The main purpose of this history is to handle SSR. It starts in a special location that is nowhere.\n * It's up to the user to replace that location with the starter location by either calling `router.push` or `router.replace`.\n *\n * @param base - Base applied to all urls, defaults to '/'\n * @returns a history object that can be passed to the router constructor\n */\nfunction createMemoryHistory(base = '') {\n    let listeners = [];\n    let queue = [[START, {}]];\n    let position = 0;\n    base = normalizeBase(base);\n    function setLocation(location, state = {}) {\n        position++;\n        if (position !== queue.length) {\n            // we are in the middle, we remove everything from here in the queue\n            queue.splice(position);\n        }\n        queue.push([location, state]);\n    }\n    function triggerListeners(to, from, { direction, delta }) {\n        const info = {\n            direction,\n            delta,\n            type: NavigationType.pop,\n        };\n        for (const callback of listeners) {\n            callback(to, from, info);\n        }\n    }\n    const routerHistory = {\n        // rewritten by Object.defineProperty\n        location: START,\n        // rewritten by Object.defineProperty\n        state: {},\n        base,\n        createHref: createHref.bind(null, base),\n        replace(to, state) {\n            // remove current entry and decrement position\n            queue.splice(position--, 1);\n            setLocation(to, state);\n        },\n        push(to, state) {\n            setLocation(to, state);\n        },\n        listen(callback) {\n            listeners.push(callback);\n            return () => {\n                const index = listeners.indexOf(callback);\n                if (index > -1)\n                    listeners.splice(index, 1);\n            };\n        },\n        destroy() {\n            listeners = [];\n            queue = [[START, {}]];\n            position = 0;\n        },\n        go(delta, shouldTrigger = true) {\n            const from = this.location;\n            const direction = \n            // we are considering delta === 0 going forward, but in abstract mode\n            // using 0 for the delta doesn't make sense like it does in html5 where\n            // it reloads the page\n            delta < 0 ? NavigationDirection.back : NavigationDirection.forward;\n            position = Math.max(0, Math.min(position + delta, queue.length - 1));\n            if (shouldTrigger) {\n                triggerListeners(this.location, from, {\n                    direction,\n                    delta,\n                });\n            }\n        },\n    };\n    Object.defineProperty(routerHistory, 'location', {\n        enumerable: true,\n        get: () => queue[position][0],\n    });\n    Object.defineProperty(routerHistory, 'state', {\n        enumerable: true,\n        get: () => queue[position][1],\n    });\n    return routerHistory;\n}\n\n/**\n * Creates a hash history. Useful for web applications with no host (e.g. `file://`) or when configuring a server to\n * handle any URL is not possible.\n *\n * @param base - optional base to provide. Defaults to `location.pathname + location.search` If there is a `<base>` tag\n * in the `head`, its value will be ignored in favor of this parameter **but note it affects all the history.pushState()\n * calls**, meaning that if you use a `<base>` tag, it's `href` value **has to match this parameter** (ignoring anything\n * after the `#`).\n *\n * @example\n * ```js\n * // at https://example.com/folder\n * createWebHashHistory() // gives a url of `https://example.com/folder#`\n * createWebHashHistory('/folder/') // gives a url of `https://example.com/folder/#`\n * // if the `#` is provided in the base, it won't be added by `createWebHashHistory`\n * createWebHashHistory('/folder/#/app/') // gives a url of `https://example.com/folder/#/app/`\n * // you should avoid doing this because it changes the original url and breaks copying urls\n * createWebHashHistory('/other-folder/') // gives a url of `https://example.com/other-folder/#`\n *\n * // at file:///usr/etc/folder/index.html\n * // for locations with no `host`, the base is ignored\n * createWebHashHistory('/iAmIgnored') // gives a url of `file:///usr/etc/folder/index.html#`\n * ```\n */\nfunction createWebHashHistory(base) {\n    // Make sure this implementation is fine in terms of encoding, specially for IE11\n    // for `file://`, directly use the pathname and ignore the base\n    // location.pathname contains an initial `/` even at the root: `https://example.com`\n    base = location.host ? base || location.pathname + location.search : '';\n    // allow the user to provide a `#` in the middle: `/base/#/app`\n    if (!base.includes('#'))\n        base += '#';\n    if ((process.env.NODE_ENV !== 'production') && !base.endsWith('#/') && !base.endsWith('#')) {\n        warn(`A hash base must end with a \"#\":\\n\"${base}\" should be \"${base.replace(/#.*$/, '#')}\".`);\n    }\n    return createWebHistory(base);\n}\n\nfunction isRouteLocation(route) {\n    return typeof route === 'string' || (route && typeof route === 'object');\n}\nfunction isRouteName(name) {\n    return typeof name === 'string' || typeof name === 'symbol';\n}\n\nconst NavigationFailureSymbol = Symbol((process.env.NODE_ENV !== 'production') ? 'navigation failure' : '');\n/**\n * Enumeration with all possible types for navigation failures. Can be passed to\n * {@link isNavigationFailure} to check for specific failures.\n */\nvar NavigationFailureType;\n(function (NavigationFailureType) {\n    /**\n     * An aborted navigation is a navigation that failed because a navigation\n     * guard returned `false` or called `next(false)`\n     */\n    NavigationFailureType[NavigationFailureType[\"aborted\"] = 4] = \"aborted\";\n    /**\n     * A cancelled navigation is a navigation that failed because a more recent\n     * navigation finished started (not necessarily finished).\n     */\n    NavigationFailureType[NavigationFailureType[\"cancelled\"] = 8] = \"cancelled\";\n    /**\n     * A duplicated navigation is a navigation that failed because it was\n     * initiated while already being at the exact same location.\n     */\n    NavigationFailureType[NavigationFailureType[\"duplicated\"] = 16] = \"duplicated\";\n})(NavigationFailureType || (NavigationFailureType = {}));\n// DEV only debug messages\nconst ErrorTypeMessages = {\n    [1 /* ErrorTypes.MATCHER_NOT_FOUND */]({ location, currentLocation }) {\n        return `No match for\\n ${JSON.stringify(location)}${currentLocation\n            ? '\\nwhile being at\\n' + JSON.stringify(currentLocation)\n            : ''}`;\n    },\n    [2 /* ErrorTypes.NAVIGATION_GUARD_REDIRECT */]({ from, to, }) {\n        return `Redirected from \"${from.fullPath}\" to \"${stringifyRoute(to)}\" via a navigation guard.`;\n    },\n    [4 /* ErrorTypes.NAVIGATION_ABORTED */]({ from, to }) {\n        return `Navigation aborted from \"${from.fullPath}\" to \"${to.fullPath}\" via a navigation guard.`;\n    },\n    [8 /* ErrorTypes.NAVIGATION_CANCELLED */]({ from, to }) {\n        return `Navigation cancelled from \"${from.fullPath}\" to \"${to.fullPath}\" with a new navigation.`;\n    },\n    [16 /* ErrorTypes.NAVIGATION_DUPLICATED */]({ from, to }) {\n        return `Avoided redundant navigation to current location: \"${from.fullPath}\".`;\n    },\n};\n/**\n * Creates a typed NavigationFailure object.\n * @internal\n * @param type - NavigationFailureType\n * @param params - { from, to }\n */\nfunction createRouterError(type, params) {\n    // keep full error messages in cjs versions\n    if ((process.env.NODE_ENV !== 'production') || !true) {\n        return assign(new Error(ErrorTypeMessages[type](params)), {\n            type,\n            [NavigationFailureSymbol]: true,\n        }, params);\n    }\n    else {\n        return assign(new Error(), {\n            type,\n            [NavigationFailureSymbol]: true,\n        }, params);\n    }\n}\nfunction isNavigationFailure(error, type) {\n    return (error instanceof Error &&\n        NavigationFailureSymbol in error &&\n        (type == null || !!(error.type & type)));\n}\nconst propertiesToLog = ['params', 'query', 'hash'];\nfunction stringifyRoute(to) {\n    if (typeof to === 'string')\n        return to;\n    if (to.path != null)\n        return to.path;\n    const location = {};\n    for (const key of propertiesToLog) {\n        if (key in to)\n            location[key] = to[key];\n    }\n    return JSON.stringify(location, null, 2);\n}\n\n// default pattern for a param: non-greedy everything but /\nconst BASE_PARAM_PATTERN = '[^/]+?';\nconst BASE_PATH_PARSER_OPTIONS = {\n    sensitive: false,\n    strict: false,\n    start: true,\n    end: true,\n};\n// Special Regex characters that must be escaped in static tokens\nconst REGEX_CHARS_RE = /[.+*?^${}()[\\]/\\\\]/g;\n/**\n * Creates a path parser from an array of Segments (a segment is an array of Tokens)\n *\n * @param segments - array of segments returned by tokenizePath\n * @param extraOptions - optional options for the regexp\n * @returns a PathParser\n */\nfunction tokensToParser(segments, extraOptions) {\n    const options = assign({}, BASE_PATH_PARSER_OPTIONS, extraOptions);\n    // the amount of scores is the same as the length of segments except for the root segment \"/\"\n    const score = [];\n    // the regexp as a string\n    let pattern = options.start ? '^' : '';\n    // extracted keys\n    const keys = [];\n    for (const segment of segments) {\n        // the root segment needs special treatment\n        const segmentScores = segment.length ? [] : [90 /* PathScore.Root */];\n        // allow trailing slash\n        if (options.strict && !segment.length)\n            pattern += '/';\n        for (let tokenIndex = 0; tokenIndex < segment.length; tokenIndex++) {\n            const token = segment[tokenIndex];\n            // resets the score if we are inside a sub-segment /:a-other-:b\n            let subSegmentScore = 40 /* PathScore.Segment */ +\n                (options.sensitive ? 0.25 /* PathScore.BonusCaseSensitive */ : 0);\n            if (token.type === 0 /* TokenType.Static */) {\n                // prepend the slash if we are starting a new segment\n                if (!tokenIndex)\n                    pattern += '/';\n                pattern += token.value.replace(REGEX_CHARS_RE, '\\\\$&');\n                subSegmentScore += 40 /* PathScore.Static */;\n            }\n            else if (token.type === 1 /* TokenType.Param */) {\n                const { value, repeatable, optional, regexp } = token;\n                keys.push({\n                    name: value,\n                    repeatable,\n                    optional,\n                });\n                const re = regexp ? regexp : BASE_PARAM_PATTERN;\n                // the user provided a custom regexp /:id(\\\\d+)\n                if (re !== BASE_PARAM_PATTERN) {\n                    subSegmentScore += 10 /* PathScore.BonusCustomRegExp */;\n                    // make sure the regexp is valid before using it\n                    try {\n                        new RegExp(`(${re})`);\n                    }\n                    catch (err) {\n                        throw new Error(`Invalid custom RegExp for param \"${value}\" (${re}): ` +\n                            err.message);\n                    }\n                }\n                // when we repeat we must take care of the repeating leading slash\n                let subPattern = repeatable ? `((?:${re})(?:/(?:${re}))*)` : `(${re})`;\n                // prepend the slash if we are starting a new segment\n                if (!tokenIndex)\n                    subPattern =\n                        // avoid an optional / if there are more segments e.g. /:p?-static\n                        // or /:p?-:p2\n                        optional && segment.length < 2\n                            ? `(?:/${subPattern})`\n                            : '/' + subPattern;\n                if (optional)\n                    subPattern += '?';\n                pattern += subPattern;\n                subSegmentScore += 20 /* PathScore.Dynamic */;\n                if (optional)\n                    subSegmentScore += -8 /* PathScore.BonusOptional */;\n                if (repeatable)\n                    subSegmentScore += -20 /* PathScore.BonusRepeatable */;\n                if (re === '.*')\n                    subSegmentScore += -50 /* PathScore.BonusWildcard */;\n            }\n            segmentScores.push(subSegmentScore);\n        }\n        // an empty array like /home/ -> [[{home}], []]\n        // if (!segment.length) pattern += '/'\n        score.push(segmentScores);\n    }\n    // only apply the strict bonus to the last score\n    if (options.strict && options.end) {\n        const i = score.length - 1;\n        score[i][score[i].length - 1] += 0.7000000000000001 /* PathScore.BonusStrict */;\n    }\n    // TODO: dev only warn double trailing slash\n    if (!options.strict)\n        pattern += '/?';\n    if (options.end)\n        pattern += '$';\n    // allow paths like /dynamic to only match dynamic or dynamic/... but not dynamic_something_else\n    else if (options.strict && !pattern.endsWith('/'))\n        pattern += '(?:/|$)';\n    const re = new RegExp(pattern, options.sensitive ? '' : 'i');\n    function parse(path) {\n        const match = path.match(re);\n        const params = {};\n        if (!match)\n            return null;\n        for (let i = 1; i < match.length; i++) {\n            const value = match[i] || '';\n            const key = keys[i - 1];\n            params[key.name] = value && key.repeatable ? value.split('/') : value;\n        }\n        return params;\n    }\n    function stringify(params) {\n        let path = '';\n        // for optional parameters to allow to be empty\n        let avoidDuplicatedSlash = false;\n        for (const segment of segments) {\n            if (!avoidDuplicatedSlash || !path.endsWith('/'))\n                path += '/';\n            avoidDuplicatedSlash = false;\n            for (const token of segment) {\n                if (token.type === 0 /* TokenType.Static */) {\n                    path += token.value;\n                }\n                else if (token.type === 1 /* TokenType.Param */) {\n                    const { value, repeatable, optional } = token;\n                    const param = value in params ? params[value] : '';\n                    if (isArray(param) && !repeatable) {\n                        throw new Error(`Provided param \"${value}\" is an array but it is not repeatable (* or + modifiers)`);\n                    }\n                    const text = isArray(param)\n                        ? param.join('/')\n                        : param;\n                    if (!text) {\n                        if (optional) {\n                            // if we have more than one optional param like /:a?-static we don't need to care about the optional param\n                            if (segment.length < 2) {\n                                // remove the last slash as we could be at the end\n                                if (path.endsWith('/'))\n                                    path = path.slice(0, -1);\n                                // do not append a slash on the next iteration\n                                else\n                                    avoidDuplicatedSlash = true;\n                            }\n                        }\n                        else\n                            throw new Error(`Missing required param \"${value}\"`);\n                    }\n                    path += text;\n                }\n            }\n        }\n        // avoid empty path when we have multiple optional params\n        return path || '/';\n    }\n    return {\n        re,\n        score,\n        keys,\n        parse,\n        stringify,\n    };\n}\n/**\n * Compares an array of numbers as used in PathParser.score and returns a\n * number. This function can be used to `sort` an array\n *\n * @param a - first array of numbers\n * @param b - second array of numbers\n * @returns 0 if both are equal, < 0 if a should be sorted first, > 0 if b\n * should be sorted first\n */\nfunction compareScoreArray(a, b) {\n    let i = 0;\n    while (i < a.length && i < b.length) {\n        const diff = b[i] - a[i];\n        // only keep going if diff === 0\n        if (diff)\n            return diff;\n        i++;\n    }\n    // if the last subsegment was Static, the shorter segments should be sorted first\n    // otherwise sort the longest segment first\n    if (a.length < b.length) {\n        return a.length === 1 && a[0] === 40 /* PathScore.Static */ + 40 /* PathScore.Segment */\n            ? -1\n            : 1;\n    }\n    else if (a.length > b.length) {\n        return b.length === 1 && b[0] === 40 /* PathScore.Static */ + 40 /* PathScore.Segment */\n            ? 1\n            : -1;\n    }\n    return 0;\n}\n/**\n * Compare function that can be used with `sort` to sort an array of PathParser\n *\n * @param a - first PathParser\n * @param b - second PathParser\n * @returns 0 if both are equal, < 0 if a should be sorted first, > 0 if b\n */\nfunction comparePathParserScore(a, b) {\n    let i = 0;\n    const aScore = a.score;\n    const bScore = b.score;\n    while (i < aScore.length && i < bScore.length) {\n        const comp = compareScoreArray(aScore[i], bScore[i]);\n        // do not return if both are equal\n        if (comp)\n            return comp;\n        i++;\n    }\n    if (Math.abs(bScore.length - aScore.length) === 1) {\n        if (isLastScoreNegative(aScore))\n            return 1;\n        if (isLastScoreNegative(bScore))\n            return -1;\n    }\n    // if a and b share the same score entries but b has more, sort b first\n    return bScore.length - aScore.length;\n    // this is the ternary version\n    // return aScore.length < bScore.length\n    //   ? 1\n    //   : aScore.length > bScore.length\n    //   ? -1\n    //   : 0\n}\n/**\n * This allows detecting splats at the end of a path: /home/:id(.*)*\n *\n * @param score - score to check\n * @returns true if the last entry is negative\n */\nfunction isLastScoreNegative(score) {\n    const last = score[score.length - 1];\n    return score.length > 0 && last[last.length - 1] < 0;\n}\n\nconst ROOT_TOKEN = {\n    type: 0 /* TokenType.Static */,\n    value: '',\n};\nconst VALID_PARAM_RE = /[a-zA-Z0-9_]/;\n// After some profiling, the cache seems to be unnecessary because tokenizePath\n// (the slowest part of adding a route) is very fast\n// const tokenCache = new Map<string, Token[][]>()\nfunction tokenizePath(path) {\n    if (!path)\n        return [[]];\n    if (path === '/')\n        return [[ROOT_TOKEN]];\n    if (!path.startsWith('/')) {\n        throw new Error((process.env.NODE_ENV !== 'production')\n            ? `Route paths should start with a \"/\": \"${path}\" should be \"/${path}\".`\n            : `Invalid path \"${path}\"`);\n    }\n    // if (tokenCache.has(path)) return tokenCache.get(path)!\n    function crash(message) {\n        throw new Error(`ERR (${state})/\"${buffer}\": ${message}`);\n    }\n    let state = 0 /* TokenizerState.Static */;\n    let previousState = state;\n    const tokens = [];\n    // the segment will always be valid because we get into the initial state\n    // with the leading /\n    let segment;\n    function finalizeSegment() {\n        if (segment)\n            tokens.push(segment);\n        segment = [];\n    }\n    // index on the path\n    let i = 0;\n    // char at index\n    let char;\n    // buffer of the value read\n    let buffer = '';\n    // custom regexp for a param\n    let customRe = '';\n    function consumeBuffer() {\n        if (!buffer)\n            return;\n        if (state === 0 /* TokenizerState.Static */) {\n            segment.push({\n                type: 0 /* TokenType.Static */,\n                value: buffer,\n            });\n        }\n        else if (state === 1 /* TokenizerState.Param */ ||\n            state === 2 /* TokenizerState.ParamRegExp */ ||\n            state === 3 /* TokenizerState.ParamRegExpEnd */) {\n            if (segment.length > 1 && (char === '*' || char === '+'))\n                crash(`A repeatable param (${buffer}) must be alone in its segment. eg: '/:ids+.`);\n            segment.push({\n                type: 1 /* TokenType.Param */,\n                value: buffer,\n                regexp: customRe,\n                repeatable: char === '*' || char === '+',\n                optional: char === '*' || char === '?',\n            });\n        }\n        else {\n            crash('Invalid state to consume buffer');\n        }\n        buffer = '';\n    }\n    function addCharToBuffer() {\n        buffer += char;\n    }\n    while (i < path.length) {\n        char = path[i++];\n        if (char === '\\\\' && state !== 2 /* TokenizerState.ParamRegExp */) {\n            previousState = state;\n            state = 4 /* TokenizerState.EscapeNext */;\n            continue;\n        }\n        switch (state) {\n            case 0 /* TokenizerState.Static */:\n                if (char === '/') {\n                    if (buffer) {\n                        consumeBuffer();\n                    }\n                    finalizeSegment();\n                }\n                else if (char === ':') {\n                    consumeBuffer();\n                    state = 1 /* TokenizerState.Param */;\n                }\n                else {\n                    addCharToBuffer();\n                }\n                break;\n            case 4 /* TokenizerState.EscapeNext */:\n                addCharToBuffer();\n                state = previousState;\n                break;\n            case 1 /* TokenizerState.Param */:\n                if (char === '(') {\n                    state = 2 /* TokenizerState.ParamRegExp */;\n                }\n                else if (VALID_PARAM_RE.test(char)) {\n                    addCharToBuffer();\n                }\n                else {\n                    consumeBuffer();\n                    state = 0 /* TokenizerState.Static */;\n                    // go back one character if we were not modifying\n                    if (char !== '*' && char !== '?' && char !== '+')\n                        i--;\n                }\n                break;\n            case 2 /* TokenizerState.ParamRegExp */:\n                // TODO: is it worth handling nested regexp? like :p(?:prefix_([^/]+)_suffix)\n                // it already works by escaping the closing )\n                // https://paths.esm.dev/?p=AAMeJbiAwQEcDKbAoAAkP60PG2R6QAvgNaA6AFACM2ABuQBB#\n                // is this really something people need since you can also write\n                // /prefix_:p()_suffix\n                if (char === ')') {\n                    // handle the escaped )\n                    if (customRe[customRe.length - 1] == '\\\\')\n                        customRe = customRe.slice(0, -1) + char;\n                    else\n                        state = 3 /* TokenizerState.ParamRegExpEnd */;\n                }\n                else {\n                    customRe += char;\n                }\n                break;\n            case 3 /* TokenizerState.ParamRegExpEnd */:\n                // same as finalizing a param\n                consumeBuffer();\n                state = 0 /* TokenizerState.Static */;\n                // go back one character if we were not modifying\n                if (char !== '*' && char !== '?' && char !== '+')\n                    i--;\n                customRe = '';\n                break;\n            default:\n                crash('Unknown state');\n                break;\n        }\n    }\n    if (state === 2 /* TokenizerState.ParamRegExp */)\n        crash(`Unfinished custom RegExp for param \"${buffer}\"`);\n    consumeBuffer();\n    finalizeSegment();\n    // tokenCache.set(path, tokens)\n    return tokens;\n}\n\nfunction createRouteRecordMatcher(record, parent, options) {\n    const parser = tokensToParser(tokenizePath(record.path), options);\n    // warn against params with the same name\n    if ((process.env.NODE_ENV !== 'production')) {\n        const existingKeys = new Set();\n        for (const key of parser.keys) {\n            if (existingKeys.has(key.name))\n                warn(`Found duplicated params with name \"${key.name}\" for path \"${record.path}\". Only the last one will be available on \"$route.params\".`);\n            existingKeys.add(key.name);\n        }\n    }\n    const matcher = assign(parser, {\n        record,\n        parent,\n        // these needs to be populated by the parent\n        children: [],\n        alias: [],\n    });\n    if (parent) {\n        // both are aliases or both are not aliases\n        // we don't want to mix them because the order is used when\n        // passing originalRecord in Matcher.addRoute\n        if (!matcher.record.aliasOf === !parent.record.aliasOf)\n            parent.children.push(matcher);\n    }\n    return matcher;\n}\n\n/**\n * Creates a Router Matcher.\n *\n * @internal\n * @param routes - array of initial routes\n * @param globalOptions - global route options\n */\nfunction createRouterMatcher(routes, globalOptions) {\n    // normalized ordered array of matchers\n    const matchers = [];\n    const matcherMap = new Map();\n    globalOptions = mergeOptions({ strict: false, end: true, sensitive: false }, globalOptions);\n    function getRecordMatcher(name) {\n        return matcherMap.get(name);\n    }\n    function addRoute(record, parent, originalRecord) {\n        // used later on to remove by name\n        const isRootAdd = !originalRecord;\n        const mainNormalizedRecord = normalizeRouteRecord(record);\n        if ((process.env.NODE_ENV !== 'production')) {\n            checkChildMissingNameWithEmptyPath(mainNormalizedRecord, parent);\n        }\n        // we might be the child of an alias\n        mainNormalizedRecord.aliasOf = originalRecord && originalRecord.record;\n        const options = mergeOptions(globalOptions, record);\n        // generate an array of records to correctly handle aliases\n        const normalizedRecords = [mainNormalizedRecord];\n        if ('alias' in record) {\n            const aliases = typeof record.alias === 'string' ? [record.alias] : record.alias;\n            for (const alias of aliases) {\n                normalizedRecords.push(\n                // we need to normalize again to ensure the `mods` property\n                // being non enumerable\n                normalizeRouteRecord(assign({}, mainNormalizedRecord, {\n                    // this allows us to hold a copy of the `components` option\n                    // so that async components cache is hold on the original record\n                    components: originalRecord\n                        ? originalRecord.record.components\n                        : mainNormalizedRecord.components,\n                    path: alias,\n                    // we might be the child of an alias\n                    aliasOf: originalRecord\n                        ? originalRecord.record\n                        : mainNormalizedRecord,\n                    // the aliases are always of the same kind as the original since they\n                    // are defined on the same record\n                })));\n            }\n        }\n        let matcher;\n        let originalMatcher;\n        for (const normalizedRecord of normalizedRecords) {\n            const { path } = normalizedRecord;\n            // Build up the path for nested routes if the child isn't an absolute\n            // route. Only add the / delimiter if the child path isn't empty and if the\n            // parent path doesn't have a trailing slash\n            if (parent && path[0] !== '/') {\n                const parentPath = parent.record.path;\n                const connectingSlash = parentPath[parentPath.length - 1] === '/' ? '' : '/';\n                normalizedRecord.path =\n                    parent.record.path + (path && connectingSlash + path);\n            }\n            if ((process.env.NODE_ENV !== 'production') && normalizedRecord.path === '*') {\n                throw new Error('Catch all routes (\"*\") must now be defined using a param with a custom regexp.\\n' +\n                    'See more at https://router.vuejs.org/guide/migration/#Removed-star-or-catch-all-routes.');\n            }\n            // create the object beforehand, so it can be passed to children\n            matcher = createRouteRecordMatcher(normalizedRecord, parent, options);\n            if ((process.env.NODE_ENV !== 'production') && parent && path[0] === '/')\n                checkMissingParamsInAbsolutePath(matcher, parent);\n            // if we are an alias we must tell the original record that we exist,\n            // so we can be removed\n            if (originalRecord) {\n                originalRecord.alias.push(matcher);\n                if ((process.env.NODE_ENV !== 'production')) {\n                    checkSameParams(originalRecord, matcher);\n                }\n            }\n            else {\n                // otherwise, the first record is the original and others are aliases\n                originalMatcher = originalMatcher || matcher;\n                if (originalMatcher !== matcher)\n                    originalMatcher.alias.push(matcher);\n                // remove the route if named and only for the top record (avoid in nested calls)\n                // this works because the original record is the first one\n                if (isRootAdd && record.name && !isAliasRecord(matcher)) {\n                    if ((process.env.NODE_ENV !== 'production')) {\n                        checkSameNameAsAncestor(record, parent);\n                    }\n                    removeRoute(record.name);\n                }\n            }\n            // Avoid adding a record that doesn't display anything. This allows passing through records without a component to\n            // not be reached and pass through the catch all route\n            if (isMatchable(matcher)) {\n                insertMatcher(matcher);\n            }\n            if (mainNormalizedRecord.children) {\n                const children = mainNormalizedRecord.children;\n                for (let i = 0; i < children.length; i++) {\n                    addRoute(children[i], matcher, originalRecord && originalRecord.children[i]);\n                }\n            }\n            // if there was no original record, then the first one was not an alias and all\n            // other aliases (if any) need to reference this record when adding children\n            originalRecord = originalRecord || matcher;\n            // TODO: add normalized records for more flexibility\n            // if (parent && isAliasRecord(originalRecord)) {\n            //   parent.children.push(originalRecord)\n            // }\n        }\n        return originalMatcher\n            ? () => {\n                // since other matchers are aliases, they should be removed by the original matcher\n                removeRoute(originalMatcher);\n            }\n            : noop;\n    }\n    function removeRoute(matcherRef) {\n        if (isRouteName(matcherRef)) {\n            const matcher = matcherMap.get(matcherRef);\n            if (matcher) {\n                matcherMap.delete(matcherRef);\n                matchers.splice(matchers.indexOf(matcher), 1);\n                matcher.children.forEach(removeRoute);\n                matcher.alias.forEach(removeRoute);\n            }\n        }\n        else {\n            const index = matchers.indexOf(matcherRef);\n            if (index > -1) {\n                matchers.splice(index, 1);\n                if (matcherRef.record.name)\n                    matcherMap.delete(matcherRef.record.name);\n                matcherRef.children.forEach(removeRoute);\n                matcherRef.alias.forEach(removeRoute);\n            }\n        }\n    }\n    function getRoutes() {\n        return matchers;\n    }\n    function insertMatcher(matcher) {\n        const index = findInsertionIndex(matcher, matchers);\n        matchers.splice(index, 0, matcher);\n        // only add the original record to the name map\n        if (matcher.record.name && !isAliasRecord(matcher))\n            matcherMap.set(matcher.record.name, matcher);\n    }\n    function resolve(location, currentLocation) {\n        let matcher;\n        let params = {};\n        let path;\n        let name;\n        if ('name' in location && location.name) {\n            matcher = matcherMap.get(location.name);\n            if (!matcher)\n                throw createRouterError(1 /* ErrorTypes.MATCHER_NOT_FOUND */, {\n                    location,\n                });\n            // warn if the user is passing invalid params so they can debug it better when they get removed\n            if ((process.env.NODE_ENV !== 'production')) {\n                const invalidParams = Object.keys(location.params || {}).filter(paramName => !matcher.keys.find(k => k.name === paramName));\n                if (invalidParams.length) {\n                    warn(`Discarded invalid param(s) \"${invalidParams.join('\", \"')}\" when navigating. See https://github.com/vuejs/router/blob/main/packages/router/CHANGELOG.md#414-2022-08-22 for more details.`);\n                }\n            }\n            name = matcher.record.name;\n            params = assign(\n            // paramsFromLocation is a new object\n            paramsFromLocation(currentLocation.params, \n            // only keep params that exist in the resolved location\n            // only keep optional params coming from a parent record\n            matcher.keys\n                .filter(k => !k.optional)\n                .concat(matcher.parent ? matcher.parent.keys.filter(k => k.optional) : [])\n                .map(k => k.name)), \n            // discard any existing params in the current location that do not exist here\n            // #1497 this ensures better active/exact matching\n            location.params &&\n                paramsFromLocation(location.params, matcher.keys.map(k => k.name)));\n            // throws if cannot be stringified\n            path = matcher.stringify(params);\n        }\n        else if (location.path != null) {\n            // no need to resolve the path with the matcher as it was provided\n            // this also allows the user to control the encoding\n            path = location.path;\n            if ((process.env.NODE_ENV !== 'production') && !path.startsWith('/')) {\n                warn(`The Matcher cannot resolve relative paths but received \"${path}\". Unless you directly called \\`matcher.resolve(\"${path}\")\\`, this is probably a bug in vue-router. Please open an issue at https://github.com/vuejs/router/issues/new/choose.`);\n            }\n            matcher = matchers.find(m => m.re.test(path));\n            // matcher should have a value after the loop\n            if (matcher) {\n                // we know the matcher works because we tested the regexp\n                params = matcher.parse(path);\n                name = matcher.record.name;\n            }\n            // location is a relative path\n        }\n        else {\n            // match by name or path of current route\n            matcher = currentLocation.name\n                ? matcherMap.get(currentLocation.name)\n                : matchers.find(m => m.re.test(currentLocation.path));\n            if (!matcher)\n                throw createRouterError(1 /* ErrorTypes.MATCHER_NOT_FOUND */, {\n                    location,\n                    currentLocation,\n                });\n            name = matcher.record.name;\n            // since we are navigating to the same location, we don't need to pick the\n            // params like when `name` is provided\n            params = assign({}, currentLocation.params, location.params);\n            path = matcher.stringify(params);\n        }\n        const matched = [];\n        let parentMatcher = matcher;\n        while (parentMatcher) {\n            // reversed order so parents are at the beginning\n            matched.unshift(parentMatcher.record);\n            parentMatcher = parentMatcher.parent;\n        }\n        return {\n            name,\n            path,\n            params,\n            matched,\n            meta: mergeMetaFields(matched),\n        };\n    }\n    // add initial routes\n    routes.forEach(route => addRoute(route));\n    function clearRoutes() {\n        matchers.length = 0;\n        matcherMap.clear();\n    }\n    return {\n        addRoute,\n        resolve,\n        removeRoute,\n        clearRoutes,\n        getRoutes,\n        getRecordMatcher,\n    };\n}\nfunction paramsFromLocation(params, keys) {\n    const newParams = {};\n    for (const key of keys) {\n        if (key in params)\n            newParams[key] = params[key];\n    }\n    return newParams;\n}\n/**\n * Normalizes a RouteRecordRaw. Creates a copy\n *\n * @param record\n * @returns the normalized version\n */\nfunction normalizeRouteRecord(record) {\n    const normalized = {\n        path: record.path,\n        redirect: record.redirect,\n        name: record.name,\n        meta: record.meta || {},\n        aliasOf: record.aliasOf,\n        beforeEnter: record.beforeEnter,\n        props: normalizeRecordProps(record),\n        children: record.children || [],\n        instances: {},\n        leaveGuards: new Set(),\n        updateGuards: new Set(),\n        enterCallbacks: {},\n        // must be declared afterwards\n        // mods: {},\n        components: 'components' in record\n            ? record.components || null\n            : record.component && { default: record.component },\n    };\n    // mods contain modules and shouldn't be copied,\n    // logged or anything. It's just used for internal\n    // advanced use cases like data loaders\n    Object.defineProperty(normalized, 'mods', {\n        value: {},\n    });\n    return normalized;\n}\n/**\n * Normalize the optional `props` in a record to always be an object similar to\n * components. Also accept a boolean for components.\n * @param record\n */\nfunction normalizeRecordProps(record) {\n    const propsObject = {};\n    // props does not exist on redirect records, but we can set false directly\n    const props = record.props || false;\n    if ('component' in record) {\n        propsObject.default = props;\n    }\n    else {\n        // NOTE: we could also allow a function to be applied to every component.\n        // Would need user feedback for use cases\n        for (const name in record.components)\n            propsObject[name] = typeof props === 'object' ? props[name] : props;\n    }\n    return propsObject;\n}\n/**\n * Checks if a record or any of its parent is an alias\n * @param record\n */\nfunction isAliasRecord(record) {\n    while (record) {\n        if (record.record.aliasOf)\n            return true;\n        record = record.parent;\n    }\n    return false;\n}\n/**\n * Merge meta fields of an array of records\n *\n * @param matched - array of matched records\n */\nfunction mergeMetaFields(matched) {\n    return matched.reduce((meta, record) => assign(meta, record.meta), {});\n}\nfunction mergeOptions(defaults, partialOptions) {\n    const options = {};\n    for (const key in defaults) {\n        options[key] = key in partialOptions ? partialOptions[key] : defaults[key];\n    }\n    return options;\n}\nfunction isSameParam(a, b) {\n    return (a.name === b.name &&\n        a.optional === b.optional &&\n        a.repeatable === b.repeatable);\n}\n/**\n * Check if a path and its alias have the same required params\n *\n * @param a - original record\n * @param b - alias record\n */\nfunction checkSameParams(a, b) {\n    for (const key of a.keys) {\n        if (!key.optional && !b.keys.find(isSameParam.bind(null, key)))\n            return warn(`Alias \"${b.record.path}\" and the original record: \"${a.record.path}\" must have the exact same param named \"${key.name}\"`);\n    }\n    for (const key of b.keys) {\n        if (!key.optional && !a.keys.find(isSameParam.bind(null, key)))\n            return warn(`Alias \"${b.record.path}\" and the original record: \"${a.record.path}\" must have the exact same param named \"${key.name}\"`);\n    }\n}\n/**\n * A route with a name and a child with an empty path without a name should warn when adding the route\n *\n * @param mainNormalizedRecord - RouteRecordNormalized\n * @param parent - RouteRecordMatcher\n */\nfunction checkChildMissingNameWithEmptyPath(mainNormalizedRecord, parent) {\n    if (parent &&\n        parent.record.name &&\n        !mainNormalizedRecord.name &&\n        !mainNormalizedRecord.path) {\n        warn(`The route named \"${String(parent.record.name)}\" has a child without a name and an empty path. Using that name won't render the empty path child so you probably want to move the name to the child instead. If this is intentional, add a name to the child route to remove the warning.`);\n    }\n}\nfunction checkSameNameAsAncestor(record, parent) {\n    for (let ancestor = parent; ancestor; ancestor = ancestor.parent) {\n        if (ancestor.record.name === record.name) {\n            throw new Error(`A route named \"${String(record.name)}\" has been added as a ${parent === ancestor ? 'child' : 'descendant'} of a route with the same name. Route names must be unique and a nested route cannot use the same name as an ancestor.`);\n        }\n    }\n}\nfunction checkMissingParamsInAbsolutePath(record, parent) {\n    for (const key of parent.keys) {\n        if (!record.keys.find(isSameParam.bind(null, key)))\n            return warn(`Absolute path \"${record.record.path}\" must have the exact same param named \"${key.name}\" as its parent \"${parent.record.path}\".`);\n    }\n}\n/**\n * Performs a binary search to find the correct insertion index for a new matcher.\n *\n * Matchers are primarily sorted by their score. If scores are tied then we also consider parent/child relationships,\n * with descendants coming before ancestors. If there's still a tie, new routes are inserted after existing routes.\n *\n * @param matcher - new matcher to be inserted\n * @param matchers - existing matchers\n */\nfunction findInsertionIndex(matcher, matchers) {\n    // First phase: binary search based on score\n    let lower = 0;\n    let upper = matchers.length;\n    while (lower !== upper) {\n        const mid = (lower + upper) >> 1;\n        const sortOrder = comparePathParserScore(matcher, matchers[mid]);\n        if (sortOrder < 0) {\n            upper = mid;\n        }\n        else {\n            lower = mid + 1;\n        }\n    }\n    // Second phase: check for an ancestor with the same score\n    const insertionAncestor = getInsertionAncestor(matcher);\n    if (insertionAncestor) {\n        upper = matchers.lastIndexOf(insertionAncestor, upper - 1);\n        if ((process.env.NODE_ENV !== 'production') && upper < 0) {\n            // This should never happen\n            warn(`Finding ancestor route \"${insertionAncestor.record.path}\" failed for \"${matcher.record.path}\"`);\n        }\n    }\n    return upper;\n}\nfunction getInsertionAncestor(matcher) {\n    let ancestor = matcher;\n    while ((ancestor = ancestor.parent)) {\n        if (isMatchable(ancestor) &&\n            comparePathParserScore(matcher, ancestor) === 0) {\n            return ancestor;\n        }\n    }\n    return;\n}\n/**\n * Checks if a matcher can be reachable. This means if it's possible to reach it as a route. For example, routes without\n * a component, or name, or redirect, are just used to group other routes.\n * @param matcher\n * @param matcher.record record of the matcher\n * @returns\n */\nfunction isMatchable({ record }) {\n    return !!(record.name ||\n        (record.components && Object.keys(record.components).length) ||\n        record.redirect);\n}\n\n/**\n * Transforms a queryString into a {@link LocationQuery} object. Accept both, a\n * version with the leading `?` and without Should work as URLSearchParams\n\n * @internal\n *\n * @param search - search string to parse\n * @returns a query object\n */\nfunction parseQuery(search) {\n    const query = {};\n    // avoid creating an object with an empty key and empty value\n    // because of split('&')\n    if (search === '' || search === '?')\n        return query;\n    const hasLeadingIM = search[0] === '?';\n    const searchParams = (hasLeadingIM ? search.slice(1) : search).split('&');\n    for (let i = 0; i < searchParams.length; ++i) {\n        // pre decode the + into space\n        const searchParam = searchParams[i].replace(PLUS_RE, ' ');\n        // allow the = character\n        const eqPos = searchParam.indexOf('=');\n        const key = decode(eqPos < 0 ? searchParam : searchParam.slice(0, eqPos));\n        const value = eqPos < 0 ? null : decode(searchParam.slice(eqPos + 1));\n        if (key in query) {\n            // an extra variable for ts types\n            let currentValue = query[key];\n            if (!isArray(currentValue)) {\n                currentValue = query[key] = [currentValue];\n            }\n            currentValue.push(value);\n        }\n        else {\n            query[key] = value;\n        }\n    }\n    return query;\n}\n/**\n * Stringifies a {@link LocationQueryRaw} object. Like `URLSearchParams`, it\n * doesn't prepend a `?`\n *\n * @internal\n *\n * @param query - query object to stringify\n * @returns string version of the query without the leading `?`\n */\nfunction stringifyQuery(query) {\n    let search = '';\n    for (let key in query) {\n        const value = query[key];\n        key = encodeQueryKey(key);\n        if (value == null) {\n            // only null adds the value\n            if (value !== undefined) {\n                search += (search.length ? '&' : '') + key;\n            }\n            continue;\n        }\n        // keep null values\n        const values = isArray(value)\n            ? value.map(v => v && encodeQueryValue(v))\n            : [value && encodeQueryValue(value)];\n        values.forEach(value => {\n            // skip undefined values in arrays as if they were not present\n            // smaller code than using filter\n            if (value !== undefined) {\n                // only append & with non-empty search\n                search += (search.length ? '&' : '') + key;\n                if (value != null)\n                    search += '=' + value;\n            }\n        });\n    }\n    return search;\n}\n/**\n * Transforms a {@link LocationQueryRaw} into a {@link LocationQuery} by casting\n * numbers into strings, removing keys with an undefined value and replacing\n * undefined with null in arrays\n *\n * @param query - query object to normalize\n * @returns a normalized query object\n */\nfunction normalizeQuery(query) {\n    const normalizedQuery = {};\n    for (const key in query) {\n        const value = query[key];\n        if (value !== undefined) {\n            normalizedQuery[key] = isArray(value)\n                ? value.map(v => (v == null ? null : '' + v))\n                : value == null\n                    ? value\n                    : '' + value;\n        }\n    }\n    return normalizedQuery;\n}\n\n/**\n * RouteRecord being rendered by the closest ancestor Router View. Used for\n * `onBeforeRouteUpdate` and `onBeforeRouteLeave`. rvlm stands for Router View\n * Location Matched\n *\n * @internal\n */\nconst matchedRouteKey = Symbol((process.env.NODE_ENV !== 'production') ? 'router view location matched' : '');\n/**\n * Allows overriding the router view depth to control which component in\n * `matched` is rendered. rvd stands for Router View Depth\n *\n * @internal\n */\nconst viewDepthKey = Symbol((process.env.NODE_ENV !== 'production') ? 'router view depth' : '');\n/**\n * Allows overriding the router instance returned by `useRouter` in tests. r\n * stands for router\n *\n * @internal\n */\nconst routerKey = Symbol((process.env.NODE_ENV !== 'production') ? 'router' : '');\n/**\n * Allows overriding the current route returned by `useRoute` in tests. rl\n * stands for route location\n *\n * @internal\n */\nconst routeLocationKey = Symbol((process.env.NODE_ENV !== 'production') ? 'route location' : '');\n/**\n * Allows overriding the current route used by router-view. Internally this is\n * used when the `route` prop is passed.\n *\n * @internal\n */\nconst routerViewLocationKey = Symbol((process.env.NODE_ENV !== 'production') ? 'router view location' : '');\n\n/**\n * Create a list of callbacks that can be reset. Used to create before and after navigation guards list\n */\nfunction useCallbacks() {\n    let handlers = [];\n    function add(handler) {\n        handlers.push(handler);\n        return () => {\n            const i = handlers.indexOf(handler);\n            if (i > -1)\n                handlers.splice(i, 1);\n        };\n    }\n    function reset() {\n        handlers = [];\n    }\n    return {\n        add,\n        list: () => handlers.slice(),\n        reset,\n    };\n}\n\nfunction registerGuard(record, name, guard) {\n    const removeFromList = () => {\n        record[name].delete(guard);\n    };\n    onUnmounted(removeFromList);\n    onDeactivated(removeFromList);\n    onActivated(() => {\n        record[name].add(guard);\n    });\n    record[name].add(guard);\n}\n/**\n * Add a navigation guard that triggers whenever the component for the current\n * location is about to be left. Similar to {@link beforeRouteLeave} but can be\n * used in any component. The guard is removed when the component is unmounted.\n *\n * @param leaveGuard - {@link NavigationGuard}\n */\nfunction onBeforeRouteLeave(leaveGuard) {\n    if ((process.env.NODE_ENV !== 'production') && !getCurrentInstance()) {\n        warn('getCurrentInstance() returned null. onBeforeRouteLeave() must be called at the top of a setup function');\n        return;\n    }\n    const activeRecord = inject(matchedRouteKey, \n    // to avoid warning\n    {}).value;\n    if (!activeRecord) {\n        (process.env.NODE_ENV !== 'production') &&\n            warn('No active route record was found when calling `onBeforeRouteLeave()`. Make sure you call this function inside a component child of <router-view>. Maybe you called it inside of App.vue?');\n        return;\n    }\n    registerGuard(activeRecord, 'leaveGuards', leaveGuard);\n}\n/**\n * Add a navigation guard that triggers whenever the current location is about\n * to be updated. Similar to {@link beforeRouteUpdate} but can be used in any\n * component. The guard is removed when the component is unmounted.\n *\n * @param updateGuard - {@link NavigationGuard}\n */\nfunction onBeforeRouteUpdate(updateGuard) {\n    if ((process.env.NODE_ENV !== 'production') && !getCurrentInstance()) {\n        warn('getCurrentInstance() returned null. onBeforeRouteUpdate() must be called at the top of a setup function');\n        return;\n    }\n    const activeRecord = inject(matchedRouteKey, \n    // to avoid warning\n    {}).value;\n    if (!activeRecord) {\n        (process.env.NODE_ENV !== 'production') &&\n            warn('No active route record was found when calling `onBeforeRouteUpdate()`. Make sure you call this function inside a component child of <router-view>. Maybe you called it inside of App.vue?');\n        return;\n    }\n    registerGuard(activeRecord, 'updateGuards', updateGuard);\n}\nfunction guardToPromiseFn(guard, to, from, record, name, runWithContext = fn => fn()) {\n    // keep a reference to the enterCallbackArray to prevent pushing callbacks if a new navigation took place\n    const enterCallbackArray = record &&\n        // name is defined if record is because of the function overload\n        (record.enterCallbacks[name] = record.enterCallbacks[name] || []);\n    return () => new Promise((resolve, reject) => {\n        const next = (valid) => {\n            if (valid === false) {\n                reject(createRouterError(4 /* ErrorTypes.NAVIGATION_ABORTED */, {\n                    from,\n                    to,\n                }));\n            }\n            else if (valid instanceof Error) {\n                reject(valid);\n            }\n            else if (isRouteLocation(valid)) {\n                reject(createRouterError(2 /* ErrorTypes.NAVIGATION_GUARD_REDIRECT */, {\n                    from: to,\n                    to: valid,\n                }));\n            }\n            else {\n                if (enterCallbackArray &&\n                    // since enterCallbackArray is truthy, both record and name also are\n                    record.enterCallbacks[name] === enterCallbackArray &&\n                    typeof valid === 'function') {\n                    enterCallbackArray.push(valid);\n                }\n                resolve();\n            }\n        };\n        // wrapping with Promise.resolve allows it to work with both async and sync guards\n        const guardReturn = runWithContext(() => guard.call(record && record.instances[name], to, from, (process.env.NODE_ENV !== 'production') ? canOnlyBeCalledOnce(next, to, from) : next));\n        let guardCall = Promise.resolve(guardReturn);\n        if (guard.length < 3)\n            guardCall = guardCall.then(next);\n        if ((process.env.NODE_ENV !== 'production') && guard.length > 2) {\n            const message = `The \"next\" callback was never called inside of ${guard.name ? '\"' + guard.name + '\"' : ''}:\\n${guard.toString()}\\n. If you are returning a value instead of calling \"next\", make sure to remove the \"next\" parameter from your function.`;\n            if (typeof guardReturn === 'object' && 'then' in guardReturn) {\n                guardCall = guardCall.then(resolvedValue => {\n                    // @ts-expect-error: _called is added at canOnlyBeCalledOnce\n                    if (!next._called) {\n                        warn(message);\n                        return Promise.reject(new Error('Invalid navigation guard'));\n                    }\n                    return resolvedValue;\n                });\n            }\n            else if (guardReturn !== undefined) {\n                // @ts-expect-error: _called is added at canOnlyBeCalledOnce\n                if (!next._called) {\n                    warn(message);\n                    reject(new Error('Invalid navigation guard'));\n                    return;\n                }\n            }\n        }\n        guardCall.catch(err => reject(err));\n    });\n}\nfunction canOnlyBeCalledOnce(next, to, from) {\n    let called = 0;\n    return function () {\n        if (called++ === 1)\n            warn(`The \"next\" callback was called more than once in one navigation guard when going from \"${from.fullPath}\" to \"${to.fullPath}\". It should be called exactly one time in each navigation guard. This will fail in production.`);\n        // @ts-expect-error: we put it in the original one because it's easier to check\n        next._called = true;\n        if (called === 1)\n            next.apply(null, arguments);\n    };\n}\nfunction extractComponentsGuards(matched, guardType, to, from, runWithContext = fn => fn()) {\n    const guards = [];\n    for (const record of matched) {\n        if ((process.env.NODE_ENV !== 'production') && !record.components && !record.children.length) {\n            warn(`Record with path \"${record.path}\" is either missing a \"component(s)\"` +\n                ` or \"children\" property.`);\n        }\n        for (const name in record.components) {\n            let rawComponent = record.components[name];\n            if ((process.env.NODE_ENV !== 'production')) {\n                if (!rawComponent ||\n                    (typeof rawComponent !== 'object' &&\n                        typeof rawComponent !== 'function')) {\n                    warn(`Component \"${name}\" in record with path \"${record.path}\" is not` +\n                        ` a valid component. Received \"${String(rawComponent)}\".`);\n                    // throw to ensure we stop here but warn to ensure the message isn't\n                    // missed by the user\n                    throw new Error('Invalid route component');\n                }\n                else if ('then' in rawComponent) {\n                    // warn if user wrote import('/component.vue') instead of () =>\n                    // import('./component.vue')\n                    warn(`Component \"${name}\" in record with path \"${record.path}\" is a ` +\n                        `Promise instead of a function that returns a Promise. Did you ` +\n                        `write \"import('./MyPage.vue')\" instead of ` +\n                        `\"() => import('./MyPage.vue')\" ? This will break in ` +\n                        `production if not fixed.`);\n                    const promise = rawComponent;\n                    rawComponent = () => promise;\n                }\n                else if (rawComponent.__asyncLoader &&\n                    // warn only once per component\n                    !rawComponent.__warnedDefineAsync) {\n                    rawComponent.__warnedDefineAsync = true;\n                    warn(`Component \"${name}\" in record with path \"${record.path}\" is defined ` +\n                        `using \"defineAsyncComponent()\". ` +\n                        `Write \"() => import('./MyPage.vue')\" instead of ` +\n                        `\"defineAsyncComponent(() => import('./MyPage.vue'))\".`);\n                }\n            }\n            // skip update and leave guards if the route component is not mounted\n            if (guardType !== 'beforeRouteEnter' && !record.instances[name])\n                continue;\n            if (isRouteComponent(rawComponent)) {\n                // __vccOpts is added by vue-class-component and contain the regular options\n                const options = rawComponent.__vccOpts || rawComponent;\n                const guard = options[guardType];\n                guard &&\n                    guards.push(guardToPromiseFn(guard, to, from, record, name, runWithContext));\n            }\n            else {\n                // start requesting the chunk already\n                let componentPromise = rawComponent();\n                if ((process.env.NODE_ENV !== 'production') && !('catch' in componentPromise)) {\n                    warn(`Component \"${name}\" in record with path \"${record.path}\" is a function that does not return a Promise. If you were passing a functional component, make sure to add a \"displayName\" to the component. This will break in production if not fixed.`);\n                    componentPromise = Promise.resolve(componentPromise);\n                }\n                guards.push(() => componentPromise.then(resolved => {\n                    if (!resolved)\n                        throw new Error(`Couldn't resolve component \"${name}\" at \"${record.path}\"`);\n                    const resolvedComponent = isESModule(resolved)\n                        ? resolved.default\n                        : resolved;\n                    // keep the resolved module for plugins like data loaders\n                    record.mods[name] = resolved;\n                    // replace the function with the resolved component\n                    // cannot be null or undefined because we went into the for loop\n                    record.components[name] = resolvedComponent;\n                    // __vccOpts is added by vue-class-component and contain the regular options\n                    const options = resolvedComponent.__vccOpts || resolvedComponent;\n                    const guard = options[guardType];\n                    return (guard &&\n                        guardToPromiseFn(guard, to, from, record, name, runWithContext)());\n                }));\n            }\n        }\n    }\n    return guards;\n}\n/**\n * Ensures a route is loaded, so it can be passed as o prop to `<RouterView>`.\n *\n * @param route - resolved route to load\n */\nfunction loadRouteLocation(route) {\n    return route.matched.every(record => record.redirect)\n        ? Promise.reject(new Error('Cannot load a route that redirects.'))\n        : Promise.all(route.matched.map(record => record.components &&\n            Promise.all(Object.keys(record.components).reduce((promises, name) => {\n                const rawComponent = record.components[name];\n                if (typeof rawComponent === 'function' &&\n                    !('displayName' in rawComponent)) {\n                    promises.push(rawComponent().then(resolved => {\n                        if (!resolved)\n                            return Promise.reject(new Error(`Couldn't resolve component \"${name}\" at \"${record.path}\". Ensure you passed a function that returns a promise.`));\n                        const resolvedComponent = isESModule(resolved)\n                            ? resolved.default\n                            : resolved;\n                        // keep the resolved module for plugins like data loaders\n                        record.mods[name] = resolved;\n                        // replace the function with the resolved component\n                        // cannot be null or undefined because we went into the for loop\n                        record.components[name] = resolvedComponent;\n                        return;\n                    }));\n                }\n                return promises;\n            }, [])))).then(() => route);\n}\n\n// TODO: we could allow currentRoute as a prop to expose `isActive` and\n// `isExactActive` behavior should go through an RFC\n/**\n * Returns the internal behavior of a {@link RouterLink} without the rendering part.\n *\n * @param props - a `to` location and an optional `replace` flag\n */\nfunction useLink(props) {\n    const router = inject(routerKey);\n    const currentRoute = inject(routeLocationKey);\n    let hasPrevious = false;\n    let previousTo = null;\n    const route = computed(() => {\n        const to = unref(props.to);\n        if ((process.env.NODE_ENV !== 'production') && (!hasPrevious || to !== previousTo)) {\n            if (!isRouteLocation(to)) {\n                if (hasPrevious) {\n                    warn(`Invalid value for prop \"to\" in useLink()\\n- to:`, to, `\\n- previous to:`, previousTo, `\\n- props:`, props);\n                }\n                else {\n                    warn(`Invalid value for prop \"to\" in useLink()\\n- to:`, to, `\\n- props:`, props);\n                }\n            }\n            previousTo = to;\n            hasPrevious = true;\n        }\n        return router.resolve(to);\n    });\n    const activeRecordIndex = computed(() => {\n        const { matched } = route.value;\n        const { length } = matched;\n        const routeMatched = matched[length - 1];\n        const currentMatched = currentRoute.matched;\n        if (!routeMatched || !currentMatched.length)\n            return -1;\n        const index = currentMatched.findIndex(isSameRouteRecord.bind(null, routeMatched));\n        if (index > -1)\n            return index;\n        // possible parent record\n        const parentRecordPath = getOriginalPath(matched[length - 2]);\n        return (\n        // we are dealing with nested routes\n        length > 1 &&\n            // if the parent and matched route have the same path, this link is\n            // referring to the empty child. Or we currently are on a different\n            // child of the same parent\n            getOriginalPath(routeMatched) === parentRecordPath &&\n            // avoid comparing the child with its parent\n            currentMatched[currentMatched.length - 1].path !== parentRecordPath\n            ? currentMatched.findIndex(isSameRouteRecord.bind(null, matched[length - 2]))\n            : index);\n    });\n    const isActive = computed(() => activeRecordIndex.value > -1 &&\n        includesParams(currentRoute.params, route.value.params));\n    const isExactActive = computed(() => activeRecordIndex.value > -1 &&\n        activeRecordIndex.value === currentRoute.matched.length - 1 &&\n        isSameRouteLocationParams(currentRoute.params, route.value.params));\n    function navigate(e = {}) {\n        if (guardEvent(e)) {\n            const p = router[unref(props.replace) ? 'replace' : 'push'](unref(props.to)\n            // avoid uncaught errors are they are logged anyway\n            ).catch(noop);\n            if (props.viewTransition &&\n                typeof document !== 'undefined' &&\n                'startViewTransition' in document) {\n                document.startViewTransition(() => p);\n            }\n            return p;\n        }\n        return Promise.resolve();\n    }\n    // devtools only\n    if (((process.env.NODE_ENV !== 'production') || __VUE_PROD_DEVTOOLS__) && isBrowser) {\n        const instance = getCurrentInstance();\n        if (instance) {\n            const linkContextDevtools = {\n                route: route.value,\n                isActive: isActive.value,\n                isExactActive: isExactActive.value,\n                error: null,\n            };\n            // @ts-expect-error: this is internal\n            instance.__vrl_devtools = instance.__vrl_devtools || [];\n            // @ts-expect-error: this is internal\n            instance.__vrl_devtools.push(linkContextDevtools);\n            watchEffect(() => {\n                linkContextDevtools.route = route.value;\n                linkContextDevtools.isActive = isActive.value;\n                linkContextDevtools.isExactActive = isExactActive.value;\n                linkContextDevtools.error = isRouteLocation(unref(props.to))\n                    ? null\n                    : 'Invalid \"to\" value';\n            }, { flush: 'post' });\n        }\n    }\n    /**\n     * NOTE: update {@link _RouterLinkI}'s `$slots` type when updating this\n     */\n    return {\n        route,\n        href: computed(() => route.value.href),\n        isActive,\n        isExactActive,\n        navigate,\n    };\n}\nfunction preferSingleVNode(vnodes) {\n    return vnodes.length === 1 ? vnodes[0] : vnodes;\n}\nconst RouterLinkImpl = /*#__PURE__*/ defineComponent({\n    name: 'RouterLink',\n    compatConfig: { MODE: 3 },\n    props: {\n        to: {\n            type: [String, Object],\n            required: true,\n        },\n        replace: Boolean,\n        activeClass: String,\n        // inactiveClass: String,\n        exactActiveClass: String,\n        custom: Boolean,\n        ariaCurrentValue: {\n            type: String,\n            default: 'page',\n        },\n        viewTransition: Boolean,\n    },\n    useLink,\n    setup(props, { slots }) {\n        const link = reactive(useLink(props));\n        const { options } = inject(routerKey);\n        const elClass = computed(() => ({\n            [getLinkClass(props.activeClass, options.linkActiveClass, 'router-link-active')]: link.isActive,\n            // [getLinkClass(\n            //   props.inactiveClass,\n            //   options.linkInactiveClass,\n            //   'router-link-inactive'\n            // )]: !link.isExactActive,\n            [getLinkClass(props.exactActiveClass, options.linkExactActiveClass, 'router-link-exact-active')]: link.isExactActive,\n        }));\n        return () => {\n            const children = slots.default && preferSingleVNode(slots.default(link));\n            return props.custom\n                ? children\n                : h('a', {\n                    'aria-current': link.isExactActive\n                        ? props.ariaCurrentValue\n                        : null,\n                    href: link.href,\n                    // this would override user added attrs but Vue will still add\n                    // the listener, so we end up triggering both\n                    onClick: link.navigate,\n                    class: elClass.value,\n                }, children);\n        };\n    },\n});\n// export the public type for h/tsx inference\n// also to avoid inline import() in generated d.ts files\n/**\n * Component to render a link that triggers a navigation on click.\n */\nconst RouterLink = RouterLinkImpl;\nfunction guardEvent(e) {\n    // don't redirect with control keys\n    if (e.metaKey || e.altKey || e.ctrlKey || e.shiftKey)\n        return;\n    // don't redirect when preventDefault called\n    if (e.defaultPrevented)\n        return;\n    // don't redirect on right click\n    if (e.button !== undefined && e.button !== 0)\n        return;\n    // don't redirect if `target=\"_blank\"`\n    // @ts-expect-error getAttribute does exist\n    if (e.currentTarget && e.currentTarget.getAttribute) {\n        // @ts-expect-error getAttribute exists\n        const target = e.currentTarget.getAttribute('target');\n        if (/\\b_blank\\b/i.test(target))\n            return;\n    }\n    // this may be a Weex event which doesn't have this method\n    if (e.preventDefault)\n        e.preventDefault();\n    return true;\n}\nfunction includesParams(outer, inner) {\n    for (const key in inner) {\n        const innerValue = inner[key];\n        const outerValue = outer[key];\n        if (typeof innerValue === 'string') {\n            if (innerValue !== outerValue)\n                return false;\n        }\n        else {\n            if (!isArray(outerValue) ||\n                outerValue.length !== innerValue.length ||\n                innerValue.some((value, i) => value !== outerValue[i]))\n                return false;\n        }\n    }\n    return true;\n}\n/**\n * Get the original path value of a record by following its aliasOf\n * @param record\n */\nfunction getOriginalPath(record) {\n    return record ? (record.aliasOf ? record.aliasOf.path : record.path) : '';\n}\n/**\n * Utility class to get the active class based on defaults.\n * @param propClass\n * @param globalClass\n * @param defaultClass\n */\nconst getLinkClass = (propClass, globalClass, defaultClass) => propClass != null\n    ? propClass\n    : globalClass != null\n        ? globalClass\n        : defaultClass;\n\nconst RouterViewImpl = /*#__PURE__*/ defineComponent({\n    name: 'RouterView',\n    // #674 we manually inherit them\n    inheritAttrs: false,\n    props: {\n        name: {\n            type: String,\n            default: 'default',\n        },\n        route: Object,\n    },\n    // Better compat for @vue/compat users\n    // https://github.com/vuejs/router/issues/1315\n    compatConfig: { MODE: 3 },\n    setup(props, { attrs, slots }) {\n        (process.env.NODE_ENV !== 'production') && warnDeprecatedUsage();\n        const injectedRoute = inject(routerViewLocationKey);\n        const routeToDisplay = computed(() => props.route || injectedRoute.value);\n        const injectedDepth = inject(viewDepthKey, 0);\n        // The depth changes based on empty components option, which allows passthrough routes e.g. routes with children\n        // that are used to reuse the `path` property\n        const depth = computed(() => {\n            let initialDepth = unref(injectedDepth);\n            const { matched } = routeToDisplay.value;\n            let matchedRoute;\n            while ((matchedRoute = matched[initialDepth]) &&\n                !matchedRoute.components) {\n                initialDepth++;\n            }\n            return initialDepth;\n        });\n        const matchedRouteRef = computed(() => routeToDisplay.value.matched[depth.value]);\n        provide(viewDepthKey, computed(() => depth.value + 1));\n        provide(matchedRouteKey, matchedRouteRef);\n        provide(routerViewLocationKey, routeToDisplay);\n        const viewRef = ref();\n        // watch at the same time the component instance, the route record we are\n        // rendering, and the name\n        watch(() => [viewRef.value, matchedRouteRef.value, props.name], ([instance, to, name], [oldInstance, from, oldName]) => {\n            // copy reused instances\n            if (to) {\n                // this will update the instance for new instances as well as reused\n                // instances when navigating to a new route\n                to.instances[name] = instance;\n                // the component instance is reused for a different route or name, so\n                // we copy any saved update or leave guards. With async setup, the\n                // mounting component will mount before the matchedRoute changes,\n                // making instance === oldInstance, so we check if guards have been\n                // added before. This works because we remove guards when\n                // unmounting/deactivating components\n                if (from && from !== to && instance && instance === oldInstance) {\n                    if (!to.leaveGuards.size) {\n                        to.leaveGuards = from.leaveGuards;\n                    }\n                    if (!to.updateGuards.size) {\n                        to.updateGuards = from.updateGuards;\n                    }\n                }\n            }\n            // trigger beforeRouteEnter next callbacks\n            if (instance &&\n                to &&\n                // if there is no instance but to and from are the same this might be\n                // the first visit\n                (!from || !isSameRouteRecord(to, from) || !oldInstance)) {\n                (to.enterCallbacks[name] || []).forEach(callback => callback(instance));\n            }\n        }, { flush: 'post' });\n        return () => {\n            const route = routeToDisplay.value;\n            // we need the value at the time we render because when we unmount, we\n            // navigated to a different location so the value is different\n            const currentName = props.name;\n            const matchedRoute = matchedRouteRef.value;\n            const ViewComponent = matchedRoute && matchedRoute.components[currentName];\n            if (!ViewComponent) {\n                return normalizeSlot(slots.default, { Component: ViewComponent, route });\n            }\n            // props from route configuration\n            const routePropsOption = matchedRoute.props[currentName];\n            const routeProps = routePropsOption\n                ? routePropsOption === true\n                    ? route.params\n                    : typeof routePropsOption === 'function'\n                        ? routePropsOption(route)\n                        : routePropsOption\n                : null;\n            const onVnodeUnmounted = vnode => {\n                // remove the instance reference to prevent leak\n                if (vnode.component.isUnmounted) {\n                    matchedRoute.instances[currentName] = null;\n                }\n            };\n            const component = h(ViewComponent, assign({}, routeProps, attrs, {\n                onVnodeUnmounted,\n                ref: viewRef,\n            }));\n            if (((process.env.NODE_ENV !== 'production') || __VUE_PROD_DEVTOOLS__) &&\n                isBrowser &&\n                component.ref) {\n                // TODO: can display if it's an alias, its props\n                const info = {\n                    depth: depth.value,\n                    name: matchedRoute.name,\n                    path: matchedRoute.path,\n                    meta: matchedRoute.meta,\n                };\n                const internalInstances = isArray(component.ref)\n                    ? component.ref.map(r => r.i)\n                    : [component.ref.i];\n                internalInstances.forEach(instance => {\n                    // @ts-expect-error\n                    instance.__vrv_devtools = info;\n                });\n            }\n            return (\n            // pass the vnode to the slot as a prop.\n            // h and <component :is=\"...\"> both accept vnodes\n            normalizeSlot(slots.default, { Component: component, route }) ||\n                component);\n        };\n    },\n});\nfunction normalizeSlot(slot, data) {\n    if (!slot)\n        return null;\n    const slotContent = slot(data);\n    return slotContent.length === 1 ? slotContent[0] : slotContent;\n}\n// export the public type for h/tsx inference\n// also to avoid inline import() in generated d.ts files\n/**\n * Component to display the current route the user is at.\n */\nconst RouterView = RouterViewImpl;\n// warn against deprecated usage with <transition> & <keep-alive>\n// due to functional component being no longer eager in Vue 3\nfunction warnDeprecatedUsage() {\n    const instance = getCurrentInstance();\n    const parentName = instance.parent && instance.parent.type.name;\n    const parentSubTreeType = instance.parent && instance.parent.subTree && instance.parent.subTree.type;\n    if (parentName &&\n        (parentName === 'KeepAlive' || parentName.includes('Transition')) &&\n        typeof parentSubTreeType === 'object' &&\n        parentSubTreeType.name === 'RouterView') {\n        const comp = parentName === 'KeepAlive' ? 'keep-alive' : 'transition';\n        warn(`<router-view> can no longer be used directly inside <transition> or <keep-alive>.\\n` +\n            `Use slot props instead:\\n\\n` +\n            `<router-view v-slot=\"{ Component }\">\\n` +\n            `  <${comp}>\\n` +\n            `    <component :is=\"Component\" />\\n` +\n            `  </${comp}>\\n` +\n            `</router-view>`);\n    }\n}\n\n/**\n * Copies a route location and removes any problematic properties that cannot be shown in devtools (e.g. Vue instances).\n *\n * @param routeLocation - routeLocation to format\n * @param tooltip - optional tooltip\n * @returns a copy of the routeLocation\n */\nfunction formatRouteLocation(routeLocation, tooltip) {\n    const copy = assign({}, routeLocation, {\n        // remove variables that can contain vue instances\n        matched: routeLocation.matched.map(matched => omit(matched, ['instances', 'children', 'aliasOf'])),\n    });\n    return {\n        _custom: {\n            type: null,\n            readOnly: true,\n            display: routeLocation.fullPath,\n            tooltip,\n            value: copy,\n        },\n    };\n}\nfunction formatDisplay(display) {\n    return {\n        _custom: {\n            display,\n        },\n    };\n}\n// to support multiple router instances\nlet routerId = 0;\nfunction addDevtools(app, router, matcher) {\n    // Take over router.beforeEach and afterEach\n    // make sure we are not registering the devtool twice\n    if (router.__hasDevtools)\n        return;\n    router.__hasDevtools = true;\n    // increment to support multiple router instances\n    const id = routerId++;\n    setupDevtoolsPlugin({\n        id: 'org.vuejs.router' + (id ? '.' + id : ''),\n        label: 'Vue Router',\n        packageName: 'vue-router',\n        homepage: 'https://router.vuejs.org',\n        logo: 'https://router.vuejs.org/logo.png',\n        componentStateTypes: ['Routing'],\n        app,\n    }, api => {\n        if (typeof api.now !== 'function') {\n            console.warn('[Vue Router]: You seem to be using an outdated version of Vue Devtools. Are you still using the Beta release instead of the stable one? You can find the links at https://devtools.vuejs.org/guide/installation.html.');\n        }\n        // display state added by the router\n        api.on.inspectComponent((payload, ctx) => {\n            if (payload.instanceData) {\n                payload.instanceData.state.push({\n                    type: 'Routing',\n                    key: '$route',\n                    editable: false,\n                    value: formatRouteLocation(router.currentRoute.value, 'Current Route'),\n                });\n            }\n        });\n        // mark router-link as active and display tags on router views\n        api.on.visitComponentTree(({ treeNode: node, componentInstance }) => {\n            if (componentInstance.__vrv_devtools) {\n                const info = componentInstance.__vrv_devtools;\n                node.tags.push({\n                    label: (info.name ? `${info.name.toString()}: ` : '') + info.path,\n                    textColor: 0,\n                    tooltip: 'This component is rendered by &lt;router-view&gt;',\n                    backgroundColor: PINK_500,\n                });\n            }\n            // if multiple useLink are used\n            if (isArray(componentInstance.__vrl_devtools)) {\n                componentInstance.__devtoolsApi = api;\n                componentInstance.__vrl_devtools.forEach(devtoolsData => {\n                    let label = devtoolsData.route.path;\n                    let backgroundColor = ORANGE_400;\n                    let tooltip = '';\n                    let textColor = 0;\n                    if (devtoolsData.error) {\n                        label = devtoolsData.error;\n                        backgroundColor = RED_100;\n                        textColor = RED_700;\n                    }\n                    else if (devtoolsData.isExactActive) {\n                        backgroundColor = LIME_500;\n                        tooltip = 'This is exactly active';\n                    }\n                    else if (devtoolsData.isActive) {\n                        backgroundColor = BLUE_600;\n                        tooltip = 'This link is active';\n                    }\n                    node.tags.push({\n                        label,\n                        textColor,\n                        tooltip,\n                        backgroundColor,\n                    });\n                });\n            }\n        });\n        watch(router.currentRoute, () => {\n            // refresh active state\n            refreshRoutesView();\n            api.notifyComponentUpdate();\n            api.sendInspectorTree(routerInspectorId);\n            api.sendInspectorState(routerInspectorId);\n        });\n        const navigationsLayerId = 'router:navigations:' + id;\n        api.addTimelineLayer({\n            id: navigationsLayerId,\n            label: `Router${id ? ' ' + id : ''} Navigations`,\n            color: 0x40a8c4,\n        });\n        // const errorsLayerId = 'router:errors'\n        // api.addTimelineLayer({\n        //   id: errorsLayerId,\n        //   label: 'Router Errors',\n        //   color: 0xea5455,\n        // })\n        router.onError((error, to) => {\n            api.addTimelineEvent({\n                layerId: navigationsLayerId,\n                event: {\n                    title: 'Error during Navigation',\n                    subtitle: to.fullPath,\n                    logType: 'error',\n                    time: api.now(),\n                    data: { error },\n                    groupId: to.meta.__navigationId,\n                },\n            });\n        });\n        // attached to `meta` and used to group events\n        let navigationId = 0;\n        router.beforeEach((to, from) => {\n            const data = {\n                guard: formatDisplay('beforeEach'),\n                from: formatRouteLocation(from, 'Current Location during this navigation'),\n                to: formatRouteLocation(to, 'Target location'),\n            };\n            // Used to group navigations together, hide from devtools\n            Object.defineProperty(to.meta, '__navigationId', {\n                value: navigationId++,\n            });\n            api.addTimelineEvent({\n                layerId: navigationsLayerId,\n                event: {\n                    time: api.now(),\n                    title: 'Start of navigation',\n                    subtitle: to.fullPath,\n                    data,\n                    groupId: to.meta.__navigationId,\n                },\n            });\n        });\n        router.afterEach((to, from, failure) => {\n            const data = {\n                guard: formatDisplay('afterEach'),\n            };\n            if (failure) {\n                data.failure = {\n                    _custom: {\n                        type: Error,\n                        readOnly: true,\n                        display: failure ? failure.message : '',\n                        tooltip: 'Navigation Failure',\n                        value: failure,\n                    },\n                };\n                data.status = formatDisplay('❌');\n            }\n            else {\n                data.status = formatDisplay('✅');\n            }\n            // we set here to have the right order\n            data.from = formatRouteLocation(from, 'Current Location during this navigation');\n            data.to = formatRouteLocation(to, 'Target location');\n            api.addTimelineEvent({\n                layerId: navigationsLayerId,\n                event: {\n                    title: 'End of navigation',\n                    subtitle: to.fullPath,\n                    time: api.now(),\n                    data,\n                    logType: failure ? 'warning' : 'default',\n                    groupId: to.meta.__navigationId,\n                },\n            });\n        });\n        /**\n         * Inspector of Existing routes\n         */\n        const routerInspectorId = 'router-inspector:' + id;\n        api.addInspector({\n            id: routerInspectorId,\n            label: 'Routes' + (id ? ' ' + id : ''),\n            icon: 'book',\n            treeFilterPlaceholder: 'Search routes',\n        });\n        function refreshRoutesView() {\n            // the routes view isn't active\n            if (!activeRoutesPayload)\n                return;\n            const payload = activeRoutesPayload;\n            // children routes will appear as nested\n            let routes = matcher.getRoutes().filter(route => !route.parent ||\n                // these routes have a parent with no component which will not appear in the view\n                // therefore we still need to include them\n                !route.parent.record.components);\n            // reset match state to false\n            routes.forEach(resetMatchStateOnRouteRecord);\n            // apply a match state if there is a payload\n            if (payload.filter) {\n                routes = routes.filter(route => \n                // save matches state based on the payload\n                isRouteMatching(route, payload.filter.toLowerCase()));\n            }\n            // mark active routes\n            routes.forEach(route => markRouteRecordActive(route, router.currentRoute.value));\n            payload.rootNodes = routes.map(formatRouteRecordForInspector);\n        }\n        let activeRoutesPayload;\n        api.on.getInspectorTree(payload => {\n            activeRoutesPayload = payload;\n            if (payload.app === app && payload.inspectorId === routerInspectorId) {\n                refreshRoutesView();\n            }\n        });\n        /**\n         * Display information about the currently selected route record\n         */\n        api.on.getInspectorState(payload => {\n            if (payload.app === app && payload.inspectorId === routerInspectorId) {\n                const routes = matcher.getRoutes();\n                const route = routes.find(route => route.record.__vd_id === payload.nodeId);\n                if (route) {\n                    payload.state = {\n                        options: formatRouteRecordMatcherForStateInspector(route),\n                    };\n                }\n            }\n        });\n        api.sendInspectorTree(routerInspectorId);\n        api.sendInspectorState(routerInspectorId);\n    });\n}\nfunction modifierForKey(key) {\n    if (key.optional) {\n        return key.repeatable ? '*' : '?';\n    }\n    else {\n        return key.repeatable ? '+' : '';\n    }\n}\nfunction formatRouteRecordMatcherForStateInspector(route) {\n    const { record } = route;\n    const fields = [\n        { editable: false, key: 'path', value: record.path },\n    ];\n    if (record.name != null) {\n        fields.push({\n            editable: false,\n            key: 'name',\n            value: record.name,\n        });\n    }\n    fields.push({ editable: false, key: 'regexp', value: route.re });\n    if (route.keys.length) {\n        fields.push({\n            editable: false,\n            key: 'keys',\n            value: {\n                _custom: {\n                    type: null,\n                    readOnly: true,\n                    display: route.keys\n                        .map(key => `${key.name}${modifierForKey(key)}`)\n                        .join(' '),\n                    tooltip: 'Param keys',\n                    value: route.keys,\n                },\n            },\n        });\n    }\n    if (record.redirect != null) {\n        fields.push({\n            editable: false,\n            key: 'redirect',\n            value: record.redirect,\n        });\n    }\n    if (route.alias.length) {\n        fields.push({\n            editable: false,\n            key: 'aliases',\n            value: route.alias.map(alias => alias.record.path),\n        });\n    }\n    if (Object.keys(route.record.meta).length) {\n        fields.push({\n            editable: false,\n            key: 'meta',\n            value: route.record.meta,\n        });\n    }\n    fields.push({\n        key: 'score',\n        editable: false,\n        value: {\n            _custom: {\n                type: null,\n                readOnly: true,\n                display: route.score.map(score => score.join(', ')).join(' | '),\n                tooltip: 'Score used to sort routes',\n                value: route.score,\n            },\n        },\n    });\n    return fields;\n}\n/**\n * Extracted from tailwind palette\n */\nconst PINK_500 = 0xec4899;\nconst BLUE_600 = 0x2563eb;\nconst LIME_500 = 0x84cc16;\nconst CYAN_400 = 0x22d3ee;\nconst ORANGE_400 = 0xfb923c;\n// const GRAY_100 = 0xf4f4f5\nconst DARK = 0x666666;\nconst RED_100 = 0xfee2e2;\nconst RED_700 = 0xb91c1c;\nfunction formatRouteRecordForInspector(route) {\n    const tags = [];\n    const { record } = route;\n    if (record.name != null) {\n        tags.push({\n            label: String(record.name),\n            textColor: 0,\n            backgroundColor: CYAN_400,\n        });\n    }\n    if (record.aliasOf) {\n        tags.push({\n            label: 'alias',\n            textColor: 0,\n            backgroundColor: ORANGE_400,\n        });\n    }\n    if (route.__vd_match) {\n        tags.push({\n            label: 'matches',\n            textColor: 0,\n            backgroundColor: PINK_500,\n        });\n    }\n    if (route.__vd_exactActive) {\n        tags.push({\n            label: 'exact',\n            textColor: 0,\n            backgroundColor: LIME_500,\n        });\n    }\n    if (route.__vd_active) {\n        tags.push({\n            label: 'active',\n            textColor: 0,\n            backgroundColor: BLUE_600,\n        });\n    }\n    if (record.redirect) {\n        tags.push({\n            label: typeof record.redirect === 'string'\n                ? `redirect: ${record.redirect}`\n                : 'redirects',\n            textColor: 0xffffff,\n            backgroundColor: DARK,\n        });\n    }\n    // add an id to be able to select it. Using the `path` is not possible because\n    // empty path children would collide with their parents\n    let id = record.__vd_id;\n    if (id == null) {\n        id = String(routeRecordId++);\n        record.__vd_id = id;\n    }\n    return {\n        id,\n        label: record.path,\n        tags,\n        children: route.children.map(formatRouteRecordForInspector),\n    };\n}\n//  incremental id for route records and inspector state\nlet routeRecordId = 0;\nconst EXTRACT_REGEXP_RE = /^\\/(.*)\\/([a-z]*)$/;\nfunction markRouteRecordActive(route, currentRoute) {\n    // no route will be active if matched is empty\n    // reset the matching state\n    const isExactActive = currentRoute.matched.length &&\n        isSameRouteRecord(currentRoute.matched[currentRoute.matched.length - 1], route.record);\n    route.__vd_exactActive = route.__vd_active = isExactActive;\n    if (!isExactActive) {\n        route.__vd_active = currentRoute.matched.some(match => isSameRouteRecord(match, route.record));\n    }\n    route.children.forEach(childRoute => markRouteRecordActive(childRoute, currentRoute));\n}\nfunction resetMatchStateOnRouteRecord(route) {\n    route.__vd_match = false;\n    route.children.forEach(resetMatchStateOnRouteRecord);\n}\nfunction isRouteMatching(route, filter) {\n    const found = String(route.re).match(EXTRACT_REGEXP_RE);\n    route.__vd_match = false;\n    if (!found || found.length < 3) {\n        return false;\n    }\n    // use a regexp without $ at the end to match nested routes better\n    const nonEndingRE = new RegExp(found[1].replace(/\\$$/, ''), found[2]);\n    if (nonEndingRE.test(filter)) {\n        // mark children as matches\n        route.children.forEach(child => isRouteMatching(child, filter));\n        // exception case: `/`\n        if (route.record.path !== '/' || filter === '/') {\n            route.__vd_match = route.re.test(filter);\n            return true;\n        }\n        // hide the / route\n        return false;\n    }\n    const path = route.record.path.toLowerCase();\n    const decodedPath = decode(path);\n    // also allow partial matching on the path\n    if (!filter.startsWith('/') &&\n        (decodedPath.includes(filter) || path.includes(filter)))\n        return true;\n    if (decodedPath.startsWith(filter) || path.startsWith(filter))\n        return true;\n    if (route.record.name && String(route.record.name).includes(filter))\n        return true;\n    return route.children.some(child => isRouteMatching(child, filter));\n}\nfunction omit(obj, keys) {\n    const ret = {};\n    for (const key in obj) {\n        if (!keys.includes(key)) {\n            // @ts-expect-error\n            ret[key] = obj[key];\n        }\n    }\n    return ret;\n}\n\n/**\n * Creates a Router instance that can be used by a Vue app.\n *\n * @param options - {@link RouterOptions}\n */\nfunction createRouter(options) {\n    const matcher = createRouterMatcher(options.routes, options);\n    const parseQuery$1 = options.parseQuery || parseQuery;\n    const stringifyQuery$1 = options.stringifyQuery || stringifyQuery;\n    const routerHistory = options.history;\n    if ((process.env.NODE_ENV !== 'production') && !routerHistory)\n        throw new Error('Provide the \"history\" option when calling \"createRouter()\":' +\n            ' https://router.vuejs.org/api/interfaces/RouterOptions.html#history');\n    const beforeGuards = useCallbacks();\n    const beforeResolveGuards = useCallbacks();\n    const afterGuards = useCallbacks();\n    const currentRoute = shallowRef(START_LOCATION_NORMALIZED);\n    let pendingLocation = START_LOCATION_NORMALIZED;\n    // leave the scrollRestoration if no scrollBehavior is provided\n    if (isBrowser && options.scrollBehavior && 'scrollRestoration' in history) {\n        history.scrollRestoration = 'manual';\n    }\n    const normalizeParams = applyToParams.bind(null, paramValue => '' + paramValue);\n    const encodeParams = applyToParams.bind(null, encodeParam);\n    const decodeParams = \n    // @ts-expect-error: intentionally avoid the type check\n    applyToParams.bind(null, decode);\n    function addRoute(parentOrRoute, route) {\n        let parent;\n        let record;\n        if (isRouteName(parentOrRoute)) {\n            parent = matcher.getRecordMatcher(parentOrRoute);\n            if ((process.env.NODE_ENV !== 'production') && !parent) {\n                warn(`Parent route \"${String(parentOrRoute)}\" not found when adding child route`, route);\n            }\n            record = route;\n        }\n        else {\n            record = parentOrRoute;\n        }\n        return matcher.addRoute(record, parent);\n    }\n    function removeRoute(name) {\n        const recordMatcher = matcher.getRecordMatcher(name);\n        if (recordMatcher) {\n            matcher.removeRoute(recordMatcher);\n        }\n        else if ((process.env.NODE_ENV !== 'production')) {\n            warn(`Cannot remove non-existent route \"${String(name)}\"`);\n        }\n    }\n    function getRoutes() {\n        return matcher.getRoutes().map(routeMatcher => routeMatcher.record);\n    }\n    function hasRoute(name) {\n        return !!matcher.getRecordMatcher(name);\n    }\n    function resolve(rawLocation, currentLocation) {\n        // const resolve: Router['resolve'] = (rawLocation: RouteLocationRaw, currentLocation) => {\n        // const objectLocation = routerLocationAsObject(rawLocation)\n        // we create a copy to modify it later\n        currentLocation = assign({}, currentLocation || currentRoute.value);\n        if (typeof rawLocation === 'string') {\n            const locationNormalized = parseURL(parseQuery$1, rawLocation, currentLocation.path);\n            const matchedRoute = matcher.resolve({ path: locationNormalized.path }, currentLocation);\n            const href = routerHistory.createHref(locationNormalized.fullPath);\n            if ((process.env.NODE_ENV !== 'production')) {\n                if (href.startsWith('//'))\n                    warn(`Location \"${rawLocation}\" resolved to \"${href}\". A resolved location cannot start with multiple slashes.`);\n                else if (!matchedRoute.matched.length) {\n                    warn(`No match found for location with path \"${rawLocation}\"`);\n                }\n            }\n            // locationNormalized is always a new object\n            return assign(locationNormalized, matchedRoute, {\n                params: decodeParams(matchedRoute.params),\n                hash: decode(locationNormalized.hash),\n                redirectedFrom: undefined,\n                href,\n            });\n        }\n        if ((process.env.NODE_ENV !== 'production') && !isRouteLocation(rawLocation)) {\n            warn(`router.resolve() was passed an invalid location. This will fail in production.\\n- Location:`, rawLocation);\n            return resolve({});\n        }\n        let matcherLocation;\n        // path could be relative in object as well\n        if (rawLocation.path != null) {\n            if ((process.env.NODE_ENV !== 'production') &&\n                'params' in rawLocation &&\n                !('name' in rawLocation) &&\n                // @ts-expect-error: the type is never\n                Object.keys(rawLocation.params).length) {\n                warn(`Path \"${rawLocation.path}\" was passed with params but they will be ignored. Use a named route alongside params instead.`);\n            }\n            matcherLocation = assign({}, rawLocation, {\n                path: parseURL(parseQuery$1, rawLocation.path, currentLocation.path).path,\n            });\n        }\n        else {\n            // remove any nullish param\n            const targetParams = assign({}, rawLocation.params);\n            for (const key in targetParams) {\n                if (targetParams[key] == null) {\n                    delete targetParams[key];\n                }\n            }\n            // pass encoded values to the matcher, so it can produce encoded path and fullPath\n            matcherLocation = assign({}, rawLocation, {\n                params: encodeParams(targetParams),\n            });\n            // current location params are decoded, we need to encode them in case the\n            // matcher merges the params\n            currentLocation.params = encodeParams(currentLocation.params);\n        }\n        const matchedRoute = matcher.resolve(matcherLocation, currentLocation);\n        const hash = rawLocation.hash || '';\n        if ((process.env.NODE_ENV !== 'production') && hash && !hash.startsWith('#')) {\n            warn(`A \\`hash\\` should always start with the character \"#\". Replace \"${hash}\" with \"#${hash}\".`);\n        }\n        // the matcher might have merged current location params, so\n        // we need to run the decoding again\n        matchedRoute.params = normalizeParams(decodeParams(matchedRoute.params));\n        const fullPath = stringifyURL(stringifyQuery$1, assign({}, rawLocation, {\n            hash: encodeHash(hash),\n            path: matchedRoute.path,\n        }));\n        const href = routerHistory.createHref(fullPath);\n        if ((process.env.NODE_ENV !== 'production')) {\n            if (href.startsWith('//')) {\n                warn(`Location \"${rawLocation}\" resolved to \"${href}\". A resolved location cannot start with multiple slashes.`);\n            }\n            else if (!matchedRoute.matched.length) {\n                warn(`No match found for location with path \"${rawLocation.path != null ? rawLocation.path : rawLocation}\"`);\n            }\n        }\n        return assign({\n            fullPath,\n            // keep the hash encoded so fullPath is effectively path + encodedQuery +\n            // hash\n            hash,\n            query: \n            // if the user is using a custom query lib like qs, we might have\n            // nested objects, so we keep the query as is, meaning it can contain\n            // numbers at `$route.query`, but at the point, the user will have to\n            // use their own type anyway.\n            // https://github.com/vuejs/router/issues/328#issuecomment-649481567\n            stringifyQuery$1 === stringifyQuery\n                ? normalizeQuery(rawLocation.query)\n                : (rawLocation.query || {}),\n        }, matchedRoute, {\n            redirectedFrom: undefined,\n            href,\n        });\n    }\n    function locationAsObject(to) {\n        return typeof to === 'string'\n            ? parseURL(parseQuery$1, to, currentRoute.value.path)\n            : assign({}, to);\n    }\n    function checkCanceledNavigation(to, from) {\n        if (pendingLocation !== to) {\n            return createRouterError(8 /* ErrorTypes.NAVIGATION_CANCELLED */, {\n                from,\n                to,\n            });\n        }\n    }\n    function push(to) {\n        return pushWithRedirect(to);\n    }\n    function replace(to) {\n        return push(assign(locationAsObject(to), { replace: true }));\n    }\n    function handleRedirectRecord(to) {\n        const lastMatched = to.matched[to.matched.length - 1];\n        if (lastMatched && lastMatched.redirect) {\n            const { redirect } = lastMatched;\n            let newTargetLocation = typeof redirect === 'function' ? redirect(to) : redirect;\n            if (typeof newTargetLocation === 'string') {\n                newTargetLocation =\n                    newTargetLocation.includes('?') || newTargetLocation.includes('#')\n                        ? (newTargetLocation = locationAsObject(newTargetLocation))\n                        : // force empty params\n                            { path: newTargetLocation };\n                // @ts-expect-error: force empty params when a string is passed to let\n                // the router parse them again\n                newTargetLocation.params = {};\n            }\n            if ((process.env.NODE_ENV !== 'production') &&\n                newTargetLocation.path == null &&\n                !('name' in newTargetLocation)) {\n                warn(`Invalid redirect found:\\n${JSON.stringify(newTargetLocation, null, 2)}\\n when navigating to \"${to.fullPath}\". A redirect must contain a name or path. This will break in production.`);\n                throw new Error('Invalid redirect');\n            }\n            return assign({\n                query: to.query,\n                hash: to.hash,\n                // avoid transferring params if the redirect has a path\n                params: newTargetLocation.path != null ? {} : to.params,\n            }, newTargetLocation);\n        }\n    }\n    function pushWithRedirect(to, redirectedFrom) {\n        const targetLocation = (pendingLocation = resolve(to));\n        const from = currentRoute.value;\n        const data = to.state;\n        const force = to.force;\n        // to could be a string where `replace` is a function\n        const replace = to.replace === true;\n        const shouldRedirect = handleRedirectRecord(targetLocation);\n        if (shouldRedirect)\n            return pushWithRedirect(assign(locationAsObject(shouldRedirect), {\n                state: typeof shouldRedirect === 'object'\n                    ? assign({}, data, shouldRedirect.state)\n                    : data,\n                force,\n                replace,\n            }), \n            // keep original redirectedFrom if it exists\n            redirectedFrom || targetLocation);\n        // if it was a redirect we already called `pushWithRedirect` above\n        const toLocation = targetLocation;\n        toLocation.redirectedFrom = redirectedFrom;\n        let failure;\n        if (!force && isSameRouteLocation(stringifyQuery$1, from, targetLocation)) {\n            failure = createRouterError(16 /* ErrorTypes.NAVIGATION_DUPLICATED */, { to: toLocation, from });\n            // trigger scroll to allow scrolling to the same anchor\n            handleScroll(from, from, \n            // this is a push, the only way for it to be triggered from a\n            // history.listen is with a redirect, which makes it become a push\n            true, \n            // This cannot be the first navigation because the initial location\n            // cannot be manually navigated to\n            false);\n        }\n        return (failure ? Promise.resolve(failure) : navigate(toLocation, from))\n            .catch((error) => isNavigationFailure(error)\n            ? // navigation redirects still mark the router as ready\n                isNavigationFailure(error, 2 /* ErrorTypes.NAVIGATION_GUARD_REDIRECT */)\n                    ? error\n                    : markAsReady(error) // also returns the error\n            : // reject any unknown error\n                triggerError(error, toLocation, from))\n            .then((failure) => {\n            if (failure) {\n                if (isNavigationFailure(failure, 2 /* ErrorTypes.NAVIGATION_GUARD_REDIRECT */)) {\n                    if ((process.env.NODE_ENV !== 'production') &&\n                        // we are redirecting to the same location we were already at\n                        isSameRouteLocation(stringifyQuery$1, resolve(failure.to), toLocation) &&\n                        // and we have done it a couple of times\n                        redirectedFrom &&\n                        // @ts-expect-error: added only in dev\n                        (redirectedFrom._count = redirectedFrom._count\n                            ? // @ts-expect-error\n                                redirectedFrom._count + 1\n                            : 1) > 30) {\n                        warn(`Detected a possibly infinite redirection in a navigation guard when going from \"${from.fullPath}\" to \"${toLocation.fullPath}\". Aborting to avoid a Stack Overflow.\\n Are you always returning a new location within a navigation guard? That would lead to this error. Only return when redirecting or aborting, that should fix this. This might break in production if not fixed.`);\n                        return Promise.reject(new Error('Infinite redirect in navigation guard'));\n                    }\n                    return pushWithRedirect(\n                    // keep options\n                    assign({\n                        // preserve an existing replacement but allow the redirect to override it\n                        replace,\n                    }, locationAsObject(failure.to), {\n                        state: typeof failure.to === 'object'\n                            ? assign({}, data, failure.to.state)\n                            : data,\n                        force,\n                    }), \n                    // preserve the original redirectedFrom if any\n                    redirectedFrom || toLocation);\n                }\n            }\n            else {\n                // if we fail we don't finalize the navigation\n                failure = finalizeNavigation(toLocation, from, true, replace, data);\n            }\n            triggerAfterEach(toLocation, from, failure);\n            return failure;\n        });\n    }\n    /**\n     * Helper to reject and skip all navigation guards if a new navigation happened\n     * @param to\n     * @param from\n     */\n    function checkCanceledNavigationAndReject(to, from) {\n        const error = checkCanceledNavigation(to, from);\n        return error ? Promise.reject(error) : Promise.resolve();\n    }\n    function runWithContext(fn) {\n        const app = installedApps.values().next().value;\n        // support Vue < 3.3\n        return app && typeof app.runWithContext === 'function'\n            ? app.runWithContext(fn)\n            : fn();\n    }\n    // TODO: refactor the whole before guards by internally using router.beforeEach\n    function navigate(to, from) {\n        let guards;\n        const [leavingRecords, updatingRecords, enteringRecords] = extractChangingRecords(to, from);\n        // all components here have been resolved once because we are leaving\n        guards = extractComponentsGuards(leavingRecords.reverse(), 'beforeRouteLeave', to, from);\n        // leavingRecords is already reversed\n        for (const record of leavingRecords) {\n            record.leaveGuards.forEach(guard => {\n                guards.push(guardToPromiseFn(guard, to, from));\n            });\n        }\n        const canceledNavigationCheck = checkCanceledNavigationAndReject.bind(null, to, from);\n        guards.push(canceledNavigationCheck);\n        // run the queue of per route beforeRouteLeave guards\n        return (runGuardQueue(guards)\n            .then(() => {\n            // check global guards beforeEach\n            guards = [];\n            for (const guard of beforeGuards.list()) {\n                guards.push(guardToPromiseFn(guard, to, from));\n            }\n            guards.push(canceledNavigationCheck);\n            return runGuardQueue(guards);\n        })\n            .then(() => {\n            // check in components beforeRouteUpdate\n            guards = extractComponentsGuards(updatingRecords, 'beforeRouteUpdate', to, from);\n            for (const record of updatingRecords) {\n                record.updateGuards.forEach(guard => {\n                    guards.push(guardToPromiseFn(guard, to, from));\n                });\n            }\n            guards.push(canceledNavigationCheck);\n            // run the queue of per route beforeEnter guards\n            return runGuardQueue(guards);\n        })\n            .then(() => {\n            // check the route beforeEnter\n            guards = [];\n            for (const record of enteringRecords) {\n                // do not trigger beforeEnter on reused views\n                if (record.beforeEnter) {\n                    if (isArray(record.beforeEnter)) {\n                        for (const beforeEnter of record.beforeEnter)\n                            guards.push(guardToPromiseFn(beforeEnter, to, from));\n                    }\n                    else {\n                        guards.push(guardToPromiseFn(record.beforeEnter, to, from));\n                    }\n                }\n            }\n            guards.push(canceledNavigationCheck);\n            // run the queue of per route beforeEnter guards\n            return runGuardQueue(guards);\n        })\n            .then(() => {\n            // NOTE: at this point to.matched is normalized and does not contain any () => Promise<Component>\n            // clear existing enterCallbacks, these are added by extractComponentsGuards\n            to.matched.forEach(record => (record.enterCallbacks = {}));\n            // check in-component beforeRouteEnter\n            guards = extractComponentsGuards(enteringRecords, 'beforeRouteEnter', to, from, runWithContext);\n            guards.push(canceledNavigationCheck);\n            // run the queue of per route beforeEnter guards\n            return runGuardQueue(guards);\n        })\n            .then(() => {\n            // check global guards beforeResolve\n            guards = [];\n            for (const guard of beforeResolveGuards.list()) {\n                guards.push(guardToPromiseFn(guard, to, from));\n            }\n            guards.push(canceledNavigationCheck);\n            return runGuardQueue(guards);\n        })\n            // catch any navigation canceled\n            .catch(err => isNavigationFailure(err, 8 /* ErrorTypes.NAVIGATION_CANCELLED */)\n            ? err\n            : Promise.reject(err)));\n    }\n    function triggerAfterEach(to, from, failure) {\n        // navigation is confirmed, call afterGuards\n        // TODO: wrap with error handlers\n        afterGuards\n            .list()\n            .forEach(guard => runWithContext(() => guard(to, from, failure)));\n    }\n    /**\n     * - Cleans up any navigation guards\n     * - Changes the url if necessary\n     * - Calls the scrollBehavior\n     */\n    function finalizeNavigation(toLocation, from, isPush, replace, data) {\n        // a more recent navigation took place\n        const error = checkCanceledNavigation(toLocation, from);\n        if (error)\n            return error;\n        // only consider as push if it's not the first navigation\n        const isFirstNavigation = from === START_LOCATION_NORMALIZED;\n        const state = !isBrowser ? {} : history.state;\n        // change URL only if the user did a push/replace and if it's not the initial navigation because\n        // it's just reflecting the url\n        if (isPush) {\n            // on the initial navigation, we want to reuse the scroll position from\n            // history state if it exists\n            if (replace || isFirstNavigation)\n                routerHistory.replace(toLocation.fullPath, assign({\n                    scroll: isFirstNavigation && state && state.scroll,\n                }, data));\n            else\n                routerHistory.push(toLocation.fullPath, data);\n        }\n        // accept current navigation\n        currentRoute.value = toLocation;\n        handleScroll(toLocation, from, isPush, isFirstNavigation);\n        markAsReady();\n    }\n    let removeHistoryListener;\n    // attach listener to history to trigger navigations\n    function setupListeners() {\n        // avoid setting up listeners twice due to an invalid first navigation\n        if (removeHistoryListener)\n            return;\n        removeHistoryListener = routerHistory.listen((to, _from, info) => {\n            if (!router.listening)\n                return;\n            // cannot be a redirect route because it was in history\n            const toLocation = resolve(to);\n            // due to dynamic routing, and to hash history with manual navigation\n            // (manually changing the url or calling history.hash = '#/somewhere'),\n            // there could be a redirect record in history\n            const shouldRedirect = handleRedirectRecord(toLocation);\n            if (shouldRedirect) {\n                pushWithRedirect(assign(shouldRedirect, { replace: true, force: true }), toLocation).catch(noop);\n                return;\n            }\n            pendingLocation = toLocation;\n            const from = currentRoute.value;\n            // TODO: should be moved to web history?\n            if (isBrowser) {\n                saveScrollPosition(getScrollKey(from.fullPath, info.delta), computeScrollPosition());\n            }\n            navigate(toLocation, from)\n                .catch((error) => {\n                if (isNavigationFailure(error, 4 /* ErrorTypes.NAVIGATION_ABORTED */ | 8 /* ErrorTypes.NAVIGATION_CANCELLED */)) {\n                    return error;\n                }\n                if (isNavigationFailure(error, 2 /* ErrorTypes.NAVIGATION_GUARD_REDIRECT */)) {\n                    // Here we could call if (info.delta) routerHistory.go(-info.delta,\n                    // false) but this is bug prone as we have no way to wait the\n                    // navigation to be finished before calling pushWithRedirect. Using\n                    // a setTimeout of 16ms seems to work but there is no guarantee for\n                    // it to work on every browser. So instead we do not restore the\n                    // history entry and trigger a new navigation as requested by the\n                    // navigation guard.\n                    // the error is already handled by router.push we just want to avoid\n                    // logging the error\n                    pushWithRedirect(assign(locationAsObject(error.to), {\n                        force: true,\n                    }), toLocation\n                    // avoid an uncaught rejection, let push call triggerError\n                    )\n                        .then(failure => {\n                        // manual change in hash history #916 ending up in the URL not\n                        // changing, but it was changed by the manual url change, so we\n                        // need to manually change it ourselves\n                        if (isNavigationFailure(failure, 4 /* ErrorTypes.NAVIGATION_ABORTED */ |\n                            16 /* ErrorTypes.NAVIGATION_DUPLICATED */) &&\n                            !info.delta &&\n                            info.type === NavigationType.pop) {\n                            routerHistory.go(-1, false);\n                        }\n                    })\n                        .catch(noop);\n                    // avoid the then branch\n                    return Promise.reject();\n                }\n                // do not restore history on unknown direction\n                if (info.delta) {\n                    routerHistory.go(-info.delta, false);\n                }\n                // unrecognized error, transfer to the global handler\n                return triggerError(error, toLocation, from);\n            })\n                .then((failure) => {\n                failure =\n                    failure ||\n                        finalizeNavigation(\n                        // after navigation, all matched components are resolved\n                        toLocation, from, false);\n                // revert the navigation\n                if (failure) {\n                    if (info.delta &&\n                        // a new navigation has been triggered, so we do not want to revert, that will change the current history\n                        // entry while a different route is displayed\n                        !isNavigationFailure(failure, 8 /* ErrorTypes.NAVIGATION_CANCELLED */)) {\n                        routerHistory.go(-info.delta, false);\n                    }\n                    else if (info.type === NavigationType.pop &&\n                        isNavigationFailure(failure, 4 /* ErrorTypes.NAVIGATION_ABORTED */ | 16 /* ErrorTypes.NAVIGATION_DUPLICATED */)) {\n                        // manual change in hash history #916\n                        // it's like a push but lacks the information of the direction\n                        routerHistory.go(-1, false);\n                    }\n                }\n                triggerAfterEach(toLocation, from, failure);\n            })\n                // avoid warnings in the console about uncaught rejections, they are logged by triggerErrors\n                .catch(noop);\n        });\n    }\n    // Initialization and Errors\n    let readyHandlers = useCallbacks();\n    let errorListeners = useCallbacks();\n    let ready;\n    /**\n     * Trigger errorListeners added via onError and throws the error as well\n     *\n     * @param error - error to throw\n     * @param to - location we were navigating to when the error happened\n     * @param from - location we were navigating from when the error happened\n     * @returns the error as a rejected promise\n     */\n    function triggerError(error, to, from) {\n        markAsReady(error);\n        const list = errorListeners.list();\n        if (list.length) {\n            list.forEach(handler => handler(error, to, from));\n        }\n        else {\n            if ((process.env.NODE_ENV !== 'production')) {\n                warn('uncaught error during route navigation:');\n            }\n            console.error(error);\n        }\n        // reject the error no matter there were error listeners or not\n        return Promise.reject(error);\n    }\n    function isReady() {\n        if (ready && currentRoute.value !== START_LOCATION_NORMALIZED)\n            return Promise.resolve();\n        return new Promise((resolve, reject) => {\n            readyHandlers.add([resolve, reject]);\n        });\n    }\n    function markAsReady(err) {\n        if (!ready) {\n            // still not ready if an error happened\n            ready = !err;\n            setupListeners();\n            readyHandlers\n                .list()\n                .forEach(([resolve, reject]) => (err ? reject(err) : resolve()));\n            readyHandlers.reset();\n        }\n        return err;\n    }\n    // Scroll behavior\n    function handleScroll(to, from, isPush, isFirstNavigation) {\n        const { scrollBehavior } = options;\n        if (!isBrowser || !scrollBehavior)\n            return Promise.resolve();\n        const scrollPosition = (!isPush && getSavedScrollPosition(getScrollKey(to.fullPath, 0))) ||\n            ((isFirstNavigation || !isPush) &&\n                history.state &&\n                history.state.scroll) ||\n            null;\n        return nextTick()\n            .then(() => scrollBehavior(to, from, scrollPosition))\n            .then(position => position && scrollToPosition(position))\n            .catch(err => triggerError(err, to, from));\n    }\n    const go = (delta) => routerHistory.go(delta);\n    let started;\n    const installedApps = new Set();\n    const router = {\n        currentRoute,\n        listening: true,\n        addRoute,\n        removeRoute,\n        clearRoutes: matcher.clearRoutes,\n        hasRoute,\n        getRoutes,\n        resolve,\n        options,\n        push,\n        replace,\n        go,\n        back: () => go(-1),\n        forward: () => go(1),\n        beforeEach: beforeGuards.add,\n        beforeResolve: beforeResolveGuards.add,\n        afterEach: afterGuards.add,\n        onError: errorListeners.add,\n        isReady,\n        install(app) {\n            const router = this;\n            app.component('RouterLink', RouterLink);\n            app.component('RouterView', RouterView);\n            app.config.globalProperties.$router = router;\n            Object.defineProperty(app.config.globalProperties, '$route', {\n                enumerable: true,\n                get: () => unref(currentRoute),\n            });\n            // this initial navigation is only necessary on client, on server it doesn't\n            // make sense because it will create an extra unnecessary navigation and could\n            // lead to problems\n            if (isBrowser &&\n                // used for the initial navigation client side to avoid pushing\n                // multiple times when the router is used in multiple apps\n                !started &&\n                currentRoute.value === START_LOCATION_NORMALIZED) {\n                // see above\n                started = true;\n                push(routerHistory.location).catch(err => {\n                    if ((process.env.NODE_ENV !== 'production'))\n                        warn('Unexpected error when starting the router:', err);\n                });\n            }\n            const reactiveRoute = {};\n            for (const key in START_LOCATION_NORMALIZED) {\n                Object.defineProperty(reactiveRoute, key, {\n                    get: () => currentRoute.value[key],\n                    enumerable: true,\n                });\n            }\n            app.provide(routerKey, router);\n            app.provide(routeLocationKey, shallowReactive(reactiveRoute));\n            app.provide(routerViewLocationKey, currentRoute);\n            const unmountApp = app.unmount;\n            installedApps.add(app);\n            app.unmount = function () {\n                installedApps.delete(app);\n                // the router is not attached to an app anymore\n                if (installedApps.size < 1) {\n                    // invalidate the current navigation\n                    pendingLocation = START_LOCATION_NORMALIZED;\n                    removeHistoryListener && removeHistoryListener();\n                    removeHistoryListener = null;\n                    currentRoute.value = START_LOCATION_NORMALIZED;\n                    started = false;\n                    ready = false;\n                }\n                unmountApp();\n            };\n            // TODO: this probably needs to be updated so it can be used by vue-termui\n            if (((process.env.NODE_ENV !== 'production') || __VUE_PROD_DEVTOOLS__) && isBrowser) {\n                addDevtools(app, router, matcher);\n            }\n        },\n    };\n    // TODO: type this as NavigationGuardReturn or similar instead of any\n    function runGuardQueue(guards) {\n        return guards.reduce((promise, guard) => promise.then(() => runWithContext(guard)), Promise.resolve());\n    }\n    return router;\n}\nfunction extractChangingRecords(to, from) {\n    const leavingRecords = [];\n    const updatingRecords = [];\n    const enteringRecords = [];\n    const len = Math.max(from.matched.length, to.matched.length);\n    for (let i = 0; i < len; i++) {\n        const recordFrom = from.matched[i];\n        if (recordFrom) {\n            if (to.matched.find(record => isSameRouteRecord(record, recordFrom)))\n                updatingRecords.push(recordFrom);\n            else\n                leavingRecords.push(recordFrom);\n        }\n        const recordTo = to.matched[i];\n        if (recordTo) {\n            // the type doesn't matter because we are comparing per reference\n            if (!from.matched.find(record => isSameRouteRecord(record, recordTo))) {\n                enteringRecords.push(recordTo);\n            }\n        }\n    }\n    return [leavingRecords, updatingRecords, enteringRecords];\n}\n\n/**\n * Returns the router instance. Equivalent to using `$router` inside\n * templates.\n */\nfunction useRouter() {\n    return inject(routerKey);\n}\n/**\n * Returns the current route location. Equivalent to using `$route` inside\n * templates.\n */\nfunction useRoute(_name) {\n    return inject(routeLocationKey);\n}\n\nexport { NavigationFailureType, RouterLink, RouterView, START_LOCATION_NORMALIZED as START_LOCATION, createMemoryHistory, createRouter, createRouterMatcher, createWebHashHistory, createWebHistory, isNavigationFailure, loadRouteLocation, matchedRouteKey, onBeforeRouteLeave, onBeforeRouteUpdate, parseQuery, routeLocationKey, routerKey, routerViewLocationKey, stringifyQuery, useLink, useRoute, useRouter, viewDepthKey };\n","import { onBeforeUnmount, onMounted, readonly, ref } from \"vue\";\n\nconst LOGGED_IN_CLASS = \"wh-wrdauth--isloggedin\";\n\n// Reactieve WRDAuth-status, gedreven door de `.wh-wrdauth--isloggedin`-class\n// die setupWRDAuth() op <html> toggelt. Synchroon lezen in de ref-initializer\n// zodat de eerste render de loginstatus al kent (geen flits van het loginscherm\n// voor gebruikers die ingelogd binnenkomen).\nexport function useWrdAuthState() {\n  const isLoggedIn = ref(document.documentElement.classList.contains(LOGGED_IN_CLASS));\n  let observer: MutationObserver | null = null;\n\n  function read() {\n    isLoggedIn.value = document.documentElement.classList.contains(LOGGED_IN_CLASS);\n  }\n\n  onMounted(() => {\n    read();\n    observer = new MutationObserver(read);\n    observer.observe(document.documentElement, { attributes: true, attributeFilter: [\"class\"] });\n  });\n\n  onBeforeUnmount(() => {\n    observer?.disconnect();\n    observer = null;\n  });\n\n  return { isLoggedIn: readonly(isLoggedIn) };\n}\n","import { reactive, onBeforeUnmount } from \"vue\";\n\nexport interface Organization { tag: string; title: string; role: \"admin\" | \"bookkeeper\" }\nexport interface Account { guid: string; name: string; email: string; organizations: Organization[] }\n\nexport const organizationSession = reactive({\n  account: null as Account | null,\n  organization: null as Organization | null,\n  generation: 0,\n  writes: 0,\n  error: \"\",\n  leavePrompt: null as \"busy\" | \"dirty\" | null,\n});\nlet resolveLeave: ((leave: boolean) => void) | null = null;\nconst dirtyForms = new Set<() => boolean>();\n\nexport function clearOrganizationSession(): void {\n  resolveOrganizationLeave(false);\n  organizationSession.error = \"\";\n  organizationSession.account = null;\n  organizationSession.organization = null;\n  organizationSession.generation++;\n  dirtyForms.clear();\n}\n\nexport function setAccount(account: Account): void {\n  if (organizationSession.account?.guid !== account.guid) clearOrganizationSession();\n  organizationSession.account = account;\n  const selected = organizationSession.organization;\n  if (selected && !account.organizations.some(org => org.tag === selected.tag && org.role === selected.role)) {\n    organizationSession.organization = null;\n    organizationSession.generation++;\n  }\n}\n\nexport function setOrganization(tag: string | null): void {\n  const organization = tag ? organizationSession.account?.organizations.find(org => org.tag === tag) : null;\n  if (tag && !organization) throw new Error(\"Geen toegang tot deze organisatie.\");\n  if (organizationSession.organization?.tag !== organization?.tag) {\n    organizationSession.organization = organization ?? null;\n    organizationSession.generation++;\n  }\n}\n\nconst ORGANIZATION_PREFIX = \"happy:org_\";\n\n/** URL key of an organization: \"hphendriks\" for happy:org_hphendriks; happy:happy keeps its full tag so keys never collide. */\nexport function organizationSlug(tag: string): string {\n  return tag.startsWith(ORGANIZATION_PREFIX) ? tag.slice(ORGANIZATION_PREFIX.length) : tag;\n}\n\n/** Inverse of organizationSlug; a full tag from an old link passes through unchanged. */\nexport function organizationTag(slug: string): string {\n  return slug.includes(\":\") ? slug : ORGANIZATION_PREFIX + slug;\n}\n\n/** Old detail IDs are ambiguous when an account can access multiple administrations. */\nexport function organizationDestination({ path, preferred }: { path: string; preferred: string }): string {\n  const organizations = organizationSession.account?.organizations ?? [];\n  const selected = organizations.length === 1 ? organizations[0] : path === \"/\" ? organizations.find(org => org.tag === preferred) : null;\n  return selected ? `/o/${encodeURIComponent(organizationSlug(selected.tag))}${path}` : \"/organisaties\";\n}\n\nexport function preferenceScope(): string {\n  return organizationSession.account && organizationSession.organization\n    ? `${organizationSession.account.guid}:${organizationSession.organization.tag}` : \"\";\n}\n\nexport function useOrganizationDirty(isDirty: () => boolean): void {\n  dirtyForms.add(isDirty);\n  onBeforeUnmount(() => dirtyForms.delete(isDirty));\n}\n\nexport function resolveOrganizationLeave(leave: boolean): void {\n  organizationSession.leavePrompt = null;\n  resolveLeave?.(leave);\n  resolveLeave = null;\n}\n\nexport async function mayLeaveOrganization(): Promise<boolean> {\n  if (resolveLeave) return false;\n  const dirty = [...dirtyForms].some(isDirty => isDirty()) || Boolean(document.querySelector(\".dialog-backdrop\"));\n  if (!organizationSession.writes && !dirty) return true;\n  organizationSession.leavePrompt = organizationSession.writes ? \"busy\" : \"dirty\";\n  const generation = organizationSession.generation;\n  const accepted = await new Promise<boolean>(resolve => { resolveLeave = resolve; });\n  // A debounce or revoked grant may have changed the scope while the dialog was open.\n  return accepted && organizationSession.writes === 0 && generation === organizationSession.generation;\n}\n","// Gedeelde route-query helpers voor URL-gespiegelde filter-/weergavestaat.\n// Pure functies (geen @webhare-runtime imports) zodat ze via `wh runtest`\n// unit-testbaar zijn. Views spiegelen hun filters naar de hash-router-query,\n// zodat een refresh dezelfde selectie herstelt en \"terug\" de vorige staat toont.\n\n/** Route-query zoals vue-router die levert (waarden kunnen array of null zijn). */\nexport type RouteQueryLike = Record<string, string | (string | null)[] | null | undefined>;\n\n/** Platte eerste-waarde-record van een route-query (arrays -> eerste waarde). */\nexport function queryRecord(query: RouteQueryLike): Record<string, string | undefined> {\n  const rec: Record<string, string | undefined> = {};\n  for (const [key, value] of Object.entries(query)) {\n    rec[key] = Array.isArray(value) ? (value[0] ?? undefined) : (value ?? undefined);\n  }\n  return rec;\n}\n\n/**\n * True als twee query-records dezelfde sleutels en waarden hebben. Guard tegen\n * redundante navigatie: alleen een echte wijziging leidt tot router.replace.\n *\n * @param a - Eerste query-record\n * @param b - Tweede query-record\n */\nexport function sameQuery(a: Record<string, string | undefined>, b: Record<string, string | undefined>): boolean {\n  const aKeys = Object.keys(a);\n  const bKeys = Object.keys(b);\n  return aKeys.length === bKeys.length && aKeys.every((key) => a[key] === b[key]);\n}\n","import { sameQuery } from \"./routeQuery\";\n\ninterface CustomerListPosition {\n  customerId: number;\n  query: Record<string, string>;\n  scrollY: number;\n}\n\n// Keep the source list in memory while its detail page is mounted. The query\n// remains in the URL; this snapshot only supplies the row and viewport position.\nexport let customerListPosition: CustomerListPosition | null = null;\n\nexport function rememberCustomerListPosition(position: CustomerListPosition): void {\n  customerListPosition = position;\n}\n\nexport function restoreCustomerListPosition(options: { saved: CustomerListPosition | null; ids: number[]; query: Record<string, string> }): { activeIndex: number; scrollY: number } | null {\n  if (!options.saved || !sameQuery(options.saved.query, options.query)) return null;\n  const activeIndex = options.ids.indexOf(options.saved.customerId);\n  return activeIndex < 0 ? null : { activeIndex, scrollY: options.saved.scrollY };\n}\n\nexport function clearCustomerListPosition(): void {\n  customerListPosition = null;\n}\n","import { organizationSession } from \"./organization\";\nimport { onBeforeUnmount, readonly, ref } from \"vue\";\n\n// Minimale toast-singleton voor de Vue-stack (er is geen toast-library). Eén\n// bericht tegelijk; auto-verdwijnt na een paar seconden of bij dismiss.\n\nconst message = ref(\"\");\nlet timer: number | null = null;\n\n/**\n * Toont een toastbericht (vervangt een eventueel lopend bericht).\n *\n * @param text - Het te tonen bericht\n * @param durationMs - Zichtbaarheidsduur in ms (default 4500)\n */\nexport function showToast(text: string, durationMs = 4500): void {\n  message.value = text;\n  if (timer !== null) window.clearTimeout(timer);\n  timer = window.setTimeout(() => { message.value = \"\"; timer = null; }, durationMs);\n}\n\n/** Verbergt het huidige toastbericht meteen. */\nexport function dismissToast(): void {\n  if (timer !== null) { window.clearTimeout(timer); timer = null; }\n  message.value = \"\";\n}\n\nexport const toastMessage = readonly(message);\n\n/** Prevent completed requests from notifying a different administration or a closed dialog. */\nexport function useToast(): (text: string) => void {\n  const generation = organizationSession.generation;\n  let disposed = false;\n  onBeforeUnmount(() => { disposed = true; });\n  return text => {\n    if (!disposed && generation === organizationSession.generation) showToast(text);\n  };\n}\n","/** Remove the transport prefix without rewriting the server's domain message. */\nexport function rpcErrorMessage(message: string): string {\n  return message.replace(/^RPC Error:\\s*/, \"\");\n}\n","import { rpc as createRpcClient, type OmitRPCContextArgs } from \"@webhare/rpc\";\nimport { onBeforeUnmount } from \"vue\";\nimport { rpcErrorMessage } from \"./rpcError\";\nimport { organizationSession, setAccount, setOrganization } from \"./organization\";\nimport type { PublicRPC } from \"@mod-happy/js/public-rpc\";\n\n// Typed RPC-client voor de public (WRDAuth-cookie) surface. De client voegt\n// automatisch ?pathname= toe zodat context.getRequestUser() de <wrdauth>-config\n// van de siteprofile kan resolven. (Type-only import van @mod-happy is prima:\n// die wordt door TypeScript ge-erased en bereikt esbuild nooit.)\nconst client = createRpcClient<OmitRPCContextArgs<typeof PublicRPC>>(\"happy:public\");\ntype Client = typeof client;\ntype IdentityMethod = \"me\" | \"getProfile\" | \"updateProfile\";\nexport type OrganizationApi = { [K in keyof Client]: K extends IdentityMethod ? Client[K] : Client[K] extends (context: never, ...args: infer A) => infer R ? (...args: A) => R : never };\n\nexport async function refreshAccount(): Promise<void> {\n  const generation = organizationSession.generation;\n  const account = await client.me();\n  if (generation === organizationSession.generation) setAccount(account);\n}\n\n/** Capture the scope at component setup, including delayed callbacks and follow-up requests. */\nexport function useApi(): OrganizationApi {\n  const tag = organizationSession.organization?.tag;\n  const generation = organizationSession.generation;\n  let disposed = false;\n  onBeforeUnmount(() => { disposed = true; });\n  return new Proxy(client, {\n    get(target, property, receiver) {\n      const method = Reflect.get(target, property, receiver);\n      if (typeof method !== \"function\") return method;\n      return async (...args: unknown[]) => {\n        const identity = [\"me\", \"getProfile\", \"updateProfile\"].includes(String(property));\n        const current = () => !disposed && generation === organizationSession.generation;\n        if (!current() || (!identity && !tag)) throw new Error(\"Deze administratie is niet meer actief.\");\n        const write = /^(create|update|delete|archive|restore|save|send|close|reopen|set|register)/.test(String(property));\n        if (write) organizationSession.writes++;\n        try {\n          const result = await Reflect.apply(method, target, identity ? args : [{ organization: tag }, ...args]);\n          if (!current()) throw new Error(\"Deze administratie is niet meer actief.\");\n          if (property === \"updateProfile\") {\n            // A failed header refresh must not turn a persisted profile update into a failed save.\n            await refreshAccount().catch(() => {});\n          }\n          return result;\n        } catch (error) {\n          if (error instanceof Error) {\n            error.message = rpcErrorMessage(error.message);\n            if (current() && /HAPPY_(ACCESS_DENIED|AUTH_REQUIRED|ORGANIZATION_REQUIRED)/.test(error.message)) {\n              setOrganization(null);\n              organizationSession.error = \"Je toegang is gewijzigd. Kies opnieuw een beschikbare administratie.\";\n              const recoveryGeneration = organizationSession.generation;\n              void refreshAccount().catch(() => {\n                if (organizationSession.generation === recoveryGeneration) organizationSession.account = null;\n              });\n            }\n            error.message = error.message.replace(/HAPPY_[A-Z_]+:\\s*/, \"\");\n          }\n          throw error;\n        } finally {\n          if (write) organizationSession.writes--;\n        }\n      };\n    },\n  }) as unknown as OrganizationApi;\n}\n","import { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, renderList as _renderList, Fragment as _Fragment, withCtx as _withCtx, createBlock as _createBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"hh-card organization-choice\" }\nconst _hoisted_2 = {\n  key: 0,\n  class: \"organization-choice__intro\"\n}\nconst _hoisted_3 = {\n  key: 1,\n  role: \"alert\"\n}\nconst _hoisted_4 = { key: 2 }\nconst _hoisted_5 = {\n  key: 3,\n  \"aria-label\": \"Beschikbare administraties\"\n}\nconst _hoisted_6 = { class: \"organization-choice__name\" }\nconst _hoisted_7 = { class: \"organization-choice__role\" }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return (_openBlock(), _createElementBlock(\"section\", _hoisted_1, [\n    _createElementVNode(\"h1\", null, _toDisplayString($setup.organizationSession.account?.organizations.length ? \"Kies een administratie\" : \"Geen toegang tot een administratie\"), 1 /* TEXT */),\n    ($setup.organizationSession.account?.organizations.length)\n      ? (_openBlock(), _createElementBlock(\"p\", _hoisted_2, \"In welke administratie wil je werken?\"))\n      : _createCommentVNode(\"v-if\", true),\n    ($setup.organizationSession.error)\n      ? (_openBlock(), _createElementBlock(\"p\", _hoisted_3, _toDisplayString($setup.organizationSession.error), 1 /* TEXT */))\n      : _createCommentVNode(\"v-if\", true),\n    (!$setup.organizationSession.account?.organizations.length)\n      ? (_openBlock(), _createElementBlock(\"p\", _hoisted_4, \"Vraag je beheerder om je toegang te geven tot een Happy Hours-administratie.\"))\n      : (_openBlock(), _createElementBlock(\"nav\", _hoisted_5, [\n          (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.organizationSession.account.organizations, (organization) => {\n            return (_openBlock(), _createBlock($setup[\"RouterLink\"], {\n              key: organization.tag,\n              class: \"organization-choice__item\",\n              to: { name: 'home', params: { organization: $setup.organizationSlug(organization.tag) } }\n            }, {\n              default: _withCtx(() => [\n                _cache[0] || (_cache[0] = _createElementVNode(\"span\", {\n                  class: \"organization-choice__icon\",\n                  \"aria-hidden\": \"true\"\n                }, [\n                  _createElementVNode(\"svg\", {\n                    viewBox: \"0 0 24 24\",\n                    fill: \"none\",\n                    stroke: \"currentColor\",\n                    \"stroke-width\": \"1.5\",\n                    \"stroke-linecap\": \"round\",\n                    \"stroke-linejoin\": \"round\"\n                  }, [\n                    _createElementVNode(\"path\", { d: \"M4 21h16M6 21V3h12v18M10 21v-4h4v4M9 7h1m4 0h1M9 11h1m4 0h1\" })\n                  ])\n                ], -1 /* CACHED */)),\n                _createElementVNode(\"span\", _hoisted_6, _toDisplayString(organization.title || organization.tag), 1 /* TEXT */),\n                _createElementVNode(\"span\", _hoisted_7, _toDisplayString(organization.role === \"admin\" ? \"Beheerder\" : \"Boekhouder\"), 1 /* TEXT */),\n                _cache[1] || (_cache[1] = _createElementVNode(\"svg\", {\n                  class: \"organization-choice__arrow\",\n                  \"aria-hidden\": \"true\",\n                  viewBox: \"0 0 24 24\",\n                  fill: \"none\",\n                  stroke: \"currentColor\",\n                  \"stroke-width\": \"1.5\",\n                  \"stroke-linecap\": \"round\",\n                  \"stroke-linejoin\": \"round\"\n                }, [\n                  _createElementVNode(\"path\", { d: \"m9 5 7 7-7 7\" })\n                ], -1 /* CACHED */))\n              ]),\n              _: 2 /* DYNAMIC */,\n              __: [0,1]\n            }, 1032 /* PROPS, DYNAMIC_SLOTS */, [\"to\"]))\n          }), 128 /* KEYED_FRAGMENT */))\n        ]))\n  ]))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/OrganizationChoiceView.vue?type=script\";import \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/OrganizationChoiceView.vue?type=style&index=0\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/OrganizationChoiceView.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/OrganizationChoiceView.vue\";script.__scopeId = \"data-v-fe4fec6c\";export default script;","import { organizationSession, preferenceScope } from \"./organization\";\n\n// Centraal register van resetbare \"onthoud mijn keuze\"-voorkeuren. Per gebruiker\n// Stored by account GUID and organization; email keys are legacy migration input.\n// De profielpagina itereert\n// over dit register en toont per voorkeur de status + een resetknop; nieuwe\n// \"onthoud\"-opties pluggen er vanzelf in door hier een entry toe te voegen.\n//\n// De pure delen (register + storageKey) zijn unit-getest via wh runtest; de\n// localStorage-wrappers zijn dun en best-effort (try/catch, zoals LoginForm).\n\nexport interface PreferenceDef {\n  /** Sleutel-suffix, bv. \"skipVerwerkConfirm\" -> \"happy:skipVerwerkConfirm:${email}\". */\n  key: string;\n  /** Kort label voor op de profielpagina. */\n  label: string;\n  /** Uitleg wat de voorkeur doet als hij \"aan\" staat. */\n  description: string;\n}\n\nexport const preferences: PreferenceDef[] = [\n  {\n    key: \"sidebarCollapsed\",\n    label: \"Sidebar ingeklapt\",\n    description: \"De navigatie toont alleen iconen. Klap de sidebar uit om ook de namen te zien.\",\n  },\n  {\n    key: \"skipVerwerkConfirm\",\n    label: \"Verwerk-bevestiging uren overslaan\",\n    description: \"Bij het verwerken van uren wordt niet meer om bevestiging gevraagd.\",\n  },\n  {\n    key: \"skipExpenseVerwerkConfirm\",\n    label: \"Verwerk-bevestiging verschotten overslaan\",\n    description: \"Bij het verwerken van verschotten wordt niet meer om bevestiging gevraagd.\",\n  },\n];\n\n/**\n * Bouwt de localStorage-sleutel voor een voorkeur. Moet exact matchen met wat de\n * schermen (o.a. HoursEntryView) schrijven, anders raken opgeslagen voorkeuren wees.\n *\n * @param key - De voorkeur-sleutel uit het register\n * @param email - E-mail van de ingelogde gebruiker\n */\nexport function preferenceStorageKey(key: string, email: string): string {\n  return `happy:${key}:${email}`;\n}\n\n/**\n * Leest of een voorkeur \"aan\" staat voor deze gebruiker.\n *\n * @param email - E-mail van de ingelogde gebruiker\n * @param key - De voorkeur-sleutel\n */\nexport function isPreferenceSet(email: string, key: string): boolean {\n  try {\n    return localStorage.getItem(scopedPreferenceStorageKey(key)) === \"true\";\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Zet een voorkeur \"aan\" voor deze gebruiker.\n *\n * @param email - E-mail van de ingelogde gebruiker\n * @param key - De voorkeur-sleutel\n */\nexport function setPreference(email: string, key: string): void {\n  try {\n    localStorage.setItem(scopedPreferenceStorageKey(key), \"true\");\n  } catch {\n    /* ignore */\n  }\n}\n\n/**\n * Reset (verwijdert) een voorkeur voor deze gebruiker.\n *\n * @param email - E-mail van de ingelogde gebruiker\n * @param key - De voorkeur-sleutel\n */\nexport function resetPreference(email: string, key: string): void {\n  try {\n    localStorage.removeItem(scopedPreferenceStorageKey(key));\n  } catch {\n    /* ignore */\n  }\n}\n\n/**\n * Geeft de sleutels van alle voorkeuren die momenteel \"aan\" staan.\n *\n * @param email - E-mail van de ingelogde gebruiker\n */\nexport function getRememberedKeys(email: string): string[] {\n  return preferences.filter((preference) => isPreferenceSet(email, preference.key)).map((preference) => preference.key);\n}\n\n/** Legacy preferences belong only to the original administration and migrate once per account. */\nexport function scopedPreferenceStorageKey(key: string): string {\n  const scope = preferenceScope();\n  if (!scope) throw new Error(\"Kies eerst een administratie.\");\n  const account = organizationSession.account!;\n  const migrationKey = `happy:preferencesMigrated:${account.guid}`;\n  if (organizationSession.organization?.tag === \"happy:happy\" && !localStorage.getItem(migrationKey)) {\n    for (const legacyKey of [...preferences.map(preference => preference.key), \"lastEmployee\"]) {\n      const previous = localStorage.getItem(preferenceStorageKey(legacyKey, account.email));\n      const destination = preferenceStorageKey(legacyKey, scope);\n      if (previous !== null && localStorage.getItem(destination) === null) localStorage.setItem(destination, previous);\n    }\n    localStorage.setItem(migrationKey, \"true\");\n  }\n  return preferenceStorageKey(key, scope);\n}\n","/* Framework-free frontend helpers for js/auth/code-login.ts. Safe to import in an assetpack: no backend\n   imports. The Vue components that use these live in mod::vue (libs/auth). */\n\nexport interface LoginFormInstruction {\n  action: string;\n  vars: Array<{ name: string; value: string }>;\n}\n\nexport const codeLength = 6;\n\nexport function isLoginEmail(value: string): boolean {\n  const normalized = value.trim();\n  return normalized.length <= 254 && /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(normalized);\n}\n\n/** Split pasted text into cells.\n    @returns digits - the sanitized digits to show, for manual correction\n    @returns complete - only true when the trimmed clipboard is exactly the code: a longer or mixed paste must never submit */\nexport function parsePastedCode(text: string, length = codeLength): { digits: string; complete: boolean } {\n  return {\n    digits: text.replace(/\\D/g, \"\").slice(0, length),\n    complete: new RegExp(`^[0-9]{${length}}$`).test(text.trim()),\n  };\n}\n\n/** Post the login form prepared by the server (prepareFrontendLogin). This sets the WRDAuth cookies and navigates. */\nexport function submitLoginForm(form: LoginFormInstruction): void {\n  const node = document.createElement(\"form\");\n  node.method = \"post\";\n  node.action = form.action;\n  node.hidden = true;\n  for (const variable of form.vars) {\n    const input = document.createElement(\"input\");\n    input.type = \"hidden\";\n    input.name = variable.name;\n    input.value = variable.value;\n    node.append(input);\n  }\n  document.body.append(node);\n  node.submit();\n}\n\n/** A failed Google (OIDC) login lands on the webroot as ?wrd_pwdaction=oidc-failure&reason=... Only the\n    reason code is trustworthy, so map it to your own text instead of showing URL content.\n    @returns null when the URL is not an OIDC failure */\nexport function getGoogleLoginFailure(search: string): \"account-disabled\" | \"unknown-login\" | \"other\" | null {\n  const params = new URLSearchParams(search);\n  if (params.get(\"wrd_pwdaction\") !== \"oidc-failure\")\n    return null;\n  const reason = params.get(\"reason\");\n  return reason === \"account-disabled\" || reason === \"unknown-login\" ? reason : \"other\";\n}\n","<template>\n  <div ref=\"rootEl\" class=\"codeinput\" :class=\"{ 'codeinput--error': error }\" role=\"group\" :aria-label=\"label\">\n    <input\n      v-for=\"(cell, i) in cells\"\n      :key=\"i\"\n      :ref=\"(el) => setRef(el, i)\"\n      class=\"codeinput__cell\"\n      type=\"text\"\n      inputmode=\"numeric\"\n      autocomplete=\"one-time-code\"\n      maxlength=\"1\"\n      :aria-label=\"`Cijfer ${i + 1}`\"\n      :disabled=\"disabled\"\n      :value=\"cell\"\n      @input=\"onInput(i, $event)\"\n      @keydown=\"onKeydown(i, $event)\"\n      @focus=\"onFocus($event)\"\n      @paste=\"onPaste($event)\"\n    />\n  </div>\n</template>\n\n<script setup lang=\"ts\">\n/* Six-cell input for an emailed code (mod::ww js/auth/code-login.ts). Style it with the --codeinput-* custom\n   properties. Deliberately has no \"complete\" event: typing the last digit must not submit. Only a paste of\n   exactly the code emits paste-complete, after update:modelValue. */\nimport { ref, watch } from \"vue\";\nimport { codeLength, parsePastedCode } from \"@mod-ww/js/auth/code-login-frontend\";\n\nconst props = withDefaults(defineProps<{ modelValue: string; disabled?: boolean; error?: boolean; label?: string }>(), {\n  disabled: false,\n  error: false,\n  label: \"Code\",\n});\nconst emit = defineEmits<{\n  (e: \"update:modelValue\", value: string): void;\n  (e: \"paste-complete\", value: string): void;\n}>();\n\nconst cells = ref<string[]>(Array.from({ length: codeLength }, () => \"\"));\nconst inputs = ref<HTMLInputElement[]>([]);\nconst rootEl = ref<HTMLElement | null>(null);\n\nfunction setRef(el: unknown, i: number) {\n  if (el instanceof HTMLInputElement)\n    inputs.value[i] = el;\n}\n\n// Immediate, so a development prefill shows up. Never emits: a prefill must not submit.\nwatch(() => props.modelValue, value => {\n  if (value === cells.value.join(\"\"))\n    return;\n  const digits = parsePastedCode(value ?? \"\").digits.split(\"\");\n  cells.value = Array.from({ length: codeLength }, (_, i) => digits[i] ?? \"\");\n}, { immediate: true });\n\nfunction commit() {\n  emit(\"update:modelValue\", cells.value.join(\"\"));\n}\n\nfunction focusCell(i: number) {\n  const el = inputs.value[i];\n  el?.focus();\n  el?.select();\n}\n\ndefineExpose({ focus: () => focusCell(Math.max(0, cells.value.findIndex(c => !c))) });\n\nfunction onInput(i: number, event: Event) {\n  const target = event.target as HTMLInputElement;\n  const digit = target.value.replace(/\\D/g, \"\").slice(-1);\n  cells.value[i] = digit;\n  target.value = digit;\n  commit();\n  if (digit && i < codeLength - 1)\n    focusCell(i + 1);\n}\n\nfunction onKeydown(i: number, event: KeyboardEvent) {\n  if (event.key === \"Backspace\" && !cells.value[i] && i > 0) {\n    event.preventDefault();\n    cells.value[i - 1] = \"\";\n    commit();\n    focusCell(i - 1);\n  } else if (event.key === \"ArrowLeft\" && i > 0) {\n    event.preventDefault();\n    focusCell(i - 1);\n  } else if (event.key === \"ArrowRight\" && i < codeLength - 1) {\n    event.preventDefault();\n    focusCell(i + 1);\n  }\n}\n\nfunction onFocus(event: FocusEvent) {\n  (event.target as HTMLInputElement).select();\n}\n\n// A paste into ANY cell replaces the whole code from the first cell\nfunction onPaste(event: ClipboardEvent) {\n  event.preventDefault();\n  if (props.disabled)\n    return;\n  const pasted = parsePastedCode(event.clipboardData?.getData(\"text\") ?? \"\");\n  if (!pasted.digits)\n    return;\n  cells.value = Array.from({ length: codeLength }, (_, i) => pasted.digits[i] ?? \"\");\n  commit();\n  const firstEmpty = cells.value.findIndex(c => !c);\n  focusCell(firstEmpty === -1 ? codeLength - 1 : firstEmpty);\n  if (pasted.complete)\n    emit(\"paste-complete\", pasted.digits);\n}\n</script>\n\n<style scoped>\n.codeinput {\n  display: flex;\n  gap: var(--codeinput-gap, 8px);\n}\n.codeinput__cell {\n  flex: 1;\n  min-width: 0;\n  height: var(--codeinput-height, 52px);\n  padding: 0;\n  text-align: center;\n  font: inherit;\n  font-size: var(--codeinput-font-size, 22px);\n  font-weight: 700;\n  font-variant-numeric: tabular-nums;\n  border: 1px solid var(--codeinput-border, #c9cecb);\n  border-radius: var(--codeinput-radius, 8px);\n  background: var(--codeinput-bg, #fff);\n  color: var(--codeinput-fg, inherit);\n  outline: none;\n  transition: border-color 0.12s, box-shadow 0.12s;\n}\n.codeinput__cell:focus {\n  border-color: var(--codeinput-focus, #ff7700);\n  box-shadow: 0 0 0 3px var(--codeinput-focus-ring, rgb(255 119 0 / 25%));\n}\n.codeinput__cell:disabled {\n  opacity: 0.6;\n  cursor: not-allowed;\n}\n.codeinput--error .codeinput__cell {\n  border-color: var(--codeinput-error, #d9534f);\n}\n</style>\n","import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, normalizeClass as _normalizeClass } from \"vue\"\n\nconst _hoisted_1 = [\"aria-label\"]\nconst _hoisted_2 = [\"aria-label\", \"disabled\", \"value\", \"onInput\", \"onKeydown\"]\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return (_openBlock(), _createElementBlock(\"div\", {\n    ref: \"rootEl\",\n    class: _normalizeClass([\"codeinput\", { 'codeinput--error': $props.error }]),\n    role: \"group\",\n    \"aria-label\": $props.label\n  }, [\n    (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.cells, (cell, i) => {\n      return (_openBlock(), _createElementBlock(\"input\", {\n        key: i,\n        ref_for: true,\n        ref: (el) => $setup.setRef(el, i),\n        class: \"codeinput__cell\",\n        type: \"text\",\n        inputmode: \"numeric\",\n        autocomplete: \"one-time-code\",\n        maxlength: \"1\",\n        \"aria-label\": `Cijfer ${i + 1}`,\n        disabled: $props.disabled,\n        value: cell,\n        onInput: $event => ($setup.onInput(i, $event)),\n        onKeydown: $event => ($setup.onKeydown(i, $event)),\n        onFocus: _cache[0] || (_cache[0] = $event => ($setup.onFocus($event))),\n        onPaste: _cache[1] || (_cache[1] = $event => ($setup.onPaste($event)))\n      }, null, 40 /* PROPS, NEED_HYDRATION */, _hoisted_2))\n    }), 128 /* KEYED_FRAGMENT */))\n  ], 10 /* CLASS, PROPS */, _hoisted_1))\n}","import script from \"/opt/whdata/installedmodules/vue.20261006T102852.814Z/libs/auth/CodeInput.vue?type=script\";import \"/opt/whdata/installedmodules/vue.20261006T102852.814Z/libs/auth/CodeInput.vue?type=style&index=0\";import { render } from \"/opt/whdata/installedmodules/vue.20261006T102852.814Z/libs/auth/CodeInput.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/vue.20261006T102852.814Z/libs/auth/CodeInput.vue\";script.__scopeId = \"data-v-f8840f98\";export default script;","import { toDisplayString as _toDisplayString, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, createTextVNode as _createTextVNode, renderSlot as _renderSlot } from \"vue\"\n\nconst _hoisted_1 = { class: \"field\" }\nconst _hoisted_2 = [\"for\"]\nconst _hoisted_3 = {\n  key: 0,\n  class: \"field__req\",\n  \"aria-hidden\": \"true\"\n}\nconst _hoisted_4 = {\n  key: 1,\n  class: \"field__msg\"\n}\nconst _hoisted_5 = {\n  key: 0,\n  class: \"field__error\"\n}\nconst _hoisted_6 = {\n  key: 1,\n  class: \"field__hint\"\n}\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n    ($props.label)\n      ? (_openBlock(), _createElementBlock(\"label\", {\n          key: 0,\n          class: \"field__label\",\n          for: $props.forId\n        }, [\n          _createTextVNode(_toDisplayString($props.label), 1 /* TEXT */),\n          ($props.required)\n            ? (_openBlock(), _createElementBlock(\"span\", _hoisted_3, \"*\"))\n            : _createCommentVNode(\"v-if\", true)\n        ], 8 /* PROPS */, _hoisted_2))\n      : _createCommentVNode(\"v-if\", true),\n    _renderSlot(_ctx.$slots, \"default\", {}, undefined, true),\n    ($props.error || $props.hint)\n      ? (_openBlock(), _createElementBlock(\"div\", _hoisted_4, [\n          ($props.error)\n            ? (_openBlock(), _createElementBlock(\"p\", _hoisted_5, _toDisplayString($props.error), 1 /* TEXT */))\n            : ($props.hint)\n              ? (_openBlock(), _createElementBlock(\"p\", _hoisted_6, _toDisplayString($props.hint), 1 /* TEXT */))\n              : _createCommentVNode(\"v-if\", true)\n        ]))\n      : _createCommentVNode(\"v-if\", true)\n  ]))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/FormField.vue?type=script\";import \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/FormField.vue?type=style&index=0\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/FormField.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/FormField.vue\";script.__scopeId = \"data-v-1d247716\";export default script;","<script setup lang=\"ts\">\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref } from \"vue\";\nimport { rpc, type OmitRPCContextArgs } from \"@webhare/rpc\";\nimport type { HappyAuthRPC } from \"@mod-happy/js/auth-rpc\";\nimport { isLoginEmail } from \"@mod-ww/js/auth/code-login-frontend\";\nimport CodeInput from \"@mod-vue/libs/auth/CodeInput.vue\";\nimport FormField from \"./FormField.vue\";\nimport { rpcErrorMessage } from \"../lib/rpcError\";\n\nconst props = withDefaults(defineProps<{ initialEmail: string; firstPassword?: boolean }>(), { firstPassword: false });\nconst emit = defineEmits<{ done: [result: { email: string; changed?: boolean }] }>();\n// Recovery runs before an organization is selected, outside the administrative RPC scope.\nconst api = rpc<OmitRPCContextArgs<typeof HappyAuthRPC>>(\"happy:auth\");\nconst step = ref<\"email\" | \"code\">(\"email\");\nconst email = ref(props.initialEmail);\nconst code = ref(\"\");\nconst password = ref(\"\");\nconst repeat = ref(\"\");\nconst error = ref(\"\");\nconst fieldErrors = ref<Record<string, string>>({});\nconst busy = ref(false);\nconst passwordAction = computed(() => props.firstPassword ? \"Wachtwoord instellen\" : \"Wachtwoord wijzigen\");\nconst cooldown = ref(0);\nconst emailInput = ref<HTMLInputElement | null>(null);\nconst codeInput = ref<{ focus: () => void } | null>(null);\nconst passwordInput = ref<HTMLInputElement | null>(null);\nconst repeatInput = ref<HTMLInputElement | null>(null);\nlet resendAfter = 0;\nlet timer: number | undefined;\n\nasync function requestCode(): Promise<void> {\n  if (busy.value || cooldown.value > 0) return;\n  error.value = \"\";\n  fieldErrors.value = {};\n  email.value = email.value.trim().toLowerCase();\n  if (!isLoginEmail(email.value)) {\n    fieldErrors.value.email = \"Vul een geldig e-mailadres in.\";\n    emailInput.value?.focus();\n    return;\n  }\n  busy.value = true;\n  try {\n    const result = await api.requestPasswordResetCode({ email: email.value });\n    if (!result.success) {\n      error.value = result.error;\n      return;\n    }\n    code.value = result.code ?? \"\";\n    step.value = \"code\";\n    resendAfter = Date.now() + 60_000;\n    cooldown.value = 60;\n  } catch (err) {\n    error.value = rpcErrorMessage(err instanceof Error ? err.message : \"De code kon niet worden verstuurd. Probeer het opnieuw.\");\n  } finally {\n    busy.value = false;\n  }\n  // Disabled code cells cannot receive focus until Vue has rendered the completed request.\n  if (step.value === \"code\") {\n    await nextTick();\n    codeInput.value?.focus();\n  }\n}\n\nasync function setPassword(): Promise<void> {\n  if (busy.value) return;\n  error.value = \"\";\n  fieldErrors.value = {};\n  if (!/^[0-9]{6}$/.test(code.value)) fieldErrors.value.code = \"Vul de code van zes cijfers in.\";\n  if (!password.value) fieldErrors.value.password = \"Vul een nieuw wachtwoord in.\";\n  if (!repeat.value || password.value !== repeat.value) fieldErrors.value.repeat = \"De twee wachtwoorden zijn niet gelijk.\";\n  if (Object.keys(fieldErrors.value).length) {\n    if (fieldErrors.value.code) codeInput.value?.focus();\n    else if (fieldErrors.value.password) passwordInput.value?.focus();\n    else repeatInput.value?.focus();\n    return;\n  }\n  busy.value = true;\n  try {\n    const result = await api.resetPassword({ email: email.value, code: code.value, password: password.value });\n    if (!result.success) {\n      error.value = result.error;\n      return;\n    }\n    // The normal login preserves the existing organization deep link and its native form handler.\n    emit(\"done\", { email: email.value, changed: true });\n  } catch (err) {\n    error.value = rpcErrorMessage(err instanceof Error ? err.message : \"Het wachtwoord kon niet worden gewijzigd. Probeer het opnieuw.\");\n  } finally {\n    busy.value = false;\n  }\n}\n\nonMounted(() => {\n  emailInput.value?.focus();\n  timer = window.setInterval(() => { cooldown.value = Math.max(0, Math.ceil((resendAfter - Date.now()) / 1000)); }, 1000);\n});\nonBeforeUnmount(() => window.clearInterval(timer));\n</script>\n\n<template>\n  <section class=\"password-reset\">\n    <h2 class=\"password-reset__title\">{{ props.firstPassword ? \"Wachtwoord instellen\" : \"Wachtwoord vergeten\" }}</h2>\n    <p v-if=\"error\" class=\"hh-formerror\" role=\"alert\">{{ error }}</p>\n\n    <form v-if=\"step === 'email'\" class=\"password-reset__form\" novalidate @submit.prevent=\"requestCode\">\n      <FormField label=\"E-mail\" for-id=\"reset-email\" :error=\"fieldErrors.email\">\n        <input id=\"reset-email\" ref=\"emailInput\" v-model=\"email\" class=\"hh-input password-reset__input\" :class=\"{ 'hh-input--error': fieldErrors.email }\"\n          type=\"email\" autocomplete=\"username\" :disabled=\"busy\" :aria-invalid=\"Boolean(fieldErrors.email)\" />\n      </FormField>\n      <button type=\"submit\" class=\"hh-btn hh-btn--primary password-reset__submit\" :disabled=\"busy\" :aria-busy=\"busy\">{{ busy ? \"Code versturen…\" : props.firstPassword ? \"Stuur code\" : \"Stuur herstelcode\" }}</button>\n    </form>\n\n    <form v-else class=\"password-reset__form\" novalidate @submit.prevent=\"setPassword\">\n      <p class=\"password-reset__text\" role=\"status\">Als <strong>{{ email }}</strong> toegang heeft, ontvang je een code. De code is 15 minuten geldig.</p>\n      <!-- Keep the account visible to password managers while offering only new-password fields. -->\n      <input class=\"password-reset__username\" type=\"email\" autocomplete=\"username\" :value=\"email\" tabindex=\"-1\" aria-hidden=\"true\" readonly />\n      <FormField :label=\"props.firstPassword ? 'Code' : 'Herstelcode'\" :error=\"fieldErrors.code\">\n        <CodeInput ref=\"codeInput\" v-model=\"code\" class=\"password-reset__code\" :label=\"props.firstPassword ? 'Code' : 'Herstelcode'\" :disabled=\"busy\" :error=\"Boolean(fieldErrors.code)\" />\n      </FormField>\n      <FormField label=\"Nieuw wachtwoord\" for-id=\"reset-password\" :error=\"fieldErrors.password\">\n        <input id=\"reset-password\" ref=\"passwordInput\" v-model=\"password\" class=\"hh-input password-reset__input\" :class=\"{ 'hh-input--error': fieldErrors.password }\"\n          type=\"password\" autocomplete=\"new-password\" :disabled=\"busy\" :aria-invalid=\"Boolean(fieldErrors.password)\" />\n      </FormField>\n      <FormField label=\"Herhaal het nieuwe wachtwoord\" for-id=\"reset-repeat\" :error=\"fieldErrors.repeat\">\n        <input id=\"reset-repeat\" ref=\"repeatInput\" v-model=\"repeat\" class=\"hh-input password-reset__input\" :class=\"{ 'hh-input--error': fieldErrors.repeat }\"\n          type=\"password\" autocomplete=\"new-password\" :disabled=\"busy\" :aria-invalid=\"Boolean(fieldErrors.repeat)\" />\n      </FormField>\n      <button type=\"submit\" class=\"hh-btn hh-btn--primary password-reset__submit\" :disabled=\"busy\" :aria-busy=\"busy\">{{ busy ? `${passwordAction}…` : passwordAction }}</button>\n      <button type=\"button\" class=\"password-reset__link\" :disabled=\"busy || cooldown > 0\" @click=\"requestCode\">{{ cooldown > 0 ? `Nieuwe code over ${cooldown} s` : \"Stuur een nieuwe code\" }}</button>\n    </form>\n\n    <button type=\"button\" class=\"password-reset__link\" :disabled=\"busy\" @click=\"emit('done', { email })\">Terug naar inloggen</button>\n  </section>\n</template>\n\n<style scoped>\n.password-reset__title { margin: 0; font-size: 22px; font-weight: 700; letter-spacing: -0.025em; }\n.password-reset__text { margin: 0; color: var(--hh-fg-muted); font-size: 14px; overflow-wrap: anywhere; }\n.password-reset__form { display: flex; flex-direction: column; gap: 14px; }\n.password-reset__form :deep(.field) { margin-bottom: 0; }\n.password-reset__form :deep(.field__label), .password-reset__form :deep(.field__error) { font-size: 14px; }\n.password-reset__input { height: 44px; border-radius: 12px; background: var(--hh-surface-2); }\n.password-reset__submit { height: 48px; border-radius: 14px; font-size: 15px; font-weight: 700; }\n.password-reset__code { --codeinput-height: 44px; --codeinput-border: var(--hh-line); --codeinput-bg: var(--hh-surface-2); --codeinput-fg: var(--hh-fg); --codeinput-focus: var(--hh-accent); --codeinput-focus-ring: var(--hh-accent-soft); --codeinput-error: var(--hh-danger); }\n.password-reset__username { position: absolute; width: 1px; height: 1px; padding: 0; overflow: hidden; clip-path: inset(50%); }\n.password-reset__link { align-self: center; min-height: 32px; padding: 4px 8px; border: 0; border-radius: var(--hh-radius); background: transparent; color: var(--hh-fg-muted); font-size: 14px; text-decoration: underline; text-underline-offset: 3px; cursor: pointer; }\n.password-reset__link:focus-visible { outline: 2px solid var(--hh-accent); outline-offset: 2px; }\n.password-reset__link:disabled { opacity: 0.6; cursor: not-allowed; text-decoration: none; }\n@media (hover: hover) { .password-reset__link:hover:not(:disabled) { color: var(--hh-accent-strong); } }\n</style>\n","import { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, vModelText as _vModelText, normalizeClass as _normalizeClass, withDirectives as _withDirectives, withCtx as _withCtx, createVNode as _createVNode, withModifiers as _withModifiers, createTextVNode as _createTextVNode } from \"vue\"\n\nconst _hoisted_1 = { class: \"password-reset\" }\nconst _hoisted_2 = { class: \"password-reset__title\" }\nconst _hoisted_3 = {\n  key: 0,\n  class: \"hh-formerror\",\n  role: \"alert\"\n}\nconst _hoisted_4 = [\"disabled\", \"aria-invalid\"]\nconst _hoisted_5 = [\"disabled\", \"aria-busy\"]\nconst _hoisted_6 = {\n  class: \"password-reset__text\",\n  role: \"status\"\n}\nconst _hoisted_7 = [\"value\"]\nconst _hoisted_8 = [\"disabled\", \"aria-invalid\"]\nconst _hoisted_9 = [\"disabled\", \"aria-invalid\"]\nconst _hoisted_10 = [\"disabled\", \"aria-busy\"]\nconst _hoisted_11 = [\"disabled\"]\nconst _hoisted_12 = [\"disabled\"]\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return (_openBlock(), _createElementBlock(\"section\", _hoisted_1, [\n    _createElementVNode(\"h2\", _hoisted_2, _toDisplayString($setup.props.firstPassword ? \"Wachtwoord instellen\" : \"Wachtwoord vergeten\"), 1 /* TEXT */),\n    ($setup.error)\n      ? (_openBlock(), _createElementBlock(\"p\", _hoisted_3, _toDisplayString($setup.error), 1 /* TEXT */))\n      : _createCommentVNode(\"v-if\", true),\n    ($setup.step === 'email')\n      ? (_openBlock(), _createElementBlock(\"form\", {\n          key: 1,\n          class: \"password-reset__form\",\n          novalidate: \"\",\n          onSubmit: _withModifiers($setup.requestCode, [\"prevent\"])\n        }, [\n          _createVNode($setup[\"FormField\"], {\n            label: \"E-mail\",\n            \"for-id\": \"reset-email\",\n            error: $setup.fieldErrors.email\n          }, {\n            default: _withCtx(() => [\n              _withDirectives(_createElementVNode(\"input\", {\n                id: \"reset-email\",\n                ref: \"emailInput\",\n                \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => (($setup.email) = $event)),\n                class: _normalizeClass([\"hh-input password-reset__input\", { 'hh-input--error': $setup.fieldErrors.email }]),\n                type: \"email\",\n                autocomplete: \"username\",\n                disabled: $setup.busy,\n                \"aria-invalid\": Boolean($setup.fieldErrors.email)\n              }, null, 10 /* CLASS, PROPS */, _hoisted_4), [\n                [_vModelText, $setup.email]\n              ])\n            ]),\n            _: 1 /* STABLE */\n          }, 8 /* PROPS */, [\"error\"]),\n          _createElementVNode(\"button\", {\n            type: \"submit\",\n            class: \"hh-btn hh-btn--primary password-reset__submit\",\n            disabled: $setup.busy,\n            \"aria-busy\": $setup.busy\n          }, _toDisplayString($setup.busy ? \"Code versturen…\" : $setup.props.firstPassword ? \"Stuur code\" : \"Stuur herstelcode\"), 9 /* TEXT, PROPS */, _hoisted_5)\n        ], 32 /* NEED_HYDRATION */))\n      : (_openBlock(), _createElementBlock(\"form\", {\n          key: 2,\n          class: \"password-reset__form\",\n          novalidate: \"\",\n          onSubmit: _withModifiers($setup.setPassword, [\"prevent\"])\n        }, [\n          _createElementVNode(\"p\", _hoisted_6, [\n            _cache[5] || (_cache[5] = _createTextVNode(\"Als \", -1 /* CACHED */)),\n            _createElementVNode(\"strong\", null, _toDisplayString($setup.email), 1 /* TEXT */),\n            _cache[6] || (_cache[6] = _createTextVNode(\" toegang heeft, ontvang je een code. De code is 15 minuten geldig.\", -1 /* CACHED */))\n          ]),\n          _createCommentVNode(\" Keep the account visible to password managers while offering only new-password fields. \"),\n          _createElementVNode(\"input\", {\n            class: \"password-reset__username\",\n            type: \"email\",\n            autocomplete: \"username\",\n            value: $setup.email,\n            tabindex: \"-1\",\n            \"aria-hidden\": \"true\",\n            readonly: \"\"\n          }, null, 8 /* PROPS */, _hoisted_7),\n          _createVNode($setup[\"FormField\"], {\n            label: $setup.props.firstPassword ? 'Code' : 'Herstelcode',\n            error: $setup.fieldErrors.code\n          }, {\n            default: _withCtx(() => [\n              _createVNode($setup[\"CodeInput\"], {\n                ref: \"codeInput\",\n                modelValue: $setup.code,\n                \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => (($setup.code) = $event)),\n                class: \"password-reset__code\",\n                label: $setup.props.firstPassword ? 'Code' : 'Herstelcode',\n                disabled: $setup.busy,\n                error: Boolean($setup.fieldErrors.code)\n              }, null, 8 /* PROPS */, [\"modelValue\", \"label\", \"disabled\", \"error\"])\n            ]),\n            _: 1 /* STABLE */\n          }, 8 /* PROPS */, [\"label\", \"error\"]),\n          _createVNode($setup[\"FormField\"], {\n            label: \"Nieuw wachtwoord\",\n            \"for-id\": \"reset-password\",\n            error: $setup.fieldErrors.password\n          }, {\n            default: _withCtx(() => [\n              _withDirectives(_createElementVNode(\"input\", {\n                id: \"reset-password\",\n                ref: \"passwordInput\",\n                \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => (($setup.password) = $event)),\n                class: _normalizeClass([\"hh-input password-reset__input\", { 'hh-input--error': $setup.fieldErrors.password }]),\n                type: \"password\",\n                autocomplete: \"new-password\",\n                disabled: $setup.busy,\n                \"aria-invalid\": Boolean($setup.fieldErrors.password)\n              }, null, 10 /* CLASS, PROPS */, _hoisted_8), [\n                [_vModelText, $setup.password]\n              ])\n            ]),\n            _: 1 /* STABLE */\n          }, 8 /* PROPS */, [\"error\"]),\n          _createVNode($setup[\"FormField\"], {\n            label: \"Herhaal het nieuwe wachtwoord\",\n            \"for-id\": \"reset-repeat\",\n            error: $setup.fieldErrors.repeat\n          }, {\n            default: _withCtx(() => [\n              _withDirectives(_createElementVNode(\"input\", {\n                id: \"reset-repeat\",\n                ref: \"repeatInput\",\n                \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => (($setup.repeat) = $event)),\n                class: _normalizeClass([\"hh-input password-reset__input\", { 'hh-input--error': $setup.fieldErrors.repeat }]),\n                type: \"password\",\n                autocomplete: \"new-password\",\n                disabled: $setup.busy,\n                \"aria-invalid\": Boolean($setup.fieldErrors.repeat)\n              }, null, 10 /* CLASS, PROPS */, _hoisted_9), [\n                [_vModelText, $setup.repeat]\n              ])\n            ]),\n            _: 1 /* STABLE */\n          }, 8 /* PROPS */, [\"error\"]),\n          _createElementVNode(\"button\", {\n            type: \"submit\",\n            class: \"hh-btn hh-btn--primary password-reset__submit\",\n            disabled: $setup.busy,\n            \"aria-busy\": $setup.busy\n          }, _toDisplayString($setup.busy ? `${$setup.passwordAction}…` : $setup.passwordAction), 9 /* TEXT, PROPS */, _hoisted_10),\n          _createElementVNode(\"button\", {\n            type: \"button\",\n            class: \"password-reset__link\",\n            disabled: $setup.busy || $setup.cooldown > 0,\n            onClick: $setup.requestCode\n          }, _toDisplayString($setup.cooldown > 0 ? `Nieuwe code over ${$setup.cooldown} s` : \"Stuur een nieuwe code\"), 9 /* TEXT, PROPS */, _hoisted_11)\n        ], 32 /* NEED_HYDRATION */)),\n    _createElementVNode(\"button\", {\n      type: \"button\",\n      class: \"password-reset__link\",\n      disabled: $setup.busy,\n      onClick: _cache[4] || (_cache[4] = $event => ($setup.emit('done', { email: $setup.email })))\n    }, \"Terug naar inloggen\", 8 /* PROPS */, _hoisted_12)\n  ]))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/PasswordResetForm.vue?type=script\";import \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/PasswordResetForm.vue?type=style&index=0\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/PasswordResetForm.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/PasswordResetForm.vue\";script.__scopeId = \"data-v-5d77cc98\";export default script;","<template>\n  <div class=\"login\">\n    <div class=\"login__brand\">\n      <svg class=\"login__logo\" viewBox=\"0 0 32 32\" aria-hidden=\"true\">\n        <rect width=\"32\" height=\"32\" rx=\"7\" fill=\"currentColor\" />\n        <circle cx=\"16\" cy=\"16\" r=\"9\" fill=\"none\" stroke=\"var(--hh-accent-fg)\" stroke-width=\"2\" />\n        <path d=\"M16 10v6l4.5 2.5\" fill=\"none\" stroke=\"var(--hh-accent-fg)\" stroke-width=\"2\" stroke-linecap=\"round\" />\n      </svg>\n      <span class=\"login__wordmark\">Happy Hours</span>\n      <span class=\"login__tagline\">Urenregistratie &amp; facturatie</span>\n    </div>\n\n    <form\n      ref=\"loginForm\"\n      v-show=\"!resettingPassword\"\n      class=\"wh-wrdauth__loginform login-form\"\n      method=\"post\"\n      action=\"javascript:\"\n      @submit=\"onLoginSubmit\"\n    >\n      <h2 class=\"login-form__title\">Inloggen</h2>\n      <p class=\"login-form__subtitle\">Log in met je WebHare-account.</p>\n\n      <p v-if=\"errorMessage\" class=\"login-form__error\">{{ errorMessage }}</p>\n      <p v-if=\"successMessage\" class=\"login-form__success\" role=\"status\">{{ successMessage }}</p>\n\n      <label class=\"login-form__field\">\n        <span class=\"login-form__label\">E-mail</span>\n        <input\n          ref=\"loginEmailInput\"\n          v-model=\"email\"\n          name=\"login\"\n          type=\"email\"\n          required\n          autocomplete=\"email\"\n          class=\"login-form__input\"\n        />\n      </label>\n\n      <label class=\"login-form__field\">\n        <span class=\"login-form__label\">Wachtwoord</span>\n        <input\n          v-model=\"password\"\n          name=\"password\"\n          type=\"password\"\n          required\n          autocomplete=\"current-password\"\n          class=\"login-form__input\"\n        />\n      </label>\n\n      <!-- WRDAuth reads .checked, so persistence still needs a checkbox. -->\n      <input name=\"persistent\" type=\"checkbox\" checked hidden />\n\n      <button type=\"submit\" class=\"login-form__submit\" :disabled=\"loggingIn\" :aria-busy=\"loggingIn\">\n        {{ loggingIn ? \"Bezig met inloggen…\" : \"Inloggen\" }}\n      </button>\n      <button type=\"button\" class=\"login-form__forgot\" :disabled=\"loggingIn\" @click=\"openPasswordReset\">Wachtwoord vergeten?</button>\n    </form>\n    <section v-if=\"developmentLogins.length && !resettingPassword\" class=\"login-form login-form--development\" aria-label=\"Testlogins\">\n      <h2 class=\"login-form__development-title\">Testlogins</h2>\n      <p class=\"login-form__subtitle\">Alleen op deze ontwikkelomgeving.</p>\n      <button v-for=\"account in developmentLogins\" :key=\"account.key\" type=\"button\" class=\"hh-btn\"\n        :data-test-login=\"account.key\" :disabled=\"loggingIn\" @click=\"loginAs(account)\">\n        {{ account.label }}\n      </button>\n    </section>\n    <PasswordResetForm v-if=\"resettingPassword\" class=\"login-form\" :initial-email=\"email\" :first-password=\"props.initialReset\" @done=\"closePasswordReset\" />\n  </div>\n</template>\n\n<script setup lang=\"ts\">\n// Login-form. setupWRDAuth doet de echte auth op dezelfde submit (dus geen\n// preventDefault); dit component doet alleen busy-state + foutafhandeling via\n// het wh:wrdauth-loginfailed-event. Error eerst leegmaken en dan opnieuw zetten\n// zodat een herhaalde foute poging als \"nieuw\" leest.\nimport { nextTick, onBeforeUnmount, onMounted, ref, watch } from \"vue\";\nimport { rpc, type OmitRPCContextArgs } from \"@webhare/rpc\";\nimport { useRouter } from \"vue-router\";\nimport type { HappyAuthRPC } from \"@mod-happy/js/auth-rpc\";\nimport PasswordResetForm from \"./PasswordResetForm.vue\";\n\nconst props = withDefaults(defineProps<{ initialEmail?: string; initialReset?: boolean }>(), { initialEmail: \"\", initialReset: false });\nconst errorMessage = ref(\"\");\nconst successMessage = ref(\"\");\nconst resettingPassword = ref(props.initialReset);\nconst loginEmailInput = ref<HTMLInputElement | null>(null);\nconst loggingIn = ref(false);\nconst loginForm = ref<HTMLFormElement | null>(null);\nconst authApi = rpc<OmitRPCContextArgs<typeof HappyAuthRPC>>(\"happy:auth\");\nconst router = useRouter();\ntype DevelopmentLogin = Awaited<ReturnType<typeof authApi.getDevelopmentLogins>>[number];\nconst developmentLogins = ref<DevelopmentLogin[]>([]);\nconst MIN_LOGIN_BUSY_MS = 500;\nconst LOGIN_SAFETY_MS = 12000;\nlet loginSubmittedAt = 0;\nlet failTimer: number | null = null;\nlet safetyTimer: number | null = null;\n\nconst EMAIL_KEY = \"happy-login-email\";\nfunction readStoredEmail(): string {\n  try { return localStorage.getItem(EMAIL_KEY) ?? \"\"; } catch { return \"\"; }\n}\nconst email = ref(props.initialEmail || readStoredEmail());\nwatch(email, (value) => {\n  try { localStorage.setItem(EMAIL_KEY, value.trim()); } catch { /* ignore */ }\n});\n\nconst password = ref(\"\");\n\nasync function loadDevelopmentLogins(): Promise<void> {\n  const initialEmail = email.value;\n  try {\n    const accounts = await authApi.getDevelopmentLogins();\n    developmentLogins.value = accounts;\n    // A delayed response must not overwrite typing or an invitation's email.\n    if (accounts.length && !props.initialEmail && !resettingPassword.value && !loggingIn.value && email.value === initialEmail && !password.value) {\n      email.value = accounts[0].email;\n      password.value = accounts[0].password ?? \"\";\n    }\n  } catch {\n    // Optional development conveniences must never interrupt ordinary login.\n  }\n}\n\nasync function loginAs(account: DevelopmentLogin): Promise<void> {\n  if (loggingIn.value) return;\n  email.value = account.email;\n  password.value = account.password ?? \"\";\n  // This test scenario must show the chooser even when a previous administration was remembered.\n  if (account.key === \"admin\") await router.replace({ name: \"organisaties\" });\n  await nextTick();\n  loginForm.value?.requestSubmit();\n}\n\nfunction openPasswordReset(): void {\n  errorMessage.value = \"\";\n  successMessage.value = \"\";\n  resettingPassword.value = true;\n}\n\nfunction closePasswordReset(result: { email: string; changed?: boolean }): void {\n  email.value = result.email;\n  password.value = \"\";\n  successMessage.value = result.changed ? \"Je wachtwoord is gewijzigd. Log in met je nieuwe wachtwoord.\" : \"\";\n  resettingPassword.value = false;\n  void nextTick(() => loginEmailInput.value?.focus());\n}\n\nfunction clearTimers() {\n  if (failTimer !== null) { window.clearTimeout(failTimer); failTimer = null; }\n  if (safetyTimer !== null) { window.clearTimeout(safetyTimer); safetyTimer = null; }\n}\n\nfunction onLoginSubmit() {\n  clearTimers();\n  errorMessage.value = \"\";\n  successMessage.value = \"\";\n  loggingIn.value = true;\n  loginSubmittedAt = Date.now();\n  safetyTimer = window.setTimeout(() => {\n    safetyTimer = null;\n    if (!loggingIn.value) return;\n    loggingIn.value = false;\n    errorMessage.value = \"Inloggen duurt te lang. Controleer je verbinding en probeer het opnieuw.\";\n  }, LOGIN_SAFETY_MS);\n}\n\nfunction onLoginFailed(evt: Event) {\n  evt.preventDefault();\n  const detail = (evt as CustomEvent<{ message?: string }>).detail;\n  const message = detail?.message || \"Inloggen mislukt. Controleer je e-mail en wachtwoord.\";\n  const wait = Math.max(0, MIN_LOGIN_BUSY_MS - (Date.now() - loginSubmittedAt));\n  clearTimers();\n  failTimer = window.setTimeout(() => {\n    failTimer = null;\n    errorMessage.value = message;\n    loggingIn.value = false;\n  }, wait);\n}\n\nonMounted(() => {\n  window.addEventListener(\"wh:wrdauth-loginfailed\", onLoginFailed);\n  void loadDevelopmentLogins();\n});\nonBeforeUnmount(() => {\n  window.removeEventListener(\"wh:wrdauth-loginfailed\", onLoginFailed);\n  clearTimers();\n});\n</script>\n\n<style scoped>\n.login {\n  min-height: 100vh;\n  display: flex;\n  flex-direction: column;\n  align-items: stretch;\n  justify-content: center;\n  gap: 28px;\n  padding: 32px 20px;\n  width: 100%;\n  max-width: 420px;\n  margin: 0 auto;\n}\n.login__brand {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  gap: 6px;\n}\n.login__wordmark {\n  font-size: 26px;\n  font-weight: 700;\n  letter-spacing: -0.02em;\n  color: var(--hh-fg);\n}\n.login__logo { width: 64px; height: 64px; margin-bottom: 8px; color: var(--hh-accent); }\n.login__tagline {\n  font-size: 11px;\n  letter-spacing: 0.18em;\n  text-transform: uppercase;\n  color: var(--hh-fg-subtle);\n  font-weight: 600;\n}\n.login-form {\n  display: flex;\n  flex-direction: column;\n  gap: 14px;\n  padding: 24px 20px;\n  border: 1px solid var(--hh-line);\n  border-radius: var(--hh-radius-lg);\n  background: var(--hh-surface);\n  color: var(--hh-fg);\n  box-shadow: var(--hh-shadow);\n}\n.login-form__title { margin: 0; font-size: 22px; font-weight: 700; letter-spacing: -0.025em; }\n.login-form--development { border-style: dashed; background: var(--hh-surface-2); }\n.login-form__development-title { margin: 0; font-size: 16px; }\n.login-form__subtitle { margin: -4px 0 8px; font-size: 13.5px; color: var(--hh-fg-muted); }\n.login-form__error {\n  margin: 0;\n  padding: 10px 12px;\n  border: 1px solid rgba(199, 58, 52, 0.55);\n  border-radius: var(--hh-radius);\n  background: var(--hh-danger-soft);\n  color: var(--hh-danger);\n  font-size: 13px;\n}\n.login-form__field { display: flex; flex-direction: column; gap: 6px; }\n.login-form__label {\n  font-size: 11.5px; font-weight: 600; letter-spacing: 0.04em;\n  text-transform: uppercase; color: var(--hh-fg-muted);\n}\n.login-form__input {\n  height: 44px;\n  padding: 0 14px;\n  border: 1px solid var(--hh-line);\n  border-radius: 12px;\n  background: var(--hh-surface-2);\n  color: var(--hh-fg);\n  font-size: 15px;\n  outline: none;\n  transition: border-color 0.12s, box-shadow 0.12s;\n}\n.login-form__input:focus {\n  border-color: var(--hh-accent);\n  box-shadow: 0 0 0 3px var(--hh-accent-soft);\n}\n.login-form__success { margin: 0; color: var(--hh-accent-strong); font-size: 14px; }\n.login-form__forgot { align-self: center; min-height: 32px; padding: 4px 8px; border: 0; border-radius: var(--hh-radius); background: transparent; color: var(--hh-fg-muted); font-size: 14px; text-decoration: underline; text-underline-offset: 3px; cursor: pointer; }\n.login-form__forgot:focus-visible { outline: 2px solid var(--hh-accent); outline-offset: 2px; }\n.login-form__forgot:disabled { opacity: 0.6; cursor: not-allowed; }\n@media (hover: hover) { .login-form__forgot:hover:not(:disabled) { color: var(--hh-accent-strong); } }\n.login-form__submit {\n  height: 48px;\n  margin-top: 4px;\n  border: 0;\n  border-radius: 14px;\n  background: var(--hh-accent);\n  color: var(--hh-accent-fg);\n  font-size: 15px;\n  font-weight: 700;\n  cursor: pointer;\n  transition: transform 0.12s, background 0.12s, opacity 0.12s;\n}\n.login-form__submit:hover:not(:disabled) { transform: translateY(-1px); background: var(--hh-accent-strong); }\n.login-form__submit:disabled { opacity: 0.6; cursor: not-allowed; }\n</style>\n","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, toDisplayString as _toDisplayString, createCommentVNode as _createCommentVNode, vModelText as _vModelText, withDirectives as _withDirectives, vShow as _vShow, renderList as _renderList, Fragment as _Fragment, createBlock as _createBlock, createStaticVNode as _createStaticVNode } from \"vue\"\n\nconst _hoisted_1 = { class: \"login\" }\nconst _hoisted_2 = {\n  key: 0,\n  class: \"login-form__error\"\n}\nconst _hoisted_3 = {\n  key: 1,\n  class: \"login-form__success\",\n  role: \"status\"\n}\nconst _hoisted_4 = { class: \"login-form__field\" }\nconst _hoisted_5 = { class: \"login-form__field\" }\nconst _hoisted_6 = [\"disabled\", \"aria-busy\"]\nconst _hoisted_7 = [\"disabled\"]\nconst _hoisted_8 = {\n  key: 0,\n  class: \"login-form login-form--development\",\n  \"aria-label\": \"Testlogins\"\n}\nconst _hoisted_9 = [\"data-test-login\", \"disabled\", \"onClick\"]\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n    _cache[9] || (_cache[9] = _createStaticVNode(\"<div class=\\\"login__brand\\\" data-v-6ee5ba62><svg class=\\\"login__logo\\\" viewBox=\\\"0 0 32 32\\\" aria-hidden=\\\"true\\\" data-v-6ee5ba62><rect width=\\\"32\\\" height=\\\"32\\\" rx=\\\"7\\\" fill=\\\"currentColor\\\" data-v-6ee5ba62></rect><circle cx=\\\"16\\\" cy=\\\"16\\\" r=\\\"9\\\" fill=\\\"none\\\" stroke=\\\"var(--hh-accent-fg)\\\" stroke-width=\\\"2\\\" data-v-6ee5ba62></circle><path d=\\\"M16 10v6l4.5 2.5\\\" fill=\\\"none\\\" stroke=\\\"var(--hh-accent-fg)\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" data-v-6ee5ba62></path></svg><span class=\\\"login__wordmark\\\" data-v-6ee5ba62>Happy Hours</span><span class=\\\"login__tagline\\\" data-v-6ee5ba62>Urenregistratie &amp; facturatie</span></div>\", 1)),\n    _withDirectives(_createElementVNode(\"form\", {\n      ref: \"loginForm\",\n      class: \"wh-wrdauth__loginform login-form\",\n      method: \"post\",\n      action: \"javascript:\",\n      onSubmit: $setup.onLoginSubmit\n    }, [\n      _cache[4] || (_cache[4] = _createElementVNode(\"h2\", { class: \"login-form__title\" }, \"Inloggen\", -1 /* CACHED */)),\n      _cache[5] || (_cache[5] = _createElementVNode(\"p\", { class: \"login-form__subtitle\" }, \"Log in met je WebHare-account.\", -1 /* CACHED */)),\n      ($setup.errorMessage)\n        ? (_openBlock(), _createElementBlock(\"p\", _hoisted_2, _toDisplayString($setup.errorMessage), 1 /* TEXT */))\n        : _createCommentVNode(\"v-if\", true),\n      ($setup.successMessage)\n        ? (_openBlock(), _createElementBlock(\"p\", _hoisted_3, _toDisplayString($setup.successMessage), 1 /* TEXT */))\n        : _createCommentVNode(\"v-if\", true),\n      _createElementVNode(\"label\", _hoisted_4, [\n        _cache[2] || (_cache[2] = _createElementVNode(\"span\", { class: \"login-form__label\" }, \"E-mail\", -1 /* CACHED */)),\n        _withDirectives(_createElementVNode(\"input\", {\n          ref: \"loginEmailInput\",\n          \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => (($setup.email) = $event)),\n          name: \"login\",\n          type: \"email\",\n          required: \"\",\n          autocomplete: \"email\",\n          class: \"login-form__input\"\n        }, null, 512 /* NEED_PATCH */), [\n          [_vModelText, $setup.email]\n        ])\n      ]),\n      _createElementVNode(\"label\", _hoisted_5, [\n        _cache[3] || (_cache[3] = _createElementVNode(\"span\", { class: \"login-form__label\" }, \"Wachtwoord\", -1 /* CACHED */)),\n        _withDirectives(_createElementVNode(\"input\", {\n          \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => (($setup.password) = $event)),\n          name: \"password\",\n          type: \"password\",\n          required: \"\",\n          autocomplete: \"current-password\",\n          class: \"login-form__input\"\n        }, null, 512 /* NEED_PATCH */), [\n          [_vModelText, $setup.password]\n        ])\n      ]),\n      _createCommentVNode(\" WRDAuth reads .checked, so persistence still needs a checkbox. \"),\n      _cache[6] || (_cache[6] = _createElementVNode(\"input\", {\n        name: \"persistent\",\n        type: \"checkbox\",\n        checked: \"\",\n        hidden: \"\"\n      }, null, -1 /* CACHED */)),\n      _createElementVNode(\"button\", {\n        type: \"submit\",\n        class: \"login-form__submit\",\n        disabled: $setup.loggingIn,\n        \"aria-busy\": $setup.loggingIn\n      }, _toDisplayString($setup.loggingIn ? \"Bezig met inloggen…\" : \"Inloggen\"), 9 /* TEXT, PROPS */, _hoisted_6),\n      _createElementVNode(\"button\", {\n        type: \"button\",\n        class: \"login-form__forgot\",\n        disabled: $setup.loggingIn,\n        onClick: $setup.openPasswordReset\n      }, \"Wachtwoord vergeten?\", 8 /* PROPS */, _hoisted_7)\n    ], 544 /* NEED_HYDRATION, NEED_PATCH */), [\n      [_vShow, !$setup.resettingPassword]\n    ]),\n    ($setup.developmentLogins.length && !$setup.resettingPassword)\n      ? (_openBlock(), _createElementBlock(\"section\", _hoisted_8, [\n          _cache[7] || (_cache[7] = _createElementVNode(\"h2\", { class: \"login-form__development-title\" }, \"Testlogins\", -1 /* CACHED */)),\n          _cache[8] || (_cache[8] = _createElementVNode(\"p\", { class: \"login-form__subtitle\" }, \"Alleen op deze ontwikkelomgeving.\", -1 /* CACHED */)),\n          (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.developmentLogins, (account) => {\n            return (_openBlock(), _createElementBlock(\"button\", {\n              key: account.key,\n              type: \"button\",\n              class: \"hh-btn\",\n              \"data-test-login\": account.key,\n              disabled: $setup.loggingIn,\n              onClick: $event => ($setup.loginAs(account))\n            }, _toDisplayString(account.label), 9 /* TEXT, PROPS */, _hoisted_9))\n          }), 128 /* KEYED_FRAGMENT */))\n        ]))\n      : _createCommentVNode(\"v-if\", true),\n    ($setup.resettingPassword)\n      ? (_openBlock(), _createBlock($setup[\"PasswordResetForm\"], {\n          key: 1,\n          class: \"login-form\",\n          \"initial-email\": $setup.email,\n          \"first-password\": $setup.props.initialReset,\n          onDone: $setup.closePasswordReset\n        }, null, 8 /* PROPS */, [\"initial-email\", \"first-password\"]))\n      : _createCommentVNode(\"v-if\", true)\n  ]))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/LoginForm.vue?type=script\";import \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/LoginForm.vue?type=style&index=0\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/LoginForm.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/LoginForm.vue\";script.__scopeId = \"data-v-6ee5ba62\";export default script;","export const feedbackScriptAttributes = {\n  type: \"module\", src: \"/.wh/ea/ap/ww.feedback/ap.mjs\", \"data-ww-feedback\": \"happy-feedback\",\n  \"data-enabled\": \"off\", \"data-history\": \"off\", \"data-color\": \"var(--hh-accent)\",\n  \"data-color-text\": \"var(--hh-accent-fg)\", \"data-radius\": \"var(--hh-radius)\", \"data-font\": \"var(--hh-font)\",\n};\n\ntype FeedbackContext = {\n  siteRoot: string;\n  loggedIn: boolean;\n  account: { guid: string; name: string; email: string } | null;\n  organization: { tag: string; slug: string } | null;\n  route: { name: unknown; path: string; params: Record<string, unknown>; meta: { public?: unknown } };\n};\n\ndeclare global {\n  interface Window {\n    wwFeedback?: {\n      setEnabled(enabled: boolean): void;\n      setPageUrl(url: string | null): void;\n      setUser(user: { name?: string; email?: string } | null): void;\n      clearDrafts(): void;\n    };\n  }\n}\n\nexport function feedbackPageUrl(context: FeedbackContext): string | null {\n  const { route, organization } = context;\n  if (!context.loggedIn || !context.account || route.meta.public || typeof route.name !== \"string\"\n      || Object.keys(route.params).some(key => key !== \"organization\" && key !== \"id\")\n      || (route.params.id !== undefined && !/^\\d+$/.test(String(route.params.id))))\n    return null;\n  const path = route.path.split(/[?#]/)[0];\n  try {\n    if (route.name === \"organisaties\" || route.name === \"profiel\") {\n      if (path !== (route.name === \"organisaties\" ? \"/organisaties\" : \"/systeem/profiel\")) return null;\n    } else {\n      const segment = /^\\/o\\/([^/]+)(?:\\/|$)/.exec(path)?.[1];\n      if (!segment || !organization || route.params.organization !== organization.slug || decodeURIComponent(segment) !== organization.slug) return null;\n    }\n    // The publisher root is trusted; neither the outer query nor hash-route query enters the mail.\n    const url = new URL(context.siteRoot);\n    if (!/^https?:$/.test(url.protocol)) return null;\n    url.username = \"\";\n    url.password = \"\";\n    url.search = \"\";\n    url.hash = path;\n    return url.href;\n  } catch {\n    return null;\n  }\n}\n\nexport function mountFeedbackWidget(readContext: () => FeedbackContext): { update(): void; dispose(): void } {\n  let scope: string | undefined;\n  function update(): void {\n    const api = window.wwFeedback;\n    if (!api) return;\n    const context = readContext();\n    const nextScope = JSON.stringify(context.loggedIn && context.account ? [context.account.guid, context.organization?.tag ?? null] : null);\n    api.setEnabled(false);\n    if (nextScope !== scope) {\n      // Route drafts can survive navigation, but never an administration or account change.\n      api.clearDrafts();\n      scope = nextScope;\n    }\n    const pageUrl = feedbackPageUrl(context);\n    api.setPageUrl(pageUrl);\n    api.setUser(pageUrl && context.account ? { name: context.account.name, email: context.account.email } : null);\n    api.setEnabled(Boolean(pageUrl));\n  }\n  window.addEventListener(\"ww-feedback-ready\", update);\n  update();\n  if (!document.querySelector(\"script[data-ww-feedback]\")) {\n    const script = document.createElement(\"script\");\n    for (const [attribute, value] of Object.entries(feedbackScriptAttributes)) script.setAttribute(attribute, value);\n    document.body.append(script);\n  }\n  return {\n    update,\n    dispose() {\n      window.removeEventListener(\"ww-feedback-ready\", update);\n      window.wwFeedback?.setEnabled(false);\n      window.wwFeedback?.setPageUrl(null);\n      window.wwFeedback?.setUser(null);\n      window.wwFeedback?.clearDrafts();\n    },\n  };\n}\n","<script setup lang=\"ts\">\nimport { onBeforeUnmount, onMounted, watch } from \"vue\";\nimport { useRoute } from \"vue-router\";\nimport { getFrontendData } from \"../lib/runtime\";\nimport { organizationSession, organizationSlug } from \"../lib/organization\";\nimport { mountFeedbackWidget } from \"../lib/feedback-widget\";\n\nconst route = useRoute();\nconst siteRoot = getFrontendData(\"happy:app\").siteRoot;\nlet controller: ReturnType<typeof mountFeedbackWidget> | undefined;\n\nonMounted(() => {\n  controller = mountFeedbackWidget(() => ({\n    siteRoot, route, loggedIn: true,\n    account: organizationSession.account,\n    organization: organizationSession.organization && { tag: organizationSession.organization.tag, slug: organizationSlug(organizationSession.organization.tag) },\n  }));\n});\nwatch(() => [route.fullPath, organizationSession.account?.guid, organizationSession.account?.name,\n  organizationSession.account?.email, organizationSession.organization?.tag], () => controller?.update(), { flush: \"sync\" });\nonBeforeUnmount(() => controller?.dispose());\n</script>\n\n<template></template>\n","\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return null\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/FeedbackWidget.vue?type=script\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/FeedbackWidget.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/FeedbackWidget.vue\";export default script;","import type { RouteLocationRaw } from \"vue-router\";\n\n// De DOS-menuboom als navigatiemodel. Elke top heeft een unieke mnemonic-letter\n// (die ook in het label voorkomt en onderstreept wordt getoond).\n\nexport interface MenuItem {\n  label: string;\n  to?: RouteLocationRaw;      // route-navigatie\n  action?: () => void;        // of een directe actie (bv. een easter egg)\n}\n\nexport interface MenuTop {\n  id: string;\n  label: string;\n  mnemonic: string;   // letter, komt voor in het label\n  items: MenuItem[];\n}\n\nexport const menus: MenuTop[] = [\n  {\n    id: \"dashboard\",\n    label: \"Dashboard\",\n    mnemonic: \"D\",\n    items: [{ label: \"Dashboard\", to: { name: \"home\" } }],\n  },\n  {\n    id: \"uren\",\n    label: \"Urenmutaties\",\n    mnemonic: \"U\",\n    items: [\n      { label: \"Invoeren\", to: { name: \"uren-invoeren\" } },\n      { label: \"Overzicht\", to: { name: \"uren-overzicht\" } },\n      { label: \"Weekoverzicht\", to: { name: \"uren-week\" } },\n    ],\n  },\n  {\n    id: \"fakturen\",\n    label: \"Facturen\",\n    mnemonic: \"F\",\n    items: [\n      { label: \"Overzicht\", to: { name: \"fakturen\" } },\n    ],\n  },\n  {\n    id: \"klanten\",\n    label: \"Klanten\",\n    mnemonic: \"K\",\n    items: [\n      { label: \"Klantenlijst\", to: { name: \"klanten\" } },\n      { label: \"Declaratieoverzicht\", to: { name: \"klanten-declaraties\" } },\n      { label: \"Budgetoverzicht\", to: { name: \"klanten-budgetten\" } },\n    ],\n  },\n  {\n    id: \"werknemers\",\n    label: \"Werknemers\",\n    mnemonic: \"W\",\n    items: [\n      { label: \"Overzicht\", to: { name: \"werknemers\" } },\n    ],\n  },\n  {\n    id: \"werkzaamheden\",\n    label: \"Werkzaamheden\",\n    mnemonic: \"z\",   // \"WerkZaamheden\"\n    items: [\n      { label: \"Overzicht\", to: { name: \"werkzaamheden\" } },\n    ],\n  },\n  {\n    id: \"verschotten\",\n    label: \"Verschotten\",\n    mnemonic: \"V\",\n    items: [\n      { label: \"Overzicht\", to: { name: \"verschotten\" } },\n    ],\n  },\n  {\n    id: \"systeem\",\n    label: \"Instellingen\",\n    mnemonic: \"S\",\n    items: [{ label: \"Instellingen\", to: { name: \"instellingen\" } }],\n  },\n];\n\nexport const settingsMenus: MenuTop[] = [\n  { id: \"bedrijf\", label: \"Bedrijf\", mnemonic: \"B\", items: [{ label: \"Bedrijfsgegevens\", to: { name: \"instellingen-bedrijf\" } }] },\n  { id: \"fakturen\", label: \"Facturen\", mnemonic: \"F\", items: [\n    { label: \"Huisstijl\", to: { name: \"instellingen-huisstijl\" } },\n    { label: \"Voorkeuren\", to: { name: \"instellingen-facturen\" } },\n  ] },\n  { id: \"uren\", label: \"Uren\", mnemonic: \"U\", items: [{ label: \"Groepsomschrijvingen\", to: { name: \"instellingen-uren\" } }] },\n  { id: \"verschotten\", label: \"Verschotten\", mnemonic: \"V\", items: [{ label: \"Verschotsoorten\", to: { name: \"instellingen-verschotten\" } }] },\n  { id: \"gebruikers\", label: \"Gebruikers\", mnemonic: \"G\", items: [{ label: \"Gebruikers\", to: { name: \"instellingen-gebruikers\" } }] },\n];\n\nexport interface MnemonicParts {\n  before: string;\n  letter: string;\n  after: string;\n}\n\n/**\n * Splitst een label rond de eerste voorkomst van de mnemonic-letter, zodat die\n * onderstreept getoond kan worden. Komt de letter niet voor, dan is `before`\n * het hele label en zijn `letter`/`after` leeg.\n *\n * @param label - Het menulabel\n * @param mnemonic - De te onderstrepen letter\n */\nexport function mnemonicParts(label: string, mnemonic: string): MnemonicParts {\n  const index = label.toLowerCase().indexOf(mnemonic.toLowerCase());\n  if (index < 0) return { before: label, letter: \"\", after: \"\" };\n  return {\n    before: label.slice(0, index),\n    letter: label.slice(index, index + 1),\n    after: label.slice(index + 1),\n  };\n}\n\n/** Keep compact sidebar hints within the viewport and connected to their hover anchor. */\nexport function placeSidebarPopup({ anchor, popupHeight, viewportHeight, minTop, tooltip }: {\n  anchor: { top: number; right: number; height: number };\n  popupHeight: number;\n  viewportHeight: number;\n  minTop: number;\n  tooltip: boolean;\n}): { top: number; left: number } {\n  const top = anchor.top + (tooltip ? (anchor.height - popupHeight) / 2 : 0);\n  return {\n    top: Math.max(minTop, Math.min(top, viewportHeight - popupHeight - 16)),\n    // The transparent padding bridges the icon and panel without a hover gap.\n    left: anchor.right - 1,\n  };\n}\n","<script setup lang=\"ts\">\n// Keyboard-first sidebar (aria-menubar + roving tabindex). F10/Alt focuses it;\n// arrows, Enter and Escape navigate the vertical menu and its mnemonic letters.\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, watch } from \"vue\";\nimport { useRoute, useRouter, type RouteLocationRaw } from \"vue-router\";\nimport { organizationSession, organizationSlug } from \"../lib/organization\";\nimport { menus as mainMenus, settingsMenus, mnemonicParts, placeSidebarPopup, type MenuItem, type MenuTop } from \"../lib/menu\";\n\nconst props = defineProps<{ collapsed: boolean; mobileOpen: boolean }>();\nconst emit = defineEmits<{ toggleSidebar: []; navigate: []; closeMobile: []; openMobile: [] }>();\nconst router = useRouter();\nconst route = useRoute();\n\nconst bar = ref<HTMLElement | null>(null);\nconst backButton = ref<HTMLButtonElement | null>(null);\nconst settingsOpen = ref(false);\nconst menus = computed(() => organizationSession.organization?.role === \"bookkeeper\" ? mainMenus.filter(menu => menu.id !== \"systeem\") : settingsOpen.value ? settingsMenus : mainMenus);\nconst openIndex = ref<number | null>(null);\nconst tooltipIndex = ref<number | null>(null);\nconst focusedTop = ref(0);\nconst subFocus = ref<number | null>(null);\nconst popupTop = ref(72);\nconst popupLeft = ref(54);\nconst compact = computed(() => props.collapsed && !props.mobileOpen);\nconst toggleLabel = computed(() => props.mobileOpen ? \"Navigatie sluiten\" : props.collapsed ? \"Sidebar uitklappen\" : \"Sidebar inklappen\");\n\nconst topRefs: (HTMLButtonElement | null)[] = [];\nconst itemRefs: (HTMLButtonElement | null)[][] = [];\nconst popupRefs: (HTMLElement | null)[] = [];\nconst icons: Record<string, string> = {\n  dashboard: \"M3 3h7v7H3z M14 3h7v7h-7z M3 14h7v7H3z M14 14h7v7h-7z\",\n  uren: \"M12 8v4l3 2 M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0\",\n  fakturen: \"M6 3h9l4 4v14H6z M14 3v5h5 M9 12h7 M9 16h5\",\n  klanten: \"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2 M20 21v-2a4 4 0 0 0-3-3.9 M13 3.2a4 4 0 0 1 0 7.6 M13 7a4 4 0 1 1-8 0 4 4 0 0 1 8 0\",\n  werknemers: \"M20 21v-2a6 6 0 0 0-6-6h-4a6 6 0 0 0-6 6v2 M16 6a4 4 0 1 1-8 0 4 4 0 0 1 8 0\",\n  werkzaamheden: \"M8 6V4h8v2 M3 7h18v14H3z M3 12h18 M10 12v3h4v-3\",\n  verschotten: \"M5 3h14v18l-3-2-4 2-4-2-3 2z M9 8h6 M9 12h6 M9 16h3\",\n  systeem: \"M12 9a3 3 0 1 0 0 6 3 3 0 0 0 0-6 M9 3h6l1 3 3 1 2 5-2 5-3 1-1 3H9l-1-3-3-1-2-5 2-5 3-1z\",\n  bedrijf: \"M4 21V3h12v18 M16 9h4v12 M8 7h4 M8 11h4 M8 15h4 M9 21v-3h2v3 M2 21h20\",\n  profiel: \"M20 21v-2a6 6 0 0 0-6-6h-4a6 6 0 0 0-6 6v2 M16 6a4 4 0 1 1-8 0 4 4 0 0 1 8 0\",\n  gebruikers: \"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2 M20 21v-2a4 4 0 0 0-3-3.9 M13 3.2a4 4 0 0 1 0 7.6 M13 7a4 4 0 1 1-8 0 4 4 0 0 1 8 0\",\n};\n\nfunction setTopRef({ el, i }: { el: Element | { $el: Element } | null; i: number }): void {\n  topRefs[i] = (el as HTMLButtonElement | null) ?? null;\n}\nfunction setItemRef({ el, i, j }: { el: Element | { $el: Element } | null; i: number; j: number }): void {\n  (itemRefs[i] ??= [])[j] = (el as HTMLButtonElement | null) ?? null;\n}\nfunction setPopupRef({ el, i }: { el: Element | { $el: Element } | null; i: number }): void {\n  popupRefs[i] = el as HTMLElement | null;\n}\n\nfunction positionPopup(i: number): void {\n  const anchor = topRefs[i]?.getBoundingClientRect();\n  if (!anchor) return;\n  // Measure the full contents so a clipped menu can move up and reveal its items.\n  const popupHeight = (popupRefs[i]?.firstElementChild?.scrollHeight ?? 0) + 2;\n  const position = placeSidebarPopup({ anchor, popupHeight, viewportHeight: window.innerHeight,\n    minTop: (bar.value?.getBoundingClientRect().top ?? 64) + 8, tooltip: isSingle(i) });\n  popupTop.value = position.top;\n  popupLeft.value = position.left;\n}\n\nfunction parts(menu: MenuTop): [string, string, string] {\n  const p = mnemonicParts(menu.label, menu.mnemonic);\n  return [p.before, p.letter, p.after];\n}\n\nfunction menuDestination(to: RouteLocationRaw): RouteLocationRaw {\n  // Account pages have no organization URL parameter, so use the selected administration.\n  if (typeof to === \"string\" || !(\"name\" in to)) return to;\n  return { ...to, params: { organization: organizationSession.organization && organizationSlug(organizationSession.organization.tag), ...to.params } };\n}\n\nfunction isItemActive(item: MenuItem): boolean {\n  if (!item.to) return false;\n  const name = router.resolve(menuDestination(item.to)).name;\n  if (name === \"klanten\") return [\"klanten\", \"klanten-detail\", \"klanten-nieuw\"].includes(String(route.name));\n  return route.name === name || (typeof name === \"string\" && typeof route.name === \"string\" && route.name.startsWith(name + \"-\"));\n}\n\nconst isSettingsPage = computed(() => route.name === \"instellingen\" || settingsMenus.some(menu => menu.items.some(isItemActive)));\n\nwatch(settingsOpen, () => {\n  focusedTop.value = 0;\n  closeMenu({ returnFocus: false });\n}, { flush: \"sync\" });\nwatch(() => route.name, () => { settingsOpen.value = isSettingsPage.value; }, { immediate: true, flush: \"sync\" });\n\nconst activeMenuIndex = computed(() => menus.value.findIndex(menu => {\n  if (menu.id === \"systeem\" && isSettingsPage.value) return true;\n  // Payment reminders belong to invoices even though they have their own route.\n  if (menu.id === \"fakturen\" && String(route.name).startsWith(\"herinneringen-\")) return true;\n  return menu.items.some(isItemActive);\n}));\n\nwatch([() => route.name, () => props.collapsed, () => props.mobileOpen, settingsOpen], () => {\n  const index = activeMenuIndex.value;\n  tooltipIndex.value = null;\n  // Reveal the current page without opening a compact flyout or moving keyboard focus.\n  openIndex.value = index >= 0 && !isSingle(index) && (!props.collapsed || props.mobileOpen) ? index : null;\n}, { immediate: true });\n\n// Een menu met precies één subitem klapt niet uit maar activeert dat item direct\n// (klik/Enter/mnemonic gaan meteen naar de route).\nfunction isSingle(i: number): boolean {\n  return menus.value[i].items.length === 1;\n}\n\n// \"Betreed\" een topmenu: bij één item meteen activeren, anders het menu openen.\nfunction openOrActivate(i: number): void {\n  if (isSingle(i)) { focusedTop.value = i; activateItem({ i, j: 0 }); return; }\n  openMenuAt(i);\n}\n\nfunction focusTop(i: number): void {\n  focusedTop.value = i;\n  subFocus.value = null;\n  topRefs[i]?.focus();\n}\n\nfunction focusFirst(): void {\n  if (settingsOpen.value) backButton.value?.focus();\n  else focusTop(0);\n}\n\ndefineExpose({ focusFirst });\n\nfunction backToMain(): void {\n  // Switching navigation alone preserves the current form and its unsaved values.\n  settingsOpen.value = false;\n  void nextTick(() => focusTop(mainMenus.findIndex(menu => menu.id === \"systeem\")));\n}\n\nfunction focusItem({ i, j }: { i: number; j: number }): void {\n  subFocus.value = j;\n  itemRefs[i][j]?.focus();\n}\n\nfunction openMenuAt(i: number, { focusFirst = true }: { focusFirst?: boolean } = {}): void {\n  tooltipIndex.value = null;\n  focusedTop.value = i;\n  openIndex.value = i;\n  subFocus.value = null;\n  positionPopup(i);\n  void nextTick(() => positionPopup(i));\n  if (focusFirst) void nextTick(() => focusItem({ i, j: 0 }));\n}\n\nfunction closeMenu({ returnFocus = true }: { returnFocus?: boolean } = {}): void {\n  const top = focusedTop.value;\n  openIndex.value = null;\n  tooltipIndex.value = null;\n  subFocus.value = null;\n  if (returnFocus) void nextTick(() => focusTop(top));\n}\n\nfunction onTopClick(i: number): void {\n  if (isSingle(i)) { openOrActivate(i); return; }\n  // Parent activation selects its landing page; arrow keys can still browse without navigating.\n  activateItem({ i, j: 0 });\n  openMenuAt(i, { focusFirst: false });\n  focusTop(i);\n}\n\nfunction onTopHover(i: number): void {\n  if (!compact.value) return;\n  closeMenu({ returnFocus: false });\n  if (isSingle(i)) tooltipIndex.value = i;\n  else openIndex.value = i;\n  positionPopup(i);\n  void nextTick(() => positionPopup(i));\n}\n\nfunction onTopFocus(i: number): void {\n  focusedTop.value = i;\n  subFocus.value = null;\n  if (isSingle(i)) onTopHover(i);\n  else tooltipIndex.value = null;\n}\n\nfunction onMenuLeave(): void {\n  // Pointer movement must not remove the submenu item a keyboard user is on.\n  if (compact.value && subFocus.value === null) closeMenu({ returnFocus: false });\n}\n\nfunction onOverlayEscape(event: KeyboardEvent): void {\n  if (event.key !== \"Escape\" || !compact.value || (openIndex.value === null && tooltipIndex.value === null)) return;\n  event.preventDefault();\n  event.stopPropagation();\n  closeMenu({ returnFocus: subFocus.value !== null });\n}\n\nfunction activateItem({ i, j }: { i: number; j: number }): void {\n  const menu = menus.value[i];\n  const item = menu.items[j];\n  closeMenu({ returnFocus: false });\n  if (!settingsOpen.value && menu.id === \"systeem\") {\n    settingsOpen.value = true;\n    void nextTick(() => focusTop(0));\n  }\n  if (item.action) item.action();\n  else if (item.to) void router.push(menuDestination(item.to));\n  emit(\"navigate\");\n}\n\nfunction onKeydown(event: KeyboardEvent): void {\n  const count = menus.value.length;\n  const inSub = openIndex.value !== null && subFocus.value !== null;\n\n  switch (event.key) {\n    case \"Escape\":\n      if (props.mobileOpen) { event.preventDefault(); closeMenu({ returnFocus: false }); emit(\"closeMobile\"); }\n      else if (openIndex.value !== null || tooltipIndex.value !== null) { event.preventDefault(); closeMenu(); }\n      else if (settingsOpen.value) { event.preventDefault(); backToMain(); }\n      break;\n    case \"ArrowRight\":\n      event.preventDefault();\n      if (!isSingle(focusedTop.value)) openMenuAt(focusedTop.value);\n      else { closeMenu({ returnFocus: false }); focusTop((focusedTop.value + 1) % count); }\n      break;\n    case \"ArrowLeft\":\n      event.preventDefault();\n      if (openIndex.value !== null) closeMenu();\n      else if (settingsOpen.value) backToMain();\n      else focusTop((focusedTop.value - 1 + count) % count);\n      break;\n    case \"ArrowDown\":\n    case \"ArrowUp\": {\n      event.preventDefault();\n      const direction = event.key === \"ArrowDown\" ? 1 : -1;\n      if (inSub) {\n        const i = openIndex.value!;\n        const n = menus.value[i].items.length;\n        focusItem({ i, j: (subFocus.value! + direction + n) % n });\n      } else {\n        closeMenu({ returnFocus: false });\n        focusTop((focusedTop.value + direction + count) % count);\n      }\n      break;\n    }\n    case \"Enter\":\n    case \" \":\n      event.preventDefault();\n      if (inSub) activateItem({ i: openIndex.value!, j: subFocus.value! });\n      else onTopClick(focusedTop.value);\n      break;\n    case \"Home\":\n    case \"End\":\n      event.preventDefault();\n      if (inSub) focusItem({ i: openIndex.value!, j: event.key === \"Home\" ? 0 : menus.value[openIndex.value!].items.length - 1 });\n      else { closeMenu({ returnFocus: false }); focusTop(event.key === \"Home\" ? 0 : count - 1); }\n      break;\n    case \"Tab\":\n      closeMenu({ returnFocus: false });\n      break;\n    default:\n      if (event.key.length === 1 && !event.metaKey && !event.ctrlKey) {\n        const idx = menus.value.findIndex(menu => menu.mnemonic.toLowerCase() === event.key.toLowerCase());\n        if (idx >= 0) { event.preventDefault(); openOrActivate(idx); }\n      }\n  }\n  // Escape must not reach the current page's own back-navigation handler.\n  if (event.defaultPrevented) event.stopPropagation();\n}\n\nfunction runShortcut(action: () => void): void {\n  if (!window.matchMedia(\"(min-width: 900px)\").matches && !props.mobileOpen) emit(\"openMobile\");\n  void nextTick(action);\n}\n\n// Global keys retain the DOS shortcuts after moving navigation to the sidebar.\nfunction onGlobalKeydown(event: KeyboardEvent): void {\n  if (event.defaultPrevented) return;\n  if (event.key === \"F10\" && !event.shiftKey && !event.ctrlKey) {\n    event.preventDefault();\n    runShortcut(focusFirst);\n    return;\n  }\n  if (event.altKey && event.key.length === 1 && !event.metaKey && !event.ctrlKey) {\n    const idx = menus.value.findIndex(menu => menu.mnemonic.toLowerCase() === event.key.toLowerCase());\n    if (idx >= 0) { event.preventDefault(); runShortcut(() => openOrActivate(idx)); }\n    else if (settingsOpen.value) {\n      const mainIndex = mainMenus.findIndex(menu => menu.mnemonic.toLowerCase() === event.key.toLowerCase());\n      if (mainIndex >= 0) {\n        event.preventDefault();\n        runShortcut(() => {\n          settingsOpen.value = false;\n          void nextTick(() => openOrActivate(mainIndex));\n        });\n      }\n    }\n  }\n}\n\nfunction onGlobalPointerDown(event: MouseEvent): void {\n  if (openIndex.value === null && tooltipIndex.value === null) return;\n  if (bar.value && !bar.value.contains(event.target as Node)) closeMenu({ returnFocus: false });\n}\n\nonMounted(() => {\n  // Hover hints must dismiss before the page handles Escape, even when focus is elsewhere.\n  window.addEventListener(\"keydown\", onOverlayEscape, true);\n  window.addEventListener(\"keydown\", onGlobalKeydown);\n  window.addEventListener(\"mousedown\", onGlobalPointerDown);\n});\nonBeforeUnmount(() => {\n  window.removeEventListener(\"keydown\", onOverlayEscape, true);\n  window.removeEventListener(\"keydown\", onGlobalKeydown);\n  window.removeEventListener(\"mousedown\", onGlobalPointerDown);\n});\n</script>\n\n<template>\n  <div\n    id=\"happy-sidebar\"\n    ref=\"bar\"\n    class=\"sidebar\"\n    :class=\"{ 'sidebar--collapsed': collapsed, 'sidebar--mobile-open': mobileOpen, 'sidebar--settings': settingsOpen }\"\n  >\n    <div v-if=\"settingsOpen\" class=\"sidebar__context\">\n      <button\n        ref=\"backButton\" class=\"menubar-top\" type=\"button\" aria-label=\"Terug naar hoofdmenu\"\n        :title=\"compact ? 'Terug naar hoofdmenu' : undefined\" @click=\"backToMain\"\n        @keydown.down.prevent=\"focusTop(0)\" @keydown.esc=\"onKeydown\"\n      >\n        <svg class=\"menubar-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"m10 5-7 7 7 7 M3 12h18\" /></svg>\n        <span class=\"menubar-label\">Terug</span>\n      </button>\n      <h2 class=\"sidebar__title\">Instellingen</h2>\n    </div>\n    <nav :key=\"settingsOpen ? 'settings' : 'main'\" class=\"menubar sidebar__menus\" role=\"menubar\" :aria-label=\"settingsOpen ? 'Instellingen' : 'Hoofdmenu'\" aria-orientation=\"vertical\" @keydown=\"onKeydown\" @scroll=\"onMenuLeave\">\n      <div\n        v-for=\"(menu, i) in menus\"\n        :key=\"menu.id\"\n        class=\"menubar-item\"\n        @mouseenter=\"onTopHover(i)\"\n        @mouseleave=\"onMenuLeave\"\n      >\n        <button\n          :ref=\"(el) => setTopRef({ el, i })\"\n          class=\"menubar-top\"\n          :class=\"{ 'menubar-top--open': openIndex === i, 'menubar-top--active': activeMenuIndex === i }\"\n          type=\"button\"\n          role=\"menuitem\"\n          :aria-label=\"menu.label\"\n          :aria-haspopup=\"!isSingle(i) ? 'menu' : undefined\"\n          :aria-expanded=\"isSingle(i) ? undefined : openIndex === i\"\n          :aria-controls=\"isSingle(i) ? undefined : 'sidebar-menu-' + menu.id\"\n          :aria-current=\"isSingle(i) && activeMenuIndex === i ? 'page' : undefined\"\n          :aria-describedby=\"tooltipIndex === i ? 'sidebar-tooltip-' + menu.id : undefined\"\n          :tabindex=\"focusedTop === i ? 0 : -1\"\n          @click=\"onTopClick(i)\"\n          @focus=\"onTopFocus(i)\"\n          @blur=\"tooltipIndex = null\"\n        >\n          <svg class=\"menubar-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path :d=\"icons[menu.id]\" /></svg>\n          <span class=\"menubar-label\">{{ parts(menu)[0]\n            }}<u v-if=\"parts(menu)[1]\" class=\"menubar-mnem\">{{ parts(menu)[1] }}</u>{{ parts(menu)[2] }}</span>\n          <svg v-if=\"!isSingle(i)\" class=\"menubar-chevron\" :class=\"{ 'menubar-chevron--open': openIndex === i }\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" aria-hidden=\"true\"><path d=\"m6 4 4 4-4 4\" /></svg>\n        </button>\n\n        <div\n          v-if=\"(openIndex === i && !isSingle(i)) || tooltipIndex === i\"\n          :ref=\"(el) => setPopupRef({ el, i })\"\n          class=\"menubar-popup\"\n          :style=\"{ '--hh-menu-top': popupTop + 'px', '--hh-menu-left': popupLeft + 'px' }\"\n        >\n          <span v-if=\"tooltipIndex === i\" :id=\"'sidebar-tooltip-' + menu.id\" class=\"menubar-tooltip\" role=\"tooltip\">{{ menu.label }}</span>\n          <ul v-else :id=\"'sidebar-menu-' + menu.id\" class=\"menubar-dropdown\" role=\"menu\" :aria-label=\"menu.label\">\n            <li class=\"menubar-dropdown__title\" role=\"presentation\">{{ menu.label }}</li>\n            <li v-for=\"(item, j) in menu.items\" :key=\"j\" role=\"none\">\n              <button\n                :ref=\"(el) => setItemRef({ el, i, j })\"\n                class=\"menubar-link\"\n                :class=\"{ 'menubar-link--active': isItemActive(item) }\"\n                type=\"button\"\n                role=\"menuitem\"\n                :aria-current=\"isItemActive(item) ? 'page' : undefined\"\n                tabindex=\"-1\"\n                @click=\"activateItem({ i, j })\"\n                @focus=\"focusedTop = i; subFocus = j\"\n              >\n                {{ item.label }}\n              </button>\n            </li>\n          </ul>\n        </div>\n      </div>\n    </nav>\n    <div class=\"sidebar__footer\">\n      <button\n        class=\"menubar-top sidebar__toggle\" type=\"button\" :aria-label=\"toggleLabel\" :title=\"toggleLabel\"\n        :aria-expanded=\"mobileOpen || !collapsed\" @click=\"emit('toggleSidebar')\" @keydown.esc=\"onKeydown\"\n      >\n        <svg class=\"menubar-icon sidebar__toggle-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M5 4v16m11-13-5 5 5 5m-5-5h10\" /></svg>\n        <span class=\"menubar-label\">{{ mobileOpen ? \"Sluiten\" : collapsed ? \"Uitklappen\" : \"Inklappen\" }}</span>\n      </button>\n    </div>\n  </div>\n</template>\n\n<style scoped>\n.sidebar {\n  position: fixed;\n  top: var(--hh-header-height, 64px);\n  bottom: 0;\n  left: 0;\n  z-index: 30;\n  display: none;\n  flex: none;\n  flex-direction: column;\n  gap: 4px;\n  width: min(280px, calc(100vw - 32px));\n  padding: 18px 12px 14px;\n  border-right: 1px solid var(--hh-line);\n  background: var(--hh-surface);\n}\n.sidebar--mobile-open {\n  display: flex;\n  box-shadow: var(--hh-shadow);\n}\n.sidebar__menus {\n  display: flex;\n  flex: 1;\n  min-height: 0;\n  flex-direction: column;\n  gap: 4px;\n  overflow-y: auto;\n}\n.sidebar__footer { flex: none; padding-top: 12px; }\n.sidebar__context { flex: none; }\n.sidebar__title {\n  margin: 12px 12px 8px;\n  color: var(--hh-fg-muted);\n  font-size: 14px;\n  font-weight: 600;\n}\n.menubar-item {\n  position: relative;\n  flex: none;\n}\n.menubar-top {\n  display: flex;\n  align-items: center;\n  gap: 12px;\n  width: 100%;\n  min-height: 42px;\n  padding: 10px 12px;\n  border: 1px solid transparent;\n  border-radius: var(--hh-radius);\n  background: transparent;\n  color: var(--hh-fg-muted);\n  font-family: var(--hh-font);\n  font-size: 13.5px;\n  font-weight: 500;\n  text-align: left;\n  cursor: pointer;\n}\n.menubar-icon {\n  flex: none;\n  width: 20px;\n  height: 20px;\n}\n.menubar-label {\n  flex: 1;\n}\n.menubar-chevron {\n  flex: none;\n  width: 14px;\n  height: 14px;\n}\n.menubar-chevron--open {\n  transform: rotate(90deg);\n}\n.menubar-top--open {\n  background: var(--hh-surface-2);\n  color: var(--hh-fg);\n}\n.menubar-top--active {\n  background: var(--hh-accent-soft);\n  color: var(--hh-accent-strong);\n  font-weight: 650;\n  box-shadow: inset 3px 0 0 var(--hh-accent);\n}\n.menubar-mnem {\n  text-decoration: underline;\n  text-underline-offset: 2px;\n}\n.menubar-dropdown {\n  margin: 4px 0 8px 22px;\n  padding: 0 0 0 12px;\n  list-style: none;\n  border-left: 1px solid var(--hh-line-strong);\n}\n.menubar-dropdown__title { display: none; }\n.menubar-tooltip {\n  display: block;\n  padding: 8px 12px;\n  border-radius: 10px;\n  background: var(--hh-fg);\n  color: var(--hh-surface);\n  font-size: 13.5px;\n  line-height: 20px;\n  white-space: nowrap;\n}\n.menubar-link {\n  display: block;\n  width: 100%;\n  min-height: 38px;\n  padding: 8px 12px;\n  border: 0;\n  border-radius: var(--hh-radius);\n  background: transparent;\n  color: var(--hh-fg-muted);\n  font-family: var(--hh-font);\n  font-size: 13px;\n  text-align: left;\n  cursor: pointer;\n}\n.menubar-link--active {\n  color: var(--hh-accent-strong);\n  font-weight: 650;\n  background: var(--hh-accent-soft);\n}\n.menubar-top:focus-visible,\n.menubar-link:focus-visible {\n  outline: 2px solid var(--hh-accent);\n  outline-offset: -2px;\n}\n@media (hover: hover) {\n  .menubar-top:hover,\n  .menubar-link:hover {\n    background: var(--hh-surface-2);\n    color: var(--hh-fg);\n  }\n}\n@media (min-width: 900px) {\n  .sidebar {\n    position: sticky;\n    top: var(--hh-header-height, 64px);\n    bottom: auto;\n    z-index: 30;\n    display: flex;\n    width: 232px;\n    height: calc(100dvh - var(--hh-header-height, 64px));\n    box-shadow: none;\n  }\n  .sidebar--collapsed {\n    width: 64px;\n    padding-right: 8px;\n    padding-left: 8px;\n  }\n  .sidebar--collapsed .menubar-top {\n    justify-content: center;\n    padding: 10px;\n  }\n  .sidebar--collapsed .menubar-label,\n  .sidebar--collapsed .menubar-chevron,\n  .sidebar--collapsed .sidebar__title {\n    display: none;\n  }\n  .sidebar--collapsed .sidebar__toggle-icon { transform: rotate(180deg); }\n  .sidebar--collapsed .menubar-top--open {\n    background: var(--hh-accent-strong);\n    color: #fff;\n    box-shadow: none;\n  }\n  .sidebar--collapsed .menubar-popup {\n    position: fixed;\n    top: var(--hh-menu-top);\n    left: var(--hh-menu-left);\n    z-index: 85;\n    padding-left: 12px;\n  }\n  .sidebar--collapsed .menubar-dropdown {\n    min-width: 230px;\n    max-height: calc(100dvh - var(--hh-menu-top) - 16px);\n    margin: 0;\n    padding: 12px;\n    overflow-y: auto;\n    border: 1px solid var(--hh-accent-strong);\n    border-radius: 14px;\n    background: var(--hh-accent-strong);\n    box-shadow: var(--hh-shadow);\n  }\n  .sidebar--collapsed .menubar-dropdown__title {\n    display: block;\n    padding: 4px 12px 10px;\n    color: #fff;\n    font-size: 13px;\n    font-weight: 600;\n  }\n  .sidebar--collapsed .menubar-link { color: #fff; }\n  .sidebar--collapsed .menubar-link--active,\n  .sidebar--collapsed .menubar-link:hover { background: rgb(255 255 255 / 16%); }\n  .sidebar--collapsed .menubar-link:focus-visible { outline-color: #fff; }\n}\n</style>\n","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, withModifiers as _withModifiers, withKeys as _withKeys, createCommentVNode as _createCommentVNode, renderList as _renderList, Fragment as _Fragment, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, normalizeClass as _normalizeClass, normalizeStyle as _normalizeStyle } from \"vue\"\n\nconst _hoisted_1 = {\n  key: 0,\n  class: \"sidebar__context\"\n}\nconst _hoisted_2 = [\"title\"]\nconst _hoisted_3 = [\"aria-label\"]\nconst _hoisted_4 = [\"onMouseenter\"]\nconst _hoisted_5 = [\"aria-label\", \"aria-haspopup\", \"aria-expanded\", \"aria-controls\", \"aria-current\", \"aria-describedby\", \"tabindex\", \"onClick\", \"onFocus\"]\nconst _hoisted_6 = {\n  class: \"menubar-icon\",\n  viewBox: \"0 0 24 24\",\n  fill: \"none\",\n  stroke: \"currentColor\",\n  \"stroke-width\": \"1.6\",\n  \"stroke-linecap\": \"round\",\n  \"stroke-linejoin\": \"round\",\n  \"aria-hidden\": \"true\"\n}\nconst _hoisted_7 = [\"d\"]\nconst _hoisted_8 = { class: \"menubar-label\" }\nconst _hoisted_9 = {\n  key: 0,\n  class: \"menubar-mnem\"\n}\nconst _hoisted_10 = [\"id\"]\nconst _hoisted_11 = [\"id\", \"aria-label\"]\nconst _hoisted_12 = {\n  class: \"menubar-dropdown__title\",\n  role: \"presentation\"\n}\nconst _hoisted_13 = [\"aria-current\", \"onClick\", \"onFocus\"]\nconst _hoisted_14 = { class: \"sidebar__footer\" }\nconst _hoisted_15 = [\"aria-label\", \"title\", \"aria-expanded\"]\nconst _hoisted_16 = { class: \"menubar-label\" }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return (_openBlock(), _createElementBlock(\"div\", {\n    id: \"happy-sidebar\",\n    ref: \"bar\",\n    class: _normalizeClass([\"sidebar\", { 'sidebar--collapsed': $props.collapsed, 'sidebar--mobile-open': $props.mobileOpen, 'sidebar--settings': $setup.settingsOpen }])\n  }, [\n    ($setup.settingsOpen)\n      ? (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n          _createElementVNode(\"button\", {\n            ref: \"backButton\",\n            class: \"menubar-top\",\n            type: \"button\",\n            \"aria-label\": \"Terug naar hoofdmenu\",\n            title: $setup.compact ? 'Terug naar hoofdmenu' : undefined,\n            onClick: $setup.backToMain,\n            onKeydown: [\n              _cache[0] || (_cache[0] = _withKeys(_withModifiers($event => ($setup.focusTop(0)), [\"prevent\"]), [\"down\"])),\n              _withKeys($setup.onKeydown, [\"esc\"])\n            ]\n          }, _cache[3] || (_cache[3] = [\n            _createElementVNode(\"svg\", {\n              class: \"menubar-icon\",\n              viewBox: \"0 0 24 24\",\n              fill: \"none\",\n              stroke: \"currentColor\",\n              \"stroke-width\": \"1.6\",\n              \"stroke-linecap\": \"round\",\n              \"stroke-linejoin\": \"round\",\n              \"aria-hidden\": \"true\"\n            }, [\n              _createElementVNode(\"path\", { d: \"m10 5-7 7 7 7 M3 12h18\" })\n            ], -1 /* CACHED */),\n            _createElementVNode(\"span\", { class: \"menubar-label\" }, \"Terug\", -1 /* CACHED */)\n          ]), 40 /* PROPS, NEED_HYDRATION */, _hoisted_2),\n          _cache[4] || (_cache[4] = _createElementVNode(\"h2\", { class: \"sidebar__title\" }, \"Instellingen\", -1 /* CACHED */))\n        ]))\n      : _createCommentVNode(\"v-if\", true),\n    (_openBlock(), _createElementBlock(\"nav\", {\n      key: $setup.settingsOpen ? 'settings' : 'main',\n      class: \"menubar sidebar__menus\",\n      role: \"menubar\",\n      \"aria-label\": $setup.settingsOpen ? 'Instellingen' : 'Hoofdmenu',\n      \"aria-orientation\": \"vertical\",\n      onKeydown: $setup.onKeydown,\n      onScroll: $setup.onMenuLeave\n    }, [\n      (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.menus, (menu, i) => {\n        return (_openBlock(), _createElementBlock(\"div\", {\n          key: menu.id,\n          class: \"menubar-item\",\n          onMouseenter: $event => ($setup.onTopHover(i)),\n          onMouseleave: $setup.onMenuLeave\n        }, [\n          _createElementVNode(\"button\", {\n            ref_for: true,\n            ref: (el) => $setup.setTopRef({ el, i }),\n            class: _normalizeClass([\"menubar-top\", { 'menubar-top--open': $setup.openIndex === i, 'menubar-top--active': $setup.activeMenuIndex === i }]),\n            type: \"button\",\n            role: \"menuitem\",\n            \"aria-label\": menu.label,\n            \"aria-haspopup\": !$setup.isSingle(i) ? 'menu' : undefined,\n            \"aria-expanded\": $setup.isSingle(i) ? undefined : $setup.openIndex === i,\n            \"aria-controls\": $setup.isSingle(i) ? undefined : 'sidebar-menu-' + menu.id,\n            \"aria-current\": $setup.isSingle(i) && $setup.activeMenuIndex === i ? 'page' : undefined,\n            \"aria-describedby\": $setup.tooltipIndex === i ? 'sidebar-tooltip-' + menu.id : undefined,\n            tabindex: $setup.focusedTop === i ? 0 : -1,\n            onClick: $event => ($setup.onTopClick(i)),\n            onFocus: $event => ($setup.onTopFocus(i)),\n            onBlur: _cache[1] || (_cache[1] = $event => ($setup.tooltipIndex = null))\n          }, [\n            (_openBlock(), _createElementBlock(\"svg\", _hoisted_6, [\n              _createElementVNode(\"path\", {\n                d: $setup.icons[menu.id]\n              }, null, 8 /* PROPS */, _hoisted_7)\n            ])),\n            _createElementVNode(\"span\", _hoisted_8, [\n              _createTextVNode(_toDisplayString($setup.parts(menu)[0]), 1 /* TEXT */),\n              ($setup.parts(menu)[1])\n                ? (_openBlock(), _createElementBlock(\"u\", _hoisted_9, _toDisplayString($setup.parts(menu)[1]), 1 /* TEXT */))\n                : _createCommentVNode(\"v-if\", true),\n              _createTextVNode(_toDisplayString($setup.parts(menu)[2]), 1 /* TEXT */)\n            ]),\n            (!$setup.isSingle(i))\n              ? (_openBlock(), _createElementBlock(\"svg\", {\n                  key: 0,\n                  class: _normalizeClass([\"menubar-chevron\", { 'menubar-chevron--open': $setup.openIndex === i }]),\n                  viewBox: \"0 0 16 16\",\n                  fill: \"none\",\n                  stroke: \"currentColor\",\n                  \"stroke-width\": \"1.5\",\n                  \"aria-hidden\": \"true\"\n                }, _cache[5] || (_cache[5] = [\n                  _createElementVNode(\"path\", { d: \"m6 4 4 4-4 4\" }, null, -1 /* CACHED */)\n                ]), 2 /* CLASS */))\n              : _createCommentVNode(\"v-if\", true)\n          ], 42 /* CLASS, PROPS, NEED_HYDRATION */, _hoisted_5),\n          (($setup.openIndex === i && !$setup.isSingle(i)) || $setup.tooltipIndex === i)\n            ? (_openBlock(), _createElementBlock(\"div\", {\n                key: 0,\n                ref_for: true,\n                ref: (el) => $setup.setPopupRef({ el, i }),\n                class: \"menubar-popup\",\n                style: _normalizeStyle({ '--hh-menu-top': $setup.popupTop + 'px', '--hh-menu-left': $setup.popupLeft + 'px' })\n              }, [\n                ($setup.tooltipIndex === i)\n                  ? (_openBlock(), _createElementBlock(\"span\", {\n                      key: 0,\n                      id: 'sidebar-tooltip-' + menu.id,\n                      class: \"menubar-tooltip\",\n                      role: \"tooltip\"\n                    }, _toDisplayString(menu.label), 9 /* TEXT, PROPS */, _hoisted_10))\n                  : (_openBlock(), _createElementBlock(\"ul\", {\n                      key: 1,\n                      id: 'sidebar-menu-' + menu.id,\n                      class: \"menubar-dropdown\",\n                      role: \"menu\",\n                      \"aria-label\": menu.label\n                    }, [\n                      _createElementVNode(\"li\", _hoisted_12, _toDisplayString(menu.label), 1 /* TEXT */),\n                      (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(menu.items, (item, j) => {\n                        return (_openBlock(), _createElementBlock(\"li\", {\n                          key: j,\n                          role: \"none\"\n                        }, [\n                          _createElementVNode(\"button\", {\n                            ref_for: true,\n                            ref: (el) => $setup.setItemRef({ el, i, j }),\n                            class: _normalizeClass([\"menubar-link\", { 'menubar-link--active': $setup.isItemActive(item) }]),\n                            type: \"button\",\n                            role: \"menuitem\",\n                            \"aria-current\": $setup.isItemActive(item) ? 'page' : undefined,\n                            tabindex: \"-1\",\n                            onClick: $event => ($setup.activateItem({ i, j })),\n                            onFocus: $event => {$setup.focusedTop = i; $setup.subFocus = j}\n                          }, _toDisplayString(item.label), 43 /* TEXT, CLASS, PROPS, NEED_HYDRATION */, _hoisted_13)\n                        ]))\n                      }), 128 /* KEYED_FRAGMENT */))\n                    ], 8 /* PROPS */, _hoisted_11))\n              ], 4 /* STYLE */))\n            : _createCommentVNode(\"v-if\", true)\n        ], 40 /* PROPS, NEED_HYDRATION */, _hoisted_4))\n      }), 128 /* KEYED_FRAGMENT */))\n    ], 40 /* PROPS, NEED_HYDRATION */, _hoisted_3)),\n    _createElementVNode(\"div\", _hoisted_14, [\n      _createElementVNode(\"button\", {\n        class: \"menubar-top sidebar__toggle\",\n        type: \"button\",\n        \"aria-label\": $setup.toggleLabel,\n        title: $setup.toggleLabel,\n        \"aria-expanded\": $props.mobileOpen || !$props.collapsed,\n        onClick: _cache[2] || (_cache[2] = $event => ($setup.emit('toggleSidebar'))),\n        onKeydown: _withKeys($setup.onKeydown, [\"esc\"])\n      }, [\n        _cache[6] || (_cache[6] = _createElementVNode(\"svg\", {\n          class: \"menubar-icon sidebar__toggle-icon\",\n          viewBox: \"0 0 24 24\",\n          fill: \"none\",\n          stroke: \"currentColor\",\n          \"stroke-width\": \"1.6\",\n          \"stroke-linecap\": \"round\",\n          \"stroke-linejoin\": \"round\",\n          \"aria-hidden\": \"true\"\n        }, [\n          _createElementVNode(\"path\", { d: \"M5 4v16m11-13-5 5 5 5m-5-5h10\" })\n        ], -1 /* CACHED */)),\n        _createElementVNode(\"span\", _hoisted_16, _toDisplayString($props.mobileOpen ? \"Sluiten\" : $props.collapsed ? \"Uitklappen\" : \"Inklappen\"), 1 /* TEXT */)\n      ], 40 /* PROPS, NEED_HYDRATION */, _hoisted_15)\n    ])\n  ], 2 /* CLASS */))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/MenuBar.vue?type=script\";import \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/MenuBar.vue?type=style&index=0\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/MenuBar.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/MenuBar.vue\";script.__scopeId = \"data-v-573724c4\";export default script;","<script setup lang=\"ts\">\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, watch } from \"vue\";\nimport { RouterLink, useRoute } from \"vue-router\";\nimport { organizationSession, clearOrganizationSession, organizationSlug } from \"../lib/organization\";\nimport { logout } from \"../lib/runtime\";\n\nconst props = withDefaults(defineProps<{ mobileOpen?: boolean; mobile?: boolean }>(), {\n  mobileOpen: false, mobile: false,\n});\nconst emit = defineEmits<{\n  toggleSidebar: [];\n  shortcuts: [];\n  about: [];\n}>();\nconst route = useRoute();\nconst root = ref<HTMLElement | null>(null);\nconst menu = ref<HTMLElement | null>(null);\nconst sidebarButton = ref<HTMLButtonElement | null>(null);\nconst profileButton = ref<HTMLButtonElement | null>(null);\nconst organizationButton = ref<HTMLButtonElement | null>(null);\nconst popup = ref<\"organization\" | \"profile\" | null>(null);\nconst account = computed(() => organizationSession.account ?? { name: \"\", email: \"\" });\nconst organizationName = computed(() => organizationSession.organization?.title || organizationSession.organization?.tag || \"\");\n\nconst initials = computed(() => (account.value.name || account.value.email || \"?\").trim().split(/\\s+/).slice(0, 2).map(part => part[0]).join(\"\").toUpperCase());\nconst toggleLabel = computed(() => props.mobileOpen ? \"Navigatie sluiten\" : \"Navigatie openen\");\n\nfunction togglePopup(value: \"organization\" | \"profile\"): void {\n  popup.value = popup.value === value ? null : value;\n}\n\nfunction closePopup(options: { restoreFocus?: boolean } = {}): void {\n  const previous = popup.value;\n  popup.value = null;\n  if (options.restoreFocus) void nextTick(() => {\n    (previous === \"profile\" ? profileButton.value : organizationButton.value)?.focus();\n  });\n}\n\nfunction onPopupKeydown(event: KeyboardEvent): void {\n  if (event.key === \"Escape\" && popup.value) {\n    event.preventDefault();\n    event.stopPropagation();\n    closePopup({ restoreFocus: true });\n    return;\n  }\n  if (![\"ArrowDown\", \"ArrowUp\", \"Home\", \"End\"].includes(event.key) || popup.value !== \"profile\") return;\n  const items = [...(menu.value?.querySelectorAll<HTMLElement>(\"a[href], button\") ?? [])];\n  if (!items.length) return;\n  event.preventDefault();\n  const index = items.indexOf(document.activeElement as HTMLElement);\n  const next = event.key === \"Home\" ? 0 : event.key === \"End\" ? items.length - 1\n    : (index + (event.key === \"ArrowUp\" ? -1 : 1) + items.length) % items.length;\n  items[next]?.focus();\n}\n\nfunction onPointerDown(event: PointerEvent): void {\n  if (!root.value?.contains(event.target as Node)) closePopup();\n}\n\nfunction onFocusOut(event: FocusEvent): void {\n  if (event.relatedTarget && !root.value?.contains(event.relatedTarget as Node)) closePopup();\n}\n\nfunction openShortcuts(): void {\n  closePopup();\n  emit(\"shortcuts\");\n}\n\nfunction openAbout(): void {\n  // The dialog must restore focus to a button that survives closing the profile menu.\n  profileButton.value?.focus();\n  closePopup();\n  emit(\"about\");\n}\n\nfunction onLogout(): void {\n  closePopup();\n  clearOrganizationSession();\n  logout();\n}\n\nwatch(() => route.fullPath, () => { closePopup(); });\nonMounted(() => {\n  window.addEventListener(\"pointerdown\", onPointerDown);\n});\nonBeforeUnmount(() => {\n  window.removeEventListener(\"pointerdown\", onPointerDown);\n});\ndefineExpose({ focusToggle: () => sidebarButton.value?.focus() });\n</script>\n\n<template>\n  <div ref=\"root\" class=\"app-header\" @keydown=\"onPopupKeydown\" @focusout=\"onFocusOut\">\n    <button\n      v-if=\"mobile\"\n      ref=\"sidebarButton\" class=\"app-header__toggle\" type=\"button\" :aria-label=\"toggleLabel\" :title=\"toggleLabel\"\n      :aria-expanded=\"mobileOpen\" aria-controls=\"happy-sidebar\" @click=\"emit('toggleSidebar')\"\n    >\n      <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"16\" rx=\"2\" /><path d=\"M9 4v16M13 8h5M13 12h5M13 16h5\" /></svg>\n    </button>\n    <RouterLink class=\"app-header__brand\" :to=\"organizationSession.organization ? { name: 'home', params: { organization: organizationSlug(organizationSession.organization.tag) } } : { name: 'organisaties' }\" aria-label=\"Happy Hours dashboard\">\n      <span class=\"app-header__mark\" aria-hidden=\"true\">HH</span><span class=\"app-header__wordmark\">Happy Hours</span>\n    </RouterLink>\n\n    <div class=\"app-header__disclosure app-header__organization\">\n      <button\n        ref=\"organizationButton\" class=\"app-header__trigger\" type=\"button\" aria-label=\"Administratie\"\n        :aria-expanded=\"popup === 'organization'\" aria-controls=\"happy-organization\" @click=\"togglePopup('organization')\"\n      >\n        <span class=\"app-header__organization-name\">{{ organizationName || \"Administratie\" }}</span><span class=\"app-header__chevron\" aria-hidden=\"true\">⌄</span>\n      </button>\n      <section v-if=\"popup === 'organization'\" id=\"happy-organization\" class=\"app-header__popup\" aria-label=\"Huidige administratie\">\n        <p class=\"app-header__caption\">Huidige administratie</p>\n        <!-- Only the server-filtered list can offer an administration. -->\n        <RouterLink v-for=\"organization in organizationSession.account?.organizations ?? []\" :key=\"organization.tag\"\n          class=\"app-header__link\" :to=\"{ name: 'home', params: { organization: organizationSlug(organization.tag) } }\" @click=\"closePopup()\">\n          <span>{{ organization.title || organization.tag }}<small> · {{ organization.role === \"admin\" ? \"Beheerder\" : \"Boekhouder\" }}</small></span>\n          <span v-if=\"organization.tag === organizationSession.organization?.tag\" aria-label=\"Geselecteerd\">✓</span>\n        </RouterLink>\n      </section>\n    </div>\n\n    <div class=\"app-header__disclosure app-header__account\">\n      <button\n        ref=\"profileButton\" class=\"app-header__trigger\" type=\"button\" aria-label=\"Gebruikersaccount\"\n        :aria-expanded=\"popup === 'profile'\" aria-controls=\"happy-profile\" @click=\"togglePopup('profile')\"\n      >\n        <span class=\"app-header__avatar\" aria-hidden=\"true\">{{ initials }}</span>\n        <span class=\"app-header__username\">{{ account.name || \"Mijn account\" }}</span><span class=\"app-header__chevron\" aria-hidden=\"true\">⌄</span>\n      </button>\n      <nav v-if=\"popup === 'profile'\" id=\"happy-profile\" ref=\"menu\" class=\"app-header__popup app-header__popup--profile\" aria-label=\"Accountnavigatie\">\n        <div class=\"app-header__identity\"><strong>{{ account.name || \"Mijn account\" }}</strong><span>{{ account.email }}</span></div>\n        <RouterLink class=\"app-header__link\" :to=\"{ name: 'profiel' }\" @click=\"closePopup()\">Mijn profiel</RouterLink>\n        <button class=\"app-header__link\" type=\"button\" @click=\"openShortcuts\">Sneltoetsen <span class=\"app-header__key\">?</span></button>\n        <button class=\"app-header__link\" type=\"button\" @click=\"openAbout\">Over Happy Hours</button>\n        <button class=\"app-header__link app-header__link--logout\" type=\"button\" @click=\"onLogout\">Uitloggen</button>\n      </nav>\n    </div>\n  </div>\n</template>\n\n<style scoped>\n.app-header { position: relative; display: flex; align-items: center; gap: 12px; min-height: 64px; padding: 10px 16px; width: 100%; }\n.app-header__toggle, .app-header__trigger { display: flex; align-items: center; justify-content: center; gap: 10px; min-height: 38px; border: 1px solid var(--hh-line); border-radius: var(--hh-radius); background: var(--hh-surface); color: var(--hh-fg); cursor: pointer; font: inherit; }\n.app-header__toggle { flex: none; width: 38px; padding: 8px; }\n.app-header__toggle svg { width: 20px; height: 20px; fill: none; stroke: currentColor; stroke-width: 1.6; stroke-linecap: round; stroke-linejoin: round; }\n.app-header__brand { display: flex; align-items: center; gap: 10px; color: var(--hh-fg); text-decoration: none; white-space: nowrap; cursor: pointer; }\n.app-header__mark { display: grid; place-items: center; width: 32px; height: 32px; border-radius: 7px; background: var(--hh-accent); color: white; font: 700 13px var(--hh-mono); letter-spacing: -2px; padding-right: 2px; }\n.app-header__wordmark { display: none; font-size: 16px; font-weight: 700; letter-spacing: -0.03em; }\n.app-header__disclosure { position: relative; min-width: 0; }\n.app-header__organization { position: static; max-width: 280px; }\n.app-header__trigger { width: 100%; padding: 5px 10px; }\n.app-header__organization-name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.app-header__chevron { flex: none; color: var(--hh-fg-muted); }\n.app-header__account { margin-left: auto; flex: none; }\n.app-header__avatar { display: grid; place-items: center; flex: none; width: 26px; height: 26px; border-radius: 50%; color: var(--hh-accent-strong); background: var(--hh-accent-soft); font-size: 11px; font-weight: 700; }\n.app-header__username { display: none; }\n.app-header__popup { position: absolute; top: calc(100% + 8px); left: 0; z-index: 50; width: 280px; max-width: calc(100vw - 32px); padding: 6px; border: 1px solid var(--hh-line-strong); border-radius: var(--hh-radius); background: var(--hh-surface); box-shadow: 0 8px 24px rgba(28, 33, 27, 0.12); }\n.app-header__popup--profile { left: auto; right: 0; }\n.app-header__organization .app-header__popup { left: 16px; }\n.app-header__caption { margin: 7px 10px; color: var(--hh-fg-muted); font-size: 12px; }\n.app-header__current { display: flex; justify-content: space-between; gap: 12px; margin: 0; padding: 10px; border-radius: 5px; background: var(--hh-accent-soft); color: var(--hh-accent-strong); }\n.app-header__identity { display: flex; flex-direction: column; gap: 3px; padding: 10px; margin-bottom: 4px; border-bottom: 1px solid var(--hh-line); overflow-wrap: anywhere; }\n.app-header__identity span { color: var(--hh-fg-muted); font-size: 12px; }\n.app-header__link { display: flex; align-items: center; justify-content: space-between; width: 100%; padding: 9px 10px; border: 0; border-radius: 5px; background: transparent; color: var(--hh-fg); text-align: left; text-decoration: none; font: inherit; cursor: pointer; }\n.app-header__link--logout { margin-top: 4px; border-top: 1px solid var(--hh-line); border-radius: 0 0 5px 5px; }\n.app-header__key { color: var(--hh-fg-muted); font-family: var(--hh-mono); }\n@media (hover: hover) { .app-header__toggle:hover, .app-header__trigger:hover, .app-header__link:hover { background: var(--hh-surface-2); } }\n@media (min-width: 600px) { .app-header { gap: 16px; padding-inline: 24px; } .app-header__wordmark { display: inline; } .app-header__organization { position: relative; } .app-header__organization .app-header__popup { left: 0; } .app-header__username { display: inline; max-width: 180px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } }\n@media (min-width: 900px) { .app-header { padding-left: 16px; } }\n</style>\n","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, withCtx as _withCtx, createVNode as _createVNode, toDisplayString as _toDisplayString, renderList as _renderList, Fragment as _Fragment, createTextVNode as _createTextVNode, createBlock as _createBlock } from \"vue\"\n\nconst _hoisted_1 = [\"aria-label\", \"title\", \"aria-expanded\"]\nconst _hoisted_2 = { class: \"app-header__disclosure app-header__organization\" }\nconst _hoisted_3 = [\"aria-expanded\"]\nconst _hoisted_4 = { class: \"app-header__organization-name\" }\nconst _hoisted_5 = {\n  key: 0,\n  id: \"happy-organization\",\n  class: \"app-header__popup\",\n  \"aria-label\": \"Huidige administratie\"\n}\nconst _hoisted_6 = {\n  key: 0,\n  \"aria-label\": \"Geselecteerd\"\n}\nconst _hoisted_7 = { class: \"app-header__disclosure app-header__account\" }\nconst _hoisted_8 = [\"aria-expanded\"]\nconst _hoisted_9 = {\n  class: \"app-header__avatar\",\n  \"aria-hidden\": \"true\"\n}\nconst _hoisted_10 = { class: \"app-header__username\" }\nconst _hoisted_11 = {\n  key: 0,\n  id: \"happy-profile\",\n  ref: \"menu\",\n  class: \"app-header__popup app-header__popup--profile\",\n  \"aria-label\": \"Accountnavigatie\"\n}\nconst _hoisted_12 = { class: \"app-header__identity\" }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return (_openBlock(), _createElementBlock(\"div\", {\n    ref: \"root\",\n    class: \"app-header\",\n    onKeydown: $setup.onPopupKeydown,\n    onFocusout: $setup.onFocusOut\n  }, [\n    ($props.mobile)\n      ? (_openBlock(), _createElementBlock(\"button\", {\n          key: 0,\n          ref: \"sidebarButton\",\n          class: \"app-header__toggle\",\n          type: \"button\",\n          \"aria-label\": $setup.toggleLabel,\n          title: $setup.toggleLabel,\n          \"aria-expanded\": $props.mobileOpen,\n          \"aria-controls\": \"happy-sidebar\",\n          onClick: _cache[0] || (_cache[0] = $event => ($setup.emit('toggleSidebar')))\n        }, _cache[5] || (_cache[5] = [\n          _createElementVNode(\"svg\", {\n            viewBox: \"0 0 24 24\",\n            \"aria-hidden\": \"true\"\n          }, [\n            _createElementVNode(\"rect\", {\n              x: \"3\",\n              y: \"4\",\n              width: \"18\",\n              height: \"16\",\n              rx: \"2\"\n            }),\n            _createElementVNode(\"path\", { d: \"M9 4v16M13 8h5M13 12h5M13 16h5\" })\n          ], -1 /* CACHED */)\n        ]), 8 /* PROPS */, _hoisted_1))\n      : _createCommentVNode(\"v-if\", true),\n    _createVNode($setup[\"RouterLink\"], {\n      class: \"app-header__brand\",\n      to: $setup.organizationSession.organization ? { name: 'home', params: { organization: $setup.organizationSlug($setup.organizationSession.organization.tag) } } : { name: 'organisaties' },\n      \"aria-label\": \"Happy Hours dashboard\"\n    }, {\n      default: _withCtx(() => _cache[6] || (_cache[6] = [\n        _createElementVNode(\"span\", {\n          class: \"app-header__mark\",\n          \"aria-hidden\": \"true\"\n        }, \"HH\", -1 /* CACHED */),\n        _createElementVNode(\"span\", { class: \"app-header__wordmark\" }, \"Happy Hours\", -1 /* CACHED */)\n      ])),\n      _: 1 /* STABLE */,\n      __: [6]\n    }, 8 /* PROPS */, [\"to\"]),\n    _createElementVNode(\"div\", _hoisted_2, [\n      _createElementVNode(\"button\", {\n        ref: \"organizationButton\",\n        class: \"app-header__trigger\",\n        type: \"button\",\n        \"aria-label\": \"Administratie\",\n        \"aria-expanded\": $setup.popup === 'organization',\n        \"aria-controls\": \"happy-organization\",\n        onClick: _cache[1] || (_cache[1] = $event => ($setup.togglePopup('organization')))\n      }, [\n        _createElementVNode(\"span\", _hoisted_4, _toDisplayString($setup.organizationName || \"Administratie\"), 1 /* TEXT */),\n        _cache[7] || (_cache[7] = _createElementVNode(\"span\", {\n          class: \"app-header__chevron\",\n          \"aria-hidden\": \"true\"\n        }, \"⌄\", -1 /* CACHED */))\n      ], 8 /* PROPS */, _hoisted_3),\n      ($setup.popup === 'organization')\n        ? (_openBlock(), _createElementBlock(\"section\", _hoisted_5, [\n            _cache[8] || (_cache[8] = _createElementVNode(\"p\", { class: \"app-header__caption\" }, \"Huidige administratie\", -1 /* CACHED */)),\n            _createCommentVNode(\" Only the server-filtered list can offer an administration. \"),\n            (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.organizationSession.account?.organizations ?? [], (organization) => {\n              return (_openBlock(), _createBlock($setup[\"RouterLink\"], {\n                key: organization.tag,\n                class: \"app-header__link\",\n                to: { name: 'home', params: { organization: $setup.organizationSlug(organization.tag) } },\n                onClick: _cache[2] || (_cache[2] = $event => ($setup.closePopup()))\n              }, {\n                default: _withCtx(() => [\n                  _createElementVNode(\"span\", null, [\n                    _createTextVNode(_toDisplayString(organization.title || organization.tag), 1 /* TEXT */),\n                    _createElementVNode(\"small\", null, \" · \" + _toDisplayString(organization.role === \"admin\" ? \"Beheerder\" : \"Boekhouder\"), 1 /* TEXT */)\n                  ]),\n                  (organization.tag === $setup.organizationSession.organization?.tag)\n                    ? (_openBlock(), _createElementBlock(\"span\", _hoisted_6, \"✓\"))\n                    : _createCommentVNode(\"v-if\", true)\n                ]),\n                _: 2 /* DYNAMIC */\n              }, 1032 /* PROPS, DYNAMIC_SLOTS */, [\"to\"]))\n            }), 128 /* KEYED_FRAGMENT */))\n          ]))\n        : _createCommentVNode(\"v-if\", true)\n    ]),\n    _createElementVNode(\"div\", _hoisted_7, [\n      _createElementVNode(\"button\", {\n        ref: \"profileButton\",\n        class: \"app-header__trigger\",\n        type: \"button\",\n        \"aria-label\": \"Gebruikersaccount\",\n        \"aria-expanded\": $setup.popup === 'profile',\n        \"aria-controls\": \"happy-profile\",\n        onClick: _cache[3] || (_cache[3] = $event => ($setup.togglePopup('profile')))\n      }, [\n        _createElementVNode(\"span\", _hoisted_9, _toDisplayString($setup.initials), 1 /* TEXT */),\n        _createElementVNode(\"span\", _hoisted_10, _toDisplayString($setup.account.name || \"Mijn account\"), 1 /* TEXT */),\n        _cache[9] || (_cache[9] = _createElementVNode(\"span\", {\n          class: \"app-header__chevron\",\n          \"aria-hidden\": \"true\"\n        }, \"⌄\", -1 /* CACHED */))\n      ], 8 /* PROPS */, _hoisted_8),\n      ($setup.popup === 'profile')\n        ? (_openBlock(), _createElementBlock(\"nav\", _hoisted_11, [\n            _createElementVNode(\"div\", _hoisted_12, [\n              _createElementVNode(\"strong\", null, _toDisplayString($setup.account.name || \"Mijn account\"), 1 /* TEXT */),\n              _createElementVNode(\"span\", null, _toDisplayString($setup.account.email), 1 /* TEXT */)\n            ]),\n            _createVNode($setup[\"RouterLink\"], {\n              class: \"app-header__link\",\n              to: { name: 'profiel' },\n              onClick: _cache[4] || (_cache[4] = $event => ($setup.closePopup()))\n            }, {\n              default: _withCtx(() => _cache[10] || (_cache[10] = [\n                _createTextVNode(\"Mijn profiel\", -1 /* CACHED */)\n              ])),\n              _: 1 /* STABLE */,\n              __: [10]\n            }),\n            _createElementVNode(\"button\", {\n              class: \"app-header__link\",\n              type: \"button\",\n              onClick: $setup.openShortcuts\n            }, _cache[11] || (_cache[11] = [\n              _createTextVNode(\"Sneltoetsen \", -1 /* CACHED */),\n              _createElementVNode(\"span\", { class: \"app-header__key\" }, \"?\", -1 /* CACHED */)\n            ])),\n            _createElementVNode(\"button\", {\n              class: \"app-header__link\",\n              type: \"button\",\n              onClick: $setup.openAbout\n            }, \"Over Happy Hours\"),\n            _createElementVNode(\"button\", {\n              class: \"app-header__link app-header__link--logout\",\n              type: \"button\",\n              onClick: $setup.onLogout\n            }, \"Uitloggen\")\n          ], 512 /* NEED_PATCH */))\n        : _createCommentVNode(\"v-if\", true)\n    ])\n  ], 544 /* NEED_HYDRATION, NEED_PATCH */))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/AppHeader.vue?type=script\";import \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/AppHeader.vue?type=style&index=0\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/AppHeader.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/AppHeader.vue\";script.__scopeId = \"data-v-09fc96cb\";export default script;","<template>\n  <div class=\"boot\" role=\"dialog\" aria-label=\"Opstarten\" @click=\"finish\">\n    <div class=\"boot__screen\">\n      <pre class=\"boot__logo\">HAPPY HOURS</pre>\n      <p class=\"boot__line\">het programma is aan het opstarten, ogenblikje AUB )=-<span class=\"boot__cursor\">_</span></p>\n      <p class=\"boot__hint\">(druk op een toets om over te slaan)</p>\n    </div>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { onBeforeUnmount, onMounted } from \"vue\";\n\nconst emit = defineEmits<{ done: [] }>();\n\nlet timer: number | null = null;\nlet finished = false;\n\nfunction finish(): void {\n  if (finished) return;\n  finished = true;\n  if (timer !== null) window.clearTimeout(timer);\n  window.removeEventListener(\"keydown\", onKey);\n  emit(\"done\");\n}\n\nfunction onKey(): void {\n  finish();\n}\n\nonMounted(() => {\n  window.addEventListener(\"keydown\", onKey);\n  timer = window.setTimeout(finish, 2200);\n});\nonBeforeUnmount(() => {\n  if (timer !== null) window.clearTimeout(timer);\n  window.removeEventListener(\"keydown\", onKey);\n});\n</script>\n\n<style scoped>\n.boot {\n  position: fixed;\n  inset: 0;\n  z-index: 200;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  background: #0b120c;\n  cursor: pointer;\n}\n.boot__screen {\n  max-width: 620px;\n  padding: 32px 40px;\n  font-family: var(--hh-mono);\n  color: #6ee787;\n  text-align: center;\n  text-shadow: 0 0 8px rgba(110, 231, 135, 0.35);\n}\n.boot__logo {\n  margin: 0 0 22px;\n  font-size: 30px;\n  font-weight: 700;\n  letter-spacing: 0.18em;\n}\n.boot__line {\n  margin: 0;\n  font-size: 15px;\n  letter-spacing: 0.02em;\n}\n.boot__cursor {\n  animation: boot-blink 1s steps(1) infinite;\n}\n.boot__hint {\n  margin: 26px 0 0;\n  font-size: 12px;\n  color: rgba(110, 231, 135, 0.5);\n}\n@keyframes boot-blink {\n  50% { opacity: 0; }\n}\n</style>\n","import { createElementVNode as _createElementVNode, createTextVNode as _createTextVNode, createStaticVNode as _createStaticVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return (_openBlock(), _createElementBlock(\"div\", {\n    class: \"boot\",\n    role: \"dialog\",\n    \"aria-label\": \"Opstarten\",\n    onClick: $setup.finish\n  }, _cache[0] || (_cache[0] = [\n    _createStaticVNode(\"<div class=\\\"boot__screen\\\" data-v-45690c37><pre class=\\\"boot__logo\\\" data-v-45690c37>HAPPY HOURS</pre><p class=\\\"boot__line\\\" data-v-45690c37>het programma is aan het opstarten, ogenblikje AUB )=-<span class=\\\"boot__cursor\\\" data-v-45690c37>_</span></p><p class=\\\"boot__hint\\\" data-v-45690c37>(druk op een toets om over te slaan)</p></div>\", 1)\n  ])))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/BootSplash.vue?type=script\";import \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/BootSplash.vue?type=style&index=0\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/BootSplash.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/BootSplash.vue\";script.__scopeId = \"data-v-45690c37\";export default script;","<template>\n  <Teleport to=\"body\">\n    <div class=\"dialog-backdrop\" @mousedown.self=\"onBackdrop\">\n      <div\n        ref=\"panel\"\n        class=\"dialog\"\n        :class=\"{ 'dialog--wide': wide }\"\n        role=\"dialog\"\n        aria-modal=\"true\"\n        :aria-label=\"title\"\n        @keydown=\"onKeydown\"\n      >\n        <header v-if=\"title || $slots.header\" class=\"dialog__head\">\n          <slot name=\"header\"><h2 class=\"dialog__title\">{{ title }}</h2></slot>\n        </header>\n        <div class=\"dialog__body\">\n          <slot />\n        </div>\n        <footer v-if=\"$slots.footer\" class=\"dialog__foot\">\n          <slot name=\"footer\" />\n        </footer>\n      </div>\n    </div>\n  </Teleport>\n</template>\n\n<script setup lang=\"ts\">\n// Modale dialoog, toetsenbord-first: focus-trap (Tab cyclet binnen het paneel),\n// Esc sluit, initiële focus op [data-autofocus] of het eerste veld, en focus\n// keert terug naar het vorige element bij sluiten. De ouder rendert dit met\n// v-if en bezit zelf de eventuele <form> (zodat Enter een submit oplevert).\nimport { onBeforeUnmount, onMounted, ref } from \"vue\";\n\nwithDefaults(defineProps<{ title?: string; wide?: boolean }>(), { title: \"\", wide: false });\nconst emit = defineEmits<{ close: [] }>();\n\nconst panel = ref<HTMLElement | null>(null);\nlet previouslyFocused: HTMLElement | null = null;\n\nfunction focusables(): HTMLElement[] {\n  if (!panel.value) return [];\n  const selector = 'a[href], button:not([disabled]), input:not([disabled]):not([type=\"hidden\"]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n  return [...panel.value.querySelectorAll<HTMLElement>(selector)].filter((el) => el.offsetParent !== null || el === document.activeElement);\n}\n\nfunction onBackdrop(): void {\n  emit(\"close\");\n}\n\nfunction onKeydown(event: KeyboardEvent): void {\n  if (event.key === \"Escape\") {\n    event.preventDefault();\n    event.stopPropagation();\n    emit(\"close\");\n    return;\n  }\n  if (event.key === \"Tab\") {\n    const items = focusables();\n    if (items.length === 0) return;\n    const first = items[0];\n    const last = items[items.length - 1];\n    const active = document.activeElement as HTMLElement | null;\n    if (event.shiftKey && active === first) {\n      event.preventDefault();\n      last.focus();\n    } else if (!event.shiftKey && active === last) {\n      event.preventDefault();\n      first.focus();\n    }\n  }\n}\n\nonMounted(() => {\n  previouslyFocused = document.activeElement as HTMLElement | null;\n  const target = panel.value?.querySelector<HTMLElement>(\"[data-autofocus]\") ?? focusables()[0];\n  target?.focus();\n  if (target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement) target.select();\n});\n\nonBeforeUnmount(() => {\n  previouslyFocused?.focus();\n});\n</script>\n\n<style scoped>\n.dialog-backdrop {\n  position: fixed;\n  inset: 0;\n  z-index: 100;\n  display: flex;\n  align-items: flex-start;\n  justify-content: center;\n  padding: 8vh 16px 16px;\n  background: rgba(28, 33, 27, 0.32);\n}\n.dialog {\n  width: 100%;\n  max-width: 460px;\n  max-height: 84vh;\n  display: flex;\n  flex-direction: column;\n  border: 1px solid var(--hh-line-strong);\n  border-radius: var(--hh-radius-lg);\n  background: var(--hh-surface);\n  box-shadow: 0 12px 40px rgba(28, 33, 27, 0.24);\n}\n.dialog--wide {\n  max-width: 680px;\n}\n.dialog__head {\n  padding: 16px 20px 0;\n}\n.dialog__title {\n  margin: 0;\n  font-size: 17px;\n  font-weight: 700;\n  letter-spacing: -0.01em;\n}\n.dialog__body {\n  padding: 14px 20px;\n  overflow-y: auto;\n}\n.dialog__foot {\n  display: flex;\n  justify-content: flex-end;\n  gap: 8px;\n  padding: 14px 20px;\n  border-top: 1px solid var(--hh-line);\n  background: var(--hh-surface-2);\n  border-radius: 0 0 var(--hh-radius-lg) var(--hh-radius-lg);\n}\n</style>\n","import { renderSlot as _renderSlot, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, normalizeClass as _normalizeClass, withModifiers as _withModifiers, Teleport as _Teleport, createBlock as _createBlock } from \"vue\"\n\nconst _hoisted_1 = [\"aria-label\"]\nconst _hoisted_2 = {\n  key: 0,\n  class: \"dialog__head\"\n}\nconst _hoisted_3 = { class: \"dialog__title\" }\nconst _hoisted_4 = { class: \"dialog__body\" }\nconst _hoisted_5 = {\n  key: 1,\n  class: \"dialog__foot\"\n}\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return (_openBlock(), _createBlock(_Teleport, { to: \"body\" }, [\n    _createElementVNode(\"div\", {\n      class: \"dialog-backdrop\",\n      onMousedown: _withModifiers($setup.onBackdrop, [\"self\"])\n    }, [\n      _createElementVNode(\"div\", {\n        ref: \"panel\",\n        class: _normalizeClass([\"dialog\", { 'dialog--wide': $props.wide }]),\n        role: \"dialog\",\n        \"aria-modal\": \"true\",\n        \"aria-label\": $props.title,\n        onKeydown: $setup.onKeydown\n      }, [\n        ($props.title || _ctx.$slots.header)\n          ? (_openBlock(), _createElementBlock(\"header\", _hoisted_2, [\n              _renderSlot(_ctx.$slots, \"header\", {}, () => [\n                _createElementVNode(\"h2\", _hoisted_3, _toDisplayString($props.title), 1 /* TEXT */)\n              ], true)\n            ]))\n          : _createCommentVNode(\"v-if\", true),\n        _createElementVNode(\"div\", _hoisted_4, [\n          _renderSlot(_ctx.$slots, \"default\", {}, undefined, true)\n        ]),\n        (_ctx.$slots.footer)\n          ? (_openBlock(), _createElementBlock(\"footer\", _hoisted_5, [\n              _renderSlot(_ctx.$slots, \"footer\", {}, undefined, true)\n            ]))\n          : _createCommentVNode(\"v-if\", true)\n      ], 42 /* CLASS, PROPS, NEED_HYDRATION */, _hoisted_1)\n    ], 32 /* NEED_HYDRATION */)\n  ]))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/AppDialog.vue?type=script\";import \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/AppDialog.vue?type=style&index=0\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/AppDialog.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/AppDialog.vue\";script.__scopeId = \"data-v-e4ce5c13\";export default script;","<template>\n  <AppDialog title=\"Sneltoetsen\" wide @close=\"emit('close')\">\n    <div class=\"sc\">\n      <section v-for=\"group in groups\" :key=\"group.title\" class=\"sc__group\">\n        <h3 class=\"sc__gtitle\">{{ group.title }}</h3>\n        <dl class=\"sc__list\">\n          <div v-for=\"(row, i) in group.rows\" :key=\"i\" class=\"sc__row\">\n            <dt class=\"sc__keys\">\n              <kbd v-for=\"(k, ki) in row.keys\" :key=\"ki\">{{ k }}</kbd>\n            </dt>\n            <dd class=\"sc__desc\">{{ row.desc }}</dd>\n          </div>\n        </dl>\n      </section>\n    </div>\n    <template #footer>\n      <button class=\"hh-btn hh-btn--primary\" type=\"button\" data-autofocus @click=\"emit('close')\">Sluiten</button>\n    </template>\n  </AppDialog>\n</template>\n\n<script setup lang=\"ts\">\nimport AppDialog from \"./AppDialog.vue\";\n\nconst emit = defineEmits<{ close: [] }>();\n\ninterface Row { keys: string[]; desc: string }\ninterface Group { title: string; rows: Row[] }\n\nconst groups: Group[] = [\n  {\n    title: \"Navigatie\",\n    rows: [\n      { keys: [\"F10\"], desc: \"Zijbalk focussen\" },\n      { keys: [\"Alt\", \"letter\"], desc: \"Menu openen via de onderstreepte letter\" },\n      { keys: [\"↑\", \"↓\"], desc: \"Door de menu-items\" },\n      { keys: [\"→\"], desc: \"Submenu openen\" },\n      { keys: [\"←\"], desc: \"Submenu sluiten / terug naar het hoofdmenu\" },\n      { keys: [\"Enter\"], desc: \"Item activeren\" },\n      { keys: [\"Esc\"], desc: \"Menu sluiten / terug\" },\n    ],\n  },\n  {\n    title: \"Lijsten (klanten, werknemers, werkzaamheden)\",\n    rows: [\n      { keys: [\"/\"], desc: \"Naar het zoekveld\" },\n      { keys: [\"n\"], desc: \"Nieuw item\" },\n      { keys: [\"↑\", \"↓\"], desc: \"Door de rijen\" },\n      { keys: [\"Enter\"], desc: \"Rij openen\" },\n    ],\n  },\n  {\n    title: \"Invoeren (uren, verschotten)\",\n    rows: [\n      { keys: [\"Enter\"], desc: \"Volgend veld; op de laatste kolom een nieuwe regel\" },\n      { keys: [\"±\"], desc: \"Teken omdraaien (negatieve uren)\" },\n      { keys: [\"Esc\"], desc: \"Verwerken / terug / wissen (3-koers)\" },\n    ],\n  },\n  {\n    title: \"Detailpagina's en dialogen\",\n    rows: [\n      { keys: [\"Esc\"], desc: \"Terug naar de lijst (detail) of dialoog sluiten\" },\n      { keys: [\"?\"], desc: \"Dit sneltoetsen-overzicht\" },\n    ],\n  },\n];\n</script>\n\n<style scoped>\n.sc {\n  display: grid;\n  grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));\n  gap: 18px 26px;\n}\n.sc__gtitle {\n  margin: 0 0 8px;\n  font-size: 12px;\n  font-weight: 700;\n  text-transform: uppercase;\n  letter-spacing: 0.04em;\n  color: var(--hh-fg-subtle);\n}\n.sc__list {\n  margin: 0;\n  display: grid;\n  gap: 7px;\n}\n.sc__row {\n  display: grid;\n  grid-template-columns: 96px 1fr;\n  gap: 12px;\n  align-items: baseline;\n}\n.sc__keys {\n  display: flex;\n  gap: 4px;\n  flex-wrap: wrap;\n}\n.sc__desc {\n  margin: 0;\n  font-size: 13px;\n  color: var(--hh-fg-muted);\n}\nkbd {\n  font-family: var(--hh-mono);\n  font-size: 11px;\n  padding: 1px 6px;\n  border: 1px solid var(--hh-line-strong);\n  border-radius: 4px;\n  background: var(--hh-surface-2);\n  color: var(--hh-fg-muted);\n  white-space: nowrap;\n}\n</style>\n","import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, withCtx as _withCtx, createBlock as _createBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"sc\" }\nconst _hoisted_2 = { class: \"sc__gtitle\" }\nconst _hoisted_3 = { class: \"sc__list\" }\nconst _hoisted_4 = { class: \"sc__keys\" }\nconst _hoisted_5 = { class: \"sc__desc\" }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return (_openBlock(), _createBlock($setup[\"AppDialog\"], {\n    title: \"Sneltoetsen\",\n    wide: \"\",\n    onClose: _cache[1] || (_cache[1] = $event => ($setup.emit('close')))\n  }, {\n    footer: _withCtx(() => [\n      _createElementVNode(\"button\", {\n        class: \"hh-btn hh-btn--primary\",\n        type: \"button\",\n        \"data-autofocus\": \"\",\n        onClick: _cache[0] || (_cache[0] = $event => ($setup.emit('close')))\n      }, \"Sluiten\")\n    ]),\n    default: _withCtx(() => [\n      _createElementVNode(\"div\", _hoisted_1, [\n        (_openBlock(), _createElementBlock(_Fragment, null, _renderList($setup.groups, (group) => {\n          return _createElementVNode(\"section\", {\n            key: group.title,\n            class: \"sc__group\"\n          }, [\n            _createElementVNode(\"h3\", _hoisted_2, _toDisplayString(group.title), 1 /* TEXT */),\n            _createElementVNode(\"dl\", _hoisted_3, [\n              (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(group.rows, (row, i) => {\n                return (_openBlock(), _createElementBlock(\"div\", {\n                  key: i,\n                  class: \"sc__row\"\n                }, [\n                  _createElementVNode(\"dt\", _hoisted_4, [\n                    (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(row.keys, (k, ki) => {\n                      return (_openBlock(), _createElementBlock(\"kbd\", { key: ki }, _toDisplayString(k), 1 /* TEXT */))\n                    }), 128 /* KEYED_FRAGMENT */))\n                  ]),\n                  _createElementVNode(\"dd\", _hoisted_5, _toDisplayString(row.desc), 1 /* TEXT */)\n                ]))\n              }), 128 /* KEYED_FRAGMENT */))\n            ])\n          ])\n        }), 64 /* STABLE_FRAGMENT */))\n      ])\n    ]),\n    _: 1 /* STABLE */\n  }))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/ShortcutsOverlay.vue?type=script\";import \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/ShortcutsOverlay.vue?type=style&index=0\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/ShortcutsOverlay.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/ShortcutsOverlay.vue\";script.__scopeId = \"data-v-fc9ca683\";export default script;","<template>\n  <AppDialog title=\"Over Happy Hours\" wide @close=\"emit('close')\">\n    <article class=\"about__card\">\n      <pre class=\"about__logo\">HAPPY HOURS</pre>\n      <p class=\"about__tagline\">Urenregistratie &amp; facturatie voor dienstverleners</p>\n\n      <div class=\"about__body\">\n        <p>\n          <strong>Happy Hours</strong> begon in 1994 als een DOS-programma in Borland C++, geschreven\n          door <strong>Arnold Hendriks</strong>. Bijna twintig jaar lang, tot 2013, hield het de uren\n          en facturen van een adviespraktijk bij: klanten, werkzaamheden, verschotten, het klassieke\n          <em>Tellen</em> en de vertrouwde factuurnummers in <span class=\"about__mono\">KLT.JJ/NNN</span>.\n        </p>\n        <p>\n          Deze webversie is een eerbetoon aan dat origineel. Dezelfde rekenregels, dezelfde\n          toetsenbord-eerst-bediening, maar nu in de browser, geserveerd door WebHare met een\n          Vue 3-frontend. Waar het kon hebben we tradities in ere gehouden; waar het beter kon\n          (jaarafsluiting die archiveert in plaats van wist, echte betalingsregistratie) hebben we\n          voorzichtig verbeterd.\n        </p>\n        <p class=\"about__wink\">\n          Probeer <kbd>?</kbd> voor een overzicht van de sneltoetsen. )=-\n        </p>\n      </div>\n\n      <footer class=\"about__foot\">\n        1994&ndash;2013 · Arnold Hendriks &nbsp;·&nbsp; webversie {{ year }}\n      </footer>\n    </article>\n    <template #footer>\n      <button class=\"hh-btn\" type=\"button\" data-autofocus @click=\"emit('close')\">Sluiten</button>\n    </template>\n  </AppDialog>\n</template>\n\n<script setup lang=\"ts\">\nimport AppDialog from \"./AppDialog.vue\";\n\nconst emit = defineEmits<{ close: [] }>();\nconst year = new Date().getFullYear();\n</script>\n\n<style scoped>\n.about__card {\n  padding: 8px 12px;\n  text-align: center;\n}\n.about__logo {\n  margin: 0 0 6px;\n  font-family: var(--hh-mono);\n  font-size: 26px;\n  font-weight: 700;\n  letter-spacing: 0.16em;\n  color: var(--hh-accent-strong);\n}\n.about__tagline {\n  margin: 0 0 26px;\n  font-size: 13px;\n  color: var(--hh-fg-subtle);\n}\n.about__body {\n  text-align: left;\n  font-size: 14px;\n  line-height: 1.65;\n  color: var(--hh-fg);\n}\n.about__body p {\n  margin: 0 0 14px;\n}\n.about__mono {\n  font-family: var(--hh-mono);\n}\n.about__wink {\n  color: var(--hh-fg-muted);\n}\n.about__foot {\n  margin-top: 22px;\n  padding-top: 16px;\n  border-top: 1px solid var(--hh-line);\n  font-size: 12px;\n  color: var(--hh-fg-subtle);\n}\nkbd {\n  font-family: var(--hh-mono);\n  font-size: 11px;\n  padding: 1px 6px;\n  border: 1px solid var(--hh-line-strong);\n  border-radius: 4px;\n  background: var(--hh-surface-2);\n  color: var(--hh-fg-muted);\n}\n</style>\n","import { createElementVNode as _createElementVNode, createTextVNode as _createTextVNode, toDisplayString as _toDisplayString, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"about__card\" }\nconst _hoisted_2 = { class: \"about__foot\" }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return (_openBlock(), _createBlock($setup[\"AppDialog\"], {\n    title: \"Over Happy Hours\",\n    wide: \"\",\n    onClose: _cache[1] || (_cache[1] = $event => ($setup.emit('close')))\n  }, {\n    footer: _withCtx(() => [\n      _createElementVNode(\"button\", {\n        class: \"hh-btn\",\n        type: \"button\",\n        \"data-autofocus\": \"\",\n        onClick: _cache[0] || (_cache[0] = $event => ($setup.emit('close')))\n      }, \"Sluiten\")\n    ]),\n    default: _withCtx(() => [\n      _createElementVNode(\"article\", _hoisted_1, [\n        _cache[2] || (_cache[2] = _createElementVNode(\"pre\", { class: \"about__logo\" }, \"HAPPY HOURS\", -1 /* CACHED */)),\n        _cache[3] || (_cache[3] = _createElementVNode(\"p\", { class: \"about__tagline\" }, \"Urenregistratie & facturatie voor dienstverleners\", -1 /* CACHED */)),\n        _cache[4] || (_cache[4] = _createElementVNode(\"div\", { class: \"about__body\" }, [\n          _createElementVNode(\"p\", null, [\n            _createElementVNode(\"strong\", null, \"Happy Hours\"),\n            _createTextVNode(\" begon in 1994 als een DOS-programma in Borland C++, geschreven door \"),\n            _createElementVNode(\"strong\", null, \"Arnold Hendriks\"),\n            _createTextVNode(\". Bijna twintig jaar lang, tot 2013, hield het de uren en facturen van een adviespraktijk bij: klanten, werkzaamheden, verschotten, het klassieke \"),\n            _createElementVNode(\"em\", null, \"Tellen\"),\n            _createTextVNode(\" en de vertrouwde factuurnummers in \"),\n            _createElementVNode(\"span\", { class: \"about__mono\" }, \"KLT.JJ/NNN\"),\n            _createTextVNode(\". \")\n          ]),\n          _createElementVNode(\"p\", null, \" Deze webversie is een eerbetoon aan dat origineel. Dezelfde rekenregels, dezelfde toetsenbord-eerst-bediening, maar nu in de browser, geserveerd door WebHare met een Vue 3-frontend. Waar het kon hebben we tradities in ere gehouden; waar het beter kon (jaarafsluiting die archiveert in plaats van wist, echte betalingsregistratie) hebben we voorzichtig verbeterd. \"),\n          _createElementVNode(\"p\", { class: \"about__wink\" }, [\n            _createTextVNode(\" Probeer \"),\n            _createElementVNode(\"kbd\", null, \"?\"),\n            _createTextVNode(\" voor een overzicht van de sneltoetsen. )=- \")\n          ])\n        ], -1 /* CACHED */)),\n        _createElementVNode(\"footer\", _hoisted_2, \" 1994–2013 · Arnold Hendriks  ·  webversie \" + _toDisplayString($setup.year), 1 /* TEXT */)\n      ])\n    ]),\n    _: 1 /* STABLE */\n  }))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/AboutDialog.vue?type=script\";import \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/AboutDialog.vue?type=style&index=0\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/AboutDialog.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/AboutDialog.vue\";script.__scopeId = \"data-v-41bf4789\";export default script;","import { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, withModifiers as _withModifiers, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, Transition as _Transition, withCtx as _withCtx, createBlock as _createBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"toast__text\" }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return (_openBlock(), _createBlock(_Transition, { name: \"toast\" }, {\n    default: _withCtx(() => [\n      ($setup.toastMessage)\n        ? (_openBlock(), _createElementBlock(\"div\", {\n            key: 0,\n            class: \"toast\",\n            role: \"status\",\n            onClick: _cache[1] || (_cache[1] = (...args) => ($setup.dismissToast && $setup.dismissToast(...args)))\n          }, [\n            _createElementVNode(\"span\", _hoisted_1, _toDisplayString($setup.toastMessage), 1 /* TEXT */),\n            _createElementVNode(\"button\", {\n              class: \"toast__close\",\n              type: \"button\",\n              \"aria-label\": \"Sluiten\",\n              onClick: _cache[0] || (_cache[0] = _withModifiers((...args) => ($setup.dismissToast && $setup.dismissToast(...args)), [\"stop\"]))\n            }, \"×\")\n          ]))\n        : _createCommentVNode(\"v-if\", true)\n    ]),\n    _: 1 /* STABLE */\n  }))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/Toast.vue?type=script\";import \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/Toast.vue?type=style&index=0\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/Toast.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/Toast.vue\";script.__scopeId = \"data-v-84702c72\";export default script;","<template>\n  <BootSplash v-if=\"showBoot\" @done=\"onBootDone\" />\n\n  <RouterView v-if=\"route.meta.public\" />\n  <div v-else-if=\"isLoggedIn\" class=\"app\" :style=\"{ '--hh-header-height': `${headerHeight}px` }\">\n    <a class=\"app__skip\" href=\"#happy-content\" @click.prevent=\"main?.focus()\">Naar inhoud</a>\n    <header ref=\"appBar\" class=\"app__bar\">\n      <AppHeader ref=\"appHeader\" :mobile-open=\"mobileOpen\" :mobile=\"isMobile\"\n        @toggle-sidebar=\"toggleSidebar\" @shortcuts=\"shortcutsOpen = true\" @about=\"aboutOpen = true\" />\n    </header>\n    <div class=\"app__workspace\">\n      <MenuBar v-if=\"organizationSession.organization\" :key=\"organizationSession.generation\" ref=\"sidebar\" :collapsed=\"sidebarCollapsed\" :mobile-open=\"mobileOpen\"\n        @toggle-sidebar=\"toggleSidebar\" @navigate=\"closeMobileSidebar\" @close-mobile=\"closeMobileSidebar\" @open-mobile=\"openMobileSidebar\" />\n      <button v-if=\"mobileOpen\" class=\"app__backdrop\" type=\"button\" tabindex=\"-1\" aria-label=\"Navigatie sluiten\" @click=\"closeMobileSidebar\" />\n      <div class=\"app__content\" :inert=\"mobileOpen || undefined\">\n        <main id=\"happy-content\" ref=\"main\" class=\"app__main\" tabindex=\"-1\">\n          <RouterView v-if=\"organizationSession.organization || route.name === 'profiel'\" :key=\"organizationSession.generation\" />\n          <OrganizationChoiceView v-else />\n        </main>\n        <footer class=\"app__footer\">\n          <template v-if=\"idle\">Happy Hours neemt even pauze…</template>\n          <template v-else>Happy Hours · een hommage aan het origineel (1994–2013)</template>\n        </footer>\n      </div>\n    </div>\n  </div>\n  <LoginForm v-else />\n\n  <FeedbackWidget v-if=\"isLoggedIn && !route.meta.public\" />\n  <ShortcutsOverlay v-if=\"shortcutsOpen\" @close=\"shortcutsOpen = false\" />\n  <AboutDialog v-if=\"aboutOpen\" @close=\"aboutOpen = false\" />\n  <AppDialog v-if=\"organizationSession.leavePrompt\" :title=\"organizationSession.leavePrompt === 'busy' ? 'Opslaan wordt afgerond' : 'Niet-opgeslagen wijzigingen'\" @close=\"resolveOrganizationLeave(false)\">\n    <p v-if=\"organizationSession.leavePrompt === 'busy'\">Wacht tot het opslaan is afgerond voordat je van administratie wisselt.</p>\n    <p v-else>Je hebt niet-opgeslagen wijzigingen. Wil je deze weggooien en van administratie wisselen?</p>\n    <template #footer>\n      <button class=\"hh-btn\" type=\"button\" data-autofocus @click=\"resolveOrganizationLeave(false)\">Blijf hier</button>\n      <button v-if=\"organizationSession.leavePrompt === 'dirty'\" class=\"hh-btn hh-btn--danger\" type=\"button\" @click=\"resolveOrganizationLeave(true)\">Wijzigingen weggooien</button>\n    </template>\n  </AppDialog>\n  <Toast />\n</template>\n\n<script setup lang=\"ts\">\nimport { nextTick, onBeforeUnmount, onMounted, ref, watch } from \"vue\";\nimport { RouterView, useRoute, useRouter } from \"vue-router\";\nimport { useWrdAuthState } from \"./lib/useWrdAuthState\";\nimport { organizationSession, clearOrganizationSession, resolveOrganizationLeave } from \"./lib/organization\";\nimport { clearCustomerListPosition } from \"./lib/customerNavigation\";\nimport { dismissToast } from \"./lib/toast\";\nimport { refreshAccount } from \"./lib/api\";\nimport OrganizationChoiceView from \"./views/OrganizationChoiceView.vue\";\nimport { isPreferenceSet, resetPreference, setPreference } from \"./lib/preferences\";\nimport LoginForm from \"./components/LoginForm.vue\";\nimport FeedbackWidget from \"./components/FeedbackWidget.vue\";\nimport MenuBar from \"./components/MenuBar.vue\";\nimport AppHeader from \"./components/AppHeader.vue\";\nimport BootSplash from \"./components/BootSplash.vue\";\nimport ShortcutsOverlay from \"./components/ShortcutsOverlay.vue\";\nimport AppDialog from \"./components/AppDialog.vue\";\nimport AboutDialog from \"./components/AboutDialog.vue\";\nimport Toast from \"./components/Toast.vue\";\n\nconst { isLoggedIn } = useWrdAuthState();\nconst route = useRoute();\nconst router = useRouter();\n\nconst BOOT_KEY = \"happy:booted\";\nconst IDLE_MS = 60000;\n\nconst showBoot = ref(false);\nconst shortcutsOpen = ref(false);\nconst aboutOpen = ref(false);\nconst idle = ref(false);\nlet idleTimer: number | null = null;\n\nconst appBar = ref<HTMLElement | null>(null);\nconst appHeader = ref<{ focusToggle(): void } | null>(null);\nconst sidebar = ref<{ focusFirst(): void } | null>(null);\nconst main = ref<HTMLElement | null>(null);\nconst headerHeight = ref(64);\n// The router boots the account before mounting, so scoped preferences do not flash.\nconst accountEmail = ref(organizationSession.account?.email ?? \"\");\nconst sidebarCollapsed = ref(isPreferenceSet(accountEmail.value, \"sidebarCollapsed\"));\nconst mobileOpen = ref(false);\nconst mobileQuery = window.matchMedia(\"(max-width: 899px)\");\nconst isMobile = ref(mobileQuery.matches);\n\nfunction onAccount(account: { email: string }): void {\n  accountEmail.value = account.email;\n  sidebarCollapsed.value = isPreferenceSet(account.email, \"sidebarCollapsed\");\n}\n\nfunction toggleSidebar(): void {\n  if (isMobile.value) {\n    if (mobileOpen.value) closeMobileSidebar(); else openMobileSidebar();\n    return;\n  }\n  sidebarCollapsed.value = !sidebarCollapsed.value;\n  if (accountEmail.value) {\n    const persist = sidebarCollapsed.value ? setPreference : resetPreference;\n    persist(accountEmail.value, \"sidebarCollapsed\");\n  }\n}\n\nfunction openMobileSidebar(): void {\n  mobileOpen.value = true;\n  void nextTick(() => sidebar.value?.focusFirst());\n}\n\nfunction closeMobileSidebar(): void {\n  if (!mobileOpen.value) return;\n  mobileOpen.value = false;\n  void nextTick(() => appHeader.value?.focusToggle());\n}\n\nfunction onViewportChange(): void {\n  isMobile.value = mobileQuery.matches;\n  if (!isMobile.value) closeMobileSidebar();\n}\n\nwatch(appBar, (element, _previous, onCleanup) => {\n  if (!element) return;\n  // The sidebar and sticky table headers must follow the rendered header at browser zoom.\n  const updateHeight = () => { headerHeight.value = Math.ceil(element.getBoundingClientRect().height); };\n  updateHeight();\n  const observer = new ResizeObserver(updateHeight);\n  observer.observe(element);\n  onCleanup(() => observer.disconnect());\n});\n\nwatch(mobileOpen, (open, _previous, onCleanup) => {\n  if (!open) return;\n  const previousOverflow = document.body.style.overflow;\n  document.body.style.overflow = \"hidden\";\n  onCleanup(() => { document.body.style.overflow = previousOverflow; });\n});\n\n// ── Bootsplash: eenmalig per sessie, alleen ingelogd ─────────────────────────\nfunction booted(): boolean {\n  try {\n    return sessionStorage.getItem(BOOT_KEY) === \"1\";\n  } catch {\n    return false;\n  }\n}\n\nfunction maybeBoot(): void {\n  if (isLoggedIn.value && !route.meta.public && !booted()) showBoot.value = true;\n}\n\nfunction onBootDone(): void {\n  showBoot.value = false;\n  try {\n    sessionStorage.setItem(BOOT_KEY, \"1\");\n  } catch {\n    // private-mode: splash toont dan opnieuw bij een volgende navigatie; onschuldig.\n  }\n}\n\nwatch(isLoggedIn, () => {\n  clearOrganizationSession();\n  shortcutsOpen.value = false;\n  aboutOpen.value = false;\n  if (isLoggedIn.value) void refreshAccount().then(() => {\n    if (isLoggedIn.value && organizationSession.account) return router.replace({ path: route.path, query: route.query, hash: route.hash, force: true });\n  }).catch(() => { organizationSession.error = \"Je account kon niet worden geladen. Meld opnieuw aan.\"; });\n  maybeBoot();\n  closeMobileSidebar();\n});\n\nwatch(() => organizationSession.generation, () => {\n  clearCustomerListPosition();\n  dismissToast();\n  if (organizationSession.error && !organizationSession.organization && route.params.organization) void router.replace({ name: \"organisaties\" });\n  onAccount({ email: organizationSession.account?.email ?? \"\" });\n  closeMobileSidebar();\n});\n\n// ── Inactiviteit ─────────────────────────────────────────────────────────────\nfunction resetIdle(): void {\n  idle.value = false;\n  if (idleTimer !== null) window.clearTimeout(idleTimer);\n  idleTimer = window.setTimeout(() => { idle.value = true; }, IDLE_MS);\n}\n\n// ── Globale \"?\" opent de sneltoetsen-overlay ─────────────────────────────────\nfunction isTyping(): boolean {\n  const el = document.activeElement as HTMLElement | null;\n  if (!el) return false;\n  return el.tagName === \"INPUT\" || el.tagName === \"TEXTAREA\" || el.tagName === \"SELECT\" || el.isContentEditable;\n}\n\nfunction onGlobalKeydown(event: KeyboardEvent): void {\n  if (event.key !== \"?\" || !isLoggedIn.value) return;\n  if (isTyping() || document.querySelector(\".dialog-backdrop\")) return;\n  event.preventDefault();\n  shortcutsOpen.value = true;\n}\n\nconst ACTIVITY_EVENTS = [\"mousemove\", \"keydown\", \"click\", \"scroll\"] as const;\n\nonMounted(() => {\n  maybeBoot();\n  resetIdle();\n  mobileQuery.addEventListener(\"change\", onViewportChange);\n  window.addEventListener(\"keydown\", onGlobalKeydown);\n  for (const name of ACTIVITY_EVENTS) window.addEventListener(name, resetIdle, { passive: true });\n});\nonBeforeUnmount(() => {\n  if (idleTimer !== null) window.clearTimeout(idleTimer);\n  mobileQuery.removeEventListener(\"change\", onViewportChange);\n  window.removeEventListener(\"keydown\", onGlobalKeydown);\n  for (const name of ACTIVITY_EVENTS) window.removeEventListener(name, resetIdle);\n});\n</script>\n\n<style scoped>\n.app {\n  min-height: 100vh;\n  display: flex;\n  flex-direction: column;\n}\n.app__bar {\n  border-bottom: 1px solid var(--hh-line);\n  background: var(--hh-surface);\n  position: sticky;\n  top: 0;\n  z-index: 50;\n}\n.app__workspace { display: flex; flex: 1; min-width: 0; align-items: flex-start; }\n.app__content { display: flex; flex: 1; flex-direction: column; min-width: 0; min-height: calc(100dvh - var(--hh-header-height)); }\n.app__backdrop { position: fixed; inset: var(--hh-header-height) 0 0; z-index: 20; border: 0; background: rgba(28, 33, 27, 0.35); cursor: pointer; }\n.app__skip { position: fixed; top: 8px; left: 8px; z-index: 150; padding: 8px 12px; background: var(--hh-surface); color: var(--hh-fg); transform: translateY(-150%); }\n.app__skip:focus { transform: none; }\n.app__main {\n  flex: 1;\n  width: 100%;\n  max-width: 1400px;\n  margin: 0 auto;\n  padding: 24px 16px;\n}\n@media (min-width: 900px) { .app__main { padding: 28px 32px; } }\n.app__footer {\n  padding: 14px 24px;\n  border-top: 1px solid var(--hh-line);\n  color: var(--hh-fg-subtle);\n  font-size: 12px;\n  text-align: center;\n}\n</style>\n","import { openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, withModifiers as _withModifiers, createElementVNode as _createElementVNode, createVNode as _createVNode, createElementBlock as _createElementBlock, createTextVNode as _createTextVNode, Fragment as _Fragment, normalizeStyle as _normalizeStyle, withCtx as _withCtx } from \"vue\"\n\nconst _hoisted_1 = {\n  ref: \"appBar\",\n  class: \"app__bar\"\n}\nconst _hoisted_2 = { class: \"app__workspace\" }\nconst _hoisted_3 = [\"inert\"]\nconst _hoisted_4 = {\n  id: \"happy-content\",\n  ref: \"main\",\n  class: \"app__main\",\n  tabindex: \"-1\"\n}\nconst _hoisted_5 = { class: \"app__footer\" }\nconst _hoisted_6 = { key: 0 }\nconst _hoisted_7 = { key: 1 }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return (_openBlock(), _createElementBlock(_Fragment, null, [\n    ($setup.showBoot)\n      ? (_openBlock(), _createBlock($setup[\"BootSplash\"], {\n          key: 0,\n          onDone: $setup.onBootDone\n        }))\n      : _createCommentVNode(\"v-if\", true),\n    ($setup.route.meta.public)\n      ? (_openBlock(), _createBlock($setup[\"RouterView\"], { key: 1 }))\n      : ($setup.isLoggedIn)\n        ? (_openBlock(), _createElementBlock(\"div\", {\n            key: 2,\n            class: \"app\",\n            style: _normalizeStyle({ '--hh-header-height': `${$setup.headerHeight}px` })\n          }, [\n            _createElementVNode(\"a\", {\n              class: \"app__skip\",\n              href: \"#happy-content\",\n              onClick: _cache[0] || (_cache[0] = _withModifiers($event => ($setup.main?.focus()), [\"prevent\"]))\n            }, \"Naar inhoud\"),\n            _createElementVNode(\"header\", _hoisted_1, [\n              _createVNode($setup[\"AppHeader\"], {\n                ref: \"appHeader\",\n                \"mobile-open\": $setup.mobileOpen,\n                mobile: $setup.isMobile,\n                onToggleSidebar: $setup.toggleSidebar,\n                onShortcuts: _cache[1] || (_cache[1] = $event => ($setup.shortcutsOpen = true)),\n                onAbout: _cache[2] || (_cache[2] = $event => ($setup.aboutOpen = true))\n              }, null, 8 /* PROPS */, [\"mobile-open\", \"mobile\"])\n            ], 512 /* NEED_PATCH */),\n            _createElementVNode(\"div\", _hoisted_2, [\n              ($setup.organizationSession.organization)\n                ? (_openBlock(), _createBlock($setup[\"MenuBar\"], {\n                    key: $setup.organizationSession.generation,\n                    ref: \"sidebar\",\n                    collapsed: $setup.sidebarCollapsed,\n                    \"mobile-open\": $setup.mobileOpen,\n                    onToggleSidebar: $setup.toggleSidebar,\n                    onNavigate: $setup.closeMobileSidebar,\n                    onCloseMobile: $setup.closeMobileSidebar,\n                    onOpenMobile: $setup.openMobileSidebar\n                  }, null, 8 /* PROPS */, [\"collapsed\", \"mobile-open\"]))\n                : _createCommentVNode(\"v-if\", true),\n              ($setup.mobileOpen)\n                ? (_openBlock(), _createElementBlock(\"button\", {\n                    key: 1,\n                    class: \"app__backdrop\",\n                    type: \"button\",\n                    tabindex: \"-1\",\n                    \"aria-label\": \"Navigatie sluiten\",\n                    onClick: $setup.closeMobileSidebar\n                  }))\n                : _createCommentVNode(\"v-if\", true),\n              _createElementVNode(\"div\", {\n                class: \"app__content\",\n                inert: $setup.mobileOpen || undefined\n              }, [\n                _createElementVNode(\"main\", _hoisted_4, [\n                  ($setup.organizationSession.organization || $setup.route.name === 'profiel')\n                    ? (_openBlock(), _createBlock($setup[\"RouterView\"], {\n                        key: $setup.organizationSession.generation\n                      }))\n                    : (_openBlock(), _createBlock($setup[\"OrganizationChoiceView\"], { key: 1 }))\n                ], 512 /* NEED_PATCH */),\n                _createElementVNode(\"footer\", _hoisted_5, [\n                  ($setup.idle)\n                    ? (_openBlock(), _createElementBlock(_Fragment, { key: 0 }, [\n                        _createTextVNode(\"Happy Hours neemt even pauze…\")\n                      ], 64 /* STABLE_FRAGMENT */))\n                    : (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n                        _createTextVNode(\"Happy Hours · een hommage aan het origineel (1994–2013)\")\n                      ], 64 /* STABLE_FRAGMENT */))\n                ])\n              ], 8 /* PROPS */, _hoisted_3)\n            ])\n          ], 4 /* STYLE */))\n        : (_openBlock(), _createBlock($setup[\"LoginForm\"], { key: 3 })),\n    ($setup.isLoggedIn && !$setup.route.meta.public)\n      ? (_openBlock(), _createBlock($setup[\"FeedbackWidget\"], { key: 4 }))\n      : _createCommentVNode(\"v-if\", true),\n    ($setup.shortcutsOpen)\n      ? (_openBlock(), _createBlock($setup[\"ShortcutsOverlay\"], {\n          key: 5,\n          onClose: _cache[3] || (_cache[3] = $event => ($setup.shortcutsOpen = false))\n        }))\n      : _createCommentVNode(\"v-if\", true),\n    ($setup.aboutOpen)\n      ? (_openBlock(), _createBlock($setup[\"AboutDialog\"], {\n          key: 6,\n          onClose: _cache[4] || (_cache[4] = $event => ($setup.aboutOpen = false))\n        }))\n      : _createCommentVNode(\"v-if\", true),\n    ($setup.organizationSession.leavePrompt)\n      ? (_openBlock(), _createBlock($setup[\"AppDialog\"], {\n          key: 7,\n          title: $setup.organizationSession.leavePrompt === 'busy' ? 'Opslaan wordt afgerond' : 'Niet-opgeslagen wijzigingen',\n          onClose: _cache[7] || (_cache[7] = $event => ($setup.resolveOrganizationLeave(false)))\n        }, {\n          footer: _withCtx(() => [\n            _createElementVNode(\"button\", {\n              class: \"hh-btn\",\n              type: \"button\",\n              \"data-autofocus\": \"\",\n              onClick: _cache[5] || (_cache[5] = $event => ($setup.resolveOrganizationLeave(false)))\n            }, \"Blijf hier\"),\n            ($setup.organizationSession.leavePrompt === 'dirty')\n              ? (_openBlock(), _createElementBlock(\"button\", {\n                  key: 0,\n                  class: \"hh-btn hh-btn--danger\",\n                  type: \"button\",\n                  onClick: _cache[6] || (_cache[6] = $event => ($setup.resolveOrganizationLeave(true)))\n                }, \"Wijzigingen weggooien\"))\n              : _createCommentVNode(\"v-if\", true)\n          ]),\n          default: _withCtx(() => [\n            ($setup.organizationSession.leavePrompt === 'busy')\n              ? (_openBlock(), _createElementBlock(\"p\", _hoisted_6, \"Wacht tot het opslaan is afgerond voordat je van administratie wisselt.\"))\n              : (_openBlock(), _createElementBlock(\"p\", _hoisted_7, \"Je hebt niet-opgeslagen wijzigingen. Wil je deze weggooien en van administratie wisselen?\"))\n          ]),\n          _: 1 /* STABLE */\n        }, 8 /* PROPS */, [\"title\"]))\n      : _createCommentVNode(\"v-if\", true),\n    _createVNode($setup[\"Toast\"])\n  ], 64 /* STABLE_FRAGMENT */))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/App.vue?type=script\";import \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/App.vue?type=style&index=0\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/App.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/App.vue\";script.__scopeId = \"data-v-663bbd05\";export default script;","<script setup lang=\"ts\">\nimport { onBeforeUnmount, onMounted, reactive, ref } from \"vue\";\nimport { isLoginEmail } from \"@mod-ww/js/auth/code-login-frontend\";\nimport { useApi } from \"../lib/api\";\nimport { useOrganizationDirty } from \"../lib/organization\";\nimport { useToast } from \"../lib/toast\";\nimport AppDialog from \"../components/AppDialog.vue\";\nimport FormField from \"../components/FormField.vue\";\n\nconst api = useApi();\nconst toast = useToast();\ntype Member = Awaited<ReturnType<typeof api.listOrganizationMembers>>[number];\ntype Invitation = Awaited<ReturnType<typeof api.listOrganizationInvitations>>[number];\ntype Role = Member[\"role\"];\nconst members = ref<Member[]>([]);\nconst invitations = ref<Invitation[]>([]);\nconst loading = ref(true);\nconst loaded = ref(false);\nconst busy = ref(false);\nconst loadError = ref(\"\");\nconst actionError = ref(\"\");\nconst dialog = ref<\"invite\" | \"role\" | \"member-delete\" | \"invitation-delete\" | null>(null);\nconst selectedMember = ref<Member | null>(null);\nconst selectedInvitation = ref<Invitation | null>(null);\nconst form = reactive({ email: \"\", name: \"\", role: \"bookkeeper\" as Role });\nconst fieldErrors = ref<Record<string, string>>({});\nconst emailInput = ref<HTMLInputElement | null>(null);\nconst nameInput = ref<HTMLInputElement | null>(null);\nlet disposed = false;\nlet loadVersion = 0;\n\nuseOrganizationDirty(() => dialog.value === \"invite\" && Boolean(form.email || form.name || form.role !== \"bookkeeper\")\n  || dialog.value === \"role\" && form.role !== selectedMember.value?.role);\nonBeforeUnmount(() => { disposed = true; });\n\nfunction roleLabel(role: Role): string { return role === \"admin\" ? \"Beheerder\" : \"Boekhouder\"; }\nfunction expiresLabel(value: string): string { return new Date(value).toLocaleDateString(\"nl-NL\"); }\n\nasync function load(): Promise<void> {\n  const version = ++loadVersion;\n  loading.value = true;\n  loadError.value = \"\";\n  try {\n    const [nextMembers, nextInvitations] = await Promise.all([api.listOrganizationMembers(), api.listOrganizationInvitations()]);\n    if (disposed || version !== loadVersion) return;\n    members.value = nextMembers;\n    invitations.value = nextInvitations;\n    loaded.value = true;\n  } catch (err) {\n    if (!disposed && version === loadVersion) loadError.value = err instanceof Error ? err.message : \"Kon de gebruikers niet laden.\";\n  } finally {\n    if (!disposed && version === loadVersion) loading.value = false;\n  }\n}\n\nfunction closeDialog(): void { if (!busy.value) dialog.value = null; }\n\nfunction openInvite(): void {\n  actionError.value = \"\";\n  fieldErrors.value = {};\n  Object.assign(form, { email: \"\", name: \"\", role: \"bookkeeper\" });\n  dialog.value = \"invite\";\n}\n\nfunction openRole(member: Member): void {\n  if (!member.managed) return;\n  selectedMember.value = member;\n  form.role = member.role;\n  actionError.value = \"\";\n  dialog.value = \"role\";\n}\n\nfunction confirmMemberRemoval(member: Member): void {\n  if (!member.managed) return;\n  selectedMember.value = member;\n  actionError.value = \"\";\n  dialog.value = \"member-delete\";\n}\n\nfunction confirmInvitationRemoval(invitation: Invitation): void {\n  selectedInvitation.value = invitation;\n  actionError.value = \"\";\n  dialog.value = \"invitation-delete\";\n}\n\nasync function mutate({ action, message }: { action: () => Promise<unknown>; message: string }): Promise<void> {\n  if (busy.value || disposed) return;\n  busy.value = true;\n  actionError.value = \"\";\n  try {\n    await action();\n    if (disposed) return;\n    dialog.value = null;\n    toast(message);\n    await load();\n  } catch (err) {\n    if (!disposed) actionError.value = err instanceof Error ? err.message : \"De wijziging kon niet worden opgeslagen. Probeer het opnieuw.\";\n  } finally {\n    if (!disposed) busy.value = false;\n  }\n}\n\nasync function submitInvitation(): Promise<void> {\n  if (busy.value) return;\n  fieldErrors.value = {};\n  form.email = form.email.trim().toLowerCase();\n  if (!isLoginEmail(form.email) || form.email.length > 254) fieldErrors.value.email = \"Vul een geldig e-mailadres van maximaal 254 tekens in.\";\n  if (form.name.trim().length > 250) fieldErrors.value.name = \"De naam mag maximaal 250 tekens bevatten.\";\n  if (fieldErrors.value.email) { emailInput.value?.focus(); return; }\n  if (fieldErrors.value.name) { nameInput.value?.focus(); return; }\n  const input = { email: form.email, name: form.name.trim(), role: form.role };\n  await mutate({ action: () => api.sendOrganizationInvitation(input), message: \"Uitnodiging verstuurd.\" });\n}\n\nasync function resendInvitation(invitation: Invitation): Promise<void> {\n  await mutate({ action: () => api.sendOrganizationInvitation({ email: invitation.email, name: invitation.name, role: invitation.role }), message: \"Uitnodiging opnieuw verstuurd.\" });\n}\n\nasync function submitRole(): Promise<void> {\n  const member = selectedMember.value;\n  if (!member?.managed) return;\n  const role = form.role;\n  await mutate({ action: () => api.updateOrganizationMemberRole({ memberId: member.id, role }), message: \"Rol gewijzigd.\" });\n}\n\nasync function removeAccess(): Promise<void> {\n  if (dialog.value === \"member-delete\" && selectedMember.value?.managed) {\n    const memberId = selectedMember.value.id;\n    await mutate({ action: () => api.deleteOrganizationMember({ memberId }), message: \"Toegang ingetrokken.\" });\n  } else if (dialog.value === \"invitation-delete\" && selectedInvitation.value) {\n    const id = selectedInvitation.value.id;\n    await mutate({ action: () => api.deleteOrganizationInvitation({ id }), message: \"Uitnodiging ingetrokken.\" });\n  }\n}\n\nonMounted(load);\n</script>\n\n<template>\n  <section class=\"organization-users\">\n    <div class=\"hh-page__bar\">\n      <h1 class=\"hh-page__title\">Gebruikers</h1>\n      <button type=\"button\" class=\"hh-btn hh-btn--primary\" :disabled=\"busy\" @click=\"openInvite\">+ Gebruiker uitnodigen</button>\n    </div>\n\n    <div v-if=\"loadError\" class=\"organization-users__error\" role=\"alert\">\n      <p class=\"hh-formerror\">{{ loadError }}</p>\n      <button type=\"button\" class=\"hh-btn\" :disabled=\"loading || busy\" @click=\"load\">Opnieuw proberen</button>\n    </div>\n    <p v-if=\"actionError && !dialog\" class=\"hh-formerror\" role=\"alert\">{{ actionError }}</p>\n\n    <div class=\"hh-card organization-users__table\" :aria-busy=\"loading\">\n      <div v-if=\"!loaded && loading\" class=\"organization-users__skeleton\" role=\"status\" aria-label=\"Gebruikers laden\">\n        <div v-for=\"index in 3\" :key=\"index\" class=\"organization-users__skeleton-row\"></div>\n      </div>\n      <p v-else-if=\"loaded && !members.length\" class=\"hh-empty\">Nog geen gebruikers.</p>\n      <table v-else-if=\"loaded\" class=\"hh-table\">\n        <caption class=\"organization-users__caption\">Gebruikers met toegang tot deze administratie</caption>\n        <thead><tr><th>Naam</th><th>E-mail</th><th>Rol</th><th>Status</th><th><span class=\"organization-users__sr\">Acties</span></th></tr></thead>\n        <tbody>\n          <tr v-for=\"member in members\" :key=\"member.id\" :data-member-id=\"member.id\">\n            <td>{{ member.name || \"Naam niet ingevuld\" }}</td>\n            <td class=\"organization-users__email\">{{ member.email }}</td>\n            <td>{{ roleLabel(member.role) }}</td>\n            <td>{{ member.active ? \"Actief\" : \"Niet actief\" }}</td>\n            <td>\n              <div v-if=\"member.managed\" class=\"organization-users__actions\">\n                <button type=\"button\" class=\"hh-btn hh-btn--small\" :disabled=\"busy\" :aria-label=\"`Rol wijzigen van ${member.name || member.email}`\" @click=\"openRole(member)\">Rol wijzigen</button>\n                <button type=\"button\" class=\"hh-btn hh-btn--small hh-btn--danger\" :disabled=\"busy\" :aria-label=\"`Toegang intrekken van ${member.name || member.email}`\" @click=\"confirmMemberRemoval(member)\">Toegang intrekken</button>\n              </div>\n              <span v-else class=\"organization-users__managed\">{{ member.reason || \"Deze toegang wordt beheerd in WebHare.\" }}</span>\n            </td>\n          </tr>\n        </tbody>\n      </table>\n    </div>\n\n    <h2 class=\"organization-users__heading\">Uitnodigingen</h2>\n    <div class=\"hh-card organization-users__table\" :aria-busy=\"loading\">\n      <div v-if=\"!loaded && loading\" class=\"organization-users__skeleton\" role=\"status\" aria-label=\"Uitnodigingen laden\"><div class=\"organization-users__skeleton-row\"></div></div>\n      <p v-else-if=\"loaded && !invitations.length\" class=\"hh-empty\">Geen openstaande uitnodigingen.</p>\n      <table v-else-if=\"loaded\" class=\"hh-table\">\n        <thead><tr><th>Naam</th><th>E-mail</th><th>Rol</th><th>Status</th><th><span class=\"organization-users__sr\">Acties</span></th></tr></thead>\n        <tbody>\n          <tr v-for=\"invitation in invitations\" :key=\"invitation.id\">\n            <td>{{ invitation.name || \"Naam niet ingevuld\" }}</td>\n            <td class=\"organization-users__email\">{{ invitation.email }}</td>\n            <td>{{ roleLabel(invitation.role) }}</td>\n            <td>{{ invitation.expired ? \"Verlopen op\" : \"Geldig tot\" }} {{ expiresLabel(invitation.expiresAt) }}</td>\n            <td><div class=\"organization-users__actions\">\n              <button type=\"button\" class=\"hh-btn hh-btn--small\" :disabled=\"busy\" :aria-label=\"`Uitnodiging opnieuw versturen aan ${invitation.email}`\" @click=\"resendInvitation(invitation)\">Opnieuw versturen</button>\n              <button type=\"button\" class=\"hh-btn hh-btn--small hh-btn--danger\" :disabled=\"busy\" :aria-label=\"`Uitnodiging intrekken voor ${invitation.email}`\" @click=\"confirmInvitationRemoval(invitation)\">Intrekken</button>\n            </div></td>\n          </tr>\n        </tbody>\n      </table>\n    </div>\n\n    <AppDialog v-if=\"dialog === 'invite'\" title=\"Gebruiker uitnodigen\" @close=\"closeDialog\">\n      <form id=\"organization-invite\" class=\"organization-users__form\" novalidate @submit.prevent=\"submitInvitation\">\n        <p v-if=\"actionError\" class=\"hh-formerror\" role=\"alert\">{{ actionError }}</p>\n        <FormField label=\"E-mail\" for-id=\"organization-invite-email\" :error=\"fieldErrors.email\" required>\n          <input id=\"organization-invite-email\" ref=\"emailInput\" v-model=\"form.email\" data-autofocus class=\"hh-input\" :class=\"{ 'hh-input--error': fieldErrors.email }\" type=\"email\" autocomplete=\"email\" maxlength=\"254\" :disabled=\"busy\" :aria-invalid=\"Boolean(fieldErrors.email)\" />\n        </FormField>\n        <FormField label=\"Naam\" for-id=\"organization-invite-name\" hint=\"Optioneel. Bestaande accounts behouden hun naam.\" :error=\"fieldErrors.name\">\n          <input id=\"organization-invite-name\" ref=\"nameInput\" v-model=\"form.name\" class=\"hh-input\" :class=\"{ 'hh-input--error': fieldErrors.name }\" autocomplete=\"name\" maxlength=\"250\" :disabled=\"busy\" :aria-invalid=\"Boolean(fieldErrors.name)\" />\n        </FormField>\n        <FormField label=\"Rol\" for-id=\"organization-invite-role\">\n          <select id=\"organization-invite-role\" v-model=\"form.role\" class=\"hh-select\" :disabled=\"busy\">\n            <option value=\"bookkeeper\">Boekhouder</option><option value=\"admin\">Beheerder</option>\n          </select>\n        </FormField>\n        <p class=\"organization-users__role\">{{ form.role === \"admin\" ? \"Beheert de administratie, instellingen en gebruikers.\" : \"Werkt met uren, facturen en de dagelijkse administratie.\" }}</p>\n      </form>\n      <template #footer>\n        <button type=\"button\" class=\"hh-btn\" :disabled=\"busy\" @click=\"closeDialog\">Annuleren</button>\n        <button type=\"submit\" form=\"organization-invite\" class=\"hh-btn hh-btn--primary\" :disabled=\"busy\" :aria-busy=\"busy\">{{ busy ? \"Uitnodiging versturen…\" : \"Uitnodiging versturen\" }}</button>\n      </template>\n    </AppDialog>\n\n    <AppDialog v-if=\"dialog === 'role' && selectedMember\" title=\"Rol wijzigen\" @close=\"closeDialog\">\n      <form id=\"organization-role\" class=\"organization-users__form\" @submit.prevent=\"submitRole\">\n        <p>{{ selectedMember.name || selectedMember.email }}</p>\n        <p v-if=\"actionError\" class=\"hh-formerror\" role=\"alert\">{{ actionError }}</p>\n        <FormField label=\"Rol\" for-id=\"organization-member-role\">\n          <select id=\"organization-member-role\" v-model=\"form.role\" class=\"hh-select\" data-autofocus :disabled=\"busy\">\n            <option value=\"bookkeeper\">Boekhouder</option><option value=\"admin\">Beheerder</option>\n          </select>\n        </FormField>\n        <p class=\"organization-users__role\">{{ form.role === \"admin\" ? \"Beheert de administratie, instellingen en gebruikers.\" : \"Werkt met uren, facturen en de dagelijkse administratie.\" }}</p>\n      </form>\n      <template #footer>\n        <button type=\"button\" class=\"hh-btn\" :disabled=\"busy\" @click=\"closeDialog\">Annuleren</button>\n        <button type=\"submit\" form=\"organization-role\" class=\"hh-btn hh-btn--primary\" :disabled=\"busy\" :aria-busy=\"busy\">{{ busy ? \"Opslaan…\" : \"Opslaan\" }}</button>\n      </template>\n    </AppDialog>\n\n    <AppDialog v-if=\"dialog === 'member-delete' || dialog === 'invitation-delete'\" :title=\"dialog === 'member-delete' ? 'Toegang intrekken' : 'Uitnodiging intrekken'\" @close=\"closeDialog\">\n      <p v-if=\"dialog === 'member-delete'\">Wil je de toegang van <strong>{{ selectedMember?.name || selectedMember?.email }}</strong> tot deze administratie intrekken? Het account en de geboekte uren blijven bewaard.</p>\n      <p v-else>Wil je de uitnodiging voor <strong>{{ selectedInvitation?.email }}</strong> intrekken? De uitnodigingslink werkt daarna niet meer.</p>\n      <p v-if=\"actionError\" class=\"hh-formerror\" role=\"alert\">{{ actionError }}</p>\n      <template #footer>\n        <button type=\"button\" class=\"hh-btn\" :disabled=\"busy\" @click=\"closeDialog\">Annuleren</button>\n        <button type=\"button\" class=\"hh-btn hh-btn--danger\" :disabled=\"busy\" :aria-busy=\"busy\" @click=\"removeAccess\">{{ busy ? \"Intrekken…\" : \"Intrekken\" }}</button>\n      </template>\n    </AppDialog>\n  </section>\n</template>\n\n<style scoped>\n.organization-users__heading { margin: 28px 0 12px; font-size: 18px; }\n.organization-users__table { overflow-x: auto; }\n.organization-users__caption { padding: 12px 16px; text-align: left; color: var(--hh-fg-muted); font-size: 14px; }\n.organization-users__email { overflow-wrap: anywhere; }\n.organization-users__actions { display: flex; justify-content: flex-end; flex-wrap: wrap; gap: 8px; }\n.organization-users__managed, .organization-users__role { color: var(--hh-fg-muted); font-size: 14px; }\n.organization-users__role { margin: 0; }\n.organization-users__form :deep(.field__label), .organization-users__form :deep(.field__hint), .organization-users__form :deep(.field__error) { font-size: 14px; }\n.organization-users__error { display: flex; align-items: center; flex-wrap: wrap; gap: 12px; margin-bottom: 16px; }\n.organization-users__error .hh-formerror { margin: 0; }\n.organization-users__skeleton { padding: 16px; }\n.organization-users__skeleton-row { height: 20px; margin: 8px 0; border-radius: var(--hh-radius); background: var(--hh-surface-2); }\n.organization-users__sr { position: absolute; width: 1px; height: 1px; padding: 0; overflow: hidden; clip-path: inset(50%); }\n</style>\n","import { createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, renderList as _renderList, Fragment as _Fragment, vModelText as _vModelText, normalizeClass as _normalizeClass, withDirectives as _withDirectives, withCtx as _withCtx, createVNode as _createVNode, vModelSelect as _vModelSelect, withModifiers as _withModifiers, createBlock as _createBlock, createTextVNode as _createTextVNode } from \"vue\"\n\nconst _hoisted_1 = { class: \"organization-users\" }\nconst _hoisted_2 = { class: \"hh-page__bar\" }\nconst _hoisted_3 = [\"disabled\"]\nconst _hoisted_4 = {\n  key: 0,\n  class: \"organization-users__error\",\n  role: \"alert\"\n}\nconst _hoisted_5 = { class: \"hh-formerror\" }\nconst _hoisted_6 = [\"disabled\"]\nconst _hoisted_7 = {\n  key: 1,\n  class: \"hh-formerror\",\n  role: \"alert\"\n}\nconst _hoisted_8 = [\"aria-busy\"]\nconst _hoisted_9 = {\n  key: 0,\n  class: \"organization-users__skeleton\",\n  role: \"status\",\n  \"aria-label\": \"Gebruikers laden\"\n}\nconst _hoisted_10 = {\n  key: 1,\n  class: \"hh-empty\"\n}\nconst _hoisted_11 = {\n  key: 2,\n  class: \"hh-table\"\n}\nconst _hoisted_12 = [\"data-member-id\"]\nconst _hoisted_13 = { class: \"organization-users__email\" }\nconst _hoisted_14 = {\n  key: 0,\n  class: \"organization-users__actions\"\n}\nconst _hoisted_15 = [\"disabled\", \"aria-label\", \"onClick\"]\nconst _hoisted_16 = [\"disabled\", \"aria-label\", \"onClick\"]\nconst _hoisted_17 = {\n  key: 1,\n  class: \"organization-users__managed\"\n}\nconst _hoisted_18 = [\"aria-busy\"]\nconst _hoisted_19 = {\n  key: 0,\n  class: \"organization-users__skeleton\",\n  role: \"status\",\n  \"aria-label\": \"Uitnodigingen laden\"\n}\nconst _hoisted_20 = {\n  key: 1,\n  class: \"hh-empty\"\n}\nconst _hoisted_21 = {\n  key: 2,\n  class: \"hh-table\"\n}\nconst _hoisted_22 = { class: \"organization-users__email\" }\nconst _hoisted_23 = { class: \"organization-users__actions\" }\nconst _hoisted_24 = [\"disabled\", \"aria-label\", \"onClick\"]\nconst _hoisted_25 = [\"disabled\", \"aria-label\", \"onClick\"]\nconst _hoisted_26 = {\n  key: 0,\n  class: \"hh-formerror\",\n  role: \"alert\"\n}\nconst _hoisted_27 = [\"disabled\", \"aria-invalid\"]\nconst _hoisted_28 = [\"disabled\", \"aria-invalid\"]\nconst _hoisted_29 = [\"disabled\"]\nconst _hoisted_30 = { class: \"organization-users__role\" }\nconst _hoisted_31 = [\"disabled\"]\nconst _hoisted_32 = [\"disabled\", \"aria-busy\"]\nconst _hoisted_33 = {\n  key: 0,\n  class: \"hh-formerror\",\n  role: \"alert\"\n}\nconst _hoisted_34 = [\"disabled\"]\nconst _hoisted_35 = { class: \"organization-users__role\" }\nconst _hoisted_36 = [\"disabled\"]\nconst _hoisted_37 = [\"disabled\", \"aria-busy\"]\nconst _hoisted_38 = { key: 0 }\nconst _hoisted_39 = { key: 1 }\nconst _hoisted_40 = {\n  key: 2,\n  class: \"hh-formerror\",\n  role: \"alert\"\n}\nconst _hoisted_41 = [\"disabled\"]\nconst _hoisted_42 = [\"disabled\", \"aria-busy\"]\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return (_openBlock(), _createElementBlock(\"section\", _hoisted_1, [\n    _createElementVNode(\"div\", _hoisted_2, [\n      _cache[4] || (_cache[4] = _createElementVNode(\"h1\", { class: \"hh-page__title\" }, \"Gebruikers\", -1 /* CACHED */)),\n      _createElementVNode(\"button\", {\n        type: \"button\",\n        class: \"hh-btn hh-btn--primary\",\n        disabled: $setup.busy,\n        onClick: $setup.openInvite\n      }, \"+ Gebruiker uitnodigen\", 8 /* PROPS */, _hoisted_3)\n    ]),\n    ($setup.loadError)\n      ? (_openBlock(), _createElementBlock(\"div\", _hoisted_4, [\n          _createElementVNode(\"p\", _hoisted_5, _toDisplayString($setup.loadError), 1 /* TEXT */),\n          _createElementVNode(\"button\", {\n            type: \"button\",\n            class: \"hh-btn\",\n            disabled: $setup.loading || $setup.busy,\n            onClick: $setup.load\n          }, \"Opnieuw proberen\", 8 /* PROPS */, _hoisted_6)\n        ]))\n      : _createCommentVNode(\"v-if\", true),\n    ($setup.actionError && !$setup.dialog)\n      ? (_openBlock(), _createElementBlock(\"p\", _hoisted_7, _toDisplayString($setup.actionError), 1 /* TEXT */))\n      : _createCommentVNode(\"v-if\", true),\n    _createElementVNode(\"div\", {\n      class: \"hh-card organization-users__table\",\n      \"aria-busy\": $setup.loading\n    }, [\n      (!$setup.loaded && $setup.loading)\n        ? (_openBlock(), _createElementBlock(\"div\", _hoisted_9, [\n            (_openBlock(), _createElementBlock(_Fragment, null, _renderList(3, (index) => {\n              return _createElementVNode(\"div\", {\n                key: index,\n                class: \"organization-users__skeleton-row\"\n              })\n            }), 64 /* STABLE_FRAGMENT */))\n          ]))\n        : ($setup.loaded && !$setup.members.length)\n          ? (_openBlock(), _createElementBlock(\"p\", _hoisted_10, \"Nog geen gebruikers.\"))\n          : ($setup.loaded)\n            ? (_openBlock(), _createElementBlock(\"table\", _hoisted_11, [\n                _cache[5] || (_cache[5] = _createElementVNode(\"caption\", { class: \"organization-users__caption\" }, \"Gebruikers met toegang tot deze administratie\", -1 /* CACHED */)),\n                _cache[6] || (_cache[6] = _createElementVNode(\"thead\", null, [\n                  _createElementVNode(\"tr\", null, [\n                    _createElementVNode(\"th\", null, \"Naam\"),\n                    _createElementVNode(\"th\", null, \"E-mail\"),\n                    _createElementVNode(\"th\", null, \"Rol\"),\n                    _createElementVNode(\"th\", null, \"Status\"),\n                    _createElementVNode(\"th\", null, [\n                      _createElementVNode(\"span\", { class: \"organization-users__sr\" }, \"Acties\")\n                    ])\n                  ])\n                ], -1 /* CACHED */)),\n                _createElementVNode(\"tbody\", null, [\n                  (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.members, (member) => {\n                    return (_openBlock(), _createElementBlock(\"tr\", {\n                      key: member.id,\n                      \"data-member-id\": member.id\n                    }, [\n                      _createElementVNode(\"td\", null, _toDisplayString(member.name || \"Naam niet ingevuld\"), 1 /* TEXT */),\n                      _createElementVNode(\"td\", _hoisted_13, _toDisplayString(member.email), 1 /* TEXT */),\n                      _createElementVNode(\"td\", null, _toDisplayString($setup.roleLabel(member.role)), 1 /* TEXT */),\n                      _createElementVNode(\"td\", null, _toDisplayString(member.active ? \"Actief\" : \"Niet actief\"), 1 /* TEXT */),\n                      _createElementVNode(\"td\", null, [\n                        (member.managed)\n                          ? (_openBlock(), _createElementBlock(\"div\", _hoisted_14, [\n                              _createElementVNode(\"button\", {\n                                type: \"button\",\n                                class: \"hh-btn hh-btn--small\",\n                                disabled: $setup.busy,\n                                \"aria-label\": `Rol wijzigen van ${member.name || member.email}`,\n                                onClick: $event => ($setup.openRole(member))\n                              }, \"Rol wijzigen\", 8 /* PROPS */, _hoisted_15),\n                              _createElementVNode(\"button\", {\n                                type: \"button\",\n                                class: \"hh-btn hh-btn--small hh-btn--danger\",\n                                disabled: $setup.busy,\n                                \"aria-label\": `Toegang intrekken van ${member.name || member.email}`,\n                                onClick: $event => ($setup.confirmMemberRemoval(member))\n                              }, \"Toegang intrekken\", 8 /* PROPS */, _hoisted_16)\n                            ]))\n                          : (_openBlock(), _createElementBlock(\"span\", _hoisted_17, _toDisplayString(member.reason || \"Deze toegang wordt beheerd in WebHare.\"), 1 /* TEXT */))\n                      ])\n                    ], 8 /* PROPS */, _hoisted_12))\n                  }), 128 /* KEYED_FRAGMENT */))\n                ])\n              ]))\n            : _createCommentVNode(\"v-if\", true)\n    ], 8 /* PROPS */, _hoisted_8),\n    _cache[15] || (_cache[15] = _createElementVNode(\"h2\", { class: \"organization-users__heading\" }, \"Uitnodigingen\", -1 /* CACHED */)),\n    _createElementVNode(\"div\", {\n      class: \"hh-card organization-users__table\",\n      \"aria-busy\": $setup.loading\n    }, [\n      (!$setup.loaded && $setup.loading)\n        ? (_openBlock(), _createElementBlock(\"div\", _hoisted_19, _cache[7] || (_cache[7] = [\n            _createElementVNode(\"div\", { class: \"organization-users__skeleton-row\" }, null, -1 /* CACHED */)\n          ])))\n        : ($setup.loaded && !$setup.invitations.length)\n          ? (_openBlock(), _createElementBlock(\"p\", _hoisted_20, \"Geen openstaande uitnodigingen.\"))\n          : ($setup.loaded)\n            ? (_openBlock(), _createElementBlock(\"table\", _hoisted_21, [\n                _cache[8] || (_cache[8] = _createElementVNode(\"thead\", null, [\n                  _createElementVNode(\"tr\", null, [\n                    _createElementVNode(\"th\", null, \"Naam\"),\n                    _createElementVNode(\"th\", null, \"E-mail\"),\n                    _createElementVNode(\"th\", null, \"Rol\"),\n                    _createElementVNode(\"th\", null, \"Status\"),\n                    _createElementVNode(\"th\", null, [\n                      _createElementVNode(\"span\", { class: \"organization-users__sr\" }, \"Acties\")\n                    ])\n                  ])\n                ], -1 /* CACHED */)),\n                _createElementVNode(\"tbody\", null, [\n                  (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.invitations, (invitation) => {\n                    return (_openBlock(), _createElementBlock(\"tr\", {\n                      key: invitation.id\n                    }, [\n                      _createElementVNode(\"td\", null, _toDisplayString(invitation.name || \"Naam niet ingevuld\"), 1 /* TEXT */),\n                      _createElementVNode(\"td\", _hoisted_22, _toDisplayString(invitation.email), 1 /* TEXT */),\n                      _createElementVNode(\"td\", null, _toDisplayString($setup.roleLabel(invitation.role)), 1 /* TEXT */),\n                      _createElementVNode(\"td\", null, _toDisplayString(invitation.expired ? \"Verlopen op\" : \"Geldig tot\") + \" \" + _toDisplayString($setup.expiresLabel(invitation.expiresAt)), 1 /* TEXT */),\n                      _createElementVNode(\"td\", null, [\n                        _createElementVNode(\"div\", _hoisted_23, [\n                          _createElementVNode(\"button\", {\n                            type: \"button\",\n                            class: \"hh-btn hh-btn--small\",\n                            disabled: $setup.busy,\n                            \"aria-label\": `Uitnodiging opnieuw versturen aan ${invitation.email}`,\n                            onClick: $event => ($setup.resendInvitation(invitation))\n                          }, \"Opnieuw versturen\", 8 /* PROPS */, _hoisted_24),\n                          _createElementVNode(\"button\", {\n                            type: \"button\",\n                            class: \"hh-btn hh-btn--small hh-btn--danger\",\n                            disabled: $setup.busy,\n                            \"aria-label\": `Uitnodiging intrekken voor ${invitation.email}`,\n                            onClick: $event => ($setup.confirmInvitationRemoval(invitation))\n                          }, \"Intrekken\", 8 /* PROPS */, _hoisted_25)\n                        ])\n                      ])\n                    ]))\n                  }), 128 /* KEYED_FRAGMENT */))\n                ])\n              ]))\n            : _createCommentVNode(\"v-if\", true)\n    ], 8 /* PROPS */, _hoisted_18),\n    ($setup.dialog === 'invite')\n      ? (_openBlock(), _createBlock($setup[\"AppDialog\"], {\n          key: 2,\n          title: \"Gebruiker uitnodigen\",\n          onClose: $setup.closeDialog\n        }, {\n          footer: _withCtx(() => [\n            _createElementVNode(\"button\", {\n              type: \"button\",\n              class: \"hh-btn\",\n              disabled: $setup.busy,\n              onClick: $setup.closeDialog\n            }, \"Annuleren\", 8 /* PROPS */, _hoisted_31),\n            _createElementVNode(\"button\", {\n              type: \"submit\",\n              form: \"organization-invite\",\n              class: \"hh-btn hh-btn--primary\",\n              disabled: $setup.busy,\n              \"aria-busy\": $setup.busy\n            }, _toDisplayString($setup.busy ? \"Uitnodiging versturen…\" : \"Uitnodiging versturen\"), 9 /* TEXT, PROPS */, _hoisted_32)\n          ]),\n          default: _withCtx(() => [\n            _createElementVNode(\"form\", {\n              id: \"organization-invite\",\n              class: \"organization-users__form\",\n              novalidate: \"\",\n              onSubmit: _withModifiers($setup.submitInvitation, [\"prevent\"])\n            }, [\n              ($setup.actionError)\n                ? (_openBlock(), _createElementBlock(\"p\", _hoisted_26, _toDisplayString($setup.actionError), 1 /* TEXT */))\n                : _createCommentVNode(\"v-if\", true),\n              _createVNode($setup[\"FormField\"], {\n                label: \"E-mail\",\n                \"for-id\": \"organization-invite-email\",\n                error: $setup.fieldErrors.email,\n                required: \"\"\n              }, {\n                default: _withCtx(() => [\n                  _withDirectives(_createElementVNode(\"input\", {\n                    id: \"organization-invite-email\",\n                    ref: \"emailInput\",\n                    \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => (($setup.form.email) = $event)),\n                    \"data-autofocus\": \"\",\n                    class: _normalizeClass([\"hh-input\", { 'hh-input--error': $setup.fieldErrors.email }]),\n                    type: \"email\",\n                    autocomplete: \"email\",\n                    maxlength: \"254\",\n                    disabled: $setup.busy,\n                    \"aria-invalid\": Boolean($setup.fieldErrors.email)\n                  }, null, 10 /* CLASS, PROPS */, _hoisted_27), [\n                    [_vModelText, $setup.form.email]\n                  ])\n                ]),\n                _: 1 /* STABLE */\n              }, 8 /* PROPS */, [\"error\"]),\n              _createVNode($setup[\"FormField\"], {\n                label: \"Naam\",\n                \"for-id\": \"organization-invite-name\",\n                hint: \"Optioneel. Bestaande accounts behouden hun naam.\",\n                error: $setup.fieldErrors.name\n              }, {\n                default: _withCtx(() => [\n                  _withDirectives(_createElementVNode(\"input\", {\n                    id: \"organization-invite-name\",\n                    ref: \"nameInput\",\n                    \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => (($setup.form.name) = $event)),\n                    class: _normalizeClass([\"hh-input\", { 'hh-input--error': $setup.fieldErrors.name }]),\n                    autocomplete: \"name\",\n                    maxlength: \"250\",\n                    disabled: $setup.busy,\n                    \"aria-invalid\": Boolean($setup.fieldErrors.name)\n                  }, null, 10 /* CLASS, PROPS */, _hoisted_28), [\n                    [_vModelText, $setup.form.name]\n                  ])\n                ]),\n                _: 1 /* STABLE */\n              }, 8 /* PROPS */, [\"error\"]),\n              _createVNode($setup[\"FormField\"], {\n                label: \"Rol\",\n                \"for-id\": \"organization-invite-role\"\n              }, {\n                default: _withCtx(() => [\n                  _withDirectives(_createElementVNode(\"select\", {\n                    id: \"organization-invite-role\",\n                    \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => (($setup.form.role) = $event)),\n                    class: \"hh-select\",\n                    disabled: $setup.busy\n                  }, _cache[9] || (_cache[9] = [\n                    _createElementVNode(\"option\", { value: \"bookkeeper\" }, \"Boekhouder\", -1 /* CACHED */),\n                    _createElementVNode(\"option\", { value: \"admin\" }, \"Beheerder\", -1 /* CACHED */)\n                  ]), 8 /* PROPS */, _hoisted_29), [\n                    [_vModelSelect, $setup.form.role]\n                  ])\n                ]),\n                _: 1 /* STABLE */\n              }),\n              _createElementVNode(\"p\", _hoisted_30, _toDisplayString($setup.form.role === \"admin\" ? \"Beheert de administratie, instellingen en gebruikers.\" : \"Werkt met uren, facturen en de dagelijkse administratie.\"), 1 /* TEXT */)\n            ], 32 /* NEED_HYDRATION */)\n          ]),\n          _: 1 /* STABLE */\n        }))\n      : _createCommentVNode(\"v-if\", true),\n    ($setup.dialog === 'role' && $setup.selectedMember)\n      ? (_openBlock(), _createBlock($setup[\"AppDialog\"], {\n          key: 3,\n          title: \"Rol wijzigen\",\n          onClose: $setup.closeDialog\n        }, {\n          footer: _withCtx(() => [\n            _createElementVNode(\"button\", {\n              type: \"button\",\n              class: \"hh-btn\",\n              disabled: $setup.busy,\n              onClick: $setup.closeDialog\n            }, \"Annuleren\", 8 /* PROPS */, _hoisted_36),\n            _createElementVNode(\"button\", {\n              type: \"submit\",\n              form: \"organization-role\",\n              class: \"hh-btn hh-btn--primary\",\n              disabled: $setup.busy,\n              \"aria-busy\": $setup.busy\n            }, _toDisplayString($setup.busy ? \"Opslaan…\" : \"Opslaan\"), 9 /* TEXT, PROPS */, _hoisted_37)\n          ]),\n          default: _withCtx(() => [\n            _createElementVNode(\"form\", {\n              id: \"organization-role\",\n              class: \"organization-users__form\",\n              onSubmit: _withModifiers($setup.submitRole, [\"prevent\"])\n            }, [\n              _createElementVNode(\"p\", null, _toDisplayString($setup.selectedMember.name || $setup.selectedMember.email), 1 /* TEXT */),\n              ($setup.actionError)\n                ? (_openBlock(), _createElementBlock(\"p\", _hoisted_33, _toDisplayString($setup.actionError), 1 /* TEXT */))\n                : _createCommentVNode(\"v-if\", true),\n              _createVNode($setup[\"FormField\"], {\n                label: \"Rol\",\n                \"for-id\": \"organization-member-role\"\n              }, {\n                default: _withCtx(() => [\n                  _withDirectives(_createElementVNode(\"select\", {\n                    id: \"organization-member-role\",\n                    \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => (($setup.form.role) = $event)),\n                    class: \"hh-select\",\n                    \"data-autofocus\": \"\",\n                    disabled: $setup.busy\n                  }, _cache[10] || (_cache[10] = [\n                    _createElementVNode(\"option\", { value: \"bookkeeper\" }, \"Boekhouder\", -1 /* CACHED */),\n                    _createElementVNode(\"option\", { value: \"admin\" }, \"Beheerder\", -1 /* CACHED */)\n                  ]), 8 /* PROPS */, _hoisted_34), [\n                    [_vModelSelect, $setup.form.role]\n                  ])\n                ]),\n                _: 1 /* STABLE */\n              }),\n              _createElementVNode(\"p\", _hoisted_35, _toDisplayString($setup.form.role === \"admin\" ? \"Beheert de administratie, instellingen en gebruikers.\" : \"Werkt met uren, facturen en de dagelijkse administratie.\"), 1 /* TEXT */)\n            ], 32 /* NEED_HYDRATION */)\n          ]),\n          _: 1 /* STABLE */\n        }))\n      : _createCommentVNode(\"v-if\", true),\n    ($setup.dialog === 'member-delete' || $setup.dialog === 'invitation-delete')\n      ? (_openBlock(), _createBlock($setup[\"AppDialog\"], {\n          key: 4,\n          title: $setup.dialog === 'member-delete' ? 'Toegang intrekken' : 'Uitnodiging intrekken',\n          onClose: $setup.closeDialog\n        }, {\n          footer: _withCtx(() => [\n            _createElementVNode(\"button\", {\n              type: \"button\",\n              class: \"hh-btn\",\n              disabled: $setup.busy,\n              onClick: $setup.closeDialog\n            }, \"Annuleren\", 8 /* PROPS */, _hoisted_41),\n            _createElementVNode(\"button\", {\n              type: \"button\",\n              class: \"hh-btn hh-btn--danger\",\n              disabled: $setup.busy,\n              \"aria-busy\": $setup.busy,\n              onClick: $setup.removeAccess\n            }, _toDisplayString($setup.busy ? \"Intrekken…\" : \"Intrekken\"), 9 /* TEXT, PROPS */, _hoisted_42)\n          ]),\n          default: _withCtx(() => [\n            ($setup.dialog === 'member-delete')\n              ? (_openBlock(), _createElementBlock(\"p\", _hoisted_38, [\n                  _cache[11] || (_cache[11] = _createTextVNode(\"Wil je de toegang van \", -1 /* CACHED */)),\n                  _createElementVNode(\"strong\", null, _toDisplayString($setup.selectedMember?.name || $setup.selectedMember?.email), 1 /* TEXT */),\n                  _cache[12] || (_cache[12] = _createTextVNode(\" tot deze administratie intrekken? Het account en de geboekte uren blijven bewaard.\", -1 /* CACHED */))\n                ]))\n              : (_openBlock(), _createElementBlock(\"p\", _hoisted_39, [\n                  _cache[13] || (_cache[13] = _createTextVNode(\"Wil je de uitnodiging voor \", -1 /* CACHED */)),\n                  _createElementVNode(\"strong\", null, _toDisplayString($setup.selectedInvitation?.email), 1 /* TEXT */),\n                  _cache[14] || (_cache[14] = _createTextVNode(\" intrekken? De uitnodigingslink werkt daarna niet meer.\", -1 /* CACHED */))\n                ])),\n            ($setup.actionError)\n              ? (_openBlock(), _createElementBlock(\"p\", _hoisted_40, _toDisplayString($setup.actionError), 1 /* TEXT */))\n              : _createCommentVNode(\"v-if\", true)\n          ]),\n          _: 1 /* STABLE */\n        }, 8 /* PROPS */, [\"title\"]))\n      : _createCommentVNode(\"v-if\", true)\n  ]))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/OrganizationUsersView.vue?type=script\";import \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/OrganizationUsersView.vue?type=style&index=0\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/OrganizationUsersView.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/OrganizationUsersView.vue\";script.__scopeId = \"data-v-2eac84b0\";export default script;","<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, ref, watch } from \"vue\";\nimport { useRoute } from \"vue-router\";\nimport { rpc, type OmitRPCContextArgs } from \"@webhare/rpc\";\nimport type { HappyAuthRPC } from \"@mod-happy/js/auth-rpc\";\nimport { rpcErrorMessage } from \"../lib/rpcError\";\nimport { logout } from \"../lib/runtime\";\n\nconst api = rpc<OmitRPCContextArgs<typeof HappyAuthRPC>>(\"happy:auth\");\nconst route = useRoute();\nconst invitation = ref<Awaited<ReturnType<typeof api.getOrganizationInvitation>>>(null);\nconst loading = ref(true);\nconst busy = ref(false);\nconst error = ref(\"\");\nconst differentAccount = computed(() => {\n  const current = invitation.value;\n  return current?.currentEmail != null && current.currentEmail.toLowerCase() !== current.email.toLowerCase();\n});\nlet disposed = false;\nlet requestVersion = 0;\nonBeforeUnmount(() => { disposed = true; requestVersion++; });\n\nfunction invitationInput(): { organization: string; token: string } {\n  return { organization: String(route.params.organization ?? \"\"), token: String(route.params.token ?? \"\") };\n}\n\nasync function load(): Promise<void> {\n  const version = ++requestVersion;\n  invitation.value = null;\n  error.value = \"\";\n  loading.value = true;\n  busy.value = false;\n  try {\n    const result = await api.getOrganizationInvitation(invitationInput());\n    if (!disposed && version === requestVersion) invitation.value = result;\n  } catch {\n    if (!disposed && version === requestVersion) error.value = \"De uitnodiging kon niet worden geladen. Probeer het opnieuw.\";\n  } finally {\n    if (!disposed && version === requestVersion) loading.value = false;\n  }\n}\n\nasync function accept(): Promise<void> {\n  if (busy.value || !invitation.value || differentAccount.value || disposed) return;\n  const version = requestVersion;\n  busy.value = true;\n  error.value = \"\";\n  try {\n    const result = await api.acceptOrganizationInvitation(invitationInput());\n    if (!disposed && version === requestVersion) window.location.assign(result.redirectUrl);\n  } catch (err) {\n    if (!disposed && version === requestVersion) error.value = rpcErrorMessage(err instanceof Error ? err.message : \"De uitnodiging kon niet worden geaccepteerd. Probeer het opnieuw.\");\n  } finally {\n    if (!disposed && version === requestVersion) busy.value = false;\n  }\n}\n\nasync function signOut(): Promise<void> {\n  if (busy.value || !differentAccount.value || disposed) return;\n  const version = requestVersion;\n  busy.value = true;\n  error.value = \"\";\n  try {\n    await logout();\n    if (!disposed && version === requestVersion) {\n      // Native logout reloads this invitation URL; never re-enable its previous account response.\n      requestVersion++;\n      invitation.value = null;\n      loading.value = true;\n    }\n  } catch {\n    if (!disposed && version === requestVersion) {\n      error.value = \"Uitloggen is niet gelukt. Probeer het opnieuw.\";\n      busy.value = false;\n    }\n  }\n}\n\nwatch(() => [route.params.organization, route.params.token], load, { immediate: true });\n</script>\n\n<template>\n  <main class=\"invitation\">\n    <section class=\"hh-card invitation__card\" :aria-busy=\"loading || busy\">\n      <span class=\"invitation__brand\">Happy Hours</span>\n      <h1 class=\"invitation__title\">Uitnodiging</h1>\n      <p v-if=\"loading\" role=\"status\">Uitnodiging laden…</p>\n      <template v-else-if=\"invitation\">\n        <p>Je bent uitgenodigd voor <strong>{{ invitation.organizationTitle }}</strong>.</p>\n        <dl class=\"invitation__details\"><dt>E-mail</dt><dd>{{ invitation.email }}</dd><dt>Rol</dt><dd>{{ invitation.role === \"admin\" ? \"Beheerder\" : \"Boekhouder\" }}</dd></dl>\n        <p v-if=\"error\" class=\"hh-formerror\" role=\"alert\">{{ error }}</p>\n        <template v-if=\"differentAccount\">\n          <p role=\"alert\">Je bent ingelogd {{ invitation.currentEmail ? `als ${invitation.currentEmail}` : \"met een ander account\" }}. Deze uitnodiging is voor <strong>{{ invitation.email }}</strong>.</p>\n          <button type=\"button\" class=\"hh-btn hh-btn--primary invitation__accept\" :disabled=\"busy\" :aria-busy=\"busy\" @click=\"signOut\">{{ busy ? \"Uitloggen…\" : \"Uitloggen en doorgaan\" }}</button>\n        </template>\n        <button v-else type=\"button\" class=\"hh-btn hh-btn--primary invitation__accept\" data-accept-invitation :disabled=\"busy\" :aria-busy=\"busy\" @click=\"accept\">{{ busy ? \"Uitnodiging accepteren…\" : \"Uitnodiging accepteren\" }}</button>\n      </template>\n      <template v-else-if=\"error\">\n        <p class=\"hh-formerror\" role=\"alert\">{{ error }}</p>\n        <button type=\"button\" class=\"hh-btn\" @click=\"load\">Opnieuw proberen</button>\n      </template>\n      <template v-else>\n        <p>Deze uitnodiging is niet meer geldig. Vraag de beheerder om een nieuwe uitnodiging.</p>\n        <a class=\"hh-btn invitation__link\" href=\"#/\">Naar inloggen</a>\n      </template>\n    </section>\n  </main>\n</template>\n\n<style scoped>\n.invitation { display: grid; min-height: 100dvh; place-items: center; padding: 24px; }\n.invitation__card { width: 100%; max-width: 460px; padding: 28px; overflow-wrap: anywhere; }\n.invitation__brand { color: var(--hh-accent); font-size: 18px; font-weight: 700; }\n.invitation__title { margin: 16px 0; font-size: 24px; }\n.invitation__details { display: grid; grid-template-columns: auto 1fr; gap: 10px 16px; margin: 24px 0; }\n.invitation__details dt { color: var(--hh-fg-muted); }\n.invitation__details dd { margin: 0; }\n.invitation__accept { width: 100%; }\n.invitation__link { text-decoration: none; cursor: pointer; }\n</style>\n","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, Fragment as _Fragment } from \"vue\"\n\nconst _hoisted_1 = { class: \"invitation\" }\nconst _hoisted_2 = [\"aria-busy\"]\nconst _hoisted_3 = {\n  key: 0,\n  role: \"status\"\n}\nconst _hoisted_4 = { class: \"invitation__details\" }\nconst _hoisted_5 = {\n  key: 0,\n  class: \"hh-formerror\",\n  role: \"alert\"\n}\nconst _hoisted_6 = { role: \"alert\" }\nconst _hoisted_7 = [\"disabled\", \"aria-busy\"]\nconst _hoisted_8 = [\"disabled\", \"aria-busy\"]\nconst _hoisted_9 = {\n  class: \"hh-formerror\",\n  role: \"alert\"\n}\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return (_openBlock(), _createElementBlock(\"main\", _hoisted_1, [\n    _createElementVNode(\"section\", {\n      class: \"hh-card invitation__card\",\n      \"aria-busy\": $setup.loading || $setup.busy\n    }, [\n      _cache[7] || (_cache[7] = _createElementVNode(\"span\", { class: \"invitation__brand\" }, \"Happy Hours\", -1 /* CACHED */)),\n      _cache[8] || (_cache[8] = _createElementVNode(\"h1\", { class: \"invitation__title\" }, \"Uitnodiging\", -1 /* CACHED */)),\n      ($setup.loading)\n        ? (_openBlock(), _createElementBlock(\"p\", _hoisted_3, \"Uitnodiging laden…\"))\n        : ($setup.invitation)\n          ? (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n              _createElementVNode(\"p\", null, [\n                _cache[0] || (_cache[0] = _createTextVNode(\"Je bent uitgenodigd voor \", -1 /* CACHED */)),\n                _createElementVNode(\"strong\", null, _toDisplayString($setup.invitation.organizationTitle), 1 /* TEXT */),\n                _cache[1] || (_cache[1] = _createTextVNode(\".\", -1 /* CACHED */))\n              ]),\n              _createElementVNode(\"dl\", _hoisted_4, [\n                _cache[2] || (_cache[2] = _createElementVNode(\"dt\", null, \"E-mail\", -1 /* CACHED */)),\n                _createElementVNode(\"dd\", null, _toDisplayString($setup.invitation.email), 1 /* TEXT */),\n                _cache[3] || (_cache[3] = _createElementVNode(\"dt\", null, \"Rol\", -1 /* CACHED */)),\n                _createElementVNode(\"dd\", null, _toDisplayString($setup.invitation.role === \"admin\" ? \"Beheerder\" : \"Boekhouder\"), 1 /* TEXT */)\n              ]),\n              ($setup.error)\n                ? (_openBlock(), _createElementBlock(\"p\", _hoisted_5, _toDisplayString($setup.error), 1 /* TEXT */))\n                : _createCommentVNode(\"v-if\", true),\n              ($setup.differentAccount)\n                ? (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n                    _createElementVNode(\"p\", _hoisted_6, [\n                      _createTextVNode(\"Je bent ingelogd \" + _toDisplayString($setup.invitation.currentEmail ? `als ${$setup.invitation.currentEmail}` : \"met een ander account\") + \". Deze uitnodiging is voor \", 1 /* TEXT */),\n                      _createElementVNode(\"strong\", null, _toDisplayString($setup.invitation.email), 1 /* TEXT */),\n                      _cache[4] || (_cache[4] = _createTextVNode(\".\", -1 /* CACHED */))\n                    ]),\n                    _createElementVNode(\"button\", {\n                      type: \"button\",\n                      class: \"hh-btn hh-btn--primary invitation__accept\",\n                      disabled: $setup.busy,\n                      \"aria-busy\": $setup.busy,\n                      onClick: $setup.signOut\n                    }, _toDisplayString($setup.busy ? \"Uitloggen…\" : \"Uitloggen en doorgaan\"), 9 /* TEXT, PROPS */, _hoisted_7)\n                  ], 64 /* STABLE_FRAGMENT */))\n                : (_openBlock(), _createElementBlock(\"button\", {\n                    key: 2,\n                    type: \"button\",\n                    class: \"hh-btn hh-btn--primary invitation__accept\",\n                    \"data-accept-invitation\": \"\",\n                    disabled: $setup.busy,\n                    \"aria-busy\": $setup.busy,\n                    onClick: $setup.accept\n                  }, _toDisplayString($setup.busy ? \"Uitnodiging accepteren…\" : \"Uitnodiging accepteren\"), 9 /* TEXT, PROPS */, _hoisted_8))\n            ], 64 /* STABLE_FRAGMENT */))\n          : ($setup.error)\n            ? (_openBlock(), _createElementBlock(_Fragment, { key: 2 }, [\n                _createElementVNode(\"p\", _hoisted_9, _toDisplayString($setup.error), 1 /* TEXT */),\n                _createElementVNode(\"button\", {\n                  type: \"button\",\n                  class: \"hh-btn\",\n                  onClick: $setup.load\n                }, \"Opnieuw proberen\")\n              ], 64 /* STABLE_FRAGMENT */))\n            : (_openBlock(), _createElementBlock(_Fragment, { key: 3 }, [\n                _cache[5] || (_cache[5] = _createElementVNode(\"p\", null, \"Deze uitnodiging is niet meer geldig. Vraag de beheerder om een nieuwe uitnodiging.\", -1 /* CACHED */)),\n                _cache[6] || (_cache[6] = _createElementVNode(\"a\", {\n                  class: \"hh-btn invitation__link\",\n                  href: \"#/\"\n                }, \"Naar inloggen\", -1 /* CACHED */))\n              ], 64 /* STABLE_FRAGMENT */))\n    ], 8 /* PROPS */, _hoisted_2)\n  ]))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/InvitationView.vue?type=script\";import \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/InvitationView.vue?type=style&index=0\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/InvitationView.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/InvitationView.vue\";script.__scopeId = \"data-v-deefd886\";export default script;","import type { WidgetInstance, WidgetSize, WidgetType } from \"./types\";\n\n// Register van alle beschikbare widgets: titel + omschrijving (voor de widget-\n// kiezer) en standaardgrootte. Puur/testbaar; de Vue-componentmapping leeft apart\n// in DashboardGrid.vue. Een nieuwe widget pluggt hier + in de componentmap in.\n\nexport interface WidgetMeta {\n  title: string;\n  description: string;\n  defaultSize: WidgetSize;\n}\n\nexport const WIDGETS: Record<WidgetType, WidgetMeta> = {\n  \"hours-week\": { title: \"Uren deze week\", description: \"Totaal geboekte uren in de huidige week.\", defaultSize: \"s\" },\n  \"outstanding-total\": { title: \"Openstaand totaal\", description: \"Totaal nog te ontvangen factuurbedrag (incl. btw).\", defaultSize: \"s\" },\n  \"revenue-ytd\": { title: \"Omzet dit boekjaar\", description: \"Gefactureerd bedrag (excl. btw) dit boekjaar.\", defaultSize: \"s\" },\n  wip: { title: \"Onderhanden werk\", description: \"Geboekte, nog niet gefactureerde uren en verschotten.\", defaultSize: \"s\" },\n  \"vat-quarter\": { title: \"BTW dit kwartaal\", description: \"Verschuldigde btw over de facturen van dit kwartaal.\", defaultSize: \"s\" },\n  customers: { title: \"Actieve klanten\", description: \"Aantal niet-gearchiveerde klanten.\", defaultSize: \"s\" },\n  dso: { title: \"Gem. betaaltermijn\", description: \"Gemiddeld aantal dagen tussen factuur en betaling.\", defaultSize: \"s\" },\n  \"to-declare\": { title: \"Nog te declareren\", description: \"Grootste openstaande bedragen per klant.\", defaultSize: \"l\" },\n  \"recent-entries\": { title: \"Recente boekingen\", description: \"De laatst ingevoerde urenregels.\", defaultSize: \"l\" },\n  \"revenue-chart\": { title: \"Omzet per maand\", description: \"Gefactureerde omzet per maand in dit boekjaar.\", defaultSize: \"l\" },\n  aging: { title: \"Ouderdomsanalyse\", description: \"Openstaande debiteuren ingedeeld naar ouderdom.\", defaultSize: \"l\" },\n  debtors: { title: \"Debiteuren\", description: \"Openstaand bedrag per klant.\", defaultSize: \"s\" },\n  \"hours-employee\": { title: \"Uren per werknemer\", description: \"Geboekte uren per werknemer dit boekjaar.\", defaultSize: \"s\" },\n  budget: { title: \"Budgetbewaking\", description: \"Bestede bedragen versus budget per klant.\", defaultSize: \"l\" },\n  \"quick-actions\": { title: \"Snelacties\", description: \"Snelkoppelingen naar veelgebruikte handelingen.\", defaultSize: \"s\" },\n};\n\n// Vaste weergavevolgorde in de widget-kiezer.\nexport const WIDGET_TYPES = Object.keys(WIDGETS) as WidgetType[];\n\n/**\n * Controleert of een string een bekend widget-type is.\n *\n * @param value - De te controleren waarde\n */\nexport function isWidgetType(value: string): value is WidgetType {\n  return Object.prototype.hasOwnProperty.call(WIDGETS, value);\n}\n\n// De standaardindeling ≈ het oude statische dashboard, zodat bestaande gebruikers\n// niets kwijtraken; de boekhoud-widgets voegen ze zelf toe via de kiezer.\nconst DEFAULT_TYPES: WidgetType[] = [\n  \"hours-week\",\n  \"outstanding-total\",\n  \"revenue-ytd\",\n  \"wip\",\n  \"to-declare\",\n  \"recent-entries\",\n];\n\n/**\n * De standaard-dashboardindeling. Instance-id's zijn deterministisch\n * (`${type}#1`) zodat de functie puur en testbaar blijft.\n */\nexport function defaultLayout(): WidgetInstance[] {\n  return DEFAULT_TYPES.map((type) => ({ id: `${type}#1`, type, size: WIDGETS[type].defaultSize }));\n}\n","export const QUICK_ACTIONS = [\n  { id: \"uren-invoeren\", label: \"Uren invoeren\" },\n  { id: \"fakturen-nieuw\", label: \"Nieuwe factuur\" },\n  { id: \"verschotten-invoeren\", label: \"Verschot invoeren\" },\n  { id: \"klanten-nieuw\", label: \"Nieuwe klant\" },\n  { id: \"uren-overzicht\", label: \"Urenoverzicht\" },\n  { id: \"uren-week\", label: \"Weekoverzicht\" },\n  { id: \"fakturen\", label: \"Facturen\" },\n  { id: \"klanten\", label: \"Klanten\" },\n] as const;\n\nexport type QuickActionId = typeof QUICK_ACTIONS[number][\"id\"];\n\n/** Keeps the original four actions for older layouts; an empty array means all actions are disabled. */\nexport function parseQuickActions(raw: unknown): QuickActionId[] {\n  if (!Array.isArray(raw)) return QUICK_ACTIONS.slice(0, 4).map(action => action.id);\n  return QUICK_ACTIONS.filter(action => raw.includes(action.id)).map(action => action.id);\n}\n","import type { WidgetInstance, WidgetSize, WidgetType } from \"./types\";\nimport { WIDGETS, isWidgetType } from \"./registry\";\nimport { parseQuickActions, type QuickActionId } from \"./quickActions\";\n\n// Pure layout-mutaties voor het aanpasbare dashboard. Geen @webhare-runtime en\n// geen Vue: direct unit-testbaar via wh runtest (het TDD-pad voor frontend-logica).\n// Elke functie geeft een NIEUWE array terug (geen mutatie in-place), zodat Vue de\n// wijziging betrouwbaar oppikt.\n\n/**\n * Bepaalt een uniek, deterministisch instance-id voor een nieuw widget van dit\n * type: `${type}#${hoogste bestaande nummer + 1}`. Deterministisch = puur/testbaar.\n *\n * @param layout - De huidige indeling\n * @param type - Het widget-type dat wordt toegevoegd\n */\nexport function nextId(layout: WidgetInstance[], type: WidgetType): string {\n  const prefix = `${type}#`;\n  let max = 0;\n  for (const widget of layout) {\n    if (!widget.id.startsWith(prefix)) continue;\n    const n = Number(widget.id.slice(prefix.length));\n    if (Number.isFinite(n) && n > max) max = n;\n  }\n  return `${prefix}${max + 1}`;\n}\n\n/**\n * Voegt een widget toe (achteraan) met de standaardgrootte uit het register.\n *\n * @param layout - De huidige indeling\n * @param type - Het toe te voegen widget-type\n */\nexport function addWidget(layout: WidgetInstance[], type: WidgetType): WidgetInstance[] {\n  return [...layout, { id: nextId(layout, type), type, size: WIDGETS[type].defaultSize }];\n}\n\n/**\n * Verwijdert een widget op instance-id.\n *\n * @param layout - De huidige indeling\n * @param id - Instance-id van het te verwijderen widget\n */\nexport function removeWidget(layout: WidgetInstance[], id: string): WidgetInstance[] {\n  return layout.filter((widget) => widget.id !== id);\n}\n\n/**\n * Verplaatst een widget één plek naar voren of achteren (verwisselt met de buur).\n * Aan de rand of bij een onbekend id is het een no-op (zelfde volgorde).\n *\n * @param layout - De huidige indeling\n * @param id - Instance-id van het te verplaatsen widget\n * @param direction - \"prev\" (naar voren) of \"next\" (naar achteren)\n */\nexport function moveWidget(layout: WidgetInstance[], id: string, direction: \"prev\" | \"next\"): WidgetInstance[] {\n  const index = layout.findIndex((widget) => widget.id === id);\n  if (index < 0) return layout;\n  const target = direction === \"prev\" ? index - 1 : index + 1;\n  if (target < 0 || target >= layout.length) return layout;\n  const next = [...layout];\n  [next[index], next[target]] = [next[target], next[index]];\n  return next;\n}\n\n/**\n * Zet de grootte van een widget.\n *\n * @param layout - De huidige indeling\n * @param id - Instance-id van het widget\n * @param size - Nieuwe grootte\n */\nexport function setSize(layout: WidgetInstance[], id: string, size: WidgetSize): WidgetInstance[] {\n  return layout.map((widget) => (widget.id === id ? { ...widget, size } : widget));\n}\n\n/** Changes one quick-action selection without altering other widget instances. */\nexport function setQuickActionEnabled({ layout, id, action, enabled }: {\n  layout: WidgetInstance[]; id: string; action: QuickActionId; enabled: boolean;\n}): WidgetInstance[] {\n  return layout.map(widget => {\n    if (widget.id !== id || widget.type !== \"quick-actions\") return widget;\n    const actions = parseQuickActions(widget.actions);\n    return { ...widget, actions: enabled ? parseQuickActions([...actions, action]) : actions.filter(item => item !== action) };\n  });\n}\n\n/**\n * Zet een widget-type aan of uit (voor het \"Widgets beheren\"-scherm met toggles).\n * Aanzetten voegt één instance toe als het type nog niet aanwezig is; uitzetten\n * verwijdert alle instances van dat type. Al in de gewenste staat = no-op.\n *\n * @param layout - De huidige indeling\n * @param type - Het widget-type\n * @param enabled - Gewenste staat (aan/uit)\n */\nexport function setTypeEnabled(layout: WidgetInstance[], type: WidgetType, enabled: boolean): WidgetInstance[] {\n  const present = layout.some((widget) => widget.type === type);\n  if (enabled && !present) return addWidget(layout, type);\n  if (!enabled && present) return layout.filter((widget) => widget.type !== type);\n  return layout;\n}\n\n/**\n * Verplaatst een widget naar de plek van een ander widget (voor drag-and-drop).\n * Onbekende id's of dezelfde plek zijn een no-op.\n *\n * @param layout - De huidige indeling\n * @param fromId - Instance-id van het gesleepte widget\n * @param toId - Instance-id van het widget waarop wordt losgelaten\n */\nexport function reorderWidget(layout: WidgetInstance[], fromId: string, toId: string): WidgetInstance[] {\n  const from = layout.findIndex((widget) => widget.id === fromId);\n  const to = layout.findIndex((widget) => widget.id === toId);\n  if (from < 0 || to < 0 || from === to) return layout;\n  const next = [...layout];\n  const [moved] = next.splice(from, 1);\n  next.splice(to, 0, moved);\n  return next;\n}\n\n/**\n * Serialiseert de indeling naar de opslagvorm (plain objects) voor de RPC.\n *\n * @param layout - De op te slaan indeling\n */\nexport function serializeLayout(layout: WidgetInstance[]): Array<{ id: string; type: string; size: string; actions?: string[] }> {\n  return layout.map((widget) => ({\n    id: widget.id, type: widget.type, size: widget.size,\n    ...(widget.type === \"quick-actions\" && widget.actions !== undefined ? { actions: [...widget.actions] } : {}),\n  }));\n}\n\n/**\n * Leest een opgeslagen indeling defensief in: rijen zonder geldig id/type/grootte\n * vallen weg, onbekende widget-types (bv. na verwijderen van een widget) worden\n * genegeerd, en dubbele id's worden ontdubbeld. Geen array => lege indeling.\n *\n * @param raw - De ruwe waarde uit de opslag\n */\nexport function parseLayout(raw: unknown): WidgetInstance[] {\n  if (!Array.isArray(raw)) return [];\n  const seen = new Set<string>();\n  const result: WidgetInstance[] = [];\n  for (const item of raw) {\n    if (!item || typeof item !== \"object\") continue;\n    const record = item as Record<string, unknown>;\n    const { id, type, size } = record;\n    if (typeof id !== \"string\" || !id || seen.has(id)) continue;\n    if (typeof type !== \"string\" || !isWidgetType(type)) continue;\n    seen.add(id);\n    result.push({\n      id, type, size: size === \"l\" ? \"l\" : \"s\",\n      ...(type === \"quick-actions\" && Array.isArray(record.actions) ? { actions: parseQuickActions(record.actions) } : {}),\n    });\n  }\n  return result;\n}\n","import { ref, onBeforeUnmount } from \"vue\";\nimport { useApi } from \"../api\";\nimport { defaultLayout } from \"./registry\";\nimport { addWidget, moveWidget, parseLayout, removeWidget, reorderWidget, serializeLayout, setQuickActionEnabled, setSize, setTypeEnabled } from \"./layout\";\nimport type { WidgetInstance, WidgetSize, WidgetType } from \"./types\";\nimport type { QuickActionId } from \"./quickActions\";\n\n// Beheert de per-gebruiker dashboard-indeling: laadt server-side (RPC), muteert\n// optimistisch in de UI, en slaat debounced weer op. Server geeft `null` als er\n// nog niets is opgeslagen (dan de standaardindeling); een lege array is een\n// geldige keuze (gebruiker heeft alle widgets verwijderd).\n\nconst SAVE_DELAY_MS = 500;\n\nexport function useDashboardLayout() {\n  const api = useApi();\n  onBeforeUnmount(() => { if (saveTimer !== null) window.clearTimeout(saveTimer); });\n  const layout = ref<WidgetInstance[]>([]);\n  const loading = ref(true);\n  let saveTimer: number | null = null;\n\n  async function load(): Promise<void> {\n    loading.value = true;\n    try {\n      const raw = await api.getDashboardLayout();\n      layout.value = raw === null ? defaultLayout() : parseLayout(raw);\n    } catch {\n      layout.value = defaultLayout();   // best-effort: val terug op de standaard\n    } finally {\n      loading.value = false;\n    }\n  }\n\n  function persist(): void {\n    if (saveTimer !== null) window.clearTimeout(saveTimer);\n    saveTimer = window.setTimeout(() => {\n      void api.saveDashboardLayout({ layout: serializeLayout(layout.value) }).catch(() => {\n        // best-effort; de indeling blijft in de UI staan.\n      });\n    }, SAVE_DELAY_MS);\n  }\n\n  function apply(next: WidgetInstance[]): void {\n    if (next === layout.value) return;   // no-op-mutaties niet opslaan\n    layout.value = next;\n    persist();\n  }\n\n  function add(type: WidgetType): void {\n    apply(addWidget(layout.value, type));\n  }\n  function setType(type: WidgetType, enabled: boolean): void {\n    apply(setTypeEnabled(layout.value, type, enabled));\n  }\n  function remove(id: string): void {\n    apply(removeWidget(layout.value, id));\n  }\n  function move(id: string, direction: \"prev\" | \"next\"): void {\n    apply(moveWidget(layout.value, id, direction));\n  }\n  function resize(id: string, size: WidgetSize): void {\n    apply(setSize(layout.value, id, size));\n  }\n  function reorder(fromId: string, toId: string): void {\n    apply(reorderWidget(layout.value, fromId, toId));\n  }\n  function reset(): void {\n    apply(defaultLayout());\n  }\n\n  function setQuickAction(selection: { id: string; action: QuickActionId; enabled: boolean }): void {\n    apply(setQuickActionEnabled({ layout: layout.value, ...selection }));\n  }\n\n  return { layout, loading, load, add, setType, remove, move, resize, reorder, reset, setQuickAction };\n}\n","<template>\n  <section class=\"widget\" :class=\"{ 'widget--editing': editing }\">\n    <header class=\"widget__head\">\n      <span v-if=\"editing\" class=\"widget__grip\" aria-hidden=\"true\">⠿</span>\n      <h2 class=\"widget__title\">{{ title }}</h2>\n      <div v-if=\"editing\" class=\"widget__tools\">\n        <button\n          class=\"widget__btn\"\n          type=\"button\"\n          title=\"Naar voren\"\n          aria-label=\"Widget naar voren verplaatsen\"\n          :disabled=\"!canPrev\"\n          @click=\"emit('move-prev')\"\n        >◀</button>\n        <button\n          class=\"widget__btn\"\n          type=\"button\"\n          title=\"Naar achteren\"\n          aria-label=\"Widget naar achteren verplaatsen\"\n          :disabled=\"!canNext\"\n          @click=\"emit('move-next')\"\n        >▶</button>\n        <button\n          class=\"widget__btn\"\n          type=\"button\"\n          :title=\"size === 's' ? 'Breder maken' : 'Smaller maken'\"\n          :aria-label=\"size === 's' ? 'Widget breder maken' : 'Widget smaller maken'\"\n          @click=\"emit('toggle-size')\"\n        >{{ size === \"s\" ? \"⤢\" : \"⤡\" }}</button>\n        <button\n          class=\"widget__btn widget__btn--danger\"\n          type=\"button\"\n          title=\"Verwijderen\"\n          aria-label=\"Widget verwijderen\"\n          @click=\"emit('remove')\"\n        >✕</button>\n      </div>\n    </header>\n    <div class=\"widget__body\">\n      <slot />\n    </div>\n  </section>\n</template>\n\n<script setup lang=\"ts\">\nimport type { WidgetSize } from \"../../lib/dashboard/types\";\n\nwithDefaults(defineProps<{\n  title: string;\n  editing: boolean;\n  size: WidgetSize;\n  canPrev?: boolean;\n  canNext?: boolean;\n}>(), { canPrev: true, canNext: true });\n\nconst emit = defineEmits<{\n  \"move-prev\": [];\n  \"move-next\": [];\n  \"toggle-size\": [];\n  remove: [];\n}>();\n</script>\n\n<style scoped>\n.widget {\n  display: flex;\n  flex-direction: column;\n  height: 100%;\n  border: 1px solid var(--hh-line);\n  border-radius: var(--hh-radius-lg);\n  background: var(--hh-surface);\n  box-shadow: var(--hh-shadow);\n  overflow: hidden;\n}\n.widget--editing {\n  border-style: dashed;\n  border-color: var(--hh-line-strong);\n  cursor: grab;\n}\n.widget--editing:active {\n  cursor: grabbing;\n}\n.widget__head {\n  display: flex;\n  align-items: center;\n  gap: 8px;\n  padding: 12px 14px 0;\n}\n.widget__grip {\n  color: var(--hh-fg-subtle);\n  font-size: 14px;\n  line-height: 1;\n  cursor: grab;\n}\n.widget__title {\n  flex: 1;\n  margin: 0;\n  font-size: 14px;\n  font-weight: 700;\n  letter-spacing: -0.01em;\n}\n.widget__tools {\n  display: flex;\n  gap: 3px;\n}\n.widget__btn {\n  width: 24px;\n  height: 24px;\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  border: 1px solid var(--hh-line);\n  border-radius: 6px;\n  background: var(--hh-surface);\n  color: var(--hh-fg-muted);\n  font-size: 12px;\n  line-height: 1;\n  cursor: pointer;\n  transition: background-color 0.1s, color 0.1s;\n}\n.widget__btn:hover:not(:disabled) {\n  background: var(--hh-surface-2);\n  color: var(--hh-fg);\n}\n.widget__btn:disabled {\n  opacity: 0.4;\n  cursor: not-allowed;\n}\n.widget__btn--danger:hover:not(:disabled) {\n  background: var(--hh-danger-soft);\n  color: var(--hh-danger);\n  border-color: var(--hh-danger);\n}\n.widget__body {\n  flex: 1;\n  padding: 12px 14px 14px;\n}\n</style>\n","import { openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, renderSlot as _renderSlot, normalizeClass as _normalizeClass } from \"vue\"\n\nconst _hoisted_1 = { class: \"widget__head\" }\nconst _hoisted_2 = {\n  key: 0,\n  class: \"widget__grip\",\n  \"aria-hidden\": \"true\"\n}\nconst _hoisted_3 = { class: \"widget__title\" }\nconst _hoisted_4 = {\n  key: 1,\n  class: \"widget__tools\"\n}\nconst _hoisted_5 = [\"disabled\"]\nconst _hoisted_6 = [\"disabled\"]\nconst _hoisted_7 = [\"title\", \"aria-label\"]\nconst _hoisted_8 = { class: \"widget__body\" }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return (_openBlock(), _createElementBlock(\"section\", {\n    class: _normalizeClass([\"widget\", { 'widget--editing': $props.editing }])\n  }, [\n    _createElementVNode(\"header\", _hoisted_1, [\n      ($props.editing)\n        ? (_openBlock(), _createElementBlock(\"span\", _hoisted_2, \"⠿\"))\n        : _createCommentVNode(\"v-if\", true),\n      _createElementVNode(\"h2\", _hoisted_3, _toDisplayString($props.title), 1 /* TEXT */),\n      ($props.editing)\n        ? (_openBlock(), _createElementBlock(\"div\", _hoisted_4, [\n            _createElementVNode(\"button\", {\n              class: \"widget__btn\",\n              type: \"button\",\n              title: \"Naar voren\",\n              \"aria-label\": \"Widget naar voren verplaatsen\",\n              disabled: !$props.canPrev,\n              onClick: _cache[0] || (_cache[0] = $event => ($setup.emit('move-prev')))\n            }, \"◀\", 8 /* PROPS */, _hoisted_5),\n            _createElementVNode(\"button\", {\n              class: \"widget__btn\",\n              type: \"button\",\n              title: \"Naar achteren\",\n              \"aria-label\": \"Widget naar achteren verplaatsen\",\n              disabled: !$props.canNext,\n              onClick: _cache[1] || (_cache[1] = $event => ($setup.emit('move-next')))\n            }, \"▶\", 8 /* PROPS */, _hoisted_6),\n            _createElementVNode(\"button\", {\n              class: \"widget__btn\",\n              type: \"button\",\n              title: $props.size === 's' ? 'Breder maken' : 'Smaller maken',\n              \"aria-label\": $props.size === 's' ? 'Widget breder maken' : 'Widget smaller maken',\n              onClick: _cache[2] || (_cache[2] = $event => ($setup.emit('toggle-size')))\n            }, _toDisplayString($props.size === \"s\" ? \"⤢\" : \"⤡\"), 9 /* TEXT, PROPS */, _hoisted_7),\n            _createElementVNode(\"button\", {\n              class: \"widget__btn widget__btn--danger\",\n              type: \"button\",\n              title: \"Verwijderen\",\n              \"aria-label\": \"Widget verwijderen\",\n              onClick: _cache[3] || (_cache[3] = $event => ($setup.emit('remove')))\n            }, \"✕\")\n          ]))\n        : _createCommentVNode(\"v-if\", true)\n    ]),\n    _createElementVNode(\"div\", _hoisted_8, [\n      _renderSlot(_ctx.$slots, \"default\", {}, undefined, true)\n    ])\n  ], 2 /* CLASS */))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/WidgetShell.vue?type=script\";import \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/WidgetShell.vue?type=style&index=0\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/WidgetShell.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/WidgetShell.vue\";script.__scopeId = \"data-v-d440e7c1\";export default script;","import { Money } from \"@webhare/std\";\n\n// Pure domeinlogica van Happy Hours: geen WRD/DB-imports, volledig unit-testbaar.\n// Alle geldbedragen zijn Money (exact decimaal, de moderne bcd van het origineel).\n\nexport type InvoiceType = \"with_advances\" | \"standalone\" | \"isolated\";\n\nexport interface ParsedInvoiceNumber {\n  customerNumber: string;\n  yearTwoDigits: number;\n  sequence: number;\n}\n\nexport interface TellenInput {\n  entries: Array<{ hours: Money; rate: Money }>;\n  expenses: Array<{ amount: Money }>;\n  invoices: Array<{ amount: Money; margin: Money }>;\n}\n\nexport interface TellenResult {\n  totalHours: Money;\n  hoursAmount: Money;\n  expensesAmount: Money;\n  totalCosts: Money;\n  declared: Money;\n  margin: Money;\n  toDeclare: Money;\n  invoiceCount: number;\n}\n\nconst ZERO = new Money(\"0\");\nconst CENT = new Money(\"0.01\");\nconst MAX_SEQUENCE = 999;\n\nexport function isValidTimeEntryHours(hours: Money): boolean {\n  // Negative hours remain available for correction entries.\n  return Money.check(hours, \"!=\", \"0\") && Money.check(hours, \">=\", \"-999\") && Money.check(hours, \"<=\", \"999\");\n}\n\n/**\n * Formatteert een faktuurnummer in het klassieke KLT.JJ/NNN-formaat.\n *\n * @param customerNumber - Klantnummer (bv. \"008\")\n * @param fiscalYear - Volledig fiscaal jaar (bv. 2026)\n * @param sequence - Volgnummer 1-999 binnen klant+jaar\n */\nexport function formatInvoiceNumber(customerNumber: string, fiscalYear: number, sequence: number): string {\n  const yy = String(fiscalYear % 100).padStart(2, \"0\");\n  const nnn = String(sequence).padStart(3, \"0\");\n  return `${customerNumber}.${yy}/${nnn}`;\n}\n\n/**\n * Parseert een KLT.JJ/NNN-faktuurnummer.\n *\n * @param number - Faktuurnummer zoals \"008.26/001\"\n * @returns Onderdelen, of null als het formaat niet klopt\n */\nexport function parseInvoiceNumber(number: string): ParsedInvoiceNumber | null {\n  const match = /^(\\d{1,3})\\.(\\d{2})\\/(\\d{1,3})$/.exec(number.trim());\n  if (!match) return null;\n  return {\n    customerNumber: match[1],\n    yearTwoDigits: Number(match[2]),\n    sequence: Number(match[3]),\n  };\n}\n\n/**\n * Eerste vrije volgnummer 1-999, gaten worden hergebruikt (net als de\n * VindFaktuur()-loop in het DOS-origineel).\n *\n * @param existing - Reeds gebruikte volgnummers binnen klant+jaar\n * @throws Error wanneer alle 999 nummers bezet zijn\n */\nexport function firstFreeSequence(existing: number[]): number {\n  const taken = new Set(existing);\n  for (let seq = 1; seq <= MAX_SEQUENCE; seq++) {\n    if (!taken.has(seq)) return seq;\n  }\n  throw new Error(`Factuurnummers voor deze klant en dit jaar zijn vol (maximaal ${MAX_SEQUENCE})`);\n}\n\nexport interface ParsedReminderNumber {\n  customerNumber: string;\n  sequence: number;\n}\n\n/**\n * Formatteert een herinneringsnummer H<klantnr>.<NNN>. Niet jaargebonden (een\n * herinnering kan fakturen over meerdere jaren bundelen).\n *\n * @param customerNumber - Klantnummer (bv. \"008\")\n * @param sequence - Volgnummer 1-999 binnen de klant\n */\nexport function formatReminderNumber(customerNumber: string, sequence: number): string {\n  const nnn = String(sequence).padStart(3, \"0\");\n  return `H${customerNumber}.${nnn}`;\n}\n\n/**\n * Ontleedt een herinneringsnummer H<klantnr>.<NNN>, of null bij een ongeldig formaat.\n *\n * @param number - Het herinneringsnummer\n */\nexport function parseReminderNumber(number: string): ParsedReminderNumber | null {\n  const match = /^H(\\d{1,3})\\.(\\d{1,3})$/.exec(number.trim());\n  if (!match) return null;\n  return {\n    customerNumber: match[1],\n    sequence: Number(match[2]),\n  };\n}\n\n/**\n * Btw-bedrag over een bedrag excl. btw, commercieel afgerond op centen.\n *\n * @param amountExcl - Bedrag exclusief btw\n * @param vatRate - Btw-percentage (bv. 21)\n */\nexport function vatAmount(amountExcl: Money, vatRate: Money): Money {\n  return Money.roundToMultiple(Money.getPercentage(amountExcl, vatRate), CENT, \"half-toward-infinity\");\n}\n\n/**\n * Bedrag inclusief btw.\n *\n * @param amountExcl - Bedrag exclusief btw\n * @param vatRate - Btw-percentage (bv. 21)\n */\nexport function amountInclVat(amountExcl: Money, vatRate: Money): Money {\n  return Money.add(amountExcl, vatAmount(amountExcl, vatRate));\n}\n\n/**\n * De kern van de facturatie, het klassieke Tellen():\n * totalCosts = som(uren x tarief) + som(verschotten)\n * toDeclare  = totalCosts - (gedeclareerd - marge)\n *\n * @param input - Urenregels (uren+tarief), verschotten en fakturen van klant+jaar\n */\nexport function computeTellen(input: TellenInput): TellenResult {\n  let totalHours = ZERO;\n  let hoursAmount = ZERO;\n  for (const entry of input.entries) {\n    totalHours = Money.add(totalHours, entry.hours);\n    hoursAmount = Money.add(hoursAmount, Money.multiply(entry.hours, entry.rate));\n  }\n\n  let expensesAmount = ZERO;\n  for (const expense of input.expenses) {\n    expensesAmount = Money.add(expensesAmount, expense.amount);\n  }\n\n  let declared = ZERO;\n  let margin = ZERO;\n  for (const invoice of input.invoices) {\n    declared = Money.add(declared, invoice.amount);\n    margin = Money.add(margin, invoice.margin);\n  }\n\n  const totalCosts = Money.add(hoursAmount, expensesAmount);\n  const toDeclare = Money.subtract(totalCosts, Money.subtract(declared, margin));\n\n  return {\n    totalHours,\n    hoursAmount,\n    expensesAmount,\n    totalCosts,\n    declared,\n    margin,\n    toDeclare,\n    invoiceCount: input.invoices.length,\n  };\n}\n\n/**\n * Marge-suggestie: declareer je meer dan er nog te declareren staat, dan wordt\n * het verschil automatisch als marge voorgesteld (V_Marge in het origineel).\n *\n * @param declareAmount - In te voeren declaratiebedrag\n * @param toDeclare - Huidig \"nog te declareren\"-saldo\n */\nexport function suggestMargin(declareAmount: Money, toDeclare: Money): Money {\n  const diff = Money.subtract(declareAmount, toDeclare);\n  return Money.check(diff, \">\", ZERO) ? diff : ZERO;\n}\n\n/**\n * Weergavenaam van een klant: bedrijfsnaam, en anders (geen bedrijf) de\n * contactpersoon. Randspaties worden getrimd. De customer-service houdt hiermee\n * wrd_title actueel (er is geen automatisch wrd_title op een <object>).\n *\n * @param input - Bedrijfsnaam en contactnaam\n */\nexport function deriveCustomerTitle(input: { company: string; contactName: string }): string {\n  const company = input.company.trim();\n  if (company) return company;\n  return input.contactName.trim();\n}\n\n/** Reports use initials or the given name followed by the surname, without modifying stored name fields. */\nexport function employeeReportName(input: { initials: string; firstName: string; lastName: string }): string {\n  return [input.initials.trim() || input.firstName.trim(), input.lastName.trim()].filter(Boolean).join(\" \");\n}\n\n/**\n * De groep van een werkzaamheid = het eerste teken van de code (cijfer 0-9).\n * Wordt gebruikt voor de subtotalen per groep op de produktiestaat.\n *\n * @param code - Werkzaamheidcode, bv. \"3C\"\n */\nexport function activityGroup(code: string): string {\n  return code.charAt(0);\n}\n\n/**\n * Openstaand bedrag van een faktuur: bedrag incl. btw minus het reeds betaalde\n * bedrag, afgekapt op 0 (overbetaling levert geen negatief openstaand op).\n *\n * @param invoice - Bedrag excl. btw, btw-percentage en het betaalde bedrag\n */\nexport function openAmount(invoice: { amount: Money; vatRate: Money; paidAmount: Money }): Money {\n  const incl = amountInclVat(invoice.amount, invoice.vatRate);\n  const open = Money.subtract(incl, invoice.paidAmount);\n  return Money.check(open, \">\", ZERO) ? open : ZERO;\n}\n\nexport interface AdvanceNoteInvoice {\n  number: string;\n  amount: Money;\n  invoiceType: InvoiceType;\n}\n\nexport interface AdvanceNoteDeduction {\n  number: string;\n  amount: Money;\n}\n\nexport interface AdvanceNoteResult {\n  honorariumTotal: Money;              // som van alle niet-isolated fakturen (eerdere + huidige)\n  deductions: AdvanceNoteDeduction[];  // eerdere niet-isolated fakturen, als aftrek op de brief\n  balance: Money;                      // saldo = het bedrag van de huidige faktuur\n  showAdvances: boolean;               // voorschotblok pas tonen vanaf 1 eerdere aftrek\n}\n\n/**\n * Voorschotnota-berekening voor de printweergave van een with_advances-faktuur:\n * eerdere fakturen van dezelfde klant+jaar (behalve type `isolated`) worden als\n * \"af: voorschotsdeclaratie <nr>\" getoond. Honorarium = alle niet-isolated\n * bedragen samen; saldo = de huidige faktuur.\n *\n * @param input - De huidige faktuur en de eerdere fakturen van klant+jaar\n */\nexport function computeAdvanceNote(input: { current: AdvanceNoteInvoice; earlier: AdvanceNoteInvoice[] }): AdvanceNoteResult {\n  const deductions = input.earlier\n    .filter((invoice) => invoice.invoiceType !== \"isolated\")\n    .map((invoice) => ({ number: invoice.number, amount: invoice.amount }));\n\n  const earlierTotal = deductions.reduce((sum, deduction) => Money.add(sum, deduction.amount), ZERO);\n  const honorariumTotal = Money.add(earlierTotal, input.current.amount);\n\n  return {\n    honorariumTotal,\n    deductions,\n    balance: input.current.amount,\n    showAdvances: deductions.length > 0,\n  };\n}\n","// Weergaveformattering (NL). Pure functies, herbruikbaar in alle schermen.\n//\n// Geld is Money (exact decimaal) tot aan het weergavepunt. Hier wordt eerst\n// EXACT commercieel afgerond (half-toward-infinity, dezelfde modus als\n// domain.ts/vatAmount) en pas daarna naar number geconverteerd voor Intl: een\n// waarde met maximaal 2 decimalen is als double altijd correct weer te geven.\n// Een number-invoer (bv. een client-side visualisatiewaarde) wordt eerst via\n// Money genormaliseerd zodat 0.25 * 34.30 (double nét onder 8,575) toch als\n// € 8,58 toont, conform de server-berekening.\n\nimport { Money } from \"@webhare/std\";\nexport { employeeReportName } from \"../../../../js/internal/domain\";\n\nconst euro = new Intl.NumberFormat(\"nl-NL\", { style: \"currency\", currency: \"EUR\" });\nconst number0 = new Intl.NumberFormat(\"nl-NL\", { maximumFractionDigits: 0 });\nconst hours = new Intl.NumberFormat(\"nl-NL\", { minimumFractionDigits: 0, maximumFractionDigits: 2 });\n\nconst CENT = new Money(\"0.01\");\n\n/** Rond exact af op centen (commercieel, weg van nul) en lever een weergave-double. */\nfunction toDisplayNumber(value: Money | number): number {\n  if (typeof value === \"number\" && !Number.isFinite(value)) return value; // laat Intl NaN/∞ tonen i.p.v. een render-brekende throw\n  const money = Money.isMoney(value) ? value : Money.fromNumber(value);\n  return Money.roundToMultiple(money, CENT, \"half-toward-infinity\").toNumber();\n}\n\n/** Bedrag als euro, bv. \"€ 1.234,50\". */\nexport function formatEuro(value: Money | number): string {\n  return euro.format(toDisplayNumber(value));\n}\n\n/** Geheel getal met NL-duizendtalscheiding. */\nexport function formatNumber(value: number): string {\n  return number0.format(value);\n}\n\n/** Uren met maximaal 2 decimalen, bv. \"1,5\". */\nexport function formatHours(value: Money | number): string {\n  return hours.format(toDisplayNumber(value));\n}\n\n/** ISO-datumstring naar NL-datum, bv. \"2-3-2026\". Lege string bij ontbreken. */\nexport function formatDate(value: string | null | undefined): string {\n  if (!value) return \"\";\n  const date = new Date(value);\n  if (Number.isNaN(date.getTime())) return \"\";\n  return date.toLocaleDateString(\"nl-NL\");\n}\n\nexport function formatActivityGroup({ group, labels }: { group: string; labels: readonly string[] }): string {\n  const index = Number(group);\n  const label = Number.isInteger(index) ? (labels[index] ?? \"\").trim() : \"\";\n  return label ? `${group} · ${label}` : `Groep ${group}`;\n}\n\n/** An hours entry's own text, or else its activity's name (fixed codes such as 1A carry no own text). */\nexport function entryDescription(entry: { description: string; activityTitle?: string }): string {\n  return entry.description || entry.activityTitle || String.fromCharCode(8212);\n}\n","import { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"hh-kpi\" }\nconst _hoisted_2 = { class: \"hh-kpi__value\" }\nconst _hoisted_3 = { class: \"hh-kpi__meta\" }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n    _createElementVNode(\"span\", _hoisted_2, _toDisplayString($setup.formatHours($props.data.hoursThisWeek)), 1 /* TEXT */),\n    _createElementVNode(\"span\", _hoisted_3, \"Week \" + _toDisplayString($props.data.week), 1 /* TEXT */)\n  ]))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/HoursWeekWidget.vue?type=script\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/HoursWeekWidget.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/HoursWeekWidget.vue\";export default script;","import { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"hh-kpi\" }\nconst _hoisted_2 = { class: \"hh-kpi__value\" }\nconst _hoisted_3 = { class: \"hh-kpi__meta\" }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n    _createElementVNode(\"span\", _hoisted_2, _toDisplayString($setup.formatEuro($props.data.openInvoiceAmount)), 1 /* TEXT */),\n    _createElementVNode(\"span\", _hoisted_3, _toDisplayString($setup.formatNumber($props.data.invoiceCount)) + \" facturen totaal\", 1 /* TEXT */)\n  ]))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/OutstandingWidget.vue?type=script\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/OutstandingWidget.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/OutstandingWidget.vue\";export default script;","import { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"hh-kpi\" }\nconst _hoisted_2 = { class: \"hh-kpi__value\" }\nconst _hoisted_3 = { class: \"hh-kpi__meta\" }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n    _createElementVNode(\"span\", _hoisted_2, _toDisplayString($setup.formatEuro($props.data.revenueThisYear)), 1 /* TEXT */),\n    _createElementVNode(\"span\", _hoisted_3, \"excl. btw · boekjaar \" + _toDisplayString($props.data.fiscalYear), 1 /* TEXT */)\n  ]))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/RevenueYtdWidget.vue?type=script\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/RevenueYtdWidget.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/RevenueYtdWidget.vue\";export default script;","import { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"hh-kpi\" }\nconst _hoisted_2 = { class: \"hh-kpi__value\" }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n    _createElementVNode(\"span\", _hoisted_2, _toDisplayString($setup.formatEuro($props.data.unbilled)), 1 /* TEXT */),\n    _cache[0] || (_cache[0] = _createElementVNode(\"span\", { class: \"hh-kpi__meta\" }, \"geboekt, nog te factureren\", -1 /* CACHED */))\n  ]))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/WipWidget.vue?type=script\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/WipWidget.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/WipWidget.vue\";export default script;","import { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"hh-kpi\" }\nconst _hoisted_2 = { class: \"hh-kpi__value\" }\nconst _hoisted_3 = { class: \"hh-kpi__meta\" }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n    _createElementVNode(\"span\", _hoisted_2, _toDisplayString($setup.formatEuro($props.data.vatQuarter.amount)), 1 /* TEXT */),\n    _createElementVNode(\"span\", _hoisted_3, \"Q\" + _toDisplayString($props.data.quarter) + \" \" + _toDisplayString($props.data.fiscalYear) + \" · \" + _toDisplayString($setup.formatNumber($props.data.vatQuarter.invoiceCount)) + \" facturen\", 1 /* TEXT */)\n  ]))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/VatQuarterWidget.vue?type=script\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/VatQuarterWidget.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/VatQuarterWidget.vue\";export default script;","import { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"hh-kpi\" }\nconst _hoisted_2 = { class: \"hh-kpi__value\" }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n    _createElementVNode(\"span\", _hoisted_2, _toDisplayString($setup.formatNumber($props.data.customerCount)), 1 /* TEXT */),\n    _cache[0] || (_cache[0] = _createElementVNode(\"span\", { class: \"hh-kpi__meta\" }, \"actieve klanten\", -1 /* CACHED */))\n  ]))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/CustomersWidget.vue?type=script\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/CustomersWidget.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/CustomersWidget.vue\";export default script;","<template>\n  <div class=\"hh-kpi\">\n    <span class=\"hh-kpi__value\">{{ hasData ? `${formatNumber(data.dso.days)} dgn` : emptyMark }}</span>\n    <span class=\"hh-kpi__meta\">\n      {{ hasData ? `gemiddeld over ${formatNumber(data.dso.sampleSize)} betaalde facturen` : \"nog geen betaalde facturen\" }}\n    </span>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport type { DashboardData } from \"../../../lib/dashboard/data\";\nimport { formatNumber } from \"../../../lib/format\";\n\nconst props = defineProps<{ data: DashboardData }>();\nconst emptyMark = String.fromCharCode(8212);\nconst hasData = computed(() => props.data.dso.sampleSize > 0);\n</script>\n","import { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"hh-kpi\" }\nconst _hoisted_2 = { class: \"hh-kpi__value\" }\nconst _hoisted_3 = { class: \"hh-kpi__meta\" }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n    _createElementVNode(\"span\", _hoisted_2, _toDisplayString($setup.hasData ? `${$setup.formatNumber($props.data.dso.days)} dgn` : $setup.emptyMark), 1 /* TEXT */),\n    _createElementVNode(\"span\", _hoisted_3, _toDisplayString($setup.hasData ? `gemiddeld over ${$setup.formatNumber($props.data.dso.sampleSize)} betaalde facturen` : \"nog geen betaalde facturen\"), 1 /* TEXT */)\n  ]))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/DsoWidget.vue?type=script\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/DsoWidget.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/DsoWidget.vue\";export default script;","<template>\n  <p v-if=\"data.topOutstanding.length === 0\" class=\"hh-wempty\">\n    Niets openstaand. Boek uren of verschotten om hier iets te zien.\n  </p>\n  <ul v-else class=\"hh-wlist\">\n    <li v-for=\"row in data.topOutstanding\" :key=\"`${row.customerId}-${row.fiscalYear}`\">\n      <button class=\"hh-wrow\" type=\"button\" @click=\"open(row.customerId)\">\n        <span class=\"hh-wrow__main\">{{ row.title }} <small class=\"hh-wrow__sub\">{{ row.fiscalYear }}</small></span>\n        <span class=\"hh-wrow__amount\">{{ formatEuro(row.toDeclare) }}</span>\n      </button>\n    </li>\n  </ul>\n</template>\n\n<script setup lang=\"ts\">\nimport { useRouter } from \"vue-router\";\nimport type { DashboardData } from \"../../../lib/dashboard/data\";\nimport { formatEuro } from \"../../../lib/format\";\n\ndefineProps<{ data: DashboardData }>();\nconst router = useRouter();\n\nfunction open(customerId: number): void {\n  void router.push({ name: \"klanten-detail\", params: { id: String(customerId) } });\n}\n</script>\n","import { openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, renderList as _renderList, Fragment as _Fragment, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, createTextVNode as _createTextVNode } from \"vue\"\n\nconst _hoisted_1 = {\n  key: 0,\n  class: \"hh-wempty\"\n}\nconst _hoisted_2 = {\n  key: 1,\n  class: \"hh-wlist\"\n}\nconst _hoisted_3 = [\"onClick\"]\nconst _hoisted_4 = { class: \"hh-wrow__main\" }\nconst _hoisted_5 = { class: \"hh-wrow__sub\" }\nconst _hoisted_6 = { class: \"hh-wrow__amount\" }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return ($props.data.topOutstanding.length === 0)\n    ? (_openBlock(), _createElementBlock(\"p\", _hoisted_1, \" Niets openstaand. Boek uren of verschotten om hier iets te zien. \"))\n    : (_openBlock(), _createElementBlock(\"ul\", _hoisted_2, [\n        (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($props.data.topOutstanding, (row) => {\n          return (_openBlock(), _createElementBlock(\"li\", {\n            key: `${row.customerId}-${row.fiscalYear}`\n          }, [\n            _createElementVNode(\"button\", {\n              class: \"hh-wrow\",\n              type: \"button\",\n              onClick: $event => ($setup.open(row.customerId))\n            }, [\n              _createElementVNode(\"span\", _hoisted_4, [\n                _createTextVNode(_toDisplayString(row.title) + \" \", 1 /* TEXT */),\n                _createElementVNode(\"small\", _hoisted_5, _toDisplayString(row.fiscalYear), 1 /* TEXT */)\n              ]),\n              _createElementVNode(\"span\", _hoisted_6, _toDisplayString($setup.formatEuro(row.toDeclare)), 1 /* TEXT */)\n            ], 8 /* PROPS */, _hoisted_3)\n          ]))\n        }), 128 /* KEYED_FRAGMENT */))\n      ]))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/ToDeclareWidget.vue?type=script\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/ToDeclareWidget.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/ToDeclareWidget.vue\";export default script;","import { openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, renderList as _renderList, Fragment as _Fragment, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, createTextVNode as _createTextVNode } from \"vue\"\n\nconst _hoisted_1 = {\n  key: 0,\n  class: \"hh-wempty\"\n}\nconst _hoisted_2 = {\n  key: 1,\n  class: \"hh-wlist\"\n}\nconst _hoisted_3 = { class: \"hh-wrow\" }\nconst _hoisted_4 = { class: \"hh-wrow__main\" }\nconst _hoisted_5 = { class: \"hh-wrow__sub\" }\nconst _hoisted_6 = { class: \"hh-wrow__amount\" }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return ($props.data.recentEntries.length === 0)\n    ? (_openBlock(), _createElementBlock(\"p\", _hoisted_1, \"Nog geen urenregels geboekt.\"))\n    : (_openBlock(), _createElementBlock(\"ul\", _hoisted_2, [\n        (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($props.data.recentEntries, (entry) => {\n          return (_openBlock(), _createElementBlock(\"li\", {\n            key: entry.id\n          }, [\n            _createElementVNode(\"div\", _hoisted_3, [\n              _createElementVNode(\"span\", _hoisted_4, [\n                _createTextVNode(_toDisplayString(entry.customerTitle) + \" \", 1 /* TEXT */),\n                _createElementVNode(\"small\", _hoisted_5, _toDisplayString($setup.formatDate(entry.date)) + \" · \" + _toDisplayString(entry.employeeName), 1 /* TEXT */)\n              ]),\n              _createElementVNode(\"span\", _hoisted_6, _toDisplayString($setup.formatHours(entry.hours)) + \" u\", 1 /* TEXT */)\n            ])\n          ]))\n        }), 128 /* KEYED_FRAGMENT */))\n      ]))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/RecentEntriesWidget.vue?type=script\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/RecentEntriesWidget.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/RecentEntriesWidget.vue\";export default script;","<template>\n  <div class=\"rev\">\n    <div class=\"rev__cols\">\n      <div\n        v-for=\"month in data.revenueByMonth\"\n        :key=\"month.month\"\n        class=\"rev__col\"\n        :title=\"`${MONTHS[month.month - 1]}: ${formatEuro(month.amount)}`\"\n      >\n        <div class=\"rev__bar\" :style=\"{ height: height(month.amount) }\" />\n      </div>\n    </div>\n    <div class=\"rev__axis\">\n      <span v-for=\"month in data.revenueByMonth\" :key=\"month.month\" class=\"rev__tick\">{{ LETTERS[month.month - 1] }}</span>\n    </div>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport type { Money } from \"@webhare/std\";\nimport type { DashboardData } from \"../../../lib/dashboard/data\";\nimport { formatEuro } from \"../../../lib/format\";\n\nconst props = defineProps<{ data: DashboardData }>();\n\nconst MONTHS = [\"januari\", \"februari\", \"maart\", \"april\", \"mei\", \"juni\", \"juli\", \"augustus\", \"september\", \"oktober\", \"november\", \"december\"];\nconst LETTERS = [\"J\", \"F\", \"M\", \"A\", \"M\", \"J\", \"J\", \"A\", \"S\", \"O\", \"N\", \"D\"];\n\n// Bar-schaling is visualisatie: float (toNumber) is hier prima, er wordt niet gerekend met geld.\nconst max = computed(() => Math.max(1, ...props.data.revenueByMonth.map((month) => month.amount.toNumber())));\n\nfunction height(value: Money): string {\n  return `${Math.max(2, (value.toNumber() / max.value) * 100)}%`;\n}\n</script>\n\n<style scoped>\n.rev__cols {\n  display: grid;\n  grid-template-columns: repeat(12, 1fr);\n  gap: 5px;\n  align-items: end;\n  height: 130px;\n}\n.rev__col {\n  display: flex;\n  align-items: end;\n  height: 100%;\n}\n.rev__bar {\n  width: 100%;\n  min-height: 2px;\n  border-radius: 4px 4px 0 0;\n  background: var(--hh-accent);\n}\n.rev__axis {\n  display: grid;\n  grid-template-columns: repeat(12, 1fr);\n  gap: 5px;\n  margin-top: 6px;\n}\n.rev__tick {\n  text-align: center;\n  font-size: 10px;\n  color: var(--hh-fg-subtle);\n}\n</style>\n","import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, normalizeStyle as _normalizeStyle, createElementVNode as _createElementVNode, toDisplayString as _toDisplayString } from \"vue\"\n\nconst _hoisted_1 = { class: \"rev\" }\nconst _hoisted_2 = { class: \"rev__cols\" }\nconst _hoisted_3 = [\"title\"]\nconst _hoisted_4 = { class: \"rev__axis\" }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n    _createElementVNode(\"div\", _hoisted_2, [\n      (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($props.data.revenueByMonth, (month) => {\n        return (_openBlock(), _createElementBlock(\"div\", {\n          key: month.month,\n          class: \"rev__col\",\n          title: `${$setup.MONTHS[month.month - 1]}: ${$setup.formatEuro(month.amount)}`\n        }, [\n          _createElementVNode(\"div\", {\n            class: \"rev__bar\",\n            style: _normalizeStyle({ height: $setup.height(month.amount) })\n          }, null, 4 /* STYLE */)\n        ], 8 /* PROPS */, _hoisted_3))\n      }), 128 /* KEYED_FRAGMENT */))\n    ]),\n    _createElementVNode(\"div\", _hoisted_4, [\n      (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($props.data.revenueByMonth, (month) => {\n        return (_openBlock(), _createElementBlock(\"span\", {\n          key: month.month,\n          class: \"rev__tick\"\n        }, _toDisplayString($setup.LETTERS[month.month - 1]), 1 /* TEXT */))\n      }), 128 /* KEYED_FRAGMENT */))\n    ])\n  ]))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/RevenueChartWidget.vue?type=script\";import \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/RevenueChartWidget.vue?type=style&index=0\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/RevenueChartWidget.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/RevenueChartWidget.vue\";script.__scopeId = \"data-v-d06803dc\";export default script;","<template>\n  <div class=\"hh-bars\">\n    <div v-for=\"(bucket, index) in data.aging.buckets\" :key=\"bucket.label\" class=\"hh-bar\">\n      <span class=\"hh-bar__label\">{{ bucket.label }} dgn <small class=\"aging__count\">({{ bucket.count }})</small></span>\n      <span class=\"hh-bar__track\"><span class=\"hh-bar__fill\" :class=\"fillClass(index)\" :style=\"{ width: width(bucket.amount) }\" /></span>\n      <span class=\"hh-bar__value\">{{ formatEuro(bucket.amount) }}</span>\n    </div>\n  </div>\n  <p class=\"aging__total\">Totaal openstaand: <strong>{{ formatEuro(data.aging.total) }}</strong></p>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport type { Money } from \"@webhare/std\";\nimport type { DashboardData } from \"../../../lib/dashboard/data\";\nimport { formatEuro } from \"../../../lib/format\";\n\nconst props = defineProps<{ data: DashboardData }>();\n// Bar-schaling is visualisatie: float (toNumber) is hier prima, er wordt niet gerekend met geld.\nconst max = computed(() => Math.max(1, ...props.data.aging.buckets.map((bucket) => bucket.amount.toNumber())));\n\nfunction width(value: Money): string {\n  return `${Math.max(2, (value.toNumber() / max.value) * 100)}%`;\n}\n\n// Oudere schulden = groter risico: neutrale->waarschuwing->gevaar (label draagt\n// de betekenis, kleur is secundair).\nfunction fillClass(index: number): string {\n  if (index >= 3) return \"hh-bar__fill--danger\";\n  if (index === 2) return \"hh-bar__fill--warn\";\n  return \"\";\n}\n</script>\n\n<style scoped>\n.aging__count {\n  color: var(--hh-fg-subtle);\n}\n.aging__total {\n  margin: 12px 0 0;\n  font-size: 12.5px;\n  color: var(--hh-fg-muted);\n}\n</style>\n","import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, createTextVNode as _createTextVNode, normalizeClass as _normalizeClass, normalizeStyle as _normalizeStyle } from \"vue\"\n\nconst _hoisted_1 = { class: \"hh-bars\" }\nconst _hoisted_2 = { class: \"hh-bar__label\" }\nconst _hoisted_3 = { class: \"aging__count\" }\nconst _hoisted_4 = { class: \"hh-bar__track\" }\nconst _hoisted_5 = { class: \"hh-bar__value\" }\nconst _hoisted_6 = { class: \"aging__total\" }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return (_openBlock(), _createElementBlock(_Fragment, null, [\n    _createElementVNode(\"div\", _hoisted_1, [\n      (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($props.data.aging.buckets, (bucket, index) => {\n        return (_openBlock(), _createElementBlock(\"div\", {\n          key: bucket.label,\n          class: \"hh-bar\"\n        }, [\n          _createElementVNode(\"span\", _hoisted_2, [\n            _createTextVNode(_toDisplayString(bucket.label) + \" dgn \", 1 /* TEXT */),\n            _createElementVNode(\"small\", _hoisted_3, \"(\" + _toDisplayString(bucket.count) + \")\", 1 /* TEXT */)\n          ]),\n          _createElementVNode(\"span\", _hoisted_4, [\n            _createElementVNode(\"span\", {\n              class: _normalizeClass([\"hh-bar__fill\", $setup.fillClass(index)]),\n              style: _normalizeStyle({ width: $setup.width(bucket.amount) })\n            }, null, 6 /* CLASS, STYLE */)\n          ]),\n          _createElementVNode(\"span\", _hoisted_5, _toDisplayString($setup.formatEuro(bucket.amount)), 1 /* TEXT */)\n        ]))\n      }), 128 /* KEYED_FRAGMENT */))\n    ]),\n    _createElementVNode(\"p\", _hoisted_6, [\n      _cache[0] || (_cache[0] = _createTextVNode(\"Totaal openstaand: \", -1 /* CACHED */)),\n      _createElementVNode(\"strong\", null, _toDisplayString($setup.formatEuro($props.data.aging.total)), 1 /* TEXT */)\n    ])\n  ], 64 /* STABLE_FRAGMENT */))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/AgingWidget.vue?type=script\";import \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/AgingWidget.vue?type=style&index=0\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/AgingWidget.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/AgingWidget.vue\";script.__scopeId = \"data-v-ac979496\";export default script;","<template>\n  <p v-if=\"rows.length === 0\" class=\"hh-wempty\">Geen openstaande debiteuren.</p>\n  <div v-else class=\"hh-bars\">\n    <div v-for=\"row in rows\" :key=\"row.customerId\" class=\"hh-bar\">\n      <span class=\"hh-bar__label\" :title=\"row.title\">{{ row.title }}</span>\n      <span class=\"hh-bar__track\"><span class=\"hh-bar__fill\" :style=\"{ width: width(row.openAmount) }\" /></span>\n      <span class=\"hh-bar__value\">{{ formatEuro(row.openAmount) }}</span>\n    </div>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport type { Money } from \"@webhare/std\";\nimport type { DashboardData } from \"../../../lib/dashboard/data\";\nimport { formatEuro } from \"../../../lib/format\";\n\nconst props = defineProps<{ data: DashboardData }>();\n\nconst rows = computed(() => props.data.debtors.slice(0, 8));\n// Bar-schaling is visualisatie: float (toNumber) is hier prima, er wordt niet gerekend met geld.\nconst max = computed(() => Math.max(1, ...rows.value.map((row) => row.openAmount.toNumber())));\n\nfunction width(value: Money): string {\n  return `${Math.max(2, (value.toNumber() / max.value) * 100)}%`;\n}\n</script>\n","import { openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, renderList as _renderList, Fragment as _Fragment, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, normalizeStyle as _normalizeStyle } from \"vue\"\n\nconst _hoisted_1 = {\n  key: 0,\n  class: \"hh-wempty\"\n}\nconst _hoisted_2 = {\n  key: 1,\n  class: \"hh-bars\"\n}\nconst _hoisted_3 = [\"title\"]\nconst _hoisted_4 = { class: \"hh-bar__track\" }\nconst _hoisted_5 = { class: \"hh-bar__value\" }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return ($setup.rows.length === 0)\n    ? (_openBlock(), _createElementBlock(\"p\", _hoisted_1, \"Geen openstaande debiteuren.\"))\n    : (_openBlock(), _createElementBlock(\"div\", _hoisted_2, [\n        (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.rows, (row) => {\n          return (_openBlock(), _createElementBlock(\"div\", {\n            key: row.customerId,\n            class: \"hh-bar\"\n          }, [\n            _createElementVNode(\"span\", {\n              class: \"hh-bar__label\",\n              title: row.title\n            }, _toDisplayString(row.title), 9 /* TEXT, PROPS */, _hoisted_3),\n            _createElementVNode(\"span\", _hoisted_4, [\n              _createElementVNode(\"span\", {\n                class: \"hh-bar__fill\",\n                style: _normalizeStyle({ width: $setup.width(row.openAmount) })\n              }, null, 4 /* STYLE */)\n            ]),\n            _createElementVNode(\"span\", _hoisted_5, _toDisplayString($setup.formatEuro(row.openAmount)), 1 /* TEXT */)\n          ]))\n        }), 128 /* KEYED_FRAGMENT */))\n      ]))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/DebtorsWidget.vue?type=script\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/DebtorsWidget.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/DebtorsWidget.vue\";export default script;","<template>\n  <p v-if=\"rows.length === 0\" class=\"hh-wempty\">Nog geen uren geboekt dit boekjaar.</p>\n  <div v-else class=\"hh-bars\">\n    <div v-for=\"row in rows\" :key=\"row.employeeId\" class=\"hh-bar\">\n      <span class=\"hh-bar__label\" :title=\"row.name\">{{ row.name }}</span>\n      <span class=\"hh-bar__track\"><span class=\"hh-bar__fill\" :style=\"{ width: width(row.hours) }\" /></span>\n      <span class=\"hh-bar__value\">{{ formatHours(row.hours) }} u</span>\n    </div>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport type { Money } from \"@webhare/std\";\nimport type { DashboardData } from \"../../../lib/dashboard/data\";\nimport { formatHours } from \"../../../lib/format\";\n\nconst props = defineProps<{ data: DashboardData }>();\nconst rows = computed(() => props.data.hoursByEmployee.slice(0, 8));\n// Bar-schaling is visualisatie: float (toNumber) is hier prima, er wordt niet gerekend met geld.\nconst max = computed(() => Math.max(1, ...rows.value.map((row) => row.hours.toNumber())));\n\nfunction width(value: Money): string {\n  return `${Math.max(2, (value.toNumber() / max.value) * 100)}%`;\n}\n</script>\n","import { openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, renderList as _renderList, Fragment as _Fragment, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, normalizeStyle as _normalizeStyle } from \"vue\"\n\nconst _hoisted_1 = {\n  key: 0,\n  class: \"hh-wempty\"\n}\nconst _hoisted_2 = {\n  key: 1,\n  class: \"hh-bars\"\n}\nconst _hoisted_3 = [\"title\"]\nconst _hoisted_4 = { class: \"hh-bar__track\" }\nconst _hoisted_5 = { class: \"hh-bar__value\" }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return ($setup.rows.length === 0)\n    ? (_openBlock(), _createElementBlock(\"p\", _hoisted_1, \"Nog geen uren geboekt dit boekjaar.\"))\n    : (_openBlock(), _createElementBlock(\"div\", _hoisted_2, [\n        (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.rows, (row) => {\n          return (_openBlock(), _createElementBlock(\"div\", {\n            key: row.employeeId,\n            class: \"hh-bar\"\n          }, [\n            _createElementVNode(\"span\", {\n              class: \"hh-bar__label\",\n              title: row.name\n            }, _toDisplayString(row.name), 9 /* TEXT, PROPS */, _hoisted_3),\n            _createElementVNode(\"span\", _hoisted_4, [\n              _createElementVNode(\"span\", {\n                class: \"hh-bar__fill\",\n                style: _normalizeStyle({ width: $setup.width(row.hours) })\n              }, null, 4 /* STYLE */)\n            ]),\n            _createElementVNode(\"span\", _hoisted_5, _toDisplayString($setup.formatHours(row.hours)) + \" u\", 1 /* TEXT */)\n          ]))\n        }), 128 /* KEYED_FRAGMENT */))\n      ]))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/HoursEmployeeWidget.vue?type=script\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/HoursEmployeeWidget.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/HoursEmployeeWidget.vue\";export default script;","<template>\n  <p v-if=\"rows.length === 0\" class=\"hh-wempty\">Geen budgetten ingesteld voor dit boekjaar.</p>\n  <div v-else class=\"hh-bars\">\n    <div v-for=\"row in rows\" :key=\"row.customerId\" class=\"hh-bar\">\n      <span class=\"hh-bar__label\" :title=\"`${row.title}: besteed ${formatEuro(row.spent)} van ${formatEuro(row.budget)}`\">{{ row.title }}</span>\n      <span class=\"hh-bar__track\">\n        <span class=\"hh-bar__fill\" :class=\"fillClass(row.pct)\" :style=\"{ width: `${Math.min(100, row.pct)}%` }\" />\n      </span>\n      <span class=\"hh-bar__value\" :class=\"{ 'budget__over': row.pct > 100 }\">{{ formatNumber(row.pct) }}%</span>\n    </div>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport type { DashboardData } from \"../../../lib/dashboard/data\";\nimport { formatEuro, formatNumber } from \"../../../lib/format\";\n\nconst props = defineProps<{ data: DashboardData }>();\nconst rows = computed(() => props.data.budgets.slice(0, 8));\n\nfunction fillClass(pct: number): string {\n  if (pct > 100) return \"hh-bar__fill--danger\";\n  if (pct >= 90) return \"hh-bar__fill--warn\";\n  return \"\";\n}\n</script>\n\n<style scoped>\n.budget__over {\n  color: var(--hh-danger);\n}\n</style>\n","import { openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, renderList as _renderList, Fragment as _Fragment, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, normalizeClass as _normalizeClass, normalizeStyle as _normalizeStyle } from \"vue\"\n\nconst _hoisted_1 = {\n  key: 0,\n  class: \"hh-wempty\"\n}\nconst _hoisted_2 = {\n  key: 1,\n  class: \"hh-bars\"\n}\nconst _hoisted_3 = [\"title\"]\nconst _hoisted_4 = { class: \"hh-bar__track\" }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return ($setup.rows.length === 0)\n    ? (_openBlock(), _createElementBlock(\"p\", _hoisted_1, \"Geen budgetten ingesteld voor dit boekjaar.\"))\n    : (_openBlock(), _createElementBlock(\"div\", _hoisted_2, [\n        (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.rows, (row) => {\n          return (_openBlock(), _createElementBlock(\"div\", {\n            key: row.customerId,\n            class: \"hh-bar\"\n          }, [\n            _createElementVNode(\"span\", {\n              class: \"hh-bar__label\",\n              title: `${row.title}: besteed ${$setup.formatEuro(row.spent)} van ${$setup.formatEuro(row.budget)}`\n            }, _toDisplayString(row.title), 9 /* TEXT, PROPS */, _hoisted_3),\n            _createElementVNode(\"span\", _hoisted_4, [\n              _createElementVNode(\"span\", {\n                class: _normalizeClass([\"hh-bar__fill\", $setup.fillClass(row.pct)]),\n                style: _normalizeStyle({ width: `${Math.min(100, row.pct)}%` })\n              }, null, 6 /* CLASS, STYLE */)\n            ]),\n            _createElementVNode(\"span\", {\n              class: _normalizeClass([\"hh-bar__value\", { 'budget__over': row.pct > 100 }])\n            }, _toDisplayString($setup.formatNumber(row.pct)) + \"%\", 3 /* TEXT, CLASS */)\n          ]))\n        }), 128 /* KEYED_FRAGMENT */))\n      ]))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/BudgetWidget.vue?type=script\";import \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/BudgetWidget.vue?type=style&index=0\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/BudgetWidget.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/BudgetWidget.vue\";script.__scopeId = \"data-v-d6be3397\";export default script;","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { RouterLink } from \"vue-router\";\nimport { QUICK_ACTIONS, parseQuickActions, type QuickActionId } from \"../../../lib/dashboard/quickActions\";\n\nconst props = defineProps<{ actions?: QuickActionId[]; editing?: boolean }>();\nconst emit = defineEmits<{ toggle: [selection: { action: QuickActionId; enabled: boolean }] }>();\nconst selected = computed(() => parseQuickActions(props.actions));\nconst visibleActions = computed(() => QUICK_ACTIONS.filter(action => selected.value.includes(action.id)));\n\nfunction onToggle({ action, event }: { action: QuickActionId; event: Event }): void {\n  emit(\"toggle\", { action, enabled: (event.target as HTMLInputElement).checked });\n}\n</script>\n\n<template>\n  <fieldset v-if=\"editing\" class=\"quick quick--editing\" aria-label=\"Snelacties kiezen\" @dragstart.stop.prevent>\n    <label v-for=\"action in QUICK_ACTIONS\" :key=\"action.id\" class=\"quick__option\">\n      <input\n        class=\"quick__checkbox\"\n        type=\"checkbox\"\n        :checked=\"selected.includes(action.id)\"\n        @change=\"onToggle({ action: action.id, event: $event })\"\n      >\n      <span>{{ action.label }}</span>\n    </label>\n  </fieldset>\n  <div v-else-if=\"visibleActions.length\" class=\"quick\">\n    <RouterLink v-for=\"action in visibleActions\" :key=\"action.id\" class=\"hh-btn quick__btn\" :to=\"{ name: action.id }\">\n      {{ action.label }}\n    </RouterLink>\n  </div>\n  <p v-else class=\"quick__empty\">Geen snelacties geselecteerd.</p>\n</template>\n\n<style scoped>\n.quick {\n  display: grid;\n  grid-template-columns: repeat(auto-fit, minmax(130px, 1fr));\n  gap: 8px;\n}\n.quick__btn {\n  justify-content: center;\n  text-decoration: none;\n}\n.quick--editing {\n  min-width: 0;\n  margin: 0;\n  padding: 0;\n  border: 0;\n}\n.quick__option {\n  display: flex;\n  align-items: center;\n  gap: 8px;\n  padding: 8px;\n  border: 1px solid var(--hh-line);\n  border-radius: var(--hh-radius);\n  font-size: 14px;\n  cursor: pointer;\n}\n.quick__option:focus-within {\n  outline: 2px solid var(--hh-accent);\n  outline-offset: 2px;\n}\n@media (hover: hover) {\n  .quick__option:hover {\n    background: var(--hh-surface-2);\n  }\n}\n.quick__checkbox {\n  accent-color: var(--hh-accent);\n  cursor: pointer;\n}\n.quick__empty {\n  margin: 0;\n  color: var(--hh-fg-muted);\n}\n</style>\n","import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, withModifiers as _withModifiers, createCommentVNode as _createCommentVNode, createTextVNode as _createTextVNode, withCtx as _withCtx, createBlock as _createBlock } from \"vue\"\n\nconst _hoisted_1 = [\"checked\", \"onChange\"]\nconst _hoisted_2 = {\n  key: 1,\n  class: \"quick\"\n}\nconst _hoisted_3 = {\n  key: 2,\n  class: \"quick__empty\"\n}\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return ($props.editing)\n    ? (_openBlock(), _createElementBlock(\"fieldset\", {\n        key: 0,\n        class: \"quick quick--editing\",\n        \"aria-label\": \"Snelacties kiezen\",\n        onDragstart: _cache[0] || (_cache[0] = _withModifiers(() => {}, [\"stop\",\"prevent\"]))\n      }, [\n        (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.QUICK_ACTIONS, (action) => {\n          return (_openBlock(), _createElementBlock(\"label\", {\n            key: action.id,\n            class: \"quick__option\"\n          }, [\n            _createElementVNode(\"input\", {\n              class: \"quick__checkbox\",\n              type: \"checkbox\",\n              checked: $setup.selected.includes(action.id),\n              onChange: $event => ($setup.onToggle({ action: action.id, event: $event }))\n            }, null, 40 /* PROPS, NEED_HYDRATION */, _hoisted_1),\n            _createElementVNode(\"span\", null, _toDisplayString(action.label), 1 /* TEXT */)\n          ]))\n        }), 128 /* KEYED_FRAGMENT */))\n      ], 32 /* NEED_HYDRATION */))\n    : ($setup.visibleActions.length)\n      ? (_openBlock(), _createElementBlock(\"div\", _hoisted_2, [\n          (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.visibleActions, (action) => {\n            return (_openBlock(), _createBlock($setup[\"RouterLink\"], {\n              key: action.id,\n              class: \"hh-btn quick__btn\",\n              to: { name: action.id }\n            }, {\n              default: _withCtx(() => [\n                _createTextVNode(_toDisplayString(action.label), 1 /* TEXT */)\n              ]),\n              _: 2 /* DYNAMIC */\n            }, 1032 /* PROPS, DYNAMIC_SLOTS */, [\"to\"]))\n          }), 128 /* KEYED_FRAGMENT */))\n        ]))\n      : (_openBlock(), _createElementBlock(\"p\", _hoisted_3, \"Geen snelacties geselecteerd.\"))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/QuickActionsWidget.vue?type=script\";import \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/QuickActionsWidget.vue?type=style&index=0\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/QuickActionsWidget.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/widgets/QuickActionsWidget.vue\";script.__scopeId = \"data-v-ba951618\";export default script;","<template>\n  <ul class=\"grid\">\n    <li\n      v-for=\"(widget, index) in layout\"\n      :key=\"widget.id\"\n      class=\"grid__item\"\n      :class=\"{ 'grid__item--l': widget.size === 'l', 'grid__item--drop': dragOverId === widget.id }\"\n      :draggable=\"editing\"\n      @dragstart=\"onDragStart(widget.id, $event)\"\n      @dragover=\"onDragOver(widget.id, $event)\"\n      @dragleave=\"onDragLeave(widget.id)\"\n      @drop=\"onDrop(widget.id)\"\n      @dragend=\"onDragEnd\"\n    >\n      <WidgetShell\n        :title=\"WIDGETS[widget.type].title\"\n        :editing=\"editing\"\n        :size=\"widget.size\"\n        :can-prev=\"index > 0\"\n        :can-next=\"index < layout.length - 1\"\n        @move-prev=\"emit('move', widget.id, 'prev')\"\n        @move-next=\"emit('move', widget.id, 'next')\"\n        @toggle-size=\"emit('resize', widget.id)\"\n        @remove=\"emit('remove', widget.id)\"\n      >\n        <QuickActionsWidget\n          v-if=\"widget.type === 'quick-actions'\"\n          :actions=\"widget.actions\"\n          :editing=\"editing\"\n          @toggle=\"emit('quick-action', { id: widget.id, ...$event })\"\n        />\n        <component v-else :is=\"COMPONENTS[widget.type]\" :data=\"data\" />\n      </WidgetShell>\n    </li>\n  </ul>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, type Component } from \"vue\";\nimport WidgetShell from \"./WidgetShell.vue\";\nimport { WIDGETS } from \"../../lib/dashboard/registry\";\nimport type { WidgetInstance, WidgetType } from \"../../lib/dashboard/types\";\nimport type { DashboardData } from \"../../lib/dashboard/data\";\nimport type { QuickActionId } from \"../../lib/dashboard/quickActions\";\n\nimport HoursWeekWidget from \"./widgets/HoursWeekWidget.vue\";\nimport OutstandingWidget from \"./widgets/OutstandingWidget.vue\";\nimport RevenueYtdWidget from \"./widgets/RevenueYtdWidget.vue\";\nimport WipWidget from \"./widgets/WipWidget.vue\";\nimport VatQuarterWidget from \"./widgets/VatQuarterWidget.vue\";\nimport CustomersWidget from \"./widgets/CustomersWidget.vue\";\nimport DsoWidget from \"./widgets/DsoWidget.vue\";\nimport ToDeclareWidget from \"./widgets/ToDeclareWidget.vue\";\nimport RecentEntriesWidget from \"./widgets/RecentEntriesWidget.vue\";\nimport RevenueChartWidget from \"./widgets/RevenueChartWidget.vue\";\nimport AgingWidget from \"./widgets/AgingWidget.vue\";\nimport DebtorsWidget from \"./widgets/DebtorsWidget.vue\";\nimport HoursEmployeeWidget from \"./widgets/HoursEmployeeWidget.vue\";\nimport BudgetWidget from \"./widgets/BudgetWidget.vue\";\nimport QuickActionsWidget from \"./widgets/QuickActionsWidget.vue\";\n\nconst props = defineProps<{\n  layout: WidgetInstance[];\n  data: DashboardData;\n  editing: boolean;\n}>();\n\nconst emit = defineEmits<{\n  move: [id: string, direction: \"prev\" | \"next\"];\n  resize: [id: string];\n  remove: [id: string];\n  reorder: [fromId: string, toId: string];\n  \"quick-action\": [selection: { id: string; action: QuickActionId; enabled: boolean }];\n}>();\n\nconst COMPONENTS: Record<WidgetType, Component> = {\n  \"hours-week\": HoursWeekWidget,\n  \"outstanding-total\": OutstandingWidget,\n  \"revenue-ytd\": RevenueYtdWidget,\n  wip: WipWidget,\n  \"vat-quarter\": VatQuarterWidget,\n  customers: CustomersWidget,\n  dso: DsoWidget,\n  \"to-declare\": ToDeclareWidget,\n  \"recent-entries\": RecentEntriesWidget,\n  \"revenue-chart\": RevenueChartWidget,\n  aging: AgingWidget,\n  debtors: DebtorsWidget,\n  \"hours-employee\": HoursEmployeeWidget,\n  budget: BudgetWidget,\n  \"quick-actions\": QuickActionsWidget,\n};\n\n// Drag-and-drop is een muis-extra bovenop de knop-navigatie (◀ ▶) uit de shell.\nconst draggedId = ref<string | null>(null);\nconst dragOverId = ref<string | null>(null);\n\nfunction onDragStart(id: string, event: DragEvent): void {\n  if (!props.editing) return;\n  draggedId.value = id;\n  event.dataTransfer?.setData(\"text/plain\", id);\n  if (event.dataTransfer) event.dataTransfer.effectAllowed = \"move\";\n}\nfunction onDragOver(id: string, event: DragEvent): void {\n  if (!props.editing || draggedId.value === null || draggedId.value === id) return;\n  event.preventDefault();                 // sta het loslaten toe\n  dragOverId.value = id;\n}\nfunction onDragLeave(id: string): void {\n  if (dragOverId.value === id) dragOverId.value = null;\n}\nfunction onDrop(id: string): void {\n  if (draggedId.value !== null && draggedId.value !== id) emit(\"reorder\", draggedId.value, id);\n  draggedId.value = null;\n  dragOverId.value = null;\n}\nfunction onDragEnd(): void {\n  draggedId.value = null;\n  dragOverId.value = null;\n}\n</script>\n\n<style scoped>\n.grid {\n  margin: 0;\n  padding: 0;\n  list-style: none;\n  display: grid;\n  grid-template-columns: repeat(2, minmax(0, 1fr));\n  gap: 16px;\n}\n.grid__item {\n  min-width: 0;\n}\n.grid__item--l {\n  grid-column: span 2;\n}\n.grid__item--drop {\n  outline: 2px dashed var(--hh-accent);\n  outline-offset: 2px;\n  border-radius: var(--hh-radius-lg);\n}\n@media (max-width: 640px) {\n  .grid {\n    grid-template-columns: 1fr;\n  }\n  .grid__item--l {\n    grid-column: auto;\n  }\n}\n</style>\n","import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, resolveDynamicComponent as _resolveDynamicComponent, withCtx as _withCtx, createVNode as _createVNode, normalizeClass as _normalizeClass } from \"vue\"\n\nconst _hoisted_1 = { class: \"grid\" }\nconst _hoisted_2 = [\"draggable\", \"onDragstart\", \"onDragover\", \"onDragleave\", \"onDrop\"]\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return (_openBlock(), _createElementBlock(\"ul\", _hoisted_1, [\n    (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($props.layout, (widget, index) => {\n      return (_openBlock(), _createElementBlock(\"li\", {\n        key: widget.id,\n        class: _normalizeClass([\"grid__item\", { 'grid__item--l': widget.size === 'l', 'grid__item--drop': $setup.dragOverId === widget.id }]),\n        draggable: $props.editing,\n        onDragstart: $event => ($setup.onDragStart(widget.id, $event)),\n        onDragover: $event => ($setup.onDragOver(widget.id, $event)),\n        onDragleave: $event => ($setup.onDragLeave(widget.id)),\n        onDrop: $event => ($setup.onDrop(widget.id)),\n        onDragend: $setup.onDragEnd\n      }, [\n        _createVNode($setup[\"WidgetShell\"], {\n          title: $setup.WIDGETS[widget.type].title,\n          editing: $props.editing,\n          size: widget.size,\n          \"can-prev\": index > 0,\n          \"can-next\": index < $props.layout.length - 1,\n          onMovePrev: $event => ($setup.emit('move', widget.id, 'prev')),\n          onMoveNext: $event => ($setup.emit('move', widget.id, 'next')),\n          onToggleSize: $event => ($setup.emit('resize', widget.id)),\n          onRemove: $event => ($setup.emit('remove', widget.id))\n        }, {\n          default: _withCtx(() => [\n            (widget.type === 'quick-actions')\n              ? (_openBlock(), _createBlock($setup[\"QuickActionsWidget\"], {\n                  key: 0,\n                  actions: widget.actions,\n                  editing: $props.editing,\n                  onToggle: $event => ($setup.emit('quick-action', { id: widget.id, ...$event }))\n                }, null, 8 /* PROPS */, [\"actions\", \"editing\", \"onToggle\"]))\n              : (_openBlock(), _createBlock(_resolveDynamicComponent($setup.COMPONENTS[widget.type]), {\n                  key: 1,\n                  data: $props.data\n                }, null, 8 /* PROPS */, [\"data\"]))\n          ]),\n          _: 2 /* DYNAMIC */\n        }, 1032 /* PROPS, DYNAMIC_SLOTS */, [\"title\", \"editing\", \"size\", \"can-prev\", \"can-next\", \"onMovePrev\", \"onMoveNext\", \"onToggleSize\", \"onRemove\"])\n      ], 42 /* CLASS, PROPS, NEED_HYDRATION */, _hoisted_2))\n    }), 128 /* KEYED_FRAGMENT */))\n  ]))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/DashboardGrid.vue?type=script\";import \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/DashboardGrid.vue?type=style&index=0\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/DashboardGrid.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/DashboardGrid.vue\";script.__scopeId = \"data-v-031e6434\";export default script;","<template>\n  <AppDialog title=\"Widgets beheren\" wide @close=\"emit('close')\">\n    <p class=\"manage__intro\">Zet widgets aan of uit voor je dashboard.</p>\n    <ul class=\"manage\">\n      <li v-for=\"type in WIDGET_TYPES\" :key=\"type\">\n        <label class=\"manage__item\">\n          <span class=\"manage__text\">\n            <span class=\"manage__title\">{{ WIDGETS[type].title }}</span>\n            <span class=\"manage__desc\">{{ WIDGETS[type].description }}</span>\n          </span>\n          <input\n            class=\"manage__toggle\"\n            type=\"checkbox\"\n            role=\"switch\"\n            :checked=\"active.includes(type)\"\n            :aria-label=\"WIDGETS[type].title\"\n            @change=\"onToggle(type, $event)\"\n          >\n        </label>\n      </li>\n    </ul>\n    <template #footer>\n      <button class=\"hh-btn hh-btn--primary\" type=\"button\" @click=\"emit('close')\">Klaar</button>\n    </template>\n  </AppDialog>\n</template>\n\n<script setup lang=\"ts\">\nimport AppDialog from \"../AppDialog.vue\";\nimport { WIDGETS, WIDGET_TYPES } from \"../../lib/dashboard/registry\";\nimport type { WidgetType } from \"../../lib/dashboard/types\";\n\nwithDefaults(defineProps<{ active?: WidgetType[] }>(), { active: () => [] });\n\nconst emit = defineEmits<{ toggle: [type: WidgetType, enabled: boolean]; close: [] }>();\n\nfunction onToggle(type: WidgetType, event: Event): void {\n  emit(\"toggle\", type, (event.target as HTMLInputElement).checked);\n}\n</script>\n\n<style scoped>\n.manage__intro {\n  margin: 0 0 12px;\n  color: var(--hh-fg-muted);\n  font-size: 13px;\n}\n.manage {\n  margin: 0;\n  padding: 0;\n  list-style: none;\n  display: flex;\n  flex-direction: column;\n  gap: 6px;\n}\n.manage__item {\n  display: flex;\n  align-items: center;\n  gap: 12px;\n  padding: 10px 12px;\n  border: 1px solid var(--hh-line);\n  border-radius: var(--hh-radius);\n  background: var(--hh-surface);\n  cursor: pointer;\n  transition: background-color 0.1s, border-color 0.1s;\n}\n.manage__item:hover,\n.manage__item:focus-within {\n  background: var(--hh-surface-2);\n  border-color: var(--hh-line-strong);\n}\n.manage__text {\n  flex: 1;\n  display: flex;\n  flex-direction: column;\n  gap: 2px;\n}\n.manage__title {\n  font-size: 13.5px;\n  font-weight: 600;\n  color: var(--hh-fg);\n}\n.manage__desc {\n  font-size: 12px;\n  color: var(--hh-fg-subtle);\n}\n.manage__toggle {\n  appearance: none;\n  -webkit-appearance: none;\n  position: relative;\n  flex: none;\n  width: 40px;\n  height: 22px;\n  border-radius: 999px;\n  background: var(--hh-line-strong);\n  cursor: pointer;\n  transition: background-color 0.15s;\n}\n.manage__toggle::after {\n  content: \"\";\n  position: absolute;\n  top: 2px;\n  left: 2px;\n  width: 18px;\n  height: 18px;\n  border-radius: 50%;\n  background: #ffffff;\n  box-shadow: 0 1px 2px rgba(28, 33, 27, 0.3);\n  transition: transform 0.15s;\n}\n.manage__toggle:checked {\n  background: var(--hh-accent);\n}\n.manage__toggle:checked::after {\n  transform: translateX(18px);\n}\n.manage__toggle:focus-visible {\n  outline: 2px solid var(--hh-accent);\n  outline-offset: 2px;\n}\n</style>\n","import { createElementVNode as _createElementVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, toDisplayString as _toDisplayString, withCtx as _withCtx, createBlock as _createBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"manage\" }\nconst _hoisted_2 = { class: \"manage__item\" }\nconst _hoisted_3 = { class: \"manage__text\" }\nconst _hoisted_4 = { class: \"manage__title\" }\nconst _hoisted_5 = { class: \"manage__desc\" }\nconst _hoisted_6 = [\"checked\", \"aria-label\", \"onChange\"]\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return (_openBlock(), _createBlock($setup[\"AppDialog\"], {\n    title: \"Widgets beheren\",\n    wide: \"\",\n    onClose: _cache[1] || (_cache[1] = $event => ($setup.emit('close')))\n  }, {\n    footer: _withCtx(() => [\n      _createElementVNode(\"button\", {\n        class: \"hh-btn hh-btn--primary\",\n        type: \"button\",\n        onClick: _cache[0] || (_cache[0] = $event => ($setup.emit('close')))\n      }, \"Klaar\")\n    ]),\n    default: _withCtx(() => [\n      _cache[2] || (_cache[2] = _createElementVNode(\"p\", { class: \"manage__intro\" }, \"Zet widgets aan of uit voor je dashboard.\", -1 /* CACHED */)),\n      _createElementVNode(\"ul\", _hoisted_1, [\n        (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.WIDGET_TYPES, (type) => {\n          return (_openBlock(), _createElementBlock(\"li\", { key: type }, [\n            _createElementVNode(\"label\", _hoisted_2, [\n              _createElementVNode(\"span\", _hoisted_3, [\n                _createElementVNode(\"span\", _hoisted_4, _toDisplayString($setup.WIDGETS[type].title), 1 /* TEXT */),\n                _createElementVNode(\"span\", _hoisted_5, _toDisplayString($setup.WIDGETS[type].description), 1 /* TEXT */)\n              ]),\n              _createElementVNode(\"input\", {\n                class: \"manage__toggle\",\n                type: \"checkbox\",\n                role: \"switch\",\n                checked: $props.active.includes(type),\n                \"aria-label\": $setup.WIDGETS[type].title,\n                onChange: $event => ($setup.onToggle(type, $event))\n              }, null, 40 /* PROPS, NEED_HYDRATION */, _hoisted_6)\n            ])\n          ]))\n        }), 128 /* KEYED_FRAGMENT */))\n      ])\n    ]),\n    _: 1 /* STABLE */,\n    __: [2]\n  }))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/WidgetManager.vue?type=script\";import \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/WidgetManager.vue?type=style&index=0\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/WidgetManager.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/dashboard/WidgetManager.vue\";script.__scopeId = \"data-v-ffe6ae7d\";export default script;","<template>\n  <section class=\"dash\">\n    <header class=\"dash__head\">\n      <div>\n        <h1 class=\"dash__title\">Dashboard</h1>\n        <p class=\"dash__welcome\">Welkom bij Happy Hours{{ name ? `, ${name}` : \"\" }}.</p>\n      </div>\n      <div class=\"dash__actions\">\n        <button v-if=\"editing\" class=\"hh-btn\" type=\"button\" @click=\"managerOpen = true\">Widgets beheren</button>\n        <button\n          class=\"hh-btn\"\n          :class=\"{ 'hh-btn--primary': editing }\"\n          type=\"button\"\n          @click=\"editing = !editing\"\n        >{{ editing ? \"Klaar\" : \"Aanpassen\" }}</button>\n      </div>\n    </header>\n\n    <p v-if=\"error\" class=\"dash__error\">{{ error }}</p>\n\n    <div v-if=\"loading\" class=\"dash__loading\">Laden…</div>\n\n    <template v-else-if=\"data\">\n      <p v-if=\"layout.length === 0\" class=\"dash__empty\">\n        Je dashboard is leeg.\n        <template v-if=\"editing\">Zet widgets aan via Widgets beheren.</template>\n        <template v-else>Klik op Aanpassen om widgets te beheren.</template>\n      </p>\n      <DashboardGrid\n        v-else\n        :layout=\"layout\"\n        :data=\"data\"\n        :editing=\"editing\"\n        @move=\"move\"\n        @resize=\"onResize\"\n        @remove=\"remove\"\n        @reorder=\"reorder\"\n        @quick-action=\"setQuickAction\"\n      />\n    </template>\n\n    <WidgetManager v-if=\"managerOpen\" :active=\"usedTypes\" @toggle=\"setType\" @close=\"managerOpen = false\" />\n  </section>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, onMounted, ref } from \"vue\";\nimport { useApi } from \"../lib/api\";\nimport type { DashboardData } from \"../lib/dashboard/data\";\nimport { useDashboardLayout } from \"../lib/dashboard/useDashboardLayout\";\nimport DashboardGrid from \"../components/dashboard/DashboardGrid.vue\";\nimport WidgetManager from \"../components/dashboard/WidgetManager.vue\";\n\nconst api = useApi();\n\nconst { layout, load: loadLayout, setType, remove, move, resize, reorder, setQuickAction } = useDashboardLayout();\n\nconst name = ref(\"\");\nconst data = ref<DashboardData | null>(null);\nconst loading = ref(true);\nconst error = ref(\"\");\nconst editing = ref(false);\nconst managerOpen = ref(false);\n\nconst usedTypes = computed(() => layout.value.map((widget) => widget.type));\n\n// De grid vraagt een grootte-toggle; hier vertalen we dat naar een expliciete maat.\nfunction onResize(id: string): void {\n  const widget = layout.value.find((item) => item.id === id);\n  if (widget) resize(id, widget.size === \"s\" ? \"l\" : \"s\");\n}\n\nonMounted(async () => {\n  try {\n    const [me, dashboard] = await Promise.all([api.me(), api.dashboardData(), loadLayout()]);\n    name.value = me.name || me.email;\n    data.value = dashboard;\n  } catch {\n    error.value = \"Kon het dashboard niet laden.\";\n  } finally {\n    loading.value = false;\n  }\n});\n</script>\n\n<style scoped>\n.dash__head {\n  display: flex;\n  align-items: flex-start;\n  justify-content: space-between;\n  gap: 16px;\n  margin-bottom: 20px;\n}\n.dash__title {\n  margin: 0 0 4px;\n  font-size: 22px;\n  font-weight: 700;\n  letter-spacing: -0.02em;\n}\n.dash__welcome {\n  margin: 0;\n  color: var(--hh-fg-muted);\n}\n.dash__actions {\n  display: flex;\n  gap: 8px;\n  flex-wrap: wrap;\n}\n.dash__error {\n  margin: 0 0 16px;\n  padding: 10px 12px;\n  border: 1px solid rgba(199, 58, 52, 0.55);\n  border-radius: var(--hh-radius);\n  background: var(--hh-danger-soft);\n  color: var(--hh-danger);\n  font-size: 13px;\n}\n.dash__loading {\n  color: var(--hh-fg-muted);\n}\n.dash__empty {\n  margin: 0;\n  padding: 28px 20px;\n  text-align: center;\n  color: var(--hh-fg-subtle);\n  font-size: 13.5px;\n  border: 1px dashed var(--hh-line-strong);\n  border-radius: var(--hh-radius-lg);\n}\n</style>\n","import { createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, normalizeClass as _normalizeClass, createTextVNode as _createTextVNode, Fragment as _Fragment, createBlock as _createBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"dash\" }\nconst _hoisted_2 = { class: \"dash__head\" }\nconst _hoisted_3 = { class: \"dash__welcome\" }\nconst _hoisted_4 = { class: \"dash__actions\" }\nconst _hoisted_5 = {\n  key: 0,\n  class: \"dash__error\"\n}\nconst _hoisted_6 = {\n  key: 1,\n  class: \"dash__loading\"\n}\nconst _hoisted_7 = {\n  key: 0,\n  class: \"dash__empty\"\n}\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return (_openBlock(), _createElementBlock(\"section\", _hoisted_1, [\n    _createElementVNode(\"header\", _hoisted_2, [\n      _createElementVNode(\"div\", null, [\n        _cache[3] || (_cache[3] = _createElementVNode(\"h1\", { class: \"dash__title\" }, \"Dashboard\", -1 /* CACHED */)),\n        _createElementVNode(\"p\", _hoisted_3, \"Welkom bij Happy Hours\" + _toDisplayString($setup.name ? `, ${$setup.name}` : \"\") + \".\", 1 /* TEXT */)\n      ]),\n      _createElementVNode(\"div\", _hoisted_4, [\n        ($setup.editing)\n          ? (_openBlock(), _createElementBlock(\"button\", {\n              key: 0,\n              class: \"hh-btn\",\n              type: \"button\",\n              onClick: _cache[0] || (_cache[0] = $event => ($setup.managerOpen = true))\n            }, \"Widgets beheren\"))\n          : _createCommentVNode(\"v-if\", true),\n        _createElementVNode(\"button\", {\n          class: _normalizeClass([\"hh-btn\", { 'hh-btn--primary': $setup.editing }]),\n          type: \"button\",\n          onClick: _cache[1] || (_cache[1] = $event => ($setup.editing = !$setup.editing))\n        }, _toDisplayString($setup.editing ? \"Klaar\" : \"Aanpassen\"), 3 /* TEXT, CLASS */)\n      ])\n    ]),\n    ($setup.error)\n      ? (_openBlock(), _createElementBlock(\"p\", _hoisted_5, _toDisplayString($setup.error), 1 /* TEXT */))\n      : _createCommentVNode(\"v-if\", true),\n    ($setup.loading)\n      ? (_openBlock(), _createElementBlock(\"div\", _hoisted_6, \"Laden…\"))\n      : ($setup.data)\n        ? (_openBlock(), _createElementBlock(_Fragment, { key: 2 }, [\n            ($setup.layout.length === 0)\n              ? (_openBlock(), _createElementBlock(\"p\", _hoisted_7, [\n                  _cache[4] || (_cache[4] = _createTextVNode(\" Je dashboard is leeg. \", -1 /* CACHED */)),\n                  ($setup.editing)\n                    ? (_openBlock(), _createElementBlock(_Fragment, { key: 0 }, [\n                        _createTextVNode(\"Zet widgets aan via Widgets beheren.\")\n                      ], 64 /* STABLE_FRAGMENT */))\n                    : (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n                        _createTextVNode(\"Klik op Aanpassen om widgets te beheren.\")\n                      ], 64 /* STABLE_FRAGMENT */))\n                ]))\n              : (_openBlock(), _createBlock($setup[\"DashboardGrid\"], {\n                  key: 1,\n                  layout: $setup.layout,\n                  data: $setup.data,\n                  editing: $setup.editing,\n                  onMove: $setup.move,\n                  onResize: $setup.onResize,\n                  onRemove: $setup.remove,\n                  onReorder: $setup.reorder,\n                  onQuickAction: $setup.setQuickAction\n                }, null, 8 /* PROPS */, [\"layout\", \"data\", \"editing\", \"onMove\", \"onRemove\", \"onReorder\", \"onQuickAction\"]))\n          ], 64 /* STABLE_FRAGMENT */))\n        : _createCommentVNode(\"v-if\", true),\n    ($setup.managerOpen)\n      ? (_openBlock(), _createBlock($setup[\"WidgetManager\"], {\n          key: 3,\n          active: $setup.usedTypes,\n          onToggle: $setup.setType,\n          onClose: _cache[2] || (_cache[2] = $event => ($setup.managerOpen = false))\n        }, null, 8 /* PROPS */, [\"active\", \"onToggle\"]))\n      : _createCommentVNode(\"v-if\", true)\n  ]))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/DashboardView.vue?type=script\";import \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/DashboardView.vue?type=style&index=0\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/DashboardView.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/DashboardView.vue\";script.__scopeId = \"data-v-d429b46d\";export default script;","import { onBeforeUnmount, onMounted, ref, type Ref } from \"vue\";\n\n// Toetsenbordbediening voor lijstweergaven (DOS-gewoonte): `/` focust het\n// zoekveld, `n` = nieuw, pijltjes lopen door de rijen en Enter opent de actieve\n// rij. Werkt ook terwijl de cursor in het zoekveld staat (typen -> pijl-omlaag\n// de lijst in). Genegeerd zodra er een dialoog open staat of je in een ander\n// invoerveld typt.\n\nexport interface ListKeyboardOptions {\n  itemCount: () => number;\n  onNew?: () => void;\n  onOpen?: (index: number) => void;\n  searchInput?: Ref<HTMLInputElement | null>;\n}\n\nexport function useListKeyboard(options: ListKeyboardOptions) {\n  const activeIndex = ref(-1);\n\n  function inSearch(): boolean {\n    return Boolean(options.searchInput?.value) && document.activeElement === options.searchInput?.value;\n  }\n\n  function isTyping(): boolean {\n    const el = document.activeElement as HTMLElement | null;\n    if (!el) return false;\n    return el.tagName === \"INPUT\" || el.tagName === \"TEXTAREA\" || el.tagName === \"SELECT\" || el.isContentEditable;\n  }\n\n  function dialogOpen(): boolean {\n    return Boolean(document.querySelector(\".dialog-backdrop\"));\n  }\n\n  function scrollActiveIntoView(): void {\n    const row = document.querySelector<HTMLElement>(`[data-list-row=\"${activeIndex.value}\"]`);\n    row?.scrollIntoView({ block: \"nearest\" });\n  }\n\n  function reset(): void {\n    activeIndex.value = -1;\n  }\n\n  function onKeydown(event: KeyboardEvent): void {\n    if (dialogOpen()) return;\n    const count = options.itemCount();\n    const navAllowed = !isTyping() || inSearch();\n\n    if (event.key === \"/\" && !isTyping()) {\n      event.preventDefault();\n      options.searchInput?.value?.focus();\n      return;\n    }\n    if (event.key === \"n\" && !isTyping() && !event.metaKey && !event.ctrlKey && !event.altKey) {\n      event.preventDefault();\n      options.onNew?.();\n      return;\n    }\n    if (event.key === \"ArrowDown\" && navAllowed) {\n      event.preventDefault();\n      if (count === 0) return;\n      activeIndex.value = activeIndex.value < 0 ? 0 : Math.min(activeIndex.value + 1, count - 1);\n      scrollActiveIntoView();\n      return;\n    }\n    if (event.key === \"ArrowUp\" && navAllowed) {\n      event.preventDefault();\n      if (count === 0) return;\n      activeIndex.value = activeIndex.value <= 0 ? 0 : activeIndex.value - 1;\n      scrollActiveIntoView();\n      return;\n    }\n    if (event.key === \"Enter\" && navAllowed) {\n      if (activeIndex.value >= 0 && activeIndex.value < count) {\n        event.preventDefault();\n        options.onOpen?.(activeIndex.value);\n      }\n    }\n  }\n\n  onMounted(() => window.addEventListener(\"keydown\", onKeydown));\n  onBeforeUnmount(() => window.removeEventListener(\"keydown\", onKeydown));\n\n  return { activeIndex, reset };\n}\n","import { computed, onBeforeUnmount, onMounted, shallowRef, watch } from \"vue\";\n\ninterface RowPage {\n  rows: unknown[];\n  totalCount: number;\n  nextOffset: number | null;\n}\n\n/** Fetch successive pages and discard replies from a previous selection or unmounted view. */\nexport function usePagedRows<Page extends RowPage>(fetchPage: (offset: number) => Promise<Page>) {\n  type Row = Page[\"rows\"][number];\n  const rows = shallowRef<Row[]>([]);\n  const page = shallowRef<Page | null>(null);\n  const loading = shallowRef(true);\n  const loadingMore = shallowRef(false);\n  const error = shallowRef(\"\");\n  const moreError = shallowRef(\"\");\n  const trigger = shallowRef<HTMLElement | null>(null);\n  const totalCount = computed(() => page.value?.totalCount ?? 0);\n  const hasMore = computed(() => page.value?.nextOffset != null);\n  let generation = 0;\n  let disposed = false;\n  let pending: Promise<boolean> | null = null;\n  let observer: IntersectionObserver | undefined;\n\n  function loadMore(): Promise<boolean> {\n    if (pending) return pending;\n    if (disposed || (page.value && !hasMore.value)) return Promise.resolve(false);\n    const current = generation;\n    const offset = page.value?.nextOffset ?? 0;\n    loadingMore.value = true;\n    moreError.value = \"\";\n    // Start in a microtask so even a synchronous loader error can clear the assigned pending promise.\n    pending = Promise.resolve().then(async () => {\n      try {\n        const response = await fetchPage(offset);\n        if (disposed || current !== generation) return false;\n        if (response.nextOffset !== null && (!response.rows.length || response.nextOffset <= offset))\n          throw new Error(\"Het bijladen leverde geen nieuwe regels op. Probeer opnieuw.\");\n        rows.value = [...rows.value, ...response.rows as Row[]];\n        page.value = response;\n        return true;\n      } catch (cause) {\n        if (!disposed && current === generation) {\n          const message = cause instanceof Error ? cause.message : \"Kon de gegevens niet laden.\";\n          if (offset === 0) error.value = message;\n          else moreError.value = message;\n        }\n        return false;\n      } finally {\n        if (!disposed && current === generation) {\n          loading.value = false;\n          loadingMore.value = false;\n          pending = null;\n        }\n      }\n    });\n    return pending;\n  }\n\n  function reload(): Promise<boolean> {\n    generation++;\n    pending = null;\n    rows.value = [];\n    page.value = null;\n    error.value = \"\";\n    moreError.value = \"\";\n    loading.value = true;\n    return loadMore();\n  }\n\n  async function ensureLoaded(index: number): Promise<boolean> {\n    const current = generation;\n    while (rows.value.length <= index) {\n      if (!await loadMore() || current !== generation) return false;\n    }\n    return true;\n  }\n\n  function observe(): void {\n    observer?.disconnect();\n    // Reobserve each completed page so tall viewports keep filling; failed pages require an explicit retry.\n    if (trigger.value && hasMore.value && !loadingMore.value && !moreError.value) observer?.observe(trigger.value);\n  }\n\n  watch([trigger, rows, hasMore, loadingMore, moreError], observe, { flush: \"post\" });\n  onMounted(() => {\n    if (typeof IntersectionObserver !== \"undefined\") {\n      observer = new IntersectionObserver(changes => {\n        // Ignore queued notifications for a trigger removed by a filter or route change.\n        if (!loadingMore.value && !moreError.value && hasMore.value && changes.some(change => change.isIntersecting && change.target === trigger.value)) void loadMore();\n      }, { rootMargin: \"600px 0px\" });\n      observe();\n    }\n  });\n  onBeforeUnmount(() => { disposed = true; generation++; observer?.disconnect(); });\n  return { rows, page, totalCount, loading, loadingMore, error, moreError, hasMore, trigger, loadMore, reload, ensureLoaded };\n}\n","export interface CustomerListState {\n  search: string;\n  includeArchived: boolean;\n}\n\nexport function parseCustomerListState(query: Record<string, string | undefined>): CustomerListState {\n  return { search: query.q ?? \"\", includeArchived: query.archief === \"1\" };\n}\n\n/** Preserve the entered text exactly; trimming belongs to list filtering. */\nexport function customerListStateToQuery(state: CustomerListState): Record<string, string> {\n  const query: Record<string, string> = {};\n  if (state.search) query.q = state.search;\n  if (state.includeArchived) query.archief = \"1\";\n  return query;\n}\n","/** Split a legacy single-line address without treating digits in street names as the house number. */\nexport function splitCustomerAddress(address: string): { street: string; houseNumber: string } {\n  const match = address.trim().match(/^(.*?)\\s+(\\d+\\s*[a-zA-Z]?(?:\\s*[-/]\\s*\\d+[a-zA-Z]?)?)$/);\n  return match ? { street: match[1], houseNumber: match[2] } : { street: address.trim(), houseNumber: \"\" };\n}\n","// Datumhulpjes (NL/ISO). Pure functies, geen @webhare-runtime imports zodat ze\n// via `wh runtest` unit-testbaar zijn.\n\n/**\n * ISO 8601-weeknummer van een datum (maandag = eerste dag; week 1 bevat de\n * eerste donderdag van het jaar). Gebruikt voor de kop van de uren-invoer.\n *\n * @param date - De datum\n */\nexport function isoWeek(date: Date): number {\n  const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));\n  const dayNum = (d.getUTCDay() + 6) % 7; // maandag = 0 ... zondag = 6\n  d.setUTCDate(d.getUTCDate() - dayNum + 3); // schuif naar de donderdag van deze week\n  const firstThursday = new Date(Date.UTC(d.getUTCFullYear(), 0, 4));\n  const firstDayNum = (firstThursday.getUTCDay() + 6) % 7;\n  firstThursday.setUTCDate(firstThursday.getUTCDate() - firstDayNum + 3);\n  const week = 1 + Math.round((d.getTime() - firstThursday.getTime()) / (7 * 24 * 3600 * 1000));\n  return week;\n}\n\n/** Vandaag als ISO-datumstring (YYYY-MM-DD), lokale tijd. */\nexport function todayISODate(): string {\n  const now = new Date();\n  const yyyy = now.getFullYear();\n  const mm = String(now.getMonth() + 1).padStart(2, \"0\");\n  const dd = String(now.getDate()).padStart(2, \"0\");\n  return `${yyyy}-${mm}-${dd}`;\n}\n\n/** Fiscaal jaar van een ISO-datumstring = het kalenderjaar. Lege/ongeldige invoer valt terug op 0. */\nexport function fiscalYearOf(isoDate: string): number {\n  const date = new Date(isoDate);\n  if (Number.isNaN(date.getTime())) return 0;\n  return date.getFullYear();\n}\n\n/**\n * Boekjaar-invoer naar een 4-cijferig jaartal. Twee cijfers worden uitgeklapt\n * rond pivot 70 (70-99 -> 19xx, 00-69 -> 20xx), zodat \"08\" -> 2008 en \"94\" -> 1994.\n * Vier cijfers binnen 1900-2100 blijven ongewijzigd. Ongeldige of buiten-bereik\n * invoer valt terug op 0 (de aanroeper markeert dat als fout).\n *\n * @param input - Ruwe invoer (string of getal), 1 t/m 4 cijfers\n */\nexport function expandFiscalYear(input: string | number): number {\n  const raw = String(input).trim();\n  if (!/^\\d{1,4}$/.test(raw)) return 0;\n  let year = Number(raw);\n  if (raw.length <= 2) year = year >= 70 ? 1900 + year : 2000 + year;\n  if (year < 1900 || year > 2100) return 0;\n  return year;\n}\n","<template>\n  <AppDialog :title=\"isEdit ? 'Klant bewerken' : 'Nieuwe klant'\" wide @close=\"emit('close')\">\n    <form @submit.prevent=\"submit\">\n      <p v-if=\"formError\" class=\"hh-formerror\">{{ formError }}</p>\n      <FormField label=\"Klantnummer\" for-id=\"c-number\" required :error=\"fieldErrors.number\">\n        <input id=\"c-number\" v-model.trim=\"form.number\" class=\"hh-input hh-input--mono\" data-autofocus :class=\"{ 'hh-input--error': fieldErrors.number }\" />\n      </FormField>\n      <FormField label=\"Bedrijfsnaam\" for-id=\"c-company\" :error=\"fieldErrors.company\">\n        <input id=\"c-company\" v-model.trim=\"form.company\" class=\"hh-input\" :class=\"{ 'hh-input--error': fieldErrors.company }\" />\n      </FormField>\n      <div class=\"cfd__grid cfd__grid--contact\">\n        <FormField label=\"Aanhef\" for-id=\"c-title\">\n          <input id=\"c-title\" v-model.trim=\"form.contactTitle\" class=\"hh-input\" placeholder=\"Dhr. / Mevr.\" />\n        </FormField>\n        <FormField label=\"Contactpersoon\" for-id=\"c-contact\" :error=\"fieldErrors.contactName\">\n          <input id=\"c-contact\" v-model.trim=\"form.contactName\" class=\"hh-input\" :class=\"{ 'hh-input--error': fieldErrors.contactName }\" />\n        </FormField>\n      </div>\n      <div class=\"cfd__grid\">\n        <FormField label=\"Postcode\" for-id=\"c-lookup-postal\">\n          <input id=\"c-lookup-postal\" v-model.trim=\"form.postalCode\" class=\"hh-input hh-input--mono\" placeholder=\"1234 AB\" @blur=\"lookupAddress\" />\n        </FormField>\n        <FormField label=\"Huisnummer\" for-id=\"c-house-number\">\n          <input id=\"c-house-number\" v-model.trim=\"houseNumber\" class=\"hh-input\" placeholder=\"12\" @blur=\"lookupAddress\" />\n        </FormField>\n      </div>\n      <p v-if=\"lookupText\" class=\"cfd__lookup\" role=\"status\">{{ lookupText }}</p>\n      <FormField label=\"Adres\" for-id=\"c-address\">\n        <input id=\"c-address\" v-model.trim=\"form.address\" class=\"hh-input\" />\n      </FormField>\n      <div class=\"cfd__grid\">\n        <FormField label=\"Plaats\" for-id=\"c-city\">\n          <input id=\"c-city\" v-model.trim=\"form.city\" class=\"hh-input\" />\n        </FormField>\n      </div>\n      <div class=\"cfd__grid\">\n        <FormField label=\"Telefoon\" for-id=\"c-phone\">\n          <input id=\"c-phone\" v-model.trim=\"form.phone\" class=\"hh-input hh-input--mono\" />\n        </FormField>\n        <FormField label=\"Telefoon (reserve)\" for-id=\"c-phone2\">\n          <input id=\"c-phone2\" v-model.trim=\"form.phone2\" class=\"hh-input hh-input--mono\" />\n        </FormField>\n      </div>\n      <div>\n        <FormField label=\"E-mail\" for-id=\"c-email\" :error=\"fieldErrors.email\">\n          <input id=\"c-email\" v-model.trim=\"form.email\" class=\"hh-input\" :class=\"{ 'hh-input--error': fieldErrors.email }\" inputmode=\"email\" />\n        </FormField>\n      </div>\n      <FormField label=\"Minimumjaar (0 = geen)\" for-id=\"c-minyear\" hint=\"Boekingen vóór dit jaar worden geweigerd.\" :error=\"fieldErrors.minYear\">\n        <input id=\"c-minyear\" v-model=\"form.minYear\" class=\"hh-input hh-input--num cfd__year\" :class=\"{ 'hh-input--error': fieldErrors.minYear }\"\n          inputmode=\"numeric\" maxlength=\"4\" :aria-invalid=\"Boolean(fieldErrors.minYear)\" @focus=\"selectMinYear\" @click=\"selectMinYear\" @blur=\"normalizeMinYear\" />\n      </FormField>\n      <button type=\"submit\" hidden></button>\n    </form>\n    <template #footer>\n      <button class=\"hh-btn\" type=\"button\" @click=\"emit('close')\">Annuleren</button>\n      <button class=\"hh-btn hh-btn--primary\" type=\"button\" :disabled=\"saving\" @click=\"submit\">\n        {{ saving ? \"Opslaan…\" : (isEdit ? \"Opslaan\" : \"Aanmaken\") }}\n      </button>\n    </template>\n  </AppDialog>\n</template>\n\n<script setup lang=\"ts\">\n// Gedeelde klant-formulierdialoog voor aanmaken én bewerken. De ouder handelt\n// navigatie/herladen af via het `saved`-event (met het wrdId).\nimport { computed, reactive, ref } from \"vue\";\nimport { useApi } from \"../lib/api\";\nimport { splitCustomerAddress } from \"../lib/customerAddress\";\nimport { expandFiscalYear } from \"../lib/dates\";\nimport AppDialog from \"./AppDialog.vue\";\nimport FormField from \"./FormField.vue\";\n\nconst api = useApi();\n\ninterface CustomerLike {\n  id: number;\n  number: string;\n  company: string;\n  contactTitle: string;\n  contactName: string;\n  address: string;\n  postalCode: string;\n  city: string;\n  phone: string;\n  phone2?: string;\n  email: string;\n  minYear: number;\n}\n\nconst props = withDefaults(defineProps<{ customer?: CustomerLike | null }>(), { customer: null });\nconst emit = defineEmits<{ close: []; saved: [number] }>();\n\nconst isEdit = computed(() => props.customer !== null);\nconst saving = ref(false);\nconst formError = ref(\"\");\nconst fieldErrors = reactive<Record<string, string>>({});\n\nconst form = reactive({\n  number: props.customer?.number ?? \"\",\n  company: props.customer?.company ?? \"\",\n  contactTitle: props.customer?.contactTitle ?? \"\",\n  contactName: props.customer?.contactName ?? \"\",\n  address: props.customer?.address ?? \"\",\n  postalCode: props.customer?.postalCode ?? \"\",\n  city: props.customer?.city ?? \"\",\n  phone: props.customer?.phone ?? \"\",\n  phone2: props.customer?.phone2 ?? \"\",\n  email: props.customer?.email ?? \"\",\n  // Preserve raw digits: \"00\" means 2000, while \"0\" means no minimum.\n  minYear: String(props.customer?.minYear ?? 0),\n});\n\nconst houseNumber = ref(splitCustomerAddress(props.customer?.address ?? \"\").houseNumber);\nconst lookupText = ref(\"\");\nlet lookupRequest = 0;\nlet pendingLookup: Promise<void> | null = null;\n\nfunction lookupAddress(): Promise<void> {\n  pendingLookup = resolveAddress();\n  return pendingLookup;\n}\n\nasync function resolveAddress(): Promise<void> {\n  const zip = form.postalCode.trim();\n  const number = houseNumber.value.trim();\n  const originalAddress = form.address;\n  const originalCity = form.city;\n  const request = ++lookupRequest;\n  if (!zip || !number) { lookupText.value = \"\"; return; }\n  lookupText.value = \"Adres zoeken...\";\n  try {\n    const result = await api.lookupAddress({ zip, houseNumber: number });\n    // Ignore a response for an address the user has already changed.\n    if (request !== lookupRequest || zip !== form.postalCode.trim() || number !== houseNumber.value.trim()) return;\n    if (form.address !== originalAddress || form.city !== originalCity) {\n      lookupText.value = \"Handmatig aangepast adres behouden.\";\n      return;\n    }\n    if (result.status === \"ok\") {\n      form.address = `${result.street} ${number}`;\n      form.city = result.city;\n      if (result.zip) form.postalCode = result.zip;\n      lookupText.value = \"Adres gevonden.\";\n    } else {\n      lookupText.value = \"Adres niet gevonden. Vul het adres handmatig in.\";\n    }\n  } catch {\n    if (request === lookupRequest) lookupText.value = \"Adrescontrole mislukt. Vul het adres handmatig in.\";\n  }\n}\n\nfunction selectMinYear(event: Event): void {\n  // A pointer click can collapse the focus selection; select again after the click.\n  if (event.target instanceof HTMLInputElement) event.target.select();\n}\n\nfunction normalizeMinYear(): void {\n  const raw = form.minYear.trim();\n  if (!raw || raw === \"0\") { form.minYear = \"0\"; return; }\n  const year = expandFiscalYear(raw);\n  if (year) form.minYear = String(year);\n}\n\nfunction validate(): boolean {\n  for (const key of Object.keys(fieldErrors)) delete fieldErrors[key];\n  normalizeMinYear();\n  if (!form.number) fieldErrors.number = \"Klantnummer is verplicht.\";\n  if (!form.company && !form.contactName) fieldErrors.company = \"Vul een bedrijfsnaam of contactpersoon in.\";\n  if (form.email && !form.email.includes(\"@\")) fieldErrors.email = \"Ongeldig e-mailadres.\";\n  if (form.minYear !== \"0\" && !expandFiscalYear(form.minYear)) fieldErrors.minYear = \"Vul een geldig jaar in (1900 t/m 2100), of 0 voor geen minimum.\";\n  return Object.keys(fieldErrors).length === 0;\n}\n\nasync function submit(): Promise<void> {\n  if (!validate()) return;\n  saving.value = true;\n  formError.value = \"\";\n  try {\n    // A save click can blur the house number and start a lookup first.\n    // Wait for that result so the submitted address matches the visible number.\n    await pendingLookup;\n    const payload = {\n      number: form.number,\n      company: form.company,\n      contactTitle: form.contactTitle,\n      contactName: form.contactName,\n      address: form.address,\n      postalCode: form.postalCode,\n      city: form.city,\n      phone: form.phone,\n      phone2: form.phone2,\n      email: form.email,\n      minYear: Number(form.minYear) || 0,\n    };\n    if (props.customer) {\n      await api.updateCustomer({ id: props.customer.id, ...payload });\n      emit(\"saved\", props.customer.id);\n    } else {\n      const id = await api.createCustomer(payload);\n      emit(\"saved\", id);\n    }\n  } catch (e) {\n    formError.value = e instanceof Error ? e.message : \"Opslaan mislukt.\";\n  } finally {\n    saving.value = false;\n  }\n}\n</script>\n\n<style scoped>\n.cfd__year { width: 100px; }\n.cfd__lookup {\n  margin: 0 0 14px;\n  color: var(--hh-fg-muted);\n  font-size: 13px;\n}\n.cfd__grid {\n  display: grid;\n  grid-template-columns: 1fr 1fr;\n  gap: 10px;\n}\n.cfd__grid--contact {\n  grid-template-columns: 140px 1fr;\n}\n</style>\n","import { toDisplayString as _toDisplayString, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, vModelText as _vModelText, normalizeClass as _normalizeClass, createElementVNode as _createElementVNode, withDirectives as _withDirectives, withCtx as _withCtx, createVNode as _createVNode, withModifiers as _withModifiers, createBlock as _createBlock } from \"vue\"\n\nconst _hoisted_1 = {\n  key: 0,\n  class: \"hh-formerror\"\n}\nconst _hoisted_2 = { class: \"cfd__grid cfd__grid--contact\" }\nconst _hoisted_3 = { class: \"cfd__grid\" }\nconst _hoisted_4 = {\n  key: 1,\n  class: \"cfd__lookup\",\n  role: \"status\"\n}\nconst _hoisted_5 = { class: \"cfd__grid\" }\nconst _hoisted_6 = { class: \"cfd__grid\" }\nconst _hoisted_7 = [\"aria-invalid\"]\nconst _hoisted_8 = [\"disabled\"]\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return (_openBlock(), _createBlock($setup[\"AppDialog\"], {\n    title: $setup.isEdit ? 'Klant bewerken' : 'Nieuwe klant',\n    wide: \"\",\n    onClose: _cache[13] || (_cache[13] = $event => ($setup.emit('close')))\n  }, {\n    footer: _withCtx(() => [\n      _createElementVNode(\"button\", {\n        class: \"hh-btn\",\n        type: \"button\",\n        onClick: _cache[12] || (_cache[12] = $event => ($setup.emit('close')))\n      }, \"Annuleren\"),\n      _createElementVNode(\"button\", {\n        class: \"hh-btn hh-btn--primary\",\n        type: \"button\",\n        disabled: $setup.saving,\n        onClick: $setup.submit\n      }, _toDisplayString($setup.saving ? \"Opslaan…\" : ($setup.isEdit ? \"Opslaan\" : \"Aanmaken\")), 9 /* TEXT, PROPS */, _hoisted_8)\n    ]),\n    default: _withCtx(() => [\n      _createElementVNode(\"form\", {\n        onSubmit: _withModifiers($setup.submit, [\"prevent\"])\n      }, [\n        ($setup.formError)\n          ? (_openBlock(), _createElementBlock(\"p\", _hoisted_1, _toDisplayString($setup.formError), 1 /* TEXT */))\n          : _createCommentVNode(\"v-if\", true),\n        _createVNode($setup[\"FormField\"], {\n          label: \"Klantnummer\",\n          \"for-id\": \"c-number\",\n          required: \"\",\n          error: $setup.fieldErrors.number\n        }, {\n          default: _withCtx(() => [\n            _withDirectives(_createElementVNode(\"input\", {\n              id: \"c-number\",\n              \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => (($setup.form.number) = $event)),\n              class: _normalizeClass([\"hh-input hh-input--mono\", { 'hh-input--error': $setup.fieldErrors.number }]),\n              \"data-autofocus\": \"\"\n            }, null, 2 /* CLASS */), [\n              [\n                _vModelText,\n                $setup.form.number,\n                void 0,\n                { trim: true }\n              ]\n            ])\n          ]),\n          _: 1 /* STABLE */\n        }, 8 /* PROPS */, [\"error\"]),\n        _createVNode($setup[\"FormField\"], {\n          label: \"Bedrijfsnaam\",\n          \"for-id\": \"c-company\",\n          error: $setup.fieldErrors.company\n        }, {\n          default: _withCtx(() => [\n            _withDirectives(_createElementVNode(\"input\", {\n              id: \"c-company\",\n              \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => (($setup.form.company) = $event)),\n              class: _normalizeClass([\"hh-input\", { 'hh-input--error': $setup.fieldErrors.company }])\n            }, null, 2 /* CLASS */), [\n              [\n                _vModelText,\n                $setup.form.company,\n                void 0,\n                { trim: true }\n              ]\n            ])\n          ]),\n          _: 1 /* STABLE */\n        }, 8 /* PROPS */, [\"error\"]),\n        _createElementVNode(\"div\", _hoisted_2, [\n          _createVNode($setup[\"FormField\"], {\n            label: \"Aanhef\",\n            \"for-id\": \"c-title\"\n          }, {\n            default: _withCtx(() => [\n              _withDirectives(_createElementVNode(\"input\", {\n                id: \"c-title\",\n                \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => (($setup.form.contactTitle) = $event)),\n                class: \"hh-input\",\n                placeholder: \"Dhr. / Mevr.\"\n              }, null, 512 /* NEED_PATCH */), [\n                [\n                  _vModelText,\n                  $setup.form.contactTitle,\n                  void 0,\n                  { trim: true }\n                ]\n              ])\n            ]),\n            _: 1 /* STABLE */\n          }),\n          _createVNode($setup[\"FormField\"], {\n            label: \"Contactpersoon\",\n            \"for-id\": \"c-contact\",\n            error: $setup.fieldErrors.contactName\n          }, {\n            default: _withCtx(() => [\n              _withDirectives(_createElementVNode(\"input\", {\n                id: \"c-contact\",\n                \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => (($setup.form.contactName) = $event)),\n                class: _normalizeClass([\"hh-input\", { 'hh-input--error': $setup.fieldErrors.contactName }])\n              }, null, 2 /* CLASS */), [\n                [\n                  _vModelText,\n                  $setup.form.contactName,\n                  void 0,\n                  { trim: true }\n                ]\n              ])\n            ]),\n            _: 1 /* STABLE */\n          }, 8 /* PROPS */, [\"error\"])\n        ]),\n        _createElementVNode(\"div\", _hoisted_3, [\n          _createVNode($setup[\"FormField\"], {\n            label: \"Postcode\",\n            \"for-id\": \"c-lookup-postal\"\n          }, {\n            default: _withCtx(() => [\n              _withDirectives(_createElementVNode(\"input\", {\n                id: \"c-lookup-postal\",\n                \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => (($setup.form.postalCode) = $event)),\n                class: \"hh-input hh-input--mono\",\n                placeholder: \"1234 AB\",\n                onBlur: $setup.lookupAddress\n              }, null, 544 /* NEED_HYDRATION, NEED_PATCH */), [\n                [\n                  _vModelText,\n                  $setup.form.postalCode,\n                  void 0,\n                  { trim: true }\n                ]\n              ])\n            ]),\n            _: 1 /* STABLE */\n          }),\n          _createVNode($setup[\"FormField\"], {\n            label: \"Huisnummer\",\n            \"for-id\": \"c-house-number\"\n          }, {\n            default: _withCtx(() => [\n              _withDirectives(_createElementVNode(\"input\", {\n                id: \"c-house-number\",\n                \"onUpdate:modelValue\": _cache[5] || (_cache[5] = $event => (($setup.houseNumber) = $event)),\n                class: \"hh-input\",\n                placeholder: \"12\",\n                onBlur: $setup.lookupAddress\n              }, null, 544 /* NEED_HYDRATION, NEED_PATCH */), [\n                [\n                  _vModelText,\n                  $setup.houseNumber,\n                  void 0,\n                  { trim: true }\n                ]\n              ])\n            ]),\n            _: 1 /* STABLE */\n          })\n        ]),\n        ($setup.lookupText)\n          ? (_openBlock(), _createElementBlock(\"p\", _hoisted_4, _toDisplayString($setup.lookupText), 1 /* TEXT */))\n          : _createCommentVNode(\"v-if\", true),\n        _createVNode($setup[\"FormField\"], {\n          label: \"Adres\",\n          \"for-id\": \"c-address\"\n        }, {\n          default: _withCtx(() => [\n            _withDirectives(_createElementVNode(\"input\", {\n              id: \"c-address\",\n              \"onUpdate:modelValue\": _cache[6] || (_cache[6] = $event => (($setup.form.address) = $event)),\n              class: \"hh-input\"\n            }, null, 512 /* NEED_PATCH */), [\n              [\n                _vModelText,\n                $setup.form.address,\n                void 0,\n                { trim: true }\n              ]\n            ])\n          ]),\n          _: 1 /* STABLE */\n        }),\n        _createElementVNode(\"div\", _hoisted_5, [\n          _createVNode($setup[\"FormField\"], {\n            label: \"Plaats\",\n            \"for-id\": \"c-city\"\n          }, {\n            default: _withCtx(() => [\n              _withDirectives(_createElementVNode(\"input\", {\n                id: \"c-city\",\n                \"onUpdate:modelValue\": _cache[7] || (_cache[7] = $event => (($setup.form.city) = $event)),\n                class: \"hh-input\"\n              }, null, 512 /* NEED_PATCH */), [\n                [\n                  _vModelText,\n                  $setup.form.city,\n                  void 0,\n                  { trim: true }\n                ]\n              ])\n            ]),\n            _: 1 /* STABLE */\n          })\n        ]),\n        _createElementVNode(\"div\", _hoisted_6, [\n          _createVNode($setup[\"FormField\"], {\n            label: \"Telefoon\",\n            \"for-id\": \"c-phone\"\n          }, {\n            default: _withCtx(() => [\n              _withDirectives(_createElementVNode(\"input\", {\n                id: \"c-phone\",\n                \"onUpdate:modelValue\": _cache[8] || (_cache[8] = $event => (($setup.form.phone) = $event)),\n                class: \"hh-input hh-input--mono\"\n              }, null, 512 /* NEED_PATCH */), [\n                [\n                  _vModelText,\n                  $setup.form.phone,\n                  void 0,\n                  { trim: true }\n                ]\n              ])\n            ]),\n            _: 1 /* STABLE */\n          }),\n          _createVNode($setup[\"FormField\"], {\n            label: \"Telefoon (reserve)\",\n            \"for-id\": \"c-phone2\"\n          }, {\n            default: _withCtx(() => [\n              _withDirectives(_createElementVNode(\"input\", {\n                id: \"c-phone2\",\n                \"onUpdate:modelValue\": _cache[9] || (_cache[9] = $event => (($setup.form.phone2) = $event)),\n                class: \"hh-input hh-input--mono\"\n              }, null, 512 /* NEED_PATCH */), [\n                [\n                  _vModelText,\n                  $setup.form.phone2,\n                  void 0,\n                  { trim: true }\n                ]\n              ])\n            ]),\n            _: 1 /* STABLE */\n          })\n        ]),\n        _createElementVNode(\"div\", null, [\n          _createVNode($setup[\"FormField\"], {\n            label: \"E-mail\",\n            \"for-id\": \"c-email\",\n            error: $setup.fieldErrors.email\n          }, {\n            default: _withCtx(() => [\n              _withDirectives(_createElementVNode(\"input\", {\n                id: \"c-email\",\n                \"onUpdate:modelValue\": _cache[10] || (_cache[10] = $event => (($setup.form.email) = $event)),\n                class: _normalizeClass([\"hh-input\", { 'hh-input--error': $setup.fieldErrors.email }]),\n                inputmode: \"email\"\n              }, null, 2 /* CLASS */), [\n                [\n                  _vModelText,\n                  $setup.form.email,\n                  void 0,\n                  { trim: true }\n                ]\n              ])\n            ]),\n            _: 1 /* STABLE */\n          }, 8 /* PROPS */, [\"error\"])\n        ]),\n        _createVNode($setup[\"FormField\"], {\n          label: \"Minimumjaar (0 = geen)\",\n          \"for-id\": \"c-minyear\",\n          hint: \"Boekingen vóór dit jaar worden geweigerd.\",\n          error: $setup.fieldErrors.minYear\n        }, {\n          default: _withCtx(() => [\n            _withDirectives(_createElementVNode(\"input\", {\n              id: \"c-minyear\",\n              \"onUpdate:modelValue\": _cache[11] || (_cache[11] = $event => (($setup.form.minYear) = $event)),\n              class: _normalizeClass([\"hh-input hh-input--num cfd__year\", { 'hh-input--error': $setup.fieldErrors.minYear }]),\n              inputmode: \"numeric\",\n              maxlength: \"4\",\n              \"aria-invalid\": Boolean($setup.fieldErrors.minYear),\n              onFocus: $setup.selectMinYear,\n              onClick: $setup.selectMinYear,\n              onBlur: $setup.normalizeMinYear\n            }, null, 42 /* CLASS, PROPS, NEED_HYDRATION */, _hoisted_7), [\n              [_vModelText, $setup.form.minYear]\n            ])\n          ]),\n          _: 1 /* STABLE */\n        }, 8 /* PROPS */, [\"error\"]),\n        _cache[14] || (_cache[14] = _createElementVNode(\"button\", {\n          type: \"submit\",\n          hidden: \"\"\n        }, null, -1 /* CACHED */))\n      ], 32 /* NEED_HYDRATION */)\n    ]),\n    _: 1 /* STABLE */\n  }, 8 /* PROPS */, [\"title\"]))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/CustomerFormDialog.vue?type=script\";import \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/CustomerFormDialog.vue?type=style&index=0\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/CustomerFormDialog.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/CustomerFormDialog.vue\";script.__scopeId = \"data-v-93de66b4\";export default script;","<script setup lang=\"ts\">\nimport { onBeforeUnmount, useTemplateRef } from \"vue\";\n\ndefineProps<{ html: string }>();\nconst emit = defineEmits<{ close: [] }>();\nconst frame = useTemplateRef<HTMLIFrameElement>(\"frame\");\nconst trigger = document.activeElement as HTMLElement | null;\nonBeforeUnmount(() => { if (trigger?.isConnected) trigger.focus({ preventScroll: true }); });\n\nfunction print(): void {\n  const target = frame.value?.contentWindow;\n  if (!target || !frame.value?.contentDocument?.querySelector(\"table\")) {\n    emit(\"close\");\n    return;\n  }\n  target.addEventListener(\"afterprint\", () => emit(\"close\"), { once: true });\n  // Print the entire document, including rows outside the screen viewport.\n  target.focus();\n  target.print();\n}\n</script>\n\n<template>\n  <!-- Scripts stay disabled; same-origin access is required for printing. -->\n  <iframe ref=\"frame\" class=\"print-document\" title=\"Afdrukdocument\" tabindex=\"-1\"\n    sandbox=\"allow-same-origin allow-modals\" :srcdoc=\"html\" @load=\"print\" />\n</template>\n\n<style scoped>\n.print-document { position: fixed; width: 0; height: 0; border: 0; visibility: hidden; }\n</style>\n","import { createCommentVNode as _createCommentVNode, createElementVNode as _createElementVNode, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = [\"srcdoc\"]\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return (_openBlock(), _createElementBlock(_Fragment, null, [\n    _createCommentVNode(\" Scripts stay disabled; same-origin access is required for printing. \"),\n    _createElementVNode(\"iframe\", {\n      ref: \"frame\",\n      class: \"print-document\",\n      title: \"Afdrukdocument\",\n      tabindex: \"-1\",\n      sandbox: \"allow-same-origin allow-modals\",\n      srcdoc: $props.html,\n      onLoad: $setup.print\n    }, null, 40 /* PROPS, NEED_HYDRATION */, _hoisted_1)\n  ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/PrintDocument.vue?type=script\";import \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/PrintDocument.vue?type=style&index=0\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/PrintDocument.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/PrintDocument.vue\";script.__scopeId = \"data-v-cbfcbc67\";export default script;","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { encodeString } from \"@webhare/std\";\nimport type { OrganizationApi } from \"../lib/api\";\nimport PrintDocument from \"./PrintDocument.vue\";\n\ntype Customer = Awaited<ReturnType<OrganizationApi[\"listCustomers\"]>>[number];\nconst props = defineProps<{ customers: Customer[]; search: string; includeArchived: boolean }>();\nconst emit = defineEmits<{ close: [] }>();\n\nconst html = computed(() => {\n  const rows = props.customers.map((customer) => `<tr>\n    <td>${encodeString(customer.number, \"html\")}</td>\n    <td>${encodeString(customer.company, \"html\")}${customer.archived ? \" <small>(gearchiveerd)</small>\" : \"\"}</td>\n    <td>${encodeString(customer.contactName, \"html\")}</td>\n    <td class=\"year\">${customer.minYear || \"geen\"}</td>\n  </tr>`).join(\"\");\n  const search = props.search.trim();\n  return `<!doctype html><html lang=\"nl\"><head><meta charset=\"utf-8\"><title>Klantenlijst</title><style>\n    @page { size: A4; margin: 12mm; }\n    body { margin: 0; padding: 20px; color: #000; background: #fff; font: 10pt/1.4 Arial, sans-serif; }\n    h1 { margin: 0 0 8px; font-size: 16pt; }\n    p { margin: 0 0 12px; }\n    table { width: 100%; border-collapse: collapse; table-layout: fixed; }\n    th, td { padding: 6px 8px; text-align: left; vertical-align: top; overflow-wrap: anywhere; border-bottom: 1px solid #ccc; }\n    th { border-bottom: 1px solid #000; }\n    th:first-child { width: 10%; }\n    th:last-child { width: 15%; }\n    .year { text-align: right; }\n    small { font-size: inherit; }\n    thead { display: table-header-group; }\n    tr { break-inside: avoid; }\n    @media print { body { padding: 0; } }\n  </style></head><body>\n    <h1>Klantenlijst</h1>\n    <p>${props.customers.length} ${props.customers.length === 1 ? \"klant\" : \"klanten\"} · ${props.includeArchived ? \"inclusief gearchiveerde klanten\" : \"actieve klanten\"}</p>\n    ${search ? `<p>Zoekterm: ${encodeString(search, \"html\")}</p>` : \"\"}\n    <table><thead><tr><th scope=\"col\">Nr.</th><th scope=\"col\">Bedrijf</th><th scope=\"col\">Naam</th><th scope=\"col\" class=\"year\">Min. jaar</th></tr></thead>\n    <tbody>${rows}</tbody></table>\n  </body></html>`;\n});\n\n</script>\n\n<template>\n  <PrintDocument :html=\"html\" @close=\"emit('close')\" />\n</template>\n","import { openBlock as _openBlock, createBlock as _createBlock } from \"vue\"\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return (_openBlock(), _createBlock($setup[\"PrintDocument\"], {\n    html: $setup.html,\n    onClose: _cache[0] || (_cache[0] = $event => ($setup.emit('close')))\n  }, null, 8 /* PROPS */, [\"html\"]))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/CustomerPrintDialog.vue?type=script\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/CustomerPrintDialog.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/CustomerPrintDialog.vue\";export default script;","<template>\n  <section>\n    <div class=\"hh-page__bar\">\n      <h1 class=\"hh-page__title\">Klanten</h1>\n      <div class=\"cust__actions\">\n        <button class=\"hh-btn\" type=\"button\" :disabled=\"loading || Boolean(error) || !totalCount || printBusy\" @click=\"print\">{{ printLoading ? \"Afdruk laden…\" : \"Printen\" }}</button>\n        <button class=\"hh-btn hh-btn--primary\" type=\"button\" @click=\"openNew\">\n          <span aria-hidden=\"true\">+</span> Nieuwe klant\n        </button>\n      </div>\n    </div>\n\n    <div class=\"hh-toolbar\">\n      <input\n        ref=\"searchInput\"\n        v-model=\"query\"\n        class=\"hh-input hh-search\"\n        type=\"search\"\n        placeholder=\"Zoek op nummer, bedrijf of contactpersoon  ( / )\"\n        aria-label=\"Klanten zoeken\"\n      />\n      <label class=\"cust__toggle\">\n        <input v-model=\"includeArchived\" type=\"checkbox\" />\n        Toon gearchiveerd\n      </label>\n    </div>\n\n    <p v-if=\"error\" class=\"hh-formerror\" role=\"alert\">{{ error }} <button class=\"hh-btn hh-btn--small\" type=\"button\" @click=\"reload\">Opnieuw proberen</button></p>\n    <p v-if=\"printError\" class=\"hh-formerror\" role=\"alert\">{{ printError }}</p>\n\n    <div class=\"hh-card\">\n      <div v-if=\"loading\" class=\"hh-empty\">Laden…</div>\n      <p v-else-if=\"!error && rows.length === 0\" class=\"hh-empty\">\n        {{ query.trim() ? \"Geen klanten gevonden voor deze zoekterm.\" : \"Nog geen klanten. Druk op n voor een nieuwe.\" }}\n      </p>\n      <table v-else class=\"hh-table\">\n        <thead>\n          <tr>\n            <th style=\"width: 90px\">Nr.</th>\n            <th>Bedrijf</th>\n            <th style=\"width: 220px\">Naam</th>\n            <th style=\"width: 100px\" class=\"hh-table__num\">Min. jaar</th>\n          </tr>\n        </thead>\n        <tbody>\n          <tr\n            v-for=\"(row, index) in rows\"\n            :key=\"row.id\"\n            :data-list-row=\"index\"\n            tabindex=\"-1\"\n            class=\"is-clickable\"\n            :class=\"{ 'is-active': index === activeIndex, 'is-archived': row.archived }\"\n            @click=\"openDetail(row.id)\"\n          >\n            <td class=\"hh-table__code\">{{ row.number }}</td>\n            <td>\n              {{ row.company }}\n              <span v-if=\"row.archived\" class=\"hh-badge\">gearchiveerd</span>\n            </td>\n            <td>{{ row.contactName }}</td>\n            <td class=\"hh-table__num\">{{ row.minYear || \"geen\" }}</td>\n          </tr>\n        </tbody>\n      </table>\n      <div v-if=\"!loading && !error && hasMore\" ref=\"loadMoreTrigger\" class=\"cust__more\">\n        <span class=\"hh-muted\" aria-live=\"polite\">{{ rows.length }} van {{ totalCount }} klanten</span>\n        <span v-if=\"moreError\" class=\"hh-formerror\" role=\"alert\">{{ moreError }}</span>\n        <button class=\"hh-btn\" type=\"button\" :disabled=\"loadingMore\" @click=\"loadMore\">{{ loadingMore ? \"Klanten laden…\" : moreError ? \"Opnieuw proberen\" : \"Meer klanten tonen\" }}</button>\n      </div>\n    </div>\n\n    <CustomerFormDialog v-if=\"formOpen\" @close=\"closeForm\" @saved=\"onCreated\" />\n    <CustomerPrintDialog v-if=\"printRows\" :customers=\"printRows\" :search=\"printSelection?.query ?? ''\" :include-archived=\"printSelection?.includeArchived ?? false\" @close=\"printRows = null\" />\n\n  </section>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, shallowRef, watch } from \"vue\";\nimport { useRoute, useRouter } from \"vue-router\";\nimport { useApi } from \"../lib/api\";\nimport { useListKeyboard } from \"../lib/useListKeyboard\";\nimport { usePagedRows } from \"../lib/usePagedRows\";\nimport { customerListStateToQuery, parseCustomerListState } from \"../lib/customerListState\";\nimport { queryRecord, sameQuery } from \"../lib/routeQuery\";\nimport { customerListPosition, rememberCustomerListPosition, restoreCustomerListPosition } from \"../lib/customerNavigation\";\nimport CustomerFormDialog from \"../components/CustomerFormDialog.vue\";\nimport CustomerPrintDialog from \"../components/CustomerPrintDialog.vue\";\n\nconst api = useApi();\n\ntype CustomerRow = Awaited<ReturnType<typeof api.getCustomerPage>>[\"rows\"][number];\n\nconst route = useRoute();\nconst router = useRouter();\n\nconst restored = parseCustomerListState(queryRecord(route.query));\nconst query = ref(restored.search);\nconst includeArchived = ref(restored.includeArchived);\nconst searchInput = ref<HTMLInputElement | null>(null);\nlet disposed = false;\nconst { rows, totalCount, loading, loadingMore, error, moreError, hasMore, trigger: loadMoreTrigger, loadMore: revealMore, reload, ensureLoaded } = usePagedRows(offset =>\n  api.getCustomerPage({ offset, query: query.value, includeArchived: includeArchived.value }));\n\nwatch([query, includeArchived], () => {\n  const next = customerListStateToQuery({ search: query.value, includeArchived: includeArchived.value });\n  if (!sameQuery(next, queryRecord(route.query))) void router.replace({ query: next });\n  resetKeyboard();\n  void reload();\n});\nwatch(() => route.query, value => {\n  const state = parseCustomerListState(queryRecord(value));\n  query.value = state.search;\n  includeArchived.value = state.includeArchived;\n});\n\nconst formOpen = ref(false);\nconst printRows = shallowRef<CustomerRow[] | null>(null);\nconst printSelection = shallowRef<{ query: string; includeArchived: boolean } | null>(null);\nconst printLoading = shallowRef(false);\nconst printError = shallowRef(\"\");\nconst printBusy = computed(() => printLoading.value || printRows.value !== null);\n\nconst { activeIndex, reset: resetKeyboard } = useListKeyboard({\n  itemCount: () => rows.value.length + Number(hasMore.value),\n  onNew: openNew,\n  onOpen: (index) => { if (rows.value[index]) openDetail(rows.value[index].id); },\n  searchInput,\n});\n\nwatch(activeIndex, async index => {\n  if (index < 0 || document.querySelector(`[data-list-row=\"${index}\"]`)) return;\n  if (!await ensureLoaded(index)) {\n    // Keep keyboard selection on an existing row when fetching the next page fails.\n    if (activeIndex.value === index) activeIndex.value = rows.value.length - 1;\n    return;\n  }\n  // The keyboard helper scrolls immediately; newly revealed rows need one render first.\n  await nextTick();\n  if (activeIndex.value === index) document.querySelector<HTMLElement>(`[data-list-row=\"${index}\"]`)?.scrollIntoView({ block: \"nearest\" });\n}, { flush: \"sync\" });\n\nasync function loadMore(): Promise<void> {\n  const index = rows.value.length;\n  if (!await revealMore()) return;\n  await nextTick();\n  activeIndex.value = index;\n  document.querySelector<HTMLElement>(`[data-list-row=\"${index}\"]`)?.focus({ preventScroll: true });\n}\n\nasync function print(): Promise<void> {\n  if (printBusy.value || loading.value || error.value || !totalCount.value) return;\n  printLoading.value = true;\n  printError.value = \"\";\n  const selected = { query: query.value, includeArchived: includeArchived.value };\n  const current = () => !disposed && query.value === selected.query && includeArchived.value === selected.includeArchived;\n  try {\n    const customers = await api.getCustomerPrintRows(selected);\n    if (!current()) return;\n    if (!customers.length) throw new Error(\"Geen klanten voor deze afdruk.\");\n    printSelection.value = selected;\n    printRows.value = customers;\n  } catch (cause) {\n    if (current()) printError.value = cause instanceof Error ? cause.message : \"Kon de afdruk niet laden.\";\n  } finally {\n    printLoading.value = false;\n  }\n}\n\nfunction openDetail(id: number): void {\n  rememberCustomerListPosition({ customerId: id, query: queryRecord(route.query), scrollY: window.scrollY });\n  void router.push({ name: \"klanten-detail\", params: { id: String(id) } });\n}\n\nfunction openNew(): void {\n  formOpen.value = true;\n}\n\nfunction closeForm(): void {\n  formOpen.value = false;\n  if (route.name === \"klanten-nieuw\") void router.replace({ name: \"klanten\" });\n}\n\nfunction onCreated(id: number): void {\n  formOpen.value = false;\n  void router.replace({ name: \"klanten-detail\", params: { id: String(id) } });\n}\n\nonMounted(async () => {\n  const saved = customerListPosition;\n  if (!await reload() || disposed) return;\n  // Fetch the necessary pages before restoring a customer beyond the first batch.\n  while (saved && sameQuery(saved.query, queryRecord(route.query)) && !rows.value.some(row => row.id === saved.customerId) && hasMore.value) {\n    if (!await revealMore() || disposed) break;\n  }\n  await nextTick();\n  const position = restoreCustomerListPosition({ saved, ids: rows.value.map((row) => row.id), query: queryRecord(route.query) });\n  if (position) {\n    // Restore rows beyond the first batch before restoring focus and viewport position.\n    activeIndex.value = position.activeIndex;\n    // Restore after the rows render; focus must not scroll the viewport again.\n    document.querySelector<HTMLElement>(`[data-list-row=\"${position.activeIndex}\"]`)?.focus({ preventScroll: true });\n    window.scrollTo({ top: position.scrollY });\n  }\n  if (route.name === \"klanten-nieuw\") openNew();\n});\nonBeforeUnmount(() => { disposed = true; });\n</script>\n\n<style scoped>\n.cust__more { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 12px; padding: 14px 16px; border-top: 1px solid var(--hh-line); }\n.cust__actions {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 8px;\n}\n.cust__toggle {\n  display: inline-flex;\n  align-items: center;\n  gap: 6px;\n  font-size: 13px;\n  color: var(--hh-fg-muted);\n  cursor: pointer;\n  white-space: nowrap;\n}\n</style>\n","import { createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, vModelText as _vModelText, withDirectives as _withDirectives, vModelCheckbox as _vModelCheckbox, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, renderList as _renderList, Fragment as _Fragment, normalizeClass as _normalizeClass, createBlock as _createBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"hh-page__bar\" }\nconst _hoisted_2 = { class: \"cust__actions\" }\nconst _hoisted_3 = [\"disabled\"]\nconst _hoisted_4 = { class: \"hh-toolbar\" }\nconst _hoisted_5 = { class: \"cust__toggle\" }\nconst _hoisted_6 = {\n  key: 0,\n  class: \"hh-formerror\",\n  role: \"alert\"\n}\nconst _hoisted_7 = {\n  key: 1,\n  class: \"hh-formerror\",\n  role: \"alert\"\n}\nconst _hoisted_8 = { class: \"hh-card\" }\nconst _hoisted_9 = {\n  key: 0,\n  class: \"hh-empty\"\n}\nconst _hoisted_10 = {\n  key: 1,\n  class: \"hh-empty\"\n}\nconst _hoisted_11 = {\n  key: 2,\n  class: \"hh-table\"\n}\nconst _hoisted_12 = [\"data-list-row\", \"onClick\"]\nconst _hoisted_13 = { class: \"hh-table__code\" }\nconst _hoisted_14 = {\n  key: 0,\n  class: \"hh-badge\"\n}\nconst _hoisted_15 = { class: \"hh-table__num\" }\nconst _hoisted_16 = {\n  key: 3,\n  ref: \"loadMoreTrigger\",\n  class: \"cust__more\"\n}\nconst _hoisted_17 = {\n  class: \"hh-muted\",\n  \"aria-live\": \"polite\"\n}\nconst _hoisted_18 = {\n  key: 0,\n  class: \"hh-formerror\",\n  role: \"alert\"\n}\nconst _hoisted_19 = [\"disabled\"]\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return (_openBlock(), _createElementBlock(\"section\", null, [\n    _createElementVNode(\"div\", _hoisted_1, [\n      _cache[5] || (_cache[5] = _createElementVNode(\"h1\", { class: \"hh-page__title\" }, \"Klanten\", -1 /* CACHED */)),\n      _createElementVNode(\"div\", _hoisted_2, [\n        _createElementVNode(\"button\", {\n          class: \"hh-btn\",\n          type: \"button\",\n          disabled: $setup.loading || Boolean($setup.error) || !$setup.totalCount || $setup.printBusy,\n          onClick: $setup.print\n        }, _toDisplayString($setup.printLoading ? \"Afdruk laden…\" : \"Printen\"), 9 /* TEXT, PROPS */, _hoisted_3),\n        _createElementVNode(\"button\", {\n          class: \"hh-btn hh-btn--primary\",\n          type: \"button\",\n          onClick: $setup.openNew\n        }, _cache[4] || (_cache[4] = [\n          _createElementVNode(\"span\", { \"aria-hidden\": \"true\" }, \"+\", -1 /* CACHED */),\n          _createTextVNode(\" Nieuwe klant \", -1 /* CACHED */)\n        ]))\n      ])\n    ]),\n    _createElementVNode(\"div\", _hoisted_4, [\n      _withDirectives(_createElementVNode(\"input\", {\n        ref: \"searchInput\",\n        \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => (($setup.query) = $event)),\n        class: \"hh-input hh-search\",\n        type: \"search\",\n        placeholder: \"Zoek op nummer, bedrijf of contactpersoon  ( / )\",\n        \"aria-label\": \"Klanten zoeken\"\n      }, null, 512 /* NEED_PATCH */), [\n        [_vModelText, $setup.query]\n      ]),\n      _createElementVNode(\"label\", _hoisted_5, [\n        _withDirectives(_createElementVNode(\"input\", {\n          \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => (($setup.includeArchived) = $event)),\n          type: \"checkbox\"\n        }, null, 512 /* NEED_PATCH */), [\n          [_vModelCheckbox, $setup.includeArchived]\n        ]),\n        _cache[6] || (_cache[6] = _createTextVNode(\" Toon gearchiveerd \", -1 /* CACHED */))\n      ])\n    ]),\n    ($setup.error)\n      ? (_openBlock(), _createElementBlock(\"p\", _hoisted_6, [\n          _createTextVNode(_toDisplayString($setup.error) + \" \", 1 /* TEXT */),\n          _createElementVNode(\"button\", {\n            class: \"hh-btn hh-btn--small\",\n            type: \"button\",\n            onClick: _cache[2] || (_cache[2] = (...args) => ($setup.reload && $setup.reload(...args)))\n          }, \"Opnieuw proberen\")\n        ]))\n      : _createCommentVNode(\"v-if\", true),\n    ($setup.printError)\n      ? (_openBlock(), _createElementBlock(\"p\", _hoisted_7, _toDisplayString($setup.printError), 1 /* TEXT */))\n      : _createCommentVNode(\"v-if\", true),\n    _createElementVNode(\"div\", _hoisted_8, [\n      ($setup.loading)\n        ? (_openBlock(), _createElementBlock(\"div\", _hoisted_9, \"Laden…\"))\n        : (!$setup.error && $setup.rows.length === 0)\n          ? (_openBlock(), _createElementBlock(\"p\", _hoisted_10, _toDisplayString($setup.query.trim() ? \"Geen klanten gevonden voor deze zoekterm.\" : \"Nog geen klanten. Druk op n voor een nieuwe.\"), 1 /* TEXT */))\n          : (_openBlock(), _createElementBlock(\"table\", _hoisted_11, [\n              _cache[7] || (_cache[7] = _createElementVNode(\"thead\", null, [\n                _createElementVNode(\"tr\", null, [\n                  _createElementVNode(\"th\", { style: {\"width\":\"90px\"} }, \"Nr.\"),\n                  _createElementVNode(\"th\", null, \"Bedrijf\"),\n                  _createElementVNode(\"th\", { style: {\"width\":\"220px\"} }, \"Naam\"),\n                  _createElementVNode(\"th\", {\n                    style: {\"width\":\"100px\"},\n                    class: \"hh-table__num\"\n                  }, \"Min. jaar\")\n                ])\n              ], -1 /* CACHED */)),\n              _createElementVNode(\"tbody\", null, [\n                (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.rows, (row, index) => {\n                  return (_openBlock(), _createElementBlock(\"tr\", {\n                    key: row.id,\n                    \"data-list-row\": index,\n                    tabindex: \"-1\",\n                    class: _normalizeClass([\"is-clickable\", { 'is-active': index === $setup.activeIndex, 'is-archived': row.archived }]),\n                    onClick: $event => ($setup.openDetail(row.id))\n                  }, [\n                    _createElementVNode(\"td\", _hoisted_13, _toDisplayString(row.number), 1 /* TEXT */),\n                    _createElementVNode(\"td\", null, [\n                      _createTextVNode(_toDisplayString(row.company) + \" \", 1 /* TEXT */),\n                      (row.archived)\n                        ? (_openBlock(), _createElementBlock(\"span\", _hoisted_14, \"gearchiveerd\"))\n                        : _createCommentVNode(\"v-if\", true)\n                    ]),\n                    _createElementVNode(\"td\", null, _toDisplayString(row.contactName), 1 /* TEXT */),\n                    _createElementVNode(\"td\", _hoisted_15, _toDisplayString(row.minYear || \"geen\"), 1 /* TEXT */)\n                  ], 10 /* CLASS, PROPS */, _hoisted_12))\n                }), 128 /* KEYED_FRAGMENT */))\n              ])\n            ])),\n      (!$setup.loading && !$setup.error && $setup.hasMore)\n        ? (_openBlock(), _createElementBlock(\"div\", _hoisted_16, [\n            _createElementVNode(\"span\", _hoisted_17, _toDisplayString($setup.rows.length) + \" van \" + _toDisplayString($setup.totalCount) + \" klanten\", 1 /* TEXT */),\n            ($setup.moreError)\n              ? (_openBlock(), _createElementBlock(\"span\", _hoisted_18, _toDisplayString($setup.moreError), 1 /* TEXT */))\n              : _createCommentVNode(\"v-if\", true),\n            _createElementVNode(\"button\", {\n              class: \"hh-btn\",\n              type: \"button\",\n              disabled: $setup.loadingMore,\n              onClick: $setup.loadMore\n            }, _toDisplayString($setup.loadingMore ? \"Klanten laden…\" : $setup.moreError ? \"Opnieuw proberen\" : \"Meer klanten tonen\"), 9 /* TEXT, PROPS */, _hoisted_19)\n          ], 512 /* NEED_PATCH */))\n        : _createCommentVNode(\"v-if\", true)\n    ]),\n    ($setup.formOpen)\n      ? (_openBlock(), _createBlock($setup[\"CustomerFormDialog\"], {\n          key: 2,\n          onClose: $setup.closeForm,\n          onSaved: $setup.onCreated\n        }))\n      : _createCommentVNode(\"v-if\", true),\n    ($setup.printRows)\n      ? (_openBlock(), _createBlock($setup[\"CustomerPrintDialog\"], {\n          key: 3,\n          customers: $setup.printRows,\n          search: $setup.printSelection?.query ?? '',\n          \"include-archived\": $setup.printSelection?.includeArchived ?? false,\n          onClose: _cache[3] || (_cache[3] = $event => ($setup.printRows = null))\n        }, null, 8 /* PROPS */, [\"customers\", \"search\", \"include-archived\"]))\n      : _createCommentVNode(\"v-if\", true)\n  ]))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/CustomersView.vue?type=script\";import \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/CustomersView.vue?type=style&index=0\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/CustomersView.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/CustomersView.vue\";script.__scopeId = \"data-v-a3d9cff1\";export default script;","import type { OrganizationApi } from \"./api\";\nimport { expandFiscalYear } from \"./dates\";\n\nexport type CustomerBalance = Awaited<ReturnType<OrganizationApi[\"listCustomerBalances\"]>>[number];\nexport type CustomerBalanceTotals = Awaited<ReturnType<OrganizationApi[\"getCustomerBalancePage\"]>>[\"totals\"];\nexport type CustomerReportMode = \"declarations\" | \"budgets\";\nexport interface CustomerReportState {\n  customerFrom: string;\n  customerTo: string;\n  yearFrom: string;\n  yearTo: string;\n  includeArchived: boolean;\n  onlyToDeclare: boolean;\n}\n\nconst queryFields = { customerFrom: \"klantvan\", customerTo: \"klanttot\", yearFrom: \"jaarvan\", yearTo: \"jaartot\" } as const;\n\n/** Empty bounds select the entire range; two-digit years use the existing fiscal-year pivot. */\nexport function parseCustomerReportState(query: Record<string, string | undefined>): CustomerReportState {\n  const customer = (value = \"\") => /^\\d{1,3}$/.test(value) ? value : \"\";\n  const year = (value = \"\") => value && expandFiscalYear(value) ? String(expandFiscalYear(value)) : \"\";\n  return { customerFrom: customer(query.klantvan), customerTo: customer(query.klanttot),\n    yearFrom: year(query.jaarvan), yearTo: year(query.jaartot), includeArchived: query.archief === \"1\",\n    onlyToDeclare: query.tedeclareren === \"1\" };\n}\n\nexport function customerReportStateToQuery(state: CustomerReportState): Record<string, string> {\n  const query: Record<string, string> = {};\n  for (const [field, key] of Object.entries(queryFields)) if (state[field as keyof typeof queryFields]) query[key] = state[field as keyof typeof queryFields];\n  if (state.includeArchived) query.archief = \"1\";\n  if (state.onlyToDeclare) query.tedeclareren = \"1\";\n  return query;\n}\n","import { onBeforeUnmount, onMounted } from \"vue\";\nimport { useRouter, type RouteLocationRaw } from \"vue-router\";\n\n// Escape op een detailpagina navigeert terug naar de bovenliggende lijst (zelfde\n// bestemming als de zichtbare \"terug\"-link). Genegeerd wanneer er een dialoog\n// open staat (die handelt Escape zelf af: sluiten) of terwijl je in een veld\n// typt, zodat Escape daar zijn normale werking houdt.\n\nexport function useEscapeBack(target: RouteLocationRaw) {\n  const router = useRouter();\n\n  function blocked(): boolean {\n    if (document.querySelector(\".dialog-backdrop\")) return true;\n    const el = document.activeElement as HTMLElement | null;\n    if (!el) return false;\n    return el.tagName === \"INPUT\" || el.tagName === \"TEXTAREA\" || el.tagName === \"SELECT\" || el.isContentEditable;\n  }\n\n  function onKeydown(event: KeyboardEvent): void {\n    if (event.key !== \"Escape\" || blocked()) return;\n    event.preventDefault();\n    void router.push(target);\n  }\n\n  onMounted(() => window.addEventListener(\"keydown\", onKeydown));\n  onBeforeUnmount(() => window.removeEventListener(\"keydown\", onKeydown));\n}\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { Money } from \"@webhare/std\";\nimport { formatEuro } from \"../lib/format\";\nimport type { CustomerBalance, CustomerBalanceTotals, CustomerReportMode } from \"../lib/customerReports\";\n\nconst props = defineProps<{ rows: CustomerBalance[]; mode: CustomerReportMode; totals?: CustomerBalanceTotals }>();\nconst totals = computed(() => {\n  if (props.totals) return props.totals;\n  const keys = [\"totalCosts\", \"declared\", \"toDeclare\", \"budget\", \"remainingBudget\"] as const;\n  return Object.fromEntries(keys.map(key => [key, props.rows.reduce((sum, row) => Money.add(sum, row[key]), new Money(\"0\"))])) as Record<typeof keys[number], Money>;\n});\n</script>\n\n<template>\n  <table class=\"hh-table balance-table\">\n    <thead><tr>\n      <th scope=\"col\">Nr.</th><th scope=\"col\">Klant</th><th scope=\"col\">Boekjaar</th>\n      <th scope=\"col\" class=\"hh-table__num\">Uren en verschotten</th>\n      <th scope=\"col\" class=\"hh-table__num\">{{ mode === \"declarations\" ? \"Gedeclareerd\" : \"Budget\" }}</th>\n      <th scope=\"col\" class=\"hh-table__num\">{{ mode === \"declarations\" ? \"Nog te declareren\" : \"Nog te besteden\" }}</th>\n    </tr></thead>\n    <tbody>\n      <tr v-for=\"(row, index) in rows\" :key=\"`${row.customerId}.${row.fiscalYear}`\" :data-report-row=\"index\" tabindex=\"-1\">\n        <td class=\"hh-table__code\">{{ row.number }}</td>\n        <td>{{ row.company || row.contactName || `Klant ${row.number}` }} <span v-if=\"row.archived\" class=\"hh-badge\">gearchiveerd</span></td>\n        <td class=\"hh-table__code\">{{ row.fiscalYear }}</td>\n        <td class=\"hh-table__num\">{{ formatEuro(row.totalCosts) }}</td>\n        <td class=\"hh-table__num\">{{ formatEuro(mode === \"declarations\" ? row.declared : row.budget) }}</td>\n        <td class=\"hh-table__num\" :class=\"{ 'balance-table__negative': Money.check(mode === 'declarations' ? row.toDeclare : row.remainingBudget, '<', '0') }\">{{ formatEuro(mode === \"declarations\" ? row.toDeclare : row.remainingBudget) }}</td>\n      </tr>\n    </tbody>\n    <tfoot><tr>\n      <th scope=\"row\" colspan=\"3\">Totaal</th>\n      <td class=\"hh-table__num\">{{ formatEuro(totals.totalCosts) }}</td>\n      <td class=\"hh-table__num\">{{ formatEuro(mode === \"declarations\" ? totals.declared : totals.budget) }}</td>\n      <td class=\"hh-table__num\">{{ formatEuro(mode === \"declarations\" ? totals.toDeclare : totals.remainingBudget) }}</td>\n    </tr></tfoot>\n  </table>\n</template>\n\n<style scoped>\n.balance-table { min-width: 640px; }\n.balance-table th { white-space: normal; }\n.balance-table tfoot th, .balance-table tfoot td { padding: 9px 12px; border-top: 1px solid var(--hh-line); font-weight: 600; }\n.balance-table tfoot th { text-align: left; }\n.balance-table__negative { color: var(--hh-danger); }\n</style>\n","import { createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, createTextVNode as _createTextVNode, normalizeClass as _normalizeClass } from \"vue\"\n\nconst _hoisted_1 = { class: \"hh-table balance-table\" }\nconst _hoisted_2 = {\n  scope: \"col\",\n  class: \"hh-table__num\"\n}\nconst _hoisted_3 = {\n  scope: \"col\",\n  class: \"hh-table__num\"\n}\nconst _hoisted_4 = [\"data-report-row\"]\nconst _hoisted_5 = { class: \"hh-table__code\" }\nconst _hoisted_6 = {\n  key: 0,\n  class: \"hh-badge\"\n}\nconst _hoisted_7 = { class: \"hh-table__code\" }\nconst _hoisted_8 = { class: \"hh-table__num\" }\nconst _hoisted_9 = { class: \"hh-table__num\" }\nconst _hoisted_10 = { class: \"hh-table__num\" }\nconst _hoisted_11 = { class: \"hh-table__num\" }\nconst _hoisted_12 = { class: \"hh-table__num\" }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return (_openBlock(), _createElementBlock(\"table\", _hoisted_1, [\n    _createElementVNode(\"thead\", null, [\n      _createElementVNode(\"tr\", null, [\n        _cache[0] || (_cache[0] = _createElementVNode(\"th\", { scope: \"col\" }, \"Nr.\", -1 /* CACHED */)),\n        _cache[1] || (_cache[1] = _createElementVNode(\"th\", { scope: \"col\" }, \"Klant\", -1 /* CACHED */)),\n        _cache[2] || (_cache[2] = _createElementVNode(\"th\", { scope: \"col\" }, \"Boekjaar\", -1 /* CACHED */)),\n        _cache[3] || (_cache[3] = _createElementVNode(\"th\", {\n          scope: \"col\",\n          class: \"hh-table__num\"\n        }, \"Uren en verschotten\", -1 /* CACHED */)),\n        _createElementVNode(\"th\", _hoisted_2, _toDisplayString($props.mode === \"declarations\" ? \"Gedeclareerd\" : \"Budget\"), 1 /* TEXT */),\n        _createElementVNode(\"th\", _hoisted_3, _toDisplayString($props.mode === \"declarations\" ? \"Nog te declareren\" : \"Nog te besteden\"), 1 /* TEXT */)\n      ])\n    ]),\n    _createElementVNode(\"tbody\", null, [\n      (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($props.rows, (row, index) => {\n        return (_openBlock(), _createElementBlock(\"tr\", {\n          key: `${row.customerId}.${row.fiscalYear}`,\n          \"data-report-row\": index,\n          tabindex: \"-1\"\n        }, [\n          _createElementVNode(\"td\", _hoisted_5, _toDisplayString(row.number), 1 /* TEXT */),\n          _createElementVNode(\"td\", null, [\n            _createTextVNode(_toDisplayString(row.company || row.contactName || `Klant ${row.number}`) + \" \", 1 /* TEXT */),\n            (row.archived)\n              ? (_openBlock(), _createElementBlock(\"span\", _hoisted_6, \"gearchiveerd\"))\n              : _createCommentVNode(\"v-if\", true)\n          ]),\n          _createElementVNode(\"td\", _hoisted_7, _toDisplayString(row.fiscalYear), 1 /* TEXT */),\n          _createElementVNode(\"td\", _hoisted_8, _toDisplayString($setup.formatEuro(row.totalCosts)), 1 /* TEXT */),\n          _createElementVNode(\"td\", _hoisted_9, _toDisplayString($setup.formatEuro($props.mode === \"declarations\" ? row.declared : row.budget)), 1 /* TEXT */),\n          _createElementVNode(\"td\", {\n            class: _normalizeClass([\"hh-table__num\", { 'balance-table__negative': $setup.Money.check($props.mode === 'declarations' ? row.toDeclare : row.remainingBudget, '<', '0') }])\n          }, _toDisplayString($setup.formatEuro($props.mode === \"declarations\" ? row.toDeclare : row.remainingBudget)), 3 /* TEXT, CLASS */)\n        ], 8 /* PROPS */, _hoisted_4))\n      }), 128 /* KEYED_FRAGMENT */))\n    ]),\n    _createElementVNode(\"tfoot\", null, [\n      _createElementVNode(\"tr\", null, [\n        _cache[4] || (_cache[4] = _createElementVNode(\"th\", {\n          scope: \"row\",\n          colspan: \"3\"\n        }, \"Totaal\", -1 /* CACHED */)),\n        _createElementVNode(\"td\", _hoisted_10, _toDisplayString($setup.formatEuro($setup.totals.totalCosts)), 1 /* TEXT */),\n        _createElementVNode(\"td\", _hoisted_11, _toDisplayString($setup.formatEuro($props.mode === \"declarations\" ? $setup.totals.declared : $setup.totals.budget)), 1 /* TEXT */),\n        _createElementVNode(\"td\", _hoisted_12, _toDisplayString($setup.formatEuro($props.mode === \"declarations\" ? $setup.totals.toDeclare : $setup.totals.remainingBudget)), 1 /* TEXT */)\n      ])\n    ])\n  ]))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/CustomerBalanceTable.vue?type=script\";import \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/CustomerBalanceTable.vue?type=style&index=0\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/CustomerBalanceTable.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/CustomerBalanceTable.vue\";script.__scopeId = \"data-v-2522d896\";export default script;","<script setup lang=\"ts\">\nimport { computed, nextTick, onBeforeUnmount, onMounted, reactive, shallowRef, useTemplateRef, watch } from \"vue\";\nimport { useRoute, useRouter } from \"vue-router\";\nimport { encodeString } from \"@webhare/std\";\nimport { useApi } from \"../lib/api\";\nimport { expandFiscalYear } from \"../lib/dates\";\nimport { customerReportStateToQuery, parseCustomerReportState, type CustomerBalance, type CustomerReportMode, type CustomerReportState } from \"../lib/customerReports\";\nimport { queryRecord, sameQuery } from \"../lib/routeQuery\";\nimport { useEscapeBack } from \"../lib/useEscapeBack\";\nimport { usePagedRows } from \"../lib/usePagedRows\";\nimport CustomerBalanceTable from \"../components/CustomerBalanceTable.vue\";\nimport FormField from \"../components/FormField.vue\";\nimport PrintDocument from \"../components/PrintDocument.vue\";\n\nconst props = defineProps<{ mode: CustomerReportMode }>();\nconst api = useApi();\nconst route = useRoute();\nconst router = useRouter();\nuseEscapeBack({ name: \"klanten\" });\nconst selection = shallowRef(parseCustomerReportState(queryRecord(route.query)));\nconst form = reactive({ ...selection.value });\nconst fieldErrors = reactive<Record<string, string>>({});\nconst result = useTemplateRef<HTMLElement>(\"result\");\nconst printSource = useTemplateRef<HTMLElement>(\"printSource\");\nconst printRows = shallowRef<CustomerBalance[] | null>(null);\nconst printHtml = shallowRef(\"\");\nconst printLoading = shallowRef(false);\nconst printError = shallowRef(\"\");\nlet disposed = false;\n\n// The budget report shares this state, but has no \"to declare\" column to filter on.\nconst apiSelection = (state: CustomerReportState) => ({ ...state, onlyToDeclare: props.mode === \"declarations\" && state.onlyToDeclare });\nconst title = computed(() => props.mode === \"declarations\" ? \"Declaratieoverzicht\" : \"Budgetoverzicht\");\nconst { rows, page, totalCount, loading, loadingMore, error, moreError, hasMore, trigger: loadMoreTrigger, loadMore: revealMore, reload } = usePagedRows(offset =>\n  api.getCustomerBalancePage({ offset, ...apiSelection(selection.value) }));\nwatch([selection, () => props.mode], () => { void reload(); }, { immediate: true });\nconst summary = computed(() => {\n  const state = selection.value;\n  const years = !state.yearFrom && !state.yearTo ? \"Alle boekjaren\" : `Boekjaren ${state.yearFrom || \"1900\"} t/m ${state.yearTo || \"2100\"}`;\n  const toDeclare = props.mode === \"declarations\" && state.onlyToDeclare ? \" · alleen nog te declareren\" : \"\";\n  return `Klantnummers ${state.customerFrom || \"000\"} t/m ${state.customerTo || \"999\"} · ${years} · ${state.includeArchived ? \"inclusief gearchiveerde klanten\" : \"actieve klanten\"}${toDeclare}`;\n});\nconst fields = [\n  { key: \"customerFrom\", label: \"Klantnummer vanaf\", placeholder: \"000\", maxLength: 3 },\n  { key: \"customerTo\", label: \"Klantnummer t/m\", placeholder: \"999\", maxLength: 3 },\n  { key: \"yearFrom\", label: \"Boekjaar vanaf\", placeholder: \"Alle jaren\", maxLength: 4 },\n  { key: \"yearTo\", label: \"Boekjaar t/m\", placeholder: \"Alle jaren\", maxLength: 4 },\n] as const;\n\nwatch(selection, state => {\n  const query = customerReportStateToQuery(state);\n  if (!sameQuery(query, queryRecord(route.query))) void router.replace({ query });\n});\nwatch(() => route.query, query => {\n  const state = parseCustomerReportState(queryRecord(query));\n  if (!sameQuery(customerReportStateToQuery(state), customerReportStateToQuery(selection.value))) {\n    selection.value = state;\n    Object.assign(form, state);\n    for (const key of Object.keys(fieldErrors)) delete fieldErrors[key];\n  }\n});\n\nfunction normalizeYear(field: \"yearFrom\" | \"yearTo\"): void {\n  if (form[field] && expandFiscalYear(form[field])) form[field] = String(expandFiscalYear(form[field]));\n}\n\nfunction apply(): void {\n  for (const key of Object.keys(fieldErrors)) delete fieldErrors[key];\n  for (const field of fields) {\n    const value = form[field.key].trim();\n    form[field.key] = value;\n    if (value && (field.key.startsWith(\"customer\") ? !/^\\d{1,3}$/.test(value) : !expandFiscalYear(value)))\n      fieldErrors[field.key] = field.key.startsWith(\"customer\") ? \"Vul een klantnummer van 000 t/m 999 in.\" : \"Vul een geldig boekjaar in (1900 t/m 2100).\";\n  }\n  normalizeYear(\"yearFrom\");\n  normalizeYear(\"yearTo\");\n  for (const [from, to] of [[\"customerFrom\", \"customerTo\"], [\"yearFrom\", \"yearTo\"]] as const) {\n    if (form[from] && form[to] && Number(form[from]) > Number(form[to])) fieldErrors[to] = \"De eindwaarde moet gelijk aan of hoger dan de beginwaarde zijn.\";\n  }\n  const first = fields.find(field => fieldErrors[field.key]);\n  if (first) {\n    document.getElementById(`report-${first.key}`)?.focus();\n    return;\n  }\n  selection.value = { ...form, customerFrom: form.customerFrom.trim(), customerTo: form.customerTo.trim() } satisfies CustomerReportState;\n}\n\nasync function loadMore(): Promise<void> {\n  const index = rows.value.length;\n  if (!await revealMore()) return;\n  await nextTick();\n  result.value?.querySelector<HTMLElement>(`[data-report-row=\"${index}\"]`)?.focus({ preventScroll: true });\n}\n\nasync function print(): Promise<void> {\n  if (!totalCount.value || loading.value || error.value || printHtml.value || printLoading.value) return;\n  const printTitle = title.value;\n  const printSummary = summary.value;\n  const selected = selection.value;\n  const mode = props.mode;\n  const current = () => !disposed && selection.value === selected && props.mode === mode;\n  printLoading.value = true;\n  printError.value = \"\";\n  // Render a separate full selection only for printing; the screen retains its loaded batches.\n  try {\n    const data = await api.getCustomerBalancePrintRows(apiSelection(selected));\n    if (!current()) return;\n    if (!data.length) throw new Error(\"Geen regels voor deze afdruk.\");\n    printRows.value = data;\n    await nextTick();\n    if (!current()) return;\n    const table = printSource.value?.querySelector(\"table\");\n    if (!table) throw new Error(\"Kon het afdrukdocument niet maken.\");\n    printHtml.value = `<!doctype html><html lang=\"nl\"><head><meta charset=\"utf-8\"><title>${printTitle}</title><style>\n    @page { size: A4 landscape; margin: 12mm; }\n    body { margin: 0; color: #000; background: #fff; font: 10pt/1.4 Arial, sans-serif; }\n    h1 { margin: 0 0 8px; font-size: 16pt; } p { margin: 0 0 12px; }\n    table { width: 100%; border-collapse: collapse; } th, td { padding: 6px 8px; text-align: left; border-bottom: 1px solid #ccc; }\n    .hh-table__num { text-align: right; white-space: nowrap; } thead { display: table-header-group; }\n    tfoot { display: table-row-group; font-weight: bold; } tr { break-inside: avoid; }\n  </style></head><body><h1>${printTitle}</h1><p>${encodeString(printSummary, \"html\")} · Bedragen exclusief btw</p>${table.outerHTML}</body></html>`;\n  } catch (cause) {\n    if (current()) printError.value = cause instanceof Error ? cause.message : \"Kon het afdrukdocument niet maken.\";\n  } finally {\n    printRows.value = null;\n    printLoading.value = false;\n  }\n}\n\nfunction onKeydown(event: KeyboardEvent): void {\n  const target = event.target as HTMLElement | null;\n  if (event.defaultPrevented || event.ctrlKey || event.metaKey || event.altKey || target?.closest(\"input, select, textarea, [contenteditable='true']\")) return;\n  if (event.key.toLowerCase() === \"p\") { event.preventDefault(); void print(); }\n}\n\nonMounted(() => window.addEventListener(\"keydown\", onKeydown));\nonBeforeUnmount(() => { disposed = true; window.removeEventListener(\"keydown\", onKeydown); });\n</script>\n\n<template>\n  <section>\n    <div class=\"hh-page__bar\">\n      <h1 class=\"hh-page__title\">{{ title }}</h1>\n      <button class=\"hh-btn\" type=\"button\" :disabled=\"loading || Boolean(error) || !totalCount || Boolean(printHtml) || printLoading\" @click=\"print\">{{ printLoading ? \"Afdruk laden…\" : \"Printen\" }}</button>\n    </div>\n    <form class=\"hh-card reports__filters\" novalidate @submit.prevent=\"apply\">\n      <div class=\"reports__ranges\">\n        <FormField v-for=\"field in fields\" :key=\"field.key\" :label=\"field.label\" :for-id=\"`report-${field.key}`\" :error=\"fieldErrors[field.key]\">\n          <input :id=\"`report-${field.key}`\" v-model=\"form[field.key]\" class=\"hh-input reports__input\" type=\"text\" inputmode=\"numeric\"\n            :maxlength=\"field.maxLength\" :placeholder=\"field.placeholder\" :aria-invalid=\"Boolean(fieldErrors[field.key])\"\n            :class=\"{ 'hh-input--error': fieldErrors[field.key] }\" @focus=\"($event.target as HTMLInputElement).select()\"\n            @blur=\"field.key === 'yearFrom' || field.key === 'yearTo' ? normalizeYear(field.key) : undefined\" />\n        </FormField>\n      </div>\n      <div class=\"reports__actions\">\n        <label class=\"reports__toggle\"><input v-model=\"form.includeArchived\" type=\"checkbox\" /> Toon gearchiveerd</label>\n        <label v-if=\"mode === 'declarations'\" class=\"reports__toggle\"><input v-model=\"form.onlyToDeclare\" type=\"checkbox\" /> Alleen nog te declareren</label>\n        <button class=\"hh-btn hh-btn--primary\" type=\"submit\">Toon overzicht</button>\n      </div>\n    </form>\n    <p class=\"hh-muted reports__summary\">{{ summary }} · Bedragen exclusief btw</p>\n    <p v-if=\"error\" class=\"hh-formerror\" role=\"alert\">{{ error }} <button class=\"hh-btn hh-btn--small\" type=\"button\" @click=\"reload\">Opnieuw proberen</button></p>\n    <p v-if=\"printError\" class=\"hh-formerror\" role=\"alert\">{{ printError }}</p>\n    <div ref=\"result\" class=\"hh-card reports__result\" :aria-busy=\"loading\">\n      <p v-if=\"loading\" class=\"hh-empty\">Laden…</p>\n      <p v-else-if=\"!error && !rows.length\" class=\"hh-empty\">Geen boekingen of budgetten voor deze selectie.</p>\n      <CustomerBalanceTable v-else-if=\"!error\" :rows=\"rows\" :mode=\"mode\" :totals=\"page?.totals\" />\n      <div v-if=\"!loading && !error && hasMore\" ref=\"loadMoreTrigger\" class=\"reports__more\">\n        <span class=\"hh-muted\" aria-live=\"polite\">{{ rows.length }} van {{ totalCount }} regels</span>\n        <span v-if=\"moreError\" class=\"hh-formerror\" role=\"alert\">{{ moreError }}</span>\n        <button class=\"hh-btn\" type=\"button\" :disabled=\"loadingMore\" @click=\"loadMore\">{{ loadingMore ? \"Regels laden…\" : moreError ? \"Opnieuw proberen\" : \"Meer regels tonen\" }}</button>\n      </div>\n    </div>\n    <div v-if=\"printRows\" ref=\"printSource\" hidden><CustomerBalanceTable :rows=\"printRows\" :mode=\"mode\" /></div>\n    <PrintDocument v-if=\"printHtml\" :html=\"printHtml\" @close=\"printHtml = ''\" />\n  </section>\n</template>\n\n<style scoped>\n.reports__filters { padding: 18px; }\n.reports__ranges { display: flex; flex-wrap: wrap; gap: 16px; }\n.reports__input { width: 140px; }\n.reports__actions { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 12px; }\n.reports__toggle { display: inline-flex; align-items: center; gap: 6px; font-size: 14px; cursor: pointer; }\n.reports__summary { margin: 16px 0; font-size: 14px; }\n.reports__result { overflow-x: auto; }\n.reports__more { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 12px; padding: 14px 16px; border-top: 1px solid var(--hh-line); }\n</style>\n","import { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, vModelText as _vModelText, normalizeClass as _normalizeClass, withDirectives as _withDirectives, withCtx as _withCtx, createVNode as _createVNode, vModelCheckbox as _vModelCheckbox, createTextVNode as _createTextVNode, createCommentVNode as _createCommentVNode, withModifiers as _withModifiers, createBlock as _createBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"hh-page__bar\" }\nconst _hoisted_2 = { class: \"hh-page__title\" }\nconst _hoisted_3 = [\"disabled\"]\nconst _hoisted_4 = { class: \"reports__ranges\" }\nconst _hoisted_5 = [\"id\", \"onUpdate:modelValue\", \"maxlength\", \"placeholder\", \"aria-invalid\", \"onBlur\"]\nconst _hoisted_6 = { class: \"reports__actions\" }\nconst _hoisted_7 = { class: \"reports__toggle\" }\nconst _hoisted_8 = {\n  key: 0,\n  class: \"reports__toggle\"\n}\nconst _hoisted_9 = { class: \"hh-muted reports__summary\" }\nconst _hoisted_10 = {\n  key: 0,\n  class: \"hh-formerror\",\n  role: \"alert\"\n}\nconst _hoisted_11 = {\n  key: 1,\n  class: \"hh-formerror\",\n  role: \"alert\"\n}\nconst _hoisted_12 = [\"aria-busy\"]\nconst _hoisted_13 = {\n  key: 0,\n  class: \"hh-empty\"\n}\nconst _hoisted_14 = {\n  key: 1,\n  class: \"hh-empty\"\n}\nconst _hoisted_15 = {\n  key: 3,\n  ref: \"loadMoreTrigger\",\n  class: \"reports__more\"\n}\nconst _hoisted_16 = {\n  class: \"hh-muted\",\n  \"aria-live\": \"polite\"\n}\nconst _hoisted_17 = {\n  key: 0,\n  class: \"hh-formerror\",\n  role: \"alert\"\n}\nconst _hoisted_18 = [\"disabled\"]\nconst _hoisted_19 = {\n  key: 2,\n  ref: \"printSource\",\n  hidden: \"\"\n}\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return (_openBlock(), _createElementBlock(\"section\", null, [\n    _createElementVNode(\"div\", _hoisted_1, [\n      _createElementVNode(\"h1\", _hoisted_2, _toDisplayString($setup.title), 1 /* TEXT */),\n      _createElementVNode(\"button\", {\n        class: \"hh-btn\",\n        type: \"button\",\n        disabled: $setup.loading || Boolean($setup.error) || !$setup.totalCount || Boolean($setup.printHtml) || $setup.printLoading,\n        onClick: $setup.print\n      }, _toDisplayString($setup.printLoading ? \"Afdruk laden…\" : \"Printen\"), 9 /* TEXT, PROPS */, _hoisted_3)\n    ]),\n    _createElementVNode(\"form\", {\n      class: \"hh-card reports__filters\",\n      novalidate: \"\",\n      onSubmit: _withModifiers($setup.apply, [\"prevent\"])\n    }, [\n      _createElementVNode(\"div\", _hoisted_4, [\n        (_openBlock(), _createElementBlock(_Fragment, null, _renderList($setup.fields, (field) => {\n          return _createVNode($setup[\"FormField\"], {\n            key: field.key,\n            label: field.label,\n            \"for-id\": `report-${field.key}`,\n            error: $setup.fieldErrors[field.key]\n          }, {\n            default: _withCtx(() => [\n              _withDirectives(_createElementVNode(\"input\", {\n                id: `report-${field.key}`,\n                \"onUpdate:modelValue\": $event => (($setup.form[field.key]) = $event),\n                class: _normalizeClass([\"hh-input reports__input\", { 'hh-input--error': $setup.fieldErrors[field.key] }]),\n                type: \"text\",\n                inputmode: \"numeric\",\n                maxlength: field.maxLength,\n                placeholder: field.placeholder,\n                \"aria-invalid\": Boolean($setup.fieldErrors[field.key]),\n                onFocus: _cache[0] || (_cache[0] = $event => (($event.target as HTMLInputElement).select())),\n                onBlur: $event => (field.key === 'yearFrom' || field.key === 'yearTo' ? $setup.normalizeYear(field.key) : undefined)\n              }, null, 42 /* CLASS, PROPS, NEED_HYDRATION */, _hoisted_5), [\n                [_vModelText, $setup.form[field.key]]\n              ])\n            ]),\n            _: 2 /* DYNAMIC */\n          }, 1032 /* PROPS, DYNAMIC_SLOTS */, [\"label\", \"for-id\", \"error\"])\n        }), 64 /* STABLE_FRAGMENT */))\n      ]),\n      _createElementVNode(\"div\", _hoisted_6, [\n        _createElementVNode(\"label\", _hoisted_7, [\n          _withDirectives(_createElementVNode(\"input\", {\n            \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => (($setup.form.includeArchived) = $event)),\n            type: \"checkbox\"\n          }, null, 512 /* NEED_PATCH */), [\n            [_vModelCheckbox, $setup.form.includeArchived]\n          ]),\n          _cache[5] || (_cache[5] = _createTextVNode(\" Toon gearchiveerd\", -1 /* CACHED */))\n        ]),\n        ($props.mode === 'declarations')\n          ? (_openBlock(), _createElementBlock(\"label\", _hoisted_8, [\n              _withDirectives(_createElementVNode(\"input\", {\n                \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => (($setup.form.onlyToDeclare) = $event)),\n                type: \"checkbox\"\n              }, null, 512 /* NEED_PATCH */), [\n                [_vModelCheckbox, $setup.form.onlyToDeclare]\n              ]),\n              _cache[6] || (_cache[6] = _createTextVNode(\" Alleen nog te declareren\", -1 /* CACHED */))\n            ]))\n          : _createCommentVNode(\"v-if\", true),\n        _cache[7] || (_cache[7] = _createElementVNode(\"button\", {\n          class: \"hh-btn hh-btn--primary\",\n          type: \"submit\"\n        }, \"Toon overzicht\", -1 /* CACHED */))\n      ])\n    ], 32 /* NEED_HYDRATION */),\n    _createElementVNode(\"p\", _hoisted_9, _toDisplayString($setup.summary) + \" · Bedragen exclusief btw\", 1 /* TEXT */),\n    ($setup.error)\n      ? (_openBlock(), _createElementBlock(\"p\", _hoisted_10, [\n          _createTextVNode(_toDisplayString($setup.error) + \" \", 1 /* TEXT */),\n          _createElementVNode(\"button\", {\n            class: \"hh-btn hh-btn--small\",\n            type: \"button\",\n            onClick: _cache[3] || (_cache[3] = (...args) => ($setup.reload && $setup.reload(...args)))\n          }, \"Opnieuw proberen\")\n        ]))\n      : _createCommentVNode(\"v-if\", true),\n    ($setup.printError)\n      ? (_openBlock(), _createElementBlock(\"p\", _hoisted_11, _toDisplayString($setup.printError), 1 /* TEXT */))\n      : _createCommentVNode(\"v-if\", true),\n    _createElementVNode(\"div\", {\n      ref: \"result\",\n      class: \"hh-card reports__result\",\n      \"aria-busy\": $setup.loading\n    }, [\n      ($setup.loading)\n        ? (_openBlock(), _createElementBlock(\"p\", _hoisted_13, \"Laden…\"))\n        : (!$setup.error && !$setup.rows.length)\n          ? (_openBlock(), _createElementBlock(\"p\", _hoisted_14, \"Geen boekingen of budgetten voor deze selectie.\"))\n          : (!$setup.error)\n            ? (_openBlock(), _createBlock($setup[\"CustomerBalanceTable\"], {\n                key: 2,\n                rows: $setup.rows,\n                mode: $props.mode,\n                totals: $setup.page?.totals\n              }, null, 8 /* PROPS */, [\"rows\", \"mode\", \"totals\"]))\n            : _createCommentVNode(\"v-if\", true),\n      (!$setup.loading && !$setup.error && $setup.hasMore)\n        ? (_openBlock(), _createElementBlock(\"div\", _hoisted_15, [\n            _createElementVNode(\"span\", _hoisted_16, _toDisplayString($setup.rows.length) + \" van \" + _toDisplayString($setup.totalCount) + \" regels\", 1 /* TEXT */),\n            ($setup.moreError)\n              ? (_openBlock(), _createElementBlock(\"span\", _hoisted_17, _toDisplayString($setup.moreError), 1 /* TEXT */))\n              : _createCommentVNode(\"v-if\", true),\n            _createElementVNode(\"button\", {\n              class: \"hh-btn\",\n              type: \"button\",\n              disabled: $setup.loadingMore,\n              onClick: $setup.loadMore\n            }, _toDisplayString($setup.loadingMore ? \"Regels laden…\" : $setup.moreError ? \"Opnieuw proberen\" : \"Meer regels tonen\"), 9 /* TEXT, PROPS */, _hoisted_18)\n          ], 512 /* NEED_PATCH */))\n        : _createCommentVNode(\"v-if\", true)\n    ], 8 /* PROPS */, _hoisted_12),\n    ($setup.printRows)\n      ? (_openBlock(), _createElementBlock(\"div\", _hoisted_19, [\n          _createVNode($setup[\"CustomerBalanceTable\"], {\n            rows: $setup.printRows,\n            mode: $props.mode\n          }, null, 8 /* PROPS */, [\"rows\", \"mode\"])\n        ], 512 /* NEED_PATCH */))\n      : _createCommentVNode(\"v-if\", true),\n    ($setup.printHtml)\n      ? (_openBlock(), _createBlock($setup[\"PrintDocument\"], {\n          key: 3,\n          html: $setup.printHtml,\n          onClose: _cache[4] || (_cache[4] = $event => ($setup.printHtml = ''))\n        }, null, 8 /* PROPS */, [\"html\"]))\n      : _createCommentVNode(\"v-if\", true)\n  ]))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/CustomerReportsView.vue?type=script\";import \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/CustomerReportsView.vue?type=style&index=0\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/CustomerReportsView.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/CustomerReportsView.vue\";script.__scopeId = \"data-v-aee10787\";export default script;","import { Money } from \"@webhare/std\";\n\nexport function expenseTransferLabel(expense: { amount: Money; transferYear: number | null }): string {\n  if (expense.transferYear === null) return \"\";\n  return Money.check(expense.amount, \"<\", \"0\") ? `Journaalboeking naar ${expense.transferYear}` : `Journaalboeking uit ${expense.transferYear}`;\n}\n","// Produktiestaat-aggregatie (klantdetail). Pure functie op Money (exact\n// decimaal, zoals de RPC-laag geld levert): uren + bedrag per\n// werkzaamheidsgroep (= eerste teken van de code), met verschotten als losse\n// sectie en subtotalen. Unit-testbaar via wh runtest.\n\nimport { Money } from \"@webhare/std\";\n\nconst ZERO = new Money(\"0\");\n\nexport interface ProductionEntry {\n  activityCode: string;\n  hours: Money;\n  amount: Money;\n}\n\nexport interface ProductionExpense {\n  amount: Money;\n}\n\nexport interface ProductionGroup {\n  group: string;\n  label: string;\n  hours: Money;\n  amount: Money;\n}\n\nexport interface ProductionStatement {\n  groups: ProductionGroup[];\n  hoursTotal: Money;\n  hoursAmountTotal: Money;\n  expensesTotal: Money;\n  grandTotal: Money; // hoursAmountTotal + expensesTotal\n}\n\n/**\n * Bouwt de produktiestaat: uren en bedrag per werkzaamheidsgroep, plus het\n * verschottotaal. Groepen worden gesorteerd op groepcijfer. Alle sommen exact\n * in Money, zodat de staat reconcilieert met de server (tellen/aggregates).\n *\n * @param input - Urenregels (code/uren/bedrag), verschotten en de groepslabels (index = cijfer)\n */\nexport function buildProductionStatement(input: {\n  entries: ProductionEntry[];\n  expenses: ProductionExpense[];\n  groupLabels: string[];\n}): ProductionStatement {\n  const byGroup = new Map<string, ProductionGroup>();\n\n  for (const entry of input.entries) {\n    const group = entry.activityCode.charAt(0) || \"?\";\n    const current = byGroup.get(group) ?? { group, label: labelFor(group, input.groupLabels), hours: ZERO, amount: ZERO };\n    current.hours = Money.add(current.hours, entry.hours);\n    current.amount = Money.add(current.amount, entry.amount);\n    byGroup.set(group, current);\n  }\n\n  const groups = [...byGroup.values()].sort((a, b) => a.group.localeCompare(b.group, \"nl\", { numeric: true }));\n\n  const hoursTotal = groups.reduce((sum, g) => Money.add(sum, g.hours), ZERO);\n  const hoursAmountTotal = groups.reduce((sum, g) => Money.add(sum, g.amount), ZERO);\n  const expensesTotal = input.expenses.reduce((sum, e) => Money.add(sum, e.amount), ZERO);\n\n  return {\n    groups,\n    hoursTotal,\n    hoursAmountTotal,\n    expensesTotal,\n    grandTotal: Money.add(hoursAmountTotal, expensesTotal),\n  };\n}\n\nfunction labelFor(group: string, groupLabels: string[]): string {\n  const index = Number(group);\n  const label = Number.isInteger(index) ? (groupLabels[index] ?? \"\").trim() : \"\";\n  return label || `Groep ${group}`;\n}\n","export type CustomerDetailTab = \"gegevens\" | \"saldi\" | \"produktie\" | \"boekingen\" | \"herinneringen\";\n\nexport interface CustomerDetailState {\n  tab: CustomerDetailTab;\n  productionYear: number;\n  bookingsYear: string;\n}\n\n/** A zero production year defers the default until the customer's years are loaded. */\nexport function parseCustomerDetailState(query: Record<string, string | undefined>): CustomerDetailState {\n  const tabs: CustomerDetailTab[] = [\"gegevens\", \"saldi\", \"produktie\", \"boekingen\", \"herinneringen\"];\n  const tab = tabs.find((value) => value === query.tab) ?? \"gegevens\";\n  return {\n    tab,\n    productionYear: query.produktiejaar && /^[1-9]\\d{3}$/.test(query.produktiejaar) ? Number(query.produktiejaar) : 0,\n    bookingsYear: query.boekingenjaar && /^[1-9]\\d{3}$/.test(query.boekingenjaar) ? query.boekingenjaar : \"all\",\n  };\n}\n\n/** Compare production against its data-derived default, not the current calendar year. */\nexport function customerDetailStateToQuery({ state, defaultProductionYear }: { state: CustomerDetailState; defaultProductionYear: number }): Record<string, string> {\n  const query: Record<string, string> = {};\n  if (state.tab !== \"gegevens\") query.tab = state.tab;\n  if (state.productionYear !== 0 && state.productionYear !== defaultProductionYear) query.produktiejaar = String(state.productionYear);\n  if (state.bookingsYear !== \"all\") query.boekingenjaar = state.bookingsYear;\n  return query;\n}\n","import { computed, customRef, effectScope, getCurrentInstance, getCurrentScope, hasInjectionContext, inject, isReactive, isRef, nextTick, onBeforeMount, onBeforeUnmount, onMounted, onScopeDispose, onUnmounted, provide, reactive, readonly, ref, shallowReadonly, shallowRef, toRef as toRef$1, toRefs as toRefs$1, toValue, unref, watch, watchEffect } from \"vue\";\n//#region computedEager/index.ts\n/**\n*\n* @deprecated This function will be removed in future version.\n*\n* Note: If you are using Vue 3.4+, you can straight use computed instead.\n* Because in Vue 3.4+, if computed new value does not change,\n* computed, effect, watch, watchEffect, render dependencies will not be triggered.\n* refer: https://github.com/vuejs/core/pull/5912\n*\n* @param fn effect function\n* @param options WatchOptionsBase\n* @returns readonly shallowRef\n*/\nfunction computedEager(fn, options) {\n\tvar _options$flush;\n\tconst result = shallowRef();\n\twatchEffect(() => {\n\t\tresult.value = fn();\n\t}, {\n\t\t...options,\n\t\tflush: (_options$flush = options === null || options === void 0 ? void 0 : options.flush) !== null && _options$flush !== void 0 ? _options$flush : \"sync\"\n\t});\n\treturn readonly(result);\n}\n/** @deprecated use `computedEager` instead */\nconst eagerComputed = computedEager;\n//#endregion\n//#region computedWithControl/index.ts\n/**\n* Explicitly define the deps of computed.\n*\n* @param source\n* @param fn\n*/\nfunction computedWithControl(source, fn, options = {}) {\n\tlet v = void 0;\n\tlet track;\n\tlet trigger;\n\tlet dirty = true;\n\tconst update = () => {\n\t\tdirty = true;\n\t\ttrigger();\n\t};\n\twatch(source, update, {\n\t\tflush: \"sync\",\n\t\t...options\n\t});\n\tconst get = typeof fn === \"function\" ? fn : fn.get;\n\tconst set = typeof fn === \"function\" ? void 0 : fn.set;\n\tconst result = customRef((_track, _trigger) => {\n\t\ttrack = _track;\n\t\ttrigger = _trigger;\n\t\treturn {\n\t\t\tget() {\n\t\t\t\tif (dirty) {\n\t\t\t\t\tv = get(v);\n\t\t\t\t\tdirty = false;\n\t\t\t\t}\n\t\t\t\ttrack();\n\t\t\t\treturn v;\n\t\t\t},\n\t\t\tset(v) {\n\t\t\t\tset === null || set === void 0 || set(v);\n\t\t\t}\n\t\t};\n\t});\n\tresult.trigger = update;\n\treturn result;\n}\n/** @deprecated use `computedWithControl` instead */\nconst controlledComputed = computedWithControl;\n//#endregion\n//#region createDisposableDirective/index.ts\n/**\n* Utility for authoring disposable directives. Reactive effects created within `mounted` directive hook will be tracked and automatically disposed when directive is unmounted.\n*\n* @see https://vueuse.org/createDisposableDirective\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction createDisposableDirective(origin = {}) {\n\tfunction isFunc(fn) {\n\t\treturn typeof fn === \"function\";\n\t}\n\tconst normalisedOrigin = isFunc(origin) ? {\n\t\tmounted: origin,\n\t\tupdated: origin\n\t} : origin;\n\tconst { mounted, unmounted } = normalisedOrigin;\n\tif (!isFunc(mounted)) return origin;\n\tconst scopeWeakMap = /* @__PURE__ */ new WeakMap();\n\treturn {\n\t\t...normalisedOrigin,\n\t\tmounted(el, binding, vNode, prevNode) {\n\t\t\tvar _scopeWeakMap$get;\n\t\t\tconst scope = (_scopeWeakMap$get = scopeWeakMap.get(el)) !== null && _scopeWeakMap$get !== void 0 ? _scopeWeakMap$get : effectScope();\n\t\t\tscopeWeakMap.set(el, scope);\n\t\t\tscope.run(() => {\n\t\t\t\tmounted === null || mounted === void 0 || mounted(el, binding, vNode, prevNode);\n\t\t\t});\n\t\t},\n\t\tunmounted(el, binding, vNode, prevNode) {\n\t\t\tvar _scopeWeakMap$get2;\n\t\t\t(_scopeWeakMap$get2 = scopeWeakMap.get(el)) === null || _scopeWeakMap$get2 === void 0 || _scopeWeakMap$get2.stop();\n\t\t\tscopeWeakMap.delete(el);\n\t\t\tif (isFunc(unmounted)) unmounted(el, binding, vNode, prevNode);\n\t\t}\n\t};\n}\n//#endregion\n//#region tryOnScopeDispose/index.ts\n/**\n* Call onScopeDispose() if it's inside an effect scope lifecycle, if not, do nothing\n*\n* @param fn\n*/\nfunction tryOnScopeDispose(fn, failSilently) {\n\tif (getCurrentScope()) {\n\t\tonScopeDispose(fn, failSilently);\n\t\treturn true;\n\t}\n\treturn false;\n}\n//#endregion\n//#region createEventHook/index.ts\n/**\n* Utility for creating event hooks\n*\n* @see https://vueuse.org/createEventHook\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction createEventHook() {\n\tconst fns = /* @__PURE__ */ new Set();\n\tconst off = (fn) => {\n\t\tfns.delete(fn);\n\t};\n\tconst clear = () => {\n\t\tfns.clear();\n\t};\n\tconst on = (fn) => {\n\t\tfns.add(fn);\n\t\tconst offFn = () => off(fn);\n\t\ttryOnScopeDispose(offFn);\n\t\treturn { off: offFn };\n\t};\n\tconst trigger = (...args) => {\n\t\treturn Promise.all(Array.from(fns).map((fn) => fn(...args)));\n\t};\n\treturn {\n\t\ton,\n\t\toff,\n\t\ttrigger,\n\t\tclear\n\t};\n}\n//#endregion\n//#region createGlobalState/index.ts\n/**\n* Keep states in the global scope to be reusable across Vue instances.\n*\n* @see https://vueuse.org/createGlobalState\n* @param stateFactory A factory function to create the state\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction createGlobalState(stateFactory) {\n\tlet initialized = false;\n\tlet state;\n\tconst scope = effectScope(true);\n\treturn ((...args) => {\n\t\tif (!initialized) {\n\t\t\tstate = scope.run(() => stateFactory(...args));\n\t\t\tinitialized = true;\n\t\t}\n\t\treturn state;\n\t});\n}\n//#endregion\n//#region provideLocal/map.ts\nconst localProvidedStateMap = /* @__PURE__ */ new WeakMap();\n//#endregion\n//#region injectLocal/index.ts\n/**\n* On the basis of `inject`, it is allowed to directly call inject to obtain the value after call provide in the same component.\n*\n* @example\n* ```ts\n* injectLocal('MyInjectionKey', 1)\n* const injectedValue = injectLocal('MyInjectionKey') // injectedValue === 1\n* ```\n*\n* @__NO_SIDE_EFFECTS__\n*/\nconst injectLocal = (...args) => {\n\tvar _getCurrentInstance;\n\tconst key = args[0];\n\tconst instance = (_getCurrentInstance = getCurrentInstance()) === null || _getCurrentInstance === void 0 ? void 0 : _getCurrentInstance.proxy;\n\tconst owner = instance !== null && instance !== void 0 ? instance : getCurrentScope();\n\tif (owner == null && !hasInjectionContext()) throw new Error(\"injectLocal must be called in setup\");\n\tif (owner && localProvidedStateMap.has(owner) && key in localProvidedStateMap.get(owner)) return localProvidedStateMap.get(owner)[key];\n\treturn inject(...args);\n};\n//#endregion\n//#region provideLocal/index.ts\n/**\n* On the basis of `provide`, it is allowed to directly call inject to obtain the value after call provide in the same component.\n*\n* @example\n* ```ts\n* provideLocal('MyInjectionKey', 1)\n* const injectedValue = injectLocal('MyInjectionKey') // injectedValue === 1\n* ```\n*/\nfunction provideLocal(key, value) {\n\tvar _getCurrentInstance;\n\tconst instance = (_getCurrentInstance = getCurrentInstance()) === null || _getCurrentInstance === void 0 ? void 0 : _getCurrentInstance.proxy;\n\tconst owner = instance !== null && instance !== void 0 ? instance : getCurrentScope();\n\tif (owner == null) throw new Error(\"provideLocal must be called in setup\");\n\tif (!localProvidedStateMap.has(owner)) localProvidedStateMap.set(owner, Object.create(null));\n\tconst localProvidedState = localProvidedStateMap.get(owner);\n\tlocalProvidedState[key] = value;\n\treturn provide(key, value);\n}\n//#endregion\n//#region createInjectionState/index.ts\nfunction createInjectionState(composable, options) {\n\tconst key = (options === null || options === void 0 ? void 0 : options.injectionKey) || Symbol(composable.name || \"InjectionState\");\n\tconst defaultValue = options === null || options === void 0 ? void 0 : options.defaultValue;\n\tconst useProvidingState = (...args) => {\n\t\tconst state = composable(...args);\n\t\tprovideLocal(key, state);\n\t\treturn state;\n\t};\n\tconst useInjectedState = () => injectLocal(key, defaultValue);\n\treturn [useProvidingState, useInjectedState];\n}\n//#endregion\n//#region createRef/index.ts\n/**\n* Returns a `deepRef` or `shallowRef` depending on the `deep` param.\n*\n* @example createRef(1) // ShallowRef<number>\n* @example createRef(1, false) // ShallowRef<number>\n* @example createRef(1, true) // Ref<number>\n* @example createRef(\"string\") // ShallowRef<string>\n* @example createRef<\"A\"|\"B\">(\"A\", true) // Ref<\"A\"|\"B\">\n*\n* @param value\n* @param deep\n* @returns the `deepRef` or `shallowRef`\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction createRef(value, deep) {\n\tif (deep === true) return ref(value);\n\telse return shallowRef(value);\n}\n//#endregion\n//#region utils/is.ts\nconst isClient = typeof window !== \"undefined\" && typeof document !== \"undefined\";\nconst isWorker = typeof WorkerGlobalScope !== \"undefined\" && globalThis instanceof WorkerGlobalScope;\nconst isDef = (val) => typeof val !== \"undefined\";\nconst notNullish = (val) => val != null;\nconst assert = (condition, ...infos) => {\n\tif (!condition) console.warn(...infos);\n};\nconst toString = Object.prototype.toString;\nconst isObject = (val) => toString.call(val) === \"[object Object]\";\nconst now = () => Date.now();\nconst timestamp = () => +Date.now();\nconst clamp = (n, min, max) => Math.min(max, Math.max(min, n));\nconst noop = () => {};\nconst rand = (min, max) => {\n\tmin = Math.ceil(min);\n\tmax = Math.floor(max);\n\treturn Math.floor(Math.random() * (max - min + 1)) + min;\n};\nconst hasOwn = (val, key) => Object.hasOwn(val, key);\nconst isIOS = /* @__PURE__ */ getIsIOS();\nfunction getIsIOS() {\n\tvar _window, _window2, _window3;\n\treturn isClient && !!((_window = window) === null || _window === void 0 || (_window = _window.navigator) === null || _window === void 0 ? void 0 : _window.userAgent) && (/iP(?:ad|hone|od)/.test(window.navigator.userAgent) || ((_window2 = window) === null || _window2 === void 0 || (_window2 = _window2.navigator) === null || _window2 === void 0 ? void 0 : _window2.maxTouchPoints) > 2 && /iPad|Macintosh/.test((_window3 = window) === null || _window3 === void 0 ? void 0 : _window3.navigator.userAgent));\n}\n//#endregion\n//#region toRef/index.ts\nfunction toRef(...args) {\n\tif (args.length !== 1) return toRef$1(...args);\n\tconst r = args[0];\n\treturn typeof r === \"function\" ? readonly(customRef(() => ({\n\t\tget: r,\n\t\tset: noop\n\t}))) : ref(r);\n}\n//#endregion\n//#region utils/filters.ts\n/**\n* @internal\n*/\nfunction createFilterWrapper(filter, fn) {\n\tfunction wrapper(...args) {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tPromise.resolve(filter(() => fn.apply(this, args), {\n\t\t\t\tfn,\n\t\t\t\tthisArg: this,\n\t\t\t\targs\n\t\t\t})).then(resolve).catch(reject);\n\t\t});\n\t}\n\treturn wrapper;\n}\nconst bypassFilter = (invoke) => {\n\treturn invoke();\n};\n/**\n* Create an EventFilter that debounce the events\n*/\nfunction debounceFilter(ms, options = {}) {\n\tlet timer;\n\tlet maxTimer;\n\tlet lastRejector = noop;\n\tconst _clearTimeout = (timer) => {\n\t\tclearTimeout(timer);\n\t\tlastRejector();\n\t\tlastRejector = noop;\n\t};\n\tlet lastInvoker;\n\tconst filter = (invoke) => {\n\t\tconst duration = toValue(ms);\n\t\tconst maxDuration = toValue(options.maxWait);\n\t\tif (timer) _clearTimeout(timer);\n\t\tif (duration <= 0 || maxDuration !== void 0 && maxDuration <= 0) {\n\t\t\tif (maxTimer) {\n\t\t\t\t_clearTimeout(maxTimer);\n\t\t\t\tmaxTimer = void 0;\n\t\t\t}\n\t\t\treturn Promise.resolve(invoke());\n\t\t}\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlastRejector = options.rejectOnCancel ? reject : resolve;\n\t\t\tlastInvoker = invoke;\n\t\t\tif (maxDuration && !maxTimer) maxTimer = setTimeout(() => {\n\t\t\t\tif (timer) _clearTimeout(timer);\n\t\t\t\tmaxTimer = void 0;\n\t\t\t\tresolve(lastInvoker());\n\t\t\t}, maxDuration);\n\t\t\ttimer = setTimeout(() => {\n\t\t\t\tif (maxTimer) _clearTimeout(maxTimer);\n\t\t\t\tmaxTimer = void 0;\n\t\t\t\tresolve(invoke());\n\t\t\t}, duration);\n\t\t});\n\t};\n\treturn filter;\n}\nfunction throttleFilter(...args) {\n\tlet lastExec = 0;\n\tlet timer;\n\tlet isLeading = true;\n\tlet lastRejector = noop;\n\tlet lastValue;\n\tlet ms;\n\tlet trailing;\n\tlet leading;\n\tlet rejectOnCancel;\n\tif (!isRef(args[0]) && typeof args[0] === \"object\") ({delay: ms, trailing = true, leading = true, rejectOnCancel = false} = args[0]);\n\telse [ms, trailing = true, leading = true, rejectOnCancel = false] = args;\n\tconst clear = () => {\n\t\tif (timer) {\n\t\t\tclearTimeout(timer);\n\t\t\ttimer = void 0;\n\t\t\tlastRejector();\n\t\t\tlastRejector = noop;\n\t\t}\n\t};\n\tconst filter = (_invoke) => {\n\t\tconst duration = toValue(ms);\n\t\tconst elapsed = Date.now() - lastExec;\n\t\tconst invoke = () => {\n\t\t\treturn lastValue = _invoke();\n\t\t};\n\t\tclear();\n\t\tif (duration <= 0) {\n\t\t\tlastExec = Date.now();\n\t\t\treturn invoke();\n\t\t}\n\t\tif (elapsed > duration) {\n\t\t\tlastExec = Date.now();\n\t\t\tif (leading || !isLeading) invoke();\n\t\t} else if (trailing) lastValue = new Promise((resolve, reject) => {\n\t\t\tlastRejector = rejectOnCancel ? reject : resolve;\n\t\t\ttimer = setTimeout(() => {\n\t\t\t\tlastExec = Date.now();\n\t\t\t\tisLeading = true;\n\t\t\t\tresolve(invoke());\n\t\t\t\tclear();\n\t\t\t}, Math.max(0, duration - elapsed));\n\t\t});\n\t\tif (!leading && !timer) timer = setTimeout(() => isLeading = true, duration);\n\t\tisLeading = false;\n\t\treturn lastValue;\n\t};\n\treturn filter;\n}\n/**\n* EventFilter that gives extra controls to pause and resume the filter\n*\n* @param extendFilter  Extra filter to apply when the PausableFilter is active, default to none\n* @param options Options to configure the filter\n*/\nfunction pausableFilter(extendFilter = bypassFilter, options = {}) {\n\tconst { initialState = \"active\" } = options;\n\tconst isActive = toRef(initialState === \"active\");\n\tfunction pause() {\n\t\tisActive.value = false;\n\t}\n\tfunction resume() {\n\t\tisActive.value = true;\n\t}\n\tconst eventFilter = (...args) => {\n\t\tif (isActive.value) extendFilter(...args);\n\t};\n\treturn {\n\t\tisActive: shallowReadonly(isActive),\n\t\tpause,\n\t\tresume,\n\t\teventFilter\n\t};\n}\n//#endregion\n//#region utils/general.ts\nfunction promiseTimeout(ms, throwOnTimeout = false, reason = \"Timeout\") {\n\treturn new Promise((resolve, reject) => {\n\t\tif (throwOnTimeout) setTimeout(reject, ms, reason);\n\t\telse setTimeout(resolve, ms);\n\t});\n}\nfunction identity(arg) {\n\treturn arg;\n}\n/**\n* Create singleton promise function\n*\n* @example\n* ```\n* const promise = createSingletonPromise(async () => { ... })\n*\n* await promise()\n* await promise() // all of them will be bind to a single promise instance\n* await promise() // and be resolved together\n* ```\n*/\nfunction createSingletonPromise(fn) {\n\tlet _promise;\n\tfunction wrapper() {\n\t\tif (!_promise) _promise = fn();\n\t\treturn _promise;\n\t}\n\twrapper.reset = async () => {\n\t\tconst _prev = _promise;\n\t\t_promise = void 0;\n\t\tif (_prev) await _prev;\n\t};\n\treturn wrapper;\n}\nfunction invoke(fn) {\n\treturn fn();\n}\nfunction containsProp(obj, ...props) {\n\treturn props.some((k) => k in obj);\n}\nfunction increaseWithUnit(target, delta) {\n\tvar _target$match;\n\tif (typeof target === \"number\") return target + delta;\n\tconst value = ((_target$match = target.match(/^-?\\d+\\.?\\d*/)) === null || _target$match === void 0 ? void 0 : _target$match[0]) || \"\";\n\tconst unit = target.slice(value.length);\n\tconst result = Number.parseFloat(value) + delta;\n\tif (Number.isNaN(result)) return target;\n\treturn result + unit;\n}\n/**\n* Get a px value for SSR use, do not rely on this method outside of SSR as REM unit is assumed at 16px, which might not be the case on the client\n*/\nfunction pxValue(px) {\n\treturn px.endsWith(\"rem\") ? Number.parseFloat(px) * 16 : Number.parseFloat(px);\n}\n/**\n* Create a new subset object by giving keys\n*/\nfunction objectPick(obj, keys, omitUndefined = false) {\n\treturn keys.reduce((n, k) => {\n\t\tif (k in obj) {\n\t\t\tif (!omitUndefined || obj[k] !== void 0) n[k] = obj[k];\n\t\t}\n\t\treturn n;\n\t}, {});\n}\n/**\n* Create a new subset object by omit giving keys\n*/\nfunction objectOmit(obj, keys, omitUndefined = false) {\n\treturn Object.fromEntries(Object.entries(obj).filter(([key, value]) => {\n\t\treturn (!omitUndefined || value !== void 0) && !keys.includes(key);\n\t}));\n}\nfunction objectEntries(obj) {\n\treturn Object.entries(obj);\n}\nfunction toArray(value) {\n\treturn Array.isArray(value) ? value : [value];\n}\n//#endregion\n//#region utils/port.ts\nfunction cacheStringFunction(fn) {\n\tconst cache = Object.create(null);\n\treturn ((str) => {\n\t\treturn cache[str] || (cache[str] = fn(str));\n\t});\n}\nconst hyphenateRE = /\\B([A-Z])/g;\nconst hyphenate = cacheStringFunction((str) => str.replace(hyphenateRE, \"-$1\").toLowerCase());\nconst camelizeRE = /-(\\w)/g;\nconst camelize = cacheStringFunction((str) => {\n\treturn str.replace(camelizeRE, (_, c) => c ? c.toUpperCase() : \"\");\n});\n//#endregion\n//#region utils/vue.ts\nfunction getLifeCycleTarget(target) {\n\treturn target || getCurrentInstance();\n}\n//#endregion\n//#region createSharedComposable/index.ts\n/**\n* Make a composable function usable with multiple Vue instances.\n*\n* @see https://vueuse.org/createSharedComposable\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction createSharedComposable(composable) {\n\tif (!isClient) return composable;\n\tlet subscribers = 0;\n\tlet state;\n\tlet scope;\n\tconst dispose = () => {\n\t\tsubscribers -= 1;\n\t\tif (scope && subscribers <= 0) {\n\t\t\tscope.stop();\n\t\t\tstate = void 0;\n\t\t\tscope = void 0;\n\t\t}\n\t};\n\treturn ((...args) => {\n\t\tsubscribers += 1;\n\t\tif (!scope) {\n\t\t\tscope = effectScope(true);\n\t\t\tstate = scope.run(() => composable(...args));\n\t\t}\n\t\ttryOnScopeDispose(dispose);\n\t\treturn state;\n\t});\n}\n//#endregion\n//#region extendRef/index.ts\nfunction extendRef(ref, extend, { enumerable = false, unwrap = true } = {}) {\n\tfor (const [key, value] of Object.entries(extend)) {\n\t\tif (key === \"value\") continue;\n\t\tif (isRef(value) && unwrap) Object.defineProperty(ref, key, {\n\t\t\tget() {\n\t\t\t\treturn value.value;\n\t\t\t},\n\t\t\tset(v) {\n\t\t\t\tvalue.value = v;\n\t\t\t},\n\t\t\tenumerable\n\t\t});\n\t\telse Object.defineProperty(ref, key, {\n\t\t\tvalue,\n\t\t\tenumerable\n\t\t});\n\t}\n\treturn ref;\n}\n//#endregion\n//#region get/index.ts\nfunction get(obj, key) {\n\tif (key == null) return unref(obj);\n\treturn unref(obj)[key];\n}\n//#endregion\n//#region isDefined/index.ts\nfunction isDefined(v) {\n\treturn unref(v) != null;\n}\n//#endregion\n//#region makeDestructurable/index.ts\n/* @__NO_SIDE_EFFECTS__ */\nfunction makeDestructurable(obj, arr) {\n\tif (typeof Symbol !== \"undefined\") {\n\t\tconst clone = { ...obj };\n\t\tObject.defineProperty(clone, Symbol.iterator, {\n\t\t\tenumerable: false,\n\t\t\tvalue() {\n\t\t\t\tlet index = 0;\n\t\t\t\treturn { next: () => ({\n\t\t\t\t\tvalue: arr[index++],\n\t\t\t\t\tdone: index > arr.length\n\t\t\t\t}) };\n\t\t\t}\n\t\t});\n\t\treturn clone;\n\t} else return Object.assign([...arr], obj);\n}\n//#endregion\n//#region reactify/index.ts\n/**\n* Converts plain function into a reactive function.\n* The converted function accepts refs as it's arguments\n* and returns a ComputedRef, with proper typing.\n*\n* @param fn - Source function\n* @param options - Options\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction reactify(fn, options) {\n\tconst unrefFn = (options === null || options === void 0 ? void 0 : options.computedGetter) === false ? unref : toValue;\n\treturn function(...args) {\n\t\treturn computed(() => fn.apply(this, args.map((i) => unrefFn(i))));\n\t};\n}\n/** @deprecated use `reactify` instead */\nconst createReactiveFn = reactify;\n//#endregion\n//#region reactifyObject/index.ts\n/**\n* Apply `reactify` to an object\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction reactifyObject(obj, optionsOrKeys = {}) {\n\tlet keys = [];\n\tlet options;\n\tif (Array.isArray(optionsOrKeys)) keys = optionsOrKeys;\n\telse {\n\t\toptions = optionsOrKeys;\n\t\tconst { includeOwnProperties = true } = optionsOrKeys;\n\t\tkeys.push(...Object.keys(obj));\n\t\tif (includeOwnProperties) keys.push(...Object.getOwnPropertyNames(obj));\n\t}\n\treturn Object.fromEntries(keys.map((key) => {\n\t\tconst value = obj[key];\n\t\treturn [key, typeof value === \"function\" ? reactify(value.bind(obj), options) : value];\n\t}));\n}\n//#endregion\n//#region toReactive/index.ts\n/**\n* Converts ref to reactive.\n*\n* @see https://vueuse.org/toReactive\n* @param objectRef A ref of object\n*/\nfunction toReactive(objectRef) {\n\tif (!isRef(objectRef)) return reactive(objectRef);\n\treturn reactive(new Proxy({}, {\n\t\tget(_, p, receiver) {\n\t\t\treturn unref(Reflect.get(objectRef.value, p, receiver));\n\t\t},\n\t\tset(_, p, value) {\n\t\t\tif (isRef(objectRef.value[p]) && !isRef(value)) objectRef.value[p].value = value;\n\t\t\telse objectRef.value[p] = value;\n\t\t\treturn true;\n\t\t},\n\t\tdeleteProperty(_, p) {\n\t\t\treturn Reflect.deleteProperty(objectRef.value, p);\n\t\t},\n\t\thas(_, p) {\n\t\t\treturn Reflect.has(objectRef.value, p);\n\t\t},\n\t\townKeys() {\n\t\t\treturn Object.keys(objectRef.value);\n\t\t},\n\t\tgetOwnPropertyDescriptor() {\n\t\t\treturn {\n\t\t\t\tenumerable: true,\n\t\t\t\tconfigurable: true\n\t\t\t};\n\t\t}\n\t}));\n}\n//#endregion\n//#region reactiveComputed/index.ts\n/**\n* Computed reactive object.\n*/\nfunction reactiveComputed(fn) {\n\treturn toReactive(computed(fn));\n}\n//#endregion\n//#region reactiveOmit/index.ts\n/**\n* Reactively omit fields from a reactive object\n*\n* @see https://vueuse.org/reactiveOmit\n*/\nfunction reactiveOmit(obj, ...keys) {\n\tconst flatKeys = keys.flat();\n\tconst predicate = flatKeys[0];\n\treturn reactiveComputed(() => typeof predicate === \"function\" ? Object.fromEntries(Object.entries(toRefs$1(obj)).filter(([k, v]) => !predicate(toValue(v), k))) : Object.fromEntries(Object.entries(toRefs$1(obj)).filter((e) => !flatKeys.includes(e[0]))));\n}\n//#endregion\n//#region reactivePick/index.ts\n/**\n* Reactively pick fields from a reactive object\n*\n* @see https://vueuse.org/reactivePick\n*/\nfunction reactivePick(obj, ...keys) {\n\tconst flatKeys = keys.flat();\n\tconst predicate = flatKeys[0];\n\treturn reactiveComputed(() => typeof predicate === \"function\" ? Object.fromEntries(Object.entries(toRefs$1(obj)).filter(([k, v]) => predicate(toValue(v), k))) : Object.fromEntries(flatKeys.map((k) => [k, toRef(obj, k)])));\n}\n//#endregion\n//#region refAutoReset/index.ts\n/**\n* Create a ref which will be reset to the default value after some time.\n*\n* @see https://vueuse.org/refAutoReset\n* @param defaultValue The value which will be set.\n* @param afterMs      A zero-or-greater delay in milliseconds.\n*/\nfunction refAutoReset(defaultValue, afterMs = 1e4) {\n\treturn customRef((track, trigger) => {\n\t\tlet value = toValue(defaultValue);\n\t\tlet timer;\n\t\tconst resetAfter = () => setTimeout(() => {\n\t\t\tvalue = toValue(defaultValue);\n\t\t\ttrigger();\n\t\t}, toValue(afterMs));\n\t\ttryOnScopeDispose(() => {\n\t\t\tclearTimeout(timer);\n\t\t});\n\t\treturn {\n\t\t\tget() {\n\t\t\t\ttrack();\n\t\t\t\treturn value;\n\t\t\t},\n\t\t\tset(newValue) {\n\t\t\t\tvalue = newValue;\n\t\t\t\ttrigger();\n\t\t\t\tclearTimeout(timer);\n\t\t\t\ttimer = resetAfter();\n\t\t\t}\n\t\t};\n\t});\n}\n/** @deprecated use `refAutoReset` instead */\nconst autoResetRef = refAutoReset;\n//#endregion\n//#region useDebounceFn/index.ts\n/**\n* Debounce execution of a function.\n*\n* @see https://vueuse.org/useDebounceFn\n* @param  fn          A function to be executed after delay milliseconds debounced.\n* @param  ms          A zero-or-greater delay in milliseconds. For event callbacks, values around 100 or 250 (or even higher) are most useful.\n* @param  options     Options\n*\n* @return A new, debounce, function.\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction useDebounceFn(fn, ms = 200, options = {}) {\n\treturn createFilterWrapper(debounceFilter(ms, options), fn);\n}\n//#endregion\n//#region refDebounced/index.ts\n/**\n* Debounce updates of a ref.\n*\n* @return A new debounced ref.\n*/\nfunction refDebounced(value, ms = 200, options = {}) {\n\tconst debounced = ref(toValue(value));\n\tconst updater = useDebounceFn(() => {\n\t\tdebounced.value = value.value;\n\t}, ms, options);\n\twatch(value, () => updater());\n\treturn shallowReadonly(debounced);\n}\n/** @deprecated use `refDebounced` instead */\nconst debouncedRef = refDebounced;\n/** @deprecated use `refDebounced` instead */\nconst useDebounce = refDebounced;\n//#endregion\n//#region refDefault/index.ts\n/**\n* Apply default value to a ref.\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction refDefault(source, defaultValue) {\n\treturn computed({\n\t\tget() {\n\t\t\tvar _source$value;\n\t\t\treturn (_source$value = source.value) !== null && _source$value !== void 0 ? _source$value : defaultValue;\n\t\t},\n\t\tset(value) {\n\t\t\tsource.value = value;\n\t\t}\n\t});\n}\n//#endregion\n//#region refManualReset/index.ts\n/**\n* Create a ref with manual reset functionality.\n*\n* @see https://vueuse.org/refManualReset\n* @param defaultValue The value which will be set.\n*/\nfunction refManualReset(defaultValue) {\n\tlet value = toValue(defaultValue);\n\tlet trigger;\n\tconst reset = () => {\n\t\tvalue = toValue(defaultValue);\n\t\ttrigger();\n\t};\n\tconst refValue = customRef((track, _trigger) => {\n\t\ttrigger = _trigger;\n\t\treturn {\n\t\t\tget() {\n\t\t\t\ttrack();\n\t\t\t\treturn value;\n\t\t\t},\n\t\t\tset(newValue) {\n\t\t\t\tvalue = newValue;\n\t\t\t\ttrigger();\n\t\t\t}\n\t\t};\n\t});\n\trefValue.reset = reset;\n\treturn refValue;\n}\n//#endregion\n//#region useThrottleFn/index.ts\n/**\n* Throttle execution of a function. Especially useful for rate limiting\n* execution of handlers on events like resize and scroll.\n*\n* @param   fn             A function to be executed after delay milliseconds. The `this` context and all arguments are passed through, as-is,\n*                                    to `callback` when the throttled-function is executed.\n* @param   ms             A zero-or-greater delay in milliseconds. For event callbacks, values around 100 or 250 (or even higher) are most useful.\n*                                    (default value: 200)\n*\n* @param [trailing] if true, call fn again after the time is up (default value: false)\n*\n* @param [leading] if true, call fn on the leading edge of the ms timeout (default value: true)\n*\n* @param [rejectOnCancel] if true, reject the last call if it's been cancel (default value: false)\n*\n* @return  A new, throttled, function.\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction useThrottleFn(fn, ms = 200, trailing = false, leading = true, rejectOnCancel = false) {\n\treturn createFilterWrapper(throttleFilter(ms, trailing, leading, rejectOnCancel), fn);\n}\n//#endregion\n//#region refThrottled/index.ts\n/**\n* Throttle execution of a function. Especially useful for rate limiting\n* execution of handlers on events like resize and scroll.\n*\n* @param value Ref value to be watched with throttle effect\n* @param  delay  A zero-or-greater delay in milliseconds. For event callbacks, values around 100 or 250 (or even higher) are most useful.\n* @param trailing if true, update the value again after the delay time is up\n* @param leading if true, update the value on the leading edge of the ms timeout\n*/\nfunction refThrottled(value, delay = 200, trailing = true, leading = true) {\n\tif (delay <= 0) return value;\n\tconst throttled = ref(toValue(value));\n\tconst updater = useThrottleFn(() => {\n\t\tthrottled.value = value.value;\n\t}, delay, trailing, leading);\n\twatch(value, () => updater());\n\treturn throttled;\n}\n/** @deprecated use `refThrottled` instead */\nconst throttledRef = refThrottled;\n/** @deprecated use `refThrottled` instead */\nconst useThrottle = refThrottled;\n//#endregion\n//#region refWithControl/index.ts\n/**\n* Fine-grained controls over ref and its reactivity.\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction refWithControl(initial, options = {}) {\n\tlet source = initial;\n\tlet track;\n\tlet trigger;\n\tconst ref = customRef((_track, _trigger) => {\n\t\ttrack = _track;\n\t\ttrigger = _trigger;\n\t\treturn {\n\t\t\tget() {\n\t\t\t\treturn get();\n\t\t\t},\n\t\t\tset(v) {\n\t\t\t\tset(v);\n\t\t\t}\n\t\t};\n\t});\n\tfunction get(tracking = true) {\n\t\tif (tracking) track();\n\t\treturn source;\n\t}\n\tfunction set(value, triggering = true) {\n\t\tvar _options$onBeforeChan, _options$onChanged;\n\t\tif (value === source) return;\n\t\tconst old = source;\n\t\tif (((_options$onBeforeChan = options.onBeforeChange) === null || _options$onBeforeChan === void 0 ? void 0 : _options$onBeforeChan.call(options, value, old)) === false) return;\n\t\tsource = value;\n\t\t(_options$onChanged = options.onChanged) === null || _options$onChanged === void 0 || _options$onChanged.call(options, value, old);\n\t\tif (triggering) trigger();\n\t}\n\t/**\n\t* Get the value without tracked in the reactivity system\n\t*/\n\tconst untrackedGet = () => get(false);\n\t/**\n\t* Set the value without triggering the reactivity system\n\t*/\n\tconst silentSet = (v) => set(v, false);\n\t/**\n\t* Get the value without tracked in the reactivity system.\n\t*\n\t* Alias for `untrackedGet()`\n\t*/\n\tconst peek = () => get(false);\n\t/**\n\t* Set the value without triggering the reactivity system\n\t*\n\t* Alias for `silentSet(v)`\n\t*/\n\tconst lay = (v) => set(v, false);\n\treturn extendRef(ref, {\n\t\tget,\n\t\tset,\n\t\tuntrackedGet,\n\t\tsilentSet,\n\t\tpeek,\n\t\tlay\n\t}, { enumerable: true });\n}\n/** @deprecated use `refWithControl` instead */\nconst controlledRef = refWithControl;\n//#endregion\n//#region set/index.ts\n/**\n*  Shorthand for `ref.value = x`\n*/\nfunction set(...args) {\n\tif (args.length === 2) {\n\t\tconst [ref, value] = args;\n\t\tref.value = value;\n\t}\n\tif (args.length === 3) {\n\t\tconst [target, key, value] = args;\n\t\ttarget[key] = value;\n\t}\n}\n//#endregion\n//#region watchWithFilter/index.ts\nfunction watchWithFilter(source, cb, options = {}) {\n\tconst { eventFilter = bypassFilter, ...watchOptions } = options;\n\treturn watch(source, createFilterWrapper(eventFilter, cb), watchOptions);\n}\n//#endregion\n//#region watchPausable/index.ts\n/** @deprecated Use Vue's built-in `watch` instead. This function will be removed in future version. */\nfunction watchPausable(source, cb, options = {}) {\n\tconst { eventFilter: filter, initialState = \"active\", ...watchOptions } = options;\n\tconst { eventFilter, pause, resume, isActive } = pausableFilter(filter, { initialState });\n\treturn {\n\t\tstop: watchWithFilter(source, cb, {\n\t\t\t...watchOptions,\n\t\t\teventFilter\n\t\t}),\n\t\tpause,\n\t\tresume,\n\t\tisActive\n\t};\n}\n/** @deprecated Use Vue's built-in `watch` instead. This function will be removed in future version. */\nconst pausableWatch = watchPausable;\n//#endregion\n//#region syncRef/index.ts\n/**\n* Two-way refs synchronization.\n* From the set theory perspective to restrict the option's type\n* Check in the following order:\n* 1. L = R\n* 2. L ∩ R ≠ ∅\n* 3. L ⊆ R\n* 4. L ∩ R = ∅\n*/\nfunction syncRef(left, right, ...[options]) {\n\tconst { flush = \"sync\", deep = false, immediate = true, direction = \"both\", transform = {} } = options || {};\n\tconst watchers = [];\n\tconst transformLTR = \"ltr\" in transform && transform.ltr || ((v) => v);\n\tconst transformRTL = \"rtl\" in transform && transform.rtl || ((v) => v);\n\tif (direction === \"both\" || direction === \"ltr\") watchers.push(watchPausable(left, (newValue) => {\n\t\twatchers.forEach((w) => w.pause());\n\t\tright.value = transformLTR(newValue);\n\t\twatchers.forEach((w) => w.resume());\n\t}, {\n\t\tflush,\n\t\tdeep,\n\t\timmediate\n\t}));\n\tif (direction === \"both\" || direction === \"rtl\") watchers.push(watchPausable(right, (newValue) => {\n\t\twatchers.forEach((w) => w.pause());\n\t\tleft.value = transformRTL(newValue);\n\t\twatchers.forEach((w) => w.resume());\n\t}, {\n\t\tflush,\n\t\tdeep,\n\t\timmediate\n\t}));\n\tconst stop = () => {\n\t\twatchers.forEach((w) => w.stop());\n\t};\n\treturn stop;\n}\n//#endregion\n//#region syncRefs/index.ts\n/**\n* Keep target ref(s) in sync with the source ref\n*\n* @param source source ref\n* @param targets\n*/\nfunction syncRefs(source, targets, options = {}) {\n\tconst { flush = \"sync\", deep = false, immediate = true } = options;\n\tconst targetsArray = toArray(targets);\n\treturn watch(source, (newValue) => targetsArray.forEach((target) => target.value = newValue), {\n\t\tflush,\n\t\tdeep,\n\t\timmediate\n\t});\n}\n//#endregion\n//#region toRefs/index.ts\n/**\n* Extended `toRefs` that also accepts refs of an object.\n*\n* @see https://vueuse.org/toRefs\n* @param objectRef A ref or normal object or array.\n* @param options Options\n*/\nfunction toRefs(objectRef, options = {}) {\n\tif (!isRef(objectRef)) return toRefs$1(objectRef);\n\tconst result = Array.isArray(objectRef.value) ? Array.from({ length: objectRef.value.length }) : {};\n\tfor (const key in objectRef.value) result[key] = customRef(() => ({\n\t\tget() {\n\t\t\treturn objectRef.value[key];\n\t\t},\n\t\tset(v) {\n\t\t\tvar _toValue;\n\t\t\tif ((_toValue = toValue(options.replaceRef)) !== null && _toValue !== void 0 ? _toValue : true) if (Array.isArray(objectRef.value)) {\n\t\t\t\tconst copy = [...objectRef.value];\n\t\t\t\tcopy[key] = v;\n\t\t\t\tobjectRef.value = copy;\n\t\t\t} else {\n\t\t\t\tconst newObject = {\n\t\t\t\t\t...objectRef.value,\n\t\t\t\t\t[key]: v\n\t\t\t\t};\n\t\t\t\tObject.setPrototypeOf(newObject, Object.getPrototypeOf(objectRef.value));\n\t\t\t\tobjectRef.value = newObject;\n\t\t\t}\n\t\t\telse objectRef.value[key] = v;\n\t\t}\n\t}));\n\treturn result;\n}\n//#endregion\n//#region tryOnBeforeMount/index.ts\n/**\n* Call onBeforeMount() if it's inside a component lifecycle, if not, just call the function\n*\n* @param fn\n* @param sync if set to false, it will run in the nextTick() of Vue\n* @param target\n*/\nfunction tryOnBeforeMount(fn, sync = true, target) {\n\tif (getLifeCycleTarget(target)) onBeforeMount(fn, target);\n\telse if (sync) fn();\n\telse nextTick(fn);\n}\n//#endregion\n//#region tryOnBeforeUnmount/index.ts\n/**\n* Call onBeforeUnmount() if it's inside a component lifecycle, if not, do nothing\n*\n* @param fn\n* @param target\n*/\nfunction tryOnBeforeUnmount(fn, target) {\n\tif (getLifeCycleTarget(target)) onBeforeUnmount(fn, target);\n}\n//#endregion\n//#region tryOnMounted/index.ts\n/**\n* Call onMounted() if it's inside a component lifecycle, if not, just call the function\n*\n* @param fn\n* @param sync if set to false, it will run in the nextTick() of Vue\n* @param target\n*/\nfunction tryOnMounted(fn, sync = true, target) {\n\tif (getLifeCycleTarget(target)) onMounted(fn, target);\n\telse if (sync) fn();\n\telse nextTick(fn);\n}\n//#endregion\n//#region tryOnUnmounted/index.ts\n/**\n* Call onUnmounted() if it's inside a component lifecycle, if not, do nothing\n*\n* @param fn\n* @param target\n*/\nfunction tryOnUnmounted(fn, target) {\n\tif (getLifeCycleTarget(target)) onUnmounted(fn, target);\n}\n//#endregion\n//#region until/index.ts\nfunction createUntil(r, isNot = false) {\n\tfunction toMatch(condition, { flush = \"sync\", deep = false, timeout, throwOnTimeout } = {}) {\n\t\tlet stop = null;\n\t\tconst promises = [new Promise((resolve) => {\n\t\t\tstop = watch(r, (v) => {\n\t\t\t\tif (condition(v) !== isNot) {\n\t\t\t\t\tif (stop) stop();\n\t\t\t\t\telse nextTick(() => stop === null || stop === void 0 ? void 0 : stop());\n\t\t\t\t\tresolve(v);\n\t\t\t\t}\n\t\t\t}, {\n\t\t\t\tflush,\n\t\t\t\tdeep,\n\t\t\t\timmediate: true\n\t\t\t});\n\t\t})];\n\t\tif (timeout != null) promises.push(promiseTimeout(timeout, throwOnTimeout).then(() => toValue(r)).finally(() => stop === null || stop === void 0 ? void 0 : stop()));\n\t\treturn Promise.race(promises);\n\t}\n\tfunction toBe(value, options) {\n\t\tif (!isRef(value)) return toMatch((v) => v === value, options);\n\t\tconst { flush = \"sync\", deep = false, timeout, throwOnTimeout } = options !== null && options !== void 0 ? options : {};\n\t\tlet stop = null;\n\t\tconst promises = [new Promise((resolve) => {\n\t\t\tstop = watch([r, value], ([v1, v2]) => {\n\t\t\t\tif (isNot !== (v1 === v2)) {\n\t\t\t\t\tif (stop) stop();\n\t\t\t\t\telse nextTick(() => stop === null || stop === void 0 ? void 0 : stop());\n\t\t\t\t\tresolve(v1);\n\t\t\t\t}\n\t\t\t}, {\n\t\t\t\tflush,\n\t\t\t\tdeep,\n\t\t\t\timmediate: true\n\t\t\t});\n\t\t})];\n\t\tif (timeout != null) promises.push(promiseTimeout(timeout, throwOnTimeout).then(() => toValue(r)).finally(() => {\n\t\t\tstop === null || stop === void 0 || stop();\n\t\t\treturn toValue(r);\n\t\t}));\n\t\treturn Promise.race(promises);\n\t}\n\tfunction toBeTruthy(options) {\n\t\treturn toMatch((v) => Boolean(v), options);\n\t}\n\tfunction toBeNull(options) {\n\t\treturn toBe(null, options);\n\t}\n\tfunction toBeUndefined(options) {\n\t\treturn toBe(void 0, options);\n\t}\n\tfunction toBeNaN(options) {\n\t\treturn toMatch(Number.isNaN, options);\n\t}\n\tfunction toContains(value, options) {\n\t\treturn toMatch((v) => {\n\t\t\tconst array = Array.from(v);\n\t\t\treturn array.includes(value) || array.includes(toValue(value));\n\t\t}, options);\n\t}\n\tfunction changed(options) {\n\t\treturn changedTimes(1, options);\n\t}\n\tfunction changedTimes(n = 1, options) {\n\t\tlet count = -1;\n\t\treturn toMatch(() => {\n\t\t\tcount += 1;\n\t\t\treturn count >= n;\n\t\t}, options);\n\t}\n\tif (Array.isArray(toValue(r))) return {\n\t\ttoMatch,\n\t\ttoContains,\n\t\tchanged,\n\t\tchangedTimes,\n\t\tget not() {\n\t\t\treturn createUntil(r, !isNot);\n\t\t}\n\t};\n\telse return {\n\t\ttoMatch,\n\t\ttoBe,\n\t\ttoBeTruthy,\n\t\ttoBeNull,\n\t\ttoBeNaN,\n\t\ttoBeUndefined,\n\t\tchanged,\n\t\tchangedTimes,\n\t\tget not() {\n\t\t\treturn createUntil(r, !isNot);\n\t\t}\n\t};\n}\nfunction until(r) {\n\treturn createUntil(r);\n}\n//#endregion\n//#region useArrayDifference/index.ts\nfunction defaultComparator(value, othVal) {\n\treturn value === othVal;\n}\n/**\n* Reactive get array difference of two array\n* @see https://vueuse.org/useArrayDifference\n* @returns - the difference of two array\n* @param args\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction useArrayDifference(...args) {\n\tvar _args$, _args$2;\n\tconst list = args[0];\n\tconst values = args[1];\n\tlet compareFn = (_args$ = args[2]) !== null && _args$ !== void 0 ? _args$ : defaultComparator;\n\tconst { symmetric = false } = (_args$2 = args[3]) !== null && _args$2 !== void 0 ? _args$2 : {};\n\tif (typeof compareFn === \"string\") {\n\t\tconst key = compareFn;\n\t\tcompareFn = (value, othVal) => value[key] === othVal[key];\n\t}\n\tconst diff1 = computed(() => toValue(list).filter((x) => toValue(values).findIndex((y) => compareFn(x, y)) === -1));\n\tif (symmetric) {\n\t\tconst diff2 = computed(() => toValue(values).filter((x) => toValue(list).findIndex((y) => compareFn(x, y)) === -1));\n\t\treturn computed(() => symmetric ? [...toValue(diff1), ...toValue(diff2)] : toValue(diff1));\n\t} else return diff1;\n}\n//#endregion\n//#region useArrayEvery/index.ts\n/**\n* Reactive `Array.every`\n*\n* @see https://vueuse.org/useArrayEvery\n* @param list - the array was called upon.\n* @param fn - a function to test each element.\n*\n* @returns **true** if the `fn` function returns a **truthy** value for every element from the array. Otherwise, **false**.\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction useArrayEvery(list, fn) {\n\treturn computed(() => toValue(list).every((element, index, array) => fn(toValue(element), index, array)));\n}\n//#endregion\n//#region useArrayFilter/index.ts\n/**\n* Reactive `Array.filter`\n*\n* @see https://vueuse.org/useArrayFilter\n* @param list - the array was called upon.\n* @param fn - a function that is called for every element of the given `list`. Each time `fn` executes, the returned value is added to the new array.\n*\n* @returns a shallow copy of a portion of the given array, filtered down to just the elements from the given array that pass the test implemented by the provided function. If no elements pass the test, an empty array will be returned.\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction useArrayFilter(list, fn) {\n\treturn computed(() => toValue(list).map((i) => toValue(i)).filter(fn));\n}\n//#endregion\n//#region useArrayFind/index.ts\n/**\n* Reactive `Array.find`\n*\n* @see https://vueuse.org/useArrayFind\n* @param list - the array was called upon.\n* @param fn - a function to test each element.\n*\n* @returns the first element in the array that satisfies the provided testing function. Otherwise, undefined is returned.\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction useArrayFind(list, fn) {\n\treturn computed(() => toValue(toValue(list).find((element, index, array) => fn(toValue(element), index, array))));\n}\n//#endregion\n//#region useArrayFindIndex/index.ts\n/**\n* Reactive `Array.findIndex`\n*\n* @see https://vueuse.org/useArrayFindIndex\n* @param list - the array was called upon.\n* @param fn - a function to test each element.\n*\n* @returns the index of the first element in the array that passes the test. Otherwise, \"-1\".\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction useArrayFindIndex(list, fn) {\n\treturn computed(() => toValue(list).findIndex((element, index, array) => fn(toValue(element), index, array)));\n}\n//#endregion\n//#region useArrayFindLast/index.ts\nfunction findLast(arr, cb) {\n\tlet index = arr.length;\n\twhile (index-- > 0) if (cb(arr[index], index, arr)) return arr[index];\n}\n/**\n* Reactive `Array.findLast`\n*\n* @see https://vueuse.org/useArrayFindLast\n* @param list - the array was called upon.\n* @param fn - a function to test each element.\n*\n* @returns the last element in the array that satisfies the provided testing function. Otherwise, undefined is returned.\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction useArrayFindLast(list, fn) {\n\treturn computed(() => toValue(!Array.prototype.findLast ? findLast(toValue(list), (element, index, array) => fn(toValue(element), index, array)) : toValue(list).findLast((element, index, array) => fn(toValue(element), index, array))));\n}\n//#endregion\n//#region useArrayIncludes/index.ts\nfunction isArrayIncludesOptions(obj) {\n\treturn isObject(obj) && containsProp(obj, \"formIndex\", \"comparator\");\n}\n/**\n* Reactive `Array.includes`\n*\n* @see https://vueuse.org/useArrayIncludes\n*\n* @returns true if the `value` is found in the array. Otherwise, false.\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction useArrayIncludes(...args) {\n\tvar _comparator;\n\tconst list = args[0];\n\tconst value = args[1];\n\tlet comparator = args[2];\n\tlet formIndex = 0;\n\tif (isArrayIncludesOptions(comparator)) {\n\t\tvar _comparator$fromIndex;\n\t\tformIndex = (_comparator$fromIndex = comparator.fromIndex) !== null && _comparator$fromIndex !== void 0 ? _comparator$fromIndex : 0;\n\t\tcomparator = comparator.comparator;\n\t}\n\tif (typeof comparator === \"string\") {\n\t\tconst key = comparator;\n\t\tcomparator = (element, value) => element[key] === toValue(value);\n\t}\n\tcomparator = (_comparator = comparator) !== null && _comparator !== void 0 ? _comparator : ((element, value) => element === toValue(value));\n\treturn computed(() => toValue(list).slice(formIndex).some((element, index, array) => comparator(toValue(element), toValue(value), index, toValue(array))));\n}\n//#endregion\n//#region useArrayJoin/index.ts\n/**\n* Reactive `Array.join`\n*\n* @see https://vueuse.org/useArrayJoin\n* @param list - the array was called upon.\n* @param separator - a string to separate each pair of adjacent elements of the array. If omitted, the array elements are separated with a comma (\",\").\n*\n* @returns a string with all array elements joined. If arr.length is 0, the empty string is returned.\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction useArrayJoin(list, separator) {\n\treturn computed(() => toValue(list).map((i) => toValue(i)).join(toValue(separator)));\n}\n//#endregion\n//#region useArrayMap/index.ts\n/**\n* Reactive `Array.map`\n*\n* @see https://vueuse.org/useArrayMap\n* @param list - the array was called upon.\n* @param fn - a function that is called for every element of the given `list`. Each time `fn` executes, the returned value is added to the new array.\n*\n* @returns a new array with each element being the result of the callback function.\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction useArrayMap(list, fn) {\n\treturn computed(() => toValue(list).map((i) => toValue(i)).map(fn));\n}\n//#endregion\n//#region useArrayReduce/index.ts\n/**\n* Reactive `Array.reduce`\n*\n* @see https://vueuse.org/useArrayReduce\n* @param list - the array was called upon.\n* @param reducer - a \"reducer\" function.\n* @param args\n*\n* @returns the value that results from running the \"reducer\" callback function to completion over the entire array.\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction useArrayReduce(list, reducer, ...args) {\n\tconst reduceCallback = (sum, value, index) => reducer(toValue(sum), toValue(value), index);\n\treturn computed(() => {\n\t\tconst resolved = toValue(list);\n\t\treturn args.length ? resolved.reduce(reduceCallback, typeof args[0] === \"function\" ? toValue(args[0]()) : toValue(args[0])) : resolved.reduce(reduceCallback);\n\t});\n}\n//#endregion\n//#region useArraySome/index.ts\n/**\n* Reactive `Array.some`\n*\n* @see https://vueuse.org/useArraySome\n* @param list - the array was called upon.\n* @param fn - a function to test each element.\n*\n* @returns **true** if the `fn` function returns a **truthy** value for any element from the array. Otherwise, **false**.\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction useArraySome(list, fn) {\n\treturn computed(() => toValue(list).some((element, index, array) => fn(toValue(element), index, array)));\n}\n//#endregion\n//#region useArrayUnique/index.ts\nfunction uniq(array) {\n\treturn Array.from(new Set(array));\n}\nfunction uniqueElementsBy(array, fn) {\n\treturn array.reduce((acc, v) => {\n\t\tif (!acc.some((x) => fn(v, x, array))) acc.push(v);\n\t\treturn acc;\n\t}, []);\n}\n/**\n* reactive unique array\n* @see https://vueuse.org/useArrayUnique\n* @param list - the array was called upon.\n* @param compareFn\n* @returns A computed ref that returns a unique array of items.\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction useArrayUnique(list, compareFn) {\n\treturn computed(() => {\n\t\tconst resolvedList = toValue(list).map((element) => toValue(element));\n\t\treturn compareFn ? uniqueElementsBy(resolvedList, compareFn) : uniq(resolvedList);\n\t});\n}\n//#endregion\n//#region useCounter/index.ts\n/**\n* Basic counter with utility functions.\n*\n* @see https://vueuse.org/useCounter\n* @param [initialValue]\n* @param options\n*/\nfunction useCounter(initialValue = 0, options = {}) {\n\tlet _initialValue = unref(initialValue);\n\tconst count = shallowRef(initialValue);\n\tconst { max = Number.POSITIVE_INFINITY, min = Number.NEGATIVE_INFINITY } = options;\n\tconst inc = (delta = 1) => count.value = Math.max(Math.min(max, count.value + delta), min);\n\tconst dec = (delta = 1) => count.value = Math.min(Math.max(min, count.value - delta), max);\n\tconst get = () => count.value;\n\tconst set = (val) => count.value = Math.max(min, Math.min(max, val));\n\tconst reset = (val = _initialValue) => {\n\t\t_initialValue = val;\n\t\treturn set(val);\n\t};\n\treturn {\n\t\tcount: shallowReadonly(count),\n\t\tinc,\n\t\tdec,\n\t\tget,\n\t\tset,\n\t\treset\n\t};\n}\n//#endregion\n//#region useDateFormat/index.ts\nconst REGEX_PARSE = /^(\\d{4})[-/]?(\\d{1,2})?[-/]?(\\d{0,2})[T\\s]*(\\d{1,2})?:?(\\d{1,2})?:?(\\d{1,2})?[.:]?(\\d+)?$/i;\nconst REGEX_FORMAT = /[YMDHhms]o|\\[([^\\]]+)\\]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a{1,2}|A{1,2}|m{1,2}|s{1,2}|Z{1,2}|z{1,4}|SSS/g;\nfunction defaultMeridiem(hours, minutes, isLowercase, hasPeriod) {\n\tlet m = hours < 12 ? \"AM\" : \"PM\";\n\tif (hasPeriod) m = m.split(\"\").reduce((acc, curr) => acc += `${curr}.`, \"\");\n\treturn isLowercase ? m.toLowerCase() : m;\n}\nfunction formatOrdinal(num) {\n\tconst suffixes = [\n\t\t\"th\",\n\t\t\"st\",\n\t\t\"nd\",\n\t\t\"rd\"\n\t];\n\tconst v = num % 100;\n\treturn num + (suffixes[(v - 20) % 10] || suffixes[v] || suffixes[0]);\n}\nfunction formatDate(date, formatStr, options = {}) {\n\tvar _options$customMeridi;\n\tconst years = date.getFullYear();\n\tconst month = date.getMonth();\n\tconst days = date.getDate();\n\tconst hours = date.getHours();\n\tconst minutes = date.getMinutes();\n\tconst seconds = date.getSeconds();\n\tconst milliseconds = date.getMilliseconds();\n\tconst day = date.getDay();\n\tconst meridiem = (_options$customMeridi = options.customMeridiem) !== null && _options$customMeridi !== void 0 ? _options$customMeridi : defaultMeridiem;\n\tconst stripTimeZone = (dateString) => {\n\t\tvar _dateString$split$;\n\t\treturn (_dateString$split$ = dateString.split(\" \")[1]) !== null && _dateString$split$ !== void 0 ? _dateString$split$ : \"\";\n\t};\n\tconst matches = {\n\t\tYo: () => formatOrdinal(years),\n\t\tYY: () => String(years).slice(-2),\n\t\tYYYY: () => years,\n\t\tM: () => month + 1,\n\t\tMo: () => formatOrdinal(month + 1),\n\t\tMM: () => `${month + 1}`.padStart(2, \"0\"),\n\t\tMMM: () => date.toLocaleDateString(toValue(options.locales), { month: \"short\" }),\n\t\tMMMM: () => date.toLocaleDateString(toValue(options.locales), { month: \"long\" }),\n\t\tD: () => String(days),\n\t\tDo: () => formatOrdinal(days),\n\t\tDD: () => `${days}`.padStart(2, \"0\"),\n\t\tH: () => String(hours),\n\t\tHo: () => formatOrdinal(hours),\n\t\tHH: () => `${hours}`.padStart(2, \"0\"),\n\t\th: () => `${hours % 12 || 12}`.padStart(1, \"0\"),\n\t\tho: () => formatOrdinal(hours % 12 || 12),\n\t\thh: () => `${hours % 12 || 12}`.padStart(2, \"0\"),\n\t\tm: () => String(minutes),\n\t\tmo: () => formatOrdinal(minutes),\n\t\tmm: () => `${minutes}`.padStart(2, \"0\"),\n\t\ts: () => String(seconds),\n\t\tso: () => formatOrdinal(seconds),\n\t\tss: () => `${seconds}`.padStart(2, \"0\"),\n\t\tSSS: () => `${milliseconds}`.padStart(3, \"0\"),\n\t\td: () => day,\n\t\tdd: () => date.toLocaleDateString(toValue(options.locales), { weekday: \"narrow\" }),\n\t\tddd: () => date.toLocaleDateString(toValue(options.locales), { weekday: \"short\" }),\n\t\tdddd: () => date.toLocaleDateString(toValue(options.locales), { weekday: \"long\" }),\n\t\tA: () => meridiem(hours, minutes),\n\t\tAA: () => meridiem(hours, minutes, false, true),\n\t\ta: () => meridiem(hours, minutes, true),\n\t\taa: () => meridiem(hours, minutes, true, true),\n\t\tz: () => stripTimeZone(date.toLocaleDateString(toValue(options.locales), { timeZoneName: \"shortOffset\" })),\n\t\tzz: () => stripTimeZone(date.toLocaleDateString(toValue(options.locales), { timeZoneName: \"shortOffset\" })),\n\t\tzzz: () => stripTimeZone(date.toLocaleDateString(toValue(options.locales), { timeZoneName: \"shortOffset\" })),\n\t\tzzzz: () => stripTimeZone(date.toLocaleDateString(toValue(options.locales), { timeZoneName: \"longOffset\" }))\n\t};\n\treturn formatStr.replace(REGEX_FORMAT, (match, $1) => {\n\t\tvar _ref, _matches$match;\n\t\treturn (_ref = $1 !== null && $1 !== void 0 ? $1 : (_matches$match = matches[match]) === null || _matches$match === void 0 ? void 0 : _matches$match.call(matches)) !== null && _ref !== void 0 ? _ref : match;\n\t});\n}\nfunction normalizeDate(date) {\n\tif (date === null) return /* @__PURE__ */ new Date(NaN);\n\tif (date === void 0) return /* @__PURE__ */ new Date();\n\tif (date instanceof Date) return new Date(date);\n\tif (typeof date === \"string\" && !/Z$/i.test(date)) {\n\t\tconst d = date.match(REGEX_PARSE);\n\t\tif (d) {\n\t\t\tconst m = d[2] - 1 || 0;\n\t\t\tconst ms = (d[7] || \"0\").substring(0, 3);\n\t\t\treturn new Date(d[1], m, d[3] || 1, d[4] || 0, d[5] || 0, d[6] || 0, ms);\n\t\t}\n\t}\n\treturn new Date(date);\n}\n/**\n* Get the formatted date according to the string of tokens passed in.\n*\n* @see https://vueuse.org/useDateFormat\n* @param date - The date to format, can either be a `Date` object, a timestamp, or a string\n* @param formatStr - The combination of tokens to format the date\n* @param options - UseDateFormatOptions\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction useDateFormat(date, formatStr = \"HH:mm:ss\", options = {}) {\n\treturn computed(() => formatDate(normalizeDate(toValue(date)), toValue(formatStr), options));\n}\n//#endregion\n//#region useIntervalFn/index.ts\n/**\n* Wrapper for `setInterval` with controls\n*\n* @see https://vueuse.org/useIntervalFn\n* @param cb\n* @param interval\n* @param options\n*/\nfunction useIntervalFn(cb, interval = 1e3, options = {}) {\n\tconst { immediate = true, immediateCallback = false } = options;\n\tlet timer = null;\n\tconst isActive = shallowRef(false);\n\tfunction clean() {\n\t\tif (timer) {\n\t\t\tclearInterval(timer);\n\t\t\ttimer = null;\n\t\t}\n\t}\n\tfunction pause() {\n\t\tisActive.value = false;\n\t\tclean();\n\t}\n\tfunction resume() {\n\t\tconst intervalValue = toValue(interval);\n\t\tif (intervalValue <= 0) return;\n\t\tisActive.value = true;\n\t\tif (immediateCallback) cb();\n\t\tclean();\n\t\tif (isActive.value) timer = setInterval(cb, intervalValue);\n\t}\n\tif (immediate && isClient) resume();\n\tif (isRef(interval) || typeof interval === \"function\") tryOnScopeDispose(watch(interval, () => {\n\t\tif (isActive.value && isClient) resume();\n\t}));\n\ttryOnScopeDispose(pause);\n\treturn {\n\t\tisActive: shallowReadonly(isActive),\n\t\tpause,\n\t\tresume\n\t};\n}\n//#endregion\n//#region useInterval/index.ts\nfunction useInterval(interval = 1e3, options = {}) {\n\tconst { controls: exposeControls = false, immediate = true, callback } = options;\n\tconst counter = shallowRef(0);\n\tconst update = () => counter.value += 1;\n\tconst reset = () => {\n\t\tcounter.value = 0;\n\t};\n\tconst controls = useIntervalFn(callback ? () => {\n\t\tupdate();\n\t\tcallback(counter.value);\n\t} : update, interval, { immediate });\n\tif (exposeControls) return {\n\t\tcounter: shallowReadonly(counter),\n\t\treset,\n\t\t...controls\n\t};\n\telse return shallowReadonly(counter);\n}\n//#endregion\n//#region useLastChanged/index.ts\nfunction useLastChanged(source, options = {}) {\n\tvar _options$initialValue;\n\tconst ms = shallowRef((_options$initialValue = options.initialValue) !== null && _options$initialValue !== void 0 ? _options$initialValue : null);\n\twatch(source, () => ms.value = timestamp(), options);\n\treturn shallowReadonly(ms);\n}\n//#endregion\n//#region useTimeoutFn/index.ts\n/**\n* Wrapper for `setTimeout` with controls.\n*\n* @param cb\n* @param interval\n* @param options\n*/\nfunction useTimeoutFn(cb, interval, options = {}) {\n\tconst { immediate = true, immediateCallback = false } = options;\n\tconst isPending = shallowRef(false);\n\tlet timer;\n\tfunction clear() {\n\t\tif (timer) {\n\t\t\tclearTimeout(timer);\n\t\t\ttimer = void 0;\n\t\t}\n\t}\n\tfunction stop() {\n\t\tisPending.value = false;\n\t\tclear();\n\t}\n\tfunction start(...args) {\n\t\tif (immediateCallback) cb();\n\t\tclear();\n\t\tisPending.value = true;\n\t\ttimer = setTimeout(() => {\n\t\t\tisPending.value = false;\n\t\t\ttimer = void 0;\n\t\t\tcb(...args);\n\t\t}, toValue(interval));\n\t}\n\tif (immediate) {\n\t\tisPending.value = true;\n\t\tif (isClient) start();\n\t}\n\ttryOnScopeDispose(stop);\n\treturn {\n\t\tisPending: shallowReadonly(isPending),\n\t\tstart,\n\t\tstop\n\t};\n}\n//#endregion\n//#region useTimeout/index.ts\nfunction useTimeout(interval = 1e3, options = {}) {\n\tconst { controls: exposeControls = false, callback } = options;\n\tconst controls = useTimeoutFn(callback !== null && callback !== void 0 ? callback : noop, interval, options);\n\tconst ready = computed(() => !controls.isPending.value);\n\tif (exposeControls) return {\n\t\tready,\n\t\t...controls\n\t};\n\telse return ready;\n}\n//#endregion\n//#region useToNumber/index.ts\n/**\n* Reactively convert a string ref to number.\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction useToNumber(value, options = {}) {\n\tconst { method = \"parseFloat\", radix, nanToZero } = options;\n\treturn computed(() => {\n\t\tlet resolved = toValue(value);\n\t\tif (typeof method === \"function\") resolved = method(resolved);\n\t\telse if (typeof resolved === \"string\") resolved = Number[method](resolved, radix);\n\t\tif (nanToZero && Number.isNaN(resolved)) resolved = 0;\n\t\treturn resolved;\n\t});\n}\n//#endregion\n//#region useToString/index.ts\n/**\n* Reactively convert a ref to string.\n*\n* @see https://vueuse.org/useToString\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction useToString(value) {\n\treturn computed(() => `${toValue(value)}`);\n}\n//#endregion\n//#region useToggle/index.ts\n/**\n* A boolean ref with a toggler\n*\n* @see https://vueuse.org/useToggle\n* @param [initialValue]\n* @param options\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction useToggle(initialValue = false, options = {}) {\n\tconst { truthyValue = true, falsyValue = false } = options;\n\tconst valueIsRef = isRef(initialValue);\n\tconst _value = shallowRef(initialValue);\n\tfunction toggle(value) {\n\t\tif (arguments.length) {\n\t\t\t_value.value = value;\n\t\t\treturn _value.value;\n\t\t} else {\n\t\t\tconst truthy = toValue(truthyValue);\n\t\t\t_value.value = _value.value === truthy ? toValue(falsyValue) : truthy;\n\t\t\treturn _value.value;\n\t\t}\n\t}\n\tif (valueIsRef) return toggle;\n\telse return [_value, toggle];\n}\n//#endregion\n//#region watchArray/index.ts\n/**\n* Watch for an array with additions and removals.\n*\n* @see https://vueuse.org/watchArray\n*/\nfunction watchArray(source, cb, options) {\n\tlet oldList = (options === null || options === void 0 ? void 0 : options.immediate) ? [] : [...typeof source === \"function\" ? source() : Array.isArray(source) ? source : toValue(source)];\n\treturn watch(source, (newList, _, onCleanup) => {\n\t\tconst oldListRemains = Array.from({ length: oldList.length });\n\t\tconst added = [];\n\t\tfor (const obj of newList) {\n\t\t\tlet found = false;\n\t\t\tfor (let i = 0; i < oldList.length; i++) if (!oldListRemains[i] && obj === oldList[i]) {\n\t\t\t\toldListRemains[i] = true;\n\t\t\t\tfound = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (!found) added.push(obj);\n\t\t}\n\t\tconst removed = oldList.filter((_, i) => !oldListRemains[i]);\n\t\tcb(newList, oldList, added, removed, onCleanup);\n\t\toldList = [...newList];\n\t}, options);\n}\n//#endregion\n//#region watchAtMost/index.ts\nfunction watchAtMost(source, cb, options) {\n\tconst { count, ...watchOptions } = options;\n\tconst current = shallowRef(0);\n\tconst { stop, resume, pause } = watchWithFilter(source, (...args) => {\n\t\tcurrent.value += 1;\n\t\tif (current.value >= toValue(count)) nextTick(() => stop());\n\t\tcb(...args);\n\t}, watchOptions);\n\treturn {\n\t\tcount: current,\n\t\tstop,\n\t\tresume,\n\t\tpause\n\t};\n}\n//#endregion\n//#region watchDebounced/index.ts\nfunction watchDebounced(source, cb, options = {}) {\n\tconst { debounce = 0, maxWait = void 0, ...watchOptions } = options;\n\treturn watchWithFilter(source, cb, {\n\t\t...watchOptions,\n\t\teventFilter: debounceFilter(debounce, { maxWait })\n\t});\n}\n/** @deprecated use `watchDebounced` instead */\nconst debouncedWatch = watchDebounced;\n//#endregion\n//#region watchDeep/index.ts\n/**\n* Shorthand for watching value with {deep: true}\n*\n* @see https://vueuse.org/watchDeep\n*/\nfunction watchDeep(source, cb, options) {\n\treturn watch(source, cb, {\n\t\t...options,\n\t\tdeep: true\n\t});\n}\n//#endregion\n//#region watchIgnorable/index.ts\nfunction watchIgnorable(source, cb, options = {}) {\n\tconst { eventFilter = bypassFilter, ...watchOptions } = options;\n\tconst filteredCb = createFilterWrapper(eventFilter, cb);\n\tlet ignoreUpdates;\n\tlet ignorePrevAsyncUpdates;\n\tlet stop;\n\tif (watchOptions.flush === \"sync\") {\n\t\tlet ignore = false;\n\t\tignorePrevAsyncUpdates = () => {};\n\t\tignoreUpdates = (updater) => {\n\t\t\tignore = true;\n\t\t\tupdater();\n\t\t\tignore = false;\n\t\t};\n\t\tstop = watch(source, (...args) => {\n\t\t\tif (!ignore) filteredCb(...args);\n\t\t}, watchOptions);\n\t} else {\n\t\tconst disposables = [];\n\t\tlet ignoreCounter = 0;\n\t\tlet syncCounter = 0;\n\t\tignorePrevAsyncUpdates = () => {\n\t\t\tignoreCounter = syncCounter;\n\t\t};\n\t\tdisposables.push(watch(source, () => {\n\t\t\tsyncCounter++;\n\t\t}, {\n\t\t\t...watchOptions,\n\t\t\tflush: \"sync\"\n\t\t}));\n\t\tignoreUpdates = (updater) => {\n\t\t\tconst syncCounterPrev = syncCounter;\n\t\t\tupdater();\n\t\t\tignoreCounter += syncCounter - syncCounterPrev;\n\t\t};\n\t\tdisposables.push(watch(source, (...args) => {\n\t\t\tconst ignore = ignoreCounter > 0 && ignoreCounter === syncCounter;\n\t\t\tignoreCounter = 0;\n\t\t\tsyncCounter = 0;\n\t\t\tif (ignore) return;\n\t\t\tfilteredCb(...args);\n\t\t}, watchOptions));\n\t\tstop = () => {\n\t\t\tdisposables.forEach((fn) => fn());\n\t\t};\n\t}\n\treturn {\n\t\tstop,\n\t\tignoreUpdates,\n\t\tignorePrevAsyncUpdates\n\t};\n}\n/** @deprecated use `watchIgnorable` instead */\nconst ignorableWatch = watchIgnorable;\n//#endregion\n//#region watchImmediate/index.ts\n/**\n* Shorthand for watching value with {immediate: true}\n*\n* @see https://vueuse.org/watchImmediate\n*/\nfunction watchImmediate(source, cb, options) {\n\treturn watch(source, cb, {\n\t\t...options,\n\t\timmediate: true\n\t});\n}\n//#endregion\n//#region watchOnce/index.ts\n/**\n* Shorthand for watching value with { once: true }\n*\n* @see https://vueuse.org/watchOnce\n*/\nfunction watchOnce(source, cb, options) {\n\treturn watch(source, cb, {\n\t\t...options,\n\t\tonce: true\n\t});\n}\n//#endregion\n//#region watchThrottled/index.ts\nfunction watchThrottled(source, cb, options = {}) {\n\tconst { throttle = 0, trailing = true, leading = true, ...watchOptions } = options;\n\treturn watchWithFilter(source, cb, {\n\t\t...watchOptions,\n\t\teventFilter: throttleFilter(throttle, trailing, leading)\n\t});\n}\n/** @deprecated use `watchThrottled` instead */\nconst throttledWatch = watchThrottled;\n//#endregion\n//#region watchTriggerable/index.ts\nfunction watchTriggerable(source, cb, options = {}) {\n\tlet cleanupFn;\n\tfunction onEffect() {\n\t\tif (!cleanupFn) return;\n\t\tconst fn = cleanupFn;\n\t\tcleanupFn = void 0;\n\t\tfn();\n\t}\n\t/** Register the function `cleanupFn` */\n\tfunction onCleanup(callback) {\n\t\tcleanupFn = callback;\n\t}\n\tconst _cb = (value, oldValue) => {\n\t\tonEffect();\n\t\treturn cb(value, oldValue, onCleanup);\n\t};\n\tconst res = watchIgnorable(source, _cb, options);\n\tconst { ignoreUpdates } = res;\n\tconst trigger = () => {\n\t\tlet res;\n\t\tignoreUpdates(() => {\n\t\t\tres = _cb(getWatchSources(source), getOldValue(source));\n\t\t});\n\t\treturn res;\n\t};\n\treturn {\n\t\t...res,\n\t\ttrigger\n\t};\n}\nfunction getWatchSources(sources) {\n\tif (isReactive(sources)) return sources;\n\tif (Array.isArray(sources)) return sources.map((item) => toValue(item));\n\treturn toValue(sources);\n}\nfunction getOldValue(source) {\n\treturn Array.isArray(source) ? source.map(() => void 0) : void 0;\n}\n//#endregion\n//#region whenever/index.ts\nfunction whenever(source, cb, options) {\n\tconst stop = watch(source, (v, ov, onInvalidate) => {\n\t\tif (v) {\n\t\t\tif (options === null || options === void 0 ? void 0 : options.once) nextTick(() => stop());\n\t\t\tcb(v, ov, onInvalidate);\n\t\t}\n\t}, {\n\t\t...options,\n\t\tonce: false\n\t});\n\treturn stop;\n}\n//#endregion\nexport { assert, autoResetRef, bypassFilter, camelize, clamp, computedEager, computedWithControl, containsProp, controlledComputed, controlledRef, createDisposableDirective, createEventHook, createFilterWrapper, createGlobalState, createInjectionState, createReactiveFn, createRef, createSharedComposable, createSingletonPromise, debounceFilter, debouncedRef, debouncedWatch, eagerComputed, extendRef, formatDate, get, getLifeCycleTarget, hasOwn, hyphenate, identity, ignorableWatch, increaseWithUnit, injectLocal, invoke, isClient, isDef, isDefined, isIOS, isObject, isWorker, makeDestructurable, noop, normalizeDate, notNullish, now, objectEntries, objectOmit, objectPick, pausableFilter, pausableWatch, promiseTimeout, provideLocal, pxValue, rand, reactify, reactifyObject, reactiveComputed, reactiveOmit, reactivePick, refAutoReset, refDebounced, refDefault, refManualReset, refThrottled, refWithControl, set, syncRef, syncRefs, throttleFilter, throttledRef, throttledWatch, timestamp, toArray, toReactive, toRef, toRefs, tryOnBeforeMount, tryOnBeforeUnmount, tryOnMounted, tryOnScopeDispose, tryOnUnmounted, until, useArrayDifference, useArrayEvery, useArrayFilter, useArrayFind, useArrayFindIndex, useArrayFindLast, useArrayIncludes, useArrayJoin, useArrayMap, useArrayReduce, useArraySome, useArrayUnique, useCounter, useDateFormat, useDebounce, useDebounceFn, useInterval, useIntervalFn, useLastChanged, useThrottle, useThrottleFn, useTimeout, useTimeoutFn, useToNumber, useToString, useToggle, watchArray, watchAtMost, watchDebounced, watchDeep, watchIgnorable, watchImmediate, watchOnce, watchPausable, watchThrottled, watchTriggerable, watchWithFilter, whenever };\n","import { bypassFilter, camelize, clamp, computedWithControl, containsProp, createEventHook, createFilterWrapper, createRef, createSingletonPromise, debounceFilter, hasOwn, identity, increaseWithUnit, injectLocal, isClient, isDef, isIOS, isObject, isWorker, makeDestructurable, noop, notNullish, objectEntries, objectOmit, objectPick, pausableFilter, promiseTimeout, provideLocal, pxValue, syncRef, throttleFilter, timestamp, toArray, toRef, toRefs, tryOnMounted, tryOnScopeDispose, tryOnUnmounted, until, useDebounceFn, useIntervalFn, useThrottleFn, useTimeoutFn, watchIgnorable, watchImmediate, watchOnce, watchPausable, watchWithFilter, whenever } from \"@vueuse/shared\";\nimport { Fragment, TransitionGroup, computed, customRef, defineComponent, getCurrentInstance, getCurrentScope, h, hasInjectionContext, inject, isReadonly, isRef, markRaw, nextTick, onBeforeUpdate, onMounted, onUpdated, reactive, readonly, ref, shallowReactive, shallowReadonly, shallowRef, toRaw, toValue, unref, watch, watchEffect } from \"vue\";\nexport * from \"@vueuse/shared\";\n//#region computedAsync/index.ts\nfunction computedAsync(evaluationCallback, initialState, optionsOrRef) {\n\tvar _globalThis$reportErr;\n\tlet options;\n\tif (isRef(optionsOrRef)) options = { evaluating: optionsOrRef };\n\telse options = optionsOrRef || {};\n\tconst { lazy = false, flush = \"sync\", evaluating = void 0, shallow = true, onError = (_globalThis$reportErr = globalThis.reportError) !== null && _globalThis$reportErr !== void 0 ? _globalThis$reportErr : noop } = options;\n\tconst started = shallowRef(!lazy);\n\tconst current = shallow ? shallowRef(initialState) : ref(initialState);\n\tlet counter = 0;\n\twatchEffect(async (onInvalidate) => {\n\t\tif (!started.value) return;\n\t\tcounter++;\n\t\tconst counterAtBeginning = counter;\n\t\tlet hasFinished = false;\n\t\tif (evaluating) Promise.resolve().then(() => {\n\t\t\tevaluating.value = true;\n\t\t});\n\t\ttry {\n\t\t\tconst result = await evaluationCallback((cancelCallback) => {\n\t\t\t\tonInvalidate(() => {\n\t\t\t\t\tif (evaluating) evaluating.value = false;\n\t\t\t\t\tif (!hasFinished) cancelCallback();\n\t\t\t\t});\n\t\t\t});\n\t\t\tif (counterAtBeginning === counter) current.value = result;\n\t\t} catch (e) {\n\t\t\tonError(e);\n\t\t} finally {\n\t\t\tif (evaluating && counterAtBeginning === counter) evaluating.value = false;\n\t\t\thasFinished = true;\n\t\t}\n\t}, { flush });\n\tif (lazy) return computed(() => {\n\t\tstarted.value = true;\n\t\treturn current.value;\n\t});\n\telse return current;\n}\n/** @deprecated use `computedAsync` instead */\nconst asyncComputed = computedAsync;\n//#endregion\n//#region computedInject/index.ts\nfunction computedInject(key, options, defaultSource, treatDefaultAsFactory) {\n\tlet source = inject(key);\n\tif (defaultSource) source = inject(key, defaultSource);\n\tif (treatDefaultAsFactory) source = inject(key, defaultSource, treatDefaultAsFactory);\n\tif (typeof options === \"function\") return computed((oldValue) => options(source, oldValue));\n\telse return computed({\n\t\tget: (oldValue) => options.get(source, oldValue),\n\t\tset: options.set\n\t});\n}\n//#endregion\n//#region createReusableTemplate/index.ts\n/**\n* This function creates `define` and `reuse` components in pair,\n* It also allow to pass a generic to bind with type.\n*\n* @see https://vueuse.org/createReusableTemplate\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction createReusableTemplate(options = {}) {\n\tconst { inheritAttrs = true, name = \"ReusableTemplate\" } = options;\n\tconst render = shallowRef();\n\tconst define = defineComponent({\n\t\tname: `${name}.define`,\n\t\tsetup(_, { slots }) {\n\t\t\treturn () => {\n\t\t\t\trender.value = slots.default;\n\t\t\t};\n\t\t}\n\t});\n\tconst reuse = defineComponent({\n\t\tinheritAttrs,\n\t\tname: `${name}.reuse`,\n\t\tprops: options.props,\n\t\tsetup(props, { attrs, slots }) {\n\t\t\treturn () => {\n\t\t\t\tvar _render$value;\n\t\t\t\tif (!render.value && true) throw new Error(\"[VueUse] Failed to find the definition of reusable template\");\n\t\t\t\tconst vnode = (_render$value = render.value) === null || _render$value === void 0 ? void 0 : _render$value.call(render, {\n\t\t\t\t\t...options.props == null ? keysToCamelKebabCase(attrs) : props,\n\t\t\t\t\t$slots: slots\n\t\t\t\t});\n\t\t\t\treturn inheritAttrs && (vnode === null || vnode === void 0 ? void 0 : vnode.length) === 1 ? vnode[0] : vnode;\n\t\t\t};\n\t\t}\n\t});\n\treturn makeDestructurable({\n\t\tdefine,\n\t\treuse\n\t}, [define, reuse]);\n}\nfunction keysToCamelKebabCase(obj) {\n\tconst newObj = {};\n\tfor (const key in obj) newObj[camelize(key)] = obj[key];\n\treturn newObj;\n}\n//#endregion\n//#region createTemplatePromise/index.ts\n/**\n* Creates a template promise component.\n*\n* @see https://vueuse.org/createTemplatePromise\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction createTemplatePromise(options = {}) {\n\tlet index = 0;\n\tconst instances = ref([]);\n\tfunction create(...args) {\n\t\tconst props = shallowReactive({\n\t\t\tkey: index++,\n\t\t\targs,\n\t\t\tpromise: void 0,\n\t\t\tresolve: () => {},\n\t\t\treject: () => {},\n\t\t\tisResolving: false,\n\t\t\toptions\n\t\t});\n\t\tinstances.value.push(props);\n\t\tprops.promise = new Promise((_resolve, _reject) => {\n\t\t\tprops.resolve = (v) => {\n\t\t\t\tprops.isResolving = true;\n\t\t\t\treturn _resolve(v);\n\t\t\t};\n\t\t\tprops.reject = _reject;\n\t\t}).finally(() => {\n\t\t\tprops.promise = void 0;\n\t\t\tconst index = instances.value.indexOf(props);\n\t\t\tif (index !== -1) instances.value.splice(index, 1);\n\t\t});\n\t\treturn props.promise;\n\t}\n\tfunction start(...args) {\n\t\tif (options.singleton && instances.value.length > 0) return instances.value[0].promise;\n\t\treturn create(...args);\n\t}\n\tconst component = defineComponent((_, { slots }) => {\n\t\tconst renderList = () => instances.value.map((props) => {\n\t\t\tvar _slots$default;\n\t\t\treturn h(Fragment, { key: props.key }, (_slots$default = slots.default) === null || _slots$default === void 0 ? void 0 : _slots$default.call(slots, props));\n\t\t});\n\t\tif (options.transition) return () => h(TransitionGroup, options.transition, renderList);\n\t\treturn renderList;\n\t});\n\tcomponent.start = start;\n\treturn component;\n}\n//#endregion\n//#region createUnrefFn/index.ts\n/**\n* Make a plain function accepting ref and raw values as arguments.\n* Returns the same value the unconverted function returns, with proper typing.\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction createUnrefFn(fn) {\n\treturn function(...args) {\n\t\treturn fn.apply(this, args.map((i) => toValue(i)));\n\t};\n}\n//#endregion\n//#region _configurable.ts\nconst defaultWindow = isClient ? window : void 0;\nconst defaultDocument = isClient ? window.document : void 0;\nconst defaultNavigator = isClient ? window.navigator : void 0;\nconst defaultLocation = isClient ? window.location : void 0;\n//#endregion\n//#region unrefElement/index.ts\n/**\n* Get the dom element of a ref of element or Vue component instance\n*\n* @param elRef\n*/\nfunction unrefElement(elRef) {\n\tvar _$el;\n\tconst plain = toValue(elRef);\n\treturn (_$el = plain === null || plain === void 0 ? void 0 : plain.$el) !== null && _$el !== void 0 ? _$el : plain;\n}\n//#endregion\n//#region useEventListener/index.ts\nfunction useEventListener(...args) {\n\tconst register = (el, event, listener, options) => {\n\t\tel.addEventListener(event, listener, options);\n\t\treturn () => el.removeEventListener(event, listener, options);\n\t};\n\tconst firstParamTargets = computed(() => {\n\t\tconst test = toArray(toValue(args[0])).filter((e) => e != null);\n\t\treturn test.every((e) => typeof e !== \"string\") ? test : void 0;\n\t});\n\treturn watchImmediate(() => {\n\t\tvar _firstParamTargets$va, _firstParamTargets$va2;\n\t\treturn [\n\t\t\t(_firstParamTargets$va = (_firstParamTargets$va2 = firstParamTargets.value) === null || _firstParamTargets$va2 === void 0 ? void 0 : _firstParamTargets$va2.map((e) => unrefElement(e))) !== null && _firstParamTargets$va !== void 0 ? _firstParamTargets$va : [defaultWindow].filter((e) => e != null),\n\t\t\ttoArray(toValue(firstParamTargets.value ? args[1] : args[0])),\n\t\t\ttoArray(unref(firstParamTargets.value ? args[2] : args[1])),\n\t\t\ttoValue(firstParamTargets.value ? args[3] : args[2])\n\t\t];\n\t}, ([raw_targets, raw_events, raw_listeners, raw_options], _, onCleanup) => {\n\t\tif (!(raw_targets === null || raw_targets === void 0 ? void 0 : raw_targets.length) || !(raw_events === null || raw_events === void 0 ? void 0 : raw_events.length) || !(raw_listeners === null || raw_listeners === void 0 ? void 0 : raw_listeners.length)) return;\n\t\tconst optionsClone = isObject(raw_options) ? { ...raw_options } : raw_options;\n\t\tconst cleanups = raw_targets.flatMap((el) => raw_events.flatMap((event) => raw_listeners.map((listener) => register(el, event, listener, optionsClone))));\n\t\tonCleanup(() => {\n\t\t\tcleanups.forEach((fn) => fn());\n\t\t});\n\t}, { flush: \"post\" });\n}\n//#endregion\n//#region onClickOutside/index.ts\nlet _iOSWorkaround = false;\nfunction onClickOutside(target, handler, options = {}) {\n\tconst { window = defaultWindow, ignore = [], capture = true, detectIframe = false, controls = false } = options;\n\tif (!window) return controls ? {\n\t\tstop: noop,\n\t\tcancel: noop,\n\t\ttrigger: noop\n\t} : noop;\n\tif (isIOS && !_iOSWorkaround) {\n\t\t_iOSWorkaround = true;\n\t\tconst listenerOptions = { passive: true };\n\t\tArray.from(window.document.body.children).forEach((el) => el.addEventListener(\"click\", noop, listenerOptions));\n\t\twindow.document.documentElement.addEventListener(\"click\", noop, listenerOptions);\n\t}\n\tlet shouldListen = true;\n\tconst shouldIgnore = (event) => {\n\t\treturn toValue(ignore).some((target) => {\n\t\t\tif (typeof target === \"string\") return Array.from(window.document.querySelectorAll(target)).some((el) => el === event.target || event.composedPath().includes(el));\n\t\t\telse {\n\t\t\t\tconst el = unrefElement(target);\n\t\t\t\treturn el && (event.target === el || event.composedPath().includes(el));\n\t\t\t}\n\t\t});\n\t};\n\t/**\n\t* Determines if the given target has multiple root elements.\n\t* Referenced from: https://github.com/vuejs/test-utils/blob/ccb460be55f9f6be05ab708500a41ec8adf6f4bc/src/vue-wrapper.ts#L21\n\t*/\n\tfunction hasMultipleRoots(target) {\n\t\tconst vm = toValue(target);\n\t\treturn vm && vm.$.subTree.shapeFlag === 16;\n\t}\n\tfunction checkMultipleRoots(target, event) {\n\t\tconst vm = toValue(target);\n\t\tconst children = vm.$.subTree && vm.$.subTree.children;\n\t\tif (children == null || !Array.isArray(children)) return false;\n\t\treturn children.some((child) => child.el === event.target || event.composedPath().includes(child.el));\n\t}\n\tconst listener = (event) => {\n\t\tconst el = unrefElement(target);\n\t\tif (event.target == null) return;\n\t\tif (!(el instanceof Element) && hasMultipleRoots(target) && checkMultipleRoots(target, event)) return;\n\t\tif (!el || el === event.target || event.composedPath().includes(el)) return;\n\t\tif (\"detail\" in event && event.detail === 0) shouldListen = !shouldIgnore(event);\n\t\tif (!shouldListen) {\n\t\t\tshouldListen = true;\n\t\t\treturn;\n\t\t}\n\t\thandler(event);\n\t};\n\tlet isProcessingClick = false;\n\tconst cleanup = [\n\t\tuseEventListener(window, \"click\", (event) => {\n\t\t\tif (!isProcessingClick) {\n\t\t\t\tisProcessingClick = true;\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tisProcessingClick = false;\n\t\t\t\t}, 0);\n\t\t\t\tlistener(event);\n\t\t\t}\n\t\t}, {\n\t\t\tpassive: true,\n\t\t\tcapture\n\t\t}),\n\t\tuseEventListener(window, \"pointerdown\", (e) => {\n\t\t\tconst el = unrefElement(target);\n\t\t\tshouldListen = !shouldIgnore(e) && !!(el && !e.composedPath().includes(el));\n\t\t}, { passive: true }),\n\t\tdetectIframe && useEventListener(window, \"blur\", (event) => {\n\t\t\tsetTimeout(() => {\n\t\t\t\tconst el = unrefElement(target);\n\t\t\t\tlet activeEl = window.document.activeElement;\n\t\t\t\twhile (activeEl === null || activeEl === void 0 ? void 0 : activeEl.shadowRoot) activeEl = activeEl.shadowRoot.activeElement;\n\t\t\t\tif ((activeEl === null || activeEl === void 0 ? void 0 : activeEl.tagName) === \"IFRAME\" && !(el === null || el === void 0 ? void 0 : el.contains(window.document.activeElement))) handler(event);\n\t\t\t}, 0);\n\t\t}, { passive: true })\n\t].filter(Boolean);\n\tconst stop = () => cleanup.forEach((fn) => fn());\n\tif (controls) return {\n\t\tstop,\n\t\tcancel: () => {\n\t\t\tshouldListen = false;\n\t\t},\n\t\ttrigger: (event) => {\n\t\t\tshouldListen = true;\n\t\t\tlistener(event);\n\t\t\tshouldListen = false;\n\t\t}\n\t};\n\treturn stop;\n}\n//#endregion\n//#region useMounted/index.ts\n/**\n* Mounted state in ref.\n*\n* @see https://vueuse.org/useMounted\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction useMounted() {\n\tconst isMounted = shallowRef(false);\n\tconst instance = getCurrentInstance();\n\tif (instance) onMounted(() => {\n\t\tisMounted.value = true;\n\t}, instance);\n\treturn isMounted;\n}\n//#endregion\n//#region useSupported/index.ts\n/* @__NO_SIDE_EFFECTS__ */\nfunction useSupported(callback) {\n\tconst isMounted = useMounted();\n\treturn computed(() => {\n\t\tisMounted.value;\n\t\treturn Boolean(callback());\n\t});\n}\n//#endregion\n//#region useMutationObserver/index.ts\n/**\n* Watch for changes being made to the DOM tree.\n*\n* @see https://vueuse.org/useMutationObserver\n* @see https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver MutationObserver MDN\n* @param target\n* @param callback\n* @param options\n*/\nfunction useMutationObserver(target, callback, options = {}) {\n\tconst { window = defaultWindow, ...mutationOptions } = options;\n\tlet observer;\n\tconst isSupported = /* @__PURE__ */ useSupported(() => window && \"MutationObserver\" in window);\n\tconst cleanup = () => {\n\t\tif (observer) {\n\t\t\tobserver.disconnect();\n\t\t\tobserver = void 0;\n\t\t}\n\t};\n\tconst stopWatch = watch(computed(() => {\n\t\tconst items = toArray(toValue(target)).map(unrefElement).filter(notNullish);\n\t\treturn new Set(items);\n\t}), (newTargets) => {\n\t\tcleanup();\n\t\tif (isSupported.value && newTargets.size) {\n\t\t\tobserver = new MutationObserver(callback);\n\t\t\tnewTargets.forEach((el) => observer.observe(el, mutationOptions));\n\t\t}\n\t}, {\n\t\timmediate: true,\n\t\tflush: \"post\"\n\t});\n\tconst takeRecords = () => {\n\t\treturn observer === null || observer === void 0 ? void 0 : observer.takeRecords();\n\t};\n\tconst stop = () => {\n\t\tstopWatch();\n\t\tcleanup();\n\t};\n\ttryOnScopeDispose(stop);\n\treturn {\n\t\tisSupported,\n\t\tstop,\n\t\ttakeRecords\n\t};\n}\n//#endregion\n//#region onElementRemoval/index.ts\n/**\n* Fires when the element or any element containing it is removed.\n*\n* @param target\n* @param callback\n* @param options\n*/\nfunction onElementRemoval(target, callback, options = {}) {\n\tconst { window = defaultWindow, document = window === null || window === void 0 ? void 0 : window.document, flush = \"sync\" } = options;\n\tif (!window || !document) return noop;\n\tlet stopFn;\n\tconst cleanupAndUpdate = (fn) => {\n\t\tstopFn === null || stopFn === void 0 || stopFn();\n\t\tstopFn = fn;\n\t};\n\tconst stopWatch = watchEffect(() => {\n\t\tconst el = unrefElement(target);\n\t\tif (el) {\n\t\t\tconst { stop } = useMutationObserver(document, (mutationsList) => {\n\t\t\t\tif (mutationsList.map((mutation) => [...mutation.removedNodes]).flat().some((node) => node === el || node.contains(el))) callback(mutationsList);\n\t\t\t}, {\n\t\t\t\twindow,\n\t\t\t\tchildList: true,\n\t\t\t\tsubtree: true\n\t\t\t});\n\t\t\tcleanupAndUpdate(stop);\n\t\t}\n\t}, { flush });\n\tconst stopHandle = () => {\n\t\tstopWatch();\n\t\tcleanupAndUpdate();\n\t};\n\ttryOnScopeDispose(stopHandle);\n\treturn stopHandle;\n}\n//#endregion\n//#region onKeyStroke/index.ts\nfunction createKeyPredicate(keyFilter) {\n\tif (typeof keyFilter === \"function\") return keyFilter;\n\telse if (typeof keyFilter === \"string\") return (event) => event.key === keyFilter;\n\telse if (Array.isArray(keyFilter)) return (event) => keyFilter.includes(event.key);\n\treturn () => true;\n}\nfunction onKeyStroke(...args) {\n\tlet key;\n\tlet handler;\n\tlet options = {};\n\tif (args.length === 3) {\n\t\tkey = args[0];\n\t\thandler = args[1];\n\t\toptions = args[2];\n\t} else if (args.length === 2) if (typeof args[1] === \"object\") {\n\t\tkey = true;\n\t\thandler = args[0];\n\t\toptions = args[1];\n\t} else {\n\t\tkey = args[0];\n\t\thandler = args[1];\n\t}\n\telse {\n\t\tkey = true;\n\t\thandler = args[0];\n\t}\n\tconst { target = defaultWindow, eventName = \"keydown\", passive = false, dedupe = false } = options;\n\tconst predicate = createKeyPredicate(key);\n\tconst listener = (e) => {\n\t\tif (e.repeat && toValue(dedupe)) return;\n\t\tif (predicate(e)) handler(e);\n\t};\n\treturn useEventListener(target, eventName, listener, passive);\n}\n/**\n* Listen to the keydown event of the given key.\n*\n* @see https://vueuse.org/onKeyStroke\n* @param key\n* @param handler\n* @param options\n*/\nfunction onKeyDown(key, handler, options = {}) {\n\treturn onKeyStroke(key, handler, {\n\t\t...options,\n\t\teventName: \"keydown\"\n\t});\n}\n/**\n* Listen to the keypress event of the given key.\n*\n* @see https://vueuse.org/onKeyStroke\n* @param key\n* @param handler\n* @param options\n*/\nfunction onKeyPressed(key, handler, options = {}) {\n\treturn onKeyStroke(key, handler, {\n\t\t...options,\n\t\teventName: \"keypress\"\n\t});\n}\n/**\n* Listen to the keyup event of the given key.\n*\n* @see https://vueuse.org/onKeyStroke\n* @param key\n* @param handler\n* @param options\n*/\nfunction onKeyUp(key, handler, options = {}) {\n\treturn onKeyStroke(key, handler, {\n\t\t...options,\n\t\teventName: \"keyup\"\n\t});\n}\n//#endregion\n//#region onLongPress/index.ts\nconst DEFAULT_DELAY = 500;\nconst DEFAULT_THRESHOLD = 10;\nfunction onLongPress(target, handler, options) {\n\tvar _options$modifiers10, _options$modifiers11;\n\tconst elementRef = computed(() => unrefElement(target));\n\tlet timeout;\n\tlet posStart;\n\tlet startTimestamp;\n\tlet hasLongPressed = false;\n\tfunction clear() {\n\t\tif (timeout) {\n\t\t\tclearTimeout(timeout);\n\t\t\ttimeout = void 0;\n\t\t}\n\t\tposStart = void 0;\n\t\tstartTimestamp = void 0;\n\t\thasLongPressed = false;\n\t}\n\tfunction getDelay(ev) {\n\t\tconst delay = options === null || options === void 0 ? void 0 : options.delay;\n\t\tif (typeof delay === \"function\") return delay(ev);\n\t\treturn delay !== null && delay !== void 0 ? delay : DEFAULT_DELAY;\n\t}\n\tfunction onRelease(ev) {\n\t\tvar _options$modifiers, _options$modifiers2, _options$modifiers3;\n\t\tconst [_startTimestamp, _posStart, _hasLongPressed] = [\n\t\t\tstartTimestamp,\n\t\t\tposStart,\n\t\t\thasLongPressed\n\t\t];\n\t\tclear();\n\t\tif (!(options === null || options === void 0 ? void 0 : options.onMouseUp) || !_posStart || !_startTimestamp) return;\n\t\tif ((options === null || options === void 0 || (_options$modifiers = options.modifiers) === null || _options$modifiers === void 0 ? void 0 : _options$modifiers.self) && ev.target !== elementRef.value) return;\n\t\tif (options === null || options === void 0 || (_options$modifiers2 = options.modifiers) === null || _options$modifiers2 === void 0 ? void 0 : _options$modifiers2.prevent) ev.preventDefault();\n\t\tif (options === null || options === void 0 || (_options$modifiers3 = options.modifiers) === null || _options$modifiers3 === void 0 ? void 0 : _options$modifiers3.stop) ev.stopPropagation();\n\t\tconst dx = ev.x - _posStart.x;\n\t\tconst dy = ev.y - _posStart.y;\n\t\tconst distance = Math.sqrt(dx * dx + dy * dy);\n\t\toptions.onMouseUp(ev.timeStamp - _startTimestamp, distance, _hasLongPressed, ev);\n\t}\n\tfunction onDown(ev) {\n\t\tvar _options$modifiers4, _options$modifiers5, _options$modifiers6;\n\t\tif ((options === null || options === void 0 || (_options$modifiers4 = options.modifiers) === null || _options$modifiers4 === void 0 ? void 0 : _options$modifiers4.self) && ev.target !== elementRef.value) return;\n\t\tclear();\n\t\tif (options === null || options === void 0 || (_options$modifiers5 = options.modifiers) === null || _options$modifiers5 === void 0 ? void 0 : _options$modifiers5.prevent) ev.preventDefault();\n\t\tif (options === null || options === void 0 || (_options$modifiers6 = options.modifiers) === null || _options$modifiers6 === void 0 ? void 0 : _options$modifiers6.stop) ev.stopPropagation();\n\t\tposStart = {\n\t\t\tx: ev.x,\n\t\t\ty: ev.y\n\t\t};\n\t\tstartTimestamp = ev.timeStamp;\n\t\ttimeout = setTimeout(() => {\n\t\t\thasLongPressed = true;\n\t\t\thandler(ev);\n\t\t}, getDelay(ev));\n\t}\n\tfunction onMove(ev) {\n\t\tvar _options$modifiers7, _options$modifiers8, _options$modifiers9, _options$distanceThre;\n\t\tif ((options === null || options === void 0 || (_options$modifiers7 = options.modifiers) === null || _options$modifiers7 === void 0 ? void 0 : _options$modifiers7.self) && ev.target !== elementRef.value) return;\n\t\tif (!posStart || (options === null || options === void 0 ? void 0 : options.distanceThreshold) === false) return;\n\t\tif (options === null || options === void 0 || (_options$modifiers8 = options.modifiers) === null || _options$modifiers8 === void 0 ? void 0 : _options$modifiers8.prevent) ev.preventDefault();\n\t\tif (options === null || options === void 0 || (_options$modifiers9 = options.modifiers) === null || _options$modifiers9 === void 0 ? void 0 : _options$modifiers9.stop) ev.stopPropagation();\n\t\tconst dx = ev.x - posStart.x;\n\t\tconst dy = ev.y - posStart.y;\n\t\tif (Math.sqrt(dx * dx + dy * dy) >= ((_options$distanceThre = options === null || options === void 0 ? void 0 : options.distanceThreshold) !== null && _options$distanceThre !== void 0 ? _options$distanceThre : DEFAULT_THRESHOLD)) clear();\n\t}\n\tconst listenerOptions = {\n\t\tcapture: options === null || options === void 0 || (_options$modifiers10 = options.modifiers) === null || _options$modifiers10 === void 0 ? void 0 : _options$modifiers10.capture,\n\t\tonce: options === null || options === void 0 || (_options$modifiers11 = options.modifiers) === null || _options$modifiers11 === void 0 ? void 0 : _options$modifiers11.once\n\t};\n\tconst cleanup = [\n\t\tuseEventListener(elementRef, \"pointerdown\", onDown, listenerOptions),\n\t\tuseEventListener(elementRef, \"pointermove\", onMove, listenerOptions),\n\t\tuseEventListener(elementRef, [\"pointerup\", \"pointerleave\"], onRelease, listenerOptions)\n\t];\n\tconst stop = () => cleanup.forEach((fn) => fn());\n\treturn stop;\n}\n//#endregion\n//#region onStartTyping/index.ts\nfunction isFocusedElementEditable() {\n\tconst { activeElement, body } = document;\n\tif (!activeElement) return false;\n\tif (activeElement === body) return false;\n\tswitch (activeElement.tagName) {\n\t\tcase \"INPUT\":\n\t\tcase \"TEXTAREA\": return true;\n\t}\n\treturn activeElement.hasAttribute(\"contenteditable\");\n}\nfunction isTypedCharValid({ keyCode, metaKey, ctrlKey, altKey }) {\n\tif (metaKey || ctrlKey || altKey) return false;\n\tif (keyCode >= 48 && keyCode <= 57 || keyCode >= 96 && keyCode <= 105) return true;\n\tif (keyCode >= 65 && keyCode <= 90) return true;\n\treturn false;\n}\n/**\n* Fires when users start typing on non-editable elements.\n*\n* @see https://vueuse.org/onStartTyping\n* @param callback\n* @param options\n*/\nfunction onStartTyping(callback, options = {}) {\n\tconst { document = defaultDocument } = options;\n\tconst keydown = (event) => {\n\t\tif (!isFocusedElementEditable() && isTypedCharValid(event)) callback(event);\n\t};\n\tif (document) useEventListener(document, \"keydown\", keydown, { passive: true });\n}\n//#endregion\n//#region templateRef/index.ts\n/**\n* @deprecated Use Vue's built-in `useTemplateRef` instead.\n*\n* Shorthand for binding ref to template element.\n*\n* @see https://vueuse.org/templateRef\n* @param key\n* @param initialValue\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction templateRef(key, initialValue = null) {\n\tconst instance = getCurrentInstance();\n\tlet _trigger = () => {};\n\tconst element = customRef((track, trigger) => {\n\t\t_trigger = trigger;\n\t\treturn {\n\t\t\tget() {\n\t\t\t\tvar _instance$proxy$$refs, _instance$proxy;\n\t\t\t\ttrack();\n\t\t\t\treturn (_instance$proxy$$refs = instance === null || instance === void 0 || (_instance$proxy = instance.proxy) === null || _instance$proxy === void 0 ? void 0 : _instance$proxy.$refs[key]) !== null && _instance$proxy$$refs !== void 0 ? _instance$proxy$$refs : initialValue;\n\t\t\t},\n\t\t\tset() {}\n\t\t};\n\t});\n\ttryOnMounted(_trigger);\n\tonUpdated(_trigger);\n\treturn element;\n}\n//#endregion\n//#region useActiveElement/index.ts\n/**\n* Reactive `document.activeElement`\n*\n* @see https://vueuse.org/useActiveElement\n* @param options\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction useActiveElement(options = {}) {\n\tvar _options$document;\n\tconst { window = defaultWindow, deep = true, triggerOnRemoval = false } = options;\n\tconst document = (_options$document = options.document) !== null && _options$document !== void 0 ? _options$document : window === null || window === void 0 ? void 0 : window.document;\n\tconst getDeepActiveElement = () => {\n\t\tlet element = document === null || document === void 0 ? void 0 : document.activeElement;\n\t\tif (deep) {\n\t\t\tvar _element$shadowRoot;\n\t\t\twhile (element === null || element === void 0 ? void 0 : element.shadowRoot) element = element === null || element === void 0 || (_element$shadowRoot = element.shadowRoot) === null || _element$shadowRoot === void 0 ? void 0 : _element$shadowRoot.activeElement;\n\t\t}\n\t\treturn element;\n\t};\n\tconst activeElement = shallowRef();\n\tconst trigger = () => {\n\t\tactiveElement.value = getDeepActiveElement();\n\t};\n\tif (window) {\n\t\tconst listenerOptions = {\n\t\t\tcapture: true,\n\t\t\tpassive: true\n\t\t};\n\t\tuseEventListener(window, \"blur\", (event) => {\n\t\t\tif (event.relatedTarget !== null) return;\n\t\t\ttrigger();\n\t\t}, listenerOptions);\n\t\tuseEventListener(window, \"focus\", trigger, listenerOptions);\n\t}\n\tif (triggerOnRemoval) onElementRemoval(activeElement, trigger, { document });\n\ttrigger();\n\treturn activeElement;\n}\n//#endregion\n//#region useRafFn/index.ts\n/**\n* Call function on every `requestAnimationFrame`. With controls of pausing and resuming.\n*\n* @see https://vueuse.org/useRafFn\n* @param fn\n* @param options\n*/\nfunction useRafFn(fn, options = {}) {\n\tconst { immediate = true, fpsLimit = null, window = defaultWindow, once = false } = options;\n\tconst isActive = shallowRef(false);\n\tconst intervalLimit = computed(() => {\n\t\tconst limit = toValue(fpsLimit);\n\t\treturn limit ? 1e3 / limit : null;\n\t});\n\tlet previousFrameTimestamp = 0;\n\tlet rafId = null;\n\tfunction loop(timestamp) {\n\t\tif (!isActive.value || !window) return;\n\t\tif (!previousFrameTimestamp) previousFrameTimestamp = timestamp;\n\t\tconst delta = timestamp - previousFrameTimestamp;\n\t\tif (intervalLimit.value && delta < intervalLimit.value) {\n\t\t\trafId = window.requestAnimationFrame(loop);\n\t\t\treturn;\n\t\t}\n\t\tpreviousFrameTimestamp = timestamp;\n\t\tfn({\n\t\t\tdelta,\n\t\t\ttimestamp\n\t\t});\n\t\tif (once) {\n\t\t\tisActive.value = false;\n\t\t\trafId = null;\n\t\t\treturn;\n\t\t}\n\t\trafId = window.requestAnimationFrame(loop);\n\t}\n\tfunction resume() {\n\t\tif (!isActive.value && window) {\n\t\t\tisActive.value = true;\n\t\t\tpreviousFrameTimestamp = 0;\n\t\t\trafId = window.requestAnimationFrame(loop);\n\t\t}\n\t}\n\tfunction pause() {\n\t\tisActive.value = false;\n\t\tif (rafId != null && window) {\n\t\t\twindow.cancelAnimationFrame(rafId);\n\t\t\trafId = null;\n\t\t}\n\t}\n\tif (immediate) resume();\n\ttryOnScopeDispose(pause);\n\treturn {\n\t\tisActive: shallowReadonly(isActive),\n\t\tpause,\n\t\tresume\n\t};\n}\n//#endregion\n//#region useAnimate/index.ts\n/**\n* Reactive Web Animations API\n*\n* @see https://vueuse.org/useAnimate\n* @param target\n* @param keyframes\n* @param options\n*/\nfunction useAnimate(target, keyframes, options) {\n\tlet config;\n\tlet animateOptions;\n\tif (isObject(options)) {\n\t\tconfig = options;\n\t\tanimateOptions = objectOmit(options, [\n\t\t\t\"window\",\n\t\t\t\"immediate\",\n\t\t\t\"commitStyles\",\n\t\t\t\"persist\",\n\t\t\t\"onReady\",\n\t\t\t\"onError\"\n\t\t]);\n\t} else {\n\t\tconfig = { duration: options };\n\t\tanimateOptions = options;\n\t}\n\tconst { window = defaultWindow, immediate = true, commitStyles, persist, playbackRate: _playbackRate = 1, onReady, onError = (e) => {\n\t\tconsole.error(e);\n\t} } = config;\n\tconst isSupported = /* @__PURE__ */ useSupported(() => window && HTMLElement && \"animate\" in HTMLElement.prototype);\n\tconst animate = shallowRef(void 0);\n\tconst store = shallowReactive({\n\t\tstartTime: null,\n\t\tcurrentTime: null,\n\t\ttimeline: null,\n\t\tplaybackRate: _playbackRate,\n\t\tpending: false,\n\t\tplayState: immediate ? \"idle\" : \"paused\",\n\t\treplaceState: \"active\"\n\t});\n\tconst pending = computed(() => store.pending);\n\tconst playState = computed(() => store.playState);\n\tconst replaceState = computed(() => store.replaceState);\n\tconst startTime = computed({\n\t\tget() {\n\t\t\treturn store.startTime;\n\t\t},\n\t\tset(value) {\n\t\t\tstore.startTime = value;\n\t\t\tif (animate.value) animate.value.startTime = value;\n\t\t}\n\t});\n\tconst currentTime = computed({\n\t\tget() {\n\t\t\treturn store.currentTime;\n\t\t},\n\t\tset(value) {\n\t\t\tstore.currentTime = value;\n\t\t\tif (animate.value) {\n\t\t\t\tanimate.value.currentTime = value;\n\t\t\t\tsyncResume();\n\t\t\t}\n\t\t}\n\t});\n\tconst timeline = computed({\n\t\tget() {\n\t\t\treturn store.timeline;\n\t\t},\n\t\tset(value) {\n\t\t\tstore.timeline = value;\n\t\t\tif (animate.value) animate.value.timeline = value;\n\t\t}\n\t});\n\tconst playbackRate = computed({\n\t\tget() {\n\t\t\treturn store.playbackRate;\n\t\t},\n\t\tset(value) {\n\t\t\tstore.playbackRate = value;\n\t\t\tif (animate.value) animate.value.playbackRate = value;\n\t\t}\n\t});\n\tconst play = () => {\n\t\tif (animate.value) try {\n\t\t\tanimate.value.play();\n\t\t\tsyncResume();\n\t\t} catch (e) {\n\t\t\tsyncPause();\n\t\t\tonError(e);\n\t\t}\n\t\telse update();\n\t};\n\tconst pause = () => {\n\t\ttry {\n\t\t\tvar _animate$value;\n\t\t\t(_animate$value = animate.value) === null || _animate$value === void 0 || _animate$value.pause();\n\t\t\tsyncPause();\n\t\t} catch (e) {\n\t\t\tonError(e);\n\t\t}\n\t};\n\tconst reverse = () => {\n\t\tif (!animate.value) update();\n\t\ttry {\n\t\t\tvar _animate$value2;\n\t\t\t(_animate$value2 = animate.value) === null || _animate$value2 === void 0 || _animate$value2.reverse();\n\t\t\tsyncResume();\n\t\t} catch (e) {\n\t\t\tsyncPause();\n\t\t\tonError(e);\n\t\t}\n\t};\n\tconst finish = () => {\n\t\ttry {\n\t\t\tvar _animate$value3;\n\t\t\t(_animate$value3 = animate.value) === null || _animate$value3 === void 0 || _animate$value3.finish();\n\t\t\tsyncPause();\n\t\t} catch (e) {\n\t\t\tonError(e);\n\t\t}\n\t};\n\tconst cancel = () => {\n\t\ttry {\n\t\t\tvar _animate$value4;\n\t\t\t(_animate$value4 = animate.value) === null || _animate$value4 === void 0 || _animate$value4.cancel();\n\t\t\tsyncPause();\n\t\t} catch (e) {\n\t\t\tonError(e);\n\t\t}\n\t};\n\twatch(() => unrefElement(target), (el) => {\n\t\tif (el) update(true);\n\t\telse animate.value = void 0;\n\t});\n\twatch(() => keyframes, (value) => {\n\t\tif (animate.value) {\n\t\t\tupdate();\n\t\t\tconst targetEl = unrefElement(target);\n\t\t\tif (targetEl) animate.value.effect = new KeyframeEffect(targetEl, toValue(value), animateOptions);\n\t\t}\n\t}, { deep: true });\n\ttryOnMounted(() => update(true), false);\n\ttryOnScopeDispose(cancel);\n\tfunction update(init) {\n\t\tconst el = unrefElement(target);\n\t\tif (!isSupported.value || !el) return;\n\t\tif (!animate.value) animate.value = el.animate(toValue(keyframes), animateOptions);\n\t\tif (persist) animate.value.persist();\n\t\tif (_playbackRate !== 1) animate.value.playbackRate = _playbackRate;\n\t\tif (init && !immediate) animate.value.pause();\n\t\telse syncResume();\n\t\tonReady === null || onReady === void 0 || onReady(animate.value);\n\t}\n\tconst listenerOptions = { passive: true };\n\tuseEventListener(animate, [\n\t\t\"cancel\",\n\t\t\"finish\",\n\t\t\"remove\"\n\t], syncPause, listenerOptions);\n\tuseEventListener(animate, \"finish\", () => {\n\t\tvar _animate$value5;\n\t\tif (commitStyles) (_animate$value5 = animate.value) === null || _animate$value5 === void 0 || _animate$value5.commitStyles();\n\t}, listenerOptions);\n\tconst { resume: resumeRef, pause: pauseRef } = useRafFn(() => {\n\t\tif (!animate.value) return;\n\t\tstore.pending = animate.value.pending;\n\t\tstore.playState = animate.value.playState;\n\t\tstore.replaceState = animate.value.replaceState;\n\t\tstore.startTime = animate.value.startTime;\n\t\tstore.currentTime = animate.value.currentTime;\n\t\tstore.timeline = animate.value.timeline;\n\t\tstore.playbackRate = animate.value.playbackRate;\n\t}, { immediate: false });\n\tfunction syncResume() {\n\t\tif (isSupported.value) resumeRef();\n\t}\n\tfunction syncPause() {\n\t\tif (isSupported.value && window) window.requestAnimationFrame(pauseRef);\n\t}\n\treturn {\n\t\tisSupported,\n\t\tanimate,\n\t\tplay,\n\t\tpause,\n\t\treverse,\n\t\tfinish,\n\t\tcancel,\n\t\tpending,\n\t\tplayState,\n\t\treplaceState,\n\t\tstartTime,\n\t\tcurrentTime,\n\t\ttimeline,\n\t\tplaybackRate\n\t};\n}\n//#endregion\n//#region useAsyncQueue/index.ts\n/**\n* Asynchronous queue task controller.\n*\n* @see https://vueuse.org/useAsyncQueue\n* @param tasks\n* @param options\n*/\nfunction useAsyncQueue(tasks, options) {\n\tconst { interrupt = true, onError = noop, onFinished = noop, signal } = options || {};\n\tconst promiseState = {\n\t\taborted: \"aborted\",\n\t\tfulfilled: \"fulfilled\",\n\t\tpending: \"pending\",\n\t\trejected: \"rejected\"\n\t};\n\tconst result = reactive(Array.from(Array.from({ length: tasks.length }), () => ({\n\t\tstate: promiseState.pending,\n\t\tdata: null\n\t})));\n\tconst activeIndex = shallowRef(-1);\n\tif (!tasks || tasks.length === 0) {\n\t\tonFinished();\n\t\treturn {\n\t\t\tactiveIndex,\n\t\t\tresult\n\t\t};\n\t}\n\tfunction updateResult(state, res) {\n\t\tactiveIndex.value++;\n\t\tresult[activeIndex.value].data = res;\n\t\tresult[activeIndex.value].state = state;\n\t}\n\ttasks.reduce((prev, curr) => {\n\t\treturn prev.then((prevRes) => {\n\t\t\tvar _result$activeIndex$v;\n\t\t\tif (signal === null || signal === void 0 ? void 0 : signal.aborted) {\n\t\t\t\tupdateResult(promiseState.aborted, /* @__PURE__ */ new Error(\"aborted\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (((_result$activeIndex$v = result[activeIndex.value]) === null || _result$activeIndex$v === void 0 ? void 0 : _result$activeIndex$v.state) === promiseState.rejected && interrupt) {\n\t\t\t\tonFinished();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst done = curr(prevRes).then((currentRes) => {\n\t\t\t\tupdateResult(promiseState.fulfilled, currentRes);\n\t\t\t\tif (activeIndex.value === tasks.length - 1) onFinished();\n\t\t\t\treturn currentRes;\n\t\t\t});\n\t\t\tif (!signal) return done;\n\t\t\treturn Promise.race([done, whenAborted(signal)]);\n\t\t}).catch((e) => {\n\t\t\tif (signal === null || signal === void 0 ? void 0 : signal.aborted) {\n\t\t\t\tupdateResult(promiseState.aborted, e);\n\t\t\t\treturn e;\n\t\t\t}\n\t\t\tupdateResult(promiseState.rejected, e);\n\t\t\tonError();\n\t\t\tif (activeIndex.value === tasks.length - 1) onFinished();\n\t\t\treturn e;\n\t\t});\n\t}, Promise.resolve());\n\treturn {\n\t\tactiveIndex,\n\t\tresult\n\t};\n}\nfunction whenAborted(signal) {\n\treturn new Promise((resolve, reject) => {\n\t\tconst error = /* @__PURE__ */ new Error(\"aborted\");\n\t\tif (signal.aborted) reject(error);\n\t\telse signal.addEventListener(\"abort\", () => reject(error), { once: true });\n\t});\n}\n//#endregion\n//#region useAsyncState/index.ts\n/**\n* Reactive async state. Will not block your setup function and will trigger changes once\n* the promise is ready.\n*\n* @see https://vueuse.org/useAsyncState\n* @param promise         The promise / async function to be resolved\n* @param initialState    The initial state, used until the first evaluation finishes\n* @param options\n*/\nfunction useAsyncState(promise, initialState, options) {\n\tvar _globalThis$reportErr;\n\tconst { immediate = true, delay = 0, onError = (_globalThis$reportErr = globalThis.reportError) !== null && _globalThis$reportErr !== void 0 ? _globalThis$reportErr : noop, onSuccess = noop, resetOnExecute = true, shallow = true, throwError } = options !== null && options !== void 0 ? options : {};\n\tconst state = shallow ? shallowRef(initialState) : ref(initialState);\n\tconst isReady = shallowRef(false);\n\tconst isLoading = shallowRef(false);\n\tconst error = shallowRef(void 0);\n\tlet executionsCount = 0;\n\tasync function execute(delay = 0, ...args) {\n\t\tconst executionId = executionsCount += 1;\n\t\tif (resetOnExecute) state.value = toValue(initialState);\n\t\terror.value = void 0;\n\t\tisReady.value = false;\n\t\tisLoading.value = true;\n\t\tif (delay > 0) await promiseTimeout(delay);\n\t\tconst _promise = typeof promise === \"function\" ? promise(...args) : promise;\n\t\ttry {\n\t\t\tconst data = await _promise;\n\t\t\tif (executionId === executionsCount) {\n\t\t\t\tstate.value = data;\n\t\t\t\tisReady.value = true;\n\t\t\t}\n\t\t\tonSuccess(data);\n\t\t\treturn data;\n\t\t} catch (e) {\n\t\t\tif (executionId === executionsCount) error.value = e;\n\t\t\tonError(e);\n\t\t\tif (throwError) throw e;\n\t\t} finally {\n\t\t\tif (executionId === executionsCount) isLoading.value = false;\n\t\t}\n\t}\n\tif (immediate) execute(delay);\n\tconst shell = {\n\t\tstate,\n\t\tisReady,\n\t\tisLoading,\n\t\terror,\n\t\texecute,\n\t\texecuteImmediate: (...args) => execute(0, ...args)\n\t};\n\tfunction waitUntilIsLoaded() {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tuntil(isLoading).toBe(false).then(() => resolve(shell)).catch(reject);\n\t\t});\n\t}\n\treturn {\n\t\t...shell,\n\t\tthen(onFulfilled, onRejected) {\n\t\t\treturn waitUntilIsLoaded().then(onFulfilled, onRejected);\n\t\t}\n\t};\n}\n//#endregion\n//#region useBase64/serialization.ts\nconst defaults = {\n\tarray: (v) => JSON.stringify(v),\n\tobject: (v) => JSON.stringify(v),\n\tset: (v) => JSON.stringify(Array.from(v)),\n\tmap: (v) => JSON.stringify(Object.fromEntries(v)),\n\tnull: () => \"\"\n};\nfunction getDefaultSerialization(target) {\n\tif (!target) return defaults.null;\n\tif (target instanceof Map) return defaults.map;\n\telse if (target instanceof Set) return defaults.set;\n\telse if (Array.isArray(target)) return defaults.array;\n\telse return defaults.object;\n}\n//#endregion\n//#region useBase64/index.ts\nfunction useBase64(target, options) {\n\tconst base64 = shallowRef(\"\");\n\tconst promise = shallowRef();\n\tfunction execute() {\n\t\tif (!isClient) return;\n\t\tpromise.value = new Promise((resolve, reject) => {\n\t\t\ttry {\n\t\t\t\tconst _target = toValue(target);\n\t\t\t\tif (_target == null) resolve(\"\");\n\t\t\t\telse if (typeof _target === \"string\") resolve(blobToBase64(new Blob([_target], { type: \"text/plain\" })));\n\t\t\t\telse if (_target instanceof Blob) resolve(blobToBase64(_target));\n\t\t\t\telse if (_target instanceof ArrayBuffer) resolve(window.btoa(String.fromCharCode(...new Uint8Array(_target))));\n\t\t\t\telse if (_target instanceof HTMLCanvasElement) resolve(_target.toDataURL(options === null || options === void 0 ? void 0 : options.type, options === null || options === void 0 ? void 0 : options.quality));\n\t\t\t\telse if (_target instanceof HTMLImageElement) {\n\t\t\t\t\tconst img = _target.cloneNode(false);\n\t\t\t\t\timg.crossOrigin = \"Anonymous\";\n\t\t\t\t\timgLoaded(img).then(() => {\n\t\t\t\t\t\tconst canvas = document.createElement(\"canvas\");\n\t\t\t\t\t\tconst ctx = canvas.getContext(\"2d\");\n\t\t\t\t\t\tcanvas.width = img.width;\n\t\t\t\t\t\tcanvas.height = img.height;\n\t\t\t\t\t\tctx.drawImage(img, 0, 0, canvas.width, canvas.height);\n\t\t\t\t\t\tresolve(canvas.toDataURL(options === null || options === void 0 ? void 0 : options.type, options === null || options === void 0 ? void 0 : options.quality));\n\t\t\t\t\t}).catch(reject);\n\t\t\t\t} else if (typeof _target === \"object\") {\n\t\t\t\t\tconst serialized = ((options === null || options === void 0 ? void 0 : options.serializer) || getDefaultSerialization(_target))(_target);\n\t\t\t\t\treturn resolve(blobToBase64(new Blob([serialized], { type: \"application/json\" })));\n\t\t\t\t} else reject(/* @__PURE__ */ new Error(\"target is unsupported types\"));\n\t\t\t} catch (error) {\n\t\t\t\treject(error);\n\t\t\t}\n\t\t});\n\t\tpromise.value.then((res) => {\n\t\t\tbase64.value = (options === null || options === void 0 ? void 0 : options.dataUrl) === false ? res.replace(/^data:.*?;base64,/, \"\") : res;\n\t\t});\n\t\treturn promise.value;\n\t}\n\tif (isRef(target) || typeof target === \"function\") watch(target, execute, { immediate: true });\n\telse execute();\n\treturn {\n\t\tbase64,\n\t\tpromise,\n\t\texecute\n\t};\n}\nfunction imgLoaded(img) {\n\treturn new Promise((resolve, reject) => {\n\t\tif (!img.complete) {\n\t\t\timg.onload = () => {\n\t\t\t\tresolve();\n\t\t\t};\n\t\t\timg.onerror = reject;\n\t\t} else resolve();\n\t});\n}\nfunction blobToBase64(blob) {\n\treturn new Promise((resolve, reject) => {\n\t\tconst fr = new FileReader();\n\t\tfr.onload = (e) => {\n\t\t\tresolve(e.target.result);\n\t\t};\n\t\tfr.onerror = reject;\n\t\tfr.readAsDataURL(blob);\n\t});\n}\n//#endregion\n//#region useBattery/index.ts\n/**\n* Reactive Battery Status API.\n*\n* @see https://vueuse.org/useBattery\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction useBattery(options = {}) {\n\tconst { navigator = defaultNavigator } = options;\n\tconst events = [\n\t\t\"chargingchange\",\n\t\t\"chargingtimechange\",\n\t\t\"dischargingtimechange\",\n\t\t\"levelchange\"\n\t];\n\tconst isSupported = /* @__PURE__ */ useSupported(() => navigator && \"getBattery\" in navigator && typeof navigator.getBattery === \"function\");\n\tconst charging = shallowRef(false);\n\tconst chargingTime = shallowRef(0);\n\tconst dischargingTime = shallowRef(0);\n\tconst level = shallowRef(1);\n\tlet battery;\n\tfunction updateBatteryInfo() {\n\t\tcharging.value = this.charging;\n\t\tchargingTime.value = this.chargingTime || 0;\n\t\tdischargingTime.value = this.dischargingTime || 0;\n\t\tlevel.value = this.level;\n\t}\n\tif (isSupported.value) navigator.getBattery().then((_battery) => {\n\t\tbattery = _battery;\n\t\tupdateBatteryInfo.call(battery);\n\t\tuseEventListener(battery, events, updateBatteryInfo, { passive: true });\n\t});\n\treturn {\n\t\tisSupported,\n\t\tcharging,\n\t\tchargingTime,\n\t\tdischargingTime,\n\t\tlevel\n\t};\n}\n//#endregion\n//#region useBluetooth/index.ts\n/* @__NO_SIDE_EFFECTS__ */\nfunction useBluetooth(options) {\n\tlet { acceptAllDevices = false } = options || {};\n\tconst { filters = void 0, optionalServices = void 0, navigator = defaultNavigator } = options || {};\n\tconst isSupported = /* @__PURE__ */ useSupported(() => navigator && \"bluetooth\" in navigator);\n\tconst device = shallowRef();\n\tconst error = shallowRef(null);\n\twatch(device, () => {\n\t\tconnectToBluetoothGATTServer();\n\t});\n\tasync function requestDevice() {\n\t\tif (!isSupported.value) return;\n\t\terror.value = null;\n\t\tif (filters && filters.length > 0) acceptAllDevices = false;\n\t\ttry {\n\t\t\tdevice.value = await (navigator === null || navigator === void 0 ? void 0 : navigator.bluetooth.requestDevice({\n\t\t\t\tacceptAllDevices,\n\t\t\t\tfilters,\n\t\t\t\toptionalServices\n\t\t\t}));\n\t\t} catch (err) {\n\t\t\terror.value = err;\n\t\t}\n\t}\n\tconst server = shallowRef();\n\tconst isConnected = shallowRef(false);\n\tfunction reset() {\n\t\tisConnected.value = false;\n\t\tdevice.value = void 0;\n\t\tserver.value = void 0;\n\t}\n\tasync function connectToBluetoothGATTServer() {\n\t\terror.value = null;\n\t\tif (device.value && device.value.gatt) {\n\t\t\tuseEventListener(device, \"gattserverdisconnected\", reset, { passive: true });\n\t\t\ttry {\n\t\t\t\tserver.value = await device.value.gatt.connect();\n\t\t\t\tisConnected.value = server.value.connected;\n\t\t\t} catch (err) {\n\t\t\t\terror.value = err;\n\t\t\t}\n\t\t}\n\t}\n\ttryOnMounted(() => {\n\t\tvar _device$value$gatt;\n\t\tif (device.value) (_device$value$gatt = device.value.gatt) === null || _device$value$gatt === void 0 || _device$value$gatt.connect();\n\t});\n\ttryOnScopeDispose(() => {\n\t\tvar _device$value$gatt2;\n\t\tif (device.value) (_device$value$gatt2 = device.value.gatt) === null || _device$value$gatt2 === void 0 || _device$value$gatt2.disconnect();\n\t});\n\treturn {\n\t\tisSupported,\n\t\tisConnected: shallowReadonly(isConnected),\n\t\tdevice,\n\t\trequestDevice,\n\t\tserver,\n\t\terror\n\t};\n}\n//#endregion\n//#region useSSRWidth/index.ts\nconst ssrWidthSymbol = Symbol(\"vueuse-ssr-width\");\n/* @__NO_SIDE_EFFECTS__ */\nfunction useSSRWidth() {\n\tconst ssrWidth = hasInjectionContext() ? injectLocal(ssrWidthSymbol, null) : null;\n\treturn typeof ssrWidth === \"number\" ? ssrWidth : void 0;\n}\nfunction provideSSRWidth(width, app) {\n\tif (app !== void 0) app.provide(ssrWidthSymbol, width);\n\telse provideLocal(ssrWidthSymbol, width);\n}\n//#endregion\n//#region useMediaQuery/index.ts\n/**\n* Reactive Media Query.\n*\n* @see https://vueuse.org/useMediaQuery\n* @param query\n* @param options\n*/\nfunction useMediaQuery(query, options = {}) {\n\tconst { window = defaultWindow, ssrWidth = /* @__PURE__ */ useSSRWidth() } = options;\n\tconst isSupported = /* @__PURE__ */ useSupported(() => window && \"matchMedia\" in window && typeof window.matchMedia === \"function\");\n\tconst ssrSupport = shallowRef(typeof ssrWidth === \"number\");\n\tconst mediaQuery = shallowRef();\n\tconst matches = shallowRef(false);\n\tconst handler = (event) => {\n\t\tmatches.value = event.matches;\n\t};\n\twatchEffect(() => {\n\t\tif (ssrSupport.value) {\n\t\t\tssrSupport.value = !isSupported.value;\n\t\t\tmatches.value = toValue(query).split(\",\").some((queryString) => {\n\t\t\t\tconst not = queryString.includes(\"not all\");\n\t\t\t\tconst minWidth = queryString.match(/\\(\\s*min-width:\\s*(-?\\d+(?:\\.\\d*)?[a-z]+\\s*)\\)/);\n\t\t\t\tconst maxWidth = queryString.match(/\\(\\s*max-width:\\s*(-?\\d+(?:\\.\\d*)?[a-z]+\\s*)\\)/);\n\t\t\t\tlet res = Boolean(minWidth || maxWidth);\n\t\t\t\tif (minWidth && res) res = ssrWidth >= pxValue(minWidth[1]);\n\t\t\t\tif (maxWidth && res) res = ssrWidth <= pxValue(maxWidth[1]);\n\t\t\t\treturn not ? !res : res;\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tif (!isSupported.value) return;\n\t\tmediaQuery.value = window.matchMedia(toValue(query));\n\t\tmatches.value = mediaQuery.value.matches;\n\t});\n\tuseEventListener(mediaQuery, \"change\", handler, { passive: true });\n\treturn computed(() => matches.value);\n}\n//#endregion\n//#region useBreakpoints/breakpoints.ts\n/**\n* Breakpoints from Tailwind V2\n*\n* @see https://tailwindcss.com/docs/breakpoints\n*/\nconst breakpointsTailwind = {\n\t\"sm\": 640,\n\t\"md\": 768,\n\t\"lg\": 1024,\n\t\"xl\": 1280,\n\t\"2xl\": 1536\n};\n/**\n* Breakpoints from Bootstrap V5\n*\n* @see https://getbootstrap.com/docs/5.0/layout/breakpoints\n*/\nconst breakpointsBootstrapV5 = {\n\txs: 0,\n\tsm: 576,\n\tmd: 768,\n\tlg: 992,\n\txl: 1200,\n\txxl: 1400\n};\n/**\n* Breakpoints from Vuetify V2\n*\n* @see https://v2.vuetifyjs.com/en/features/breakpoints/\n*/\nconst breakpointsVuetifyV2 = {\n\txs: 0,\n\tsm: 600,\n\tmd: 960,\n\tlg: 1264,\n\txl: 1904\n};\n/**\n* Breakpoints from Vuetify V3\n*\n* @see https://vuetifyjs.com/en/styles/float/#overview\n*/\nconst breakpointsVuetifyV3 = {\n\txs: 0,\n\tsm: 600,\n\tmd: 960,\n\tlg: 1280,\n\txl: 1920,\n\txxl: 2560\n};\n/**\n* Alias to `breakpointsVuetifyV2`\n*\n* @deprecated explictly use `breakpointsVuetifyV2` or `breakpointsVuetifyV3` instead\n*/\nconst breakpointsVuetify = breakpointsVuetifyV2;\n/**\n* Breakpoints from Ant Design\n*\n* @see https://ant.design/components/layout/#breakpoint-width\n*/\nconst breakpointsAntDesign = {\n\txs: 480,\n\tsm: 576,\n\tmd: 768,\n\tlg: 992,\n\txl: 1200,\n\txxl: 1600\n};\n/**\n* Breakpoints from Quasar V2\n*\n* @see https://quasar.dev/style/breakpoints\n*/\nconst breakpointsQuasar = {\n\txs: 0,\n\tsm: 600,\n\tmd: 1024,\n\tlg: 1440,\n\txl: 1920\n};\n/**\n* Sematic Breakpoints\n*/\nconst breakpointsSematic = {\n\tmobileS: 320,\n\tmobileM: 375,\n\tmobileL: 425,\n\ttablet: 768,\n\tlaptop: 1024,\n\tlaptopL: 1440,\n\tdesktop4K: 2560\n};\n/**\n* Breakpoints from Master CSS\n*\n* @see https://docs.master.co/css/breakpoints\n*/\nconst breakpointsMasterCss = {\n\t\"3xs\": 360,\n\t\"2xs\": 480,\n\t\"xs\": 600,\n\t\"sm\": 768,\n\t\"md\": 1024,\n\t\"lg\": 1280,\n\t\"xl\": 1440,\n\t\"2xl\": 1600,\n\t\"3xl\": 1920,\n\t\"4xl\": 2560\n};\n/**\n* Breakpoints from PrimeFlex\n*\n* @see https://primeflex.org/installation\n*/\nconst breakpointsPrimeFlex = {\n\tsm: 576,\n\tmd: 768,\n\tlg: 992,\n\txl: 1200\n};\n/**\n* Breakpoints from ElementUI/ElementPlus\n*\n* @see https://element.eleme.io/#/en-US/component/layout\n* @see https://element-plus.org/en-US/component/layout.html\n*/\nconst breakpointsElement = {\n\txs: 0,\n\tsm: 768,\n\tmd: 992,\n\tlg: 1200,\n\txl: 1920\n};\n//#endregion\n//#region useBreakpoints/index.ts\n/**\n* Reactively viewport breakpoints\n*\n* @see https://vueuse.org/useBreakpoints\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction useBreakpoints(breakpoints, options = {}) {\n\tfunction getValue(k, delta) {\n\t\tlet v = toValue(breakpoints[toValue(k)]);\n\t\tif (delta != null) v = increaseWithUnit(v, delta);\n\t\tif (typeof v === \"number\") v = `${v}px`;\n\t\treturn v;\n\t}\n\tconst { window = defaultWindow, strategy = \"min-width\", ssrWidth = /* @__PURE__ */ useSSRWidth() } = options;\n\tconst ssrSupport = typeof ssrWidth === \"number\";\n\tconst mounted = ssrSupport ? shallowRef(false) : { value: true };\n\tif (ssrSupport) tryOnMounted(() => mounted.value = !!window);\n\tfunction match(query, size) {\n\t\tif (!mounted.value && ssrSupport) return query === \"min\" ? ssrWidth >= pxValue(size) : ssrWidth <= pxValue(size);\n\t\tif (!window) return false;\n\t\treturn window.matchMedia(`(${query}-width: ${size})`).matches;\n\t}\n\tconst greaterOrEqual = (k) => {\n\t\treturn useMediaQuery(() => `(min-width: ${getValue(k)})`, options);\n\t};\n\tconst smallerOrEqual = (k) => {\n\t\treturn useMediaQuery(() => `(max-width: ${getValue(k)})`, options);\n\t};\n\tconst shortcutMethods = Object.keys(breakpoints).reduce((shortcuts, k) => {\n\t\tObject.defineProperty(shortcuts, k, {\n\t\t\tget: () => strategy === \"min-width\" ? greaterOrEqual(k) : smallerOrEqual(k),\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true\n\t\t});\n\t\treturn shortcuts;\n\t}, {});\n\tfunction current() {\n\t\tconst points = Object.keys(breakpoints).map((k) => [\n\t\t\tk,\n\t\t\tshortcutMethods[k],\n\t\t\tpxValue(getValue(k))\n\t\t]).sort((a, b) => a[2] - b[2]);\n\t\treturn computed(() => points.filter(([, v]) => v.value).map(([k]) => k));\n\t}\n\treturn Object.assign(shortcutMethods, {\n\t\tgreaterOrEqual,\n\t\tsmallerOrEqual,\n\t\tgreater(k) {\n\t\t\treturn useMediaQuery(() => `(min-width: ${getValue(k, .1)})`, options);\n\t\t},\n\t\tsmaller(k) {\n\t\t\treturn useMediaQuery(() => `(max-width: ${getValue(k, -.1)})`, options);\n\t\t},\n\t\tbetween(a, b) {\n\t\t\treturn useMediaQuery(() => `(min-width: ${getValue(a)}) and (max-width: ${getValue(b, -.1)})`, options);\n\t\t},\n\t\tisGreater(k) {\n\t\t\treturn match(\"min\", getValue(k, .1));\n\t\t},\n\t\tisGreaterOrEqual(k) {\n\t\t\treturn match(\"min\", getValue(k));\n\t\t},\n\t\tisSmaller(k) {\n\t\t\treturn match(\"max\", getValue(k, -.1));\n\t\t},\n\t\tisSmallerOrEqual(k) {\n\t\t\treturn match(\"max\", getValue(k));\n\t\t},\n\t\tisInBetween(a, b) {\n\t\t\treturn match(\"min\", getValue(a)) && match(\"max\", getValue(b, -.1));\n\t\t},\n\t\tcurrent,\n\t\tactive() {\n\t\t\tconst bps = current();\n\t\t\treturn computed(() => bps.value.length === 0 ? \"\" : bps.value.at(strategy === \"min-width\" ? -1 : 0));\n\t\t}\n\t});\n}\n//#endregion\n//#region useBroadcastChannel/index.ts\n/**\n* Reactive BroadcastChannel\n*\n* @see https://vueuse.org/useBroadcastChannel\n* @see https://developer.mozilla.org/en-US/docs/Web/API/BroadcastChannel\n* @param options\n*\n*/\nfunction useBroadcastChannel(options) {\n\tconst { name, window = defaultWindow } = options;\n\tconst isSupported = /* @__PURE__ */ useSupported(() => window && \"BroadcastChannel\" in window);\n\tconst isClosed = shallowRef(false);\n\tconst channel = shallowRef();\n\tconst data = shallowRef();\n\tconst error = shallowRef(null);\n\tconst post = (data) => {\n\t\tif (channel.value) channel.value.postMessage(data);\n\t};\n\tconst close = () => {\n\t\tif (channel.value) channel.value.close();\n\t\tisClosed.value = true;\n\t};\n\tif (isSupported.value) tryOnMounted(() => {\n\t\terror.value = null;\n\t\tchannel.value = new BroadcastChannel(name);\n\t\tconst listenerOptions = { passive: true };\n\t\tuseEventListener(channel, \"message\", (e) => {\n\t\t\tdata.value = e.data;\n\t\t}, listenerOptions);\n\t\tuseEventListener(channel, \"messageerror\", (e) => {\n\t\t\terror.value = e;\n\t\t}, listenerOptions);\n\t\tuseEventListener(channel, \"close\", () => {\n\t\t\tisClosed.value = true;\n\t\t}, listenerOptions);\n\t});\n\ttryOnScopeDispose(() => {\n\t\tclose();\n\t});\n\treturn {\n\t\tisSupported,\n\t\tchannel,\n\t\tdata,\n\t\tpost,\n\t\tclose,\n\t\terror,\n\t\tisClosed\n\t};\n}\n//#endregion\n//#region useBrowserLocation/index.ts\nconst WRITABLE_PROPERTIES = [\n\t\"hash\",\n\t\"host\",\n\t\"hostname\",\n\t\"href\",\n\t\"pathname\",\n\t\"port\",\n\t\"protocol\",\n\t\"search\"\n];\n/**\n* Reactive browser location.\n*\n* @see https://vueuse.org/useBrowserLocation\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction useBrowserLocation(options = {}) {\n\tconst { window = defaultWindow } = options;\n\tconst refs = Object.fromEntries(WRITABLE_PROPERTIES.map((key) => [key, ref()]));\n\tfor (const [key, ref] of objectEntries(refs)) watch(ref, (value) => {\n\t\tif (!(window === null || window === void 0 ? void 0 : window.location) || window.location[key] === value) return;\n\t\twindow.location[key] = value;\n\t});\n\tconst buildState = (trigger) => {\n\t\tvar _window$location;\n\t\tconst { state, length } = (window === null || window === void 0 ? void 0 : window.history) || {};\n\t\tconst { origin } = (window === null || window === void 0 ? void 0 : window.location) || {};\n\t\tfor (const key of WRITABLE_PROPERTIES) refs[key].value = window === null || window === void 0 || (_window$location = window.location) === null || _window$location === void 0 ? void 0 : _window$location[key];\n\t\treturn reactive({\n\t\t\ttrigger,\n\t\t\tstate,\n\t\t\tlength,\n\t\t\torigin,\n\t\t\t...refs\n\t\t});\n\t};\n\tconst state = ref(buildState(\"load\"));\n\tif (window) {\n\t\tconst listenerOptions = { passive: true };\n\t\tuseEventListener(window, \"popstate\", () => state.value = buildState(\"popstate\"), listenerOptions);\n\t\tuseEventListener(window, \"hashchange\", () => state.value = buildState(\"hashchange\"), listenerOptions);\n\t}\n\treturn state;\n}\n//#endregion\n//#region useCached/index.ts\nfunction useCached(refValue, comparator = (newSourceValue, cachedValue) => newSourceValue === cachedValue, options) {\n\tconst { deepRefs = true, ...watchOptions } = options || {};\n\tconst cachedValue = createRef(refValue.value, deepRefs);\n\twatch(() => refValue.value, (value) => {\n\t\tif (!comparator(value, cachedValue.value)) cachedValue.value = value;\n\t}, watchOptions);\n\treturn cachedValue;\n}\n//#endregion\n//#region usePermission/index.ts\n/**\n* Reactive Permissions API.\n*\n* @see https://vueuse.org/usePermission\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction usePermission(permissionDesc, options = {}) {\n\tconst { controls = false, navigator = defaultNavigator } = options;\n\tconst isSupported = /* @__PURE__ */ useSupported(() => navigator && \"permissions\" in navigator);\n\tconst permissionStatus = shallowRef();\n\tconst desc = typeof permissionDesc === \"string\" ? { name: permissionDesc } : permissionDesc;\n\tconst state = shallowRef();\n\tconst update = () => {\n\t\tvar _permissionStatus$val, _permissionStatus$val2;\n\t\tstate.value = (_permissionStatus$val = (_permissionStatus$val2 = permissionStatus.value) === null || _permissionStatus$val2 === void 0 ? void 0 : _permissionStatus$val2.state) !== null && _permissionStatus$val !== void 0 ? _permissionStatus$val : \"prompt\";\n\t};\n\tuseEventListener(permissionStatus, \"change\", update, { passive: true });\n\tconst query = createSingletonPromise(async () => {\n\t\tif (!isSupported.value) return;\n\t\tif (!permissionStatus.value) try {\n\t\t\tpermissionStatus.value = await navigator.permissions.query(desc);\n\t\t} catch (_unused) {\n\t\t\tpermissionStatus.value = void 0;\n\t\t} finally {\n\t\t\tupdate();\n\t\t}\n\t\tif (controls) return toRaw(permissionStatus.value);\n\t});\n\tquery();\n\tif (controls) return {\n\t\tstate,\n\t\tisSupported,\n\t\tquery\n\t};\n\telse return state;\n}\n//#endregion\n//#region useClipboard/index.ts\nfunction useClipboard(options = {}) {\n\tconst { navigator = defaultNavigator, read = false, source, copiedDuring = 1500, legacy = false } = options;\n\tconst isClipboardApiSupported = /* @__PURE__ */ useSupported(() => navigator && \"clipboard\" in navigator);\n\tconst permissionRead = usePermission(\"clipboard-read\");\n\tconst permissionWrite = usePermission(\"clipboard-write\");\n\tconst isSupported = computed(() => isClipboardApiSupported.value || legacy);\n\tconst text = shallowRef(\"\");\n\tconst copied = shallowRef(false);\n\tconst copyPending = shallowRef(false);\n\tconst timeout = useTimeoutFn(() => copied.value = false, copiedDuring, { immediate: false });\n\tlet lastLegacyId = 0;\n\tasync function updateText() {\n\t\tlet useLegacy = !(isClipboardApiSupported.value && isAllowed(permissionRead.value));\n\t\tif (!useLegacy) try {\n\t\t\ttext.value = await navigator.clipboard.readText();\n\t\t} catch (_unused) {\n\t\t\tuseLegacy = true;\n\t\t}\n\t\tif (useLegacy) text.value = legacyRead();\n\t}\n\tif (isSupported.value && read) useEventListener([\"copy\", \"cut\"], updateText, { passive: true });\n\tasync function copy(value) {\n\t\tconst resolvedValue = value !== null && value !== void 0 ? value : toValue(source);\n\t\tif (isSupported.value && resolvedValue != null) {\n\t\t\tcopyPending.value = true;\n\t\t\tlet useLegacy = !(isClipboardApiSupported.value && isAllowed(permissionWrite.value));\n\t\t\tif (!useLegacy) try {\n\t\t\t\tconst clipboardItem = createClipboardItem(resolvedValue);\n\t\t\t\tawait navigator.clipboard.write([clipboardItem]);\n\t\t\t} catch (_unused2) {\n\t\t\t\tuseLegacy = true;\n\t\t\t}\n\t\t\tif (useLegacy) if (typeof resolvedValue === \"string\") {\n\t\t\t\ttext.value = resolvedValue;\n\t\t\t\tlegacyCopy(resolvedValue);\n\t\t\t} else {\n\t\t\t\tconst currentId = ++lastLegacyId;\n\t\t\t\tconst resolvedText = await resolvedValue();\n\t\t\t\tif (resolvedText != null && currentId === lastLegacyId) {\n\t\t\t\t\ttext.value = resolvedText;\n\t\t\t\t\tlegacyCopy(resolvedText);\n\t\t\t\t}\n\t\t\t}\n\t\t\tcopied.value = true;\n\t\t\ttimeout.start();\n\t\t\tcopyPending.value = false;\n\t\t}\n\t}\n\tfunction createClipboardItem(value) {\n\t\tif (typeof value === \"string\") {\n\t\t\ttext.value = value;\n\t\t\treturn new ClipboardItem({ \"text/plain\": value });\n\t\t} else return new ClipboardItem({ \"text/plain\": value().then((resolvedText = \"\") => {\n\t\t\ttext.value = resolvedText;\n\t\t\treturn new Blob([resolvedText], { type: \"text/plain\" });\n\t\t}) });\n\t}\n\tfunction legacyCopy(value) {\n\t\tconst ta = document.createElement(\"textarea\");\n\t\tta.value = value;\n\t\tta.style.position = \"absolute\";\n\t\tta.style.opacity = \"0\";\n\t\tta.setAttribute(\"readonly\", \"\");\n\t\tdocument.body.appendChild(ta);\n\t\tta.select();\n\t\tdocument.execCommand(\"copy\");\n\t\tta.remove();\n\t}\n\tfunction legacyRead() {\n\t\tvar _document$getSelectio, _document, _document$getSelectio2;\n\t\treturn (_document$getSelectio = (_document = document) === null || _document === void 0 || (_document$getSelectio2 = _document.getSelection) === null || _document$getSelectio2 === void 0 || (_document$getSelectio2 = _document$getSelectio2.call(_document)) === null || _document$getSelectio2 === void 0 ? void 0 : _document$getSelectio2.toString()) !== null && _document$getSelectio !== void 0 ? _document$getSelectio : \"\";\n\t}\n\tfunction isAllowed(status) {\n\t\treturn status === \"granted\" || status === \"prompt\";\n\t}\n\treturn {\n\t\tcopyPending: shallowReadonly(copyPending),\n\t\tisSupported,\n\t\ttext: shallowReadonly(text),\n\t\tcopied: shallowReadonly(copied),\n\t\tcopy\n\t};\n}\n//#endregion\n//#region useClipboardItems/index.ts\nfunction useClipboardItems(options = {}) {\n\tconst { navigator = defaultNavigator, read = false, source, copiedDuring = 1500 } = options;\n\tconst isSupported = /* @__PURE__ */ useSupported(() => navigator && \"clipboard\" in navigator);\n\tconst content = shallowRef([]);\n\tconst copied = shallowRef(false);\n\tconst timeout = useTimeoutFn(() => copied.value = false, copiedDuring, { immediate: false });\n\tfunction updateContent() {\n\t\tif (isSupported.value) navigator.clipboard.read().then((items) => {\n\t\t\tcontent.value = items;\n\t\t});\n\t}\n\tif (isSupported.value && read) useEventListener([\"copy\", \"cut\"], updateContent, { passive: true });\n\tasync function copy(value = toValue(source)) {\n\t\tif (isSupported.value && value != null) {\n\t\t\tawait navigator.clipboard.write(value);\n\t\t\tcontent.value = value;\n\t\t\tcopied.value = true;\n\t\t\ttimeout.start();\n\t\t}\n\t}\n\treturn {\n\t\tisSupported,\n\t\tcontent: shallowReadonly(content),\n\t\tcopied: shallowReadonly(copied),\n\t\tcopy,\n\t\tread: updateContent\n\t};\n}\n//#endregion\n//#region useCloned/index.ts\nfunction cloneFnJSON(source) {\n\treturn JSON.parse(JSON.stringify(source));\n}\nfunction useCloned(source, options = {}) {\n\tconst cloned = ref({});\n\tconst isModified = shallowRef(false);\n\tlet _lastSync = false;\n\tconst { manual, clone = cloneFnJSON, deep = true, immediate = true } = options;\n\twatch(cloned, () => {\n\t\tif (_lastSync) {\n\t\t\t_lastSync = false;\n\t\t\treturn;\n\t\t}\n\t\tisModified.value = true;\n\t}, {\n\t\tdeep: true,\n\t\tflush: \"sync\"\n\t});\n\tfunction sync() {\n\t\t_lastSync = true;\n\t\tisModified.value = false;\n\t\tcloned.value = clone(toValue(source));\n\t}\n\tif (!manual && (isRef(source) || typeof source === \"function\")) watch(source, sync, {\n\t\t...options,\n\t\tdeep,\n\t\timmediate\n\t});\n\telse sync();\n\treturn {\n\t\tcloned,\n\t\tisModified,\n\t\tsync\n\t};\n}\n//#endregion\n//#region ssr-handlers.ts\nconst _global = typeof globalThis !== \"undefined\" ? globalThis : typeof window !== \"undefined\" ? window : typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : {};\nconst globalKey = \"__vueuse_ssr_handlers__\";\nconst handlers = /* @__PURE__ */ getHandlers();\nfunction getHandlers() {\n\tif (!(globalKey in _global)) _global[globalKey] = _global[globalKey] || {};\n\treturn _global[globalKey];\n}\nfunction getSSRHandler(key, fallback) {\n\treturn handlers[key] || fallback;\n}\nfunction setSSRHandler(key, fn) {\n\thandlers[key] = fn;\n}\n//#endregion\n//#region usePreferredDark/index.ts\n/**\n* Reactive dark theme preference.\n*\n* @see https://vueuse.org/usePreferredDark\n* @param [options]\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction usePreferredDark(options) {\n\treturn useMediaQuery(\"(prefers-color-scheme: dark)\", options);\n}\n//#endregion\n//#region useStorage/guess.ts\nfunction guessSerializerType(rawInit) {\n\treturn rawInit == null ? \"any\" : rawInit instanceof Set ? \"set\" : rawInit instanceof Map ? \"map\" : rawInit instanceof Date ? \"date\" : typeof rawInit === \"boolean\" ? \"boolean\" : typeof rawInit === \"string\" ? \"string\" : typeof rawInit === \"object\" ? \"object\" : !Number.isNaN(rawInit) ? \"number\" : \"any\";\n}\n//#endregion\n//#region useStorage/index.ts\nconst StorageSerializers = {\n\tboolean: {\n\t\tread: (v) => v === \"true\",\n\t\twrite: (v) => String(v)\n\t},\n\tobject: {\n\t\tread: (v) => JSON.parse(v),\n\t\twrite: (v) => JSON.stringify(v)\n\t},\n\tnumber: {\n\t\tread: (v) => Number.parseFloat(v),\n\t\twrite: (v) => String(v)\n\t},\n\tany: {\n\t\tread: (v) => v,\n\t\twrite: (v) => String(v)\n\t},\n\tstring: {\n\t\tread: (v) => v,\n\t\twrite: (v) => String(v)\n\t},\n\tmap: {\n\t\tread: (v) => new Map(JSON.parse(v)),\n\t\twrite: (v) => JSON.stringify(Array.from(v.entries()))\n\t},\n\tset: {\n\t\tread: (v) => new Set(JSON.parse(v)),\n\t\twrite: (v) => JSON.stringify(Array.from(v))\n\t},\n\tdate: {\n\t\tread: (v) => new Date(v),\n\t\twrite: (v) => v.toISOString()\n\t}\n};\nconst customStorageEventName = \"vueuse-storage\";\n/**\n* Reactive LocalStorage/SessionStorage.\n*\n* @see https://vueuse.org/useStorage\n*/\nfunction useStorage(key, defaults, storage, options = {}) {\n\tvar _options$serializer;\n\tconst { flush = \"pre\", deep = true, listenToStorageChanges = true, writeDefaults = true, mergeDefaults = false, shallow, window = defaultWindow, eventFilter, onError = (e) => {\n\t\tconsole.error(e);\n\t}, initOnMounted } = options;\n\tconst data = (shallow ? shallowRef : ref)(typeof defaults === \"function\" ? defaults() : defaults);\n\tconst keyComputed = computed(() => toValue(key));\n\tif (!storage) try {\n\t\tstorage = getSSRHandler(\"getDefaultStorage\", () => defaultWindow === null || defaultWindow === void 0 ? void 0 : defaultWindow.localStorage)();\n\t} catch (e) {\n\t\tonError(e);\n\t}\n\tif (!storage) return data;\n\tconst rawInit = toValue(defaults);\n\tconst type = guessSerializerType(rawInit);\n\tconst serializer = (_options$serializer = options.serializer) !== null && _options$serializer !== void 0 ? _options$serializer : StorageSerializers[type];\n\tconst { pause: pauseWatch, resume: resumeWatch } = watchPausable(data, (newValue) => write(newValue), {\n\t\tflush,\n\t\tdeep,\n\t\teventFilter\n\t});\n\twatch(keyComputed, () => update(), { flush });\n\tlet firstMounted = false;\n\tconst onStorageEvent = (ev) => {\n\t\tif (initOnMounted && !firstMounted) return;\n\t\tupdate(ev);\n\t};\n\tconst onStorageCustomEvent = (ev) => {\n\t\tif (initOnMounted && !firstMounted) return;\n\t\tupdateFromCustomEvent(ev);\n\t};\n\t/**\n\t* The custom event is needed for same-document syncing when using custom\n\t* storage backends, but it doesn't work across different documents.\n\t*\n\t* TODO: Consider implementing a BroadcastChannel-based solution that fixes this.\n\t*/\n\tif (window && listenToStorageChanges) if (storage instanceof Storage) useEventListener(window, \"storage\", onStorageEvent, { passive: true });\n\telse useEventListener(window, customStorageEventName, onStorageCustomEvent);\n\tif (initOnMounted) tryOnMounted(() => {\n\t\tfirstMounted = true;\n\t\tupdate();\n\t});\n\telse update();\n\tfunction dispatchWriteEvent(oldValue, newValue) {\n\t\tif (window) {\n\t\t\tconst payload = {\n\t\t\t\tkey: keyComputed.value,\n\t\t\t\toldValue,\n\t\t\t\tnewValue,\n\t\t\t\tstorageArea: storage\n\t\t\t};\n\t\t\twindow.dispatchEvent(storage instanceof Storage ? new StorageEvent(\"storage\", payload) : new CustomEvent(customStorageEventName, { detail: payload }));\n\t\t}\n\t}\n\tfunction write(v) {\n\t\ttry {\n\t\t\tconst oldValue = storage.getItem(keyComputed.value);\n\t\t\tif (v == null) {\n\t\t\t\tdispatchWriteEvent(oldValue, null);\n\t\t\t\tstorage.removeItem(keyComputed.value);\n\t\t\t} else {\n\t\t\t\tconst serialized = serializer.write(v);\n\t\t\t\tif (oldValue !== serialized) {\n\t\t\t\t\tstorage.setItem(keyComputed.value, serialized);\n\t\t\t\t\tdispatchWriteEvent(oldValue, serialized);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tonError(e);\n\t\t}\n\t}\n\tfunction read(event) {\n\t\tconst rawValue = event ? event.newValue : storage.getItem(keyComputed.value);\n\t\tif (rawValue == null) {\n\t\t\tif (writeDefaults && rawInit != null) storage.setItem(keyComputed.value, serializer.write(rawInit));\n\t\t\treturn rawInit;\n\t\t} else if (!event && mergeDefaults) {\n\t\t\tconst value = serializer.read(rawValue);\n\t\t\tif (typeof mergeDefaults === \"function\") return mergeDefaults(value, rawInit);\n\t\t\telse if (type === \"object\" && !Array.isArray(value)) return {\n\t\t\t\t...rawInit,\n\t\t\t\t...value\n\t\t\t};\n\t\t\treturn value;\n\t\t} else if (typeof rawValue !== \"string\") return rawValue;\n\t\telse return serializer.read(rawValue);\n\t}\n\tfunction update(event) {\n\t\tif (event && event.storageArea !== storage) return;\n\t\tif (event && event.key == null) {\n\t\t\tdata.value = rawInit;\n\t\t\treturn;\n\t\t}\n\t\tif (event && event.key !== keyComputed.value) return;\n\t\tpauseWatch();\n\t\ttry {\n\t\t\tconst serializedData = serializer.write(data.value);\n\t\t\tif (event === void 0 || (event === null || event === void 0 ? void 0 : event.newValue) !== serializedData) data.value = read(event);\n\t\t} catch (e) {\n\t\t\tonError(e);\n\t\t} finally {\n\t\t\tif (event) nextTick(resumeWatch);\n\t\t\telse resumeWatch();\n\t\t}\n\t}\n\tfunction updateFromCustomEvent(event) {\n\t\tupdate(event.detail);\n\t}\n\treturn data;\n}\n//#endregion\n//#region useColorMode/index.ts\nconst CSS_DISABLE_TRANS = \"*,*::before,*::after{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}\";\n/**\n* Reactive color mode with auto data persistence.\n*\n* @see https://vueuse.org/useColorMode\n* @param options\n*/\nfunction useColorMode(options = {}) {\n\tconst { selector = \"html\", attribute = \"class\", initialValue = \"auto\", window = defaultWindow, storage, storageKey = \"vueuse-color-scheme\", listenToStorageChanges = true, storageRef, emitAuto, disableTransition = true } = options;\n\tconst modes = {\n\t\tauto: \"\",\n\t\tlight: \"light\",\n\t\tdark: \"dark\",\n\t\t...options.modes || {}\n\t};\n\tconst preferredDark = usePreferredDark({ window });\n\tconst system = computed(() => preferredDark.value ? \"dark\" : \"light\");\n\tconst store = storageRef || (storageKey == null ? toRef(initialValue) : useStorage(storageKey, initialValue, storage, {\n\t\twindow,\n\t\tlistenToStorageChanges\n\t}));\n\tconst state = computed(() => store.value === \"auto\" ? system.value : store.value);\n\tconst updateHTMLAttrs = getSSRHandler(\"updateHTMLAttrs\", (selector, attribute, value) => {\n\t\tconst el = typeof selector === \"string\" ? window === null || window === void 0 ? void 0 : window.document.querySelector(selector) : unrefElement(selector);\n\t\tif (!el) return;\n\t\tconst classesToAdd = /* @__PURE__ */ new Set();\n\t\tconst classesToRemove = /* @__PURE__ */ new Set();\n\t\tlet attributeToChange = null;\n\t\tif (attribute === \"class\") {\n\t\t\tconst current = value.split(/\\s/g);\n\t\t\tObject.values(modes).flatMap((i) => (i || \"\").split(/\\s/g)).filter(Boolean).forEach((v) => {\n\t\t\t\tif (current.includes(v)) classesToAdd.add(v);\n\t\t\t\telse classesToRemove.add(v);\n\t\t\t});\n\t\t} else attributeToChange = {\n\t\t\tkey: attribute,\n\t\t\tvalue\n\t\t};\n\t\tif (classesToAdd.size === 0 && classesToRemove.size === 0 && attributeToChange === null) return;\n\t\tlet style;\n\t\tif (disableTransition) {\n\t\t\tstyle = window.document.createElement(\"style\");\n\t\t\tstyle.appendChild(document.createTextNode(CSS_DISABLE_TRANS));\n\t\t\twindow.document.head.appendChild(style);\n\t\t}\n\t\tfor (const c of classesToAdd) el.classList.add(c);\n\t\tfor (const c of classesToRemove) el.classList.remove(c);\n\t\tif (attributeToChange) el.setAttribute(attributeToChange.key, attributeToChange.value);\n\t\tif (disableTransition) {\n\t\t\twindow.getComputedStyle(style).opacity;\n\t\t\tdocument.head.removeChild(style);\n\t\t}\n\t});\n\tfunction defaultOnChanged(mode) {\n\t\tvar _modes$mode;\n\t\tupdateHTMLAttrs(selector, attribute, (_modes$mode = modes[mode]) !== null && _modes$mode !== void 0 ? _modes$mode : mode);\n\t}\n\tfunction onChanged(mode) {\n\t\tif (options.onChanged) options.onChanged(mode, defaultOnChanged);\n\t\telse defaultOnChanged(mode);\n\t}\n\twatch(state, onChanged, {\n\t\tflush: \"post\",\n\t\timmediate: true\n\t});\n\ttryOnMounted(() => onChanged(state.value));\n\tconst auto = computed({\n\t\tget() {\n\t\t\treturn emitAuto ? store.value : state.value;\n\t\t},\n\t\tset(v) {\n\t\t\tstore.value = v;\n\t\t}\n\t});\n\treturn Object.assign(auto, {\n\t\tstore,\n\t\tsystem,\n\t\tstate\n\t});\n}\n//#endregion\n//#region useConfirmDialog/index.ts\n/**\n* Hooks for creating confirm dialogs. Useful for modal windows, popups and logins.\n*\n* @see https://vueuse.org/useConfirmDialog/\n* @param revealed `boolean` `ref` that handles a modal window\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction useConfirmDialog(revealed = shallowRef(false)) {\n\tconst confirmHook = createEventHook();\n\tconst cancelHook = createEventHook();\n\tconst revealHook = createEventHook();\n\tlet _resolve = noop;\n\tconst reveal = (data) => {\n\t\trevealHook.trigger(data);\n\t\trevealed.value = true;\n\t\treturn new Promise((resolve) => {\n\t\t\t_resolve = resolve;\n\t\t});\n\t};\n\tconst confirm = (data) => {\n\t\trevealed.value = false;\n\t\tconfirmHook.trigger(data);\n\t\t_resolve({\n\t\t\tdata,\n\t\t\tisCanceled: false\n\t\t});\n\t};\n\tconst cancel = (data) => {\n\t\trevealed.value = false;\n\t\tcancelHook.trigger(data);\n\t\t_resolve({\n\t\t\tdata,\n\t\t\tisCanceled: true\n\t\t});\n\t};\n\treturn {\n\t\tisRevealed: computed(() => revealed.value),\n\t\treveal,\n\t\tconfirm,\n\t\tcancel,\n\t\tonReveal: revealHook.on,\n\t\tonConfirm: confirmHook.on,\n\t\tonCancel: cancelHook.on\n\t};\n}\n//#endregion\n//#region useCountdown/index.ts\nfunction getDefaultScheduler$8(options) {\n\tif (\"interval\" in options || \"immediate\" in options) {\n\t\tconst { interval = 1e3, immediate = false } = options;\n\t\treturn (cb) => useIntervalFn(cb, interval, { immediate });\n\t}\n\treturn (cb) => useIntervalFn(cb, 1e3, { immediate: false });\n}\n/**\n* Reactive countdown timer in seconds.\n*\n* @param initialCountdown\n* @param options\n*\n* @see https://vueuse.org/useCountdown\n*/\nfunction useCountdown(initialCountdown, options = {}) {\n\tconst remaining = shallowRef(toValue(initialCountdown));\n\tconst { scheduler = getDefaultScheduler$8(options), onTick, onComplete } = options;\n\tconst controls = scheduler(() => {\n\t\tconst value = remaining.value - 1;\n\t\tremaining.value = value < 0 ? 0 : value;\n\t\tonTick === null || onTick === void 0 || onTick();\n\t\tif (remaining.value <= 0) {\n\t\t\tcontrols.pause();\n\t\t\tonComplete === null || onComplete === void 0 || onComplete();\n\t\t}\n\t});\n\tconst reset = (countdown) => {\n\t\tvar _toValue;\n\t\tremaining.value = (_toValue = toValue(countdown)) !== null && _toValue !== void 0 ? _toValue : toValue(initialCountdown);\n\t};\n\tconst stop = () => {\n\t\tcontrols.pause();\n\t\treset();\n\t};\n\tconst resume = () => {\n\t\tif (!controls.isActive.value) {\n\t\t\tif (remaining.value > 0) controls.resume();\n\t\t}\n\t};\n\tconst start = (countdown) => {\n\t\treset(countdown);\n\t\tcontrols.resume();\n\t};\n\treturn {\n\t\tremaining,\n\t\treset,\n\t\tstop,\n\t\tstart,\n\t\tpause: controls.pause,\n\t\tresume,\n\t\tisActive: controls.isActive\n\t};\n}\n//#endregion\n//#region useCssSupports/index.ts\nfunction useCssSupports(...args) {\n\tlet options = {};\n\tif (typeof toValue(args.at(-1)) === \"object\") options = args.pop();\n\tconst [prop, value] = args;\n\tconst { window = defaultWindow, ssrValue = false } = options;\n\tconst isMounted = useMounted();\n\treturn { isSupported: computed(() => {\n\t\tif (!isClient || !isMounted.value) return ssrValue;\n\t\treturn args.length === 2 ? window === null || window === void 0 ? void 0 : window.CSS.supports(toValue(prop), toValue(value)) : window === null || window === void 0 ? void 0 : window.CSS.supports(toValue(prop));\n\t}) };\n}\n//#endregion\n//#region useCssVar/index.ts\n/**\n* Manipulate CSS variables.\n*\n* @see https://vueuse.org/useCssVar\n* @param prop\n* @param target\n* @param options\n*/\nfunction useCssVar(prop, target, options = {}) {\n\tconst { window = defaultWindow, initialValue, observe = false } = options;\n\tconst variable = shallowRef(initialValue);\n\tconst elRef = computed(() => {\n\t\tvar _window$document;\n\t\treturn unrefElement(target) || (window === null || window === void 0 || (_window$document = window.document) === null || _window$document === void 0 ? void 0 : _window$document.documentElement);\n\t});\n\tfunction updateCssVar() {\n\t\tconst key = toValue(prop);\n\t\tconst el = toValue(elRef);\n\t\tif (el && window && key) {\n\t\t\tvar _window$getComputedSt;\n\t\t\tvariable.value = ((_window$getComputedSt = window.getComputedStyle(el).getPropertyValue(key)) === null || _window$getComputedSt === void 0 ? void 0 : _window$getComputedSt.trim()) || variable.value || initialValue;\n\t\t}\n\t}\n\tif (observe) useMutationObserver(elRef, updateCssVar, {\n\t\tattributeFilter: [\"style\", \"class\"],\n\t\twindow\n\t});\n\twatch([elRef, () => toValue(prop)], (_, old) => {\n\t\tif (old[0] && old[1]) old[0].style.removeProperty(old[1]);\n\t\tupdateCssVar();\n\t}, { immediate: true });\n\twatch([variable, elRef], ([val, el]) => {\n\t\tconst raw_prop = toValue(prop);\n\t\tif ((el === null || el === void 0 ? void 0 : el.style) && raw_prop) if (val == null) el.style.removeProperty(raw_prop);\n\t\telse el.style.setProperty(raw_prop, val);\n\t}, { immediate: true });\n\treturn variable;\n}\n//#endregion\n//#region useCurrentElement/index.ts\nfunction useCurrentElement(rootComponent) {\n\tconst vm = getCurrentInstance();\n\tconst currentElement = computedWithControl(() => null, () => rootComponent ? unrefElement(rootComponent) : vm.proxy.$el);\n\tonUpdated(currentElement.trigger);\n\tonMounted(currentElement.trigger);\n\treturn currentElement;\n}\n//#endregion\n//#region useCycleList/index.ts\n/**\n* Cycle through a list of items\n*\n* @see https://vueuse.org/useCycleList\n*/\nfunction useCycleList(list, options) {\n\tconst state = shallowRef(getInitialValue());\n\tconst listRef = toRef(list);\n\tconst index = computed({\n\t\tget() {\n\t\t\tvar _options$fallbackInde;\n\t\t\tconst targetList = listRef.value;\n\t\t\tlet index = (options === null || options === void 0 ? void 0 : options.getIndexOf) ? options.getIndexOf(state.value, targetList) : targetList.indexOf(state.value);\n\t\t\tif (index < 0) index = (_options$fallbackInde = options === null || options === void 0 ? void 0 : options.fallbackIndex) !== null && _options$fallbackInde !== void 0 ? _options$fallbackInde : 0;\n\t\t\treturn index;\n\t\t},\n\t\tset(v) {\n\t\t\tset(v);\n\t\t}\n\t});\n\tfunction set(i) {\n\t\tconst targetList = listRef.value;\n\t\tconst length = targetList.length;\n\t\tconst value = targetList[(i % length + length) % length];\n\t\tstate.value = value;\n\t\treturn value;\n\t}\n\tfunction shift(delta = 1) {\n\t\treturn set(index.value + delta);\n\t}\n\tfunction next(n = 1) {\n\t\treturn shift(n);\n\t}\n\tfunction prev(n = 1) {\n\t\treturn shift(-n);\n\t}\n\tfunction getInitialValue() {\n\t\tvar _toValue, _options$initialValue;\n\t\treturn (_toValue = toValue((_options$initialValue = options === null || options === void 0 ? void 0 : options.initialValue) !== null && _options$initialValue !== void 0 ? _options$initialValue : toValue(list)[0])) !== null && _toValue !== void 0 ? _toValue : void 0;\n\t}\n\twatch(listRef, () => set(index.value));\n\treturn {\n\t\tstate,\n\t\tindex,\n\t\tnext,\n\t\tprev,\n\t\tgo: set\n\t};\n}\n//#endregion\n//#region useDark/index.ts\n/**\n* Reactive dark mode with auto data persistence.\n*\n* @see https://vueuse.org/useDark\n* @param options\n*/\nfunction useDark(options = {}) {\n\tconst { valueDark = \"dark\", valueLight = \"\" } = options;\n\tconst mode = useColorMode({\n\t\t...options,\n\t\tonChanged: (mode, defaultHandler) => {\n\t\t\tvar _options$onChanged;\n\t\t\tif (options.onChanged) (_options$onChanged = options.onChanged) === null || _options$onChanged === void 0 || _options$onChanged.call(options, mode === \"dark\", defaultHandler, mode);\n\t\t\telse defaultHandler(mode);\n\t\t},\n\t\tmodes: {\n\t\t\tdark: valueDark,\n\t\t\tlight: valueLight\n\t\t}\n\t});\n\tconst system = computed(() => mode.system.value);\n\treturn computed({\n\t\tget() {\n\t\t\treturn mode.value === \"dark\";\n\t\t},\n\t\tset(v) {\n\t\t\tconst modeVal = v ? \"dark\" : \"light\";\n\t\t\tif (system.value === modeVal) mode.value = \"auto\";\n\t\t\telse mode.value = modeVal;\n\t\t}\n\t});\n}\n//#endregion\n//#region useManualRefHistory/index.ts\nfunction fnBypass(v) {\n\treturn v;\n}\nfunction fnSetSource(source, value) {\n\treturn source.value = value;\n}\nfunction defaultDump(clone) {\n\treturn clone ? typeof clone === \"function\" ? clone : cloneFnJSON : fnBypass;\n}\nfunction defaultParse(clone) {\n\treturn clone ? typeof clone === \"function\" ? clone : cloneFnJSON : fnBypass;\n}\n/**\n* Track the change history of a ref, also provides undo and redo functionality.\n*\n* @see https://vueuse.org/useManualRefHistory\n* @param source\n* @param options\n*/\nfunction useManualRefHistory(source, options = {}) {\n\tconst { clone = false, dump = defaultDump(clone), parse = defaultParse(clone), setSource = fnSetSource } = options;\n\tfunction _createHistoryRecord() {\n\t\treturn markRaw({\n\t\t\tsnapshot: dump(source.value),\n\t\t\ttimestamp: timestamp()\n\t\t});\n\t}\n\tconst last = ref(_createHistoryRecord());\n\tconst undoStack = ref([]);\n\tconst redoStack = ref([]);\n\tconst _setSource = (record) => {\n\t\tsetSource(source, parse(record.snapshot));\n\t\tlast.value = record;\n\t};\n\tconst commit = () => {\n\t\tundoStack.value.unshift(last.value);\n\t\tlast.value = _createHistoryRecord();\n\t\tif (options.capacity && undoStack.value.length > options.capacity) undoStack.value.splice(options.capacity, Number.POSITIVE_INFINITY);\n\t\tif (redoStack.value.length) redoStack.value.splice(0, redoStack.value.length);\n\t};\n\tconst clear = () => {\n\t\tundoStack.value.splice(0, undoStack.value.length);\n\t\tredoStack.value.splice(0, redoStack.value.length);\n\t};\n\tconst undo = () => {\n\t\tconst state = undoStack.value.shift();\n\t\tif (state) {\n\t\t\tredoStack.value.unshift(last.value);\n\t\t\t_setSource(state);\n\t\t}\n\t};\n\tconst redo = () => {\n\t\tconst state = redoStack.value.shift();\n\t\tif (state) {\n\t\t\tundoStack.value.unshift(last.value);\n\t\t\t_setSource(state);\n\t\t}\n\t};\n\tconst reset = () => {\n\t\t_setSource(last.value);\n\t};\n\treturn {\n\t\tsource,\n\t\tundoStack,\n\t\tredoStack,\n\t\tlast,\n\t\thistory: computed(() => [last.value, ...undoStack.value]),\n\t\tcanUndo: computed(() => undoStack.value.length > 0),\n\t\tcanRedo: computed(() => redoStack.value.length > 0),\n\t\tclear,\n\t\tcommit,\n\t\treset,\n\t\tundo,\n\t\tredo\n\t};\n}\n//#endregion\n//#region useRefHistory/index.ts\n/**\n* Track the change history of a ref, also provides undo and redo functionality.\n*\n* @see https://vueuse.org/useRefHistory\n* @param source\n* @param options\n*/\nfunction useRefHistory(source, options = {}) {\n\tconst { deep = false, flush = \"pre\", eventFilter, shouldCommit = () => true } = options;\n\tconst { eventFilter: composedFilter, pause, resume: resumeTracking, isActive: isTracking } = pausableFilter(eventFilter);\n\tlet lastRawValue = source.value;\n\tconst { ignoreUpdates, ignorePrevAsyncUpdates, stop } = watchIgnorable(source, commit, {\n\t\tdeep,\n\t\tflush,\n\t\teventFilter: composedFilter\n\t});\n\tfunction setSource(source, value) {\n\t\tignorePrevAsyncUpdates();\n\t\tignoreUpdates(() => {\n\t\t\tsource.value = value;\n\t\t\tlastRawValue = value;\n\t\t});\n\t}\n\tconst manualHistory = useManualRefHistory(source, {\n\t\t...options,\n\t\tclone: options.clone || deep,\n\t\tsetSource\n\t});\n\tconst { clear, commit: manualCommit } = manualHistory;\n\tfunction commit() {\n\t\tignorePrevAsyncUpdates();\n\t\tif (!shouldCommit(lastRawValue, source.value)) return;\n\t\tlastRawValue = source.value;\n\t\tmanualCommit();\n\t}\n\tfunction resume(commitNow) {\n\t\tresumeTracking();\n\t\tif (commitNow) commit();\n\t}\n\tfunction batch(fn) {\n\t\tlet canceled = false;\n\t\tconst cancel = () => canceled = true;\n\t\tignoreUpdates(() => {\n\t\t\tfn(cancel);\n\t\t});\n\t\tif (!canceled) commit();\n\t}\n\tfunction dispose() {\n\t\tstop();\n\t\tclear();\n\t}\n\treturn {\n\t\t...manualHistory,\n\t\tisTracking,\n\t\tpause,\n\t\tresume,\n\t\tcommit,\n\t\tbatch,\n\t\tdispose\n\t};\n}\n//#endregion\n//#region useDebouncedRefHistory/index.ts\n/**\n* Shorthand for [useRefHistory](https://vueuse.org/useRefHistory) with debounce filter.\n*\n* @see https://vueuse.org/useDebouncedRefHistory\n* @param source\n* @param options\n*/\nfunction useDebouncedRefHistory(source, options = {}) {\n\tconst filter = options.debounce ? debounceFilter(options.debounce) : void 0;\n\treturn { ...useRefHistory(source, {\n\t\t...options,\n\t\teventFilter: filter\n\t}) };\n}\n//#endregion\n//#region useDeviceMotion/index.ts\n/**\n* Reactive DeviceMotionEvent.\n*\n* @see https://vueuse.org/useDeviceMotion\n* @param options\n*/\nfunction useDeviceMotion(options = {}) {\n\tconst { window = defaultWindow, requestPermissions = false, eventFilter = bypassFilter } = options;\n\tconst isSupported = /* @__PURE__ */ useSupported(() => typeof DeviceMotionEvent !== \"undefined\");\n\tconst requirePermissions = /* @__PURE__ */ useSupported(() => isSupported.value && \"requestPermission\" in DeviceMotionEvent && typeof DeviceMotionEvent.requestPermission === \"function\");\n\tconst permissionGranted = shallowRef(false);\n\tconst acceleration = ref({\n\t\tx: null,\n\t\ty: null,\n\t\tz: null\n\t});\n\tconst rotationRate = ref({\n\t\talpha: null,\n\t\tbeta: null,\n\t\tgamma: null\n\t});\n\tconst interval = shallowRef(0);\n\tconst accelerationIncludingGravity = ref({\n\t\tx: null,\n\t\ty: null,\n\t\tz: null\n\t});\n\tfunction init() {\n\t\tif (window) useEventListener(window, \"devicemotion\", createFilterWrapper(eventFilter, (event) => {\n\t\t\tvar _event$acceleration, _event$acceleration2, _event$acceleration3, _event$accelerationIn, _event$accelerationIn2, _event$accelerationIn3, _event$rotationRate, _event$rotationRate2, _event$rotationRate3;\n\t\t\tacceleration.value = {\n\t\t\t\tx: ((_event$acceleration = event.acceleration) === null || _event$acceleration === void 0 ? void 0 : _event$acceleration.x) || null,\n\t\t\t\ty: ((_event$acceleration2 = event.acceleration) === null || _event$acceleration2 === void 0 ? void 0 : _event$acceleration2.y) || null,\n\t\t\t\tz: ((_event$acceleration3 = event.acceleration) === null || _event$acceleration3 === void 0 ? void 0 : _event$acceleration3.z) || null\n\t\t\t};\n\t\t\taccelerationIncludingGravity.value = {\n\t\t\t\tx: ((_event$accelerationIn = event.accelerationIncludingGravity) === null || _event$accelerationIn === void 0 ? void 0 : _event$accelerationIn.x) || null,\n\t\t\t\ty: ((_event$accelerationIn2 = event.accelerationIncludingGravity) === null || _event$accelerationIn2 === void 0 ? void 0 : _event$accelerationIn2.y) || null,\n\t\t\t\tz: ((_event$accelerationIn3 = event.accelerationIncludingGravity) === null || _event$accelerationIn3 === void 0 ? void 0 : _event$accelerationIn3.z) || null\n\t\t\t};\n\t\t\trotationRate.value = {\n\t\t\t\talpha: ((_event$rotationRate = event.rotationRate) === null || _event$rotationRate === void 0 ? void 0 : _event$rotationRate.alpha) || null,\n\t\t\t\tbeta: ((_event$rotationRate2 = event.rotationRate) === null || _event$rotationRate2 === void 0 ? void 0 : _event$rotationRate2.beta) || null,\n\t\t\t\tgamma: ((_event$rotationRate3 = event.rotationRate) === null || _event$rotationRate3 === void 0 ? void 0 : _event$rotationRate3.gamma) || null\n\t\t\t};\n\t\t\tinterval.value = event.interval;\n\t\t}), { passive: true });\n\t}\n\tconst ensurePermissions = async () => {\n\t\tif (!requirePermissions.value) permissionGranted.value = true;\n\t\tif (permissionGranted.value) return;\n\t\tif (requirePermissions.value) {\n\t\t\tconst requestPermission = DeviceMotionEvent.requestPermission;\n\t\t\ttry {\n\t\t\t\tif (await requestPermission() === \"granted\") {\n\t\t\t\t\tpermissionGranted.value = true;\n\t\t\t\t\tinit();\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(error);\n\t\t\t}\n\t\t}\n\t};\n\tif (isSupported.value) if (requestPermissions && requirePermissions.value) ensurePermissions().then(() => init());\n\telse init();\n\treturn {\n\t\tacceleration,\n\t\taccelerationIncludingGravity,\n\t\trotationRate,\n\t\tinterval,\n\t\tisSupported,\n\t\trequirePermissions,\n\t\tensurePermissions,\n\t\tpermissionGranted\n\t};\n}\n//#endregion\n//#region useDeviceOrientation/index.ts\n/**\n* Reactive DeviceOrientationEvent.\n*\n* @see https://vueuse.org/useDeviceOrientation\n* @param options\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction useDeviceOrientation(options = {}) {\n\tconst { window = defaultWindow } = options;\n\tconst isSupported = /* @__PURE__ */ useSupported(() => window && \"DeviceOrientationEvent\" in window);\n\tconst isAbsolute = shallowRef(false);\n\tconst alpha = shallowRef(null);\n\tconst beta = shallowRef(null);\n\tconst gamma = shallowRef(null);\n\tif (window && isSupported.value) useEventListener(window, \"deviceorientation\", (event) => {\n\t\tisAbsolute.value = event.absolute;\n\t\talpha.value = event.alpha;\n\t\tbeta.value = event.beta;\n\t\tgamma.value = event.gamma;\n\t}, { passive: true });\n\treturn {\n\t\tisSupported,\n\t\tisAbsolute,\n\t\talpha,\n\t\tbeta,\n\t\tgamma\n\t};\n}\n//#endregion\n//#region useDevicePixelRatio/index.ts\n/**\n* Reactively track `window.devicePixelRatio`.\n*\n* @see https://vueuse.org/useDevicePixelRatio\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction useDevicePixelRatio(options = {}) {\n\tconst { window = defaultWindow } = options;\n\tconst pixelRatio = shallowRef(1);\n\tconst query = useMediaQuery(() => `(resolution: ${pixelRatio.value}dppx)`, options);\n\tlet stop = noop;\n\tif (window) stop = watchImmediate(query, () => pixelRatio.value = window.devicePixelRatio);\n\treturn {\n\t\tpixelRatio: shallowReadonly(pixelRatio),\n\t\tstop\n\t};\n}\n//#endregion\n//#region useDevicesList/index.ts\n/**\n* Reactive `enumerateDevices` listing available input/output devices\n*\n* @see https://vueuse.org/useDevicesList\n* @param options\n*/\nfunction useDevicesList(options = {}) {\n\tconst { navigator = defaultNavigator, requestPermissions = false, constraints = {\n\t\taudio: true,\n\t\tvideo: true\n\t}, onUpdated } = options;\n\tconst devices = shallowRef([]);\n\tconst videoInputs = computed(() => devices.value.filter((i) => i.kind === \"videoinput\"));\n\tconst audioInputs = computed(() => devices.value.filter((i) => i.kind === \"audioinput\"));\n\tconst audioOutputs = computed(() => devices.value.filter((i) => i.kind === \"audiooutput\"));\n\tconst isSupported = /* @__PURE__ */ useSupported(() => navigator && navigator.mediaDevices && navigator.mediaDevices.enumerateDevices);\n\tconst permissionGranted = shallowRef(false);\n\tlet stream;\n\tasync function update() {\n\t\tif (!isSupported.value) return;\n\t\tdevices.value = await navigator.mediaDevices.enumerateDevices();\n\t\tonUpdated === null || onUpdated === void 0 || onUpdated(devices.value);\n\t\tif (stream) {\n\t\t\tstream.getTracks().forEach((t) => t.stop());\n\t\t\tstream = null;\n\t\t}\n\t}\n\tasync function ensurePermissions() {\n\t\tconst deviceName = constraints.video ? \"camera\" : \"microphone\";\n\t\tif (!isSupported.value) return false;\n\t\tif (permissionGranted.value) return true;\n\t\tconst { state, query } = usePermission(deviceName, { controls: true });\n\t\tawait query();\n\t\tif (state.value !== \"granted\") {\n\t\t\tlet granted = true;\n\t\t\ttry {\n\t\t\t\tconst allDevices = await navigator.mediaDevices.enumerateDevices();\n\t\t\t\tconst hasCamera = allDevices.some((device) => device.kind === \"videoinput\");\n\t\t\t\tconst hasMicrophone = allDevices.some((device) => device.kind === \"audioinput\" || device.kind === \"audiooutput\");\n\t\t\t\tconstraints.video = hasCamera ? constraints.video : false;\n\t\t\t\tconstraints.audio = hasMicrophone ? constraints.audio : false;\n\t\t\t\tstream = await navigator.mediaDevices.getUserMedia(constraints);\n\t\t\t} catch (_unused) {\n\t\t\t\tstream = null;\n\t\t\t\tgranted = false;\n\t\t\t}\n\t\t\tupdate();\n\t\t\tpermissionGranted.value = granted;\n\t\t} else permissionGranted.value = true;\n\t\treturn permissionGranted.value;\n\t}\n\tif (isSupported.value) {\n\t\tif (requestPermissions) ensurePermissions();\n\t\tuseEventListener(navigator.mediaDevices, \"devicechange\", update, { passive: true });\n\t\tupdate();\n\t}\n\treturn {\n\t\tdevices,\n\t\tensurePermissions,\n\t\tpermissionGranted,\n\t\tvideoInputs,\n\t\taudioInputs,\n\t\taudioOutputs,\n\t\tisSupported\n\t};\n}\n//#endregion\n//#region useDisplayMedia/index.ts\n/**\n* Reactive `mediaDevices.getDisplayMedia` streaming\n*\n* @see https://vueuse.org/useDisplayMedia\n* @param options\n*/\nfunction useDisplayMedia(options = {}) {\n\tvar _options$enabled;\n\tconst enabled = shallowRef((_options$enabled = options.enabled) !== null && _options$enabled !== void 0 ? _options$enabled : false);\n\tconst video = options.video;\n\tconst audio = options.audio;\n\tconst { navigator = defaultNavigator } = options;\n\tconst isSupported = /* @__PURE__ */ useSupported(() => {\n\t\tvar _navigator$mediaDevic;\n\t\treturn navigator === null || navigator === void 0 || (_navigator$mediaDevic = navigator.mediaDevices) === null || _navigator$mediaDevic === void 0 ? void 0 : _navigator$mediaDevic.getDisplayMedia;\n\t});\n\tconst constraint = {\n\t\taudio,\n\t\tvideo\n\t};\n\tconst stream = shallowRef();\n\tasync function _start() {\n\t\tvar _stream$value;\n\t\tif (!isSupported.value || stream.value) return;\n\t\tstream.value = await navigator.mediaDevices.getDisplayMedia(constraint);\n\t\t(_stream$value = stream.value) === null || _stream$value === void 0 || _stream$value.getTracks().forEach((t) => useEventListener(t, \"ended\", stop, { passive: true }));\n\t\treturn stream.value;\n\t}\n\tasync function _stop() {\n\t\tvar _stream$value2;\n\t\t(_stream$value2 = stream.value) === null || _stream$value2 === void 0 || _stream$value2.getTracks().forEach((t) => t.stop());\n\t\tstream.value = void 0;\n\t}\n\tfunction stop() {\n\t\t_stop();\n\t\tenabled.value = false;\n\t}\n\tasync function start() {\n\t\tawait _start();\n\t\tif (stream.value) enabled.value = true;\n\t\treturn stream.value;\n\t}\n\twatch(enabled, (v) => {\n\t\tif (v) _start();\n\t\telse _stop();\n\t}, { immediate: true });\n\treturn {\n\t\tisSupported,\n\t\tstream,\n\t\tstart,\n\t\tstop,\n\t\tenabled\n\t};\n}\n//#endregion\n//#region useDocumentVisibility/index.ts\n/**\n* Reactively track `document.visibilityState`.\n*\n* @see https://vueuse.org/useDocumentVisibility\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction useDocumentVisibility(options = {}) {\n\tconst { document = defaultDocument } = options;\n\tif (!document) return shallowRef(\"visible\");\n\tconst visibility = shallowRef(document.visibilityState);\n\tuseEventListener(document, \"visibilitychange\", () => {\n\t\tvisibility.value = document.visibilityState;\n\t}, { passive: true });\n\treturn visibility;\n}\n//#endregion\n//#region useDraggable/index.ts\nconst defaultScrollConfig = {\n\tspeed: 2,\n\tmargin: 30,\n\tdirection: \"both\"\n};\nfunction clampContainerScroll(container) {\n\tif (container.scrollLeft > container.scrollWidth - container.clientWidth) container.scrollLeft = Math.max(0, container.scrollWidth - container.clientWidth);\n\tif (container.scrollTop > container.scrollHeight - container.clientHeight) container.scrollTop = Math.max(0, container.scrollHeight - container.clientHeight);\n}\n/**\n* Make elements draggable.\n*\n* @see https://vueuse.org/useDraggable\n* @param target\n* @param options\n*/\nfunction useDraggable(target, options = {}) {\n\tvar _toValue, _toValue2, _toValue3, _scrollConfig$directi;\n\tconst { pointerTypes, preventDefault, stopPropagation, exact, onMove, onEnd, onStart, initialValue, axis = \"both\", draggingElement = defaultWindow, containerElement, handle: draggingHandle = target, buttons = [0], restrictInView, autoScroll = false } = options;\n\tconst position = ref((_toValue = toValue(initialValue)) !== null && _toValue !== void 0 ? _toValue : {\n\t\tx: 0,\n\t\ty: 0\n\t});\n\tconst pressedDelta = ref();\n\tconst filterEvent = (e) => {\n\t\tif (pointerTypes) return pointerTypes.includes(e.pointerType);\n\t\treturn true;\n\t};\n\tconst handleEvent = (e) => {\n\t\tif (toValue(preventDefault)) e.preventDefault();\n\t\tif (toValue(stopPropagation)) e.stopPropagation();\n\t};\n\tconst scrollConfig = toValue(autoScroll);\n\tconst scrollSettings = typeof scrollConfig === \"object\" ? {\n\t\tspeed: (_toValue2 = toValue(scrollConfig.speed)) !== null && _toValue2 !== void 0 ? _toValue2 : defaultScrollConfig.speed,\n\t\tmargin: (_toValue3 = toValue(scrollConfig.margin)) !== null && _toValue3 !== void 0 ? _toValue3 : defaultScrollConfig.margin,\n\t\tdirection: (_scrollConfig$directi = scrollConfig.direction) !== null && _scrollConfig$directi !== void 0 ? _scrollConfig$directi : defaultScrollConfig.direction\n\t} : defaultScrollConfig;\n\tconst getScrollAxisValues = (value) => typeof value === \"number\" ? [value, value] : [value.x, value.y];\n\tconst handleAutoScroll = (container, targetRect, position) => {\n\t\tconst { clientWidth, clientHeight, scrollLeft, scrollTop, scrollWidth, scrollHeight } = container;\n\t\tconst [marginX, marginY] = getScrollAxisValues(scrollSettings.margin);\n\t\tconst [speedX, speedY] = getScrollAxisValues(scrollSettings.speed);\n\t\tlet deltaX = 0;\n\t\tlet deltaY = 0;\n\t\tif (scrollSettings.direction === \"x\" || scrollSettings.direction === \"both\") {\n\t\t\tif (position.x < marginX && scrollLeft > 0) deltaX = -speedX;\n\t\t\telse if (position.x + targetRect.width > clientWidth - marginX && scrollLeft < scrollWidth - clientWidth) deltaX = speedX;\n\t\t}\n\t\tif (scrollSettings.direction === \"y\" || scrollSettings.direction === \"both\") {\n\t\t\tif (position.y < marginY && scrollTop > 0) deltaY = -speedY;\n\t\t\telse if (position.y + targetRect.height > clientHeight - marginY && scrollTop < scrollHeight - clientHeight) deltaY = speedY;\n\t\t}\n\t\tif (deltaX || deltaY) container.scrollBy({\n\t\t\tleft: deltaX,\n\t\t\ttop: deltaY,\n\t\t\tbehavior: \"auto\"\n\t\t});\n\t};\n\tlet autoScrollInterval = null;\n\tconst startAutoScroll = () => {\n\t\tconst container = toValue(containerElement);\n\t\tif (container && !autoScrollInterval) autoScrollInterval = setInterval(() => {\n\t\t\tconst targetRect = toValue(target).getBoundingClientRect();\n\t\t\tconst { x, y } = position.value;\n\t\t\tconst relativePosition = {\n\t\t\t\tx: x - container.scrollLeft,\n\t\t\t\ty: y - container.scrollTop\n\t\t\t};\n\t\t\tif (relativePosition.x >= 0 && relativePosition.y >= 0) {\n\t\t\t\thandleAutoScroll(container, targetRect, relativePosition);\n\t\t\t\trelativePosition.x += container.scrollLeft;\n\t\t\t\trelativePosition.y += container.scrollTop;\n\t\t\t\tposition.value = relativePosition;\n\t\t\t}\n\t\t}, 1e3 / 60);\n\t};\n\tconst stopAutoScroll = () => {\n\t\tif (autoScrollInterval) {\n\t\t\tclearInterval(autoScrollInterval);\n\t\t\tautoScrollInterval = null;\n\t\t}\n\t};\n\tconst isPointerNearEdge = (pointer, container, margin, targetRect) => {\n\t\tconst [marginX, marginY] = typeof margin === \"number\" ? [margin, margin] : [margin.x, margin.y];\n\t\tconst { clientWidth, clientHeight } = container;\n\t\treturn pointer.x < marginX || pointer.x + targetRect.width > clientWidth - marginX || pointer.y < marginY || pointer.y + targetRect.height > clientHeight - marginY;\n\t};\n\tconst checkAutoScroll = () => {\n\t\tif (toValue(options.disabled) || !pressedDelta.value) return;\n\t\tconst container = toValue(containerElement);\n\t\tif (!container) return;\n\t\tconst targetRect = toValue(target).getBoundingClientRect();\n\t\tconst { x, y } = position.value;\n\t\tif (isPointerNearEdge({\n\t\t\tx: x - container.scrollLeft,\n\t\t\ty: y - container.scrollTop\n\t\t}, container, scrollSettings.margin, targetRect)) startAutoScroll();\n\t\telse stopAutoScroll();\n\t};\n\tif (toValue(autoScroll)) watch(position, checkAutoScroll);\n\tconst start = (e) => {\n\t\tvar _container$getBoundin;\n\t\tif (!toValue(buttons).includes(e.button)) return;\n\t\tif (toValue(options.disabled) || !filterEvent(e)) return;\n\t\tif (toValue(exact) && e.target !== toValue(target)) return;\n\t\tconst container = toValue(containerElement);\n\t\tconst containerRect = container === null || container === void 0 || (_container$getBoundin = container.getBoundingClientRect) === null || _container$getBoundin === void 0 ? void 0 : _container$getBoundin.call(container);\n\t\tconst targetRect = toValue(target).getBoundingClientRect();\n\t\tconst pos = {\n\t\t\tx: e.clientX - (container ? targetRect.left - containerRect.left + (autoScroll ? 0 : container.scrollLeft) : targetRect.left),\n\t\t\ty: e.clientY - (container ? targetRect.top - containerRect.top + (autoScroll ? 0 : container.scrollTop) : targetRect.top)\n\t\t};\n\t\tif ((onStart === null || onStart === void 0 ? void 0 : onStart(pos, e)) === false) return;\n\t\tpressedDelta.value = pos;\n\t\thandleEvent(e);\n\t};\n\tconst move = (e) => {\n\t\tif (toValue(options.disabled) || !filterEvent(e)) return;\n\t\tif (!pressedDelta.value) return;\n\t\tconst container = toValue(containerElement);\n\t\tif (container instanceof HTMLElement) clampContainerScroll(container);\n\t\tconst targetRect = toValue(target).getBoundingClientRect();\n\t\tlet { x, y } = position.value;\n\t\tif (axis === \"x\" || axis === \"both\") {\n\t\t\tx = e.clientX - pressedDelta.value.x;\n\t\t\tif (container) x = Math.min(Math.max(0, x), container.scrollWidth - targetRect.width);\n\t\t}\n\t\tif (axis === \"y\" || axis === \"both\") {\n\t\t\ty = e.clientY - pressedDelta.value.y;\n\t\t\tif (container) y = Math.min(Math.max(0, y), container.scrollHeight - targetRect.height);\n\t\t}\n\t\tif (toValue(autoScroll) && container) {\n\t\t\tif (autoScrollInterval === null) handleAutoScroll(container, targetRect, {\n\t\t\t\tx,\n\t\t\t\ty\n\t\t\t});\n\t\t\tx += container.scrollLeft;\n\t\t\ty += container.scrollTop;\n\t\t}\n\t\tif (container && (restrictInView || autoScroll)) {\n\t\t\tif (axis !== \"y\") {\n\t\t\t\tconst relativeX = x - container.scrollLeft;\n\t\t\t\tif (relativeX < 0) x = container.scrollLeft;\n\t\t\t\telse if (relativeX > container.clientWidth - targetRect.width) x = container.clientWidth - targetRect.width + container.scrollLeft;\n\t\t\t}\n\t\t\tif (axis !== \"x\") {\n\t\t\t\tconst relativeY = y - container.scrollTop;\n\t\t\t\tif (relativeY < 0) y = container.scrollTop;\n\t\t\t\telse if (relativeY > container.clientHeight - targetRect.height) y = container.clientHeight - targetRect.height + container.scrollTop;\n\t\t\t}\n\t\t}\n\t\tposition.value = {\n\t\t\tx,\n\t\t\ty\n\t\t};\n\t\tonMove === null || onMove === void 0 || onMove(position.value, e);\n\t\thandleEvent(e);\n\t};\n\tconst end = (e) => {\n\t\tif (toValue(options.disabled) || !filterEvent(e)) return;\n\t\tif (!pressedDelta.value) return;\n\t\tpressedDelta.value = void 0;\n\t\tif (autoScroll) stopAutoScroll();\n\t\tonEnd === null || onEnd === void 0 || onEnd(position.value, e);\n\t\thandleEvent(e);\n\t};\n\tif (isClient) {\n\t\tconst config = () => {\n\t\t\tvar _options$capture;\n\t\t\treturn {\n\t\t\t\tcapture: (_options$capture = options.capture) !== null && _options$capture !== void 0 ? _options$capture : true,\n\t\t\t\tpassive: !toValue(preventDefault)\n\t\t\t};\n\t\t};\n\t\tuseEventListener(draggingHandle, \"pointerdown\", start, config);\n\t\tuseEventListener(draggingElement, \"pointermove\", move, config);\n\t\tuseEventListener(draggingElement, \"pointerup\", end, config);\n\t}\n\treturn {\n\t\t...toRefs(position),\n\t\tposition,\n\t\tisDragging: computed(() => !!pressedDelta.value),\n\t\tstyle: computed(() => `\n      left: ${position.value.x}px;\n      top: ${position.value.y}px;\n      ${autoScroll ? \"text-wrap: nowrap;\" : \"\"}\n    `)\n\t};\n}\n//#endregion\n//#region useDropZone/index.ts\nfunction useDropZone(target, options = {}) {\n\tconst isOverDropZone = shallowRef(false);\n\tconst files = shallowRef(null);\n\tlet counter = 0;\n\tlet isValid = true;\n\tif (isClient) {\n\t\tvar _options$multiple, _options$preventDefau;\n\t\tconst _options = typeof options === \"function\" ? { onDrop: options } : options;\n\t\tconst multiple = (_options$multiple = _options.multiple) !== null && _options$multiple !== void 0 ? _options$multiple : true;\n\t\tconst preventDefaultForUnhandled = (_options$preventDefau = _options.preventDefaultForUnhandled) !== null && _options$preventDefau !== void 0 ? _options$preventDefau : false;\n\t\tconst getFiles = (event) => {\n\t\t\tvar _event$dataTransfer$f, _event$dataTransfer;\n\t\t\tconst list = Array.from((_event$dataTransfer$f = (_event$dataTransfer = event.dataTransfer) === null || _event$dataTransfer === void 0 ? void 0 : _event$dataTransfer.files) !== null && _event$dataTransfer$f !== void 0 ? _event$dataTransfer$f : []);\n\t\t\treturn list.length === 0 ? null : multiple ? list : [list[0]];\n\t\t};\n\t\tconst checkDataTypes = (types) => {\n\t\t\tconst dataTypes = unref(_options.dataTypes);\n\t\t\tif (typeof dataTypes === \"function\") return dataTypes(types);\n\t\t\tif (!(dataTypes === null || dataTypes === void 0 ? void 0 : dataTypes.length)) return true;\n\t\t\tif (types.length === 0) return false;\n\t\t\treturn types.every((type) => dataTypes.some((allowedType) => type.includes(allowedType)));\n\t\t};\n\t\tconst checkValidity = (items) => {\n\t\t\tif (_options.checkValidity) return _options.checkValidity(items);\n\t\t\tconst dataTypesValid = checkDataTypes(Array.from(items !== null && items !== void 0 ? items : []).map((item) => item.type));\n\t\t\tconst multipleFilesValid = multiple || items.length <= 1;\n\t\t\treturn dataTypesValid && multipleFilesValid;\n\t\t};\n\t\tconst isSafari = () => /^(?:(?!chrome|android).)*safari/i.test(navigator.userAgent) && !(\"chrome\" in window);\n\t\tconst handleDragEvent = (event, eventType) => {\n\t\t\tvar _event$dataTransfer2, _ref;\n\t\t\tconst dataTransferItemList = (_event$dataTransfer2 = event.dataTransfer) === null || _event$dataTransfer2 === void 0 ? void 0 : _event$dataTransfer2.items;\n\t\t\tisValid = (_ref = dataTransferItemList && checkValidity(dataTransferItemList)) !== null && _ref !== void 0 ? _ref : false;\n\t\t\tif (preventDefaultForUnhandled) event.preventDefault();\n\t\t\tif (!isSafari() && !isValid) {\n\t\t\t\tif (event.dataTransfer) event.dataTransfer.dropEffect = \"none\";\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tevent.preventDefault();\n\t\t\tif (event.dataTransfer) event.dataTransfer.dropEffect = \"copy\";\n\t\t\tconst currentFiles = getFiles(event);\n\t\t\tswitch (eventType) {\n\t\t\t\tcase \"enter\":\n\t\t\t\t\tvar _options$onEnter;\n\t\t\t\t\tcounter += 1;\n\t\t\t\t\tisOverDropZone.value = true;\n\t\t\t\t\t(_options$onEnter = _options.onEnter) === null || _options$onEnter === void 0 || _options$onEnter.call(_options, null, event);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"over\":\n\t\t\t\t\tvar _options$onOver;\n\t\t\t\t\t(_options$onOver = _options.onOver) === null || _options$onOver === void 0 || _options$onOver.call(_options, null, event);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"leave\":\n\t\t\t\t\tvar _options$onLeave;\n\t\t\t\t\tcounter -= 1;\n\t\t\t\t\tif (counter === 0) isOverDropZone.value = false;\n\t\t\t\t\t(_options$onLeave = _options.onLeave) === null || _options$onLeave === void 0 || _options$onLeave.call(_options, null, event);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"drop\":\n\t\t\t\t\tcounter = 0;\n\t\t\t\t\tisOverDropZone.value = false;\n\t\t\t\t\tif (isValid) {\n\t\t\t\t\t\tvar _options$onDrop;\n\t\t\t\t\t\tfiles.value = currentFiles;\n\t\t\t\t\t\t(_options$onDrop = _options.onDrop) === null || _options$onDrop === void 0 || _options$onDrop.call(_options, currentFiles, event);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t};\n\t\tuseEventListener(target, \"dragenter\", (event) => handleDragEvent(event, \"enter\"));\n\t\tuseEventListener(target, \"dragover\", (event) => handleDragEvent(event, \"over\"));\n\t\tuseEventListener(target, \"dragleave\", (event) => handleDragEvent(event, \"leave\"));\n\t\tuseEventListener(target, \"drop\", (event) => handleDragEvent(event, \"drop\"));\n\t}\n\treturn {\n\t\tfiles,\n\t\tisOverDropZone\n\t};\n}\n//#endregion\n//#region useResizeObserver/index.ts\n/**\n* Reports changes to the dimensions of an Element's content or the border-box\n*\n* @see https://vueuse.org/useResizeObserver\n* @param target\n* @param callback\n* @param options\n*/\nfunction useResizeObserver(target, callback, options = {}) {\n\tconst { window = defaultWindow, ...observerOptions } = options;\n\tlet observer;\n\tconst isSupported = /* @__PURE__ */ useSupported(() => window && \"ResizeObserver\" in window);\n\tconst cleanup = () => {\n\t\tif (observer) {\n\t\t\tobserver.disconnect();\n\t\t\tobserver = void 0;\n\t\t}\n\t};\n\tconst stopWatch = watch(computed(() => {\n\t\tconst _targets = toValue(target);\n\t\treturn Array.isArray(_targets) ? _targets.map((el) => unrefElement(el)) : [unrefElement(_targets)];\n\t}), (els) => {\n\t\tcleanup();\n\t\tif (isSupported.value && window) {\n\t\t\tobserver = new ResizeObserver(callback);\n\t\t\tfor (const _el of els) if (_el) observer.observe(_el, observerOptions);\n\t\t}\n\t}, {\n\t\timmediate: true,\n\t\tflush: \"post\"\n\t});\n\tconst stop = () => {\n\t\tcleanup();\n\t\tstopWatch();\n\t};\n\ttryOnScopeDispose(stop);\n\treturn {\n\t\tisSupported,\n\t\tstop\n\t};\n}\n//#endregion\n//#region useElementBounding/index.ts\n/**\n* Reactive bounding box of an HTML element.\n*\n* @see https://vueuse.org/useElementBounding\n* @param target\n*/\nfunction useElementBounding(target, options = {}) {\n\tconst { reset = true, windowResize = true, windowScroll = true, immediate = true, updateTiming = \"sync\" } = options;\n\tconst height = shallowRef(0);\n\tconst bottom = shallowRef(0);\n\tconst left = shallowRef(0);\n\tconst right = shallowRef(0);\n\tconst top = shallowRef(0);\n\tconst width = shallowRef(0);\n\tconst x = shallowRef(0);\n\tconst y = shallowRef(0);\n\tfunction recalculate() {\n\t\tconst el = unrefElement(target);\n\t\tif (!el) {\n\t\t\tif (reset) {\n\t\t\t\theight.value = 0;\n\t\t\t\tbottom.value = 0;\n\t\t\t\tleft.value = 0;\n\t\t\t\tright.value = 0;\n\t\t\t\ttop.value = 0;\n\t\t\t\twidth.value = 0;\n\t\t\t\tx.value = 0;\n\t\t\t\ty.value = 0;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tconst rect = el.getBoundingClientRect();\n\t\theight.value = rect.height;\n\t\tbottom.value = rect.bottom;\n\t\tleft.value = rect.left;\n\t\tright.value = rect.right;\n\t\ttop.value = rect.top;\n\t\twidth.value = rect.width;\n\t\tx.value = rect.x;\n\t\ty.value = rect.y;\n\t}\n\tfunction update() {\n\t\tif (updateTiming === \"sync\") recalculate();\n\t\telse if (updateTiming === \"next-frame\") requestAnimationFrame(() => recalculate());\n\t}\n\tuseResizeObserver(target, update);\n\twatch(() => unrefElement(target), (ele) => !ele && update());\n\tuseMutationObserver(target, update, { attributeFilter: [\"style\", \"class\"] });\n\tif (windowScroll) useEventListener(\"scroll\", update, {\n\t\tcapture: true,\n\t\tpassive: true\n\t});\n\tif (windowResize) useEventListener(\"resize\", update, { passive: true });\n\ttryOnMounted(() => {\n\t\tif (immediate) update();\n\t});\n\treturn {\n\t\theight,\n\t\tbottom,\n\t\tleft,\n\t\tright,\n\t\ttop,\n\t\twidth,\n\t\tx,\n\t\ty,\n\t\tupdate\n\t};\n}\n//#endregion\n//#region useElementByPoint/index.ts\nfunction getDefaultScheduler$7(options) {\n\tif (\"interval\" in options || \"immediate\" in options) {\n\t\tconst { interval = \"requestAnimationFrame\", immediate = true } = options;\n\t\treturn interval === \"requestAnimationFrame\" ? (cb) => useRafFn(cb, { immediate }) : (cb) => useIntervalFn(cb, interval, { immediate });\n\t}\n\treturn useRafFn;\n}\n/**\n* Reactive element by point.\n*\n* @see https://vueuse.org/useElementByPoint\n* @param options - UseElementByPointOptions\n*/\nfunction useElementByPoint(options) {\n\tconst { x, y, document = defaultDocument, multiple, scheduler = getDefaultScheduler$7(options) } = options;\n\tconst isSupported = /* @__PURE__ */ useSupported(() => {\n\t\tif (toValue(multiple)) return document && \"elementsFromPoint\" in document;\n\t\treturn document && \"elementFromPoint\" in document;\n\t});\n\tconst element = shallowRef(null);\n\treturn {\n\t\tisSupported,\n\t\telement,\n\t\t...scheduler(() => {\n\t\t\tvar _document$elementsFro, _document$elementFrom;\n\t\t\telement.value = toValue(multiple) ? (_document$elementsFro = document === null || document === void 0 ? void 0 : document.elementsFromPoint(toValue(x), toValue(y))) !== null && _document$elementsFro !== void 0 ? _document$elementsFro : [] : (_document$elementFrom = document === null || document === void 0 ? void 0 : document.elementFromPoint(toValue(x), toValue(y))) !== null && _document$elementFrom !== void 0 ? _document$elementFrom : null;\n\t\t})\n\t};\n}\n//#endregion\n//#region useElementHover/index.ts\nfunction useElementHover(el, options = {}) {\n\tconst { delayEnter = 0, delayLeave = 0, triggerOnRemoval = false, window = defaultWindow } = options;\n\tconst isHovered = shallowRef(false);\n\tlet timer;\n\tconst toggle = (entering) => {\n\t\tconst delay = entering ? delayEnter : delayLeave;\n\t\tif (timer) {\n\t\t\tclearTimeout(timer);\n\t\t\ttimer = void 0;\n\t\t}\n\t\tif (delay) timer = setTimeout(() => isHovered.value = entering, delay);\n\t\telse isHovered.value = entering;\n\t};\n\tif (!window) return isHovered;\n\tuseEventListener(el, \"mouseenter\", () => toggle(true), { passive: true });\n\tuseEventListener(el, \"mouseleave\", () => toggle(false), { passive: true });\n\tif (triggerOnRemoval) onElementRemoval(computed(() => unrefElement(el)), () => toggle(false));\n\treturn isHovered;\n}\n//#endregion\n//#region useElementSize/index.ts\n/**\n* Reactive size of an HTML element.\n*\n* @see https://vueuse.org/useElementSize\n*/\nfunction useElementSize(target, initialSize = {\n\twidth: 0,\n\theight: 0\n}, options = {}) {\n\tconst { window = defaultWindow, box = \"content-box\" } = options;\n\tconst isSVG = computed(() => {\n\t\tvar _unrefElement;\n\t\treturn (_unrefElement = unrefElement(target)) === null || _unrefElement === void 0 || (_unrefElement = _unrefElement.namespaceURI) === null || _unrefElement === void 0 ? void 0 : _unrefElement.includes(\"svg\");\n\t});\n\tconst width = shallowRef(initialSize.width);\n\tconst height = shallowRef(initialSize.height);\n\tconst { stop: stop1 } = useResizeObserver(target, ([entry]) => {\n\t\tconst boxSize = box === \"border-box\" ? entry.borderBoxSize : box === \"content-box\" ? entry.contentBoxSize : entry.devicePixelContentBoxSize;\n\t\tif (window && isSVG.value) {\n\t\t\tconst $elem = unrefElement(target);\n\t\t\tif ($elem) {\n\t\t\t\tconst rect = $elem.getBoundingClientRect();\n\t\t\t\twidth.value = rect.width;\n\t\t\t\theight.value = rect.height;\n\t\t\t}\n\t\t} else if (boxSize) {\n\t\t\tconst formatBoxSize = toArray(boxSize);\n\t\t\twidth.value = formatBoxSize.reduce((acc, { inlineSize }) => acc + inlineSize, 0);\n\t\t\theight.value = formatBoxSize.reduce((acc, { blockSize }) => acc + blockSize, 0);\n\t\t} else {\n\t\t\twidth.value = entry.contentRect.width;\n\t\t\theight.value = entry.contentRect.height;\n\t\t}\n\t}, options);\n\ttryOnMounted(() => {\n\t\tconst ele = unrefElement(target);\n\t\tif (ele) {\n\t\t\twidth.value = \"offsetWidth\" in ele ? ele.offsetWidth : initialSize.width;\n\t\t\theight.value = \"offsetHeight\" in ele ? ele.offsetHeight : initialSize.height;\n\t\t}\n\t});\n\tconst stop2 = watch(() => unrefElement(target), (ele) => {\n\t\twidth.value = ele ? initialSize.width : 0;\n\t\theight.value = ele ? initialSize.height : 0;\n\t});\n\tfunction stop() {\n\t\tstop1();\n\t\tstop2();\n\t}\n\treturn {\n\t\twidth,\n\t\theight,\n\t\tstop\n\t};\n}\n//#endregion\n//#region useIntersectionObserver/index.ts\n/**\n* Detects changes to a target element's visibility.\n*\n* @see https://vueuse.org/useIntersectionObserver\n* @param target\n* @param callback\n* @param options\n*/\nfunction useIntersectionObserver(target, callback, options = {}) {\n\tconst { root, rootMargin, threshold = 0, window = defaultWindow, immediate = true } = options;\n\tconst isSupported = /* @__PURE__ */ useSupported(() => window && \"IntersectionObserver\" in window);\n\tconst targets = computed(() => {\n\t\treturn toArray(toValue(target)).map(unrefElement).filter(notNullish);\n\t});\n\tlet cleanup = noop;\n\tconst isActive = shallowRef(immediate);\n\tconst stopWatch = isSupported.value ? watch(() => [\n\t\ttargets.value,\n\t\tunrefElement(root),\n\t\ttoValue(rootMargin),\n\t\tisActive.value\n\t], ([targets, root, rootMargin]) => {\n\t\tcleanup();\n\t\tif (!isActive.value) return;\n\t\tif (!targets.length) return;\n\t\tconst observer = new IntersectionObserver(callback, {\n\t\t\troot: unrefElement(root),\n\t\t\trootMargin,\n\t\t\tthreshold\n\t\t});\n\t\ttargets.forEach((el) => el && observer.observe(el));\n\t\tcleanup = () => {\n\t\t\tobserver.disconnect();\n\t\t\tcleanup = noop;\n\t\t};\n\t}, {\n\t\timmediate,\n\t\tflush: \"post\"\n\t}) : noop;\n\tconst stop = () => {\n\t\tcleanup();\n\t\tstopWatch();\n\t\tisActive.value = false;\n\t};\n\ttryOnScopeDispose(stop);\n\treturn {\n\t\tisSupported,\n\t\tisActive,\n\t\tpause() {\n\t\t\tcleanup();\n\t\t\tisActive.value = false;\n\t\t},\n\t\tresume() {\n\t\t\tisActive.value = true;\n\t\t},\n\t\tstop\n\t};\n}\n//#endregion\n//#region useElementVisibility/index.ts\nfunction useElementVisibility(element, options = {}) {\n\tconst { window = defaultWindow, scrollTarget, threshold = 0, rootMargin, once = false, initialValue = false } = options;\n\tconst isVisible = shallowRef(initialValue);\n\tconst observerController = useIntersectionObserver(element, (intersectionObserverEntries) => {\n\t\tlet isIntersecting = isVisible.value;\n\t\tlet latestTime = 0;\n\t\tfor (const entry of intersectionObserverEntries) if (entry.time >= latestTime) {\n\t\t\tlatestTime = entry.time;\n\t\t\tisIntersecting = entry.isIntersecting;\n\t\t}\n\t\tisVisible.value = isIntersecting;\n\t\tif (once) watchOnce(isVisible, () => {\n\t\t\tobserverController.stop();\n\t\t});\n\t}, {\n\t\troot: scrollTarget,\n\t\twindow,\n\t\tthreshold,\n\t\trootMargin\n\t});\n\treturn options.controls ? {\n\t\t...observerController,\n\t\tisVisible\n\t} : isVisible;\n}\n//#endregion\n//#region useEventBus/internal.ts\n/* #__PURE__ */\nconst events = /* @__PURE__ */ new Map();\n//#endregion\n//#region useEventBus/index.ts\n/* @__NO_SIDE_EFFECTS__ */\nfunction useEventBus(key) {\n\tconst scope = getCurrentScope();\n\tfunction on(listener) {\n\t\tvar _scope$cleanups;\n\t\tconst listeners = events.get(key) || /* @__PURE__ */ new Set();\n\t\tlisteners.add(listener);\n\t\tevents.set(key, listeners);\n\t\tconst _off = () => off(listener);\n\t\tscope === null || scope === void 0 || (_scope$cleanups = scope.cleanups) === null || _scope$cleanups === void 0 || _scope$cleanups.push(_off);\n\t\treturn _off;\n\t}\n\tfunction once(listener) {\n\t\tfunction _listener(...args) {\n\t\t\toff(_listener);\n\t\t\tlistener(...args);\n\t\t}\n\t\treturn on(_listener);\n\t}\n\tfunction off(listener) {\n\t\tconst listeners = events.get(key);\n\t\tif (!listeners) return;\n\t\tlisteners.delete(listener);\n\t\tif (!listeners.size) reset();\n\t}\n\tfunction reset() {\n\t\tevents.delete(key);\n\t}\n\tfunction emit(event, payload) {\n\t\tvar _events$get;\n\t\t(_events$get = events.get(key)) === null || _events$get === void 0 || _events$get.forEach((v) => v(event, payload));\n\t}\n\treturn {\n\t\ton,\n\t\tonce,\n\t\toff,\n\t\temit,\n\t\treset\n\t};\n}\n//#endregion\n//#region useEventSource/index.ts\nfunction resolveNestedOptions$1(options) {\n\tif (options === true) return {};\n\treturn options;\n}\n/**\n* Reactive wrapper for EventSource.\n*\n* @see https://vueuse.org/useEventSource\n* @see https://developer.mozilla.org/en-US/docs/Web/API/EventSource/EventSource EventSource\n* @param url\n* @param events\n* @param options\n*/\nfunction useEventSource(url, events = [], options = {}) {\n\tconst event = shallowRef(null);\n\tconst data = shallowRef(null);\n\tconst status = shallowRef(\"CONNECTING\");\n\tconst eventSource = shallowRef(null);\n\tconst error = shallowRef(null);\n\tconst urlRef = toRef(url);\n\tconst lastEventId = shallowRef(null);\n\tlet explicitlyClosed = false;\n\tlet retried = 0;\n\tconst { withCredentials = false, immediate = true, autoConnect = true, autoReconnect, serializer = { read: (v) => v } } = options;\n\tconst close = () => {\n\t\tif (isClient && eventSource.value) {\n\t\t\teventSource.value.close();\n\t\t\teventSource.value = null;\n\t\t\tstatus.value = \"CLOSED\";\n\t\t\texplicitlyClosed = true;\n\t\t}\n\t};\n\tconst _init = () => {\n\t\tif (explicitlyClosed || typeof urlRef.value === \"undefined\") return;\n\t\tconst es = new EventSource(urlRef.value, { withCredentials });\n\t\tstatus.value = \"CONNECTING\";\n\t\teventSource.value = es;\n\t\tes.onopen = () => {\n\t\t\tstatus.value = \"OPEN\";\n\t\t\terror.value = null;\n\t\t};\n\t\tes.onerror = (e) => {\n\t\t\tstatus.value = \"CLOSED\";\n\t\t\terror.value = e;\n\t\t\tif (es.readyState === 2 && !explicitlyClosed && autoReconnect) {\n\t\t\t\tes.close();\n\t\t\t\tconst { retries = -1, delay = 1e3, onFailed } = resolveNestedOptions$1(autoReconnect);\n\t\t\t\tretried += 1;\n\t\t\t\tif (typeof retries === \"number\" && (retries < 0 || retried < retries)) setTimeout(_init, delay);\n\t\t\t\telse if (typeof retries === \"function\" && retries()) setTimeout(_init, delay);\n\t\t\t\telse onFailed === null || onFailed === void 0 || onFailed();\n\t\t\t}\n\t\t};\n\t\tes.onmessage = (e) => {\n\t\t\tvar _serializer$read;\n\t\t\tevent.value = null;\n\t\t\tdata.value = (_serializer$read = serializer.read(e.data)) !== null && _serializer$read !== void 0 ? _serializer$read : null;\n\t\t\tlastEventId.value = e.lastEventId;\n\t\t};\n\t\tfor (const event_name of events) useEventListener(es, event_name, (e) => {\n\t\t\tvar _serializer$read2, _e$lastEventId;\n\t\t\tevent.value = event_name;\n\t\t\tdata.value = (_serializer$read2 = serializer.read(e.data)) !== null && _serializer$read2 !== void 0 ? _serializer$read2 : null;\n\t\t\tlastEventId.value = (_e$lastEventId = e.lastEventId) !== null && _e$lastEventId !== void 0 ? _e$lastEventId : null;\n\t\t}, { passive: true });\n\t};\n\tconst open = () => {\n\t\tif (!isClient) return;\n\t\tclose();\n\t\texplicitlyClosed = false;\n\t\tretried = 0;\n\t\t_init();\n\t};\n\tif (immediate) open();\n\tif (autoConnect) watch(urlRef, open);\n\ttryOnScopeDispose(close);\n\treturn {\n\t\teventSource,\n\t\tevent,\n\t\tdata,\n\t\tstatus,\n\t\terror,\n\t\topen,\n\t\tclose,\n\t\tlastEventId\n\t};\n}\n//#endregion\n//#region useEyeDropper/index.ts\n/**\n* Reactive [EyeDropper API](https://developer.mozilla.org/en-US/docs/Web/API/EyeDropper_API)\n*\n* @see https://vueuse.org/useEyeDropper\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction useEyeDropper(options = {}) {\n\tconst { initialValue = \"\" } = options;\n\tconst isSupported = /* @__PURE__ */ useSupported(() => typeof window !== \"undefined\" && \"EyeDropper\" in window);\n\tconst sRGBHex = shallowRef(initialValue);\n\tasync function open(openOptions) {\n\t\tif (!isSupported.value) return;\n\t\tconst result = await new window.EyeDropper().open(openOptions);\n\t\tsRGBHex.value = result.sRGBHex;\n\t\treturn result;\n\t}\n\treturn {\n\t\tisSupported,\n\t\tsRGBHex,\n\t\topen\n\t};\n}\n//#endregion\n//#region useFavicon/index.ts\nfunction useFavicon(newIcon = null, options = {}) {\n\tconst { baseUrl = \"\", rel = \"icon\", document = defaultDocument } = options;\n\tconst favicon = toRef(newIcon);\n\tconst applyIcon = (icon) => {\n\t\tconst elements = document === null || document === void 0 ? void 0 : document.head.querySelectorAll(`link[rel*=\"${rel}\"]`);\n\t\tif (!elements || elements.length === 0) {\n\t\t\tconst link = document === null || document === void 0 ? void 0 : document.createElement(\"link\");\n\t\t\tif (link) {\n\t\t\t\tlink.rel = rel;\n\t\t\t\tlink.href = `${baseUrl}${icon}`;\n\t\t\t\tlink.type = `image/${icon.split(\".\").pop()}`;\n\t\t\t\tdocument === null || document === void 0 || document.head.append(link);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\telements === null || elements === void 0 || elements.forEach((el) => el.href = `${baseUrl}${icon}`);\n\t};\n\twatch(favicon, (i, o) => {\n\t\tif (typeof i === \"string\" && i !== o) applyIcon(i);\n\t}, { immediate: true });\n\treturn favicon;\n}\n//#endregion\n//#region useFetch/index.ts\nconst payloadMapping = {\n\tjson: \"application/json\",\n\ttext: \"text/plain\"\n};\n/**\n* !!!IMPORTANT!!!\n*\n* If you update the UseFetchOptions interface, be sure to update this object\n* to include the new options\n*/\nfunction isFetchOptions(obj) {\n\treturn obj && containsProp(obj, \"immediate\", \"refetch\", \"initialData\", \"timeout\", \"beforeFetch\", \"afterFetch\", \"onFetchError\", \"fetch\", \"updateDataOnError\");\n}\nconst reAbsolute = /^(?:[a-z][a-z\\d+\\-.]*:)?\\/\\//i;\nfunction isAbsoluteURL(url) {\n\treturn reAbsolute.test(url);\n}\nfunction headersToObject(headers) {\n\tif (typeof Headers !== \"undefined\" && headers instanceof Headers) return Object.fromEntries(headers.entries());\n\treturn headers;\n}\nfunction combineCallbacks(combination, ...callbacks) {\n\tif (combination === \"overwrite\") return async (ctx) => {\n\t\tlet callback;\n\t\tfor (let i = callbacks.length - 1; i >= 0; i--) if (callbacks[i] != null) {\n\t\t\tcallback = callbacks[i];\n\t\t\tbreak;\n\t\t}\n\t\tif (callback) return {\n\t\t\t...ctx,\n\t\t\t...await callback(ctx)\n\t\t};\n\t\treturn ctx;\n\t};\n\telse return async (ctx) => {\n\t\tfor (const callback of callbacks) if (callback) ctx = {\n\t\t\t...ctx,\n\t\t\t...await callback(ctx)\n\t\t};\n\t\treturn ctx;\n\t};\n}\nfunction createFetch(config = {}) {\n\tconst _combination = config.combination || \"chain\";\n\tconst _options = config.options || {};\n\tconst _fetchOptions = config.fetchOptions || {};\n\tfunction useFactoryFetch(url, ...args) {\n\t\tconst computedUrl = computed(() => {\n\t\t\tconst baseUrl = toValue(config.baseUrl);\n\t\t\tconst targetUrl = toValue(url);\n\t\t\treturn baseUrl && !isAbsoluteURL(targetUrl) ? joinPaths(baseUrl, targetUrl) : targetUrl;\n\t\t});\n\t\tlet options = _options;\n\t\tlet fetchOptions = _fetchOptions;\n\t\tif (args.length > 0) if (isFetchOptions(args[0])) options = {\n\t\t\t...options,\n\t\t\t...args[0],\n\t\t\tbeforeFetch: combineCallbacks(_combination, _options.beforeFetch, args[0].beforeFetch),\n\t\t\tafterFetch: combineCallbacks(_combination, _options.afterFetch, args[0].afterFetch),\n\t\t\tonFetchError: combineCallbacks(_combination, _options.onFetchError, args[0].onFetchError)\n\t\t};\n\t\telse fetchOptions = {\n\t\t\t...fetchOptions,\n\t\t\t...args[0],\n\t\t\theaders: {\n\t\t\t\t...headersToObject(fetchOptions.headers) || {},\n\t\t\t\t...headersToObject(args[0].headers) || {}\n\t\t\t}\n\t\t};\n\t\tif (args.length > 1 && isFetchOptions(args[1])) options = {\n\t\t\t...options,\n\t\t\t...args[1],\n\t\t\tbeforeFetch: combineCallbacks(_combination, _options.beforeFetch, args[1].beforeFetch),\n\t\t\tafterFetch: combineCallbacks(_combination, _options.afterFetch, args[1].afterFetch),\n\t\t\tonFetchError: combineCallbacks(_combination, _options.onFetchError, args[1].onFetchError)\n\t\t};\n\t\treturn useFetch(computedUrl, fetchOptions, options);\n\t}\n\treturn useFactoryFetch;\n}\nfunction useFetch(url, ...args) {\n\tvar _defaultWindow$fetch, _globalThis;\n\tconst supportsAbort = typeof AbortController === \"function\";\n\tlet fetchOptions = {};\n\tlet options = {\n\t\timmediate: true,\n\t\trefetch: false,\n\t\ttimeout: 0,\n\t\tupdateDataOnError: false\n\t};\n\tconst config = {\n\t\tmethod: \"GET\",\n\t\ttype: \"text\",\n\t\tpayload: void 0\n\t};\n\tif (args.length > 0) if (isFetchOptions(args[0])) options = {\n\t\t...options,\n\t\t...args[0]\n\t};\n\telse fetchOptions = args[0];\n\tif (args.length > 1) {\n\t\tif (isFetchOptions(args[1])) options = {\n\t\t\t...options,\n\t\t\t...args[1]\n\t\t};\n\t}\n\tconst { fetch = (_defaultWindow$fetch = defaultWindow === null || defaultWindow === void 0 ? void 0 : defaultWindow.fetch) !== null && _defaultWindow$fetch !== void 0 ? _defaultWindow$fetch : (_globalThis = globalThis) === null || _globalThis === void 0 ? void 0 : _globalThis.fetch, initialData, timeout } = options;\n\tconst responseEvent = createEventHook();\n\tconst errorEvent = createEventHook();\n\tconst finallyEvent = createEventHook();\n\tconst isFinished = shallowRef(false);\n\tconst isFetching = shallowRef(false);\n\tconst aborted = shallowRef(false);\n\tconst statusCode = shallowRef(null);\n\tconst response = shallowRef(null);\n\tconst error = shallowRef(null);\n\tconst data = shallowRef(initialData || null);\n\tconst canAbort = computed(() => supportsAbort && isFetching.value);\n\tlet controller;\n\tlet timer;\n\tconst abort = (reason) => {\n\t\tif (supportsAbort) {\n\t\t\tcontroller === null || controller === void 0 || controller.abort(reason);\n\t\t\tcontroller = new AbortController();\n\t\t\tcontroller.signal.onabort = () => aborted.value = true;\n\t\t\tfetchOptions = {\n\t\t\t\t...fetchOptions,\n\t\t\t\tsignal: controller.signal\n\t\t\t};\n\t\t}\n\t};\n\tconst loading = (isLoading) => {\n\t\tisFetching.value = isLoading;\n\t\tisFinished.value = !isLoading;\n\t};\n\tif (timeout) timer = useTimeoutFn(abort, timeout, { immediate: false });\n\tlet executeCounter = 0;\n\tconst execute = async (throwOnFailed = false) => {\n\t\tvar _context$options;\n\t\tabort();\n\t\tloading(true);\n\t\terror.value = null;\n\t\tstatusCode.value = null;\n\t\taborted.value = false;\n\t\texecuteCounter += 1;\n\t\tconst currentExecuteCounter = executeCounter;\n\t\tconst defaultFetchOptions = {\n\t\t\tmethod: config.method,\n\t\t\theaders: {}\n\t\t};\n\t\tconst payload = toValue(config.payload);\n\t\tif (payload) {\n\t\t\tvar _payloadMapping$confi;\n\t\t\tconst headers = headersToObject(defaultFetchOptions.headers);\n\t\t\tconst proto = Object.getPrototypeOf(payload);\n\t\t\tif (!config.payloadType && payload && (proto === Object.prototype || Array.isArray(proto)) && !(payload instanceof FormData)) config.payloadType = \"json\";\n\t\t\tif (config.payloadType) headers[\"Content-Type\"] = (_payloadMapping$confi = payloadMapping[config.payloadType]) !== null && _payloadMapping$confi !== void 0 ? _payloadMapping$confi : config.payloadType;\n\t\t\tdefaultFetchOptions.body = config.payloadType === \"json\" ? JSON.stringify(payload) : payload;\n\t\t}\n\t\tlet isCanceled = false;\n\t\tconst context = {\n\t\t\turl: toValue(url),\n\t\t\toptions: {\n\t\t\t\t...defaultFetchOptions,\n\t\t\t\t...fetchOptions\n\t\t\t},\n\t\t\tcancel: () => {\n\t\t\t\tisCanceled = true;\n\t\t\t}\n\t\t};\n\t\tif (options.beforeFetch) Object.assign(context, await options.beforeFetch(context));\n\t\tif (isCanceled || !fetch) {\n\t\t\tloading(false);\n\t\t\treturn Promise.resolve(null);\n\t\t}\n\t\tlet responseData = null;\n\t\tif (timer) timer.start();\n\t\treturn fetch(context.url, {\n\t\t\t...defaultFetchOptions,\n\t\t\t...context.options,\n\t\t\theaders: {\n\t\t\t\t...headersToObject(defaultFetchOptions.headers),\n\t\t\t\t...headersToObject((_context$options = context.options) === null || _context$options === void 0 ? void 0 : _context$options.headers)\n\t\t\t}\n\t\t}).then(async (fetchResponse) => {\n\t\t\tresponse.value = fetchResponse;\n\t\t\tstatusCode.value = fetchResponse.status;\n\t\t\tresponseData = await fetchResponse.clone()[config.type]();\n\t\t\tif (!fetchResponse.ok) {\n\t\t\t\tdata.value = initialData || null;\n\t\t\t\tthrow new Error(fetchResponse.statusText);\n\t\t\t}\n\t\t\tif (options.afterFetch) ({data: responseData} = await options.afterFetch({\n\t\t\t\tdata: responseData,\n\t\t\t\tresponse: fetchResponse,\n\t\t\t\tcontext,\n\t\t\t\texecute\n\t\t\t}));\n\t\t\tdata.value = responseData;\n\t\t\tresponseEvent.trigger(fetchResponse);\n\t\t\treturn fetchResponse;\n\t\t}).catch(async (fetchError) => {\n\t\t\tlet errorData = fetchError.message || fetchError.name;\n\t\t\tif (options.onFetchError) ({error: errorData, data: responseData} = await options.onFetchError({\n\t\t\t\tdata: responseData,\n\t\t\t\terror: fetchError,\n\t\t\t\tresponse: response.value,\n\t\t\t\tcontext,\n\t\t\t\texecute\n\t\t\t}));\n\t\t\terror.value = errorData;\n\t\t\tif (options.updateDataOnError) data.value = responseData;\n\t\t\terrorEvent.trigger(fetchError);\n\t\t\tif (throwOnFailed) throw fetchError;\n\t\t\treturn null;\n\t\t}).finally(() => {\n\t\t\tif (currentExecuteCounter === executeCounter) loading(false);\n\t\t\tif (timer) timer.stop();\n\t\t\tfinallyEvent.trigger(null);\n\t\t});\n\t};\n\tconst refetch = toRef(options.refetch);\n\twatch([refetch, toRef(url)], ([refetch]) => refetch && execute(), { deep: true });\n\tconst shell = {\n\t\tisFinished: shallowReadonly(isFinished),\n\t\tisFetching: shallowReadonly(isFetching),\n\t\tstatusCode,\n\t\tresponse,\n\t\terror,\n\t\tdata,\n\t\tcanAbort,\n\t\taborted,\n\t\tabort,\n\t\texecute,\n\t\tonFetchResponse: responseEvent.on,\n\t\tonFetchError: errorEvent.on,\n\t\tonFetchFinally: finallyEvent.on,\n\t\tget: setMethod(\"GET\"),\n\t\tput: setMethod(\"PUT\"),\n\t\tpost: setMethod(\"POST\"),\n\t\tdelete: setMethod(\"DELETE\"),\n\t\tpatch: setMethod(\"PATCH\"),\n\t\thead: setMethod(\"HEAD\"),\n\t\toptions: setMethod(\"OPTIONS\"),\n\t\tjson: setType(\"json\"),\n\t\ttext: setType(\"text\"),\n\t\tblob: setType(\"blob\"),\n\t\tarrayBuffer: setType(\"arrayBuffer\"),\n\t\tformData: setType(\"formData\")\n\t};\n\tfunction setMethod(method) {\n\t\treturn (payload, payloadType) => {\n\t\t\tif (!isFetching.value) {\n\t\t\t\tconfig.method = method;\n\t\t\t\tconfig.payload = payload;\n\t\t\t\tconfig.payloadType = payloadType;\n\t\t\t\tif (isRef(config.payload)) watch([refetch, toRef(config.payload)], ([refetch]) => refetch && execute(), { deep: true });\n\t\t\t\treturn {\n\t\t\t\t\t...shell,\n\t\t\t\t\tthen(onFulfilled, onRejected) {\n\t\t\t\t\t\treturn waitUntilFinished().then(onFulfilled, onRejected);\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t}\n\t\t};\n\t}\n\tfunction waitUntilFinished() {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tuntil(isFinished).toBe(true).then(() => resolve(shell)).catch(reject);\n\t\t});\n\t}\n\tfunction setType(type) {\n\t\treturn () => {\n\t\t\tif (!isFetching.value) {\n\t\t\t\tconfig.type = type;\n\t\t\t\treturn {\n\t\t\t\t\t...shell,\n\t\t\t\t\tthen(onFulfilled, onRejected) {\n\t\t\t\t\t\treturn waitUntilFinished().then(onFulfilled, onRejected);\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t}\n\t\t};\n\t}\n\tif (options.immediate) Promise.resolve().then(() => execute());\n\treturn {\n\t\t...shell,\n\t\tthen(onFulfilled, onRejected) {\n\t\t\treturn waitUntilFinished().then(onFulfilled, onRejected);\n\t\t}\n\t};\n}\nfunction joinPaths(start, end) {\n\tif (!start.endsWith(\"/\") && !end.startsWith(\"/\")) return `${start}/${end}`;\n\tif (start.endsWith(\"/\") && end.startsWith(\"/\")) return `${start.slice(0, -1)}${end}`;\n\treturn `${start}${end}`;\n}\n//#endregion\n//#region useFileDialog/index.ts\nconst DEFAULT_OPTIONS = {\n\tmultiple: true,\n\taccept: \"*\",\n\treset: false,\n\tdirectory: false\n};\nfunction prepareInitialFiles(files) {\n\tif (!files) return null;\n\tif (files instanceof FileList) return files;\n\tconst dt = new DataTransfer();\n\tfor (const file of files) dt.items.add(file);\n\treturn dt.files;\n}\n/**\n* Open file dialog with ease.\n*\n* @see https://vueuse.org/useFileDialog\n* @param options\n*/\nfunction useFileDialog(options = {}) {\n\tconst { document = defaultDocument } = options;\n\tconst files = ref(prepareInitialFiles(options.initialFiles));\n\tconst { on: onChange, trigger: changeTrigger } = createEventHook();\n\tconst { on: onCancel, trigger: cancelTrigger } = createEventHook();\n\tconst inputRef = computed(() => {\n\t\tvar _unrefElement;\n\t\tconst input = (_unrefElement = unrefElement(options.input)) !== null && _unrefElement !== void 0 ? _unrefElement : document ? document.createElement(\"input\") : void 0;\n\t\tif (input) {\n\t\t\tinput.type = \"file\";\n\t\t\tinput.onchange = (event) => {\n\t\t\t\tfiles.value = event.target.files;\n\t\t\t\tchangeTrigger(files.value);\n\t\t\t};\n\t\t\tinput.oncancel = () => {\n\t\t\t\tcancelTrigger();\n\t\t\t};\n\t\t}\n\t\treturn input;\n\t});\n\tconst reset = () => {\n\t\tfiles.value = null;\n\t\tif (inputRef.value && inputRef.value.value) {\n\t\t\tinputRef.value.value = \"\";\n\t\t\tchangeTrigger(null);\n\t\t}\n\t};\n\tconst applyOptions = (options) => {\n\t\tconst el = inputRef.value;\n\t\tif (!el) return;\n\t\tel.multiple = toValue(options.multiple);\n\t\tel.accept = toValue(options.accept);\n\t\tel.webkitdirectory = toValue(options.directory);\n\t\tif (hasOwn(options, \"capture\")) el.capture = toValue(options.capture);\n\t};\n\tconst open = (localOptions) => {\n\t\tconst el = inputRef.value;\n\t\tif (!el) return;\n\t\tconst mergedOptions = {\n\t\t\t...DEFAULT_OPTIONS,\n\t\t\t...options,\n\t\t\t...localOptions\n\t\t};\n\t\tapplyOptions(mergedOptions);\n\t\tif (toValue(mergedOptions.reset)) reset();\n\t\tel.click();\n\t};\n\twatchEffect(() => {\n\t\tapplyOptions(options);\n\t});\n\treturn {\n\t\tfiles: readonly(files),\n\t\topen,\n\t\treset,\n\t\tonCancel,\n\t\tonChange\n\t};\n}\n//#endregion\n//#region useFileSystemAccess/index.ts\nfunction useFileSystemAccess(options = {}) {\n\tconst { window: _window = defaultWindow, dataType = \"Text\" } = options;\n\tconst window = _window;\n\tconst isSupported = /* @__PURE__ */ useSupported(() => window && \"showSaveFilePicker\" in window && \"showOpenFilePicker\" in window);\n\tconst fileHandle = shallowRef();\n\tconst data = shallowRef();\n\tconst file = shallowRef();\n\tconst fileName = computed(() => {\n\t\tvar _file$value$name, _file$value;\n\t\treturn (_file$value$name = (_file$value = file.value) === null || _file$value === void 0 ? void 0 : _file$value.name) !== null && _file$value$name !== void 0 ? _file$value$name : \"\";\n\t});\n\tconst fileMIME = computed(() => {\n\t\tvar _file$value$type, _file$value2;\n\t\treturn (_file$value$type = (_file$value2 = file.value) === null || _file$value2 === void 0 ? void 0 : _file$value2.type) !== null && _file$value$type !== void 0 ? _file$value$type : \"\";\n\t});\n\tconst fileSize = computed(() => {\n\t\tvar _file$value$size, _file$value3;\n\t\treturn (_file$value$size = (_file$value3 = file.value) === null || _file$value3 === void 0 ? void 0 : _file$value3.size) !== null && _file$value$size !== void 0 ? _file$value$size : 0;\n\t});\n\tconst fileLastModified = computed(() => {\n\t\tvar _file$value$lastModif, _file$value4;\n\t\treturn (_file$value$lastModif = (_file$value4 = file.value) === null || _file$value4 === void 0 ? void 0 : _file$value4.lastModified) !== null && _file$value$lastModif !== void 0 ? _file$value$lastModif : 0;\n\t});\n\tasync function open(_options = {}) {\n\t\tif (!isSupported.value) return;\n\t\tconst [handle] = await window.showOpenFilePicker({\n\t\t\t...toValue(options),\n\t\t\t..._options\n\t\t});\n\t\tfileHandle.value = handle;\n\t\tawait updateData();\n\t}\n\tasync function create(_options = {}) {\n\t\tif (!isSupported.value) return;\n\t\tfileHandle.value = await window.showSaveFilePicker({\n\t\t\t...options,\n\t\t\t..._options\n\t\t});\n\t\tdata.value = void 0;\n\t\tawait updateData();\n\t}\n\tasync function save(_options = {}) {\n\t\tif (!isSupported.value) return;\n\t\tif (!fileHandle.value) return saveAs(_options);\n\t\tif (data.value) {\n\t\t\tconst writableStream = await fileHandle.value.createWritable();\n\t\t\tawait writableStream.write(data.value);\n\t\t\tawait writableStream.close();\n\t\t}\n\t\tawait updateFile();\n\t}\n\tasync function saveAs(_options = {}) {\n\t\tif (!isSupported.value) return;\n\t\tfileHandle.value = await window.showSaveFilePicker({\n\t\t\t...options,\n\t\t\t..._options\n\t\t});\n\t\tif (data.value) {\n\t\t\tconst writableStream = await fileHandle.value.createWritable();\n\t\t\tawait writableStream.write(data.value);\n\t\t\tawait writableStream.close();\n\t\t}\n\t\tawait updateFile();\n\t}\n\tasync function updateFile() {\n\t\tvar _fileHandle$value;\n\t\tfile.value = await ((_fileHandle$value = fileHandle.value) === null || _fileHandle$value === void 0 ? void 0 : _fileHandle$value.getFile());\n\t}\n\tasync function updateData() {\n\t\tvar _file$value5, _file$value6;\n\t\tawait updateFile();\n\t\tconst type = toValue(dataType);\n\t\tif (type === \"Text\") data.value = await ((_file$value5 = file.value) === null || _file$value5 === void 0 ? void 0 : _file$value5.text());\n\t\telse if (type === \"ArrayBuffer\") data.value = await ((_file$value6 = file.value) === null || _file$value6 === void 0 ? void 0 : _file$value6.arrayBuffer());\n\t\telse if (type === \"Blob\") data.value = file.value;\n\t}\n\twatch(() => toValue(dataType), updateData);\n\treturn {\n\t\tisSupported,\n\t\tdata,\n\t\tfile,\n\t\tfileName,\n\t\tfileMIME,\n\t\tfileSize,\n\t\tfileLastModified,\n\t\topen,\n\t\tcreate,\n\t\tsave,\n\t\tsaveAs,\n\t\tupdateData\n\t};\n}\n//#endregion\n//#region useFocus/index.ts\n/**\n* Track or set the focus state of a DOM element.\n*\n* @see https://vueuse.org/useFocus\n* @param target The target element for the focus and blur events.\n* @param options\n*/\nfunction useFocus(target, options = {}) {\n\tconst { initialValue = false, focusVisible = false, preventScroll = false } = options;\n\tconst innerFocused = shallowRef(false);\n\tconst targetElement = computed(() => unrefElement(target));\n\tconst listenerOptions = { passive: true };\n\tuseEventListener(targetElement, \"focus\", (event) => {\n\t\tvar _matches, _ref;\n\t\tif (!focusVisible || ((_matches = (_ref = event.target).matches) === null || _matches === void 0 ? void 0 : _matches.call(_ref, \":focus-visible\"))) innerFocused.value = true;\n\t}, listenerOptions);\n\tuseEventListener(targetElement, \"blur\", () => innerFocused.value = false, listenerOptions);\n\tconst focused = computed({\n\t\tget: () => innerFocused.value,\n\t\tset(value) {\n\t\t\tvar _targetElement$value, _targetElement$value2;\n\t\t\tif (!value && innerFocused.value) (_targetElement$value = targetElement.value) === null || _targetElement$value === void 0 || _targetElement$value.blur();\n\t\t\telse if (value && !innerFocused.value) (_targetElement$value2 = targetElement.value) === null || _targetElement$value2 === void 0 || _targetElement$value2.focus({ preventScroll });\n\t\t}\n\t});\n\twatch(targetElement, () => {\n\t\tfocused.value = initialValue;\n\t}, {\n\t\timmediate: true,\n\t\tflush: \"post\"\n\t});\n\treturn { focused };\n}\n//#endregion\n//#region useFocusWithin/index.ts\nconst EVENT_FOCUS_IN = \"focusin\";\nconst EVENT_FOCUS_OUT = \"focusout\";\nconst PSEUDO_CLASS_FOCUS_WITHIN = \":focus-within\";\n/**\n* Track if focus is contained within the target element\n*\n* @see https://vueuse.org/useFocusWithin\n* @param target The target element to track\n* @param options Focus within options\n*/\nfunction useFocusWithin(target, options = {}) {\n\tconst { window = defaultWindow } = options;\n\tconst targetElement = computed(() => unrefElement(target));\n\tconst _focused = shallowRef(false);\n\tconst focused = computed(() => _focused.value);\n\tconst activeElement = useActiveElement(options);\n\tif (!window || !activeElement.value) return { focused };\n\tconst listenerOptions = { passive: true };\n\tuseEventListener(targetElement, EVENT_FOCUS_IN, () => _focused.value = true, listenerOptions);\n\tuseEventListener(targetElement, EVENT_FOCUS_OUT, () => {\n\t\tvar _targetElement$value$, _targetElement$value, _targetElement$value$2;\n\t\treturn _focused.value = (_targetElement$value$ = (_targetElement$value = targetElement.value) === null || _targetElement$value === void 0 || (_targetElement$value$2 = _targetElement$value.matches) === null || _targetElement$value$2 === void 0 ? void 0 : _targetElement$value$2.call(_targetElement$value, PSEUDO_CLASS_FOCUS_WITHIN)) !== null && _targetElement$value$ !== void 0 ? _targetElement$value$ : false;\n\t}, listenerOptions);\n\treturn { focused };\n}\n//#endregion\n//#region useFps/index.ts\n/* @__NO_SIDE_EFFECTS__ */\nfunction useFps(options) {\n\tvar _options$every;\n\tconst fps = shallowRef(0);\n\tif (typeof performance === \"undefined\") return fps;\n\tconst every = (_options$every = options === null || options === void 0 ? void 0 : options.every) !== null && _options$every !== void 0 ? _options$every : 10;\n\tlet last = performance.now();\n\tlet ticks = 0;\n\tuseRafFn(() => {\n\t\tticks += 1;\n\t\tif (ticks >= every) {\n\t\t\tconst now = performance.now();\n\t\t\tconst diff = now - last;\n\t\t\tfps.value = Math.round(1e3 / (diff / ticks));\n\t\t\tlast = now;\n\t\t\tticks = 0;\n\t\t}\n\t});\n\treturn fps;\n}\n//#endregion\n//#region useFullscreen/index.ts\nconst eventHandlers = [\n\t\"fullscreenchange\",\n\t\"webkitfullscreenchange\",\n\t\"webkitendfullscreen\",\n\t\"mozfullscreenchange\",\n\t\"MSFullscreenChange\"\n];\n/**\n* Reactive Fullscreen API.\n*\n* @see https://vueuse.org/useFullscreen\n* @param target\n* @param options\n*/\nfunction useFullscreen(target, options = {}) {\n\tconst { document = defaultDocument, autoExit = false } = options;\n\tconst targetRef = computed(() => {\n\t\tvar _unrefElement;\n\t\treturn (_unrefElement = unrefElement(target)) !== null && _unrefElement !== void 0 ? _unrefElement : document === null || document === void 0 ? void 0 : document.documentElement;\n\t});\n\tconst isFullscreen = shallowRef(false);\n\tconst requestMethod = computed(() => {\n\t\treturn [\n\t\t\t\"requestFullscreen\",\n\t\t\t\"webkitRequestFullscreen\",\n\t\t\t\"webkitEnterFullscreen\",\n\t\t\t\"webkitEnterFullScreen\",\n\t\t\t\"webkitRequestFullScreen\",\n\t\t\t\"mozRequestFullScreen\",\n\t\t\t\"msRequestFullscreen\"\n\t\t].find((m) => document && m in document || targetRef.value && m in targetRef.value);\n\t});\n\tconst exitMethod = computed(() => {\n\t\treturn [\n\t\t\t\"exitFullscreen\",\n\t\t\t\"webkitExitFullscreen\",\n\t\t\t\"webkitExitFullScreen\",\n\t\t\t\"webkitCancelFullScreen\",\n\t\t\t\"mozCancelFullScreen\",\n\t\t\t\"msExitFullscreen\"\n\t\t].find((m) => document && m in document || targetRef.value && m in targetRef.value);\n\t});\n\tconst fullscreenEnabled = computed(() => {\n\t\treturn [\n\t\t\t\"fullScreen\",\n\t\t\t\"webkitIsFullScreen\",\n\t\t\t\"webkitDisplayingFullscreen\",\n\t\t\t\"mozFullScreen\",\n\t\t\t\"msFullscreenElement\"\n\t\t].find((m) => document && m in document || targetRef.value && m in targetRef.value);\n\t});\n\tconst fullscreenElementMethod = [\n\t\t\"fullscreenElement\",\n\t\t\"webkitFullscreenElement\",\n\t\t\"mozFullScreenElement\",\n\t\t\"msFullscreenElement\"\n\t].find((m) => document && m in document);\n\tconst isSupported = /* @__PURE__ */ useSupported(() => targetRef.value && document && requestMethod.value !== void 0 && exitMethod.value !== void 0 && fullscreenEnabled.value !== void 0);\n\tconst isCurrentElementFullScreen = () => {\n\t\tif (fullscreenElementMethod) return (document === null || document === void 0 ? void 0 : document[fullscreenElementMethod]) === targetRef.value;\n\t\treturn false;\n\t};\n\tconst isElementFullScreen = () => {\n\t\tif (fullscreenEnabled.value) if (document && document[fullscreenEnabled.value] != null) return document[fullscreenEnabled.value];\n\t\telse {\n\t\t\tconst target = targetRef.value;\n\t\t\tif ((target === null || target === void 0 ? void 0 : target[fullscreenEnabled.value]) != null) return Boolean(target[fullscreenEnabled.value]);\n\t\t}\n\t\treturn false;\n\t};\n\tasync function exit() {\n\t\tif (!isSupported.value || !isFullscreen.value) return;\n\t\tif (exitMethod.value) if ((document === null || document === void 0 ? void 0 : document[exitMethod.value]) != null) await document[exitMethod.value]();\n\t\telse {\n\t\t\tconst target = targetRef.value;\n\t\t\tif ((target === null || target === void 0 ? void 0 : target[exitMethod.value]) != null) await target[exitMethod.value]();\n\t\t}\n\t\tisFullscreen.value = false;\n\t}\n\tasync function enter() {\n\t\tif (!isSupported.value || isFullscreen.value) return;\n\t\tif (isElementFullScreen()) await exit();\n\t\tconst target = targetRef.value;\n\t\tif (requestMethod.value && (target === null || target === void 0 ? void 0 : target[requestMethod.value]) != null) {\n\t\t\tawait target[requestMethod.value]();\n\t\t\tisFullscreen.value = true;\n\t\t}\n\t}\n\tasync function toggle() {\n\t\tawait (isFullscreen.value ? exit() : enter());\n\t}\n\tconst handlerCallback = () => {\n\t\tconst isElementFullScreenValue = isElementFullScreen();\n\t\tif (!isElementFullScreenValue || isElementFullScreenValue && isCurrentElementFullScreen()) isFullscreen.value = isElementFullScreenValue;\n\t};\n\tconst listenerOptions = {\n\t\tcapture: false,\n\t\tpassive: true\n\t};\n\tuseEventListener(document, eventHandlers, handlerCallback, listenerOptions);\n\tuseEventListener(() => unrefElement(targetRef), eventHandlers, handlerCallback, listenerOptions);\n\ttryOnMounted(handlerCallback, false);\n\tif (autoExit) tryOnScopeDispose(exit);\n\treturn {\n\t\tisSupported,\n\t\tisFullscreen,\n\t\tenter,\n\t\texit,\n\t\ttoggle\n\t};\n}\n//#endregion\n//#region useGamepad/index.ts\n/**\n* Maps a standard standard gamepad to an Xbox 360 Controller.\n*/\nfunction mapGamepadToXbox360Controller(gamepad) {\n\treturn computed(() => {\n\t\tif (gamepad.value) return {\n\t\t\tbuttons: {\n\t\t\t\ta: gamepad.value.buttons[0],\n\t\t\t\tb: gamepad.value.buttons[1],\n\t\t\t\tx: gamepad.value.buttons[2],\n\t\t\t\ty: gamepad.value.buttons[3]\n\t\t\t},\n\t\t\tbumper: {\n\t\t\t\tleft: gamepad.value.buttons[4],\n\t\t\t\tright: gamepad.value.buttons[5]\n\t\t\t},\n\t\t\ttriggers: {\n\t\t\t\tleft: gamepad.value.buttons[6],\n\t\t\t\tright: gamepad.value.buttons[7]\n\t\t\t},\n\t\t\tstick: {\n\t\t\t\tleft: {\n\t\t\t\t\thorizontal: gamepad.value.axes[0],\n\t\t\t\t\tvertical: gamepad.value.axes[1],\n\t\t\t\t\tbutton: gamepad.value.buttons[10]\n\t\t\t\t},\n\t\t\t\tright: {\n\t\t\t\t\thorizontal: gamepad.value.axes[2],\n\t\t\t\t\tvertical: gamepad.value.axes[3],\n\t\t\t\t\tbutton: gamepad.value.buttons[11]\n\t\t\t\t}\n\t\t\t},\n\t\t\tdpad: {\n\t\t\t\tup: gamepad.value.buttons[12],\n\t\t\t\tdown: gamepad.value.buttons[13],\n\t\t\t\tleft: gamepad.value.buttons[14],\n\t\t\t\tright: gamepad.value.buttons[15]\n\t\t\t},\n\t\t\tback: gamepad.value.buttons[8],\n\t\t\tstart: gamepad.value.buttons[9]\n\t\t};\n\t\treturn null;\n\t});\n}\n/* @__NO_SIDE_EFFECTS__ */\nfunction useGamepad(options = {}) {\n\tconst { navigator = defaultNavigator } = options;\n\tconst isSupported = /* @__PURE__ */ useSupported(() => navigator && \"getGamepads\" in navigator);\n\tconst gamepads = ref([]);\n\tconst onConnectedHook = createEventHook();\n\tconst onDisconnectedHook = createEventHook();\n\tconst stateFromGamepad = (gamepad) => {\n\t\tconst hapticActuators = [];\n\t\tconst vibrationActuator = \"vibrationActuator\" in gamepad ? gamepad.vibrationActuator : null;\n\t\tif (vibrationActuator) hapticActuators.push(vibrationActuator);\n\t\tif (gamepad.hapticActuators) hapticActuators.push(...gamepad.hapticActuators);\n\t\treturn {\n\t\t\tid: gamepad.id,\n\t\t\tindex: gamepad.index,\n\t\t\tconnected: gamepad.connected,\n\t\t\tmapping: gamepad.mapping,\n\t\t\ttimestamp: gamepad.timestamp,\n\t\t\tvibrationActuator: gamepad.vibrationActuator,\n\t\t\thapticActuators,\n\t\t\taxes: gamepad.axes.map((axes) => axes),\n\t\t\tbuttons: gamepad.buttons.map((button) => ({\n\t\t\t\tpressed: button.pressed,\n\t\t\t\ttouched: button.touched,\n\t\t\t\tvalue: button.value\n\t\t\t}))\n\t\t};\n\t};\n\tconst updateGamepadState = () => {\n\t\tconst _gamepads = (navigator === null || navigator === void 0 ? void 0 : navigator.getGamepads()) || [];\n\t\tfor (const gamepad of _gamepads) if (gamepad && gamepads.value[gamepad.index]) gamepads.value[gamepad.index] = stateFromGamepad(gamepad);\n\t};\n\tconst { isActive, pause, resume } = useRafFn(updateGamepadState);\n\tconst onGamepadConnected = (gamepad) => {\n\t\tif (!gamepads.value.some(({ index }) => index === gamepad.index)) {\n\t\t\tgamepads.value.push(stateFromGamepad(gamepad));\n\t\t\tonConnectedHook.trigger(gamepad.index);\n\t\t}\n\t\tresume();\n\t};\n\tconst onGamepadDisconnected = (gamepad) => {\n\t\tgamepads.value = gamepads.value.filter((x) => x.index !== gamepad.index);\n\t\tonDisconnectedHook.trigger(gamepad.index);\n\t};\n\tconst listenerOptions = { passive: true };\n\tuseEventListener(\"gamepadconnected\", (e) => onGamepadConnected(e.gamepad), listenerOptions);\n\tuseEventListener(\"gamepaddisconnected\", (e) => onGamepadDisconnected(e.gamepad), listenerOptions);\n\ttryOnMounted(() => {\n\t\tconst _gamepads = (navigator === null || navigator === void 0 ? void 0 : navigator.getGamepads()) || [];\n\t\tfor (const gamepad of _gamepads) if (gamepad && gamepads.value[gamepad.index]) onGamepadConnected(gamepad);\n\t});\n\tpause();\n\treturn {\n\t\tisSupported,\n\t\tonConnected: onConnectedHook.on,\n\t\tonDisconnected: onDisconnectedHook.on,\n\t\tgamepads,\n\t\tpause,\n\t\tresume,\n\t\tisActive\n\t};\n}\n//#endregion\n//#region useGeolocation/index.ts\n/**\n* Reactive Geolocation API.\n*\n* @see https://vueuse.org/useGeolocation\n* @param options\n*/\nfunction useGeolocation(options = {}) {\n\tconst { enableHighAccuracy = true, maximumAge = 3e4, timeout = 27e3, navigator = defaultNavigator, immediate = true } = options;\n\tconst isSupported = /* @__PURE__ */ useSupported(() => navigator && \"geolocation\" in navigator);\n\tconst locatedAt = shallowRef(null);\n\tconst error = shallowRef(null);\n\tconst coords = shallowRef({\n\t\taccuracy: 0,\n\t\tlatitude: Number.POSITIVE_INFINITY,\n\t\tlongitude: Number.POSITIVE_INFINITY,\n\t\taltitude: null,\n\t\taltitudeAccuracy: null,\n\t\theading: null,\n\t\tspeed: null\n\t});\n\tfunction updatePosition(position) {\n\t\tlocatedAt.value = position.timestamp;\n\t\tcoords.value = position.coords;\n\t\terror.value = null;\n\t}\n\tlet watcher;\n\tfunction resume() {\n\t\tif (isSupported.value) watcher = navigator.geolocation.watchPosition(updatePosition, (err) => error.value = err, {\n\t\t\tenableHighAccuracy,\n\t\t\tmaximumAge,\n\t\t\ttimeout\n\t\t});\n\t}\n\tif (immediate) resume();\n\tfunction pause() {\n\t\tif (watcher && navigator) navigator.geolocation.clearWatch(watcher);\n\t}\n\ttryOnScopeDispose(() => {\n\t\tpause();\n\t});\n\treturn {\n\t\tisSupported,\n\t\tcoords,\n\t\tlocatedAt,\n\t\terror,\n\t\tresume,\n\t\tpause\n\t};\n}\n//#endregion\n//#region useIdle/index.ts\nconst defaultEvents$1 = [\n\t\"mousemove\",\n\t\"mousedown\",\n\t\"resize\",\n\t\"keydown\",\n\t\"touchstart\",\n\t\"wheel\"\n];\nconst oneMinute = 6e4;\n/**\n* Tracks whether the user is being inactive.\n*\n* @see https://vueuse.org/useIdle\n* @param timeout default to 1 minute\n* @param options IdleOptions\n*/\nfunction useIdle(timeout = oneMinute, options = {}) {\n\tconst { initialState = false, listenForVisibilityChange = true, events = defaultEvents$1, window = defaultWindow, eventFilter = throttleFilter(50) } = options;\n\tconst idle = shallowRef(initialState);\n\tconst lastActive = shallowRef(timestamp());\n\tconst isPending = shallowRef(false);\n\tlet timer;\n\tconst reset = () => {\n\t\tidle.value = false;\n\t\tclearTimeout(timer);\n\t\ttimer = setTimeout(() => idle.value = true, timeout);\n\t};\n\tconst onEvent = createFilterWrapper(eventFilter, () => {\n\t\tlastActive.value = timestamp();\n\t\treset();\n\t});\n\tif (window) {\n\t\tconst document = window.document;\n\t\tconst listenerOptions = { passive: true };\n\t\tfor (const event of events) useEventListener(window, event, () => {\n\t\t\tif (!isPending.value) return;\n\t\t\tonEvent();\n\t\t}, listenerOptions);\n\t\tif (listenForVisibilityChange) useEventListener(document, \"visibilitychange\", () => {\n\t\t\tif (document.hidden || !isPending.value) return;\n\t\t\tonEvent();\n\t\t}, listenerOptions);\n\t\tstart();\n\t}\n\tfunction start() {\n\t\tif (isPending.value) return;\n\t\tisPending.value = true;\n\t\tif (!initialState) reset();\n\t}\n\tfunction stop() {\n\t\tidle.value = initialState;\n\t\tclearTimeout(timer);\n\t\tisPending.value = false;\n\t}\n\treturn {\n\t\tidle,\n\t\tlastActive,\n\t\treset,\n\t\tstop,\n\t\tstart,\n\t\tisPending: shallowReadonly(isPending)\n\t};\n}\n//#endregion\n//#region useImage/index.ts\nasync function loadImage(options) {\n\treturn new Promise((resolve, reject) => {\n\t\tconst img = new Image();\n\t\tconst { src, srcset, sizes, class: clazz, loading, crossorigin, referrerPolicy, width, height, decoding, fetchPriority, ismap, usemap } = options;\n\t\timg.src = src;\n\t\tif (srcset != null) img.srcset = srcset;\n\t\tif (sizes != null) img.sizes = sizes;\n\t\tif (clazz != null) img.className = clazz;\n\t\tif (loading != null) img.loading = loading;\n\t\tif (crossorigin != null) img.crossOrigin = crossorigin;\n\t\tif (referrerPolicy != null) img.referrerPolicy = referrerPolicy;\n\t\tif (width != null) img.width = width;\n\t\tif (height != null) img.height = height;\n\t\tif (decoding != null) img.decoding = decoding;\n\t\tif (fetchPriority != null) img.fetchPriority = fetchPriority;\n\t\tif (ismap != null) img.isMap = ismap;\n\t\tif (usemap != null) img.useMap = usemap;\n\t\timg.onload = () => resolve(img);\n\t\timg.onerror = reject;\n\t});\n}\n/**\n* Reactive load an image in the browser, you can wait the result to display it or show a fallback.\n*\n* @see https://vueuse.org/useImage\n* @param options Image attributes, as used in the <img> tag\n* @param asyncStateOptions\n*/\nfunction useImage(options, asyncStateOptions = {}) {\n\tconst state = useAsyncState(() => loadImage(toValue(options)), void 0, {\n\t\tresetOnExecute: true,\n\t\t...asyncStateOptions\n\t});\n\twatch(() => toValue(options), () => state.execute(asyncStateOptions.delay), { deep: true });\n\treturn state;\n}\n//#endregion\n//#region _resolve-element.ts\n/**\n* Resolves an element from a given element, window, or document.\n*\n* @internal\n*/\nfunction resolveElement(el) {\n\tif (typeof Window !== \"undefined\" && el instanceof Window) return el.document.documentElement;\n\tif (typeof Document !== \"undefined\" && el instanceof Document) return el.documentElement;\n\treturn el;\n}\n//#endregion\n//#region useScroll/index.ts\n/**\n* We have to check if the scroll amount is close enough to some threshold in order to\n* more accurately calculate arrivedState. This is because scrollTop/scrollLeft are non-rounded\n* numbers, while scrollHeight/scrollWidth and clientHeight/clientWidth are rounded.\n* https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollHeight#determine_if_an_element_has_been_totally_scrolled\n*/\nconst ARRIVED_STATE_THRESHOLD_PIXELS = 1;\n/**\n* Reactive scroll.\n*\n* @see https://vueuse.org/useScroll\n* @param element\n* @param options\n*/\nfunction useScroll(element, options = {}) {\n\tconst { throttle = 0, idle = 200, onStop = noop, onScroll = noop, offset = {\n\t\tleft: 0,\n\t\tright: 0,\n\t\ttop: 0,\n\t\tbottom: 0\n\t}, observe: _observe = { mutation: false }, eventListenerOptions = {\n\t\tcapture: false,\n\t\tpassive: true\n\t}, behavior = \"auto\", window = defaultWindow, onError = (e) => {\n\t\tconsole.error(e);\n\t} } = options;\n\tconst observe = typeof _observe === \"boolean\" ? { mutation: _observe } : _observe;\n\tconst internalX = shallowRef(0);\n\tconst internalY = shallowRef(0);\n\tconst x = computed({\n\t\tget() {\n\t\t\treturn internalX.value;\n\t\t},\n\t\tset(x) {\n\t\t\tscrollTo(x, void 0);\n\t\t}\n\t});\n\tconst y = computed({\n\t\tget() {\n\t\t\treturn internalY.value;\n\t\t},\n\t\tset(y) {\n\t\t\tscrollTo(void 0, y);\n\t\t}\n\t});\n\tfunction scrollTo(_x, _y) {\n\t\tvar _ref, _toValue, _toValue2, _document;\n\t\tif (!window) return;\n\t\tconst _element = toValue(element);\n\t\tif (!_element) return;\n\t\t(_ref = _element instanceof Document ? window.document.body : _element) === null || _ref === void 0 || _ref.scrollTo({\n\t\t\ttop: (_toValue = toValue(_y)) !== null && _toValue !== void 0 ? _toValue : y.value,\n\t\t\tleft: (_toValue2 = toValue(_x)) !== null && _toValue2 !== void 0 ? _toValue2 : x.value,\n\t\t\tbehavior: toValue(behavior)\n\t\t});\n\t\tconst scrollContainer = (_element === null || _element === void 0 || (_document = _element.document) === null || _document === void 0 ? void 0 : _document.documentElement) || (_element === null || _element === void 0 ? void 0 : _element.documentElement) || _element;\n\t\tif (x != null) internalX.value = scrollContainer.scrollLeft;\n\t\tif (y != null) internalY.value = scrollContainer.scrollTop;\n\t}\n\tconst isScrolling = shallowRef(false);\n\tconst arrivedState = reactive({\n\t\tleft: true,\n\t\tright: false,\n\t\ttop: true,\n\t\tbottom: false\n\t});\n\tconst directions = reactive({\n\t\tleft: false,\n\t\tright: false,\n\t\ttop: false,\n\t\tbottom: false\n\t});\n\tconst onScrollEnd = (e) => {\n\t\tif (!isScrolling.value) return;\n\t\tisScrolling.value = false;\n\t\tdirections.left = false;\n\t\tdirections.right = false;\n\t\tdirections.top = false;\n\t\tdirections.bottom = false;\n\t\tonStop(e);\n\t};\n\tconst onScrollEndDebounced = useDebounceFn(onScrollEnd, throttle + idle);\n\tconst setArrivedState = (target) => {\n\t\tvar _document2;\n\t\tif (!window) return;\n\t\tconst el = (target === null || target === void 0 || (_document2 = target.document) === null || _document2 === void 0 ? void 0 : _document2.documentElement) || (target === null || target === void 0 ? void 0 : target.documentElement) || unrefElement(target);\n\t\tconst { display, flexDirection, direction } = window.getComputedStyle(el);\n\t\tconst directionMultipler = direction === \"rtl\" ? -1 : 1;\n\t\tconst scrollLeft = el.scrollLeft;\n\t\tdirections.left = scrollLeft < internalX.value;\n\t\tdirections.right = scrollLeft > internalX.value;\n\t\tconst left = Math.abs(scrollLeft * directionMultipler) <= (offset.left || 0);\n\t\tconst right = Math.abs(scrollLeft * directionMultipler) + el.clientWidth >= el.scrollWidth - (offset.right || 0) - ARRIVED_STATE_THRESHOLD_PIXELS;\n\t\tif (display === \"flex\" && flexDirection === \"row-reverse\") {\n\t\t\tarrivedState.left = right;\n\t\t\tarrivedState.right = left;\n\t\t} else {\n\t\t\tarrivedState.left = left;\n\t\t\tarrivedState.right = right;\n\t\t}\n\t\tinternalX.value = scrollLeft;\n\t\tlet scrollTop = el.scrollTop;\n\t\tif (target === window.document && !scrollTop) scrollTop = window.document.body.scrollTop;\n\t\tdirections.top = scrollTop < internalY.value;\n\t\tdirections.bottom = scrollTop > internalY.value;\n\t\tconst top = Math.abs(scrollTop) <= (offset.top || 0);\n\t\tconst bottom = Math.abs(scrollTop) + el.clientHeight >= el.scrollHeight - (offset.bottom || 0) - ARRIVED_STATE_THRESHOLD_PIXELS;\n\t\t/**\n\t\t* reverse columns and rows behave exactly the other way around,\n\t\t* bottom is treated as top and top is treated as the negative version of bottom\n\t\t*/\n\t\tif (display === \"flex\" && flexDirection === \"column-reverse\") {\n\t\t\tarrivedState.top = bottom;\n\t\t\tarrivedState.bottom = top;\n\t\t} else {\n\t\t\tarrivedState.top = top;\n\t\t\tarrivedState.bottom = bottom;\n\t\t}\n\t\tinternalY.value = scrollTop;\n\t};\n\tconst onScrollHandler = (e) => {\n\t\tvar _documentElement;\n\t\tif (!window) return;\n\t\tsetArrivedState((_documentElement = e.target.documentElement) !== null && _documentElement !== void 0 ? _documentElement : e.target);\n\t\tisScrolling.value = true;\n\t\tonScrollEndDebounced(e);\n\t\tonScroll(e);\n\t};\n\tuseEventListener(element, \"scroll\", throttle ? useThrottleFn(onScrollHandler, throttle, true, false) : onScrollHandler, eventListenerOptions);\n\ttryOnMounted(() => {\n\t\ttry {\n\t\t\tconst _element = toValue(element);\n\t\t\tif (!_element) return;\n\t\t\tsetArrivedState(_element);\n\t\t} catch (e) {\n\t\t\tonError(e);\n\t\t}\n\t});\n\tif ((observe === null || observe === void 0 ? void 0 : observe.mutation) && element != null && element !== window && element !== document) useMutationObserver(element, () => {\n\t\tconst _element = toValue(element);\n\t\tif (!_element) return;\n\t\tsetArrivedState(_element);\n\t}, {\n\t\tattributes: true,\n\t\tchildList: true,\n\t\tsubtree: true\n\t});\n\tuseEventListener(element, \"scrollend\", onScrollEnd, eventListenerOptions);\n\treturn {\n\t\tx,\n\t\ty,\n\t\tisScrolling,\n\t\tarrivedState,\n\t\tdirections,\n\t\tmeasure() {\n\t\t\tconst _element = toValue(element);\n\t\t\tif (window && _element) setArrivedState(_element);\n\t\t}\n\t};\n}\n//#endregion\n//#region useInfiniteScroll/index.ts\n/**\n* Reactive infinite scroll.\n*\n* @see https://vueuse.org/useInfiniteScroll\n*/\nfunction useInfiniteScroll(element, onLoadMore, options = {}) {\n\tvar _options$distance;\n\tconst { direction = \"bottom\", interval = 100, canLoadMore = () => true } = options;\n\tconst state = reactive(useScroll(element, {\n\t\t...options,\n\t\toffset: {\n\t\t\t[direction]: (_options$distance = options.distance) !== null && _options$distance !== void 0 ? _options$distance : 0,\n\t\t\t...options.offset\n\t\t}\n\t}));\n\tconst promise = shallowRef();\n\tconst isLoading = computed(() => !!promise.value);\n\tconst observedElement = computed(() => {\n\t\treturn resolveElement(toValue(element));\n\t});\n\tconst isElementVisible = useElementVisibility(observedElement);\n\tconst canLoad = computed(() => {\n\t\tif (!observedElement.value) return false;\n\t\treturn canLoadMore(observedElement.value);\n\t});\n\tfunction checkAndLoad() {\n\t\tstate.measure();\n\t\tif (!observedElement.value || !isElementVisible.value || !canLoad.value || promise.value) return;\n\t\tconst { scrollHeight, clientHeight, scrollWidth, clientWidth } = observedElement.value;\n\t\tconst isNarrower = direction === \"bottom\" || direction === \"top\" ? scrollHeight <= clientHeight : scrollWidth <= clientWidth;\n\t\tif (state.arrivedState[direction] || isNarrower) promise.value = Promise.all([onLoadMore(state), new Promise((resolve) => setTimeout(resolve, interval))]).finally(() => {\n\t\t\tpromise.value = null;\n\t\t\tnextTick(() => checkAndLoad());\n\t\t});\n\t}\n\ttryOnUnmounted(watch(() => [\n\t\tstate.arrivedState[direction],\n\t\tisElementVisible.value,\n\t\tcanLoad.value\n\t], checkAndLoad, {\n\t\timmediate: true,\n\t\tflush: \"post\"\n\t}));\n\treturn {\n\t\tisLoading,\n\t\treset() {\n\t\t\tnextTick(() => checkAndLoad());\n\t\t}\n\t};\n}\n//#endregion\n//#region useKeyModifier/index.ts\nconst defaultEvents = [\n\t\"mousedown\",\n\t\"mouseup\",\n\t\"keydown\",\n\t\"keyup\"\n];\n/* @__NO_SIDE_EFFECTS__ */\nfunction useKeyModifier(modifier, options = {}) {\n\tconst { events = defaultEvents, document = defaultDocument, initial = null } = options;\n\tconst state = shallowRef(initial);\n\tif (document) events.forEach((listenerEvent) => {\n\t\tuseEventListener(document, listenerEvent, (evt) => {\n\t\t\tif (typeof evt.getModifierState === \"function\") state.value = evt.getModifierState(modifier);\n\t\t}, { passive: true });\n\t});\n\treturn state;\n}\n//#endregion\n//#region useLocalStorage/index.ts\n/**\n* Reactive LocalStorage.\n*\n* @see https://vueuse.org/useLocalStorage\n* @param key\n* @param initialValue\n* @param options\n*/\nfunction useLocalStorage(key, initialValue, options = {}) {\n\tconst { window = defaultWindow } = options;\n\treturn useStorage(key, initialValue, window === null || window === void 0 ? void 0 : window.localStorage, options);\n}\n//#endregion\n//#region useMagicKeys/aliasMap.ts\nconst DefaultMagicKeysAliasMap = {\n\tctrl: \"control\",\n\tcommand: \"meta\",\n\tcmd: \"meta\",\n\toption: \"alt\",\n\tup: \"arrowup\",\n\tdown: \"arrowdown\",\n\tleft: \"arrowleft\",\n\tright: \"arrowright\"\n};\n//#endregion\n//#region useMagicKeys/index.ts\n/**\n* Reactive keys pressed state, with magical keys combination support.\n*\n* @see https://vueuse.org/useMagicKeys\n*/\nfunction useMagicKeys(options = {}) {\n\tconst { reactive: useReactive = false, target = defaultWindow, aliasMap = DefaultMagicKeysAliasMap, passive = true, onEventFired = noop } = options;\n\tconst current = reactive(/* @__PURE__ */ new Set());\n\tconst obj = {\n\t\ttoJSON() {\n\t\t\treturn {};\n\t\t},\n\t\tcurrent\n\t};\n\tconst refs = useReactive ? reactive(obj) : obj;\n\tconst metaDeps = /* @__PURE__ */ new Set();\n\tconst depsMap = new Map([\n\t\t[\"Meta\", metaDeps],\n\t\t[\"Shift\", /* @__PURE__ */ new Set()],\n\t\t[\"Alt\", /* @__PURE__ */ new Set()]\n\t]);\n\tconst usedKeys = /* @__PURE__ */ new Set();\n\tfunction setRefs(key, value) {\n\t\tif (key in refs) if (useReactive) refs[key] = value;\n\t\telse refs[key].value = value;\n\t}\n\tfunction reset() {\n\t\tcurrent.clear();\n\t\tfor (const key of usedKeys) setRefs(key, false);\n\t}\n\tfunction updateDeps(value, e, keys) {\n\t\tif (!value || typeof e.getModifierState !== \"function\") return;\n\t\tfor (const [modifier, depsSet] of depsMap) if (e.getModifierState(modifier)) {\n\t\t\tkeys.forEach((key) => depsSet.add(key));\n\t\t\tbreak;\n\t\t}\n\t}\n\tfunction clearDeps(value, key) {\n\t\tif (value) return;\n\t\tconst depsMapKey = `${key[0].toUpperCase()}${key.slice(1)}`;\n\t\tconst deps = depsMap.get(depsMapKey);\n\t\tif (![\"shift\", \"alt\"].includes(key) || !deps) return;\n\t\tconst depsArray = Array.from(deps);\n\t\tconst depsIndex = depsArray.indexOf(key);\n\t\tdepsArray.forEach((key, index) => {\n\t\t\tif (index >= depsIndex) {\n\t\t\t\tcurrent.delete(key);\n\t\t\t\tsetRefs(key, false);\n\t\t\t}\n\t\t});\n\t\tdeps.clear();\n\t}\n\tfunction updateRefs(e, value) {\n\t\tvar _e$key, _e$code;\n\t\tconst key = (_e$key = e.key) === null || _e$key === void 0 ? void 0 : _e$key.toLowerCase();\n\t\tconst values = [(_e$code = e.code) === null || _e$code === void 0 ? void 0 : _e$code.toLowerCase(), key].filter(Boolean);\n\t\tif (!key) return;\n\t\tif (key) if (value) current.add(key);\n\t\telse current.delete(key);\n\t\tfor (const key of values) {\n\t\t\tusedKeys.add(key);\n\t\t\tsetRefs(key, value);\n\t\t}\n\t\tupdateDeps(value, e, [...current, ...values]);\n\t\tclearDeps(value, key);\n\t\tif (key === \"meta\" && !value) {\n\t\t\tmetaDeps.forEach((key) => {\n\t\t\t\tcurrent.delete(key);\n\t\t\t\tsetRefs(key, false);\n\t\t\t});\n\t\t\tmetaDeps.clear();\n\t\t}\n\t}\n\tuseEventListener(target, \"keydown\", (e) => {\n\t\tupdateRefs(e, true);\n\t\treturn onEventFired(e);\n\t}, { passive });\n\tuseEventListener(target, \"keyup\", (e) => {\n\t\tupdateRefs(e, false);\n\t\treturn onEventFired(e);\n\t}, { passive });\n\tuseEventListener(\"blur\", reset, { passive });\n\tuseEventListener(\"focus\", reset, { passive });\n\tconst proxy = new Proxy(refs, { get(target, prop, rec) {\n\t\tif (typeof prop !== \"string\") return Reflect.get(target, prop, rec);\n\t\tprop = prop.toLowerCase();\n\t\tif (prop in aliasMap) prop = aliasMap[prop];\n\t\tif (!(prop in refs)) if (/[+_-]/.test(prop)) {\n\t\t\tconst keys = prop.split(/[+_-]/g).map((i) => i.trim());\n\t\t\trefs[prop] = computed(() => keys.map((key) => toValue(proxy[key])).every(Boolean));\n\t\t} else refs[prop] = shallowRef(false);\n\t\tconst r = Reflect.get(target, prop, rec);\n\t\treturn useReactive ? toValue(r) : r;\n\t} });\n\treturn proxy;\n}\n//#endregion\n//#region useMediaControls/index.ts\n/**\n* Automatically check if the ref exists and if it does run the cb fn\n*/\nfunction usingElRef(source, cb) {\n\tif (toValue(source)) cb(toValue(source));\n}\n/**\n* Converts a TimeRange object to an array\n*/\nfunction timeRangeToArray(timeRanges) {\n\tlet ranges = [];\n\tfor (let i = 0; i < timeRanges.length; ++i) ranges = [...ranges, [timeRanges.start(i), timeRanges.end(i)]];\n\treturn ranges;\n}\n/**\n* Converts a TextTrackList object to an array of `UseMediaTextTrack`\n*/\nfunction tracksToArray(tracks) {\n\treturn Array.from(tracks).map(({ label, kind, language, mode, activeCues, cues, inBandMetadataTrackDispatchType }, id) => ({\n\t\tid,\n\t\tlabel,\n\t\tkind,\n\t\tlanguage,\n\t\tmode,\n\t\tactiveCues,\n\t\tcues,\n\t\tinBandMetadataTrackDispatchType\n\t}));\n}\nconst defaultOptions = {\n\tsrc: \"\",\n\ttracks: []\n};\nfunction useMediaControls(target, options = {}) {\n\ttarget = toRef(target);\n\toptions = {\n\t\t...defaultOptions,\n\t\t...options\n\t};\n\tconst { document = defaultDocument } = options;\n\tconst listenerOptions = { passive: true };\n\tconst currentTime = shallowRef(0);\n\tconst duration = shallowRef(0);\n\tconst seeking = shallowRef(false);\n\tconst volume = shallowRef(1);\n\tconst waiting = shallowRef(false);\n\tconst ended = shallowRef(false);\n\tconst playing = shallowRef(false);\n\tconst rate = shallowRef(1);\n\tconst stalled = shallowRef(false);\n\tconst buffered = shallowRef([]);\n\tconst tracks = shallowRef([]);\n\tconst selectedTrack = shallowRef(-1);\n\tconst isPictureInPicture = shallowRef(false);\n\tconst muted = shallowRef(false);\n\tconst supportsPictureInPicture = Boolean(document && \"pictureInPictureEnabled\" in document);\n\tconst sourceErrorEvent = createEventHook();\n\tconst playbackErrorEvent = createEventHook();\n\t/**\n\t* Disables the specified track. If no track is specified then\n\t* all tracks will be disabled\n\t*\n\t* @param track The id of the track to disable\n\t*/\n\tconst disableTrack = (track) => {\n\t\tusingElRef(target, (el) => {\n\t\t\tif (track) {\n\t\t\t\tconst id = typeof track === \"number\" ? track : track.id;\n\t\t\t\tel.textTracks[id].mode = \"disabled\";\n\t\t\t} else for (let i = 0; i < el.textTracks.length; ++i) el.textTracks[i].mode = \"disabled\";\n\t\t\tselectedTrack.value = -1;\n\t\t});\n\t};\n\t/**\n\t* Enables the specified track and disables the\n\t* other tracks unless otherwise specified\n\t*\n\t* @param track The track of the id of the track to enable\n\t* @param disableTracks Disable all other tracks\n\t*/\n\tconst enableTrack = (track, disableTracks = true) => {\n\t\tusingElRef(target, (el) => {\n\t\t\tconst id = typeof track === \"number\" ? track : track.id;\n\t\t\tif (disableTracks) disableTrack();\n\t\t\tel.textTracks[id].mode = \"showing\";\n\t\t\tselectedTrack.value = id;\n\t\t});\n\t};\n\t/**\n\t* Toggle picture in picture mode for the player.\n\t*/\n\tconst togglePictureInPicture = () => {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tusingElRef(target, async (el) => {\n\t\t\t\tif (supportsPictureInPicture) if (!isPictureInPicture.value) el.requestPictureInPicture().then(resolve).catch(reject);\n\t\t\t\telse document.exitPictureInPicture().then(resolve).catch(reject);\n\t\t\t});\n\t\t});\n\t};\n\t/**\n\t* This will automatically inject sources to the media element. The sources will be\n\t* appended as children to the media element as `<source>` elements.\n\t*/\n\twatchEffect(() => {\n\t\tif (!document) return;\n\t\tconst el = toValue(target);\n\t\tif (!el) return;\n\t\tconst src = toValue(options.src);\n\t\tlet sources = [];\n\t\tif (!src) return;\n\t\tif (typeof src === \"string\") sources = [{ src }];\n\t\telse if (Array.isArray(src)) sources = src;\n\t\telse if (isObject(src)) sources = [src];\n\t\tel.querySelectorAll(\"source\").forEach((e) => {\n\t\t\te.remove();\n\t\t});\n\t\tsources.forEach(({ src, type, media }) => {\n\t\t\tconst source = document.createElement(\"source\");\n\t\t\tsource.setAttribute(\"src\", src);\n\t\t\tsource.setAttribute(\"type\", type || \"\");\n\t\t\tsource.setAttribute(\"media\", media || \"\");\n\t\t\tuseEventListener(source, \"error\", sourceErrorEvent.trigger, listenerOptions);\n\t\t\tel.appendChild(source);\n\t\t});\n\t\tel.load();\n\t});\n\t/**\n\t* Apply composable state to the element, also when element is changed\n\t*/\n\twatch([target, volume], () => {\n\t\tconst el = toValue(target);\n\t\tif (!el) return;\n\t\tel.volume = volume.value;\n\t});\n\twatch([target, muted], () => {\n\t\tconst el = toValue(target);\n\t\tif (!el) return;\n\t\tel.muted = muted.value;\n\t});\n\twatch([target, rate], () => {\n\t\tconst el = toValue(target);\n\t\tif (!el) return;\n\t\tel.playbackRate = rate.value;\n\t});\n\t/**\n\t* Load Tracks\n\t*/\n\twatchEffect(() => {\n\t\tif (!document) return;\n\t\tconst textTracks = toValue(options.tracks);\n\t\tconst el = toValue(target);\n\t\tif (!textTracks || !textTracks.length || !el) return;\n\t\t/**\n\t\t* The MediaAPI provides an API for adding text tracks, but they don't currently\n\t\t* have an API for removing text tracks, so instead we will just create and remove\n\t\t* the tracks manually using the HTML api.\n\t\t*/\n\t\tel.querySelectorAll(\"track\").forEach((e) => e.remove());\n\t\ttextTracks.forEach(({ default: isDefault, kind, label, src, srcLang }, i) => {\n\t\t\tconst track = document.createElement(\"track\");\n\t\t\ttrack.default = isDefault || false;\n\t\t\ttrack.kind = kind;\n\t\t\ttrack.label = label;\n\t\t\ttrack.src = src;\n\t\t\ttrack.srclang = srcLang;\n\t\t\tif (track.default) selectedTrack.value = i;\n\t\t\tel.appendChild(track);\n\t\t});\n\t});\n\t/**\n\t* This will allow us to update the current time from the timeupdate event\n\t* without setting the medias current position, but if the user changes the\n\t* current time via the ref, then the media will seek.\n\t*\n\t* If we did not use an ignorable watch, then the current time update from\n\t* the timeupdate event would cause the media to stutter.\n\t*/\n\tconst { ignoreUpdates: ignoreCurrentTimeUpdates } = watchIgnorable(currentTime, (time) => {\n\t\tconst el = toValue(target);\n\t\tif (!el) return;\n\t\tel.currentTime = time;\n\t});\n\t/**\n\t* Using an ignorable watch so we can control the play state using a ref and not\n\t* a function\n\t*/\n\tconst { ignoreUpdates: ignorePlayingUpdates } = watchIgnorable(playing, (isPlaying) => {\n\t\tconst el = toValue(target);\n\t\tif (!el) return;\n\t\tif (isPlaying) el.play().catch((e) => {\n\t\t\tplaybackErrorEvent.trigger(e);\n\t\t\tthrow e;\n\t\t});\n\t\telse el.pause();\n\t});\n\tuseEventListener(target, \"timeupdate\", () => ignoreCurrentTimeUpdates(() => currentTime.value = toValue(target).currentTime), listenerOptions);\n\tuseEventListener(target, \"durationchange\", () => duration.value = toValue(target).duration, listenerOptions);\n\tuseEventListener(target, \"progress\", () => buffered.value = timeRangeToArray(toValue(target).buffered), listenerOptions);\n\tuseEventListener(target, \"seeking\", () => seeking.value = true, listenerOptions);\n\tuseEventListener(target, \"seeked\", () => seeking.value = false, listenerOptions);\n\tuseEventListener(target, [\"waiting\", \"loadstart\"], () => {\n\t\twaiting.value = true;\n\t\tignorePlayingUpdates(() => playing.value = false);\n\t}, listenerOptions);\n\tuseEventListener(target, \"loadeddata\", () => waiting.value = false, listenerOptions);\n\tuseEventListener(target, \"playing\", () => {\n\t\twaiting.value = false;\n\t\tended.value = false;\n\t\tignorePlayingUpdates(() => playing.value = true);\n\t}, listenerOptions);\n\tuseEventListener(target, \"ratechange\", () => rate.value = toValue(target).playbackRate, listenerOptions);\n\tuseEventListener(target, \"stalled\", () => stalled.value = true, listenerOptions);\n\tuseEventListener(target, \"ended\", () => ended.value = true, listenerOptions);\n\tuseEventListener(target, \"pause\", () => ignorePlayingUpdates(() => playing.value = false), listenerOptions);\n\tuseEventListener(target, \"play\", () => ignorePlayingUpdates(() => playing.value = true), listenerOptions);\n\tuseEventListener(target, \"enterpictureinpicture\", () => isPictureInPicture.value = true, listenerOptions);\n\tuseEventListener(target, \"leavepictureinpicture\", () => isPictureInPicture.value = false, listenerOptions);\n\tuseEventListener(target, \"volumechange\", () => {\n\t\tconst el = toValue(target);\n\t\tif (!el) return;\n\t\tvolume.value = el.volume;\n\t\tmuted.value = el.muted;\n\t}, listenerOptions);\n\t/**\n\t* The following listeners need to listen to a nested\n\t* object on the target, so we will have to use a nested\n\t* watch and manually remove the listeners\n\t*/\n\tconst listeners = [];\n\tconst stop = watch([target], () => {\n\t\tconst el = toValue(target);\n\t\tif (!el) return;\n\t\tstop();\n\t\tlisteners[0] = useEventListener(el.textTracks, \"addtrack\", () => tracks.value = tracksToArray(el.textTracks), listenerOptions);\n\t\tlisteners[1] = useEventListener(el.textTracks, \"removetrack\", () => tracks.value = tracksToArray(el.textTracks), listenerOptions);\n\t\tlisteners[2] = useEventListener(el.textTracks, \"change\", () => tracks.value = tracksToArray(el.textTracks), listenerOptions);\n\t});\n\ttryOnScopeDispose(() => listeners.forEach((listener) => listener()));\n\treturn {\n\t\tcurrentTime,\n\t\tduration,\n\t\twaiting,\n\t\tseeking,\n\t\tended,\n\t\tstalled,\n\t\tbuffered,\n\t\tplaying,\n\t\trate,\n\t\tvolume,\n\t\tmuted,\n\t\ttracks,\n\t\tselectedTrack,\n\t\tenableTrack,\n\t\tdisableTrack,\n\t\tsupportsPictureInPicture,\n\t\ttogglePictureInPicture,\n\t\tisPictureInPicture,\n\t\tonSourceError: sourceErrorEvent.on,\n\t\tonPlaybackError: playbackErrorEvent.on\n\t};\n}\n//#endregion\n//#region useMemoize/index.ts\n/**\n* Reactive function result cache based on arguments\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction useMemoize(resolver, options) {\n\tconst initCache = () => {\n\t\tif (options === null || options === void 0 ? void 0 : options.cache) return shallowReactive(options.cache);\n\t\treturn shallowReactive(/* @__PURE__ */ new Map());\n\t};\n\tconst cache = initCache();\n\t/**\n\t* Generate key from args\n\t*/\n\tconst generateKey = (...args) => (options === null || options === void 0 ? void 0 : options.getKey) ? options.getKey(...args) : JSON.stringify(args);\n\t/**\n\t* Load data and save in cache\n\t*/\n\tconst _loadData = (key, ...args) => {\n\t\tcache.set(key, resolver(...args));\n\t\treturn cache.get(key);\n\t};\n\tconst loadData = (...args) => _loadData(generateKey(...args), ...args);\n\t/**\n\t* Delete key from cache\n\t*/\n\tconst deleteData = (...args) => {\n\t\tcache.delete(generateKey(...args));\n\t};\n\t/**\n\t* Clear cached data\n\t*/\n\tconst clearData = () => {\n\t\tcache.clear();\n\t};\n\tconst memoized = (...args) => {\n\t\tconst key = generateKey(...args);\n\t\tif (cache.has(key)) return cache.get(key);\n\t\treturn _loadData(key, ...args);\n\t};\n\tmemoized.load = loadData;\n\tmemoized.delete = deleteData;\n\tmemoized.clear = clearData;\n\tmemoized.generateKey = generateKey;\n\tmemoized.cache = cache;\n\treturn memoized;\n}\n//#endregion\n//#region useMemory/index.ts\nfunction getDefaultScheduler$6(options) {\n\tif (\"interval\" in options || \"immediate\" in options || \"immediateCallback\" in options) {\n\t\tconst { interval = 1e3, immediate, immediateCallback } = options;\n\t\treturn (cb) => useIntervalFn(cb, interval, {\n\t\t\timmediate,\n\t\t\timmediateCallback\n\t\t});\n\t}\n\treturn useIntervalFn;\n}\n/**\n* Reactive Memory Info.\n*\n* @see https://vueuse.org/useMemory\n* @param options\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction useMemory(options = {}) {\n\tconst memory = shallowRef();\n\tconst isSupported = /* @__PURE__ */ useSupported(() => typeof performance !== \"undefined\" && \"memory\" in performance);\n\tif (isSupported.value) {\n\t\tconst { scheduler = getDefaultScheduler$6 } = options;\n\t\tscheduler(() => {\n\t\t\tmemory.value = performance.memory;\n\t\t});\n\t}\n\treturn {\n\t\tisSupported,\n\t\tmemory\n\t};\n}\n//#endregion\n//#region useMouse/index.ts\nconst UseMouseBuiltinExtractors = {\n\tpage: (event) => [event.pageX, event.pageY],\n\tclient: (event) => [event.clientX, event.clientY],\n\tscreen: (event) => [event.screenX, event.screenY],\n\tmovement: (event) => event instanceof MouseEvent ? [event.movementX, event.movementY] : null\n};\n/**\n* Reactive mouse position.\n*\n* @see https://vueuse.org/useMouse\n* @param options\n*/\nfunction useMouse(options = {}) {\n\tconst { type = \"page\", touch = true, resetOnTouchEnds = false, initialValue = {\n\t\tx: 0,\n\t\ty: 0\n\t}, window = defaultWindow, target = window, scroll = true, eventFilter } = options;\n\tlet _prevMouseEvent = null;\n\tlet _prevScrollX = 0;\n\tlet _prevScrollY = 0;\n\tconst x = shallowRef(initialValue.x);\n\tconst y = shallowRef(initialValue.y);\n\tconst sourceType = shallowRef(null);\n\tconst extractor = typeof type === \"function\" ? type : UseMouseBuiltinExtractors[type];\n\tconst mouseHandler = (event) => {\n\t\tconst result = extractor(event);\n\t\t_prevMouseEvent = event;\n\t\tif (result) {\n\t\t\t[x.value, y.value] = result;\n\t\t\tsourceType.value = \"mouse\";\n\t\t}\n\t\tif (window) {\n\t\t\t_prevScrollX = window.scrollX;\n\t\t\t_prevScrollY = window.scrollY;\n\t\t}\n\t};\n\tconst touchHandler = (event) => {\n\t\tif (event.touches.length > 0) {\n\t\t\tconst result = extractor(event.touches[0]);\n\t\t\tif (result) {\n\t\t\t\t[x.value, y.value] = result;\n\t\t\t\tsourceType.value = \"touch\";\n\t\t\t}\n\t\t}\n\t};\n\tconst scrollHandler = () => {\n\t\tif (!_prevMouseEvent || !window) return;\n\t\tconst pos = extractor(_prevMouseEvent);\n\t\tif (_prevMouseEvent instanceof MouseEvent && pos) {\n\t\t\tx.value = pos[0] + window.scrollX - _prevScrollX;\n\t\t\ty.value = pos[1] + window.scrollY - _prevScrollY;\n\t\t}\n\t};\n\tconst reset = () => {\n\t\tx.value = initialValue.x;\n\t\ty.value = initialValue.y;\n\t};\n\tconst mouseHandlerWrapper = eventFilter ? (event) => eventFilter(() => mouseHandler(event), {}) : (event) => mouseHandler(event);\n\tconst touchHandlerWrapper = eventFilter ? (event) => eventFilter(() => touchHandler(event), {}) : (event) => touchHandler(event);\n\tconst scrollHandlerWrapper = eventFilter ? () => eventFilter(() => scrollHandler(), {}) : () => scrollHandler();\n\tif (target) {\n\t\tconst listenerOptions = { passive: true };\n\t\tuseEventListener(target, [\"mousemove\", \"dragover\"], mouseHandlerWrapper, listenerOptions);\n\t\tif (touch && type !== \"movement\") {\n\t\t\tuseEventListener(target, [\"touchstart\", \"touchmove\"], touchHandlerWrapper, listenerOptions);\n\t\t\tif (resetOnTouchEnds) useEventListener(target, \"touchend\", reset, listenerOptions);\n\t\t}\n\t\tif (scroll && type === \"page\") useEventListener(window, \"scroll\", scrollHandlerWrapper, listenerOptions);\n\t}\n\treturn {\n\t\tx,\n\t\ty,\n\t\tsourceType\n\t};\n}\n//#endregion\n//#region useMouseInElement/index.ts\n/**\n* Reactive mouse position related to an element.\n*\n* @see https://vueuse.org/useMouseInElement\n* @param target\n* @param options\n*/\nfunction useMouseInElement(target, options = {}) {\n\tconst { windowResize = true, windowScroll = true, handleOutside = true, window = defaultWindow } = options;\n\tconst type = options.type || \"page\";\n\tconst { x, y, sourceType } = useMouse(options);\n\tconst targetRef = shallowRef(target !== null && target !== void 0 ? target : window === null || window === void 0 ? void 0 : window.document.body);\n\tconst elementX = shallowRef(0);\n\tconst elementY = shallowRef(0);\n\tconst elementPositionX = shallowRef(0);\n\tconst elementPositionY = shallowRef(0);\n\tconst elementHeight = shallowRef(0);\n\tconst elementWidth = shallowRef(0);\n\tconst isOutside = shallowRef(true);\n\tfunction update() {\n\t\tif (!window) return;\n\t\tconst el = unrefElement(targetRef);\n\t\tif (!el || !(el instanceof Element)) return;\n\t\tfor (const rect of el.getClientRects()) {\n\t\t\tconst { left, top, width, height } = rect;\n\t\t\telementPositionX.value = left + (type === \"page\" ? window.pageXOffset : 0);\n\t\t\telementPositionY.value = top + (type === \"page\" ? window.pageYOffset : 0);\n\t\t\telementHeight.value = height;\n\t\t\telementWidth.value = width;\n\t\t\tconst elX = x.value - elementPositionX.value;\n\t\t\tconst elY = y.value - elementPositionY.value;\n\t\t\tisOutside.value = width === 0 || height === 0 || elX < 0 || elY < 0 || elX > width || elY > height;\n\t\t\tif (handleOutside || !isOutside.value) {\n\t\t\t\telementX.value = elX;\n\t\t\t\telementY.value = elY;\n\t\t\t}\n\t\t\tif (!isOutside.value) break;\n\t\t}\n\t}\n\tconst stopFnList = [];\n\tfunction stop() {\n\t\tstopFnList.forEach((fn) => fn());\n\t\tstopFnList.length = 0;\n\t}\n\ttryOnMounted(() => {\n\t\tupdate();\n\t});\n\tif (window) {\n\t\tconst { stop: stopResizeObserver } = useResizeObserver(targetRef, update);\n\t\tconst { stop: stopMutationObserver } = useMutationObserver(targetRef, update, { attributeFilter: [\"style\", \"class\"] });\n\t\tconst stopWatch = watch([\n\t\t\ttargetRef,\n\t\t\tx,\n\t\t\ty\n\t\t], update);\n\t\tstopFnList.push(stopResizeObserver, stopMutationObserver, stopWatch);\n\t\tuseEventListener(document, \"mouseleave\", () => isOutside.value = true, { passive: true });\n\t\tif (windowScroll) stopFnList.push(useEventListener(\"scroll\", update, {\n\t\t\tcapture: true,\n\t\t\tpassive: true\n\t\t}));\n\t\tif (windowResize) stopFnList.push(useEventListener(\"resize\", update, { passive: true }));\n\t}\n\treturn {\n\t\tx,\n\t\ty,\n\t\tsourceType,\n\t\telementX,\n\t\telementY,\n\t\telementPositionX,\n\t\telementPositionY,\n\t\telementHeight,\n\t\telementWidth,\n\t\tisOutside,\n\t\tstop\n\t};\n}\n//#endregion\n//#region useMousePressed/index.ts\n/**\n* Reactive mouse pressing state.\n*\n* @see https://vueuse.org/useMousePressed\n* @param options\n*/\nfunction useMousePressed(options = {}) {\n\tconst { touch = true, drag = true, capture = false, initialValue = false, window = defaultWindow } = options;\n\tconst pressed = shallowRef(initialValue);\n\tconst sourceType = shallowRef(null);\n\tif (!window) return {\n\t\tpressed,\n\t\tsourceType\n\t};\n\tconst onPressed = (srcType) => (event) => {\n\t\tvar _options$onPressed;\n\t\tpressed.value = true;\n\t\tsourceType.value = srcType;\n\t\t(_options$onPressed = options.onPressed) === null || _options$onPressed === void 0 || _options$onPressed.call(options, event);\n\t};\n\tconst onReleased = (event) => {\n\t\tvar _options$onReleased;\n\t\tpressed.value = false;\n\t\tsourceType.value = null;\n\t\t(_options$onReleased = options.onReleased) === null || _options$onReleased === void 0 || _options$onReleased.call(options, event);\n\t};\n\tconst target = computed(() => unrefElement(options.target) || window);\n\tconst listenerOptions = {\n\t\tpassive: true,\n\t\tcapture\n\t};\n\tuseEventListener(target, \"mousedown\", onPressed(\"mouse\"), listenerOptions);\n\tuseEventListener(window, \"mouseleave\", onReleased, listenerOptions);\n\tuseEventListener(window, \"mouseup\", onReleased, listenerOptions);\n\tif (drag) {\n\t\tuseEventListener(target, \"dragstart\", onPressed(\"mouse\"), listenerOptions);\n\t\tuseEventListener(window, \"drop\", onReleased, listenerOptions);\n\t\tuseEventListener(window, \"dragend\", onReleased, listenerOptions);\n\t}\n\tif (touch) {\n\t\tuseEventListener(target, \"touchstart\", onPressed(\"touch\"), listenerOptions);\n\t\tuseEventListener(window, \"touchend\", onReleased, listenerOptions);\n\t\tuseEventListener(window, \"touchcancel\", onReleased, listenerOptions);\n\t}\n\treturn {\n\t\tpressed,\n\t\tsourceType\n\t};\n}\n//#endregion\n//#region useNavigatorLanguage/index.ts\n/**\n*\n* Reactive useNavigatorLanguage\n*\n* Detects the currently selected user language and returns a reactive language\n* @see https://vueuse.org/useNavigatorLanguage\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction useNavigatorLanguage(options = {}) {\n\tconst { window = defaultWindow } = options;\n\tconst navigator = window === null || window === void 0 ? void 0 : window.navigator;\n\tconst isSupported = /* @__PURE__ */ useSupported(() => navigator && \"language\" in navigator);\n\tconst language = shallowRef(navigator === null || navigator === void 0 ? void 0 : navigator.language);\n\tuseEventListener(window, \"languagechange\", () => {\n\t\tif (navigator) language.value = navigator.language;\n\t}, { passive: true });\n\treturn {\n\t\tisSupported,\n\t\tlanguage\n\t};\n}\n//#endregion\n//#region useNetwork/index.ts\n/**\n* Reactive Network status.\n*\n* @see https://vueuse.org/useNetwork\n* @param options\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction useNetwork(options = {}) {\n\tconst { window = defaultWindow } = options;\n\tconst navigator = window === null || window === void 0 ? void 0 : window.navigator;\n\tconst isSupported = /* @__PURE__ */ useSupported(() => navigator && \"connection\" in navigator);\n\tconst isOnline = shallowRef(true);\n\tconst saveData = shallowRef(false);\n\tconst offlineAt = shallowRef(void 0);\n\tconst onlineAt = shallowRef(void 0);\n\tconst downlink = shallowRef(void 0);\n\tconst downlinkMax = shallowRef(void 0);\n\tconst rtt = shallowRef(void 0);\n\tconst effectiveType = shallowRef(void 0);\n\tconst type = shallowRef(\"unknown\");\n\tconst connection = isSupported.value && navigator.connection;\n\tfunction updateNetworkInformation() {\n\t\tif (!navigator) return;\n\t\tisOnline.value = navigator.onLine;\n\t\tofflineAt.value = isOnline.value ? void 0 : Date.now();\n\t\tonlineAt.value = isOnline.value ? Date.now() : void 0;\n\t\tif (connection) {\n\t\t\tdownlink.value = connection.downlink;\n\t\t\tdownlinkMax.value = connection.downlinkMax;\n\t\t\teffectiveType.value = connection.effectiveType;\n\t\t\trtt.value = connection.rtt;\n\t\t\tsaveData.value = connection.saveData;\n\t\t\ttype.value = connection.type;\n\t\t}\n\t}\n\tconst listenerOptions = { passive: true };\n\tif (window) {\n\t\tuseEventListener(window, \"offline\", () => {\n\t\t\tisOnline.value = false;\n\t\t\tofflineAt.value = Date.now();\n\t\t}, listenerOptions);\n\t\tuseEventListener(window, \"online\", () => {\n\t\t\tisOnline.value = true;\n\t\t\tonlineAt.value = Date.now();\n\t\t}, listenerOptions);\n\t}\n\tif (connection) useEventListener(connection, \"change\", updateNetworkInformation, listenerOptions);\n\tupdateNetworkInformation();\n\treturn {\n\t\tisSupported,\n\t\tisOnline: shallowReadonly(isOnline),\n\t\tsaveData: shallowReadonly(saveData),\n\t\tofflineAt: shallowReadonly(offlineAt),\n\t\tonlineAt: shallowReadonly(onlineAt),\n\t\tdownlink: shallowReadonly(downlink),\n\t\tdownlinkMax: shallowReadonly(downlinkMax),\n\t\teffectiveType: shallowReadonly(effectiveType),\n\t\trtt: shallowReadonly(rtt),\n\t\ttype: shallowReadonly(type)\n\t};\n}\n//#endregion\n//#region useNow/index.ts\nfunction getDefaultScheduler$5(options) {\n\tif (\"interval\" in options || \"immediate\" in options) {\n\t\tconst { interval = \"requestAnimationFrame\", immediate = true } = options;\n\t\treturn interval === \"requestAnimationFrame\" ? (fn) => useRafFn(fn, { immediate }) : (fn) => useIntervalFn(fn, interval, options);\n\t}\n\treturn useRafFn;\n}\n/**\n* Reactive current Date instance.\n*\n* @see https://vueuse.org/useNow\n* @param options\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction useNow(options = {}) {\n\tconst { controls: exposeControls = false, scheduler = getDefaultScheduler$5(options) } = options;\n\tconst now = shallowRef(/* @__PURE__ */ new Date());\n\tconst update = () => now.value = /* @__PURE__ */ new Date();\n\tconst controls = scheduler(update);\n\tif (exposeControls) return {\n\t\tnow,\n\t\t...controls\n\t};\n\telse return now;\n}\n//#endregion\n//#region useObjectUrl/index.ts\n/**\n* Reactive URL representing an object.\n*\n* @see https://vueuse.org/useObjectUrl\n* @param object\n*/\nfunction useObjectUrl(object) {\n\tconst url = shallowRef();\n\tconst release = () => {\n\t\tif (url.value) URL.revokeObjectURL(url.value);\n\t\turl.value = void 0;\n\t};\n\twatch(() => toValue(object), (newObject) => {\n\t\trelease();\n\t\tif (newObject) url.value = URL.createObjectURL(newObject);\n\t}, { immediate: true });\n\ttryOnScopeDispose(release);\n\treturn shallowReadonly(url);\n}\n//#endregion\n//#region ../math/useClamp/index.ts\n/**\n* Reactively clamp a value between two other values.\n*\n* @see https://vueuse.org/useClamp\n* @param value number\n* @param min\n* @param max\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction useClamp(value, min, max) {\n\tif (typeof value === \"function\" || isReadonly(value)) return computed(() => clamp(toValue(value), toValue(min), toValue(max)));\n\tconst _value = ref(value);\n\treturn computed({\n\t\tget() {\n\t\t\treturn _value.value = clamp(_value.value, toValue(min), toValue(max));\n\t\t},\n\t\tset(value) {\n\t\t\t_value.value = clamp(value, toValue(min), toValue(max));\n\t\t}\n\t});\n}\n//#endregion\n//#region useOffsetPagination/index.ts\nfunction useOffsetPagination(options) {\n\tconst { total = Number.POSITIVE_INFINITY, pageSize = 10, page = 1, onPageChange = noop, onPageSizeChange = noop, onPageCountChange = noop } = options;\n\tconst currentPageSize = useClamp(pageSize, 1, Number.POSITIVE_INFINITY);\n\tconst pageCount = computed(() => Math.max(1, Math.ceil(toValue(total) / toValue(currentPageSize))));\n\tconst currentPage = useClamp(page, 1, pageCount);\n\tconst isFirstPage = computed(() => currentPage.value === 1);\n\tconst isLastPage = computed(() => currentPage.value === pageCount.value);\n\tif (isRef(page)) syncRef(page, currentPage, { direction: isReadonly(page) ? \"ltr\" : \"both\" });\n\tif (isRef(pageSize)) syncRef(pageSize, currentPageSize, { direction: isReadonly(pageSize) ? \"ltr\" : \"both\" });\n\tfunction prev() {\n\t\tcurrentPage.value--;\n\t}\n\tfunction next() {\n\t\tcurrentPage.value++;\n\t}\n\tconst returnValue = {\n\t\tcurrentPage,\n\t\tcurrentPageSize,\n\t\tpageCount,\n\t\tisFirstPage,\n\t\tisLastPage,\n\t\tprev,\n\t\tnext\n\t};\n\twatch(currentPage, () => {\n\t\tonPageChange(reactive(returnValue));\n\t});\n\twatch(currentPageSize, () => {\n\t\tonPageSizeChange(reactive(returnValue));\n\t});\n\twatch(pageCount, () => {\n\t\tonPageCountChange(reactive(returnValue));\n\t});\n\treturn returnValue;\n}\n//#endregion\n//#region useOnline/index.ts\n/**\n* Reactive online state.\n*\n* @see https://vueuse.org/useOnline\n* @param options\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction useOnline(options = {}) {\n\tconst { isOnline } = useNetwork(options);\n\treturn isOnline;\n}\n//#endregion\n//#region usePageLeave/index.ts\n/**\n* Reactive state to show whether mouse leaves the page.\n*\n* @see https://vueuse.org/usePageLeave\n* @param options\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction usePageLeave(options = {}) {\n\tconst { window = defaultWindow } = options;\n\tconst isLeft = shallowRef(false);\n\tconst handler = (event) => {\n\t\tif (!window) return;\n\t\tevent = event || window.event;\n\t\tisLeft.value = !(event.relatedTarget || event.toElement);\n\t};\n\tif (window) {\n\t\tconst listenerOptions = { passive: true };\n\t\tuseEventListener(window, \"mouseout\", handler, listenerOptions);\n\t\tuseEventListener(window.document, \"mouseleave\", handler, listenerOptions);\n\t\tuseEventListener(window.document, \"mouseenter\", handler, listenerOptions);\n\t}\n\treturn isLeft;\n}\n//#endregion\n//#region useScreenOrientation/index.ts\n/**\n* Reactive screen orientation\n*\n* @see https://vueuse.org/useScreenOrientation\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction useScreenOrientation(options = {}) {\n\tconst { window = defaultWindow } = options;\n\tconst isSupported = /* @__PURE__ */ useSupported(() => window && \"screen\" in window && \"orientation\" in window.screen);\n\tconst screenOrientation = isSupported.value ? window.screen.orientation : {};\n\tconst orientation = shallowRef(screenOrientation.type);\n\tconst angle = shallowRef(screenOrientation.angle || 0);\n\tif (isSupported.value) useEventListener(window, \"orientationchange\", () => {\n\t\torientation.value = screenOrientation.type;\n\t\tangle.value = screenOrientation.angle;\n\t}, { passive: true });\n\tconst lockOrientation = (type) => {\n\t\tif (isSupported.value && typeof screenOrientation.lock === \"function\") return screenOrientation.lock(type);\n\t\treturn Promise.reject(/* @__PURE__ */ new Error(\"Not supported\"));\n\t};\n\tconst unlockOrientation = () => {\n\t\tif (isSupported.value && typeof screenOrientation.unlock === \"function\") screenOrientation.unlock();\n\t};\n\treturn {\n\t\tisSupported,\n\t\torientation,\n\t\tangle,\n\t\tlockOrientation,\n\t\tunlockOrientation\n\t};\n}\n//#endregion\n//#region useParallax/index.ts\n/**\n* Create parallax effect easily. It uses `useDeviceOrientation` and fallback to `useMouse`\n* if orientation is not supported.\n*\n* @param target\n* @param options\n*/\nfunction useParallax(target, options = {}) {\n\tconst { deviceOrientationTiltAdjust = (i) => i, deviceOrientationRollAdjust = (i) => i, mouseTiltAdjust = (i) => i, mouseRollAdjust = (i) => i, window = defaultWindow } = options;\n\tconst orientation = reactive(useDeviceOrientation({ window }));\n\tconst screenOrientation = reactive(useScreenOrientation({ window }));\n\tconst { elementX: x, elementY: y, elementWidth: width, elementHeight: height } = useMouseInElement(target, {\n\t\thandleOutside: false,\n\t\twindow\n\t});\n\tconst source = computed(() => {\n\t\tif (orientation.isSupported && (orientation.alpha != null && orientation.alpha !== 0 || orientation.gamma != null && orientation.gamma !== 0)) return \"deviceOrientation\";\n\t\treturn \"mouse\";\n\t});\n\treturn {\n\t\troll: computed(() => {\n\t\t\tif (source.value === \"deviceOrientation\") {\n\t\t\t\tlet value;\n\t\t\t\tswitch (screenOrientation.orientation) {\n\t\t\t\t\tcase \"landscape-primary\":\n\t\t\t\t\t\tvalue = orientation.gamma / 90;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"landscape-secondary\":\n\t\t\t\t\t\tvalue = -orientation.gamma / 90;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"portrait-primary\":\n\t\t\t\t\t\tvalue = -orientation.beta / 90;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"portrait-secondary\":\n\t\t\t\t\t\tvalue = orientation.beta / 90;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault: value = -orientation.beta / 90;\n\t\t\t\t}\n\t\t\t\treturn deviceOrientationRollAdjust(value);\n\t\t\t} else return mouseRollAdjust(-(y.value - height.value / 2) / height.value);\n\t\t}),\n\t\ttilt: computed(() => {\n\t\t\tif (source.value === \"deviceOrientation\") {\n\t\t\t\tlet value;\n\t\t\t\tswitch (screenOrientation.orientation) {\n\t\t\t\t\tcase \"landscape-primary\":\n\t\t\t\t\t\tvalue = orientation.beta / 90;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"landscape-secondary\":\n\t\t\t\t\t\tvalue = -orientation.beta / 90;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"portrait-primary\":\n\t\t\t\t\t\tvalue = orientation.gamma / 90;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"portrait-secondary\":\n\t\t\t\t\t\tvalue = -orientation.gamma / 90;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault: value = orientation.gamma / 90;\n\t\t\t\t}\n\t\t\t\treturn deviceOrientationTiltAdjust(value);\n\t\t\t} else return mouseTiltAdjust((x.value - width.value / 2) / width.value);\n\t\t}),\n\t\tsource\n\t};\n}\n//#endregion\n//#region useParentElement/index.ts\nfunction useParentElement(element = useCurrentElement()) {\n\tconst parentElement = shallowRef();\n\tconst update = () => {\n\t\tconst el = unrefElement(element);\n\t\tif (el) parentElement.value = el.parentElement;\n\t};\n\ttryOnMounted(update);\n\twatch(() => toValue(element), update);\n\treturn parentElement;\n}\n//#endregion\n//#region usePerformanceObserver/index.ts\n/**\n* Observe performance metrics.\n*\n* @see https://vueuse.org/usePerformanceObserver\n* @param options\n*/\nfunction usePerformanceObserver(options, callback) {\n\tconst { window = defaultWindow, immediate = true, ...performanceOptions } = options;\n\tconst isSupported = /* @__PURE__ */ useSupported(() => window && \"PerformanceObserver\" in window);\n\tlet observer;\n\tconst stop = () => {\n\t\tobserver === null || observer === void 0 || observer.disconnect();\n\t};\n\tconst start = () => {\n\t\tif (isSupported.value) {\n\t\t\tstop();\n\t\t\tobserver = new PerformanceObserver(callback);\n\t\t\tobserver.observe(performanceOptions);\n\t\t}\n\t};\n\ttryOnScopeDispose(stop);\n\tif (immediate) start();\n\treturn {\n\t\tisSupported,\n\t\tstart,\n\t\tstop\n\t};\n}\n//#endregion\n//#region usePointer/index.ts\nconst defaultState = (/* #__PURE__ */ {\n\tx: 0,\n\ty: 0,\n\tpointerId: 0,\n\tpressure: 0,\n\ttiltX: 0,\n\ttiltY: 0,\n\twidth: 0,\n\theight: 0,\n\ttwist: 0,\n\tpointerType: null\n});\nconst keys = /* @__PURE__ */ Object.keys(defaultState);\n/**\n* Reactive pointer state.\n*\n* @see https://vueuse.org/usePointer\n* @param options\n*/\nfunction usePointer(options = {}) {\n\tconst { target = defaultWindow } = options;\n\tconst isInside = shallowRef(false);\n\tconst state = shallowRef(options.initialValue || {});\n\tObject.assign(state.value, defaultState, state.value);\n\tconst handler = (event) => {\n\t\tisInside.value = true;\n\t\tif (options.pointerTypes && !options.pointerTypes.includes(event.pointerType)) return;\n\t\tstate.value = objectPick(event, keys, false);\n\t};\n\tif (target) {\n\t\tconst listenerOptions = { passive: true };\n\t\tuseEventListener(target, [\n\t\t\t\"pointerdown\",\n\t\t\t\"pointermove\",\n\t\t\t\"pointerup\"\n\t\t], handler, listenerOptions);\n\t\tuseEventListener(target, \"pointerleave\", () => isInside.value = false, listenerOptions);\n\t}\n\treturn {\n\t\t...toRefs(state),\n\t\tisInside\n\t};\n}\n//#endregion\n//#region usePointerLock/index.ts\n/**\n* Reactive pointer lock.\n*\n* @see https://vueuse.org/usePointerLock\n* @param target\n* @param options\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction usePointerLock(target, options = {}) {\n\tconst { document = defaultDocument } = options;\n\tconst isSupported = /* @__PURE__ */ useSupported(() => document && \"pointerLockElement\" in document);\n\tconst element = shallowRef();\n\tconst triggerElement = shallowRef();\n\tlet targetElement;\n\tif (isSupported.value) {\n\t\tconst listenerOptions = { passive: true };\n\t\tuseEventListener(document, \"pointerlockchange\", () => {\n\t\t\tvar _pointerLockElement;\n\t\t\tconst currentElement = (_pointerLockElement = document.pointerLockElement) !== null && _pointerLockElement !== void 0 ? _pointerLockElement : element.value;\n\t\t\tif (targetElement && currentElement === targetElement) {\n\t\t\t\telement.value = document.pointerLockElement;\n\t\t\t\tif (!element.value) targetElement = triggerElement.value = null;\n\t\t\t}\n\t\t}, listenerOptions);\n\t\tuseEventListener(document, \"pointerlockerror\", () => {\n\t\t\tvar _pointerLockElement2;\n\t\t\tconst currentElement = (_pointerLockElement2 = document.pointerLockElement) !== null && _pointerLockElement2 !== void 0 ? _pointerLockElement2 : element.value;\n\t\t\tif (targetElement && currentElement === targetElement) {\n\t\t\t\tconst action = document.pointerLockElement ? \"release\" : \"acquire\";\n\t\t\t\tthrow new Error(`Failed to ${action} pointer lock.`);\n\t\t\t}\n\t\t}, listenerOptions);\n\t}\n\tasync function lock(e) {\n\t\tvar _unrefElement;\n\t\tif (!isSupported.value) throw new Error(\"Pointer Lock API is not supported by your browser.\");\n\t\ttriggerElement.value = e instanceof Event ? e.currentTarget : null;\n\t\ttargetElement = e instanceof Event ? (_unrefElement = unrefElement(target)) !== null && _unrefElement !== void 0 ? _unrefElement : triggerElement.value : unrefElement(e);\n\t\tif (!targetElement) throw new Error(\"Target element undefined.\");\n\t\ttargetElement.requestPointerLock();\n\t\treturn await until(element).toBe(targetElement);\n\t}\n\tasync function unlock() {\n\t\tif (!element.value) return false;\n\t\tdocument.exitPointerLock();\n\t\tawait until(element).toBeNull();\n\t\treturn true;\n\t}\n\treturn {\n\t\tisSupported,\n\t\telement,\n\t\ttriggerElement,\n\t\tlock,\n\t\tunlock\n\t};\n}\n//#endregion\n//#region usePointerSwipe/index.ts\n/**\n* Reactive swipe detection based on PointerEvents.\n*\n* @see https://vueuse.org/usePointerSwipe\n* @param target\n* @param options\n*/\nfunction usePointerSwipe(target, options = {}) {\n\tconst targetRef = toRef(target);\n\tconst { threshold = 50, onSwipe, onSwipeEnd, onSwipeStart, disableTextSelect = false } = options;\n\tconst posStart = reactive({\n\t\tx: 0,\n\t\ty: 0\n\t});\n\tconst updatePosStart = (x, y) => {\n\t\tposStart.x = x;\n\t\tposStart.y = y;\n\t};\n\tconst posEnd = reactive({\n\t\tx: 0,\n\t\ty: 0\n\t});\n\tconst updatePosEnd = (x, y) => {\n\t\tposEnd.x = x;\n\t\tposEnd.y = y;\n\t};\n\tconst distanceX = computed(() => posStart.x - posEnd.x);\n\tconst distanceY = computed(() => posStart.y - posEnd.y);\n\tconst { max, abs } = Math;\n\tconst isThresholdExceeded = computed(() => max(abs(distanceX.value), abs(distanceY.value)) >= threshold);\n\tconst isSwiping = shallowRef(false);\n\tconst isPointerDown = shallowRef(false);\n\tconst direction = computed(() => {\n\t\tif (!isThresholdExceeded.value) return \"none\";\n\t\tif (abs(distanceX.value) > abs(distanceY.value)) return distanceX.value > 0 ? \"left\" : \"right\";\n\t\telse return distanceY.value > 0 ? \"up\" : \"down\";\n\t});\n\tconst eventIsAllowed = (e) => {\n\t\tvar _ref, _options$pointerTypes, _options$pointerTypes2;\n\t\tconst isReleasingButton = e.buttons === 0;\n\t\tconst isPrimaryButton = e.buttons === 1;\n\t\treturn (_ref = (_options$pointerTypes = (_options$pointerTypes2 = options.pointerTypes) === null || _options$pointerTypes2 === void 0 ? void 0 : _options$pointerTypes2.includes(e.pointerType)) !== null && _options$pointerTypes !== void 0 ? _options$pointerTypes : isReleasingButton || isPrimaryButton) !== null && _ref !== void 0 ? _ref : true;\n\t};\n\tconst listenerOptions = { passive: true };\n\tconst stops = [\n\t\tuseEventListener(target, \"pointerdown\", (e) => {\n\t\t\tif (!eventIsAllowed(e)) return;\n\t\t\tisPointerDown.value = true;\n\t\t\tconst eventTarget = e.target;\n\t\t\teventTarget === null || eventTarget === void 0 || eventTarget.setPointerCapture(e.pointerId);\n\t\t\tconst { clientX: x, clientY: y } = e;\n\t\t\tupdatePosStart(x, y);\n\t\t\tupdatePosEnd(x, y);\n\t\t\tonSwipeStart === null || onSwipeStart === void 0 || onSwipeStart(e);\n\t\t}, listenerOptions),\n\t\tuseEventListener(target, \"pointermove\", (e) => {\n\t\t\tif (!eventIsAllowed(e)) return;\n\t\t\tif (!isPointerDown.value) return;\n\t\t\tconst { clientX: x, clientY: y } = e;\n\t\t\tupdatePosEnd(x, y);\n\t\t\tif (!isSwiping.value && isThresholdExceeded.value) isSwiping.value = true;\n\t\t\tif (isSwiping.value) onSwipe === null || onSwipe === void 0 || onSwipe(e);\n\t\t}, listenerOptions),\n\t\tuseEventListener(target, \"pointerup\", (e) => {\n\t\t\tif (!eventIsAllowed(e)) return;\n\t\t\tif (isSwiping.value) onSwipeEnd === null || onSwipeEnd === void 0 || onSwipeEnd(e, direction.value);\n\t\t\tisPointerDown.value = false;\n\t\t\tisSwiping.value = false;\n\t\t}, listenerOptions)\n\t];\n\ttryOnMounted(() => {\n\t\tvar _targetRef$value;\n\t\t(_targetRef$value = targetRef.value) === null || _targetRef$value === void 0 || (_targetRef$value = _targetRef$value.style) === null || _targetRef$value === void 0 || _targetRef$value.setProperty(\"touch-action\", \"pan-y\");\n\t\tif (disableTextSelect) {\n\t\t\tvar _targetRef$value2, _targetRef$value3, _targetRef$value4;\n\t\t\t(_targetRef$value2 = targetRef.value) === null || _targetRef$value2 === void 0 || (_targetRef$value2 = _targetRef$value2.style) === null || _targetRef$value2 === void 0 || _targetRef$value2.setProperty(\"-webkit-user-select\", \"none\");\n\t\t\t(_targetRef$value3 = targetRef.value) === null || _targetRef$value3 === void 0 || (_targetRef$value3 = _targetRef$value3.style) === null || _targetRef$value3 === void 0 || _targetRef$value3.setProperty(\"-ms-user-select\", \"none\");\n\t\t\t(_targetRef$value4 = targetRef.value) === null || _targetRef$value4 === void 0 || (_targetRef$value4 = _targetRef$value4.style) === null || _targetRef$value4 === void 0 || _targetRef$value4.setProperty(\"user-select\", \"none\");\n\t\t}\n\t});\n\tconst stop = () => stops.forEach((s) => s());\n\treturn {\n\t\tisSwiping: shallowReadonly(isSwiping),\n\t\tdirection: shallowReadonly(direction),\n\t\tposStart: readonly(posStart),\n\t\tposEnd: readonly(posEnd),\n\t\tdistanceX,\n\t\tdistanceY,\n\t\tstop\n\t};\n}\n//#endregion\n//#region usePreferredColorScheme/index.ts\n/**\n* Reactive prefers-color-scheme media query.\n*\n* @see https://vueuse.org/usePreferredColorScheme\n* @param [options]\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction usePreferredColorScheme(options) {\n\tconst isLight = useMediaQuery(\"(prefers-color-scheme: light)\", options);\n\tconst isDark = useMediaQuery(\"(prefers-color-scheme: dark)\", options);\n\treturn computed(() => {\n\t\tif (isDark.value) return \"dark\";\n\t\tif (isLight.value) return \"light\";\n\t\treturn \"no-preference\";\n\t});\n}\n//#endregion\n//#region usePreferredContrast/index.ts\n/**\n* Reactive prefers-contrast media query.\n*\n* @see https://vueuse.org/usePreferredContrast\n* @param [options]\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction usePreferredContrast(options) {\n\tconst isMore = useMediaQuery(\"(prefers-contrast: more)\", options);\n\tconst isLess = useMediaQuery(\"(prefers-contrast: less)\", options);\n\tconst isCustom = useMediaQuery(\"(prefers-contrast: custom)\", options);\n\treturn computed(() => {\n\t\tif (isMore.value) return \"more\";\n\t\tif (isLess.value) return \"less\";\n\t\tif (isCustom.value) return \"custom\";\n\t\treturn \"no-preference\";\n\t});\n}\n//#endregion\n//#region usePreferredLanguages/index.ts\n/**\n* Reactive Navigator Languages.\n*\n* @see https://vueuse.org/usePreferredLanguages\n* @param options\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction usePreferredLanguages(options = {}) {\n\tconst { window = defaultWindow } = options;\n\tif (!window) return shallowRef([\"en\"]);\n\tconst navigator = window.navigator;\n\tconst value = shallowRef(navigator.languages);\n\tuseEventListener(window, \"languagechange\", () => {\n\t\tvalue.value = navigator.languages;\n\t}, { passive: true });\n\treturn value;\n}\n//#endregion\n//#region usePreferredReducedMotion/index.ts\n/**\n* Reactive prefers-reduced-motion media query.\n*\n* @see https://vueuse.org/usePreferredReducedMotion\n* @param [options]\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction usePreferredReducedMotion(options) {\n\tconst isReduced = useMediaQuery(\"(prefers-reduced-motion: reduce)\", options);\n\treturn computed(() => {\n\t\tif (isReduced.value) return \"reduce\";\n\t\treturn \"no-preference\";\n\t});\n}\n//#endregion\n//#region usePreferredReducedTransparency/index.ts\n/**\n* Reactive prefers-reduced-transparency media query.\n*\n* @see https://vueuse.org/usePreferredReducedTransparency\n* @param [options]\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction usePreferredReducedTransparency(options) {\n\tconst isReduced = useMediaQuery(\"(prefers-reduced-transparency: reduce)\", options);\n\treturn computed(() => {\n\t\tif (isReduced.value) return \"reduce\";\n\t\treturn \"no-preference\";\n\t});\n}\n//#endregion\n//#region usePrevious/index.ts\nfunction usePrevious(value, initialValue) {\n\tconst previous = shallowRef(initialValue);\n\twatch(toRef(value), (_, oldValue) => {\n\t\tprevious.value = oldValue;\n\t}, { flush: \"sync\" });\n\treturn readonly(previous);\n}\n//#endregion\n//#region useScreenSafeArea/index.ts\nconst topVarName = \"--vueuse-safe-area-top\";\nconst rightVarName = \"--vueuse-safe-area-right\";\nconst bottomVarName = \"--vueuse-safe-area-bottom\";\nconst leftVarName = \"--vueuse-safe-area-left\";\n/**\n* Reactive `env(safe-area-inset-*)`\n*\n* @see https://vueuse.org/useScreenSafeArea\n*/\nfunction useScreenSafeArea() {\n\tconst top = shallowRef(\"\");\n\tconst right = shallowRef(\"\");\n\tconst bottom = shallowRef(\"\");\n\tconst left = shallowRef(\"\");\n\tif (isClient) {\n\t\tconst topCssVar = useCssVar(topVarName);\n\t\tconst rightCssVar = useCssVar(rightVarName);\n\t\tconst bottomCssVar = useCssVar(bottomVarName);\n\t\tconst leftCssVar = useCssVar(leftVarName);\n\t\ttopCssVar.value = \"env(safe-area-inset-top, 0px)\";\n\t\trightCssVar.value = \"env(safe-area-inset-right, 0px)\";\n\t\tbottomCssVar.value = \"env(safe-area-inset-bottom, 0px)\";\n\t\tleftCssVar.value = \"env(safe-area-inset-left, 0px)\";\n\t\ttryOnMounted(update);\n\t\tuseEventListener(\"resize\", useDebounceFn(update), { passive: true });\n\t}\n\tfunction update() {\n\t\ttop.value = getValue(topVarName);\n\t\tright.value = getValue(rightVarName);\n\t\tbottom.value = getValue(bottomVarName);\n\t\tleft.value = getValue(leftVarName);\n\t}\n\treturn {\n\t\ttop,\n\t\tright,\n\t\tbottom,\n\t\tleft,\n\t\tupdate\n\t};\n}\nfunction getValue(position) {\n\treturn getComputedStyle(document.documentElement).getPropertyValue(position);\n}\n//#endregion\n//#region useScriptTag/index.ts\n/**\n* Async script tag loading.\n*\n* @see https://vueuse.org/useScriptTag\n* @param src\n* @param onLoaded\n* @param options\n*/\nfunction useScriptTag(src, onLoaded = noop, options = {}) {\n\tconst { immediate = true, manual = false, type = \"text/javascript\", async = true, crossOrigin, referrerPolicy, noModule, defer, document = defaultDocument, attrs = {}, nonce = void 0 } = options;\n\tconst scriptTag = shallowRef(null);\n\tlet _promise = null;\n\t/**\n\t* Load the script specified via `src`.\n\t*\n\t* @param waitForScriptLoad Whether if the Promise should resolve once the \"load\" event is emitted by the <script> attribute, or right after appending it to the DOM.\n\t* @returns Promise<HTMLScriptElement>\n\t*/\n\tconst loadScript = (waitForScriptLoad) => new Promise((resolve, reject) => {\n\t\tconst resolveWithElement = (el) => {\n\t\t\tscriptTag.value = el;\n\t\t\tresolve(el);\n\t\t\treturn el;\n\t\t};\n\t\tif (!document) {\n\t\t\tresolve(false);\n\t\t\treturn;\n\t\t}\n\t\tlet shouldAppend = false;\n\t\tlet el = document.querySelector(`script[src=\"${toValue(src)}\"]`);\n\t\tif (!el) {\n\t\t\tel = document.createElement(\"script\");\n\t\t\tel.type = type;\n\t\t\tel.async = async;\n\t\t\tel.src = toValue(src);\n\t\t\tif (defer) el.defer = defer;\n\t\t\tif (crossOrigin) el.crossOrigin = crossOrigin;\n\t\t\tif (noModule) el.noModule = noModule;\n\t\t\tif (referrerPolicy) el.referrerPolicy = referrerPolicy;\n\t\t\tif (nonce) el.nonce = nonce;\n\t\t\tObject.entries(attrs).forEach(([name, value]) => el === null || el === void 0 ? void 0 : el.setAttribute(name, value));\n\t\t\tshouldAppend = true;\n\t\t} else if (el.hasAttribute(\"data-loaded\")) resolveWithElement(el);\n\t\tconst listenerOptions = { passive: true };\n\t\tuseEventListener(el, \"error\", (event) => reject(event), listenerOptions);\n\t\tuseEventListener(el, \"abort\", (event) => reject(event), listenerOptions);\n\t\tuseEventListener(el, \"load\", () => {\n\t\t\tel.setAttribute(\"data-loaded\", \"true\");\n\t\t\tonLoaded(el);\n\t\t\tresolveWithElement(el);\n\t\t}, listenerOptions);\n\t\tif (shouldAppend) el = document.head.appendChild(el);\n\t\tif (!waitForScriptLoad) resolveWithElement(el);\n\t});\n\t/**\n\t* Exposed singleton wrapper for `loadScript`, avoiding calling it twice.\n\t*\n\t* @param waitForScriptLoad Whether if the Promise should resolve once the \"load\" event is emitted by the <script> attribute, or right after appending it to the DOM.\n\t* @returns Promise<HTMLScriptElement>\n\t*/\n\tconst load = (waitForScriptLoad = true) => {\n\t\tif (!_promise) _promise = loadScript(waitForScriptLoad);\n\t\treturn _promise;\n\t};\n\t/**\n\t* Unload the script specified by `src`.\n\t*/\n\tconst unload = () => {\n\t\tif (!document) return;\n\t\t_promise = null;\n\t\tif (scriptTag.value) scriptTag.value = null;\n\t\tconst el = document.querySelector(`script[src=\"${toValue(src)}\"]`);\n\t\tif (el) document.head.removeChild(el);\n\t};\n\tif (immediate && !manual) tryOnMounted(load);\n\tif (!manual) tryOnUnmounted(unload);\n\treturn {\n\t\tscriptTag,\n\t\tload,\n\t\tunload\n\t};\n}\n//#endregion\n//#region useScrollLock/index.ts\nfunction checkOverflowScroll(ele) {\n\tconst style = window.getComputedStyle(ele);\n\tif (style.overflowX === \"scroll\" || style.overflowY === \"scroll\" || style.overflowX === \"auto\" && ele.clientWidth < ele.scrollWidth || style.overflowY === \"auto\" && ele.clientHeight < ele.scrollHeight) return true;\n\telse {\n\t\tconst parent = ele.parentNode;\n\t\tif (!parent || parent.tagName === \"BODY\") return false;\n\t\treturn checkOverflowScroll(parent);\n\t}\n}\nfunction preventDefault(rawEvent) {\n\tconst e = rawEvent || window.event;\n\tconst _target = e.target;\n\tif (checkOverflowScroll(_target)) return false;\n\tif (e.touches.length > 1) return true;\n\tif (e.preventDefault) e.preventDefault();\n\treturn false;\n}\nconst elInitialOverflow = /* @__PURE__ */ new WeakMap();\n/**\n* Lock scrolling of the element.\n*\n* @see https://vueuse.org/useScrollLock\n* @param element\n*/\nfunction useScrollLock(element, initialState = false) {\n\tconst isLocked = shallowRef(initialState);\n\tlet stopTouchMoveListener = null;\n\tlet initialOverflow = \"\";\n\twatch(toRef(element), (el) => {\n\t\tconst target = resolveElement(toValue(el));\n\t\tif (target) {\n\t\t\tconst ele = target;\n\t\t\tif (!elInitialOverflow.get(ele)) elInitialOverflow.set(ele, ele.style.overflow);\n\t\t\tif (ele.style.overflow !== \"hidden\") initialOverflow = ele.style.overflow;\n\t\t\tif (ele.style.overflow === \"hidden\") return isLocked.value = true;\n\t\t\tif (isLocked.value) return ele.style.overflow = \"hidden\";\n\t\t}\n\t}, { immediate: true });\n\tconst lock = () => {\n\t\tconst el = resolveElement(toValue(element));\n\t\tif (!el || isLocked.value) return;\n\t\tif (isIOS) stopTouchMoveListener = useEventListener(el, \"touchmove\", (e) => {\n\t\t\tpreventDefault(e);\n\t\t}, { passive: false });\n\t\tel.style.overflow = \"hidden\";\n\t\tisLocked.value = true;\n\t};\n\tconst unlock = () => {\n\t\tconst el = resolveElement(toValue(element));\n\t\tif (!el || !isLocked.value) return;\n\t\tif (isIOS) stopTouchMoveListener === null || stopTouchMoveListener === void 0 || stopTouchMoveListener();\n\t\tel.style.overflow = initialOverflow;\n\t\telInitialOverflow.delete(el);\n\t\tisLocked.value = false;\n\t};\n\ttryOnScopeDispose(unlock);\n\treturn computed({\n\t\tget() {\n\t\t\treturn isLocked.value;\n\t\t},\n\t\tset(v) {\n\t\t\tif (v) lock();\n\t\t\telse unlock();\n\t\t}\n\t});\n}\n//#endregion\n//#region useSessionStorage/index.ts\n/**\n* Reactive SessionStorage.\n*\n* @see https://vueuse.org/useSessionStorage\n* @param key\n* @param initialValue\n* @param options\n*/\nfunction useSessionStorage(key, initialValue, options = {}) {\n\tconst { window = defaultWindow } = options;\n\treturn useStorage(key, initialValue, window === null || window === void 0 ? void 0 : window.sessionStorage, options);\n}\n//#endregion\n//#region useShare/index.ts\n/**\n* Reactive Web Share API.\n*\n* @see https://vueuse.org/useShare\n* @param shareOptions\n* @param options\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction useShare(shareOptions = {}, options = {}) {\n\tconst { navigator = defaultNavigator } = options;\n\tconst _navigator = navigator;\n\tconst isSupported = /* @__PURE__ */ useSupported(() => _navigator && \"canShare\" in _navigator);\n\tconst share = async (overrideOptions = {}) => {\n\t\tif (isSupported.value) {\n\t\t\tconst data = {\n\t\t\t\t...toValue(shareOptions),\n\t\t\t\t...toValue(overrideOptions)\n\t\t\t};\n\t\t\tlet granted = false;\n\t\t\tif (_navigator.canShare) granted = _navigator.canShare(data);\n\t\t\tif (granted) return _navigator.share(data);\n\t\t}\n\t};\n\treturn {\n\t\tisSupported,\n\t\tshare\n\t};\n}\n//#endregion\n//#region useSorted/index.ts\nconst defaultSortFn = (source, compareFn) => source.sort(compareFn);\nconst defaultCompare = (a, b) => a - b;\nfunction useSorted(...args) {\n\tconst [source] = args;\n\tlet compareFn = defaultCompare;\n\tlet options = {};\n\tif (args.length === 2) if (typeof args[1] === \"object\") {\n\t\tvar _options$compareFn;\n\t\toptions = args[1];\n\t\tcompareFn = (_options$compareFn = options.compareFn) !== null && _options$compareFn !== void 0 ? _options$compareFn : defaultCompare;\n\t} else {\n\t\tvar _args$;\n\t\tcompareFn = (_args$ = args[1]) !== null && _args$ !== void 0 ? _args$ : defaultCompare;\n\t}\n\telse if (args.length > 2) {\n\t\tvar _args$2, _args$3;\n\t\tcompareFn = (_args$2 = args[1]) !== null && _args$2 !== void 0 ? _args$2 : defaultCompare;\n\t\toptions = (_args$3 = args[2]) !== null && _args$3 !== void 0 ? _args$3 : {};\n\t}\n\tconst { dirty = false, sortFn = defaultSortFn } = options;\n\tif (!dirty) return computed(() => sortFn([...toValue(source)], compareFn));\n\twatchEffect(() => {\n\t\tconst result = sortFn(toValue(source), compareFn);\n\t\tif (isRef(source)) source.value = result;\n\t\telse source.splice(0, source.length, ...result);\n\t});\n\treturn source;\n}\n//#endregion\n//#region useSpeechRecognition/index.ts\n/**\n* Reactive SpeechRecognition.\n*\n* @see https://vueuse.org/useSpeechRecognition\n* @see https://developer.mozilla.org/en-US/docs/Web/API/SpeechRecognition SpeechRecognition\n* @param options\n*/\nfunction useSpeechRecognition(options = {}) {\n\tconst { interimResults = true, continuous = true, maxAlternatives = 1, window = defaultWindow } = options;\n\tconst lang = toRef(options.lang || \"en-US\");\n\tconst isListening = shallowRef(false);\n\tconst isFinal = shallowRef(false);\n\tconst result = shallowRef(\"\");\n\tconst error = shallowRef(void 0);\n\tlet recognition;\n\tconst start = () => {\n\t\tisListening.value = true;\n\t};\n\tconst stop = () => {\n\t\tisListening.value = false;\n\t};\n\tconst toggle = (value = !isListening.value) => {\n\t\tif (value) start();\n\t\telse stop();\n\t};\n\tconst SpeechRecognition = window && (window.SpeechRecognition || window.webkitSpeechRecognition);\n\tconst isSupported = /* @__PURE__ */ useSupported(() => SpeechRecognition);\n\tif (isSupported.value) {\n\t\trecognition = new SpeechRecognition();\n\t\trecognition.continuous = continuous;\n\t\trecognition.interimResults = interimResults;\n\t\trecognition.lang = toValue(lang);\n\t\trecognition.maxAlternatives = maxAlternatives;\n\t\trecognition.onstart = () => {\n\t\t\tisListening.value = true;\n\t\t\tisFinal.value = false;\n\t\t};\n\t\twatch(lang, (lang) => {\n\t\t\tif (recognition && !isListening.value) recognition.lang = lang;\n\t\t});\n\t\trecognition.onresult = (event) => {\n\t\t\tconst currentResult = event.results[event.resultIndex];\n\t\t\tconst { transcript } = currentResult[0];\n\t\t\tisFinal.value = currentResult.isFinal;\n\t\t\tresult.value = transcript;\n\t\t\terror.value = void 0;\n\t\t};\n\t\trecognition.onerror = (event) => {\n\t\t\terror.value = event;\n\t\t};\n\t\trecognition.onend = () => {\n\t\t\tisListening.value = false;\n\t\t\trecognition.lang = toValue(lang);\n\t\t};\n\t\twatch(isListening, (newValue, oldValue) => {\n\t\t\tif (newValue === oldValue) return;\n\t\t\ttry {\n\t\t\t\tif (newValue) recognition.start();\n\t\t\t\telse recognition.stop();\n\t\t\t} catch (err) {\n\t\t\t\terror.value = err;\n\t\t\t}\n\t\t});\n\t}\n\ttryOnScopeDispose(() => {\n\t\tstop();\n\t});\n\treturn {\n\t\tisSupported,\n\t\tisListening,\n\t\tisFinal,\n\t\trecognition,\n\t\tresult,\n\t\terror,\n\t\ttoggle,\n\t\tstart,\n\t\tstop\n\t};\n}\n//#endregion\n//#region useSpeechSynthesis/index.ts\n/**\n* Reactive SpeechSynthesis.\n*\n* @see https://vueuse.org/useSpeechSynthesis\n* @see https://developer.mozilla.org/en-US/docs/Web/API/SpeechSynthesis SpeechSynthesis\n*/\nfunction useSpeechSynthesis(text, options = {}) {\n\tconst { pitch = 1, rate = 1, volume = 1, window = defaultWindow, onBoundary } = options;\n\tconst synth = window && window.speechSynthesis;\n\tconst isSupported = /* @__PURE__ */ useSupported(() => synth);\n\tconst isPlaying = shallowRef(false);\n\tconst status = shallowRef(\"init\");\n\tconst spokenText = toRef(text || \"\");\n\tconst lang = toRef(options.lang || \"en-US\");\n\tconst error = shallowRef(void 0);\n\tconst toggle = (value = !isPlaying.value) => {\n\t\tisPlaying.value = value;\n\t};\n\tconst bindEventsForUtterance = (utterance) => {\n\t\tutterance.lang = toValue(lang);\n\t\tutterance.voice = toValue(options.voice) || null;\n\t\tutterance.pitch = toValue(pitch);\n\t\tutterance.rate = toValue(rate);\n\t\tutterance.volume = toValue(volume);\n\t\tutterance.onstart = () => {\n\t\t\tisPlaying.value = true;\n\t\t\tstatus.value = \"play\";\n\t\t};\n\t\tutterance.onpause = () => {\n\t\t\tisPlaying.value = false;\n\t\t\tstatus.value = \"pause\";\n\t\t};\n\t\tutterance.onresume = () => {\n\t\t\tisPlaying.value = true;\n\t\t\tstatus.value = \"play\";\n\t\t};\n\t\tutterance.onend = () => {\n\t\t\tisPlaying.value = false;\n\t\t\tstatus.value = \"end\";\n\t\t};\n\t\tutterance.onerror = (event) => {\n\t\t\terror.value = event;\n\t\t};\n\t\tutterance.onboundary = (event) => {\n\t\t\tonBoundary === null || onBoundary === void 0 || onBoundary(event);\n\t\t};\n\t};\n\tconst utterance = computed(() => {\n\t\tisPlaying.value = false;\n\t\tstatus.value = \"init\";\n\t\tconst newUtterance = new SpeechSynthesisUtterance(spokenText.value);\n\t\tbindEventsForUtterance(newUtterance);\n\t\treturn newUtterance;\n\t});\n\tconst speak = () => {\n\t\tsynth.cancel();\n\t\tif (utterance) synth.speak(utterance.value);\n\t};\n\tconst stop = () => {\n\t\tsynth.cancel();\n\t\tisPlaying.value = false;\n\t};\n\tif (isSupported.value) {\n\t\tbindEventsForUtterance(utterance.value);\n\t\twatch(lang, (lang) => {\n\t\t\tif (utterance.value && !isPlaying.value) utterance.value.lang = lang;\n\t\t});\n\t\tif (options.voice) watch(options.voice, () => {\n\t\t\tsynth.cancel();\n\t\t});\n\t\twatch(isPlaying, () => {\n\t\t\tif (isPlaying.value) synth.resume();\n\t\t\telse synth.pause();\n\t\t});\n\t}\n\ttryOnScopeDispose(() => {\n\t\tisPlaying.value = false;\n\t});\n\treturn {\n\t\tisSupported,\n\t\tisPlaying,\n\t\tstatus,\n\t\tutterance,\n\t\terror,\n\t\tstop,\n\t\ttoggle,\n\t\tspeak\n\t};\n}\n//#endregion\n//#region useStepper/index.ts\n/* @__NO_SIDE_EFFECTS__ */\nfunction useStepper(steps, initialStep) {\n\tconst stepsRef = ref(steps);\n\tconst stepNames = computed(() => Array.isArray(stepsRef.value) ? stepsRef.value : Object.keys(stepsRef.value));\n\tconst index = ref(stepNames.value.indexOf(initialStep !== null && initialStep !== void 0 ? initialStep : stepNames.value[0]));\n\tconst current = computed(() => at(index.value));\n\tconst isFirst = computed(() => index.value === 0);\n\tconst isLast = computed(() => index.value === stepNames.value.length - 1);\n\tconst next = computed(() => stepNames.value[index.value + 1]);\n\tconst previous = computed(() => stepNames.value[index.value - 1]);\n\tfunction at(index) {\n\t\tif (Array.isArray(stepsRef.value)) return stepsRef.value[index];\n\t\treturn stepsRef.value[stepNames.value[index]];\n\t}\n\tfunction get(step) {\n\t\tif (!stepNames.value.includes(step)) return;\n\t\treturn at(stepNames.value.indexOf(step));\n\t}\n\tfunction goTo(step) {\n\t\tif (stepNames.value.includes(step)) index.value = stepNames.value.indexOf(step);\n\t}\n\tfunction goToNext() {\n\t\tif (isLast.value) return;\n\t\tindex.value++;\n\t}\n\tfunction goToPrevious() {\n\t\tif (isFirst.value) return;\n\t\tindex.value--;\n\t}\n\tfunction goBackTo(step) {\n\t\tif (isAfter(step)) goTo(step);\n\t}\n\tfunction isNext(step) {\n\t\treturn stepNames.value.indexOf(step) === index.value + 1;\n\t}\n\tfunction isPrevious(step) {\n\t\treturn stepNames.value.indexOf(step) === index.value - 1;\n\t}\n\tfunction isCurrent(step) {\n\t\treturn stepNames.value.indexOf(step) === index.value;\n\t}\n\tfunction isBefore(step) {\n\t\treturn index.value < stepNames.value.indexOf(step);\n\t}\n\tfunction isAfter(step) {\n\t\treturn index.value > stepNames.value.indexOf(step);\n\t}\n\treturn {\n\t\tsteps: stepsRef,\n\t\tstepNames,\n\t\tindex,\n\t\tcurrent,\n\t\tnext,\n\t\tprevious,\n\t\tisFirst,\n\t\tisLast,\n\t\tat,\n\t\tget,\n\t\tgoTo,\n\t\tgoToNext,\n\t\tgoToPrevious,\n\t\tgoBackTo,\n\t\tisNext,\n\t\tisPrevious,\n\t\tisCurrent,\n\t\tisBefore,\n\t\tisAfter\n\t};\n}\n//#endregion\n//#region useStorageAsync/index.ts\n/**\n* Reactive Storage with async support.\n*\n* @see https://vueuse.org/useStorageAsync\n* @param key\n* @param initialValue\n* @param storage\n* @param options\n*/\nfunction useStorageAsync(key, initialValue, storage, options = {}) {\n\tvar _options$serializer;\n\tconst { flush = \"pre\", deep = true, listenToStorageChanges = true, writeDefaults = true, mergeDefaults = false, shallow, window = defaultWindow, eventFilter, onError = (e) => {\n\t\tconsole.error(e);\n\t}, onReady } = options;\n\tconst rawInit = toValue(initialValue);\n\tconst type = guessSerializerType(rawInit);\n\tconst data = (shallow ? shallowRef : ref)(toValue(initialValue));\n\tconst serializer = (_options$serializer = options.serializer) !== null && _options$serializer !== void 0 ? _options$serializer : StorageSerializers[type];\n\tif (!storage) try {\n\t\tstorage = getSSRHandler(\"getDefaultStorageAsync\", () => defaultWindow === null || defaultWindow === void 0 ? void 0 : defaultWindow.localStorage)();\n\t} catch (e) {\n\t\tonError(e);\n\t}\n\tasync function read(event) {\n\t\tif (!storage || event && event.key !== key) return;\n\t\ttry {\n\t\t\tconst rawValue = event ? event.newValue : await storage.getItem(key);\n\t\t\tif (rawValue == null) {\n\t\t\t\tdata.value = rawInit;\n\t\t\t\tif (writeDefaults && rawInit !== null) await storage.setItem(key, await serializer.write(rawInit));\n\t\t\t} else if (mergeDefaults) {\n\t\t\t\tconst value = await serializer.read(rawValue);\n\t\t\t\tif (typeof mergeDefaults === \"function\") data.value = mergeDefaults(value, rawInit);\n\t\t\t\telse if (type === \"object\" && !Array.isArray(value)) data.value = {\n\t\t\t\t\t...rawInit,\n\t\t\t\t\t...value\n\t\t\t\t};\n\t\t\t\telse data.value = value;\n\t\t\t} else data.value = await serializer.read(rawValue);\n\t\t} catch (e) {\n\t\t\tonError(e);\n\t\t}\n\t}\n\tconst promise = new Promise((resolve) => {\n\t\tread().then(() => {\n\t\t\tonReady === null || onReady === void 0 || onReady(data.value);\n\t\t\tresolve(data);\n\t\t});\n\t});\n\tif (window && listenToStorageChanges) useEventListener(window, \"storage\", (e) => Promise.resolve().then(() => read(e)), { passive: true });\n\tif (storage) watchWithFilter(data, async () => {\n\t\ttry {\n\t\t\tif (data.value == null) await storage.removeItem(key);\n\t\t\telse await storage.setItem(key, await serializer.write(data.value));\n\t\t} catch (e) {\n\t\t\tonError(e);\n\t\t}\n\t}, {\n\t\tflush,\n\t\tdeep,\n\t\teventFilter\n\t});\n\tObject.assign(data, {\n\t\tthen: promise.then.bind(promise),\n\t\tcatch: promise.catch.bind(promise)\n\t});\n\treturn data;\n}\n//#endregion\n//#region useStyleTag/index.ts\nlet _id = 0;\n/**\n* Inject <style> element in head.\n*\n* Overload: Omitted id\n*\n* @see https://vueuse.org/useStyleTag\n* @param css\n* @param options\n*/\nfunction useStyleTag(css, options = {}) {\n\tconst isLoaded = shallowRef(false);\n\tconst { document = defaultDocument, immediate = true, manual = false, id = `vueuse_styletag_${++_id}` } = options;\n\tconst cssRef = shallowRef(css);\n\tlet stop = () => {};\n\tconst load = () => {\n\t\tif (!document) return;\n\t\tconst el = document.getElementById(id) || document.createElement(\"style\");\n\t\tif (!el.isConnected) {\n\t\t\tel.id = id;\n\t\t\tif (options.nonce) el.nonce = options.nonce;\n\t\t\tif (options.media) el.media = options.media;\n\t\t\tdocument.head.appendChild(el);\n\t\t}\n\t\tif (isLoaded.value) return;\n\t\tstop = watch(cssRef, (value) => {\n\t\t\tel.textContent = value;\n\t\t}, { immediate: true });\n\t\tisLoaded.value = true;\n\t};\n\tconst unload = () => {\n\t\tif (!document || !isLoaded.value) return;\n\t\tstop();\n\t\tdocument.head.removeChild(document.getElementById(id));\n\t\tisLoaded.value = false;\n\t};\n\tif (immediate && !manual) tryOnMounted(load);\n\tif (!manual) tryOnScopeDispose(unload);\n\treturn {\n\t\tid,\n\t\tcss: cssRef,\n\t\tunload,\n\t\tload,\n\t\tisLoaded: shallowReadonly(isLoaded)\n\t};\n}\n//#endregion\n//#region useSwipe/index.ts\n/**\n* Reactive swipe detection.\n*\n* @see https://vueuse.org/useSwipe\n* @param target\n* @param options\n*/\nfunction useSwipe(target, options = {}) {\n\tconst { threshold = 50, onSwipe, onSwipeEnd, onSwipeStart, passive = true } = options;\n\tconst coordsStart = reactive({\n\t\tx: 0,\n\t\ty: 0\n\t});\n\tconst coordsEnd = reactive({\n\t\tx: 0,\n\t\ty: 0\n\t});\n\tconst diffX = computed(() => coordsStart.x - coordsEnd.x);\n\tconst diffY = computed(() => coordsStart.y - coordsEnd.y);\n\tconst { max, abs } = Math;\n\tconst isThresholdExceeded = computed(() => max(abs(diffX.value), abs(diffY.value)) >= threshold);\n\tconst isSwiping = shallowRef(false);\n\tconst direction = computed(() => {\n\t\tif (!isThresholdExceeded.value) return \"none\";\n\t\tif (abs(diffX.value) > abs(diffY.value)) return diffX.value > 0 ? \"left\" : \"right\";\n\t\telse return diffY.value > 0 ? \"up\" : \"down\";\n\t});\n\tconst getTouchEventCoords = (e) => [e.touches[0].clientX, e.touches[0].clientY];\n\tconst updateCoordsStart = (x, y) => {\n\t\tcoordsStart.x = x;\n\t\tcoordsStart.y = y;\n\t};\n\tconst updateCoordsEnd = (x, y) => {\n\t\tcoordsEnd.x = x;\n\t\tcoordsEnd.y = y;\n\t};\n\tconst listenerOptions = {\n\t\tpassive,\n\t\tcapture: !passive\n\t};\n\tconst onTouchEnd = (e) => {\n\t\tif (isSwiping.value) onSwipeEnd === null || onSwipeEnd === void 0 || onSwipeEnd(e, direction.value);\n\t\tisSwiping.value = false;\n\t};\n\tconst stops = [\n\t\tuseEventListener(target, \"touchstart\", (e) => {\n\t\t\tif (e.touches.length !== 1) return;\n\t\t\tconst [x, y] = getTouchEventCoords(e);\n\t\t\tupdateCoordsStart(x, y);\n\t\t\tupdateCoordsEnd(x, y);\n\t\t\tonSwipeStart === null || onSwipeStart === void 0 || onSwipeStart(e);\n\t\t}, listenerOptions),\n\t\tuseEventListener(target, \"touchmove\", (e) => {\n\t\t\tif (e.touches.length !== 1) return;\n\t\t\tconst [x, y] = getTouchEventCoords(e);\n\t\t\tupdateCoordsEnd(x, y);\n\t\t\tif (listenerOptions.capture && !listenerOptions.passive && Math.abs(diffX.value) > Math.abs(diffY.value)) e.preventDefault();\n\t\t\tif (!isSwiping.value && isThresholdExceeded.value) isSwiping.value = true;\n\t\t\tif (isSwiping.value) onSwipe === null || onSwipe === void 0 || onSwipe(e);\n\t\t}, listenerOptions),\n\t\tuseEventListener(target, [\"touchend\", \"touchcancel\"], onTouchEnd, listenerOptions)\n\t];\n\tconst stop = () => stops.forEach((s) => s());\n\treturn {\n\t\tisSwiping,\n\t\tdirection,\n\t\tcoordsStart,\n\t\tcoordsEnd,\n\t\tlengthX: diffX,\n\t\tlengthY: diffY,\n\t\tstop\n\t};\n}\n//#endregion\n//#region useTemplateRefsList/index.ts\n/* @__NO_SIDE_EFFECTS__ */\nfunction useTemplateRefsList() {\n\tconst refs = ref([]);\n\trefs.value.set = (el) => {\n\t\tif (el) refs.value.push(el);\n\t};\n\tonBeforeUpdate(() => {\n\t\trefs.value.length = 0;\n\t});\n\treturn refs;\n}\n//#endregion\n//#region useTextDirection/index.ts\n/**\n* Reactive dir of the element's text.\n*\n* @see https://vueuse.org/useTextDirection\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction useTextDirection(options = {}) {\n\tconst { document = defaultDocument, selector = \"html\", observe = false, initialValue = \"ltr\" } = options;\n\tfunction getValue() {\n\t\tvar _ref, _document$querySelect;\n\t\treturn (_ref = document === null || document === void 0 || (_document$querySelect = document.querySelector(selector)) === null || _document$querySelect === void 0 ? void 0 : _document$querySelect.getAttribute(\"dir\")) !== null && _ref !== void 0 ? _ref : initialValue;\n\t}\n\tconst dir = shallowRef(getValue());\n\ttryOnMounted(() => dir.value = getValue());\n\tif (observe && document) useMutationObserver(document.querySelector(selector), () => dir.value = getValue(), { attributes: true });\n\treturn computed({\n\t\tget() {\n\t\t\treturn dir.value;\n\t\t},\n\t\tset(v) {\n\t\t\tvar _document$querySelect2, _document$querySelect3;\n\t\t\tdir.value = v;\n\t\t\tif (!document) return;\n\t\t\tif (dir.value) (_document$querySelect2 = document.querySelector(selector)) === null || _document$querySelect2 === void 0 || _document$querySelect2.setAttribute(\"dir\", dir.value);\n\t\t\telse (_document$querySelect3 = document.querySelector(selector)) === null || _document$querySelect3 === void 0 || _document$querySelect3.removeAttribute(\"dir\");\n\t\t}\n\t});\n}\n//#endregion\n//#region useTextSelection/index.ts\nfunction getRangesFromSelection(selection) {\n\tvar _selection$rangeCount;\n\tconst rangeCount = (_selection$rangeCount = selection.rangeCount) !== null && _selection$rangeCount !== void 0 ? _selection$rangeCount : 0;\n\treturn Array.from({ length: rangeCount }, (_, i) => selection.getRangeAt(i));\n}\n/**\n* Reactively track user text selection based on [`Window.getSelection`](https://developer.mozilla.org/en-US/docs/Web/API/Window/getSelection).\n*\n* @see https://vueuse.org/useTextSelection\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction useTextSelection(options = {}) {\n\tvar _window$getSelection;\n\tconst { window = defaultWindow } = options;\n\tconst selection = shallowRef((_window$getSelection = window === null || window === void 0 ? void 0 : window.getSelection()) !== null && _window$getSelection !== void 0 ? _window$getSelection : null);\n\tconst text = computed(() => {\n\t\tvar _selection$value$toSt, _selection$value;\n\t\treturn (_selection$value$toSt = (_selection$value = selection.value) === null || _selection$value === void 0 ? void 0 : _selection$value.toString()) !== null && _selection$value$toSt !== void 0 ? _selection$value$toSt : \"\";\n\t});\n\tconst ranges = computed(() => selection.value ? getRangesFromSelection(selection.value) : []);\n\tconst rects = computed(() => ranges.value.map((range) => range.getBoundingClientRect()));\n\tfunction onSelectionChange() {\n\t\tselection.value = null;\n\t\tif (window) selection.value = window.getSelection();\n\t}\n\tif (window) useEventListener(window.document, \"selectionchange\", onSelectionChange, { passive: true });\n\treturn {\n\t\ttext,\n\t\trects,\n\t\tranges,\n\t\tselection\n\t};\n}\n//#endregion\n//#region useTextareaAutosize/index.ts\n/**\n* Call window.requestAnimationFrame(), if not available, just call the function\n*\n* @param window\n* @param fn\n*/\nfunction tryRequestAnimationFrame(window = defaultWindow, fn) {\n\tif (window && typeof window.requestAnimationFrame === \"function\") window.requestAnimationFrame(fn);\n\telse fn();\n}\nfunction useTextareaAutosize(options = {}) {\n\tvar _options$input, _options$styleProp;\n\tconst { window = defaultWindow } = options;\n\tconst textarea = toRef(options === null || options === void 0 ? void 0 : options.element);\n\tconst input = toRef((_options$input = options === null || options === void 0 ? void 0 : options.input) !== null && _options$input !== void 0 ? _options$input : \"\");\n\tconst styleProp = (_options$styleProp = options === null || options === void 0 ? void 0 : options.styleProp) !== null && _options$styleProp !== void 0 ? _options$styleProp : \"height\";\n\tconst textareaScrollHeight = shallowRef(1);\n\tconst textareaOldWidth = shallowRef(0);\n\tfunction triggerResize() {\n\t\tvar _textarea$value;\n\t\tif (!textarea.value) return;\n\t\tlet height = \"\";\n\t\tconst maxHeight = options === null || options === void 0 ? void 0 : options.maxHeight;\n\t\ttextarea.value.style[styleProp] = \"1px\";\n\t\ttextareaScrollHeight.value = (_textarea$value = textarea.value) === null || _textarea$value === void 0 ? void 0 : _textarea$value.scrollHeight;\n\t\tconst _styleTarget = toValue(options === null || options === void 0 ? void 0 : options.styleTarget);\n\t\tconst styleHeight = maxHeight != null ? `${Math.min(textareaScrollHeight.value, maxHeight)}px` : `${textareaScrollHeight.value}px`;\n\t\tif (_styleTarget) _styleTarget.style[styleProp] = styleHeight;\n\t\telse height = styleHeight;\n\t\ttextarea.value.style[styleProp] = height;\n\t}\n\twatch([input, textarea], () => nextTick(triggerResize), { immediate: true });\n\twatch(textareaScrollHeight, () => {\n\t\tvar _options$onResize;\n\t\treturn options === null || options === void 0 || (_options$onResize = options.onResize) === null || _options$onResize === void 0 ? void 0 : _options$onResize.call(options);\n\t});\n\tuseResizeObserver(textarea, ([{ contentRect }]) => {\n\t\tif (textareaOldWidth.value === contentRect.width) return;\n\t\ttryRequestAnimationFrame(window, () => {\n\t\t\ttextareaOldWidth.value = contentRect.width;\n\t\t\ttriggerResize();\n\t\t});\n\t});\n\tif (options === null || options === void 0 ? void 0 : options.watch) watch(options.watch, triggerResize, {\n\t\timmediate: true,\n\t\tdeep: true\n\t});\n\treturn {\n\t\ttextarea,\n\t\tinput,\n\t\ttriggerResize\n\t};\n}\n//#endregion\n//#region useThrottledRefHistory/index.ts\n/**\n* Shorthand for [useRefHistory](https://vueuse.org/useRefHistory) with throttled filter.\n*\n* @see https://vueuse.org/useThrottledRefHistory\n* @param source\n* @param options\n*/\nfunction useThrottledRefHistory(source, options = {}) {\n\tconst { throttle = 200, trailing = true } = options;\n\tconst filter = throttleFilter(throttle, trailing);\n\treturn { ...useRefHistory(source, {\n\t\t...options,\n\t\teventFilter: filter\n\t}) };\n}\n//#endregion\n//#region useTimeAgo/index.ts\nconst DEFAULT_UNITS = [\n\t{\n\t\tmax: 6e4,\n\t\tvalue: 1e3,\n\t\tname: \"second\"\n\t},\n\t{\n\t\tmax: 276e4,\n\t\tvalue: 6e4,\n\t\tname: \"minute\"\n\t},\n\t{\n\t\tmax: 72e6,\n\t\tvalue: 36e5,\n\t\tname: \"hour\"\n\t},\n\t{\n\t\tmax: 5184e5,\n\t\tvalue: 864e5,\n\t\tname: \"day\"\n\t},\n\t{\n\t\tmax: 24192e5,\n\t\tvalue: 6048e5,\n\t\tname: \"week\"\n\t},\n\t{\n\t\tmax: 28512e6,\n\t\tvalue: 2592e6,\n\t\tname: \"month\"\n\t},\n\t{\n\t\tmax: Number.POSITIVE_INFINITY,\n\t\tvalue: 31536e6,\n\t\tname: \"year\"\n\t}\n];\nconst DEFAULT_MESSAGES = {\n\tjustNow: \"just now\",\n\tpast: (n) => /\\d/.test(n) ? `${n} ago` : n,\n\tfuture: (n) => /\\d/.test(n) ? `in ${n}` : n,\n\tmonth: (n, past) => n === 1 ? past ? \"last month\" : \"next month\" : `${n} month${n > 1 ? \"s\" : \"\"}`,\n\tyear: (n, past) => n === 1 ? past ? \"last year\" : \"next year\" : `${n} year${n > 1 ? \"s\" : \"\"}`,\n\tday: (n, past) => n === 1 ? past ? \"yesterday\" : \"tomorrow\" : `${n} day${n > 1 ? \"s\" : \"\"}`,\n\tweek: (n, past) => n === 1 ? past ? \"last week\" : \"next week\" : `${n} week${n > 1 ? \"s\" : \"\"}`,\n\thour: (n) => `${n} hour${n > 1 ? \"s\" : \"\"}`,\n\tminute: (n) => `${n} minute${n > 1 ? \"s\" : \"\"}`,\n\tsecond: (n) => `${n} second${n > 1 ? \"s\" : \"\"}`,\n\tinvalid: \"\"\n};\nfunction DEFAULT_FORMATTER(date) {\n\treturn date.toISOString().slice(0, 10);\n}\nfunction getDefaultScheduler$4(options) {\n\tif (\"updateInterval\" in options) {\n\t\tconst { updateInterval = 3e4 } = options;\n\t\treturn (cb) => useIntervalFn(cb, updateInterval);\n\t}\n\treturn (cb) => useIntervalFn(cb, 3e4);\n}\n/**\n* Reactive time ago formatter.\n*\n* @see https://vueuse.org/useTimeAgo\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction useTimeAgo(time, options = {}) {\n\tconst { controls: exposeControls = false, scheduler = getDefaultScheduler$4(options) } = options;\n\tconst { now, ...controls } = useNow({\n\t\tscheduler,\n\t\tcontrols: true\n\t});\n\tconst timeAgo = computed(() => formatTimeAgo(new Date(toValue(time)), options, toValue(now)));\n\tif (exposeControls) return {\n\t\ttimeAgo,\n\t\t...controls\n\t};\n\telse return timeAgo;\n}\nfunction formatTimeAgo(from, options = {}, now = Date.now()) {\n\tconst { max, messages = DEFAULT_MESSAGES, fullDateFormatter = DEFAULT_FORMATTER, units = DEFAULT_UNITS, showSecond = false, rounding = \"round\" } = options;\n\tconst roundFn = typeof rounding === \"number\" ? (n) => +n.toFixed(rounding) : Math[rounding];\n\tconst diff = +now - +from;\n\tconst absDiff = Math.abs(diff);\n\tfunction getValue(diff, unit) {\n\t\treturn roundFn(Math.abs(diff) / unit.value);\n\t}\n\tfunction format(diff, unit) {\n\t\tconst val = getValue(diff, unit);\n\t\tconst past = diff > 0;\n\t\tconst str = applyFormat(unit.name, val, past);\n\t\treturn applyFormat(past ? \"past\" : \"future\", str, past);\n\t}\n\tfunction applyFormat(name, val, isPast) {\n\t\tconst formatter = messages[name];\n\t\tif (typeof formatter === \"function\") return formatter(val, isPast);\n\t\treturn formatter.replace(\"{0}\", val.toString());\n\t}\n\tif (absDiff < 6e4 && !showSecond) return messages.justNow;\n\tif (typeof max === \"number\" && absDiff > max) return fullDateFormatter(new Date(from));\n\tif (typeof max === \"string\") {\n\t\tvar _units$find;\n\t\tconst unitMax = (_units$find = units.find((i) => i.name === max)) === null || _units$find === void 0 ? void 0 : _units$find.max;\n\t\tif (unitMax && absDiff > unitMax) return fullDateFormatter(new Date(from));\n\t}\n\tfor (const [idx, unit] of units.entries()) {\n\t\tif (getValue(diff, unit) <= 0 && units[idx - 1]) return format(diff, units[idx - 1]);\n\t\tif (absDiff < unit.max) return format(diff, unit);\n\t}\n\treturn messages.invalid;\n}\n//#endregion\n//#region useTimeAgoIntl/index.ts\nconst UNITS = [\n\t{\n\t\tname: \"year\",\n\t\tms: 31536e6\n\t},\n\t{\n\t\tname: \"month\",\n\t\tms: 2592e6\n\t},\n\t{\n\t\tname: \"week\",\n\t\tms: 6048e5\n\t},\n\t{\n\t\tname: \"day\",\n\t\tms: 864e5\n\t},\n\t{\n\t\tname: \"hour\",\n\t\tms: 36e5\n\t},\n\t{\n\t\tname: \"minute\",\n\t\tms: 6e4\n\t},\n\t{\n\t\tname: \"second\",\n\t\tms: 1e3\n\t}\n];\nfunction getDefaultScheduler$3(options) {\n\tif (\"updateInterval\" in options) {\n\t\tconst { updateInterval = 3e4 } = options;\n\t\treturn (cb) => useIntervalFn(cb, updateInterval);\n\t}\n\treturn (cb) => useIntervalFn(cb, 3e4);\n}\nfunction useTimeAgoIntl(time, options = {}) {\n\tconst { controls: exposeControls = false, scheduler = getDefaultScheduler$3(options) } = options;\n\tconst { now, ...controls } = useNow({\n\t\tscheduler,\n\t\tcontrols: true\n\t});\n\tconst result = computed(() => getTimeAgoIntlResult(new Date(toValue(time)), options, toValue(now)));\n\tconst parts = computed(() => result.value.parts);\n\tconst timeAgoIntl = computed(() => formatTimeAgoIntlParts(parts.value, {\n\t\t...options,\n\t\tlocale: result.value.resolvedLocale\n\t}));\n\treturn exposeControls ? {\n\t\ttimeAgoIntl,\n\t\tparts,\n\t\t...controls\n\t} : timeAgoIntl;\n}\n/**\n* Non-reactive version of useTimeAgoIntl\n*/\nfunction formatTimeAgoIntl(from, options = {}, now = Date.now()) {\n\tconst { parts, resolvedLocale } = getTimeAgoIntlResult(from, options, now);\n\treturn formatTimeAgoIntlParts(parts, {\n\t\t...options,\n\t\tlocale: resolvedLocale\n\t});\n}\n/**\n* Get parts from `Intl.RelativeTimeFormat.formatToParts`.\n*/\nfunction getTimeAgoIntlResult(from, options = {}, now = Date.now()) {\n\tvar _options$units;\n\tconst { locale, relativeTimeFormatOptions = { numeric: \"auto\" } } = options;\n\tconst rtf = new Intl.RelativeTimeFormat(locale, relativeTimeFormatOptions);\n\tconst { locale: resolvedLocale } = rtf.resolvedOptions();\n\tconst diff = +from - +now;\n\tconst absDiff = Math.abs(diff);\n\tconst units = (_options$units = options.units) !== null && _options$units !== void 0 ? _options$units : UNITS;\n\tfor (const { name, ms } of units) if (absDiff >= ms) return {\n\t\tresolvedLocale,\n\t\tparts: rtf.formatToParts(Math.round(diff / ms), name)\n\t};\n\treturn {\n\t\tresolvedLocale,\n\t\tparts: rtf.formatToParts(0, units[units.length - 1].name)\n\t};\n}\n/**\n* Format parts into a string\n*/\nfunction formatTimeAgoIntlParts(parts, options = {}) {\n\tconst { insertSpace = true, joinParts, locale } = options;\n\tif (typeof joinParts === \"function\") return joinParts(parts, locale);\n\tif (!insertSpace) return parts.map((part) => part.value).join(\"\");\n\treturn parts.map((part) => part.value.trim()).join(\" \");\n}\n//#endregion\n//#region useTimeoutPoll/index.ts\nfunction useTimeoutPoll(fn, interval, options = {}) {\n\tconst { immediate = true, immediateCallback = false } = options;\n\tconst { start } = useTimeoutFn(loop, interval, { immediate });\n\tconst isActive = shallowRef(false);\n\tasync function loop() {\n\t\tif (!isActive.value) return;\n\t\tawait fn();\n\t\tstart();\n\t}\n\tfunction resume() {\n\t\tif (!isActive.value) {\n\t\t\tisActive.value = true;\n\t\t\tif (immediateCallback) fn();\n\t\t\tstart();\n\t\t}\n\t}\n\tfunction pause() {\n\t\tisActive.value = false;\n\t}\n\tif (immediate && isClient) resume();\n\ttryOnScopeDispose(pause);\n\treturn {\n\t\tisActive,\n\t\tpause,\n\t\tresume\n\t};\n}\n//#endregion\n//#region useTimestamp/index.ts\nfunction getDefaultScheduler$2(options) {\n\tif (\"interval\" in options || \"immediate\" in options) {\n\t\tconst { interval = \"requestAnimationFrame\", immediate = true } = options;\n\t\treturn interval === \"requestAnimationFrame\" ? (cb) => useRafFn(cb, { immediate }) : (cb) => useIntervalFn(cb, interval, { immediate });\n\t}\n\treturn useRafFn;\n}\nfunction useTimestamp(options = {}) {\n\tconst { controls: exposeControls = false, offset = 0, scheduler = getDefaultScheduler$2(options), callback } = options;\n\tconst ts = shallowRef(timestamp() + offset);\n\tconst update = () => ts.value = timestamp() + offset;\n\tconst controls = scheduler(callback ? () => {\n\t\tupdate();\n\t\tcallback(ts.value);\n\t} : update);\n\tif (exposeControls) return {\n\t\ttimestamp: ts,\n\t\t...controls\n\t};\n\telse return ts;\n}\n//#endregion\n//#region useTitle/index.ts\nfunction useTitle(newTitle = null, options = {}) {\n\tvar _document$title, _ref;\n\tconst { document = defaultDocument, restoreOnUnmount = (t) => t } = options;\n\tconst originalTitle = (_document$title = document === null || document === void 0 ? void 0 : document.title) !== null && _document$title !== void 0 ? _document$title : \"\";\n\tconst title = toRef((_ref = newTitle !== null && newTitle !== void 0 ? newTitle : document === null || document === void 0 ? void 0 : document.title) !== null && _ref !== void 0 ? _ref : null);\n\tconst isReadonly = !!(newTitle && typeof newTitle === \"function\");\n\tfunction format(t) {\n\t\tif (!(\"titleTemplate\" in options)) return t;\n\t\tconst template = options.titleTemplate || \"%s\";\n\t\treturn typeof template === \"function\" ? template(t) : toValue(template).replace(/%s/g, t);\n\t}\n\twatch(title, (newValue, oldValue) => {\n\t\tif (newValue !== oldValue && document) document.title = format(newValue !== null && newValue !== void 0 ? newValue : \"\");\n\t}, { immediate: true });\n\tif (options.observe && !options.titleTemplate && document && !isReadonly) {\n\t\tvar _document$head;\n\t\tuseMutationObserver((_document$head = document.head) === null || _document$head === void 0 ? void 0 : _document$head.querySelector(\"title\"), () => {\n\t\t\tif (document && document.title !== title.value) title.value = format(document.title);\n\t\t}, { childList: true });\n\t}\n\ttryOnScopeDispose(() => {\n\t\tif (restoreOnUnmount) {\n\t\t\tconst restoredTitle = restoreOnUnmount(originalTitle, title.value || \"\");\n\t\t\tif (restoredTitle != null && document) document.title = restoredTitle;\n\t\t}\n\t});\n\treturn title;\n}\n/**\n* Common transitions\n*\n* @see https://easings.net\n*/\nconst TransitionPresets = /* @__PURE__ */ Object.assign({}, { linear: identity }, {\n\teaseInSine: [\n\t\t.12,\n\t\t0,\n\t\t.39,\n\t\t0\n\t],\n\teaseOutSine: [\n\t\t.61,\n\t\t1,\n\t\t.88,\n\t\t1\n\t],\n\teaseInOutSine: [\n\t\t.37,\n\t\t0,\n\t\t.63,\n\t\t1\n\t],\n\teaseInQuad: [\n\t\t.11,\n\t\t0,\n\t\t.5,\n\t\t0\n\t],\n\teaseOutQuad: [\n\t\t.5,\n\t\t1,\n\t\t.89,\n\t\t1\n\t],\n\teaseInOutQuad: [\n\t\t.45,\n\t\t0,\n\t\t.55,\n\t\t1\n\t],\n\teaseInCubic: [\n\t\t.32,\n\t\t0,\n\t\t.67,\n\t\t0\n\t],\n\teaseOutCubic: [\n\t\t.33,\n\t\t1,\n\t\t.68,\n\t\t1\n\t],\n\teaseInOutCubic: [\n\t\t.65,\n\t\t0,\n\t\t.35,\n\t\t1\n\t],\n\teaseInQuart: [\n\t\t.5,\n\t\t0,\n\t\t.75,\n\t\t0\n\t],\n\teaseOutQuart: [\n\t\t.25,\n\t\t1,\n\t\t.5,\n\t\t1\n\t],\n\teaseInOutQuart: [\n\t\t.76,\n\t\t0,\n\t\t.24,\n\t\t1\n\t],\n\teaseInQuint: [\n\t\t.64,\n\t\t0,\n\t\t.78,\n\t\t0\n\t],\n\teaseOutQuint: [\n\t\t.22,\n\t\t1,\n\t\t.36,\n\t\t1\n\t],\n\teaseInOutQuint: [\n\t\t.83,\n\t\t0,\n\t\t.17,\n\t\t1\n\t],\n\teaseInExpo: [\n\t\t.7,\n\t\t0,\n\t\t.84,\n\t\t0\n\t],\n\teaseOutExpo: [\n\t\t.16,\n\t\t1,\n\t\t.3,\n\t\t1\n\t],\n\teaseInOutExpo: [\n\t\t.87,\n\t\t0,\n\t\t.13,\n\t\t1\n\t],\n\teaseInCirc: [\n\t\t.55,\n\t\t0,\n\t\t1,\n\t\t.45\n\t],\n\teaseOutCirc: [\n\t\t0,\n\t\t.55,\n\t\t.45,\n\t\t1\n\t],\n\teaseInOutCirc: [\n\t\t.85,\n\t\t0,\n\t\t.15,\n\t\t1\n\t],\n\teaseInBack: [\n\t\t.36,\n\t\t0,\n\t\t.66,\n\t\t-.56\n\t],\n\teaseOutBack: [\n\t\t.34,\n\t\t1.56,\n\t\t.64,\n\t\t1\n\t],\n\teaseInOutBack: [\n\t\t.68,\n\t\t-.6,\n\t\t.32,\n\t\t1.6\n\t]\n});\n/**\n* Create an easing function from cubic bezier points.\n*/\nfunction createEasingFunction([p0, p1, p2, p3]) {\n\tconst a = (a1, a2) => 1 - 3 * a2 + 3 * a1;\n\tconst b = (a1, a2) => 3 * a2 - 6 * a1;\n\tconst c = (a1) => 3 * a1;\n\tconst calcBezier = (t, a1, a2) => ((a(a1, a2) * t + b(a1, a2)) * t + c(a1)) * t;\n\tconst getSlope = (t, a1, a2) => 3 * a(a1, a2) * t * t + 2 * b(a1, a2) * t + c(a1);\n\tconst getTforX = (x) => {\n\t\tlet aGuessT = x;\n\t\tfor (let i = 0; i < 4; ++i) {\n\t\t\tconst currentSlope = getSlope(aGuessT, p0, p2);\n\t\t\tif (currentSlope === 0) return aGuessT;\n\t\t\tconst currentX = calcBezier(aGuessT, p0, p2) - x;\n\t\t\taGuessT -= currentX / currentSlope;\n\t\t}\n\t\treturn aGuessT;\n\t};\n\treturn (x) => p0 === p1 && p2 === p3 ? x : calcBezier(getTforX(x), p1, p3);\n}\nfunction lerp(a, b, alpha) {\n\treturn a + alpha * (b - a);\n}\nfunction defaultInterpolation(a, b, t) {\n\tconst aVal = toValue(a);\n\tconst bVal = toValue(b);\n\tif (typeof aVal === \"number\" && typeof bVal === \"number\") return lerp(aVal, bVal, t);\n\tif (Array.isArray(aVal) && Array.isArray(bVal)) return aVal.map((v, i) => lerp(v, toValue(bVal[i]), t));\n\tthrow new TypeError(\"Unknown transition type, specify an interpolation function.\");\n}\nfunction normalizeEasing(easing) {\n\tvar _toValue;\n\treturn typeof easing === \"function\" ? easing : (_toValue = toValue(easing)) !== null && _toValue !== void 0 ? _toValue : identity;\n}\n/**\n* Transition from one value to another.\n*\n* @param source\n* @param from\n* @param to\n* @param options\n*/\nfunction transition(source, from, to, options = {}) {\n\tvar _toValue2;\n\tconst { window = defaultWindow } = options;\n\tconst fromVal = toValue(from);\n\tconst toVal = toValue(to);\n\tconst duration = (_toValue2 = toValue(options.duration)) !== null && _toValue2 !== void 0 ? _toValue2 : 1e3;\n\tconst startedAt = Date.now();\n\tconst endAt = Date.now() + duration;\n\tconst interpolation = typeof options.interpolation === \"function\" ? options.interpolation : defaultInterpolation;\n\tconst trans = typeof options.easing !== \"undefined\" ? normalizeEasing(options.easing) : normalizeEasing(options.transition);\n\tconst ease = typeof trans === \"function\" ? trans : createEasingFunction(trans);\n\treturn new Promise((resolve) => {\n\t\tsource.value = fromVal;\n\t\tconst tick = () => {\n\t\t\tvar _options$abort;\n\t\t\tif ((_options$abort = options.abort) === null || _options$abort === void 0 ? void 0 : _options$abort.call(options)) {\n\t\t\t\tresolve();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst now = Date.now();\n\t\t\tsource.value = interpolation(fromVal, toVal, ease((now - startedAt) / duration));\n\t\t\tif (now < endAt) window === null || window === void 0 || window.requestAnimationFrame(tick);\n\t\t\telse {\n\t\t\t\tsource.value = toVal;\n\t\t\t\tresolve();\n\t\t\t}\n\t\t};\n\t\ttick();\n\t});\n}\n/**\n* Transition from one value to another.\n* @deprecated The `executeTransition` function is deprecated, use `transition` instead.\n*\n* @param source\n* @param from\n* @param to\n* @param options\n*/\nfunction executeTransition(source, from, to, options = {}) {\n\treturn transition(source, from, to, options);\n}\n/**\n* Follow value with a transition.\n*\n* @see https://vueuse.org/useTransition\n* @param source\n* @param options\n*/\nfunction useTransition(source, options = {}) {\n\tlet currentId = 0;\n\tconst sourceVal = () => {\n\t\tconst v = toValue(source);\n\t\treturn typeof options.interpolation === \"undefined\" && Array.isArray(v) ? v.map(toValue) : v;\n\t};\n\tconst outputRef = shallowRef(sourceVal());\n\twatch(sourceVal, async (to) => {\n\t\tvar _options$onStarted, _options$onFinished;\n\t\tif (toValue(options.disabled)) return;\n\t\tconst id = ++currentId;\n\t\tif (options.delay) await promiseTimeout(toValue(options.delay));\n\t\tif (id !== currentId) return;\n\t\t(_options$onStarted = options.onStarted) === null || _options$onStarted === void 0 || _options$onStarted.call(options);\n\t\tawait transition(outputRef, outputRef.value, to, {\n\t\t\t...options,\n\t\t\tabort: () => {\n\t\t\t\tvar _options$abort2;\n\t\t\t\treturn id !== currentId || ((_options$abort2 = options.abort) === null || _options$abort2 === void 0 ? void 0 : _options$abort2.call(options));\n\t\t\t}\n\t\t});\n\t\t(_options$onFinished = options.onFinished) === null || _options$onFinished === void 0 || _options$onFinished.call(options);\n\t}, { deep: true });\n\twatch(() => toValue(options.disabled), (disabled) => {\n\t\tif (disabled) {\n\t\t\tcurrentId++;\n\t\t\toutputRef.value = sourceVal();\n\t\t}\n\t});\n\ttryOnScopeDispose(() => {\n\t\tcurrentId++;\n\t});\n\treturn computed(() => toValue(options.disabled) ? sourceVal() : outputRef.value);\n}\n//#endregion\n//#region useUrlSearchParams/index.ts\n/**\n* Reactive URLSearchParams\n*\n* @see https://vueuse.org/useUrlSearchParams\n* @param mode\n* @param options\n*/\nfunction useUrlSearchParams(mode = \"history\", options = {}) {\n\tconst { initialValue = {}, removeNullishValues = true, removeFalsyValues = false, write: enableWrite = true, writeMode = \"replace\", window = defaultWindow, stringify = (params) => params.toString() } = options;\n\tif (!window) return reactive(initialValue);\n\tconst state = reactive({});\n\tfunction getRawParams() {\n\t\tif (mode === \"history\") return window.location.search || \"\";\n\t\telse if (mode === \"hash\") {\n\t\t\tconst hash = window.location.hash || \"\";\n\t\t\tconst index = hash.indexOf(\"?\");\n\t\t\treturn index > 0 ? hash.slice(index) : \"\";\n\t\t} else return (window.location.hash || \"\").replace(/^#/, \"\");\n\t}\n\tfunction constructQuery(params) {\n\t\tconst stringified = stringify(params);\n\t\tif (mode === \"history\") return `${stringified ? `?${stringified}` : \"\"}${window.location.hash || \"\"}`;\n\t\tif (mode === \"hash-params\") return `${window.location.search || \"\"}${stringified ? `#${stringified}` : \"\"}`;\n\t\tconst hash = window.location.hash || \"#\";\n\t\tconst index = hash.indexOf(\"?\");\n\t\tif (index > 0) return `${window.location.search || \"\"}${hash.slice(0, index)}${stringified ? `?${stringified}` : \"\"}`;\n\t\treturn `${window.location.search || \"\"}${hash}${stringified ? `?${stringified}` : \"\"}`;\n\t}\n\tfunction read() {\n\t\treturn new URLSearchParams(getRawParams());\n\t}\n\tfunction updateState(params) {\n\t\tconst unusedKeys = new Set(Object.keys(state));\n\t\tfor (const key of params.keys()) {\n\t\t\tconst paramsForKey = params.getAll(key);\n\t\t\tstate[key] = paramsForKey.length > 1 ? paramsForKey : params.get(key) || \"\";\n\t\t\tunusedKeys.delete(key);\n\t\t}\n\t\tArray.from(unusedKeys).forEach((key) => delete state[key]);\n\t}\n\tconst { pause, resume } = watchPausable(state, () => {\n\t\tconst params = new URLSearchParams(\"\");\n\t\tObject.keys(state).forEach((key) => {\n\t\t\tconst mapEntry = state[key];\n\t\t\tif (Array.isArray(mapEntry)) mapEntry.forEach((value) => params.append(key, value));\n\t\t\telse if (removeNullishValues && mapEntry == null) params.delete(key);\n\t\t\telse if (removeFalsyValues && !mapEntry) params.delete(key);\n\t\t\telse params.set(key, mapEntry);\n\t\t});\n\t\twrite(params, false);\n\t}, { deep: true });\n\tfunction write(params, shouldUpdate, shouldWriteHistory = true) {\n\t\tpause();\n\t\tif (shouldUpdate) updateState(params);\n\t\tif (writeMode === \"replace\") window.history.replaceState(window.history.state, window.document.title, window.location.pathname + constructQuery(params));\n\t\telse if (shouldWriteHistory) window.history.pushState(window.history.state, window.document.title, window.location.pathname + constructQuery(params));\n\t\tnextTick(() => resume());\n\t}\n\tfunction onChanged() {\n\t\tif (!enableWrite) return;\n\t\twrite(read(), true, false);\n\t}\n\tconst listenerOptions = { passive: true };\n\tuseEventListener(window, \"popstate\", onChanged, listenerOptions);\n\tif (mode !== \"history\") useEventListener(window, \"hashchange\", onChanged, listenerOptions);\n\tconst initial = read();\n\tif (initial.keys().next().value) updateState(initial);\n\telse Object.assign(state, initialValue);\n\treturn state;\n}\n//#endregion\n//#region useUserMedia/index.ts\n/**\n* Reactive `mediaDevices.getUserMedia` streaming\n*\n* @see https://vueuse.org/useUserMedia\n* @param options\n*/\nfunction useUserMedia(options = {}) {\n\tvar _options$enabled, _options$autoSwitch;\n\tconst enabled = shallowRef((_options$enabled = options.enabled) !== null && _options$enabled !== void 0 ? _options$enabled : false);\n\tconst autoSwitch = shallowRef((_options$autoSwitch = options.autoSwitch) !== null && _options$autoSwitch !== void 0 ? _options$autoSwitch : true);\n\tconst constraints = ref(options.constraints);\n\tconst { navigator = defaultNavigator } = options;\n\tconst isSupported = /* @__PURE__ */ useSupported(() => {\n\t\tvar _navigator$mediaDevic;\n\t\treturn navigator === null || navigator === void 0 || (_navigator$mediaDevic = navigator.mediaDevices) === null || _navigator$mediaDevic === void 0 ? void 0 : _navigator$mediaDevic.getUserMedia;\n\t});\n\tconst stream = shallowRef();\n\tfunction getDeviceOptions(type) {\n\t\tswitch (type) {\n\t\t\tcase \"video\":\n\t\t\t\tif (constraints.value) return constraints.value.video || false;\n\t\t\t\tbreak;\n\t\t\tcase \"audio\":\n\t\t\t\tif (constraints.value) return constraints.value.audio || false;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\tasync function _start() {\n\t\tif (!isSupported.value || stream.value) return;\n\t\tstream.value = await navigator.mediaDevices.getUserMedia({\n\t\t\tvideo: getDeviceOptions(\"video\"),\n\t\t\taudio: getDeviceOptions(\"audio\")\n\t\t});\n\t\treturn stream.value;\n\t}\n\tfunction _stop() {\n\t\tvar _stream$value;\n\t\t(_stream$value = stream.value) === null || _stream$value === void 0 || _stream$value.getTracks().forEach((t) => t.stop());\n\t\tstream.value = void 0;\n\t}\n\tfunction stop() {\n\t\t_stop();\n\t\tenabled.value = false;\n\t}\n\tasync function start() {\n\t\tawait _start();\n\t\tif (stream.value) enabled.value = true;\n\t\treturn stream.value;\n\t}\n\tasync function restart() {\n\t\t_stop();\n\t\treturn await start();\n\t}\n\twatch(enabled, (v) => {\n\t\tif (v) _start();\n\t\telse _stop();\n\t}, { immediate: true });\n\twatch(constraints, () => {\n\t\tif (autoSwitch.value && stream.value) restart();\n\t}, {\n\t\timmediate: true,\n\t\tdeep: true\n\t});\n\ttryOnScopeDispose(() => {\n\t\tstop();\n\t});\n\treturn {\n\t\tisSupported,\n\t\tstream,\n\t\tstart,\n\t\tstop,\n\t\trestart,\n\t\tconstraints,\n\t\tenabled,\n\t\tautoSwitch\n\t};\n}\n//#endregion\n//#region useVModel/index.ts\n/**\n* Shorthand for v-model binding, props + emit -> ref\n*\n* @see https://vueuse.org/useVModel\n* @param props\n* @param key (default 'modelValue')\n* @param emit\n* @param options\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction useVModel(props, key, emit, options = {}) {\n\tvar _vm$$emit, _vm$proxy;\n\tconst { clone = false, passive = false, eventName, deep = false, defaultValue, shouldEmit } = options;\n\tconst vm = getCurrentInstance();\n\tconst _emit = emit || (vm === null || vm === void 0 ? void 0 : vm.emit) || (vm === null || vm === void 0 || (_vm$$emit = vm.$emit) === null || _vm$$emit === void 0 ? void 0 : _vm$$emit.bind(vm)) || (vm === null || vm === void 0 || (_vm$proxy = vm.proxy) === null || _vm$proxy === void 0 || (_vm$proxy = _vm$proxy.$emit) === null || _vm$proxy === void 0 ? void 0 : _vm$proxy.bind(vm === null || vm === void 0 ? void 0 : vm.proxy));\n\tlet event = eventName;\n\tif (!key) key = \"modelValue\";\n\tevent = event || `update:${key.toString()}`;\n\tconst cloneFn = (val) => !clone ? val : typeof clone === \"function\" ? clone(val) : cloneFnJSON(val);\n\tconst getValue = () => isDef(props[key]) ? cloneFn(props[key]) : defaultValue;\n\tconst triggerEmit = (value) => {\n\t\tif (shouldEmit) {\n\t\t\tif (shouldEmit(value)) _emit(event, value);\n\t\t} else _emit(event, value);\n\t};\n\tif (passive) {\n\t\tconst proxy = ref(getValue());\n\t\tlet isUpdating = false;\n\t\twatch(() => props[key], (v) => {\n\t\t\tif (!isUpdating) {\n\t\t\t\tisUpdating = true;\n\t\t\t\tproxy.value = cloneFn(v);\n\t\t\t\tnextTick(() => isUpdating = false);\n\t\t\t}\n\t\t});\n\t\twatch(proxy, (v) => {\n\t\t\tif (!isUpdating && (v !== props[key] || deep)) triggerEmit(v);\n\t\t}, { deep });\n\t\treturn proxy;\n\t} else return computed({\n\t\tget() {\n\t\t\treturn getValue();\n\t\t},\n\t\tset(value) {\n\t\t\ttriggerEmit(value);\n\t\t}\n\t});\n}\n//#endregion\n//#region useVModels/index.ts\n/**\n* Shorthand for props v-model binding. Think like `toRefs(props)` but changes will also emit out.\n*\n* @see https://vueuse.org/useVModels\n* @param props\n* @param emit\n* @param options\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction useVModels(props, emit, options = {}) {\n\tconst ret = {};\n\tfor (const key in props) ret[key] = useVModel(props, key, emit, options);\n\treturn ret;\n}\n//#endregion\n//#region useVibrate/index.ts\nfunction getDefaultScheduler$1(options = { interval: 0 }) {\n\tconst { interval } = options;\n\tif (interval === 0) return;\n\treturn (fn) => useIntervalFn(fn, interval, {\n\t\timmediate: false,\n\t\timmediateCallback: false\n\t});\n}\n/**\n* Reactive vibrate\n*\n* @see https://vueuse.org/useVibrate\n* @see https://developer.mozilla.org/en-US/docs/Web/API/Vibration_API\n* @param options\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction useVibrate(options) {\n\tconst { pattern = [], scheduler = getDefaultScheduler$1(options), navigator = defaultNavigator } = options || {};\n\tconst isSupported = /* @__PURE__ */ useSupported(() => typeof navigator !== \"undefined\" && \"vibrate\" in navigator);\n\tconst patternRef = toRef(pattern);\n\tconst vibrate = (pattern = patternRef.value) => {\n\t\tif (isSupported.value) navigator.vibrate(pattern);\n\t};\n\tconst intervalControls = scheduler === null || scheduler === void 0 ? void 0 : scheduler(vibrate);\n\tconst stop = () => {\n\t\tif (isSupported.value) navigator.vibrate(0);\n\t\tintervalControls === null || intervalControls === void 0 || intervalControls.pause();\n\t};\n\treturn {\n\t\tisSupported,\n\t\tpattern,\n\t\tintervalControls,\n\t\tvibrate,\n\t\tstop\n\t};\n}\n//#endregion\n//#region useVirtualList/index.ts\n/**\n* Please consider using [`vue-virtual-scroller`](https://github.com/Akryum/vue-virtual-scroller) if you are looking for more features.\n*/\nfunction useVirtualList(list, options) {\n\tconst { containerStyle, wrapperProps, scrollTo, calculateRange, currentList, containerRef } = \"itemHeight\" in options ? useVerticalVirtualList(options, list) : useHorizontalVirtualList(options, list);\n\treturn {\n\t\tlist: currentList,\n\t\tscrollTo,\n\t\tcontainerProps: {\n\t\t\tref: containerRef,\n\t\t\tonScroll: () => {\n\t\t\t\tcalculateRange();\n\t\t\t},\n\t\t\tstyle: containerStyle\n\t\t},\n\t\twrapperProps\n\t};\n}\nfunction useVirtualListResources(list) {\n\tconst containerRef = shallowRef(null);\n\tconst size = useElementSize(containerRef);\n\tconst currentList = ref([]);\n\tconst source = shallowRef(list);\n\treturn {\n\t\tstate: ref({\n\t\t\tstart: 0,\n\t\t\tend: 10\n\t\t}),\n\t\tsource,\n\t\tcurrentList,\n\t\tsize,\n\t\tcontainerRef\n\t};\n}\nfunction createGetViewCapacity(state, source, itemSize) {\n\treturn (containerSize) => {\n\t\tif (typeof itemSize === \"number\") return Math.ceil(containerSize / itemSize);\n\t\tconst { start = 0 } = state.value;\n\t\tlet sum = 0;\n\t\tlet capacity = 0;\n\t\tfor (let i = start; i < source.value.length; i++) {\n\t\t\tconst size = itemSize(i);\n\t\t\tsum += size;\n\t\t\tcapacity = i;\n\t\t\tif (sum > containerSize) break;\n\t\t}\n\t\treturn capacity - start;\n\t};\n}\nfunction createGetOffset(source, itemSize) {\n\treturn (scrollDirection) => {\n\t\tif (typeof itemSize === \"number\") return Math.floor(scrollDirection / itemSize) + 1;\n\t\tlet sum = 0;\n\t\tlet offset = 0;\n\t\tfor (let i = 0; i < source.value.length; i++) {\n\t\t\tconst size = itemSize(i);\n\t\t\tsum += size;\n\t\t\tif (sum >= scrollDirection) {\n\t\t\t\toffset = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn offset + 1;\n\t};\n}\nfunction createCalculateRange(type, overscan, getOffset, getViewCapacity, { containerRef, state, currentList, source }) {\n\treturn () => {\n\t\tconst element = containerRef.value;\n\t\tif (element) {\n\t\t\tconst offset = getOffset(type === \"vertical\" ? element.scrollTop : element.scrollLeft);\n\t\t\tconst viewCapacity = getViewCapacity(type === \"vertical\" ? element.clientHeight : element.clientWidth);\n\t\t\tconst from = offset - overscan;\n\t\t\tconst to = offset + viewCapacity + overscan;\n\t\t\tstate.value = {\n\t\t\t\tstart: from < 0 ? 0 : from,\n\t\t\t\tend: to > source.value.length ? source.value.length : to\n\t\t\t};\n\t\t\tcurrentList.value = source.value.slice(state.value.start, state.value.end).map((ele, index) => ({\n\t\t\t\tdata: ele,\n\t\t\t\tindex: index + state.value.start\n\t\t\t}));\n\t\t}\n\t};\n}\nfunction createGetDistance(itemSize, source) {\n\treturn (index) => {\n\t\tif (typeof itemSize === \"number\") return index * itemSize;\n\t\treturn source.value.slice(0, index).reduce((sum, _, i) => sum + itemSize(i), 0);\n\t};\n}\nfunction useWatchForSizes(size, listRef, containerRef, calculateRange) {\n\twatch([\n\t\tsize.width,\n\t\tsize.height,\n\t\tlistRef,\n\t\tcontainerRef\n\t], () => {\n\t\tcalculateRange();\n\t});\n}\nfunction createComputedTotalSize(itemSize, source) {\n\treturn computed(() => {\n\t\tif (typeof itemSize === \"number\") return source.value.length * itemSize;\n\t\treturn source.value.reduce((sum, _, index) => sum + itemSize(index), 0);\n\t});\n}\nconst scrollToDictionaryForElementScrollKey = {\n\thorizontal: \"scrollLeft\",\n\tvertical: \"scrollTop\"\n};\nfunction createScrollTo(type, calculateRange, getDistance, containerRef) {\n\treturn (index) => {\n\t\tif (containerRef.value) {\n\t\t\tcontainerRef.value[scrollToDictionaryForElementScrollKey[type]] = getDistance(index);\n\t\t\tcalculateRange();\n\t\t}\n\t};\n}\nfunction useHorizontalVirtualList(options, list) {\n\tconst resources = useVirtualListResources(list);\n\tconst { state, source, currentList, size, containerRef } = resources;\n\tconst containerStyle = { overflowX: \"auto\" };\n\tconst { itemWidth, overscan = 5 } = options;\n\tconst getViewCapacity = createGetViewCapacity(state, source, itemWidth);\n\tconst calculateRange = createCalculateRange(\"horizontal\", overscan, createGetOffset(source, itemWidth), getViewCapacity, resources);\n\tconst getDistanceLeft = createGetDistance(itemWidth, source);\n\tconst offsetLeft = computed(() => getDistanceLeft(state.value.start));\n\tconst totalWidth = createComputedTotalSize(itemWidth, source);\n\tuseWatchForSizes(size, source, containerRef, calculateRange);\n\treturn {\n\t\tscrollTo: createScrollTo(\"horizontal\", calculateRange, getDistanceLeft, containerRef),\n\t\tcalculateRange,\n\t\twrapperProps: computed(() => {\n\t\t\treturn { style: {\n\t\t\t\theight: \"100%\",\n\t\t\t\twidth: `${totalWidth.value - offsetLeft.value}px`,\n\t\t\t\tmarginLeft: `${offsetLeft.value}px`,\n\t\t\t\tdisplay: \"flex\"\n\t\t\t} };\n\t\t}),\n\t\tcontainerStyle,\n\t\tcurrentList,\n\t\tcontainerRef\n\t};\n}\nfunction useVerticalVirtualList(options, list) {\n\tconst resources = useVirtualListResources(list);\n\tconst { state, source, currentList, size, containerRef } = resources;\n\tconst containerStyle = { overflowY: \"auto\" };\n\tconst { itemHeight, overscan = 5 } = options;\n\tconst getViewCapacity = createGetViewCapacity(state, source, itemHeight);\n\tconst calculateRange = createCalculateRange(\"vertical\", overscan, createGetOffset(source, itemHeight), getViewCapacity, resources);\n\tconst getDistanceTop = createGetDistance(itemHeight, source);\n\tconst offsetTop = computed(() => getDistanceTop(state.value.start));\n\tconst totalHeight = createComputedTotalSize(itemHeight, source);\n\tuseWatchForSizes(size, source, containerRef, calculateRange);\n\treturn {\n\t\tcalculateRange,\n\t\tscrollTo: createScrollTo(\"vertical\", calculateRange, getDistanceTop, containerRef),\n\t\tcontainerStyle,\n\t\twrapperProps: computed(() => {\n\t\t\treturn { style: {\n\t\t\t\twidth: \"100%\",\n\t\t\t\theight: `${totalHeight.value - offsetTop.value}px`,\n\t\t\t\tmarginTop: `${offsetTop.value}px`\n\t\t\t} };\n\t\t}),\n\t\tcurrentList,\n\t\tcontainerRef\n\t};\n}\n//#endregion\n//#region useWakeLock/index.ts\n/**\n* Reactive Screen Wake Lock API.\n*\n* @see https://vueuse.org/useWakeLock\n* @param options\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction useWakeLock(options = {}) {\n\tconst { navigator = defaultNavigator, document = defaultDocument } = options;\n\tconst requestedType = shallowRef(false);\n\tconst sentinel = shallowRef(null);\n\tconst documentVisibility = useDocumentVisibility({ document });\n\tconst isSupported = /* @__PURE__ */ useSupported(() => navigator && \"wakeLock\" in navigator);\n\tconst isActive = computed(() => !!sentinel.value && documentVisibility.value === \"visible\");\n\tif (isSupported.value) {\n\t\tuseEventListener(sentinel, \"release\", () => {\n\t\t\tvar _sentinel$value$type, _sentinel$value;\n\t\t\trequestedType.value = (_sentinel$value$type = (_sentinel$value = sentinel.value) === null || _sentinel$value === void 0 ? void 0 : _sentinel$value.type) !== null && _sentinel$value$type !== void 0 ? _sentinel$value$type : false;\n\t\t}, { passive: true });\n\t\twhenever(() => documentVisibility.value === \"visible\" && (document === null || document === void 0 ? void 0 : document.visibilityState) === \"visible\" && requestedType.value, (type) => {\n\t\t\trequestedType.value = false;\n\t\t\tforceRequest(type);\n\t\t});\n\t}\n\tasync function forceRequest(type) {\n\t\tvar _sentinel$value2;\n\t\tawait ((_sentinel$value2 = sentinel.value) === null || _sentinel$value2 === void 0 ? void 0 : _sentinel$value2.release());\n\t\tsentinel.value = isSupported.value ? await navigator.wakeLock.request(type) : null;\n\t}\n\tasync function request(type) {\n\t\tif (documentVisibility.value === \"visible\") await forceRequest(type);\n\t\telse requestedType.value = type;\n\t}\n\tasync function release() {\n\t\trequestedType.value = false;\n\t\tconst s = sentinel.value;\n\t\tsentinel.value = null;\n\t\tawait (s === null || s === void 0 ? void 0 : s.release());\n\t}\n\ttryOnScopeDispose(() => {\n\t\trelease();\n\t});\n\treturn {\n\t\tsentinel,\n\t\tisSupported,\n\t\tisActive,\n\t\trequest,\n\t\tforceRequest,\n\t\trelease\n\t};\n}\n//#endregion\n//#region useWebNotification/index.ts\n/**\n* Reactive useWebNotification\n*\n* @see https://vueuse.org/useWebNotification\n* @see https://developer.mozilla.org/en-US/docs/Web/API/notification\n*/\nfunction useWebNotification(options = {}) {\n\tconst { window = defaultWindow, requestPermissions: _requestForPermissions = true } = options;\n\tconst defaultWebNotificationOptions = options;\n\tconst isSupported = /* @__PURE__ */ useSupported(() => {\n\t\tif (!window || !(\"Notification\" in window)) return false;\n\t\tif (Notification.permission === \"granted\") return true;\n\t\ttry {\n\t\t\tconst notification = new Notification(\"\");\n\t\t\tnotification.onshow = () => {\n\t\t\t\tnotification.close();\n\t\t\t};\n\t\t} catch (e) {\n\t\t\tif (e.name === \"TypeError\") return false;\n\t\t}\n\t\treturn true;\n\t});\n\tconst permissionGranted = shallowRef(isSupported.value && \"permission\" in Notification && Notification.permission === \"granted\");\n\tconst notification = shallowRef(null);\n\tconst ensurePermissions = async () => {\n\t\tif (!isSupported.value) return;\n\t\tif (!permissionGranted.value && Notification.permission !== \"denied\") {\n\t\t\tif (await Notification.requestPermission() === \"granted\") permissionGranted.value = true;\n\t\t}\n\t\treturn permissionGranted.value;\n\t};\n\tconst { on: onClick, trigger: clickTrigger } = createEventHook();\n\tconst { on: onShow, trigger: showTrigger } = createEventHook();\n\tconst { on: onError, trigger: errorTrigger } = createEventHook();\n\tconst { on: onClose, trigger: closeTrigger } = createEventHook();\n\tconst show = async (overrides) => {\n\t\tif (!isSupported.value || !permissionGranted.value) return;\n\t\tconst options = Object.assign({}, defaultWebNotificationOptions, overrides);\n\t\tnotification.value = new Notification(options.title || \"\", options);\n\t\tnotification.value.onclick = clickTrigger;\n\t\tnotification.value.onshow = showTrigger;\n\t\tnotification.value.onerror = errorTrigger;\n\t\tnotification.value.onclose = closeTrigger;\n\t\treturn notification.value;\n\t};\n\tconst close = () => {\n\t\tif (notification.value) notification.value.close();\n\t\tnotification.value = null;\n\t};\n\tif (_requestForPermissions) tryOnMounted(ensurePermissions);\n\ttryOnScopeDispose(close);\n\tif (isSupported.value && window) {\n\t\tconst document = window.document;\n\t\tuseEventListener(document, \"visibilitychange\", (e) => {\n\t\t\te.preventDefault();\n\t\t\tif (document.visibilityState === \"visible\") close();\n\t\t});\n\t}\n\treturn {\n\t\tisSupported,\n\t\tnotification,\n\t\tensurePermissions,\n\t\tpermissionGranted,\n\t\tshow,\n\t\tclose,\n\t\tonClick,\n\t\tonShow,\n\t\tonError,\n\t\tonClose\n\t};\n}\n//#endregion\n//#region useWebSocket/index.ts\nconst DEFAULT_PING_MESSAGE = \"ping\";\nfunction resolveNestedOptions(options) {\n\tif (options === true) return {};\n\treturn options;\n}\nfunction getDefaultScheduler(options) {\n\tif (\"interval\" in options) {\n\t\tconst { interval = 1e3 } = options;\n\t\treturn (cb) => useIntervalFn(cb, interval, { immediate: false });\n\t}\n\treturn (cb) => useIntervalFn(cb, 1e3, { immediate: false });\n}\n/**\n* Reactive WebSocket client.\n*\n* @see https://vueuse.org/useWebSocket\n* @param url\n*/\nfunction useWebSocket(url, options = {}) {\n\tconst { onConnected, onDisconnected, onError, onMessage, immediate = true, autoConnect = true, autoClose = true, protocols = [] } = options;\n\tconst data = shallowRef(null);\n\tconst status = shallowRef(\"CLOSED\");\n\tconst wsRef = shallowRef();\n\tconst urlRef = toRef(url);\n\tlet heartbeatPause;\n\tlet heartbeatResume;\n\tlet explicitlyClosed = false;\n\tlet retried = 0;\n\tlet bufferedData = [];\n\tlet retryTimeout;\n\tlet pongTimeoutWait;\n\tconst _sendBuffer = () => {\n\t\tif (bufferedData.length && wsRef.value && status.value === \"OPEN\") {\n\t\t\tfor (const buffer of bufferedData) wsRef.value.send(buffer);\n\t\t\tbufferedData = [];\n\t\t}\n\t};\n\tconst resetRetry = () => {\n\t\tif (retryTimeout != null) {\n\t\t\tclearTimeout(retryTimeout);\n\t\t\tretryTimeout = void 0;\n\t\t}\n\t};\n\tconst resetHeartbeat = () => {\n\t\tclearTimeout(pongTimeoutWait);\n\t\tpongTimeoutWait = void 0;\n\t};\n\tconst close = (code = 1e3, reason) => {\n\t\tresetRetry();\n\t\tif (!isClient && !isWorker || !wsRef.value) return;\n\t\texplicitlyClosed = true;\n\t\tresetHeartbeat();\n\t\theartbeatPause === null || heartbeatPause === void 0 || heartbeatPause();\n\t\twsRef.value.close(code, reason);\n\t\twsRef.value = void 0;\n\t};\n\tconst send = (data, useBuffer = true) => {\n\t\tif (!wsRef.value || status.value !== \"OPEN\") {\n\t\t\tif (useBuffer) bufferedData.push(data);\n\t\t\treturn false;\n\t\t}\n\t\t_sendBuffer();\n\t\twsRef.value.send(data);\n\t\treturn true;\n\t};\n\tconst _init = () => {\n\t\tif (explicitlyClosed || typeof urlRef.value === \"undefined\") return;\n\t\tconst ws = new WebSocket(urlRef.value, protocols);\n\t\twsRef.value = ws;\n\t\tstatus.value = \"CONNECTING\";\n\t\tws.onopen = () => {\n\t\t\tif (wsRef.value !== ws) return;\n\t\t\tstatus.value = \"OPEN\";\n\t\t\tretried = 0;\n\t\t\tonConnected === null || onConnected === void 0 || onConnected(ws);\n\t\t\theartbeatResume === null || heartbeatResume === void 0 || heartbeatResume();\n\t\t\t_sendBuffer();\n\t\t};\n\t\tws.onclose = (ev) => {\n\t\t\tif (wsRef.value === ws) status.value = \"CLOSED\";\n\t\t\tresetHeartbeat();\n\t\t\theartbeatPause === null || heartbeatPause === void 0 || heartbeatPause();\n\t\t\tonDisconnected === null || onDisconnected === void 0 || onDisconnected(ws, ev);\n\t\t\tif (!explicitlyClosed && options.autoReconnect && (wsRef.value == null || ws === wsRef.value)) {\n\t\t\t\tconst { retries = -1, delay = 1e3, onFailed } = resolveNestedOptions(options.autoReconnect);\n\t\t\t\tif ((typeof retries === \"function\" ? retries : () => typeof retries === \"number\" && (retries < 0 || retried < retries))(retried)) {\n\t\t\t\t\tretried += 1;\n\t\t\t\t\tconst delayTime = typeof delay === \"function\" ? delay(retried) : delay;\n\t\t\t\t\tretryTimeout = setTimeout(_init, delayTime);\n\t\t\t\t} else onFailed === null || onFailed === void 0 || onFailed();\n\t\t\t}\n\t\t};\n\t\tws.onerror = (e) => {\n\t\t\tonError === null || onError === void 0 || onError(ws, e);\n\t\t};\n\t\tws.onmessage = (e) => {\n\t\t\tif (options.heartbeat) {\n\t\t\t\tresetHeartbeat();\n\t\t\t\tconst { message = DEFAULT_PING_MESSAGE, responseMessage = message } = resolveNestedOptions(options.heartbeat);\n\t\t\t\tif (e.data === toValue(responseMessage)) return;\n\t\t\t}\n\t\t\tdata.value = e.data;\n\t\t\tonMessage === null || onMessage === void 0 || onMessage(ws, e);\n\t\t};\n\t};\n\tif (options.heartbeat) {\n\t\tconst { message = DEFAULT_PING_MESSAGE, scheduler = getDefaultScheduler(resolveNestedOptions(options.heartbeat)), pongTimeout = 1e3 } = resolveNestedOptions(options.heartbeat);\n\t\tconst { pause, resume } = scheduler(() => {\n\t\t\tsend(toValue(message), false);\n\t\t\tif (pongTimeoutWait != null) return;\n\t\t\tpongTimeoutWait = setTimeout(() => {\n\t\t\t\tclose();\n\t\t\t\texplicitlyClosed = false;\n\t\t\t}, pongTimeout);\n\t\t});\n\t\theartbeatPause = pause;\n\t\theartbeatResume = resume;\n\t}\n\tif (autoClose) {\n\t\tif (isClient) useEventListener(\"beforeunload\", () => close(), { passive: true });\n\t\ttryOnScopeDispose(close);\n\t}\n\tconst open = () => {\n\t\tif (!isClient && !isWorker) return;\n\t\tclose();\n\t\texplicitlyClosed = false;\n\t\tretried = 0;\n\t\t_init();\n\t};\n\tif (immediate) open();\n\tif (autoConnect) watch(urlRef, open);\n\treturn {\n\t\tdata,\n\t\tstatus,\n\t\tclose,\n\t\tsend,\n\t\topen,\n\t\tws: wsRef\n\t};\n}\n//#endregion\n//#region useWebWorker/index.ts\nfunction useWebWorker(arg0, workerOptions, options) {\n\tconst { window = defaultWindow } = options !== null && options !== void 0 ? options : {};\n\tconst data = shallowRef(null);\n\tconst worker = shallowRef();\n\tconst post = (...args) => {\n\t\tif (!worker.value) return;\n\t\tworker.value.postMessage(...args);\n\t};\n\tconst terminate = function terminate() {\n\t\tif (!worker.value) return;\n\t\tworker.value.terminate();\n\t};\n\tif (window) {\n\t\tif (typeof arg0 === \"string\") worker.value = new Worker(arg0, workerOptions);\n\t\telse if (typeof arg0 === \"function\") worker.value = arg0();\n\t\telse worker.value = arg0;\n\t\tworker.value.onmessage = (e) => {\n\t\t\tdata.value = e.data;\n\t\t};\n\t\ttryOnScopeDispose(() => {\n\t\t\tif (worker.value) worker.value.terminate();\n\t\t});\n\t}\n\treturn {\n\t\tdata,\n\t\tpost,\n\t\tterminate,\n\t\tworker\n\t};\n}\n//#endregion\n//#region useWebWorkerFn/lib/depsParser.ts\n/**\n*\n* Concatenates the dependencies into a comma separated string.\n* this string will then be passed as an argument to the \"importScripts\" function\n*\n* @param deps array of string\n* @param localDeps array of function\n* @returns a string composed by the concatenation of the array\n* elements \"deps\" and \"importScripts\".\n*\n* @example\n* depsParser(['demo1', 'demo2']) // return importScripts('demo1', 'demo2')\n*/\nfunction depsParser(deps, localDeps) {\n\tif (deps.length === 0 && localDeps.length === 0) return \"\";\n\tconst depsString = deps.map((dep) => `'${dep}'`).toString();\n\tconst depsFunctionString = localDeps.filter((dep) => typeof dep === \"function\").map((fn) => {\n\t\tconst str = fn.toString();\n\t\tif (str.trim().startsWith(\"function\")) return str;\n\t\telse return `const ${fn.name} = ${str}`;\n\t}).join(\";\");\n\tconst importString = `importScripts(${depsString});`;\n\treturn `${depsString.trim() === \"\" ? \"\" : importString} ${depsFunctionString}`;\n}\n//#endregion\n//#region useWebWorkerFn/lib/jobRunner.ts\n/**\n* This function accepts as a parameter a function \"userFunc\"\n* And as a result returns an anonymous function.\n* This anonymous function, accepts as arguments,\n* the parameters to pass to the function \"useArgs\" and returns a Promise\n* This function can be used as a wrapper, only inside a Worker\n* because it depends by \"postMessage\".\n*\n* @param userFunc {Function} fn the function to run with web worker\n*\n* @returns returns a function that accepts the parameters\n* to be passed to the \"userFunc\" function\n*/\nfunction jobRunner(userFunc) {\n\treturn (e) => {\n\t\tconst userFuncArgs = e.data[0];\n\t\treturn Promise.resolve(userFunc.apply(void 0, userFuncArgs)).then((result) => {\n\t\t\tpostMessage([\"SUCCESS\", result]);\n\t\t}).catch((error) => {\n\t\t\tpostMessage([\"ERROR\", error]);\n\t\t});\n\t};\n}\n//#endregion\n//#region useWebWorkerFn/lib/createWorkerBlobUrl.ts\n/**\n* Converts the \"fn\" function into the syntax needed to be executed within a web worker\n*\n* @param fn the function to run with web worker\n* @param deps array of strings, imported into the worker through \"importScripts\"\n* @param localDeps array of function, local dependencies\n*\n* @returns a blob url, containing the code of \"fn\" as a string\n*\n* @example\n* createWorkerBlobUrl((a,b) => a+b, [])\n* // return \"onmessage=return Promise.resolve((a,b) => a + b)\n* .then(postMessage(['SUCCESS', result]))\n* .catch(postMessage(['ERROR', error])\"\n*/\nfunction createWorkerBlobUrl(fn, deps, localDeps) {\n\tconst blobCode = `${depsParser(deps, localDeps)}; onmessage=(${jobRunner})(${fn})`;\n\tconst blob = new Blob([blobCode], { type: \"text/javascript\" });\n\treturn URL.createObjectURL(blob);\n}\n//#endregion\n//#region useWebWorkerFn/index.ts\n/**\n* Run expensive function without blocking the UI, using a simple syntax that makes use of Promise.\n*\n* @see https://vueuse.org/useWebWorkerFn\n* @param fn\n* @param options\n*/\nfunction useWebWorkerFn(fn, options = {}) {\n\tconst { dependencies = [], localDependencies = [], timeout, window = defaultWindow } = options;\n\tlet worker;\n\tconst workerStatus = shallowRef(\"PENDING\");\n\tconst promise = shallowRef({});\n\tconst timeoutId = shallowRef();\n\tconst workerTerminate = (status = \"PENDING\") => {\n\t\tif (worker && worker._url && window) {\n\t\t\tworker.terminate();\n\t\t\tURL.revokeObjectURL(worker._url);\n\t\t\tpromise.value = {};\n\t\t\tworker = void 0;\n\t\t\twindow.clearTimeout(timeoutId.value);\n\t\t\tworkerStatus.value = status;\n\t\t}\n\t};\n\tworkerTerminate();\n\ttryOnScopeDispose(workerTerminate);\n\tconst generateWorker = () => {\n\t\tconst blobUrl = createWorkerBlobUrl(fn, dependencies, localDependencies);\n\t\tconst newWorker = new Worker(blobUrl);\n\t\tnewWorker._url = blobUrl;\n\t\tnewWorker.onmessage = (e) => {\n\t\t\tconst { resolve = () => {}, reject = () => {} } = promise.value;\n\t\t\tconst [status, result] = e.data;\n\t\t\tswitch (status) {\n\t\t\t\tcase \"SUCCESS\":\n\t\t\t\t\tresolve(result);\n\t\t\t\t\tworkerTerminate(status);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\treject(result);\n\t\t\t\t\tworkerTerminate(\"ERROR\");\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t};\n\t\tnewWorker.onerror = (e) => {\n\t\t\tconst { reject = () => {} } = promise.value;\n\t\t\te.preventDefault();\n\t\t\treject(e);\n\t\t\tworkerTerminate(\"ERROR\");\n\t\t};\n\t\tif (timeout) timeoutId.value = setTimeout(workerTerminate, timeout, \"TIMEOUT_EXPIRED\");\n\t\treturn newWorker;\n\t};\n\tconst callWorker = (...fnArgs) => new Promise((resolve, reject) => {\n\t\tpromise.value = {\n\t\t\tresolve,\n\t\t\treject\n\t\t};\n\t\tworker === null || worker === void 0 || worker.postMessage([[...fnArgs]]);\n\t\tworkerStatus.value = \"RUNNING\";\n\t});\n\tconst workerFn = (...fnArgs) => {\n\t\tif (workerStatus.value === \"RUNNING\") {\n\t\t\tconsole.error(\"[useWebWorkerFn] You can only run one instance of the worker at a time.\");\n\t\t\treturn Promise.reject();\n\t\t}\n\t\tworker = generateWorker();\n\t\treturn callWorker(...fnArgs);\n\t};\n\treturn {\n\t\tworkerFn,\n\t\tworkerStatus,\n\t\tworkerTerminate\n\t};\n}\n//#endregion\n//#region useWindowFocus/index.ts\n/**\n* Reactively track window focus with `window.onfocus` and `window.onblur`.\n*\n* @see https://vueuse.org/useWindowFocus\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction useWindowFocus(options = {}) {\n\tconst { window = defaultWindow } = options;\n\tif (!window) return shallowRef(false);\n\tconst focused = shallowRef(window.document.hasFocus());\n\tconst listenerOptions = { passive: true };\n\tuseEventListener(window, \"blur\", () => {\n\t\tfocused.value = false;\n\t}, listenerOptions);\n\tuseEventListener(window, \"focus\", () => {\n\t\tfocused.value = true;\n\t}, listenerOptions);\n\treturn focused;\n}\n//#endregion\n//#region useWindowScroll/index.ts\n/**\n* Reactive window scroll.\n*\n* @see https://vueuse.org/useWindowScroll\n* @param options\n*/\nfunction useWindowScroll(options = {}) {\n\tconst { window = defaultWindow, ...rest } = options;\n\treturn useScroll(window, rest);\n}\n//#endregion\n//#region useWindowSize/index.ts\n/**\n* Reactive window size.\n*\n* @see https://vueuse.org/useWindowSize\n* @param options\n*\n* @__NO_SIDE_EFFECTS__\n*/\nfunction useWindowSize(options = {}) {\n\tconst { window = defaultWindow, initialWidth = Number.POSITIVE_INFINITY, initialHeight = Number.POSITIVE_INFINITY, listenOrientation = true, includeScrollbar = true, type = \"inner\" } = options;\n\tconst width = shallowRef(initialWidth);\n\tconst height = shallowRef(initialHeight);\n\tconst update = () => {\n\t\tif (window) if (type === \"outer\") {\n\t\t\twidth.value = window.outerWidth;\n\t\t\theight.value = window.outerHeight;\n\t\t} else if (type === \"visual\" && window.visualViewport) {\n\t\t\tconst { width: visualViewportWidth, height: visualViewportHeight, scale } = window.visualViewport;\n\t\t\twidth.value = Math.round(visualViewportWidth * scale);\n\t\t\theight.value = Math.round(visualViewportHeight * scale);\n\t\t} else if (includeScrollbar) {\n\t\t\twidth.value = window.innerWidth;\n\t\t\theight.value = window.innerHeight;\n\t\t} else {\n\t\t\twidth.value = window.document.documentElement.clientWidth;\n\t\t\theight.value = window.document.documentElement.clientHeight;\n\t\t}\n\t};\n\tupdate();\n\ttryOnMounted(update);\n\tconst listenerOptions = { passive: true };\n\tuseEventListener(\"resize\", update, listenerOptions);\n\tif (window && type === \"visual\" && window.visualViewport) useEventListener(window.visualViewport, \"resize\", update, listenerOptions);\n\tif (listenOrientation) watch(useMediaQuery(\"(orientation: portrait)\"), () => update());\n\treturn {\n\t\twidth,\n\t\theight\n\t};\n}\n//#endregion\nexport { DefaultMagicKeysAliasMap, StorageSerializers, TransitionPresets, asyncComputed, breakpointsAntDesign, breakpointsBootstrapV5, breakpointsElement, breakpointsMasterCss, breakpointsPrimeFlex, breakpointsQuasar, breakpointsSematic, breakpointsTailwind, breakpointsVuetify, breakpointsVuetifyV2, breakpointsVuetifyV3, cloneFnJSON, computedAsync, computedInject, createFetch, createReusableTemplate, createTemplatePromise, createUnrefFn, customStorageEventName, defaultDocument, defaultLocation, defaultNavigator, defaultWindow, executeTransition, formatTimeAgo, formatTimeAgoIntl, formatTimeAgoIntlParts, getSSRHandler, mapGamepadToXbox360Controller, onClickOutside, onElementRemoval, onKeyDown, onKeyPressed, onKeyStroke, onKeyUp, onLongPress, onStartTyping, provideSSRWidth, setSSRHandler, templateRef, transition, unrefElement, useActiveElement, useAnimate, useAsyncQueue, useAsyncState, useBase64, useBattery, useBluetooth, useBreakpoints, useBroadcastChannel, useBrowserLocation, useCached, useClipboard, useClipboardItems, useCloned, useColorMode, useConfirmDialog, useCountdown, useCssSupports, useCssVar, useCurrentElement, useCycleList, useDark, useDebouncedRefHistory, useDeviceMotion, useDeviceOrientation, useDevicePixelRatio, useDevicesList, useDisplayMedia, useDocumentVisibility, useDraggable, useDropZone, useElementBounding, useElementByPoint, useElementHover, useElementSize, useElementVisibility, useEventBus, useEventListener, useEventSource, useEyeDropper, useFavicon, useFetch, useFileDialog, useFileSystemAccess, useFocus, useFocusWithin, useFps, useFullscreen, useGamepad, useGeolocation, useIdle, useImage, useInfiniteScroll, useIntersectionObserver, useKeyModifier, useLocalStorage, useMagicKeys, useManualRefHistory, useMediaControls, useMediaQuery, useMemoize, useMemory, useMounted, useMouse, useMouseInElement, useMousePressed, useMutationObserver, useNavigatorLanguage, useNetwork, useNow, useObjectUrl, useOffsetPagination, useOnline, usePageLeave, useParallax, useParentElement, usePerformanceObserver, usePermission, usePointer, usePointerLock, usePointerSwipe, usePreferredColorScheme, usePreferredContrast, usePreferredDark, usePreferredLanguages, usePreferredReducedMotion, usePreferredReducedTransparency, usePrevious, useRafFn, useRefHistory, useResizeObserver, useSSRWidth, useScreenOrientation, useScreenSafeArea, useScriptTag, useScroll, useScrollLock, useSessionStorage, useShare, useSorted, useSpeechRecognition, useSpeechSynthesis, useStepper, useStorage, useStorageAsync, useStyleTag, useSupported, useSwipe, useTemplateRefsList, useTextDirection, useTextSelection, useTextareaAutosize, useThrottledRefHistory, useTimeAgo, useTimeAgoIntl, useTimeoutPoll, useTimestamp, useTitle, useTransition, useUrlSearchParams, useUserMedia, useVModel, useVModels, useVibrate, useVirtualList, useWakeLock, useWebNotification, useWebSocket, useWebWorker, useWebWorkerFn, useWindowFocus, useWindowScroll, useWindowSize };\n","/**\n * Custom positioning reference element.\n * @see https://floating-ui.com/docs/virtual-elements\n */\n\nconst sides = ['top', 'right', 'bottom', 'left'];\nconst alignments = ['start', 'end'];\nconst placements = /*#__PURE__*/sides.reduce((acc, side) => acc.concat(side, side + \"-\" + alignments[0], side + \"-\" + alignments[1]), []);\nconst min = Math.min;\nconst max = Math.max;\nconst round = Math.round;\nconst floor = Math.floor;\nconst createCoords = v => ({\n  x: v,\n  y: v\n});\nconst oppositeSideMap = {\n  left: 'right',\n  right: 'left',\n  bottom: 'top',\n  top: 'bottom'\n};\nfunction clamp(start, value, end) {\n  return max(start, min(value, end));\n}\nfunction evaluate(value, param) {\n  return typeof value === 'function' ? value(param) : value;\n}\nfunction getSide(placement) {\n  return placement.split('-')[0];\n}\nfunction getAlignment(placement) {\n  return placement.split('-')[1];\n}\nfunction getOppositeAxis(axis) {\n  return axis === 'x' ? 'y' : 'x';\n}\nfunction getAxisLength(axis) {\n  return axis === 'y' ? 'height' : 'width';\n}\nfunction getSideAxis(placement) {\n  const firstChar = placement[0];\n  return firstChar === 't' || firstChar === 'b' ? 'y' : 'x';\n}\nfunction getAlignmentAxis(placement) {\n  return getOppositeAxis(getSideAxis(placement));\n}\nfunction getAlignmentSides(placement, rects, rtl) {\n  if (rtl === void 0) {\n    rtl = false;\n  }\n  const alignment = getAlignment(placement);\n  const alignmentAxis = getAlignmentAxis(placement);\n  const length = getAxisLength(alignmentAxis);\n  let mainAlignmentSide = alignmentAxis === 'x' ? alignment === (rtl ? 'end' : 'start') ? 'right' : 'left' : alignment === 'start' ? 'bottom' : 'top';\n  if (rects.reference[length] > rects.floating[length]) {\n    mainAlignmentSide = getOppositePlacement(mainAlignmentSide);\n  }\n  return [mainAlignmentSide, getOppositePlacement(mainAlignmentSide)];\n}\nfunction getExpandedPlacements(placement) {\n  const oppositePlacement = getOppositePlacement(placement);\n  return [getOppositeAlignmentPlacement(placement), oppositePlacement, getOppositeAlignmentPlacement(oppositePlacement)];\n}\nfunction getOppositeAlignmentPlacement(placement) {\n  return placement.includes('start') ? placement.replace('start', 'end') : placement.replace('end', 'start');\n}\nconst lrPlacement = ['left', 'right'];\nconst rlPlacement = ['right', 'left'];\nconst tbPlacement = ['top', 'bottom'];\nconst btPlacement = ['bottom', 'top'];\nfunction getSideList(side, isStart, rtl) {\n  switch (side) {\n    case 'top':\n    case 'bottom':\n      if (rtl) return isStart ? rlPlacement : lrPlacement;\n      return isStart ? lrPlacement : rlPlacement;\n    case 'left':\n    case 'right':\n      return isStart ? tbPlacement : btPlacement;\n    default:\n      return [];\n  }\n}\nfunction getOppositeAxisPlacements(placement, flipAlignment, direction, rtl) {\n  const alignment = getAlignment(placement);\n  let list = getSideList(getSide(placement), direction === 'start', rtl);\n  if (alignment) {\n    list = list.map(side => side + \"-\" + alignment);\n    if (flipAlignment) {\n      list = list.concat(list.map(getOppositeAlignmentPlacement));\n    }\n  }\n  return list;\n}\nfunction getOppositePlacement(placement) {\n  const side = getSide(placement);\n  return oppositeSideMap[side] + placement.slice(side.length);\n}\nfunction expandPaddingObject(padding) {\n  var _padding$top, _padding$right, _padding$bottom, _padding$left;\n  return {\n    top: (_padding$top = padding.top) != null ? _padding$top : 0,\n    right: (_padding$right = padding.right) != null ? _padding$right : 0,\n    bottom: (_padding$bottom = padding.bottom) != null ? _padding$bottom : 0,\n    left: (_padding$left = padding.left) != null ? _padding$left : 0\n  };\n}\nfunction getPaddingObject(padding) {\n  return typeof padding !== 'number' ? expandPaddingObject(padding) : {\n    top: padding,\n    right: padding,\n    bottom: padding,\n    left: padding\n  };\n}\nfunction rectToClientRect(rect) {\n  const {\n    x,\n    y,\n    width,\n    height\n  } = rect;\n  return {\n    width,\n    height,\n    top: y,\n    left: x,\n    right: x + width,\n    bottom: y + height,\n    x,\n    y\n  };\n}\n\nexport { alignments, clamp, createCoords, evaluate, expandPaddingObject, floor, getAlignment, getAlignmentAxis, getAlignmentSides, getAxisLength, getExpandedPlacements, getOppositeAlignmentPlacement, getOppositeAxis, getOppositeAxisPlacements, getOppositePlacement, getPaddingObject, getSide, getSideAxis, max, min, placements, rectToClientRect, round, sides };\n","import { getSideAxis, getAlignmentAxis, getAxisLength, getSide, getAlignment, evaluate, getPaddingObject, rectToClientRect, min, clamp, placements, getAlignmentSides, getOppositeAlignmentPlacement, getOppositePlacement, getExpandedPlacements, getOppositeAxisPlacements, sides, max, getOppositeAxis } from '@floating-ui/utils';\nexport { rectToClientRect } from '@floating-ui/utils';\n\nfunction computeCoordsFromPlacement(_ref, placement, rtl) {\n  let {\n    reference,\n    floating\n  } = _ref;\n  const sideAxis = getSideAxis(placement);\n  const alignmentAxis = getAlignmentAxis(placement);\n  const alignLength = getAxisLength(alignmentAxis);\n  const side = getSide(placement);\n  const isVertical = sideAxis === 'y';\n  const commonX = reference.x + reference.width / 2 - floating.width / 2;\n  const commonY = reference.y + reference.height / 2 - floating.height / 2;\n  const commonAlign = reference[alignLength] / 2 - floating[alignLength] / 2;\n  let coords;\n  switch (side) {\n    case 'top':\n      coords = {\n        x: commonX,\n        y: reference.y - floating.height\n      };\n      break;\n    case 'bottom':\n      coords = {\n        x: commonX,\n        y: reference.y + reference.height\n      };\n      break;\n    case 'right':\n      coords = {\n        x: reference.x + reference.width,\n        y: commonY\n      };\n      break;\n    case 'left':\n      coords = {\n        x: reference.x - floating.width,\n        y: commonY\n      };\n      break;\n    default:\n      coords = {\n        x: reference.x,\n        y: reference.y\n      };\n  }\n  const alignment = getAlignment(placement);\n  if (alignment) {\n    coords[alignmentAxis] += commonAlign * (alignment === 'end' ? 1 : -1) * (rtl && isVertical ? -1 : 1);\n  }\n  return coords;\n}\n\n/**\n * Resolves with an object of overflow side offsets that determine how much the\n * element is overflowing a given clipping boundary on each side.\n * - positive = overflowing the boundary by that number of pixels\n * - negative = how many pixels left before it will overflow\n * - 0 = lies flush with the boundary\n * @see https://floating-ui.com/docs/detectOverflow\n */\nasync function detectOverflow(state, options) {\n  var _await$platform$isEle;\n  if (options === void 0) {\n    options = {};\n  }\n  const {\n    x,\n    y,\n    platform,\n    rects,\n    elements,\n    strategy\n  } = state;\n  const {\n    boundary = 'clippingAncestors',\n    rootBoundary = 'viewport',\n    elementContext = 'floating',\n    altBoundary = false,\n    padding = 0\n  } = evaluate(options, state);\n  const paddingObject = getPaddingObject(padding);\n  const altContext = elementContext === 'floating' ? 'reference' : 'floating';\n  const element = elements[altBoundary ? altContext : elementContext];\n  const clippingClientRect = rectToClientRect(await platform.getClippingRect({\n    element: ((_await$platform$isEle = await (platform.isElement == null ? void 0 : platform.isElement(element))) != null ? _await$platform$isEle : true) ? element : element.contextElement || (await (platform.getDocumentElement == null ? void 0 : platform.getDocumentElement(elements.floating))),\n    boundary,\n    rootBoundary,\n    strategy\n  }));\n  const rect = elementContext === 'floating' ? {\n    x,\n    y,\n    width: rects.floating.width,\n    height: rects.floating.height\n  } : rects.reference;\n  const offsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(elements.floating));\n  const offsetScale = (await (platform.isElement == null ? void 0 : platform.isElement(offsetParent))) && (await (platform.getScale == null ? void 0 : platform.getScale(offsetParent))) || {\n    x: 1,\n    y: 1\n  };\n  const elementClientRect = rectToClientRect(platform.convertOffsetParentRelativeRectToViewportRelativeRect ? await platform.convertOffsetParentRelativeRectToViewportRelativeRect({\n    elements,\n    rect,\n    offsetParent,\n    strategy\n  }) : rect);\n  return {\n    top: (clippingClientRect.top - elementClientRect.top + paddingObject.top) / offsetScale.y,\n    bottom: (elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom) / offsetScale.y,\n    left: (clippingClientRect.left - elementClientRect.left + paddingObject.left) / offsetScale.x,\n    right: (elementClientRect.right - clippingClientRect.right + paddingObject.right) / offsetScale.x\n  };\n}\n\n// Maximum number of resets that can occur before bailing to avoid infinite reset loops.\nconst MAX_RESET_COUNT = 50;\n\n/**\n * Computes the `x` and `y` coordinates that will place the floating element\n * next to a given reference element.\n *\n * This export does not have any `platform` interface logic. You will need to\n * write one for the platform you are using Floating UI with.\n */\nconst computePosition = async (reference, floating, config) => {\n  const {\n    placement = 'bottom',\n    strategy = 'absolute',\n    middleware = [],\n    platform\n  } = config;\n  const platformWithDetectOverflow = platform.detectOverflow ? platform : {\n    ...platform,\n    detectOverflow\n  };\n  const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(floating));\n  let rects = await platform.getElementRects({\n    reference,\n    floating,\n    strategy\n  });\n  let {\n    x,\n    y\n  } = computeCoordsFromPlacement(rects, placement, rtl);\n  let statefulPlacement = placement;\n  let resetCount = 0;\n  const middlewareData = {};\n  for (let i = 0; i < middleware.length; i++) {\n    const currentMiddleware = middleware[i];\n    if (!currentMiddleware) {\n      continue;\n    }\n    const {\n      name,\n      fn\n    } = currentMiddleware;\n    const {\n      x: nextX,\n      y: nextY,\n      data,\n      reset\n    } = await fn({\n      x,\n      y,\n      initialPlacement: placement,\n      placement: statefulPlacement,\n      strategy,\n      middlewareData,\n      rects,\n      platform: platformWithDetectOverflow,\n      elements: {\n        reference,\n        floating\n      }\n    });\n    x = nextX != null ? nextX : x;\n    y = nextY != null ? nextY : y;\n    middlewareData[name] = {\n      ...middlewareData[name],\n      ...data\n    };\n    if (reset && resetCount < MAX_RESET_COUNT) {\n      resetCount++;\n      if (typeof reset === 'object') {\n        if (reset.placement) {\n          statefulPlacement = reset.placement;\n        }\n        if (reset.rects) {\n          rects = reset.rects === true ? await platform.getElementRects({\n            reference,\n            floating,\n            strategy\n          }) : reset.rects;\n        }\n        ({\n          x,\n          y\n        } = computeCoordsFromPlacement(rects, statefulPlacement, rtl));\n      }\n      i = -1;\n    }\n  }\n  return {\n    x,\n    y,\n    placement: statefulPlacement,\n    strategy,\n    middlewareData\n  };\n};\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = options => ({\n  name: 'arrow',\n  options,\n  async fn(state) {\n    const {\n      x,\n      y,\n      placement,\n      rects,\n      platform,\n      elements,\n      middlewareData\n    } = state;\n    // Since `element` is required, we don't Partial<> the type.\n    const {\n      element,\n      padding = 0\n    } = evaluate(options, state) || {};\n    if (element == null) {\n      return {};\n    }\n    const paddingObject = getPaddingObject(padding);\n    const coords = {\n      x,\n      y\n    };\n    const axis = getAlignmentAxis(placement);\n    const length = getAxisLength(axis);\n    const arrowDimensions = await platform.getDimensions(element);\n    const isYAxis = axis === 'y';\n    const minProp = isYAxis ? 'top' : 'left';\n    const maxProp = isYAxis ? 'bottom' : 'right';\n    const clientProp = isYAxis ? 'clientHeight' : 'clientWidth';\n    const endDiff = rects.reference[length] + rects.reference[axis] - coords[axis] - rects.floating[length];\n    const startDiff = coords[axis] - rects.reference[axis];\n    const arrowOffsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(element));\n    let clientSize = arrowOffsetParent ? arrowOffsetParent[clientProp] : 0;\n\n    // DOM platform can return `window` as the `offsetParent`.\n    if (!clientSize || !(await (platform.isElement == null ? void 0 : platform.isElement(arrowOffsetParent)))) {\n      clientSize = elements.floating[clientProp] || rects.floating[length];\n    }\n    const centerToReference = endDiff / 2 - startDiff / 2;\n\n    // If the padding is large enough that it causes the arrow to no longer be\n    // centered, modify the padding so that it is centered.\n    const largestPossiblePadding = clientSize / 2 - arrowDimensions[length] / 2 - 1;\n    const minPadding = min(paddingObject[minProp], largestPossiblePadding);\n    const maxPadding = min(paddingObject[maxProp], largestPossiblePadding);\n\n    // Make sure the arrow doesn't overflow the floating element if the center\n    // point is outside the floating element's bounds.\n    const max = clientSize - arrowDimensions[length] - maxPadding;\n    const center = clientSize / 2 - arrowDimensions[length] / 2 + centerToReference;\n    const offset = clamp(minPadding, center, max);\n\n    // If the reference is small enough that the arrow's padding causes it to\n    // to point to nothing for an aligned placement, adjust the offset of the\n    // floating element itself. To ensure `shift()` continues to take action,\n    // a single reset is performed when this is true.\n    const shouldAddOffset = !middlewareData.arrow && getAlignment(placement) != null && center !== offset && rects.reference[length] / 2 - (center < minPadding ? minPadding : maxPadding) - arrowDimensions[length] / 2 < 0;\n    const alignmentOffset = shouldAddOffset ? center < minPadding ? center - minPadding : center - max : 0;\n    return {\n      [axis]: coords[axis] + alignmentOffset,\n      data: {\n        [axis]: offset,\n        centerOffset: center - offset - alignmentOffset,\n        ...(shouldAddOffset && {\n          alignmentOffset\n        })\n      },\n      reset: shouldAddOffset\n    };\n  }\n});\n\nfunction getPlacementList(alignment, autoAlignment, allowedPlacements) {\n  const allowedPlacementsSortedByAlignment = alignment ? [...allowedPlacements.filter(placement => getAlignment(placement) === alignment), ...allowedPlacements.filter(placement => getAlignment(placement) !== alignment)] : allowedPlacements.filter(placement => getSide(placement) === placement);\n  return allowedPlacementsSortedByAlignment.filter(placement => {\n    if (alignment) {\n      return getAlignment(placement) === alignment || (autoAlignment ? getOppositeAlignmentPlacement(placement) !== placement : false);\n    }\n    return true;\n  });\n}\n/**\n * Optimizes the visibility of the floating element by choosing the placement\n * that has the most space available automatically, without needing to specify a\n * preferred placement. Alternative to `flip`.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = function (options) {\n  if (options === void 0) {\n    options = {};\n  }\n  return {\n    name: 'autoPlacement',\n    options,\n    async fn(state) {\n      var _middlewareData$autoP, _middlewareData$autoP2, _placementsThatFitOnE;\n      const {\n        rects,\n        middlewareData,\n        placement,\n        platform,\n        elements\n      } = state;\n      const {\n        crossAxis = false,\n        alignment,\n        allowedPlacements = placements,\n        autoAlignment = true,\n        ...detectOverflowOptions\n      } = evaluate(options, state);\n      const placements$1 = alignment !== undefined || allowedPlacements === placements ? getPlacementList(alignment || null, autoAlignment, allowedPlacements) : allowedPlacements;\n      const currentIndex = ((_middlewareData$autoP = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP.index) || 0;\n      const currentPlacement = placements$1[currentIndex];\n      if (currentPlacement == null) {\n        return {};\n      }\n\n      // Make `computeCoords` start from the right place.\n      if (placement !== currentPlacement) {\n        return {\n          reset: {\n            placement: placements$1[0]\n          }\n        };\n      }\n      const overflow = await platform.detectOverflow(state, detectOverflowOptions);\n      const alignmentSides = getAlignmentSides(currentPlacement, rects, await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating)));\n      const currentOverflows = [overflow[getSide(currentPlacement)], overflow[alignmentSides[0]], overflow[alignmentSides[1]]];\n      const allOverflows = [...(((_middlewareData$autoP2 = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP2.overflows) || []), {\n        placement: currentPlacement,\n        overflows: currentOverflows\n      }];\n      const nextPlacement = placements$1[currentIndex + 1];\n\n      // There are more placements to check.\n      if (nextPlacement) {\n        return {\n          data: {\n            index: currentIndex + 1,\n            overflows: allOverflows\n          },\n          reset: {\n            placement: nextPlacement\n          }\n        };\n      }\n      const placementsSortedByMostSpace = allOverflows.map(d => {\n        const alignment = getAlignment(d.placement);\n        return [d.placement, alignment && crossAxis ?\n        // Check along the mainAxis and main crossAxis side.\n        d.overflows.slice(0, 2).reduce((acc, v) => acc + v, 0) :\n        // Check only the mainAxis.\n        d.overflows[0], d.overflows];\n      }).sort((a, b) => a[1] - b[1]);\n      const placementsThatFitOnEachSide = placementsSortedByMostSpace.filter(d => d[2].slice(0,\n      // Aligned placements should not check their opposite crossAxis\n      // side.\n      getAlignment(d[0]) ? 2 : 3).every(v => v <= 0));\n      const resetPlacement = ((_placementsThatFitOnE = placementsThatFitOnEachSide[0]) == null ? void 0 : _placementsThatFitOnE[0]) || placementsSortedByMostSpace[0][0];\n      if (resetPlacement !== placement) {\n        return {\n          data: {\n            index: currentIndex + 1,\n            overflows: allOverflows\n          },\n          reset: {\n            placement: resetPlacement\n          }\n        };\n      }\n      return {};\n    }\n  };\n};\n\n/**\n * Optimizes the visibility of the floating element by flipping the `placement`\n * in order to keep it in view when the preferred placement(s) will overflow the\n * clipping boundary. Alternative to `autoPlacement`.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = function (options) {\n  if (options === void 0) {\n    options = {};\n  }\n  return {\n    name: 'flip',\n    options,\n    async fn(state) {\n      var _middlewareData$arrow, _middlewareData$flip;\n      const {\n        placement,\n        middlewareData,\n        rects,\n        initialPlacement,\n        platform,\n        elements\n      } = state;\n      const {\n        mainAxis: checkMainAxis = true,\n        crossAxis: checkCrossAxis = true,\n        fallbackPlacements: specifiedFallbackPlacements,\n        fallbackStrategy = 'bestFit',\n        fallbackAxisSideDirection = 'none',\n        flipAlignment = true,\n        ...detectOverflowOptions\n      } = evaluate(options, state);\n\n      // If a reset by the arrow was caused due to an alignment offset being\n      // added, we should skip any logic now since `flip()` has already done its\n      // work.\n      // https://github.com/floating-ui/floating-ui/issues/2549#issuecomment-1719601643\n      if ((_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) {\n        return {};\n      }\n      const side = getSide(placement);\n      const initialSideAxis = getSideAxis(initialPlacement);\n      const isBasePlacement = getSide(initialPlacement) === initialPlacement;\n      const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating));\n      const fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipAlignment ? [getOppositePlacement(initialPlacement)] : getExpandedPlacements(initialPlacement));\n      const hasFallbackAxisSideDirection = fallbackAxisSideDirection !== 'none';\n      if (!specifiedFallbackPlacements && hasFallbackAxisSideDirection) {\n        fallbackPlacements.push(...getOppositeAxisPlacements(initialPlacement, flipAlignment, fallbackAxisSideDirection, rtl));\n      }\n      const placements = [initialPlacement, ...fallbackPlacements];\n      const overflow = await platform.detectOverflow(state, detectOverflowOptions);\n      const overflows = [];\n      let overflowsData = ((_middlewareData$flip = middlewareData.flip) == null ? void 0 : _middlewareData$flip.overflows) || [];\n      if (checkMainAxis) {\n        overflows.push(overflow[side]);\n      }\n      if (checkCrossAxis) {\n        const sides = getAlignmentSides(placement, rects, rtl);\n        overflows.push(overflow[sides[0]], overflow[sides[1]]);\n      }\n      overflowsData = [...overflowsData, {\n        placement,\n        overflows\n      }];\n\n      // One or more sides is overflowing.\n      if (!overflows.every(side => side <= 0)) {\n        var _middlewareData$flip2, _overflowsData$filter;\n        const nextIndex = (((_middlewareData$flip2 = middlewareData.flip) == null ? void 0 : _middlewareData$flip2.index) || 0) + 1;\n        const nextPlacement = placements[nextIndex];\n        if (nextPlacement) {\n          const ignoreCrossAxisOverflow = checkCrossAxis === 'alignment' ? initialSideAxis !== getSideAxis(nextPlacement) : false;\n          if (!ignoreCrossAxisOverflow ||\n          // We leave the current main axis only if every placement on that axis\n          // overflows the main axis.\n          overflowsData.every(d => getSideAxis(d.placement) === initialSideAxis ? d.overflows[0] > 0 : true)) {\n            // Try next placement and re-run the lifecycle.\n            return {\n              data: {\n                index: nextIndex,\n                overflows: overflowsData\n              },\n              reset: {\n                placement: nextPlacement\n              }\n            };\n          }\n        }\n\n        // First, find the candidates that fit on the mainAxis side of overflow,\n        // then find the placement that fits the best on the main crossAxis side.\n        let resetPlacement = (_overflowsData$filter = overflowsData.filter(d => d.overflows[0] <= 0).sort((a, b) => a.overflows[1] - b.overflows[1])[0]) == null ? void 0 : _overflowsData$filter.placement;\n\n        // Otherwise fallback.\n        if (!resetPlacement) {\n          switch (fallbackStrategy) {\n            case 'bestFit':\n              {\n                var _overflowsData$filter2;\n                const placement = (_overflowsData$filter2 = overflowsData.filter(d => {\n                  if (hasFallbackAxisSideDirection) {\n                    const currentSideAxis = getSideAxis(d.placement);\n                    return currentSideAxis === initialSideAxis ||\n                    // Create a bias to the `y` side axis due to horizontal\n                    // reading directions favoring greater width.\n                    currentSideAxis === 'y';\n                  }\n                  return true;\n                }).map(d => [d.placement, d.overflows.filter(overflow => overflow > 0).reduce((acc, overflow) => acc + overflow, 0)]).sort((a, b) => a[1] - b[1])[0]) == null ? void 0 : _overflowsData$filter2[0];\n                if (placement) {\n                  resetPlacement = placement;\n                }\n                break;\n              }\n            case 'initialPlacement':\n              resetPlacement = initialPlacement;\n              break;\n          }\n        }\n        if (placement !== resetPlacement) {\n          return {\n            reset: {\n              placement: resetPlacement\n            }\n          };\n        }\n      }\n      return {};\n    }\n  };\n};\n\nfunction getSideOffsets(overflow, rect) {\n  return {\n    top: overflow.top - rect.height,\n    right: overflow.right - rect.width,\n    bottom: overflow.bottom - rect.height,\n    left: overflow.left - rect.width\n  };\n}\nfunction isAnySideFullyClipped(overflow) {\n  return sides.some(side => overflow[side] >= 0);\n}\n/**\n * Provides data to hide the floating element in applicable situations, such as\n * when it is not in the same clipping context as the reference element.\n * @see https://floating-ui.com/docs/hide\n */\nconst hide = function (options) {\n  if (options === void 0) {\n    options = {};\n  }\n  return {\n    name: 'hide',\n    options,\n    async fn(state) {\n      const {\n        rects,\n        platform\n      } = state;\n      const {\n        strategy = 'referenceHidden',\n        ...detectOverflowOptions\n      } = evaluate(options, state);\n      switch (strategy) {\n        case 'referenceHidden':\n          {\n            const overflow = await platform.detectOverflow(state, {\n              ...detectOverflowOptions,\n              elementContext: 'reference'\n            });\n            const offsets = getSideOffsets(overflow, rects.reference);\n            return {\n              data: {\n                referenceHiddenOffsets: offsets,\n                referenceHidden: isAnySideFullyClipped(offsets)\n              }\n            };\n          }\n        case 'escaped':\n          {\n            const overflow = await platform.detectOverflow(state, {\n              ...detectOverflowOptions,\n              altBoundary: true\n            });\n            const offsets = getSideOffsets(overflow, rects.floating);\n            return {\n              data: {\n                escapedOffsets: offsets,\n                escaped: isAnySideFullyClipped(offsets)\n              }\n            };\n          }\n        default:\n          {\n            return {};\n          }\n      }\n    }\n  };\n};\n\nfunction getBoundingRect(rects) {\n  const minX = min(...rects.map(rect => rect.left));\n  const minY = min(...rects.map(rect => rect.top));\n  const maxX = max(...rects.map(rect => rect.right));\n  const maxY = max(...rects.map(rect => rect.bottom));\n  return {\n    x: minX,\n    y: minY,\n    width: maxX - minX,\n    height: maxY - minY\n  };\n}\nfunction getRectsByLine(rects) {\n  const sortedRects = rects.slice().sort((a, b) => a.y - b.y);\n  const groups = [];\n  let prevRect = null;\n  for (let i = 0; i < sortedRects.length; i++) {\n    const rect = sortedRects[i];\n    if (!prevRect || rect.y - prevRect.y > prevRect.height / 2) {\n      groups.push([rect]);\n    } else {\n      groups[groups.length - 1].push(rect);\n    }\n    prevRect = rect;\n  }\n  return groups.map(rect => rectToClientRect(getBoundingRect(rect)));\n}\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = function (options) {\n  if (options === void 0) {\n    options = {};\n  }\n  return {\n    name: 'inline',\n    options,\n    async fn(state) {\n      const {\n        placement,\n        elements,\n        rects,\n        platform,\n        strategy\n      } = state;\n      // A MouseEvent's client{X,Y} coords can be up to 2 pixels off a\n      // ClientRect's bounds, despite the event listener being triggered. A\n      // padding of 2 seems to handle this issue.\n      const {\n        padding = 2,\n        x,\n        y\n      } = evaluate(options, state);\n      const nativeClientRects = Array.from((await (platform.getClientRects == null ? void 0 : platform.getClientRects(elements.reference))) || []);\n\n      // No rects (e.g. a hidden or detached reference, or a collapsed range) —\n      // keep the existing reference rect rather than resetting to an invalid\n      // one with non-finite values.\n      if (!nativeClientRects.length) {\n        return {};\n      }\n      const clientRects = getRectsByLine(nativeClientRects);\n      const fallback = rectToClientRect(getBoundingRect(nativeClientRects));\n      const paddingObject = getPaddingObject(padding);\n      function getBoundingClientRect() {\n        // There are two rects and they are disjoined.\n        if (clientRects.length === 2 && (clientRects[0].left > clientRects[1].right || clientRects[1].left > clientRects[0].right) && x != null && y != null) {\n          // Find the first rect in which the point is fully inside.\n          return clientRects.find(rect => x > rect.left - paddingObject.left && x < rect.right + paddingObject.right && y > rect.top - paddingObject.top && y < rect.bottom + paddingObject.bottom) || fallback;\n        }\n\n        // There are 2 or more connected rects.\n        if (clientRects.length >= 2) {\n          if (getSideAxis(placement) === 'y') {\n            const firstRect = clientRects[0];\n            const lastRect = clientRects[clientRects.length - 1];\n            const isTop = getSide(placement) === 'top';\n            const top = firstRect.top;\n            const bottom = lastRect.bottom;\n            const left = isTop ? firstRect.left : lastRect.left;\n            const right = isTop ? firstRect.right : lastRect.right;\n            return rectToClientRect({\n              x: left,\n              y: top,\n              width: right - left,\n              height: bottom - top\n            });\n          }\n          const isLeftSide = getSide(placement) === 'left';\n          const maxRight = max(...clientRects.map(rect => rect.right));\n          const minLeft = min(...clientRects.map(rect => rect.left));\n          const measureRects = clientRects.filter(rect => isLeftSide ? rect.left === minLeft : rect.right === maxRight);\n          const top = measureRects[0].top;\n          const bottom = measureRects[measureRects.length - 1].bottom;\n          return rectToClientRect({\n            x: minLeft,\n            y: top,\n            width: maxRight - minLeft,\n            height: bottom - top\n          });\n        }\n        return fallback;\n      }\n      const resetRects = await platform.getElementRects({\n        reference: {\n          getBoundingClientRect\n        },\n        floating: elements.floating,\n        strategy\n      });\n      if (rects.reference.x !== resetRects.reference.x || rects.reference.y !== resetRects.reference.y || rects.reference.width !== resetRects.reference.width || rects.reference.height !== resetRects.reference.height) {\n        return {\n          reset: {\n            rects: resetRects\n          }\n        };\n      }\n      return {};\n    }\n  };\n};\n\nconst originSides = /*#__PURE__*/new Set(['left', 'top']);\n\n// For type backwards-compatibility, the `OffsetOptions` type was also\n// Derivable.\n\nasync function convertValueToCoords(state, options) {\n  const {\n    placement,\n    platform,\n    elements\n  } = state;\n  const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating));\n  const side = getSide(placement);\n  const alignment = getAlignment(placement);\n  const isVertical = getSideAxis(placement) === 'y';\n  const mainAxisMulti = originSides.has(side) ? -1 : 1;\n  const crossAxisMulti = rtl && isVertical ? -1 : 1;\n  const rawValue = evaluate(options, state);\n\n  // eslint-disable-next-line prefer-const\n  let {\n    mainAxis,\n    crossAxis,\n    alignmentAxis\n  } = typeof rawValue === 'number' ? {\n    mainAxis: rawValue,\n    crossAxis: 0,\n    alignmentAxis: null\n  } : {\n    mainAxis: rawValue.mainAxis || 0,\n    crossAxis: rawValue.crossAxis || 0,\n    alignmentAxis: rawValue.alignmentAxis\n  };\n  if (alignment && typeof alignmentAxis === 'number') {\n    crossAxis = alignment === 'end' ? alignmentAxis * -1 : alignmentAxis;\n  }\n  return isVertical ? {\n    x: crossAxis * crossAxisMulti,\n    y: mainAxis * mainAxisMulti\n  } : {\n    x: mainAxis * mainAxisMulti,\n    y: crossAxis * crossAxisMulti\n  };\n}\n\n/**\n * Modifies the placement by translating the floating element along the\n * specified axes.\n * A number (shorthand for `mainAxis` or distance), or an axes configuration\n * object may be passed.\n * @see https://floating-ui.com/docs/offset\n */\nconst offset = function (options) {\n  if (options === void 0) {\n    options = 0;\n  }\n  return {\n    name: 'offset',\n    options,\n    async fn(state) {\n      var _middlewareData$offse, _middlewareData$arrow;\n      const {\n        x,\n        y,\n        placement,\n        middlewareData\n      } = state;\n      const diffCoords = await convertValueToCoords(state, options);\n\n      // If the placement is the same and the arrow caused an alignment offset\n      // then we don't need to change the positioning coordinates.\n      if (placement === ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse.placement) && (_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) {\n        return {};\n      }\n      return {\n        x: x + diffCoords.x,\n        y: y + diffCoords.y,\n        data: {\n          ...diffCoords,\n          placement\n        }\n      };\n    }\n  };\n};\n\n/**\n * Optimizes the visibility of the floating element by shifting it in order to\n * keep it in view when it will overflow the clipping boundary.\n * @see https://floating-ui.com/docs/shift\n */\nconst shift = function (options) {\n  if (options === void 0) {\n    options = {};\n  }\n  return {\n    name: 'shift',\n    options,\n    async fn(state) {\n      const {\n        x,\n        y,\n        placement,\n        platform\n      } = state;\n      const {\n        mainAxis: checkMainAxis = true,\n        crossAxis: checkCrossAxis = false,\n        limiter = {\n          fn: _ref => {\n            let {\n              x,\n              y\n            } = _ref;\n            return {\n              x,\n              y\n            };\n          }\n        },\n        ...detectOverflowOptions\n      } = evaluate(options, state);\n      const coords = {\n        x,\n        y\n      };\n      const overflow = await platform.detectOverflow(state, detectOverflowOptions);\n      const crossAxis = getSideAxis(placement);\n      const mainAxis = getOppositeAxis(crossAxis);\n      let mainAxisCoord = coords[mainAxis];\n      let crossAxisCoord = coords[crossAxis];\n      const clampCoord = (axis, coord) => clamp(coord + overflow[axis === 'y' ? 'top' : 'left'], coord, coord - overflow[axis === 'y' ? 'bottom' : 'right']);\n      if (checkMainAxis) {\n        mainAxisCoord = clampCoord(mainAxis, mainAxisCoord);\n      }\n      if (checkCrossAxis) {\n        crossAxisCoord = clampCoord(crossAxis, crossAxisCoord);\n      }\n      const limitedCoords = limiter.fn({\n        ...state,\n        [mainAxis]: mainAxisCoord,\n        [crossAxis]: crossAxisCoord\n      });\n      return {\n        ...limitedCoords,\n        data: {\n          x: limitedCoords.x - x,\n          y: limitedCoords.y - y,\n          enabled: {\n            [mainAxis]: checkMainAxis,\n            [crossAxis]: checkCrossAxis\n          }\n        }\n      };\n    }\n  };\n};\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = function (options) {\n  if (options === void 0) {\n    options = {};\n  }\n  return {\n    options,\n    fn(state) {\n      var _rawOffset$mainAxis, _rawOffset$crossAxis;\n      const {\n        x,\n        y,\n        placement,\n        rects,\n        middlewareData\n      } = state;\n      const {\n        offset = 0,\n        mainAxis: checkMainAxis = true,\n        crossAxis: checkCrossAxis = true\n      } = evaluate(options, state);\n      const coords = {\n        x,\n        y\n      };\n      const crossAxis = getSideAxis(placement);\n      const mainAxis = getOppositeAxis(crossAxis);\n      let mainAxisCoord = coords[mainAxis];\n      let crossAxisCoord = coords[crossAxis];\n      const rawOffset = evaluate(offset, state);\n      const computedOffset = typeof rawOffset === 'number' ? {\n        mainAxis: rawOffset,\n        crossAxis: 0\n      } : {\n        mainAxis: (_rawOffset$mainAxis = rawOffset.mainAxis) != null ? _rawOffset$mainAxis : 0,\n        crossAxis: (_rawOffset$crossAxis = rawOffset.crossAxis) != null ? _rawOffset$crossAxis : 0\n      };\n      if (checkMainAxis) {\n        const len = mainAxis === 'y' ? 'height' : 'width';\n        const limitMin = rects.reference[mainAxis] - rects.floating[len] + computedOffset.mainAxis;\n        const limitMax = rects.reference[mainAxis] + rects.reference[len] - computedOffset.mainAxis;\n        if (mainAxisCoord < limitMin) {\n          mainAxisCoord = limitMin;\n        } else if (mainAxisCoord > limitMax) {\n          mainAxisCoord = limitMax;\n        }\n      }\n      if (checkCrossAxis) {\n        var _middlewareData$offse, _middlewareData$offse2;\n        const len = mainAxis === 'y' ? 'width' : 'height';\n        const isOriginSide = originSides.has(getSide(placement));\n        const limitMin = rects.reference[crossAxis] - rects.floating[len] + (isOriginSide ? ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse[crossAxis]) || 0 : 0) + (isOriginSide ? 0 : computedOffset.crossAxis);\n        const limitMax = rects.reference[crossAxis] + rects.reference[len] + (isOriginSide ? 0 : ((_middlewareData$offse2 = middlewareData.offset) == null ? void 0 : _middlewareData$offse2[crossAxis]) || 0) - (isOriginSide ? computedOffset.crossAxis : 0);\n        if (crossAxisCoord < limitMin) {\n          crossAxisCoord = limitMin;\n        } else if (crossAxisCoord > limitMax) {\n          crossAxisCoord = limitMax;\n        }\n      }\n      return {\n        [mainAxis]: mainAxisCoord,\n        [crossAxis]: crossAxisCoord\n      };\n    }\n  };\n};\n\n// Method syntax keeps callback parameters bivariant, but expressing the\n// explicit `| undefined` required by `exactOptionalPropertyTypes` needs\n// property syntax, which is contravariant under `strictFunctionTypes`.\n// Extracting the function from a method position restores that bivariance so\n// consumers can still assign callbacks with narrower parameter types.\n\n/**\n * Provides data that allows you to change the size of the floating element —\n * for instance, prevent it from overflowing the clipping boundary or match the\n * width of the reference element.\n * @see https://floating-ui.com/docs/size\n */\nconst size = function (options) {\n  if (options === void 0) {\n    options = {};\n  }\n  return {\n    name: 'size',\n    options,\n    async fn(state) {\n      const {\n        placement,\n        rects,\n        platform,\n        elements\n      } = state;\n      const {\n        apply = () => {},\n        ...detectOverflowOptions\n      } = evaluate(options, state);\n      const overflow = await platform.detectOverflow(state, detectOverflowOptions);\n      const side = getSide(placement);\n      const alignment = getAlignment(placement);\n      const isYAxis = getSideAxis(placement) === 'y';\n      const {\n        width,\n        height\n      } = rects.floating;\n      let heightSide;\n      let widthSide;\n      if (side === 'top' || side === 'bottom') {\n        heightSide = side;\n        widthSide = alignment === ((await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating))) ? 'start' : 'end') ? 'left' : 'right';\n      } else {\n        widthSide = side;\n        heightSide = alignment === 'end' ? 'top' : 'bottom';\n      }\n      const maximumClippingHeight = height - overflow.top - overflow.bottom;\n      const maximumClippingWidth = width - overflow.left - overflow.right;\n      const overflowAvailableHeight = min(height - overflow[heightSide], maximumClippingHeight);\n      const overflowAvailableWidth = min(width - overflow[widthSide], maximumClippingWidth);\n      const shiftData = state.middlewareData.shift;\n      const noShift = !shiftData;\n      let availableHeight = overflowAvailableHeight;\n      let availableWidth = overflowAvailableWidth;\n      if (shiftData != null && shiftData.enabled.x) {\n        availableWidth = maximumClippingWidth;\n      }\n      if (shiftData != null && shiftData.enabled.y) {\n        availableHeight = maximumClippingHeight;\n      }\n      if (noShift && !alignment) {\n        if (isYAxis) {\n          availableWidth = width - 2 * max(overflow.left, overflow.right);\n        } else {\n          availableHeight = height - 2 * max(overflow.top, overflow.bottom);\n        }\n      }\n      await apply({\n        ...state,\n        availableWidth,\n        availableHeight\n      });\n      const nextDimensions = await platform.getDimensions(elements.floating);\n      if (width !== nextDimensions.width || height !== nextDimensions.height) {\n        return {\n          reset: {\n            rects: true\n          }\n        };\n      }\n      return {};\n    }\n  };\n};\n\nexport { arrow, autoPlacement, computePosition, detectOverflow, flip, hide, inline, limitShift, offset, shift, size };\n","function hasWindow() {\n  return typeof window !== 'undefined';\n}\nfunction getNodeName(node) {\n  if (isNode(node)) {\n    return (node.nodeName || '').toLowerCase();\n  }\n  // Mocked nodes in testing environments may not be instances of Node. By\n  // returning `#document` an infinite loop won't occur.\n  // https://github.com/floating-ui/floating-ui/issues/2317\n  return '#document';\n}\nfunction getWindow(node) {\n  var _node$ownerDocument;\n  return (node == null || (_node$ownerDocument = node.ownerDocument) == null ? void 0 : _node$ownerDocument.defaultView) || window;\n}\nfunction getDocumentElement(node) {\n  var _ref;\n  return (_ref = (isNode(node) ? node.ownerDocument : node.document) || window.document) == null ? void 0 : _ref.documentElement;\n}\nfunction isNode(value) {\n  if (!hasWindow()) {\n    return false;\n  }\n  return value instanceof Node || value instanceof getWindow(value).Node;\n}\nfunction isElement(value) {\n  if (!hasWindow()) {\n    return false;\n  }\n  return value instanceof Element || value instanceof getWindow(value).Element;\n}\nfunction isHTMLElement(value) {\n  if (!hasWindow()) {\n    return false;\n  }\n  return value instanceof HTMLElement || value instanceof getWindow(value).HTMLElement;\n}\nfunction isShadowRoot(value) {\n  if (!hasWindow() || typeof ShadowRoot === 'undefined') {\n    return false;\n  }\n  return value instanceof ShadowRoot || value instanceof getWindow(value).ShadowRoot;\n}\nfunction isOverflowElement(element) {\n  const {\n    overflow,\n    overflowX,\n    overflowY,\n    display\n  } = getComputedStyle(element);\n  return /auto|scroll|overlay|hidden|clip/.test(overflow + overflowY + overflowX) && display !== 'inline' && display !== 'contents';\n}\nfunction isTableElement(element) {\n  return /^(table|td|th)$/.test(getNodeName(element));\n}\nfunction isTopLayer(element) {\n  try {\n    if (element.matches(':popover-open')) {\n      return true;\n    }\n  } catch (_e) {\n    // no-op\n  }\n  try {\n    return element.matches(':modal');\n  } catch (_e) {\n    return false;\n  }\n}\nconst willChangeRe = /transform|translate|scale|rotate|perspective|filter/;\nconst containRe = /paint|layout|strict|content/;\nconst isNotNone = value => !!value && value !== 'none';\nlet isWebKitValue;\nfunction isContainingBlock(elementOrCss) {\n  const css = isElement(elementOrCss) ? getComputedStyle(elementOrCss) : elementOrCss;\n\n  // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n  // https://drafts.csswg.org/css-transforms-2/#individual-transforms\n  return isNotNone(css.transform) || isNotNone(css.translate) || isNotNone(css.scale) || isNotNone(css.rotate) || isNotNone(css.perspective) || !isWebKit() && (isNotNone(css.backdropFilter) || isNotNone(css.filter)) || willChangeRe.test(css.willChange || '') || containRe.test(css.contain || '');\n}\nfunction getContainingBlock(element) {\n  let currentNode = getParentNode(element);\n  while (isHTMLElement(currentNode) && !isLastTraversableNode(currentNode)) {\n    if (isContainingBlock(currentNode)) {\n      return currentNode;\n    } else if (isTopLayer(currentNode)) {\n      return null;\n    }\n    currentNode = getParentNode(currentNode);\n  }\n  return null;\n}\nfunction isWebKit() {\n  if (isWebKitValue == null) {\n    isWebKitValue = typeof CSS !== 'undefined' && CSS.supports && CSS.supports('-webkit-backdrop-filter', 'none');\n  }\n  return isWebKitValue;\n}\nfunction isLastTraversableNode(node) {\n  return /^(html|body|#document)$/.test(getNodeName(node));\n}\nfunction getComputedStyle(element) {\n  return getWindow(element).getComputedStyle(element);\n}\nfunction getNodeScroll(element) {\n  if (isElement(element)) {\n    return {\n      scrollLeft: element.scrollLeft,\n      scrollTop: element.scrollTop\n    };\n  }\n  return {\n    scrollLeft: element.scrollX,\n    scrollTop: element.scrollY\n  };\n}\nfunction getParentNode(node) {\n  if (getNodeName(node) === 'html') {\n    return node;\n  }\n  const result =\n  // Step into the shadow DOM of the parent of a slotted node.\n  node.assignedSlot ||\n  // DOM Element detected.\n  node.parentNode ||\n  // ShadowRoot detected.\n  isShadowRoot(node) && node.host ||\n  // Fallback.\n  getDocumentElement(node);\n  return isShadowRoot(result) ? result.host : result;\n}\nfunction getNearestOverflowAncestor(node) {\n  const parentNode = getParentNode(node);\n  if (isLastTraversableNode(parentNode)) {\n    return (node.ownerDocument || node).body;\n  }\n  if (isHTMLElement(parentNode) && isOverflowElement(parentNode)) {\n    return parentNode;\n  }\n  return getNearestOverflowAncestor(parentNode);\n}\nfunction getOverflowAncestors(node, list, traverseIframes) {\n  var _node$ownerDocument2;\n  if (list === void 0) {\n    list = [];\n  }\n  if (traverseIframes === void 0) {\n    traverseIframes = true;\n  }\n  const scrollableAncestor = getNearestOverflowAncestor(node);\n  const isBody = scrollableAncestor === ((_node$ownerDocument2 = node.ownerDocument) == null ? void 0 : _node$ownerDocument2.body);\n  const win = getWindow(scrollableAncestor);\n  if (isBody) {\n    const frameElement = getFrameElement(win);\n    return list.concat(win, win.visualViewport || [], isOverflowElement(scrollableAncestor) ? scrollableAncestor : [], frameElement && traverseIframes ? getOverflowAncestors(frameElement) : []);\n  } else {\n    return list.concat(scrollableAncestor, getOverflowAncestors(scrollableAncestor, [], traverseIframes));\n  }\n}\nfunction getFrameElement(win) {\n  return win.parent && Object.getPrototypeOf(win.parent) ? win.frameElement : null;\n}\n\nexport { getComputedStyle, getContainingBlock, getDocumentElement, getFrameElement, getNearestOverflowAncestor, getNodeName, getNodeScroll, getOverflowAncestors, getParentNode, getWindow, isContainingBlock, isElement, isHTMLElement, isLastTraversableNode, isNode, isOverflowElement, isShadowRoot, isTableElement, isTopLayer, isWebKit };\n","import { rectToClientRect, arrow as arrow$1, autoPlacement as autoPlacement$1, detectOverflow as detectOverflow$1, flip as flip$1, hide as hide$1, inline as inline$1, limitShift as limitShift$1, offset as offset$1, shift as shift$1, size as size$1, computePosition as computePosition$1 } from '@floating-ui/core';\nimport { round, createCoords, max, min, floor } from '@floating-ui/utils';\nimport { getComputedStyle as getComputedStyle$1, isHTMLElement, isElement, getWindow, isWebKit, getFrameElement, getNodeScroll, getDocumentElement, isTopLayer, getNodeName, isOverflowElement, getOverflowAncestors, getParentNode, isLastTraversableNode, isContainingBlock, isTableElement, getContainingBlock } from '@floating-ui/utils/dom';\nexport { getOverflowAncestors } from '@floating-ui/utils/dom';\n\nfunction getCssDimensions(element) {\n  const css = getComputedStyle$1(element);\n  // In testing environments, the `width` and `height` properties are empty\n  // strings for SVG elements, returning NaN. Fallback to `0` in this case.\n  let width = parseFloat(css.width) || 0;\n  let height = parseFloat(css.height) || 0;\n  const hasOffset = isHTMLElement(element);\n  const offsetWidth = hasOffset ? element.offsetWidth : width;\n  const offsetHeight = hasOffset ? element.offsetHeight : height;\n  const shouldFallback = round(width) !== offsetWidth || round(height) !== offsetHeight;\n  if (shouldFallback) {\n    width = offsetWidth;\n    height = offsetHeight;\n  }\n  return {\n    width,\n    height,\n    $: shouldFallback\n  };\n}\n\nfunction unwrapElement(element) {\n  return !isElement(element) ? element.contextElement : element;\n}\n\nfunction getScale(element) {\n  const domElement = unwrapElement(element);\n  if (!isHTMLElement(domElement)) {\n    return createCoords(1);\n  }\n  const rect = domElement.getBoundingClientRect();\n  const {\n    width,\n    height,\n    $\n  } = getCssDimensions(domElement);\n  let x = ($ ? round(rect.width) : rect.width) / width;\n  let y = ($ ? round(rect.height) : rect.height) / height;\n\n  // 0, NaN, or Infinity should always fallback to 1.\n\n  if (!x || !Number.isFinite(x)) {\n    x = 1;\n  }\n  if (!y || !Number.isFinite(y)) {\n    y = 1;\n  }\n  return {\n    x,\n    y\n  };\n}\n\nconst noOffsets = /*#__PURE__*/createCoords(0);\nfunction getVisualOffsets(element) {\n  const win = getWindow(element);\n  if (!isWebKit() || !win.visualViewport) {\n    return noOffsets;\n  }\n  return {\n    x: win.visualViewport.offsetLeft,\n    y: win.visualViewport.offsetTop\n  };\n}\nfunction shouldAddVisualOffsets(element, isFixed, floatingOffsetParent) {\n  if (isFixed === void 0) {\n    isFixed = false;\n  }\n  return !!floatingOffsetParent && isFixed && floatingOffsetParent === getWindow(element);\n}\n\nfunction getBoundingClientRect(element, includeScale, isFixedStrategy, offsetParent) {\n  if (includeScale === void 0) {\n    includeScale = false;\n  }\n  if (isFixedStrategy === void 0) {\n    isFixedStrategy = false;\n  }\n  const clientRect = element.getBoundingClientRect();\n  const domElement = unwrapElement(element);\n  let scale = createCoords(1);\n  if (includeScale) {\n    if (offsetParent) {\n      if (isElement(offsetParent)) {\n        scale = getScale(offsetParent);\n      }\n    } else {\n      scale = getScale(element);\n    }\n  }\n  const visualOffsets = shouldAddVisualOffsets(domElement, isFixedStrategy, offsetParent) ? getVisualOffsets(domElement) : createCoords(0);\n  let x = (clientRect.left + visualOffsets.x) / scale.x;\n  let y = (clientRect.top + visualOffsets.y) / scale.y;\n  let width = clientRect.width / scale.x;\n  let height = clientRect.height / scale.y;\n  if (domElement && offsetParent) {\n    const win = getWindow(domElement);\n    const offsetWin = isElement(offsetParent) ? getWindow(offsetParent) : offsetParent;\n    let currentWin = win;\n    let currentIFrame = getFrameElement(currentWin);\n    while (currentIFrame && offsetWin !== currentWin) {\n      const iframeScale = getScale(currentIFrame);\n      const iframeRect = currentIFrame.getBoundingClientRect();\n      const css = getComputedStyle$1(currentIFrame);\n      const left = iframeRect.left + (currentIFrame.clientLeft + parseFloat(css.paddingLeft)) * iframeScale.x;\n      const top = iframeRect.top + (currentIFrame.clientTop + parseFloat(css.paddingTop)) * iframeScale.y;\n      x *= iframeScale.x;\n      y *= iframeScale.y;\n      width *= iframeScale.x;\n      height *= iframeScale.y;\n      x += left;\n      y += top;\n      currentWin = getWindow(currentIFrame);\n      currentIFrame = getFrameElement(currentWin);\n    }\n  }\n  return rectToClientRect({\n    width,\n    height,\n    x,\n    y\n  });\n}\n\n// If <html> has a CSS width greater than the viewport, then this will be\n// incorrect for RTL.\nfunction getWindowScrollBarX(element, rect) {\n  const leftScroll = getNodeScroll(element).scrollLeft;\n  if (!rect) {\n    return getBoundingClientRect(getDocumentElement(element)).left + leftScroll;\n  }\n  return rect.left + leftScroll;\n}\n\nfunction getHTMLOffset(documentElement, scroll) {\n  const htmlRect = documentElement.getBoundingClientRect();\n  const x = htmlRect.left + scroll.scrollLeft - getWindowScrollBarX(documentElement, htmlRect);\n  const y = htmlRect.top + scroll.scrollTop;\n  return {\n    x,\n    y\n  };\n}\n\nfunction convertOffsetParentRelativeRectToViewportRelativeRect(_ref) {\n  let {\n    elements,\n    rect,\n    offsetParent,\n    strategy\n  } = _ref;\n  const isFixed = strategy === 'fixed';\n  const documentElement = getDocumentElement(offsetParent);\n  const topLayer = elements ? isTopLayer(elements.floating) : false;\n  if (offsetParent === documentElement || topLayer && isFixed) {\n    return rect;\n  }\n  let scroll = {\n    scrollLeft: 0,\n    scrollTop: 0\n  };\n  let scale = createCoords(1);\n  const offsets = createCoords(0);\n  const isOffsetParentAnElement = isHTMLElement(offsetParent);\n  if (isOffsetParentAnElement || !isFixed) {\n    if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {\n      scroll = getNodeScroll(offsetParent);\n    }\n    if (isOffsetParentAnElement) {\n      const offsetRect = getBoundingClientRect(offsetParent);\n      scale = getScale(offsetParent);\n      offsets.x = offsetRect.x + offsetParent.clientLeft;\n      offsets.y = offsetRect.y + offsetParent.clientTop;\n    }\n  }\n  const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll) : createCoords(0);\n  return {\n    width: rect.width * scale.x,\n    height: rect.height * scale.y,\n    x: rect.x * scale.x - scroll.scrollLeft * scale.x + offsets.x + htmlOffset.x,\n    y: rect.y * scale.y - scroll.scrollTop * scale.y + offsets.y + htmlOffset.y\n  };\n}\n\nfunction getClientRects(element) {\n  return element.getClientRects ? Array.from(element.getClientRects()) : [];\n}\n\n// Gets the entire size of the scrollable document area, even extending outside\n// of the `<html>` and `<body>` rect bounds if horizontally scrollable.\nfunction getDocumentRect(html) {\n  const scroll = getNodeScroll(html);\n  const body = html.ownerDocument.body;\n  const width = max(html.scrollWidth, html.clientWidth, body.scrollWidth, body.clientWidth);\n  const height = max(html.scrollHeight, html.clientHeight, body.scrollHeight, body.clientHeight);\n  let x = -scroll.scrollLeft + getWindowScrollBarX(html);\n  const y = -scroll.scrollTop;\n  if (getComputedStyle$1(body).direction === 'rtl') {\n    x += max(html.clientWidth, body.clientWidth) - width;\n  }\n  return {\n    width,\n    height,\n    x,\n    y\n  };\n}\n\n// Safety check: ensure the scrollbar space is reasonable in case this\n// calculation is affected by unusual styles.\n// Most scrollbars leave 15-18px of space.\nconst SCROLLBAR_MAX = 25;\nfunction getViewportRect(element, strategy, rootBoundary) {\n  if (rootBoundary === void 0) {\n    rootBoundary = 'viewport';\n  }\n  const isLayoutViewport = rootBoundary === 'layoutViewport';\n  const win = getWindow(element);\n  const html = getDocumentElement(element);\n  const visualViewport = win.visualViewport;\n  let width = html.clientWidth;\n  let height = html.clientHeight;\n  let x = 0;\n  let y = 0;\n  if (visualViewport) {\n    // Client coordinates are relative to the layout viewport, except in\n    // WebKit with an `absolute` strategy, where they are relative to the\n    // visual viewport.\n    const layoutRelativeClientCoords = !isWebKit() || strategy === 'fixed';\n    if (isLayoutViewport) {\n      if (!layoutRelativeClientCoords) {\n        x = -visualViewport.offsetLeft;\n        y = -visualViewport.offsetTop;\n      }\n    } else {\n      width = visualViewport.width;\n      height = visualViewport.height;\n      if (layoutRelativeClientCoords) {\n        x = visualViewport.offsetLeft;\n        y = visualViewport.offsetTop;\n      }\n    }\n  }\n  const windowScrollbarX = getWindowScrollBarX(html);\n  // `scrollbar-gutter: stable` on the <html> reserves gutter space that shrinks\n  // the visual width but isn't reflected in `html.clientWidth`, so subtract it.\n  // Only the inline-end (right) gutter can hold the scrollbar; `both-edges` also\n  // reserves an empty inline-start gutter that clips nothing, so exclude just\n  // the one scrollbar-side gutter — halve the measured (two-gutter) total. A\n  // left-side scrollbar (`windowScrollbarX > 0`) is already handled by\n  // `getHTMLOffset`/`visualViewport.width`; skip it here.\n  if (windowScrollbarX <= 0) {\n    const doc = html.ownerDocument;\n    const body = doc.body;\n    const bodyStyles = getComputedStyle(body);\n    const bodyMarginInline = doc.compatMode === 'CSS1Compat' ? parseFloat(bodyStyles.marginLeft) + parseFloat(bodyStyles.marginRight) || 0 : 0;\n    const reservedWidth = Math.abs(html.clientWidth - body.clientWidth - bodyMarginInline);\n    const gutter = getComputedStyle(html).scrollbarGutter === 'stable both-edges' ? reservedWidth / 2 : reservedWidth;\n    if (gutter <= SCROLLBAR_MAX) {\n      width -= gutter;\n    }\n  }\n  return {\n    width,\n    height,\n    x,\n    y\n  };\n}\n\n// Returns the inner client rect, subtracting scrollbars if present.\nfunction getInnerBoundingClientRect(element, strategy) {\n  const clientRect = getBoundingClientRect(element, true, strategy === 'fixed');\n  const top = clientRect.top + element.clientTop;\n  const left = clientRect.left + element.clientLeft;\n  const scale = getScale(element);\n  const width = element.clientWidth * scale.x;\n  const height = element.clientHeight * scale.y;\n  const x = left * scale.x;\n  const y = top * scale.y;\n  return {\n    width,\n    height,\n    x,\n    y\n  };\n}\nfunction getClientRectFromClippingAncestor(element, clippingAncestor, strategy) {\n  let rect;\n  if (clippingAncestor === 'viewport' || clippingAncestor === 'layoutViewport') {\n    rect = getViewportRect(element, strategy, clippingAncestor);\n  } else if (clippingAncestor === 'document') {\n    rect = getDocumentRect(getDocumentElement(element));\n  } else if (isElement(clippingAncestor)) {\n    rect = getInnerBoundingClientRect(clippingAncestor, strategy);\n  } else {\n    const visualOffsets = getVisualOffsets(element);\n    rect = {\n      x: clippingAncestor.x - visualOffsets.x,\n      y: clippingAncestor.y - visualOffsets.y,\n      width: clippingAncestor.width,\n      height: clippingAncestor.height\n    };\n  }\n  return rectToClientRect(rect);\n}\n\n// A \"clipping ancestor\" is an `overflow` element with the characteristic of\n// clipping (or hiding) child elements. This returns all clipping ancestors\n// of the given element up the tree.\nfunction getClippingElementAncestors(element, cache) {\n  const cachedResult = cache.get(element);\n  if (cachedResult) {\n    return cachedResult;\n  }\n  let result = getOverflowAncestors(element, [], false).filter(el => isElement(el) && getNodeName(el) !== 'body');\n  let lastKeptComputedStyle = null;\n  const elementIsFixed = getComputedStyle$1(element).position === 'fixed';\n  let currentNode = elementIsFixed ? getParentNode(element) : element;\n\n  // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n  while (isElement(currentNode) && !isLastTraversableNode(currentNode)) {\n    const computedStyle = getComputedStyle$1(currentNode);\n    const currentNodeIsContaining = isContainingBlock(currentNode);\n    // Position of the containing block chain below the current node. A fixed\n    // element whose containing block hasn't been found yet is a fixed chain.\n    const lastPosition = lastKeptComputedStyle ? lastKeptComputedStyle.position : elementIsFixed ? 'fixed' : '';\n\n    // A non-containing ancestor does not clip the element when the chain\n    // below it escapes it: a fixed chain escapes all ancestors up to the\n    // next containing block, an absolute chain escapes static ancestors.\n    const shouldDropCurrentNode = !currentNodeIsContaining && (lastPosition === 'fixed' || lastPosition === 'absolute' && computedStyle.position === 'static');\n    if (shouldDropCurrentNode) {\n      // Drop non-containing blocks.\n      result = result.filter(ancestor => ancestor !== currentNode);\n    } else {\n      // The kept node carries the chain position for the next iteration.\n      lastKeptComputedStyle = computedStyle;\n    }\n    currentNode = getParentNode(currentNode);\n  }\n  cache.set(element, result);\n  return result;\n}\n\n// Gets the maximum area that the element is visible in due to any number of\n// clipping ancestors.\nfunction getClippingRect(_ref) {\n  let {\n    element,\n    boundary,\n    rootBoundary,\n    strategy\n  } = _ref;\n  const elementClippingAncestors = boundary === 'clippingAncestors' ? isTopLayer(element) ? [] : getClippingElementAncestors(element, this._c) : [].concat(boundary);\n  const clippingAncestors = [...elementClippingAncestors, rootBoundary];\n  const firstRect = getClientRectFromClippingAncestor(element, clippingAncestors[0], strategy);\n  let top = firstRect.top;\n  let right = firstRect.right;\n  let bottom = firstRect.bottom;\n  let left = firstRect.left;\n  for (let i = 1; i < clippingAncestors.length; i++) {\n    const rect = getClientRectFromClippingAncestor(element, clippingAncestors[i], strategy);\n    top = max(rect.top, top);\n    right = min(rect.right, right);\n    bottom = min(rect.bottom, bottom);\n    left = max(rect.left, left);\n  }\n  return {\n    width: right - left,\n    height: bottom - top,\n    x: left,\n    y: top\n  };\n}\n\nfunction getDimensions(element) {\n  const {\n    width,\n    height\n  } = getCssDimensions(element);\n  return {\n    width,\n    height\n  };\n}\n\nfunction getRectRelativeToOffsetParent(element, offsetParent, strategy) {\n  const isOffsetParentAnElement = isHTMLElement(offsetParent);\n  const documentElement = getDocumentElement(offsetParent);\n  const isFixed = strategy === 'fixed';\n  const rect = getBoundingClientRect(element, true, isFixed, offsetParent);\n  let scroll = {\n    scrollLeft: 0,\n    scrollTop: 0\n  };\n  const offsets = createCoords(0);\n  if (isOffsetParentAnElement || !isFixed) {\n    if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {\n      scroll = getNodeScroll(offsetParent);\n    }\n    if (isOffsetParentAnElement) {\n      const offsetRect = getBoundingClientRect(offsetParent, true, isFixed, offsetParent);\n      offsets.x = offsetRect.x + offsetParent.clientLeft;\n      offsets.y = offsetRect.y + offsetParent.clientTop;\n    }\n  }\n\n  // If the <body> scrollbar appears on the left (e.g. RTL systems). Use\n  // Firefox with layout.scrollbar.side = 3 in about:config to test this.\n  if (!isOffsetParentAnElement && documentElement) {\n    offsets.x = getWindowScrollBarX(documentElement);\n  }\n  const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll) : createCoords(0);\n  const x = rect.left + scroll.scrollLeft - offsets.x - htmlOffset.x;\n  const y = rect.top + scroll.scrollTop - offsets.y - htmlOffset.y;\n  return {\n    x,\n    y,\n    width: rect.width,\n    height: rect.height\n  };\n}\n\nfunction isStaticPositioned(element) {\n  return getComputedStyle$1(element).position === 'static';\n}\n\nfunction getTrueOffsetParent(element, polyfill) {\n  if (!isHTMLElement(element) || getComputedStyle$1(element).position === 'fixed') {\n    return null;\n  }\n  if (polyfill) {\n    return polyfill(element);\n  }\n  let rawOffsetParent = element.offsetParent;\n\n  // Firefox returns the <html> element as the offsetParent if it's non-static,\n  // while Chrome and Safari return the <body> element. The <body> element must\n  // be used to perform the correct calculations even if the <html> element is\n  // non-static.\n  if (getDocumentElement(element) === rawOffsetParent) {\n    rawOffsetParent = rawOffsetParent.ownerDocument.body;\n  }\n  return rawOffsetParent;\n}\n\n// Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\nfunction getOffsetParent(element, polyfill) {\n  const win = getWindow(element);\n  if (isTopLayer(element)) {\n    return win;\n  }\n  if (!isHTMLElement(element)) {\n    let svgOffsetParent = getParentNode(element);\n    while (svgOffsetParent && !isLastTraversableNode(svgOffsetParent)) {\n      if (isElement(svgOffsetParent) && !isStaticPositioned(svgOffsetParent)) {\n        return svgOffsetParent;\n      }\n      svgOffsetParent = getParentNode(svgOffsetParent);\n    }\n    return win;\n  }\n  let offsetParent = getTrueOffsetParent(element, polyfill);\n  while (offsetParent && isTableElement(offsetParent) && isStaticPositioned(offsetParent)) {\n    offsetParent = getTrueOffsetParent(offsetParent, polyfill);\n  }\n  if (offsetParent && isLastTraversableNode(offsetParent) && isStaticPositioned(offsetParent) && !isContainingBlock(offsetParent)) {\n    return win;\n  }\n  return offsetParent || getContainingBlock(element) || win;\n}\n\nconst getElementRects = async function (data) {\n  const getOffsetParentFn = this.getOffsetParent || getOffsetParent;\n  const getDimensionsFn = this.getDimensions;\n  const floatingDimensions = await getDimensionsFn(data.floating);\n  return {\n    reference: getRectRelativeToOffsetParent(data.reference, await getOffsetParentFn(data.floating), data.strategy),\n    floating: {\n      x: 0,\n      y: 0,\n      width: floatingDimensions.width,\n      height: floatingDimensions.height\n    }\n  };\n};\n\nfunction isRTL(element) {\n  return getComputedStyle$1(element).direction === 'rtl';\n}\n\nconst platform = {\n  convertOffsetParentRelativeRectToViewportRelativeRect,\n  getDocumentElement,\n  getClippingRect,\n  getOffsetParent,\n  getElementRects,\n  getClientRects,\n  getDimensions,\n  getScale,\n  isElement,\n  isRTL\n};\n\nfunction rectsAreEqual(a, b) {\n  return a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height;\n}\n\n// https://samthor.au/2021/observing-dom/\nfunction observeMove(element, onMove, ancestorResize) {\n  let io = null;\n  let timeoutId;\n  const root = getDocumentElement(element);\n  function cleanup() {\n    var _io;\n    clearTimeout(timeoutId);\n    (_io = io) == null || _io.disconnect();\n    io = null;\n  }\n  function refresh(skip, threshold) {\n    if (skip === void 0) {\n      skip = false;\n    }\n    if (threshold === void 0) {\n      threshold = 1;\n    }\n    cleanup();\n    const elementRectForRootMargin = element.getBoundingClientRect();\n    const {\n      left,\n      top,\n      width,\n      height\n    } = elementRectForRootMargin;\n    if (!skip) {\n      onMove();\n    }\n    if (!width || !height) {\n      return;\n    }\n    const insetTop = floor(top);\n    const insetRight = floor(root.clientWidth - (left + width));\n    const insetBottom = floor(root.clientHeight - (top + height));\n    const insetLeft = floor(left);\n    const rootMargin = -insetTop + \"px \" + -insetRight + \"px \" + -insetBottom + \"px \" + -insetLeft + \"px\";\n    const options = {\n      rootMargin,\n      threshold: max(0, min(1, threshold)) || 1\n    };\n    let isFirstUpdate = true;\n    function handleObserve(entries) {\n      const ratio = entries[0].intersectionRatio;\n\n      // The entry is a snapshot, so the reference may have moved since the\n      // intersection was computed (under performance constraints, or between\n      // consecutive frames of a multi-frame layout shift). The reported ratio\n      // and the observed area are stale in that case and cannot be trusted to\n      // detect subsequent movement, so refresh regardless of the ratio.\n      if (!rectsAreEqual(elementRectForRootMargin, element.getBoundingClientRect())) {\n        return refresh();\n      }\n      if (ratio !== threshold) {\n        if (!isFirstUpdate) {\n          return refresh();\n        }\n        if (!ratio) {\n          // If the reference is clipped in place, the ratio is 0. Throttle\n          // the refresh to prevent an infinite loop of updates.\n          timeoutId = setTimeout(() => {\n            refresh(false, 1e-7);\n          }, 1000);\n        } else {\n          refresh(false, ratio);\n        }\n      }\n      isFirstUpdate = false;\n    }\n\n    // Older browsers don't support a `document` as the root and will throw an\n    // error.\n    try {\n      io = new IntersectionObserver(handleObserve, {\n        ...options,\n        // Handle <iframe>s\n        root: root.ownerDocument\n      });\n    } catch (_e) {\n      io = new IntersectionObserver(handleObserve, options);\n    }\n    io.observe(element);\n  }\n  const win = getWindow(element);\n  // The window is a resize ancestor, so when `ancestorResize` is enabled its\n  // listener already runs the update on resize. Here we only need to rebuild\n  // the `IntersectionObserver` for the new root size, skipping a redundant\n  // update. When `ancestorResize` is disabled, this becomes the sole update.\n  const handleResize = () => refresh(ancestorResize);\n  win.addEventListener('resize', handleResize);\n  refresh(true);\n  return () => {\n    win.removeEventListener('resize', handleResize);\n    cleanup();\n  };\n}\n\n/**\n * Automatically updates the position of the floating element when necessary.\n * Should only be called when the floating element is mounted on the DOM or\n * visible on the screen.\n * @returns cleanup function that should be invoked when the floating element is\n * removed from the DOM or hidden from the screen.\n * @see https://floating-ui.com/docs/autoUpdate\n */\nfunction autoUpdate(reference, floating, update, options) {\n  if (options === void 0) {\n    options = {};\n  }\n  const {\n    ancestorScroll = true,\n    ancestorResize = true,\n    elementResize = typeof ResizeObserver === 'function',\n    layoutShift = typeof IntersectionObserver === 'function',\n    animationFrame = false\n  } = options;\n  const referenceEl = unwrapElement(reference);\n  const ancestors = ancestorScroll || ancestorResize ? [...(referenceEl ? getOverflowAncestors(referenceEl) : []), ...(floating ? getOverflowAncestors(floating) : [])] : [];\n  ancestors.forEach(ancestor => {\n    ancestorScroll && ancestor.addEventListener('scroll', update);\n    ancestorResize && ancestor.addEventListener('resize', update);\n  });\n  const cleanupIo = referenceEl && layoutShift ? observeMove(referenceEl, update, ancestorResize) : null;\n  let reobserveFrame = -1;\n  let resizeObserver = null;\n  if (elementResize) {\n    resizeObserver = new ResizeObserver(_ref => {\n      let [firstEntry] = _ref;\n      if (firstEntry && firstEntry.target === referenceEl && resizeObserver && floating) {\n        // Prevent update loops when using the `size` middleware.\n        // https://github.com/floating-ui/floating-ui/issues/1740\n        resizeObserver.unobserve(floating);\n        cancelAnimationFrame(reobserveFrame);\n        reobserveFrame = requestAnimationFrame(() => {\n          var _resizeObserver;\n          (_resizeObserver = resizeObserver) == null || _resizeObserver.observe(floating);\n        });\n      }\n      update();\n    });\n    if (referenceEl && !animationFrame) {\n      resizeObserver.observe(referenceEl);\n    }\n    if (floating) {\n      resizeObserver.observe(floating);\n    }\n  }\n  let frameId;\n  let prevRefRect = animationFrame ? getBoundingClientRect(reference) : null;\n  if (animationFrame) {\n    frameLoop();\n  }\n  function frameLoop() {\n    const nextRefRect = getBoundingClientRect(reference);\n    if (prevRefRect && !rectsAreEqual(prevRefRect, nextRefRect)) {\n      update();\n    }\n    prevRefRect = nextRefRect;\n    frameId = requestAnimationFrame(frameLoop);\n  }\n  update();\n  return () => {\n    var _resizeObserver2;\n    ancestors.forEach(ancestor => {\n      ancestorScroll && ancestor.removeEventListener('scroll', update);\n      ancestorResize && ancestor.removeEventListener('resize', update);\n    });\n    cleanupIo == null || cleanupIo();\n    (_resizeObserver2 = resizeObserver) == null || _resizeObserver2.disconnect();\n    resizeObserver = null;\n    if (animationFrame) {\n      cancelAnimationFrame(frameId);\n    }\n  };\n}\n\n/**\n * Resolves with an object of overflow side offsets that determine how much the\n * element is overflowing a given clipping boundary on each side.\n * - positive = overflowing the boundary by that number of pixels\n * - negative = how many pixels left before it will overflow\n * - 0 = lies flush with the boundary\n * @see https://floating-ui.com/docs/detectOverflow\n */\nconst detectOverflow = detectOverflow$1;\n\n/**\n * Modifies the placement by translating the floating element along the\n * specified axes.\n * A number (shorthand for `mainAxis` or distance), or an axes configuration\n * object may be passed.\n * @see https://floating-ui.com/docs/offset\n */\nconst offset = offset$1;\n\n/**\n * Optimizes the visibility of the floating element by choosing the placement\n * that has the most space available automatically, without needing to specify a\n * preferred placement. Alternative to `flip`.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = autoPlacement$1;\n\n/**\n * Optimizes the visibility of the floating element by shifting it in order to\n * keep it in view when it will overflow the clipping boundary.\n * @see https://floating-ui.com/docs/shift\n */\nconst shift = shift$1;\n\n/**\n * Optimizes the visibility of the floating element by flipping the `placement`\n * in order to keep it in view when the preferred placement(s) will overflow the\n * clipping boundary. Alternative to `autoPlacement`.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = flip$1;\n\n/**\n * Provides data that allows you to change the size of the floating element —\n * for instance, prevent it from overflowing the clipping boundary or match the\n * width of the reference element.\n * @see https://floating-ui.com/docs/size\n */\nconst size = size$1;\n\n/**\n * Provides data to hide the floating element in applicable situations, such as\n * when it is not in the same clipping context as the reference element.\n * @see https://floating-ui.com/docs/hide\n */\nconst hide = hide$1;\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = arrow$1;\n\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = inline$1;\n\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = limitShift$1;\n\n/**\n * Computes the `x` and `y` coordinates that will place the floating element\n * next to a given reference element.\n */\nconst computePosition = (reference, floating, options) => {\n  // This caches the expensive `getClippingElementAncestors` function so that\n  // multiple lifecycle resets re-use the same result. It only lives for a\n  // single call. If other functions become expensive, we can add them as well.\n  const cache = new Map();\n  const mergedOptions = options != null ? options : {};\n  const platformWithCache = {\n    ...platform,\n    ...mergedOptions.platform,\n    _c: cache\n  };\n  return computePosition$1(reference, floating, {\n    ...mergedOptions,\n    platform: platformWithCache\n  });\n};\n\nexport { arrow, autoPlacement, autoUpdate, computePosition, detectOverflow, flip, hide, inline, limitShift, offset, platform, shift, size };\n","import { arrow as arrow$1, computePosition } from '@floating-ui/dom';\nexport { autoPlacement, autoUpdate, computePosition, detectOverflow, flip, getOverflowAncestors, hide, inline, limitShift, offset, platform, shift, size } from '@floating-ui/dom';\nimport { isNode, getNodeName } from '@floating-ui/utils/dom';\nimport { unref, computed, ref, shallowRef, watch, getCurrentScope, onScopeDispose, shallowReadonly } from 'vue-demi';\n\nfunction isComponentPublicInstance(target) {\n  return target != null && typeof target === 'object' && '$el' in target;\n}\nfunction unwrapElement(target) {\n  if (isComponentPublicInstance(target)) {\n    const element = target.$el;\n    return isNode(element) && getNodeName(element) === '#comment' ? null : element;\n  }\n  return target;\n}\n\nfunction toValue(source) {\n  return typeof source === 'function' ? source() : unref(source);\n}\n\n/**\n * Positions an inner element of the floating element such that it is centered to the reference element.\n * @param options The arrow options.\n * @see https://floating-ui.com/docs/arrow\n */\nfunction arrow(options) {\n  return {\n    name: 'arrow',\n    options,\n    fn(args) {\n      const element = unwrapElement(toValue(options.element));\n      if (element == null) {\n        return {};\n      }\n      return arrow$1({\n        element,\n        padding: options.padding\n      }).fn(args);\n    }\n  };\n}\n\nfunction getDPR(element) {\n  if (typeof window === 'undefined') {\n    return 1;\n  }\n  const win = element.ownerDocument.defaultView || window;\n  return win.devicePixelRatio || 1;\n}\n\nfunction roundByDPR(element, value) {\n  const dpr = getDPR(element);\n  return Math.round(value * dpr) / dpr;\n}\n\n/**\n * Computes the `x` and `y` coordinates that will place the floating element next to a reference element when it is given a certain CSS positioning strategy.\n * @param reference The reference template ref.\n * @param floating The floating template ref.\n * @param options The floating options.\n * @see https://floating-ui.com/docs/vue\n */\nfunction useFloating(reference, floating, options) {\n  if (options === void 0) {\n    options = {};\n  }\n  const whileElementsMountedOption = options.whileElementsMounted;\n  const openOption = computed(() => {\n    var _toValue;\n    return (_toValue = toValue(options.open)) != null ? _toValue : true;\n  });\n  const middlewareOption = computed(() => toValue(options.middleware));\n  const placementOption = computed(() => {\n    var _toValue2;\n    return (_toValue2 = toValue(options.placement)) != null ? _toValue2 : 'bottom';\n  });\n  const strategyOption = computed(() => {\n    var _toValue3;\n    return (_toValue3 = toValue(options.strategy)) != null ? _toValue3 : 'absolute';\n  });\n  const transformOption = computed(() => {\n    var _toValue4;\n    return (_toValue4 = toValue(options.transform)) != null ? _toValue4 : true;\n  });\n  const referenceElement = computed(() => unwrapElement(reference.value));\n  const floatingElement = computed(() => unwrapElement(floating.value));\n  const x = ref(0);\n  const y = ref(0);\n  const strategy = ref(strategyOption.value);\n  const placement = ref(placementOption.value);\n  const middlewareData = shallowRef({});\n  const isPositioned = ref(false);\n  const floatingStyles = computed(() => {\n    const initialStyles = {\n      position: strategy.value,\n      left: '0',\n      top: '0'\n    };\n    if (!floatingElement.value) {\n      return initialStyles;\n    }\n    const xVal = roundByDPR(floatingElement.value, x.value);\n    const yVal = roundByDPR(floatingElement.value, y.value);\n    if (transformOption.value) {\n      return {\n        ...initialStyles,\n        transform: \"translate(\" + xVal + \"px, \" + yVal + \"px)\",\n        ...(getDPR(floatingElement.value) >= 1.5 && {\n          willChange: 'transform'\n        })\n      };\n    }\n    return {\n      position: strategy.value,\n      left: xVal + \"px\",\n      top: yVal + \"px\"\n    };\n  });\n  let whileElementsMountedCleanup;\n  function update() {\n    if (referenceElement.value == null || floatingElement.value == null) {\n      return;\n    }\n    const open = openOption.value;\n    computePosition(referenceElement.value, floatingElement.value, {\n      middleware: middlewareOption.value,\n      placement: placementOption.value,\n      strategy: strategyOption.value\n    }).then(position => {\n      x.value = position.x;\n      y.value = position.y;\n      strategy.value = position.strategy;\n      placement.value = position.placement;\n      middlewareData.value = position.middlewareData;\n      /**\n       * The floating element's position may be recomputed while it's closed\n       * but still mounted (such as when transitioning out). To ensure\n       * `isPositioned` will be `false` initially on the next open, avoid\n       * setting it to `true` when `open === false` (must be specified).\n       */\n      isPositioned.value = open !== false;\n    });\n  }\n  function cleanup() {\n    if (typeof whileElementsMountedCleanup === 'function') {\n      whileElementsMountedCleanup();\n      whileElementsMountedCleanup = undefined;\n    }\n  }\n  function attach() {\n    cleanup();\n    if (whileElementsMountedOption === undefined) {\n      update();\n      return;\n    }\n    if (referenceElement.value != null && floatingElement.value != null) {\n      whileElementsMountedCleanup = whileElementsMountedOption(referenceElement.value, floatingElement.value, update);\n      return;\n    }\n  }\n  function reset() {\n    if (!openOption.value) {\n      isPositioned.value = false;\n    }\n  }\n  watch([middlewareOption, placementOption, strategyOption, openOption], update, {\n    flush: 'sync'\n  });\n  watch([referenceElement, floatingElement], attach, {\n    flush: 'sync'\n  });\n  watch(openOption, reset, {\n    flush: 'sync'\n  });\n  if (getCurrentScope()) {\n    onScopeDispose(cleanup);\n  }\n  return {\n    x: shallowReadonly(x),\n    y: shallowReadonly(y),\n    strategy: shallowReadonly(strategy),\n    placement: shallowReadonly(placement),\n    middlewareData: shallowReadonly(middlewareData),\n    isPositioned: shallowReadonly(isPositioned),\n    floatingStyles,\n    update\n  };\n}\n\nexport { arrow, useFloating };\n","/**\n * @module constants\n * @summary Useful constants\n * @description\n * Collection of useful date constants.\n *\n * The constants could be imported from `date-fns/constants`:\n *\n * ```ts\n * import { maxTime, minTime } from \"./constants/date-fns/constants\";\n *\n * function isAllowedTime(time) {\n *   return time <= maxTime && time >= minTime;\n * }\n * ```\n */\n\n/**\n * @constant\n * @name daysInWeek\n * @summary Days in 1 week.\n */\nexport const daysInWeek = 7;\n\n/**\n * @constant\n * @name daysInYear\n * @summary Days in 1 year.\n *\n * @description\n * How many days in a year.\n *\n * One years equals 365.2425 days according to the formula:\n *\n * > Leap year occurs every 4 years, except for years that are divisible by 100 and not divisible by 400.\n * > 1 mean year = (365+1/4-1/100+1/400) days = 365.2425 days\n */\nexport const daysInYear = 365.2425;\n\n/**\n * @constant\n * @name maxTime\n * @summary Maximum allowed time.\n *\n * @example\n * import { maxTime } from \"./constants/date-fns/constants\";\n *\n * const isValid = 8640000000000001 <= maxTime;\n * //=> false\n *\n * new Date(8640000000000001);\n * //=> Invalid Date\n */\nexport const maxTime = Math.pow(10, 8) * 24 * 60 * 60 * 1000;\n\n/**\n * @constant\n * @name minTime\n * @summary Minimum allowed time.\n *\n * @example\n * import { minTime } from \"./constants/date-fns/constants\";\n *\n * const isValid = -8640000000000001 >= minTime;\n * //=> false\n *\n * new Date(-8640000000000001)\n * //=> Invalid Date\n */\nexport const minTime = -maxTime;\n\n/**\n * @constant\n * @name millisecondsInWeek\n * @summary Milliseconds in 1 week.\n */\nexport const millisecondsInWeek = 604800000;\n\n/**\n * @constant\n * @name millisecondsInDay\n * @summary Milliseconds in 1 day.\n */\nexport const millisecondsInDay = 86400000;\n\n/**\n * @constant\n * @name millisecondsInMinute\n * @summary Milliseconds in 1 minute\n */\nexport const millisecondsInMinute = 60000;\n\n/**\n * @constant\n * @name millisecondsInHour\n * @summary Milliseconds in 1 hour\n */\nexport const millisecondsInHour = 3600000;\n\n/**\n * @constant\n * @name millisecondsInSecond\n * @summary Milliseconds in 1 second\n */\nexport const millisecondsInSecond = 1000;\n\n/**\n * @constant\n * @name minutesInYear\n * @summary Minutes in 1 year.\n */\nexport const minutesInYear = 525600;\n\n/**\n * @constant\n * @name minutesInMonth\n * @summary Minutes in 1 month.\n */\nexport const minutesInMonth = 43200;\n\n/**\n * @constant\n * @name minutesInDay\n * @summary Minutes in 1 day.\n */\nexport const minutesInDay = 1440;\n\n/**\n * @constant\n * @name minutesInHour\n * @summary Minutes in 1 hour.\n */\nexport const minutesInHour = 60;\n\n/**\n * @constant\n * @name monthsInQuarter\n * @summary Months in 1 quarter.\n */\nexport const monthsInQuarter = 3;\n\n/**\n * @constant\n * @name monthsInYear\n * @summary Months in 1 year.\n */\nexport const monthsInYear = 12;\n\n/**\n * @constant\n * @name quartersInYear\n * @summary Quarters in 1 year\n */\nexport const quartersInYear = 4;\n\n/**\n * @constant\n * @name secondsInHour\n * @summary Seconds in 1 hour.\n */\nexport const secondsInHour = 3600;\n\n/**\n * @constant\n * @name secondsInMinute\n * @summary Seconds in 1 minute.\n */\nexport const secondsInMinute = 60;\n\n/**\n * @constant\n * @name secondsInDay\n * @summary Seconds in 1 day.\n */\nexport const secondsInDay = secondsInHour * 24;\n\n/**\n * @constant\n * @name secondsInWeek\n * @summary Seconds in 1 week.\n */\nexport const secondsInWeek = secondsInDay * 7;\n\n/**\n * @constant\n * @name secondsInYear\n * @summary Seconds in 1 year.\n */\nexport const secondsInYear = secondsInDay * daysInYear;\n\n/**\n * @constant\n * @name secondsInMonth\n * @summary Seconds in 1 month\n */\nexport const secondsInMonth = secondsInYear / 12;\n\n/**\n * @constant\n * @name secondsInQuarter\n * @summary Seconds in 1 quarter.\n */\nexport const secondsInQuarter = secondsInMonth * 3;\n\n/**\n * @constant\n * @name constructFromSymbol\n * @summary Symbol enabling Date extensions to inherit properties from the reference date.\n *\n * The symbol is used to enable the `constructFrom` function to construct a date\n * using a reference date and a value. It allows to transfer extra properties\n * from the reference date to the new date. It's useful for extensions like\n * [`TZDate`](https://github.com/date-fns/tz) that accept a time zone as\n * a constructor argument.\n */\nexport const constructFromSymbol = Symbol.for(\"constructDateFrom\");\n","import { constructFromSymbol } from \"./constants.js\";\n\n/**\n * @name constructFrom\n * @category Generic Helpers\n * @summary Constructs a date using the reference date and the value\n *\n * @description\n * The function constructs a new date using the constructor from the reference\n * date and the given value. It helps to build generic functions that accept\n * date extensions.\n *\n * It defaults to `Date` if the passed reference date is a number or a string.\n *\n * Starting from v3.7.0, it allows to construct a date using `[Symbol.for(\"constructDateFrom\")]`\n * enabling to transfer extra properties from the reference date to the new date.\n * It's useful for extensions like [`TZDate`](https://github.com/date-fns/tz)\n * that accept a time zone as a constructor argument.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The reference date to take constructor from\n * @param value - The value to create the date\n *\n * @returns Date initialized using the given date and value\n *\n * @example\n * import { constructFrom } from \"./constructFrom/date-fns\";\n *\n * // A function that clones a date preserving the original type\n * function cloneDate<DateType extends Date>(date: DateType): DateType {\n *   return constructFrom(\n *     date, // Use constructor from the given date\n *     date.getTime() // Use the date value to create a new date\n *   );\n * }\n */\nexport function constructFrom(date, value) {\n  if (typeof date === \"function\") return date(value);\n\n  if (date && typeof date === \"object\" && constructFromSymbol in date)\n    return date[constructFromSymbol](value);\n\n  if (date instanceof Date) return new date.constructor(value);\n\n  return new Date(value);\n}\n\n// Fallback for modularized imports:\nexport default constructFrom;\n","import { constructFrom } from \"./constructFrom.js\";\n\n/**\n * @name toDate\n * @category Common Helpers\n * @summary Convert the given argument to an instance of Date.\n *\n * @description\n * Convert the given argument to an instance of Date.\n *\n * If the argument is an instance of Date, the function returns its clone.\n *\n * If the argument is a number, it is treated as a timestamp.\n *\n * If the argument is none of the above, the function returns Invalid Date.\n *\n * Starting from v3.7.0, it clones a date using `[Symbol.for(\"constructDateFrom\")]`\n * enabling to transfer extra properties from the reference date to the new date.\n * It's useful for extensions like [`TZDate`](https://github.com/date-fns/tz)\n * that accept a time zone as a constructor argument.\n *\n * **Note**: *all* Date arguments passed to any *date-fns* function is processed by `toDate`.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param argument - The value to convert\n *\n * @returns The parsed date in the local time zone\n *\n * @example\n * // Clone the date:\n * const result = toDate(new Date(2014, 1, 11, 11, 30, 30))\n * //=> Tue Feb 11 2014 11:30:30\n *\n * @example\n * // Convert the timestamp to date:\n * const result = toDate(1392098430000)\n * //=> Tue Feb 11 2014 11:30:30\n */\nexport function toDate(argument, context) {\n  // [TODO] Get rid of `toDate` or `constructFrom`?\n  return constructFrom(context || argument, argument);\n}\n\n// Fallback for modularized imports:\nexport default toDate;\n","import { constructFrom } from \"./constructFrom.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link addDays} function options.\n */\n\n/**\n * @name addDays\n * @category Day Helpers\n * @summary Add the specified number of days to the given date.\n *\n * @description\n * Add the specified number of days to the given date.\n *\n * **You don't need date-fns\\***:\n *\n * Temporal has a built-in `add` method on all its classes:\n *\n * - [`Temporal.Instant.prototype.add()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Temporal/Instant/add)\n * - [`Temporal.PlainDate.prototype.add()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Temporal/PlainDate/add)\n * - [`Temporal.PlainDateTime.prototype.add()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Temporal/PlainDateTime/add)\n * - [`Temporal.PlainTime.prototype.add()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Temporal/PlainTime/add)\n * - [`Temporal.PlainYearMonth.prototype.add()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Temporal/PlainYearMonth/add)\n * - [`Temporal.ZonedDateTime.prototype.add()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Temporal/ZonedDateTime/add)\n *\n * \\* **Not really**, see: https://date-fns.org/you-dont-need-date-fns\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param amount - The amount of days to be added.\n * @param options - An object with options\n *\n * @returns The new date with the days added\n *\n * @example\n * // Add 10 days to 1 September 2014:\n * const result = addDays(new Date(2014, 8, 1), 10)\n * //=> Thu Sep 11 2014 00:00:00\n *\n * @example\n * // Using Temporal:\n * // Add 10 days to 1 September 2014:\n * Temporal.PlainDate.from(\"2014-09-01\").add({ days: 10 }).toString();\n * //=> \"2014-09-11\"\n */\nexport function addDays(date, amount, options) {\n  const _date = toDate(date, options?.in);\n  if (isNaN(amount)) return constructFrom(options?.in || date, NaN);\n\n  // If 0 days, no-op to avoid changing times in the hour before end of DST\n  if (!amount) return _date;\n\n  _date.setDate(_date.getDate() + amount);\n  return _date;\n}\n\n// Fallback for modularized imports:\nexport default addDays;\n","import { constructFrom } from \"./constructFrom.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link addMonths} function options.\n */\n\n/**\n * @name addMonths\n * @category Month Helpers\n * @summary Add the specified number of months to the given date.\n *\n * @description\n * Add the specified number of months to the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param amount - The amount of months to be added.\n * @param options - The options object\n *\n * @returns The new date with the months added\n *\n * @example\n * // Add 5 months to 1 September 2014:\n * const result = addMonths(new Date(2014, 8, 1), 5)\n * //=> Sun Feb 01 2015 00:00:00\n *\n * // Add one month to 30 January 2023:\n * const result = addMonths(new Date(2023, 0, 30), 1)\n * //=> Tue Feb 28 2023 00:00:00\n */\nexport function addMonths(date, amount, options) {\n  const _date = toDate(date, options?.in);\n  if (isNaN(amount)) return constructFrom(options?.in || date, NaN);\n  if (!amount) {\n    // If 0 months, no-op to avoid changing times in the hour before end of DST\n    return _date;\n  }\n  const dayOfMonth = _date.getDate();\n\n  // The JS Date object supports date math by accepting out-of-bounds values for\n  // month, day, etc. For example, new Date(2020, 0, 0) returns 31 Dec 2019 and\n  // new Date(2020, 13, 1) returns 1 Feb 2021.  This is *almost* the behavior we\n  // want except that dates will wrap around the end of a month, meaning that\n  // new Date(2020, 13, 31) will return 3 Mar 2021 not 28 Feb 2021 as desired. So\n  // we'll default to the end of the desired month by adding 1 to the desired\n  // month and using a date of 0 to back up one day to the end of the desired\n  // month.\n  const endOfDesiredMonth = constructFrom(options?.in || date, _date.getTime());\n  endOfDesiredMonth.setMonth(_date.getMonth() + amount + 1, 0);\n  const daysInMonth = endOfDesiredMonth.getDate();\n  if (dayOfMonth >= daysInMonth) {\n    // If we're already at the end of the month, then this is the correct date\n    // and we're done.\n    return endOfDesiredMonth;\n  } else {\n    // Otherwise, we now know that setting the original day-of-month value won't\n    // cause an overflow, so set the desired day-of-month. Note that we can't\n    // just set the date of `endOfDesiredMonth` because that object may have had\n    // its time changed in the unusual case where where a DST transition was on\n    // the last day of the month and its local time was in the hour skipped or\n    // repeated next to a DST transition.  So we use `date` instead which is\n    // guaranteed to still have the original time.\n    _date.setFullYear(\n      endOfDesiredMonth.getFullYear(),\n      endOfDesiredMonth.getMonth(),\n      dayOfMonth,\n    );\n    return _date;\n  }\n}\n\n// Fallback for modularized imports:\nexport default addMonths;\n","import { addDays } from \"./addDays.js\";\nimport { addMonths } from \"./addMonths.js\";\nimport { constructFrom } from \"./constructFrom.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link add} function options.\n */\n\n/**\n * @name add\n * @category Common Helpers\n * @summary Add the specified years, months, weeks, days, hours, minutes, and seconds to the given date.\n *\n * @description\n * Add the specified years, months, weeks, days, hours, minutes, and seconds to the given date.\n *\n * **You don't need date-fns\\***:\n *\n * Temporal has a built-in `add` method on all its classes:\n *\n * - [`Temporal.Instant.prototype.add()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Temporal/Instant/add)\n * - [`Temporal.PlainDate.prototype.add()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Temporal/PlainDate/add)\n * - [`Temporal.PlainDateTime.prototype.add()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Temporal/PlainDateTime/add)\n * - [`Temporal.PlainTime.prototype.add()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Temporal/PlainTime/add)\n * - [`Temporal.PlainYearMonth.prototype.add()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Temporal/PlainYearMonth/add)\n * - [`Temporal.ZonedDateTime.prototype.add()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Temporal/ZonedDateTime/add)\n *\n * \\* **Not really**, see: https://date-fns.org/you-dont-need-date-fns\n *\n * @typeParam DateType - The `Date` type the function operates on. Gets inferred from passed arguments. Allows using extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param duration - The object with years, months, weeks, days, hours, minutes, and seconds to be added.\n * @param options - An object with options\n *\n * @returns The new date with the seconds added\n *\n * @example\n * // Add the following duration to 1 September 2014, 10:19:50\n * const result = add(new Date(2014, 8, 1, 10, 19, 50), {\n *   years: 2,\n *   months: 9,\n *   weeks: 1,\n *   days: 7,\n *   hours: 5,\n *   minutes: 9,\n *   seconds: 30,\n * })\n * //=> Thu Jun 15 2017 15:29:20\n *\n * @example\n * // Using Temporal:\n * // Add the following duration to 1 September 2014, 10:19:50\n * Temporal.PlainDateTime.from(\"2014-09-01T10:19:50\")\n *   .add({\n *     years: 2,\n *     months: 9,\n *     weeks: 1,\n *     days: 7,\n *     hours: 5,\n *     minutes: 9,\n *     seconds: 30,\n *   })\n *   .toString();\n * //=> \"2017-06-15T15:29:20\"\n */\nexport function add(date, duration, options) {\n  const {\n    years = 0,\n    months = 0,\n    weeks = 0,\n    days = 0,\n    hours = 0,\n    minutes = 0,\n    seconds = 0,\n  } = duration;\n\n  // Add years and months\n  const _date = toDate(date, options?.in);\n  const dateWithMonths =\n    months || years ? addMonths(_date, months + years * 12) : _date;\n\n  // Add weeks and days\n  const dateWithDays =\n    days || weeks ? addDays(dateWithMonths, days + weeks * 7) : dateWithMonths;\n\n  // Add days, hours, minutes, and seconds\n  const minutesToAdd = minutes + hours * 60;\n  const secondsToAdd = seconds + minutesToAdd * 60;\n  const msToAdd = secondsToAdd * 1000;\n\n  return constructFrom(options?.in || date, +dateWithDays + msToAdd);\n}\n\n// Fallback for modularized imports:\nexport default add;\n","let defaultOptions = {};\n\nexport function getDefaultOptions() {\n  return defaultOptions;\n}\n\nexport function setDefaultOptions(newOptions) {\n  defaultOptions = newOptions;\n}\n","import { getDefaultOptions } from \"./_lib/defaultOptions.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link startOfWeek} function options.\n */\n\n/**\n * @name startOfWeek\n * @category Week Helpers\n * @summary Return the start of a week for the given date.\n *\n * @description\n * Return the start of a week for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The start of a week\n *\n * @example\n * // The start of a week for 2 September 2014 11:55:00:\n * const result = startOfWeek(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Sun Aug 31 2014 00:00:00\n *\n * @example\n * // If the week starts on Monday, the start of the week for 2 September 2014 11:55:00:\n * const result = startOfWeek(new Date(2014, 8, 2, 11, 55, 0), { weekStartsOn: 1 })\n * //=> Mon Sep 01 2014 00:00:00\n */\nexport function startOfWeek(date, options) {\n  const defaultOptions = getDefaultOptions();\n  const weekStartsOn =\n    options?.weekStartsOn ??\n    options?.locale?.options?.weekStartsOn ??\n    defaultOptions.weekStartsOn ??\n    defaultOptions.locale?.options?.weekStartsOn ??\n    0;\n\n  const _date = toDate(date, options?.in);\n  const day = _date.getDay();\n  const diff = (day < weekStartsOn ? 7 : 0) + day - weekStartsOn;\n\n  _date.setDate(_date.getDate() - diff);\n  _date.setHours(0, 0, 0, 0);\n  return _date;\n}\n\n// Fallback for modularized imports:\nexport default startOfWeek;\n","import { startOfWeek } from \"./startOfWeek.js\";\n\n/**\n * The {@link startOfISOWeek} function options.\n */\n\n/**\n * @name startOfISOWeek\n * @category ISO Week Helpers\n * @summary Return the start of an ISO week for the given date.\n *\n * @description\n * Return the start of an ISO week for the given date.\n * The result will be in the local timezone.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The start of an ISO week\n *\n * @example\n * // The start of an ISO week for 2 September 2014 11:55:00:\n * const result = startOfISOWeek(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Mon Sep 01 2014 00:00:00\n */\nexport function startOfISOWeek(date, options) {\n  return startOfWeek(date, { ...options, weekStartsOn: 1 });\n}\n\n// Fallback for modularized imports:\nexport default startOfISOWeek;\n","import { constructFrom } from \"./constructFrom.js\";\nimport { startOfISOWeek } from \"./startOfISOWeek.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getISOWeekYear} function options.\n */\n\n/**\n * @name getISOWeekYear\n * @category ISO Week-Numbering Year Helpers\n * @summary Get the ISO week-numbering year of the given date.\n *\n * @description\n * Get the ISO week-numbering year of the given date,\n * which always starts 3 days before the year's first Thursday.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @param date - The given date\n *\n * @returns The ISO week-numbering year\n *\n * @example\n * // Which ISO-week numbering year is 2 January 2005?\n * const result = getISOWeekYear(new Date(2005, 0, 2))\n * //=> 2004\n */\nexport function getISOWeekYear(date, options) {\n  const _date = toDate(date, options?.in);\n  const year = _date.getFullYear();\n\n  const fourthOfJanuaryOfNextYear = constructFrom(_date, 0);\n  fourthOfJanuaryOfNextYear.setFullYear(year + 1, 0, 4);\n  fourthOfJanuaryOfNextYear.setHours(0, 0, 0, 0);\n  const startOfNextYear = startOfISOWeek(fourthOfJanuaryOfNextYear);\n\n  const fourthOfJanuaryOfThisYear = constructFrom(_date, 0);\n  fourthOfJanuaryOfThisYear.setFullYear(year, 0, 4);\n  fourthOfJanuaryOfThisYear.setHours(0, 0, 0, 0);\n  const startOfThisYear = startOfISOWeek(fourthOfJanuaryOfThisYear);\n\n  if (_date.getTime() >= startOfNextYear.getTime()) {\n    return year + 1;\n  } else if (_date.getTime() >= startOfThisYear.getTime()) {\n    return year;\n  } else {\n    return year - 1;\n  }\n}\n\n// Fallback for modularized imports:\nexport default getISOWeekYear;\n","import { toDate } from \"../toDate.js\";\n\n/**\n * Google Chrome as of 67.0.3396.87 introduced timezones with offset that includes seconds.\n * They usually appear for dates that denote time before the timezones were introduced\n * (e.g. for 'Europe/Prague' timezone the offset is GMT+00:57:44 before 1 October 1891\n * and GMT+01:00:00 after that date)\n *\n * Date#getTimezoneOffset returns the offset in minutes and would return 57 for the example above,\n * which would lead to incorrect calculations.\n *\n * This function returns the timezone offset in milliseconds that takes seconds in account.\n */\nexport function getTimezoneOffsetInMilliseconds(date) {\n  const _date = toDate(date);\n  const utcDate = new Date(\n    Date.UTC(\n      _date.getFullYear(),\n      _date.getMonth(),\n      _date.getDate(),\n      _date.getHours(),\n      _date.getMinutes(),\n      _date.getSeconds(),\n      _date.getMilliseconds(),\n    ),\n  );\n  utcDate.setUTCFullYear(_date.getFullYear());\n  return +date - +utcDate;\n}\n","import { constructFrom } from \"../constructFrom.js\";\n\nexport function normalizeDates(context, ...dates) {\n  const normalize = constructFrom.bind(\n    null,\n    context || dates.find((date) => typeof date === \"object\"),\n  );\n  return dates.map(normalize);\n}\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link startOfDay} function options.\n */\n\n/**\n * @name startOfDay\n * @category Day Helpers\n * @summary Return the start of a day for the given date.\n *\n * @description\n * Return the start of a day for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - The options\n *\n * @returns The start of a day\n *\n * @example\n * // The start of a day for 2 September 2014 11:55:00:\n * const result = startOfDay(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Tue Sep 02 2014 00:00:00\n */\nexport function startOfDay(date, options) {\n  const _date = toDate(date, options?.in);\n  _date.setHours(0, 0, 0, 0);\n  return _date;\n}\n\n// Fallback for modularized imports:\nexport default startOfDay;\n","import { getTimezoneOffsetInMilliseconds } from \"./_lib/getTimezoneOffsetInMilliseconds.js\";\nimport { normalizeDates } from \"./_lib/normalizeDates.js\";\nimport { millisecondsInDay } from \"./constants.js\";\nimport { startOfDay } from \"./startOfDay.js\";\n\n/**\n * The {@link differenceInCalendarDays} function options.\n */\n\n/**\n * @name differenceInCalendarDays\n * @category Day Helpers\n * @summary Get the number of calendar days between the given dates.\n *\n * @description\n * Get the number of calendar days between the given dates. This means that the times are removed\n * from the dates and then the difference in days is calculated.\n *\n * @param laterDate - The later date\n * @param earlierDate - The earlier date\n * @param options - The options object\n *\n * @returns The number of calendar days\n *\n * @example\n * // How many calendar days are between\n * // 2 July 2011 23:00:00 and 2 July 2012 00:00:00?\n * const result = differenceInCalendarDays(\n *   new Date(2012, 6, 2, 0, 0),\n *   new Date(2011, 6, 2, 23, 0)\n * )\n * //=> 366\n * // How many calendar days are between\n * // 2 July 2011 23:59:00 and 3 July 2011 00:01:00?\n * const result = differenceInCalendarDays(\n *   new Date(2011, 6, 3, 0, 1),\n *   new Date(2011, 6, 2, 23, 59)\n * )\n * //=> 1\n */\nexport function differenceInCalendarDays(laterDate, earlierDate, options) {\n  const [laterDate_, earlierDate_] = normalizeDates(\n    options?.in,\n    laterDate,\n    earlierDate,\n  );\n\n  const laterStartOfDay = startOfDay(laterDate_);\n  const earlierStartOfDay = startOfDay(earlierDate_);\n\n  const laterTimestamp =\n    +laterStartOfDay - getTimezoneOffsetInMilliseconds(laterStartOfDay);\n  const earlierTimestamp =\n    +earlierStartOfDay - getTimezoneOffsetInMilliseconds(earlierStartOfDay);\n\n  // Round the number of days to the nearest integer because the number of\n  // milliseconds in a day is not constant (e.g. it's different in the week of\n  // the daylight saving time clock shift).\n  return Math.round((laterTimestamp - earlierTimestamp) / millisecondsInDay);\n}\n\n// Fallback for modularized imports:\nexport default differenceInCalendarDays;\n","import { constructFrom } from \"./constructFrom.js\";\nimport { getISOWeekYear } from \"./getISOWeekYear.js\";\nimport { startOfISOWeek } from \"./startOfISOWeek.js\";\n\n/**\n * The {@link startOfISOWeekYear} function options.\n */\n\n/**\n * @name startOfISOWeekYear\n * @category ISO Week-Numbering Year Helpers\n * @summary Return the start of an ISO week-numbering year for the given date.\n *\n * @description\n * Return the start of an ISO week-numbering year,\n * which always starts 3 days before the year's first Thursday.\n * The result will be in the local timezone.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The start of an ISO week-numbering year\n *\n * @example\n * // The start of an ISO week-numbering year for 2 July 2005:\n * const result = startOfISOWeekYear(new Date(2005, 6, 2))\n * //=> Mon Jan 03 2005 00:00:00\n */\nexport function startOfISOWeekYear(date, options) {\n  const year = getISOWeekYear(date, options);\n  const fourthOfJanuary = constructFrom(options?.in || date, 0);\n  fourthOfJanuary.setFullYear(year, 0, 4);\n  fourthOfJanuary.setHours(0, 0, 0, 0);\n  return startOfISOWeek(fourthOfJanuary);\n}\n\n// Fallback for modularized imports:\nexport default startOfISOWeekYear;\n","import { addMonths } from \"./addMonths.js\";\n\n/**\n * The {@link addQuarters} function options.\n */\n\n/**\n * @name addQuarters\n * @category Quarter Helpers\n * @summary Add the specified number of year quarters to the given date.\n *\n * @description\n * Add the specified number of year quarters to the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param amount - The amount of quarters to be added.\n * @param options - An object with options\n *\n * @returns The new date with the quarters added\n *\n * @example\n * // Add 1 quarter to 1 September 2014:\n * const result = addQuarters(new Date(2014, 8, 1), 1)\n * //=; Mon Dec 01 2014 00:00:00\n */\nexport function addQuarters(date, amount, options) {\n  return addMonths(date, amount * 3, options);\n}\n\n// Fallback for modularized imports:\nexport default addQuarters;\n","import { addMonths } from \"./addMonths.js\";\n\n/**\n * The {@link addYears} function options.\n */\n\n/**\n * @name addYears\n * @category Year Helpers\n * @summary Add the specified number of years to the given date.\n *\n * @description\n * Add the specified number of years to the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type.\n *\n * @param date - The date to be changed\n * @param amount - The amount of years to be added.\n * @param options - The options\n *\n * @returns The new date with the years added\n *\n * @example\n * // Add 5 years to 1 September 2014:\n * const result = addYears(new Date(2014, 8, 1), 5)\n * //=> Sun Sep 01 2019 00:00:00\n */\nexport function addYears(date, amount, options) {\n  return addMonths(date, amount * 12, options);\n}\n\n// Fallback for modularized imports:\nexport default addYears;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * @name compareAsc\n * @category Common Helpers\n * @summary Compare the two dates and return -1, 0 or 1.\n *\n * @description\n * Compare the two dates and return 1 if the first date is after the second,\n * -1 if the first date is before the second or 0 if dates are equal.\n *\n * @param dateLeft - The first date to compare\n * @param dateRight - The second date to compare\n *\n * @returns The result of the comparison\n *\n * @example\n * // Compare 11 February 1987 and 10 July 1989:\n * const result = compareAsc(new Date(1987, 1, 11), new Date(1989, 6, 10))\n * //=> -1\n *\n * @example\n * // Sort the array of dates:\n * const result = [\n *   new Date(1995, 6, 2),\n *   new Date(1987, 1, 11),\n *   new Date(1989, 6, 10)\n * ].sort(compareAsc)\n * //=> [\n * //   Wed Feb 11 1987 00:00:00,\n * //   Mon Jul 10 1989 00:00:00,\n * //   Sun Jul 02 1995 00:00:00\n * // ]\n */\nexport function compareAsc(dateLeft, dateRight) {\n  const diff = +toDate(dateLeft) - +toDate(dateRight);\n\n  if (diff < 0) return -1;\n  else if (diff > 0) return 1;\n\n  // Return 0 if diff is 0; return NaN if diff is NaN\n  return diff;\n}\n\n// Fallback for modularized imports:\nexport default compareAsc;\n","/**\n * @name isDate\n * @category Common Helpers\n * @summary Is the given value a date?\n *\n * @description\n * Returns true if the given value is an instance of Date. The function works for dates transferred across iframes.\n *\n * @param value - The value to check\n *\n * @returns True if the given value is a date\n *\n * @example\n * // For a valid date:\n * const result = isDate(new Date())\n * //=> true\n *\n * @example\n * // For an invalid date:\n * const result = isDate(new Date(NaN))\n * //=> true\n *\n * @example\n * // For some value:\n * const result = isDate('2014-02-31')\n * //=> false\n *\n * @example\n * // For an object:\n * const result = isDate({})\n * //=> false\n */\nexport function isDate(value) {\n  return (\n    value instanceof Date ||\n    (typeof value === \"object\" &&\n      Object.prototype.toString.call(value) === \"[object Date]\")\n  );\n}\n\n// Fallback for modularized imports:\nexport default isDate;\n","import { isDate } from \"./isDate.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * @name isValid\n * @category Common Helpers\n * @summary Is the given date valid?\n *\n * @description\n * Returns false if argument is Invalid Date and true otherwise.\n * Argument is converted to Date using `toDate`. See [toDate](https://date-fns.org/docs/toDate)\n * Invalid Date is a Date, whose time value is NaN.\n *\n * Time value of Date: http://es5.github.io/#x15.9.1.1\n *\n * @param date - The date to check\n *\n * @returns The date is valid\n *\n * @example\n * // For the valid date:\n * const result = isValid(new Date(2014, 1, 31))\n * //=> true\n *\n * @example\n * // For the value, convertible into a date:\n * const result = isValid(1393804800000)\n * //=> true\n *\n * @example\n * // For the invalid date:\n * const result = isValid(new Date(''))\n * //=> false\n */\nexport function isValid(date) {\n  return !((!isDate(date) && typeof date !== \"number\") || isNaN(+toDate(date)));\n}\n\n// Fallback for modularized imports:\nexport default isValid;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getQuarter} function options.\n */\n\n/**\n * @name getQuarter\n * @category Quarter Helpers\n * @summary Get the year quarter of the given date.\n *\n * @description\n * Get the year quarter of the given date.\n *\n * @param date - The given date\n * @param options - An object with options\n *\n * @returns The quarter\n *\n * @example\n * // Which quarter is 2 July 2014?\n * const result = getQuarter(new Date(2014, 6, 2));\n * //=> 3\n */\nexport function getQuarter(date, options) {\n  const _date = toDate(date, options?.in);\n  const quarter = Math.trunc(_date.getMonth() / 3) + 1;\n  return quarter;\n}\n\n// Fallback for modularized imports:\nexport default getQuarter;\n","import { normalizeDates } from \"./_lib/normalizeDates.js\";\n\n/**\n * The {@link differenceInCalendarYears} function options.\n */\n\n/**\n * @name differenceInCalendarYears\n * @category Year Helpers\n * @summary Get the number of calendar years between the given dates.\n *\n * @description\n * Get the number of calendar years between the given dates.\n *\n * @param laterDate - The later date\n * @param earlierDate - The earlier date\n * @param options - An object with options\n\n * @returns The number of calendar years\n *\n * @example\n * // How many calendar years are between 31 December 2013 and 11 February 2015?\n * const result = differenceInCalendarYears(\n *   new Date(2015, 1, 11),\n *   new Date(2013, 11, 31)\n * );\n * //=> 2\n */\nexport function differenceInCalendarYears(laterDate, earlierDate, options) {\n  const [laterDate_, earlierDate_] = normalizeDates(\n    options?.in,\n    laterDate,\n    earlierDate,\n  );\n  return laterDate_.getFullYear() - earlierDate_.getFullYear();\n}\n\n// Fallback for modularized imports:\nexport default differenceInCalendarYears;\n","export function getRoundingMethod(method) {\n  return (number) => {\n    const round = method ? Math[method] : Math.trunc;\n    const result = round(number);\n    // Prevent negative zero\n    return result === 0 ? 0 : result;\n  };\n}\n","import { normalizeDates } from \"./_lib/normalizeDates.js\";\nimport { compareAsc } from \"./compareAsc.js\";\nimport { differenceInCalendarYears } from \"./differenceInCalendarYears.js\";\n\n/**\n * The {@link differenceInYears} function options.\n */\n\n/**\n * @name differenceInYears\n * @category Year Helpers\n * @summary Get the number of full years between the given dates.\n *\n * @description\n * Get the number of full years between the given dates.\n *\n * @param laterDate - The later date\n * @param earlierDate - The earlier date\n * @param options - An object with options\n *\n * @returns The number of full years\n *\n * @example\n * // How many full years are between 31 December 2013 and 11 February 2015?\n * const result = differenceInYears(new Date(2015, 1, 11), new Date(2013, 11, 31))\n * //=> 1\n */\nexport function differenceInYears(laterDate, earlierDate, options) {\n  const [laterDate_, earlierDate_] = normalizeDates(\n    options?.in,\n    laterDate,\n    earlierDate,\n  );\n\n  // -1 if the left date is earlier than the right date\n  // 2023-12-31 - 2024-01-01 = -1\n  const sign = compareAsc(laterDate_, earlierDate_);\n\n  // First calculate the difference in calendar years\n  // 2024-01-01 - 2023-12-31 = 1 year\n  const diff = Math.abs(differenceInCalendarYears(laterDate_, earlierDate_));\n\n  // Now we need to calculate if the difference is full. To do that we set\n  // both dates to the same year and check if the both date's month and day\n  // form a full year.\n  laterDate_.setFullYear(1584);\n  earlierDate_.setFullYear(1584);\n\n  // For it to be true, when the later date is indeed later than the earlier date\n  // (2026-02-01 - 2023-12-10 = 3 years), the difference is full if\n  // the normalized later date is also later than the normalized earlier date.\n  // In our example, 1584-02-01 is earlier than 1584-12-10, so the difference\n  // is partial, hence we need to subtract 1 from the difference 3 - 1 = 2.\n  const partial = compareAsc(laterDate_, earlierDate_) === -sign;\n\n  const result = sign * (diff - +partial);\n\n  // Prevent negative zero\n  return result === 0 ? 0 : result;\n}\n\n// Fallback for modularized imports:\nexport default differenceInYears;\n","import { normalizeDates } from \"./normalizeDates.js\";\n\nexport function normalizeInterval(context, interval) {\n  const [start, end] = normalizeDates(context, interval.start, interval.end);\n  return { start, end };\n}\n","import { normalizeInterval } from \"./_lib/normalizeInterval.js\";\nimport { constructFrom } from \"./constructFrom.js\";\n\n/**\n * The {@link eachDayOfInterval} function options.\n */\n\n/**\n * The {@link eachDayOfInterval} function result type. It resolves the proper data type.\n * It uses the first argument date object type, starting from the date argument,\n * then the start interval date, and finally the end interval date. If\n * a context function is passed, it uses the context function return type.\n */\n\n/**\n * @name eachDayOfInterval\n * @category Interval Helpers\n * @summary Return the array of dates within the specified time interval.\n *\n * @description\n * Return the array of dates within the specified time interval.\n *\n * @typeParam IntervalType - Interval type.\n * @typeParam Options - Options type.\n *\n * @param interval - The interval.\n * @param options - An object with options.\n *\n * @returns The array with starts of days from the day of the interval start to the day of the interval end\n *\n * @example\n * // Each day between 6 October 2014 and 10 October 2014:\n * const result = eachDayOfInterval({\n *   start: new Date(2014, 9, 6),\n *   end: new Date(2014, 9, 10)\n * })\n * //=> [\n * //   Mon Oct 06 2014 00:00:00,\n * //   Tue Oct 07 2014 00:00:00,\n * //   Wed Oct 08 2014 00:00:00,\n * //   Thu Oct 09 2014 00:00:00,\n * //   Fri Oct 10 2014 00:00:00\n * // ]\n */\nexport function eachDayOfInterval(interval, options) {\n  const { start, end } = normalizeInterval(options?.in, interval);\n\n  let reversed = +start > +end;\n  const endTime = reversed ? +start : +end;\n  const date = reversed ? end : start;\n  date.setHours(0, 0, 0, 0);\n\n  let step = options?.step ?? 1;\n  if (!step) return [];\n  if (step < 0) {\n    step = -step;\n    reversed = !reversed;\n  }\n\n  const dates = [];\n\n  while (+date <= endTime) {\n    dates.push(constructFrom(start, date));\n    date.setDate(date.getDate() + step);\n    date.setHours(0, 0, 0, 0);\n  }\n\n  return reversed ? dates.reverse() : dates;\n}\n\n// Fallback for modularized imports:\nexport default eachDayOfInterval;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link startOfQuarter} function options.\n */\n\n/**\n * @name startOfQuarter\n * @category Quarter Helpers\n * @summary Return the start of a year quarter for the given date.\n *\n * @description\n * Return the start of a year quarter for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - The options\n *\n * @returns The start of a quarter\n *\n * @example\n * // The start of a quarter for 2 September 2014 11:55:00:\n * const result = startOfQuarter(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Tue Jul 01 2014 00:00:00\n */\nexport function startOfQuarter(date, options) {\n  const _date = toDate(date, options?.in);\n  const currentMonth = _date.getMonth();\n  const month = currentMonth - (currentMonth % 3);\n  _date.setMonth(month, 1);\n  _date.setHours(0, 0, 0, 0);\n  return _date;\n}\n\n// Fallback for modularized imports:\nexport default startOfQuarter;\n","import { normalizeInterval } from \"./_lib/normalizeInterval.js\";\nimport { addQuarters } from \"./addQuarters.js\";\nimport { constructFrom } from \"./constructFrom.js\";\nimport { startOfQuarter } from \"./startOfQuarter.js\";\n\n/**\n * The {@link eachQuarterOfInterval} function options.\n */\n\n/**\n * The {@link eachQuarterOfInterval} function result type. It resolves the proper data type.\n * It uses the first argument date object type, starting from the date argument,\n * then the start interval date, and finally the end interval date. If\n * a context function is passed, it uses the context function return type.\n */\n\n/**\n * @name eachQuarterOfInterval\n * @category Interval Helpers\n * @summary Return the array of quarters within the specified time interval.\n *\n * @description\n * Return the array of quarters within the specified time interval.\n *\n * @typeParam IntervalType - Interval type.\n * @typeParam Options - Options type.\n *\n * @param interval - The interval\n * @param options - An object with options\n *\n * @returns The array with starts of quarters from the quarter of the interval start to the quarter of the interval end\n *\n * @example\n * // Each quarter within interval 6 February 2014 - 10 August 2014:\n * const result = eachQuarterOfInterval({\n *   start: new Date(2014, 1, 6),\n *   end: new Date(2014, 7, 10),\n * })\n * //=> [\n * //   Wed Jan 01 2014 00:00:00,\n * //   Tue Apr 01 2014 00:00:00,\n * //   Tue Jul 01 2014 00:00:00,\n * // ]\n */\nexport function eachQuarterOfInterval(interval, options) {\n  const { start, end } = normalizeInterval(options?.in, interval);\n\n  let reversed = +start > +end;\n  const endTime = reversed ? +startOfQuarter(start) : +startOfQuarter(end);\n  let date = reversed ? startOfQuarter(end) : startOfQuarter(start);\n\n  let step = options?.step ?? 1;\n  if (!step) return [];\n  if (step < 0) {\n    step = -step;\n    reversed = !reversed;\n  }\n\n  const dates = [];\n\n  while (+date <= endTime) {\n    dates.push(constructFrom(start, date));\n    date = addQuarters(date, step);\n  }\n\n  return reversed ? dates.reverse() : dates;\n}\n\n// Fallback for modularized imports:\nexport default eachQuarterOfInterval;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link startOfMonth} function options.\n */\n\n/**\n * @name startOfMonth\n * @category Month Helpers\n * @summary Return the start of a month for the given date.\n *\n * @description\n * Return the start of a month for the given date. The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments.\n * Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed,\n * or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The start of a month\n *\n * @example\n * // The start of a month for 2 September 2014 11:55:00:\n * const result = startOfMonth(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Mon Sep 01 2014 00:00:00\n */\nexport function startOfMonth(date, options) {\n  const _date = toDate(date, options?.in);\n  _date.setDate(1);\n  _date.setHours(0, 0, 0, 0);\n  return _date;\n}\n\n// Fallback for modularized imports:\nexport default startOfMonth;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link endOfYear} function options.\n */\n\n/**\n * @name endOfYear\n * @category Year Helpers\n * @summary Return the end of a year for the given date.\n *\n * @description\n * Return the end of a year for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - The options\n *\n * @returns The end of a year\n *\n * @example\n * // The end of a year for 2 September 2014 11:55:00:\n * const result = endOfYear(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Wed Dec 31 2014 23:59:59.999\n */\nexport function endOfYear(date, options) {\n  const _date = toDate(date, options?.in);\n  const year = _date.getFullYear();\n  _date.setFullYear(year + 1, 0, 0);\n  _date.setHours(23, 59, 59, 999);\n  return _date;\n}\n\n// Fallback for modularized imports:\nexport default endOfYear;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link startOfYear} function options.\n */\n\n/**\n * @name startOfYear\n * @category Year Helpers\n * @summary Return the start of a year for the given date.\n *\n * @description\n * Return the start of a year for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - The options\n *\n * @returns The start of a year\n *\n * @example\n * // The start of a year for 2 September 2014 11:55:00:\n * const result = startOfYear(new Date(2014, 8, 2, 11, 55, 00))\n * //=> Wed Jan 01 2014 00:00:00\n */\nexport function startOfYear(date, options) {\n  const date_ = toDate(date, options?.in);\n  date_.setFullYear(date_.getFullYear(), 0, 1);\n  date_.setHours(0, 0, 0, 0);\n  return date_;\n}\n\n// Fallback for modularized imports:\nexport default startOfYear;\n","import { getDefaultOptions } from \"./_lib/defaultOptions.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link endOfWeek} function options.\n */\n\n/**\n * @name endOfWeek\n * @category Week Helpers\n * @summary Return the end of a week for the given date.\n *\n * @description\n * Return the end of a week for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The end of a week\n *\n * @example\n * // The end of a week for 2 September 2014 11:55:00:\n * const result = endOfWeek(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Sat Sep 06 2014 23:59:59.999\n *\n * @example\n * // If the week starts on Monday, the end of the week for 2 September 2014 11:55:00:\n * const result = endOfWeek(new Date(2014, 8, 2, 11, 55, 0), { weekStartsOn: 1 })\n * //=> Sun Sep 07 2014 23:59:59.999\n */\nexport function endOfWeek(date, options) {\n  const defaultOptions = getDefaultOptions();\n  const weekStartsOn =\n    options?.weekStartsOn ??\n    options?.locale?.options?.weekStartsOn ??\n    defaultOptions.weekStartsOn ??\n    defaultOptions.locale?.options?.weekStartsOn ??\n    0;\n\n  const _date = toDate(date, options?.in);\n  const day = _date.getDay();\n  const diff = (day < weekStartsOn ? -7 : 0) + 6 - (day - weekStartsOn);\n\n  _date.setDate(_date.getDate() + diff);\n  _date.setHours(23, 59, 59, 999);\n  return _date;\n}\n\n// Fallback for modularized imports:\nexport default endOfWeek;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link endOfQuarter} function options.\n */\n\n/**\n * @name endOfQuarter\n * @category Quarter Helpers\n * @summary Return the end of a year quarter for the given date.\n *\n * @description\n * Return the end of a year quarter for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The end of a quarter\n *\n * @example\n * // The end of a quarter for 2 September 2014 11:55:00:\n * const result = endOfQuarter(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Tue Sep 30 2014 23:59:59.999\n */\nexport function endOfQuarter(date, options) {\n  const _date = toDate(date, options?.in);\n  const currentMonth = _date.getMonth();\n  const month = currentMonth - (currentMonth % 3) + 3;\n  _date.setMonth(month, 0);\n  _date.setHours(23, 59, 59, 999);\n  return _date;\n}\n\n// Fallback for modularized imports:\nexport default endOfQuarter;\n","const formatDistanceLocale = {\n  lessThanXSeconds: {\n    one: \"less than a second\",\n    other: \"less than {{count}} seconds\",\n  },\n\n  xSeconds: {\n    one: \"1 second\",\n    other: \"{{count}} seconds\",\n  },\n\n  halfAMinute: \"half a minute\",\n\n  lessThanXMinutes: {\n    one: \"less than a minute\",\n    other: \"less than {{count}} minutes\",\n  },\n\n  xMinutes: {\n    one: \"1 minute\",\n    other: \"{{count}} minutes\",\n  },\n\n  aboutXHours: {\n    one: \"about 1 hour\",\n    other: \"about {{count}} hours\",\n  },\n\n  xHours: {\n    one: \"1 hour\",\n    other: \"{{count}} hours\",\n  },\n\n  xDays: {\n    one: \"1 day\",\n    other: \"{{count}} days\",\n  },\n\n  aboutXWeeks: {\n    one: \"about 1 week\",\n    other: \"about {{count}} weeks\",\n  },\n\n  xWeeks: {\n    one: \"1 week\",\n    other: \"{{count}} weeks\",\n  },\n\n  aboutXMonths: {\n    one: \"about 1 month\",\n    other: \"about {{count}} months\",\n  },\n\n  xMonths: {\n    one: \"1 month\",\n    other: \"{{count}} months\",\n  },\n\n  aboutXYears: {\n    one: \"about 1 year\",\n    other: \"about {{count}} years\",\n  },\n\n  xYears: {\n    one: \"1 year\",\n    other: \"{{count}} years\",\n  },\n\n  overXYears: {\n    one: \"over 1 year\",\n    other: \"over {{count}} years\",\n  },\n\n  almostXYears: {\n    one: \"almost 1 year\",\n    other: \"almost {{count}} years\",\n  },\n};\n\nexport const formatDistance = (token, count, options) => {\n  let result;\n\n  const tokenValue = formatDistanceLocale[token];\n  if (typeof tokenValue === \"string\") {\n    result = tokenValue;\n  } else if (count === 1) {\n    result = tokenValue.one;\n  } else {\n    result = tokenValue.other.replace(\"{{count}}\", count.toString());\n  }\n\n  if (options?.addSuffix) {\n    if (options.comparison && options.comparison > 0) {\n      return \"in \" + result;\n    } else {\n      return result + \" ago\";\n    }\n  }\n\n  return result;\n};\n","export function buildFormatLongFn(args) {\n  return (options = {}) => {\n    // TODO: Remove String()\n    const width = options.width ? String(options.width) : args.defaultWidth;\n    const format = args.formats[width] || args.formats[args.defaultWidth];\n    return format;\n  };\n}\n","import { buildFormatLongFn } from \"../../_lib/buildFormatLongFn.js\";\n\nconst dateFormats = {\n  full: \"EEEE, MMMM do, y\",\n  long: \"MMMM do, y\",\n  medium: \"MMM d, y\",\n  short: \"MM/dd/yyyy\",\n};\n\nconst timeFormats = {\n  full: \"h:mm:ss a zzzz\",\n  long: \"h:mm:ss a z\",\n  medium: \"h:mm:ss a\",\n  short: \"h:mm a\",\n};\n\nconst dateTimeFormats = {\n  full: \"{{date}} 'at' {{time}}\",\n  long: \"{{date}} 'at' {{time}}\",\n  medium: \"{{date}}, {{time}}\",\n  short: \"{{date}}, {{time}}\",\n};\n\nexport const formatLong = {\n  date: buildFormatLongFn({\n    formats: dateFormats,\n    defaultWidth: \"full\",\n  }),\n\n  time: buildFormatLongFn({\n    formats: timeFormats,\n    defaultWidth: \"full\",\n  }),\n\n  dateTime: buildFormatLongFn({\n    formats: dateTimeFormats,\n    defaultWidth: \"full\",\n  }),\n};\n","const formatRelativeLocale = {\n  lastWeek: \"'last' eeee 'at' p\",\n  yesterday: \"'yesterday at' p\",\n  today: \"'today at' p\",\n  tomorrow: \"'tomorrow at' p\",\n  nextWeek: \"eeee 'at' p\",\n  other: \"P\",\n};\n\nexport const formatRelative = (token, _date, _baseDate, _options) =>\n  formatRelativeLocale[token];\n","/**\n * The localize function argument callback which allows to convert raw value to\n * the actual type.\n *\n * @param value - The value to convert\n *\n * @returns The converted value\n */\n\n/**\n * The map of localized values for each width.\n */\n\n/**\n * The index type of the locale unit value. It types conversion of units of\n * values that don't start at 0 (i.e. quarters).\n */\n\n/**\n * Converts the unit value to the tuple of values.\n */\n\n/**\n * The tuple of localized era values. The first element represents BC,\n * the second element represents AD.\n */\n\n/**\n * The tuple of localized quarter values. The first element represents Q1.\n */\n\n/**\n * The tuple of localized day values. The first element represents Sunday.\n */\n\n/**\n * The tuple of localized month values. The first element represents January.\n */\n\nexport function buildLocalizeFn(args) {\n  return (value, options) => {\n    const context = options?.context ? String(options.context) : \"standalone\";\n\n    let valuesArray;\n    if (context === \"formatting\" && args.formattingValues) {\n      const defaultWidth = args.defaultFormattingWidth || args.defaultWidth;\n      const width = options?.width ? String(options.width) : defaultWidth;\n\n      valuesArray =\n        args.formattingValues[width] || args.formattingValues[defaultWidth];\n    } else {\n      const defaultWidth = args.defaultWidth;\n      const width = options?.width ? String(options.width) : args.defaultWidth;\n\n      valuesArray = args.values[width] || args.values[defaultWidth];\n    }\n    const index = args.argumentCallback ? args.argumentCallback(value) : value;\n\n    // @ts-expect-error - For some reason TypeScript just don't want to match it, no matter how hard we try. I challenge you to try to remove it!\n    return valuesArray[index];\n  };\n}\n","import { buildLocalizeFn } from \"../../_lib/buildLocalizeFn.js\";\n\nconst eraValues = {\n  narrow: [\"B\", \"A\"],\n  abbreviated: [\"BC\", \"AD\"],\n  wide: [\"Before Christ\", \"Anno Domini\"],\n};\n\nconst quarterValues = {\n  narrow: [\"1\", \"2\", \"3\", \"4\"],\n  abbreviated: [\"Q1\", \"Q2\", \"Q3\", \"Q4\"],\n  wide: [\"1st quarter\", \"2nd quarter\", \"3rd quarter\", \"4th quarter\"],\n};\n\n// Note: in English, the names of days of the week and months are capitalized.\n// If you are making a new locale based on this one, check if the same is true for the language you're working on.\n// Generally, formatted dates should look like they are in the middle of a sentence,\n// e.g. in Spanish language the weekdays and months should be in the lowercase.\nconst monthValues = {\n  narrow: [\"J\", \"F\", \"M\", \"A\", \"M\", \"J\", \"J\", \"A\", \"S\", \"O\", \"N\", \"D\"],\n  abbreviated: [\n    \"Jan\",\n    \"Feb\",\n    \"Mar\",\n    \"Apr\",\n    \"May\",\n    \"Jun\",\n    \"Jul\",\n    \"Aug\",\n    \"Sep\",\n    \"Oct\",\n    \"Nov\",\n    \"Dec\",\n  ],\n\n  wide: [\n    \"January\",\n    \"February\",\n    \"March\",\n    \"April\",\n    \"May\",\n    \"June\",\n    \"July\",\n    \"August\",\n    \"September\",\n    \"October\",\n    \"November\",\n    \"December\",\n  ],\n};\n\nconst dayValues = {\n  narrow: [\"S\", \"M\", \"T\", \"W\", \"T\", \"F\", \"S\"],\n  short: [\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\"],\n  abbreviated: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n  wide: [\n    \"Sunday\",\n    \"Monday\",\n    \"Tuesday\",\n    \"Wednesday\",\n    \"Thursday\",\n    \"Friday\",\n    \"Saturday\",\n  ],\n};\n\nconst dayPeriodValues = {\n  narrow: {\n    am: \"a\",\n    pm: \"p\",\n    midnight: \"mi\",\n    noon: \"n\",\n    morning: \"morning\",\n    afternoon: \"afternoon\",\n    evening: \"evening\",\n    night: \"night\",\n  },\n  abbreviated: {\n    am: \"AM\",\n    pm: \"PM\",\n    midnight: \"midnight\",\n    noon: \"noon\",\n    morning: \"morning\",\n    afternoon: \"afternoon\",\n    evening: \"evening\",\n    night: \"night\",\n  },\n  wide: {\n    am: \"a.m.\",\n    pm: \"p.m.\",\n    midnight: \"midnight\",\n    noon: \"noon\",\n    morning: \"morning\",\n    afternoon: \"afternoon\",\n    evening: \"evening\",\n    night: \"night\",\n  },\n};\n\nconst formattingDayPeriodValues = {\n  narrow: {\n    am: \"a\",\n    pm: \"p\",\n    midnight: \"mi\",\n    noon: \"n\",\n    morning: \"in the morning\",\n    afternoon: \"in the afternoon\",\n    evening: \"in the evening\",\n    night: \"at night\",\n  },\n  abbreviated: {\n    am: \"AM\",\n    pm: \"PM\",\n    midnight: \"midnight\",\n    noon: \"noon\",\n    morning: \"in the morning\",\n    afternoon: \"in the afternoon\",\n    evening: \"in the evening\",\n    night: \"at night\",\n  },\n  wide: {\n    am: \"a.m.\",\n    pm: \"p.m.\",\n    midnight: \"midnight\",\n    noon: \"noon\",\n    morning: \"in the morning\",\n    afternoon: \"in the afternoon\",\n    evening: \"in the evening\",\n    night: \"at night\",\n  },\n};\n\nconst ordinalNumber = (dirtyNumber, _options) => {\n  const number = Number(dirtyNumber);\n\n  // If ordinal numbers depend on context, for example,\n  // if they are different for different grammatical genders,\n  // use `options.unit`.\n  //\n  // `unit` can be 'year', 'quarter', 'month', 'week', 'date', 'dayOfYear',\n  // 'day', 'hour', 'minute', 'second'.\n\n  const rem100 = number % 100;\n  if (rem100 > 20 || rem100 < 10) {\n    switch (rem100 % 10) {\n      case 1:\n        return number + \"st\";\n      case 2:\n        return number + \"nd\";\n      case 3:\n        return number + \"rd\";\n    }\n  }\n  return number + \"th\";\n};\n\nexport const localize = {\n  ordinalNumber,\n\n  era: buildLocalizeFn({\n    values: eraValues,\n    defaultWidth: \"wide\",\n  }),\n\n  quarter: buildLocalizeFn({\n    values: quarterValues,\n    defaultWidth: \"wide\",\n    argumentCallback: (quarter) => quarter - 1,\n  }),\n\n  month: buildLocalizeFn({\n    values: monthValues,\n    defaultWidth: \"wide\",\n  }),\n\n  day: buildLocalizeFn({\n    values: dayValues,\n    defaultWidth: \"wide\",\n  }),\n\n  dayPeriod: buildLocalizeFn({\n    values: dayPeriodValues,\n    defaultWidth: \"wide\",\n    formattingValues: formattingDayPeriodValues,\n    defaultFormattingWidth: \"wide\",\n  }),\n};\n","export function buildMatchFn(args) {\n  return (string, options = {}) => {\n    const width = options.width;\n\n    const matchPattern =\n      (width && args.matchPatterns[width]) ||\n      args.matchPatterns[args.defaultMatchWidth];\n    const matchResult = string.match(matchPattern);\n\n    if (!matchResult) {\n      return null;\n    }\n    const matchedString = matchResult[0];\n\n    const parsePatterns =\n      (width && args.parsePatterns[width]) ||\n      args.parsePatterns[args.defaultParseWidth];\n\n    const key = Array.isArray(parsePatterns)\n      ? findIndex(parsePatterns, (pattern) => pattern.test(matchedString))\n      : // [TODO] -- I challenge you to fix the type\n        findKey(parsePatterns, (pattern) => pattern.test(matchedString));\n\n    let value;\n\n    value = args.valueCallback ? args.valueCallback(key) : key;\n    value = options.valueCallback\n      ? // [TODO] -- I challenge you to fix the type\n        options.valueCallback(value)\n      : value;\n\n    const rest = string.slice(matchedString.length);\n\n    return { value, rest };\n  };\n}\n\nfunction findKey(object, predicate) {\n  for (const key in object) {\n    if (\n      Object.prototype.hasOwnProperty.call(object, key) &&\n      predicate(object[key])\n    ) {\n      return key;\n    }\n  }\n  return undefined;\n}\n\nfunction findIndex(array, predicate) {\n  for (let key = 0; key < array.length; key++) {\n    if (predicate(array[key])) {\n      return key;\n    }\n  }\n  return undefined;\n}\n","export function buildMatchPatternFn(args) {\n  return (string, options = {}) => {\n    const matchResult = string.match(args.matchPattern);\n    if (!matchResult) return null;\n    const matchedString = matchResult[0];\n\n    const parseResult = string.match(args.parsePattern);\n    if (!parseResult) return null;\n    let value = args.valueCallback\n      ? args.valueCallback(parseResult[0])\n      : parseResult[0];\n\n    // [TODO] I challenge you to fix the type\n    value = options.valueCallback ? options.valueCallback(value) : value;\n\n    const rest = string.slice(matchedString.length);\n\n    return { value, rest };\n  };\n}\n","import { buildMatchFn } from \"../../_lib/buildMatchFn.js\";\nimport { buildMatchPatternFn } from \"../../_lib/buildMatchPatternFn.js\";\n\nconst matchOrdinalNumberPattern = /^(\\d+)(th|st|nd|rd)?/i;\nconst parseOrdinalNumberPattern = /\\d+/i;\n\nconst matchEraPatterns = {\n  narrow: /^(b|a)/i,\n  abbreviated: /^(b\\.?\\s?c\\.?|b\\.?\\s?c\\.?\\s?e\\.?|a\\.?\\s?d\\.?|c\\.?\\s?e\\.?)/i,\n  wide: /^(before christ|before common era|anno domini|common era)/i,\n};\nconst parseEraPatterns = {\n  any: [/^b/i, /^(a|c)/i],\n};\n\nconst matchQuarterPatterns = {\n  narrow: /^[1234]/i,\n  abbreviated: /^q[1234]/i,\n  wide: /^[1234](th|st|nd|rd)? quarter/i,\n};\nconst parseQuarterPatterns = {\n  any: [/1/i, /2/i, /3/i, /4/i],\n};\n\nconst matchMonthPatterns = {\n  narrow: /^[jfmasond]/i,\n  abbreviated: /^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,\n  wide: /^(january|february|march|april|may|june|july|august|september|october|november|december)/i,\n};\nconst parseMonthPatterns = {\n  narrow: [\n    /^j/i,\n    /^f/i,\n    /^m/i,\n    /^a/i,\n    /^m/i,\n    /^j/i,\n    /^j/i,\n    /^a/i,\n    /^s/i,\n    /^o/i,\n    /^n/i,\n    /^d/i,\n  ],\n\n  any: [\n    /^ja/i,\n    /^f/i,\n    /^mar/i,\n    /^ap/i,\n    /^may/i,\n    /^jun/i,\n    /^jul/i,\n    /^au/i,\n    /^s/i,\n    /^o/i,\n    /^n/i,\n    /^d/i,\n  ],\n};\n\nconst matchDayPatterns = {\n  narrow: /^[smtwf]/i,\n  short: /^(su|mo|tu|we|th|fr|sa)/i,\n  abbreviated: /^(sun|mon|tue|wed|thu|fri|sat)/i,\n  wide: /^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i,\n};\nconst parseDayPatterns = {\n  narrow: [/^s/i, /^m/i, /^t/i, /^w/i, /^t/i, /^f/i, /^s/i],\n  any: [/^su/i, /^m/i, /^tu/i, /^w/i, /^th/i, /^f/i, /^sa/i],\n};\n\nconst matchDayPeriodPatterns = {\n  narrow: /^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,\n  any: /^([ap]\\.?\\s?m\\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i,\n};\nconst parseDayPeriodPatterns = {\n  any: {\n    am: /^a/i,\n    pm: /^p/i,\n    midnight: /^mi/i,\n    noon: /^no/i,\n    morning: /morning/i,\n    afternoon: /afternoon/i,\n    evening: /evening/i,\n    night: /night/i,\n  },\n};\n\nexport const match = {\n  ordinalNumber: buildMatchPatternFn({\n    matchPattern: matchOrdinalNumberPattern,\n    parsePattern: parseOrdinalNumberPattern,\n    valueCallback: (value) => parseInt(value, 10),\n  }),\n\n  era: buildMatchFn({\n    matchPatterns: matchEraPatterns,\n    defaultMatchWidth: \"wide\",\n    parsePatterns: parseEraPatterns,\n    defaultParseWidth: \"any\",\n  }),\n\n  quarter: buildMatchFn({\n    matchPatterns: matchQuarterPatterns,\n    defaultMatchWidth: \"wide\",\n    parsePatterns: parseQuarterPatterns,\n    defaultParseWidth: \"any\",\n    valueCallback: (index) => index + 1,\n  }),\n\n  month: buildMatchFn({\n    matchPatterns: matchMonthPatterns,\n    defaultMatchWidth: \"wide\",\n    parsePatterns: parseMonthPatterns,\n    defaultParseWidth: \"any\",\n  }),\n\n  day: buildMatchFn({\n    matchPatterns: matchDayPatterns,\n    defaultMatchWidth: \"wide\",\n    parsePatterns: parseDayPatterns,\n    defaultParseWidth: \"any\",\n  }),\n\n  dayPeriod: buildMatchFn({\n    matchPatterns: matchDayPeriodPatterns,\n    defaultMatchWidth: \"any\",\n    parsePatterns: parseDayPeriodPatterns,\n    defaultParseWidth: \"any\",\n  }),\n};\n","import { formatDistance } from \"./en-US/_lib/formatDistance.js\";\nimport { formatLong } from \"./en-US/_lib/formatLong.js\";\nimport { formatRelative } from \"./en-US/_lib/formatRelative.js\";\nimport { localize } from \"./en-US/_lib/localize.js\";\nimport { match } from \"./en-US/_lib/match.js\";\n\n/**\n * @category Locales\n * @summary English locale (United States).\n * @language English\n * @iso-639-2 eng\n * @author Sasha Koss [@kossnocorp](https://github.com/kossnocorp)\n * @author Lesha Koss [@leshakoss](https://github.com/leshakoss)\n */\nexport const enUS = {\n  code: \"en-US\",\n  formatDistance: formatDistance,\n  formatLong: formatLong,\n  formatRelative: formatRelative,\n  localize: localize,\n  match: match,\n  options: {\n    weekStartsOn: 0 /* Sunday */,\n    firstWeekContainsDate: 1,\n  },\n};\n\n// Fallback for modularized imports:\nexport default enUS;\n","import { differenceInCalendarDays } from \"./differenceInCalendarDays.js\";\nimport { startOfYear } from \"./startOfYear.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getDayOfYear} function options.\n */\n\n/**\n * @name getDayOfYear\n * @category Day Helpers\n * @summary Get the day of the year of the given date.\n *\n * @description\n * Get the day of the year of the given date.\n *\n * @param date - The given date\n * @param options - The options\n *\n * @returns The day of year\n *\n * @example\n * // Which day of the year is 2 July 2014?\n * const result = getDayOfYear(new Date(2014, 6, 2))\n * //=> 183\n */\nexport function getDayOfYear(date, options) {\n  const _date = toDate(date, options?.in);\n  const diff = differenceInCalendarDays(_date, startOfYear(_date));\n  const dayOfYear = diff + 1;\n  return dayOfYear;\n}\n\n// Fallback for modularized imports:\nexport default getDayOfYear;\n","import { millisecondsInWeek } from \"./constants.js\";\nimport { startOfISOWeek } from \"./startOfISOWeek.js\";\nimport { startOfISOWeekYear } from \"./startOfISOWeekYear.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getISOWeek} function options.\n */\n\n/**\n * @name getISOWeek\n * @category ISO Week Helpers\n * @summary Get the ISO week of the given date.\n *\n * @description\n * Get the ISO week of the given date.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @param date - The given date\n * @param options - The options\n *\n * @returns The ISO week\n *\n * @example\n * // Which week of the ISO-week numbering year is 2 January 2005?\n * const result = getISOWeek(new Date(2005, 0, 2))\n * //=> 53\n */\nexport function getISOWeek(date, options) {\n  const _date = toDate(date, options?.in);\n  const diff = +startOfISOWeek(_date) - +startOfISOWeekYear(_date);\n\n  // Round the number of weeks to the nearest integer because the number of\n  // milliseconds in a week is not constant (e.g. it's different in the week of\n  // the daylight saving time clock shift).\n  return Math.round(diff / millisecondsInWeek) + 1;\n}\n\n// Fallback for modularized imports:\nexport default getISOWeek;\n","import { getDefaultOptions } from \"./_lib/defaultOptions.js\";\nimport { constructFrom } from \"./constructFrom.js\";\nimport { startOfWeek } from \"./startOfWeek.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getWeekYear} function options.\n */\n\n/**\n * @name getWeekYear\n * @category Week-Numbering Year Helpers\n * @summary Get the local week-numbering year of the given date.\n *\n * @description\n * Get the local week-numbering year of the given date.\n * The exact calculation depends on the values of\n * `options.weekStartsOn` (which is the index of the first day of the week)\n * and `options.firstWeekContainsDate` (which is the day of January, which is always in\n * the first week of the week-numbering year)\n *\n * Week numbering: https://en.wikipedia.org/wiki/Week#The_ISO_week_date_system\n *\n * @param date - The given date\n * @param options - An object with options.\n *\n * @returns The local week-numbering year\n *\n * @example\n * // Which week numbering year is 26 December 2004 with the default settings?\n * const result = getWeekYear(new Date(2004, 11, 26))\n * //=> 2005\n *\n * @example\n * // Which week numbering year is 26 December 2004 if week starts on Saturday?\n * const result = getWeekYear(new Date(2004, 11, 26), { weekStartsOn: 6 })\n * //=> 2004\n *\n * @example\n * // Which week numbering year is 26 December 2004 if the first week contains 4 January?\n * const result = getWeekYear(new Date(2004, 11, 26), { firstWeekContainsDate: 4 })\n * //=> 2004\n */\nexport function getWeekYear(date, options) {\n  const _date = toDate(date, options?.in);\n  const year = _date.getFullYear();\n\n  const defaultOptions = getDefaultOptions();\n  const firstWeekContainsDate =\n    options?.firstWeekContainsDate ??\n    options?.locale?.options?.firstWeekContainsDate ??\n    defaultOptions.firstWeekContainsDate ??\n    defaultOptions.locale?.options?.firstWeekContainsDate ??\n    1;\n\n  const firstWeekOfNextYear = constructFrom(options?.in || date, 0);\n  firstWeekOfNextYear.setFullYear(year + 1, 0, firstWeekContainsDate);\n  firstWeekOfNextYear.setHours(0, 0, 0, 0);\n  const startOfNextYear = startOfWeek(firstWeekOfNextYear, options);\n\n  const firstWeekOfThisYear = constructFrom(options?.in || date, 0);\n  firstWeekOfThisYear.setFullYear(year, 0, firstWeekContainsDate);\n  firstWeekOfThisYear.setHours(0, 0, 0, 0);\n  const startOfThisYear = startOfWeek(firstWeekOfThisYear, options);\n\n  if (+_date >= +startOfNextYear) {\n    return year + 1;\n  } else if (+_date >= +startOfThisYear) {\n    return year;\n  } else {\n    return year - 1;\n  }\n}\n\n// Fallback for modularized imports:\nexport default getWeekYear;\n","import { getDefaultOptions } from \"./_lib/defaultOptions.js\";\nimport { constructFrom } from \"./constructFrom.js\";\nimport { getWeekYear } from \"./getWeekYear.js\";\nimport { startOfWeek } from \"./startOfWeek.js\";\n\n/**\n * The {@link startOfWeekYear} function options.\n */\n\n/**\n * @name startOfWeekYear\n * @category Week-Numbering Year Helpers\n * @summary Return the start of a local week-numbering year for the given date.\n *\n * @description\n * Return the start of a local week-numbering year.\n * The exact calculation depends on the values of\n * `options.weekStartsOn` (which is the index of the first day of the week)\n * and `options.firstWeekContainsDate` (which is the day of January, which is always in\n * the first week of the week-numbering year)\n *\n * Week numbering: https://en.wikipedia.org/wiki/Week#The_ISO_week_date_system\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The start of a week-numbering year\n *\n * @example\n * // The start of an a week-numbering year for 2 July 2005 with default settings:\n * const result = startOfWeekYear(new Date(2005, 6, 2))\n * //=> Sun Dec 26 2004 00:00:00\n *\n * @example\n * // The start of a week-numbering year for 2 July 2005\n * // if Monday is the first day of week\n * // and 4 January is always in the first week of the year:\n * const result = startOfWeekYear(new Date(2005, 6, 2), {\n *   weekStartsOn: 1,\n *   firstWeekContainsDate: 4\n * })\n * //=> Mon Jan 03 2005 00:00:00\n */\nexport function startOfWeekYear(date, options) {\n  const defaultOptions = getDefaultOptions();\n  const firstWeekContainsDate =\n    options?.firstWeekContainsDate ??\n    options?.locale?.options?.firstWeekContainsDate ??\n    defaultOptions.firstWeekContainsDate ??\n    defaultOptions.locale?.options?.firstWeekContainsDate ??\n    1;\n\n  const year = getWeekYear(date, options);\n  const firstWeek = constructFrom(options?.in || date, 0);\n  firstWeek.setFullYear(year, 0, firstWeekContainsDate);\n  firstWeek.setHours(0, 0, 0, 0);\n  const _date = startOfWeek(firstWeek, options);\n  return _date;\n}\n\n// Fallback for modularized imports:\nexport default startOfWeekYear;\n","import { millisecondsInWeek } from \"./constants.js\";\nimport { startOfWeek } from \"./startOfWeek.js\";\nimport { startOfWeekYear } from \"./startOfWeekYear.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getWeek} function options.\n */\n\n/**\n * @name getWeek\n * @category Week Helpers\n * @summary Get the local week index of the given date.\n *\n * @description\n * Get the local week index of the given date.\n * The exact calculation depends on the values of\n * `options.weekStartsOn` (which is the index of the first day of the week)\n * and `options.firstWeekContainsDate` (which is the day of January, which is always in\n * the first week of the week-numbering year)\n *\n * Week numbering: https://en.wikipedia.org/wiki/Week#The_ISO_week_date_system\n *\n * @param date - The given date\n * @param options - An object with options\n *\n * @returns The week\n *\n * @example\n * // Which week of the local week numbering year is 2 January 2005 with default options?\n * const result = getWeek(new Date(2005, 0, 2))\n * //=> 2\n *\n * @example\n * // Which week of the local week numbering year is 2 January 2005,\n * // if Monday is the first day of the week,\n * // and the first week of the year always contains 4 January?\n * const result = getWeek(new Date(2005, 0, 2), {\n *   weekStartsOn: 1,\n *   firstWeekContainsDate: 4\n * })\n * //=> 53\n */\nexport function getWeek(date, options) {\n  const _date = toDate(date, options?.in);\n  const diff = +startOfWeek(_date, options) - +startOfWeekYear(_date, options);\n\n  // Round the number of weeks to the nearest integer because the number of\n  // milliseconds in a week is not constant (e.g. it's different in the week of\n  // the daylight saving time clock shift).\n  return Math.round(diff / millisecondsInWeek) + 1;\n}\n\n// Fallback for modularized imports:\nexport default getWeek;\n","export function addLeadingZeros(number, targetLength) {\n  const sign = number < 0 ? \"-\" : \"\";\n  const output = Math.abs(number).toString().padStart(targetLength, \"0\");\n  return sign + output;\n}\n","import { addLeadingZeros } from \"../addLeadingZeros.js\";\n\n/*\n * |     | Unit                           |     | Unit                           |\n * |-----|--------------------------------|-----|--------------------------------|\n * |  a  | AM, PM                         |  A* |                                |\n * |  d  | Day of month                   |  D  |                                |\n * |  h  | Hour [1-12]                    |  H  | Hour [0-23]                    |\n * |  m  | Minute                         |  M  | Month                          |\n * |  s  | Second                         |  S  | Fraction of second             |\n * |  y  | Year (abs)                     |  Y  |                                |\n *\n * Letters marked by * are not implemented but reserved by Unicode standard.\n */\n\nexport const lightFormatters = {\n  // Year\n  y(date, token) {\n    // From http://www.unicode.org/reports/tr35/tr35-31/tr35-dates.html#Date_Format_tokens\n    // | Year     |     y | yy |   yyy |  yyyy | yyyyy |\n    // |----------|-------|----|-------|-------|-------|\n    // | AD 1     |     1 | 01 |   001 |  0001 | 00001 |\n    // | AD 12    |    12 | 12 |   012 |  0012 | 00012 |\n    // | AD 123   |   123 | 23 |   123 |  0123 | 00123 |\n    // | AD 1234  |  1234 | 34 |  1234 |  1234 | 01234 |\n    // | AD 12345 | 12345 | 45 | 12345 | 12345 | 12345 |\n\n    const signedYear = date.getFullYear();\n    // Returns 1 for 1 BC (which is year 0 in JavaScript)\n    const year = signedYear > 0 ? signedYear : 1 - signedYear;\n    return addLeadingZeros(token === \"yy\" ? year % 100 : year, token.length);\n  },\n\n  // Month\n  M(date, token) {\n    const month = date.getMonth();\n    return token === \"M\" ? String(month + 1) : addLeadingZeros(month + 1, 2);\n  },\n\n  // Day of the month\n  d(date, token) {\n    return addLeadingZeros(date.getDate(), token.length);\n  },\n\n  // AM or PM\n  a(date, token) {\n    const dayPeriodEnumValue = date.getHours() / 12 >= 1 ? \"pm\" : \"am\";\n\n    switch (token) {\n      case \"a\":\n      case \"aa\":\n        return dayPeriodEnumValue.toUpperCase();\n      case \"aaa\":\n        return dayPeriodEnumValue;\n      case \"aaaaa\":\n        return dayPeriodEnumValue[0];\n      case \"aaaa\":\n      default:\n        return dayPeriodEnumValue === \"am\" ? \"a.m.\" : \"p.m.\";\n    }\n  },\n\n  // Hour [1-12]\n  h(date, token) {\n    return addLeadingZeros(date.getHours() % 12 || 12, token.length);\n  },\n\n  // Hour [0-23]\n  H(date, token) {\n    return addLeadingZeros(date.getHours(), token.length);\n  },\n\n  // Minute\n  m(date, token) {\n    return addLeadingZeros(date.getMinutes(), token.length);\n  },\n\n  // Second\n  s(date, token) {\n    return addLeadingZeros(date.getSeconds(), token.length);\n  },\n\n  // Fraction of second\n  S(date, token) {\n    const numberOfDigits = token.length;\n    const milliseconds = date.getMilliseconds();\n    const fractionalSeconds = Math.trunc(\n      milliseconds * Math.pow(10, numberOfDigits - 3),\n    );\n    return addLeadingZeros(fractionalSeconds, token.length);\n  },\n};\n","import { getDayOfYear } from \"../../getDayOfYear.js\";\nimport { getISOWeek } from \"../../getISOWeek.js\";\nimport { getISOWeekYear } from \"../../getISOWeekYear.js\";\nimport { getWeek } from \"../../getWeek.js\";\nimport { getWeekYear } from \"../../getWeekYear.js\";\n\nimport { addLeadingZeros } from \"../addLeadingZeros.js\";\nimport { lightFormatters } from \"./lightFormatters.js\";\n\nconst dayPeriodEnum = {\n  am: \"am\",\n  pm: \"pm\",\n  midnight: \"midnight\",\n  noon: \"noon\",\n  morning: \"morning\",\n  afternoon: \"afternoon\",\n  evening: \"evening\",\n  night: \"night\",\n};\n\n/*\n * |     | Unit                           |     | Unit                           |\n * |-----|--------------------------------|-----|--------------------------------|\n * |  a  | AM, PM                         |  A* | Milliseconds in day            |\n * |  b  | AM, PM, noon, midnight         |  B  | Flexible day period            |\n * |  c  | Stand-alone local day of week  |  C* | Localized hour w/ day period   |\n * |  d  | Day of month                   |  D  | Day of year                    |\n * |  e  | Local day of week              |  E  | Day of week                    |\n * |  f  |                                |  F* | Day of week in month           |\n * |  g* | Modified Julian day            |  G  | Era                            |\n * |  h  | Hour [1-12]                    |  H  | Hour [0-23]                    |\n * |  i! | ISO day of week                |  I! | ISO week of year               |\n * |  j* | Localized hour w/ day period   |  J* | Localized hour w/o day period  |\n * |  k  | Hour [1-24]                    |  K  | Hour [0-11]                    |\n * |  l* | (deprecated)                   |  L  | Stand-alone month              |\n * |  m  | Minute                         |  M  | Month                          |\n * |  n  |                                |  N  |                                |\n * |  o! | Ordinal number modifier        |  O  | Timezone (GMT)                 |\n * |  p! | Long localized time            |  P! | Long localized date            |\n * |  q  | Stand-alone quarter            |  Q  | Quarter                        |\n * |  r* | Related Gregorian year         |  R! | ISO week-numbering year        |\n * |  s  | Second                         |  S  | Fraction of second             |\n * |  t! | Seconds timestamp              |  T! | Milliseconds timestamp         |\n * |  u  | Extended year                  |  U* | Cyclic year                    |\n * |  v* | Timezone (generic non-locat.)  |  V* | Timezone (location)            |\n * |  w  | Local week of year             |  W* | Week of month                  |\n * |  x  | Timezone (ISO-8601 w/o Z)      |  X  | Timezone (ISO-8601)            |\n * |  y  | Year (abs)                     |  Y  | Local week-numbering year      |\n * |  z  | Timezone (specific non-locat.) |  Z* | Timezone (aliases)             |\n *\n * Letters marked by * are not implemented but reserved by Unicode standard.\n *\n * Letters marked by ! are non-standard, but implemented by date-fns:\n * - `o` modifies the previous token to turn it into an ordinal (see `format` docs)\n * - `i` is ISO day of week. For `i` and `ii` is returns numeric ISO week days,\n *   i.e. 7 for Sunday, 1 for Monday, etc.\n * - `I` is ISO week of year, as opposed to `w` which is local week of year.\n * - `R` is ISO week-numbering year, as opposed to `Y` which is local week-numbering year.\n *   `R` is supposed to be used in conjunction with `I` and `i`\n *   for universal ISO week-numbering date, whereas\n *   `Y` is supposed to be used in conjunction with `w` and `e`\n *   for week-numbering date specific to the locale.\n * - `P` is long localized date format\n * - `p` is long localized time format\n */\n\nexport const formatters = {\n  // Era\n  G: function (date, token, localize) {\n    const era = date.getFullYear() > 0 ? 1 : 0;\n    switch (token) {\n      // AD, BC\n      case \"G\":\n      case \"GG\":\n      case \"GGG\":\n        return localize.era(era, { width: \"abbreviated\" });\n      // A, B\n      case \"GGGGG\":\n        return localize.era(era, { width: \"narrow\" });\n      // Anno Domini, Before Christ\n      case \"GGGG\":\n      default:\n        return localize.era(era, { width: \"wide\" });\n    }\n  },\n\n  // Year\n  y: function (date, token, localize) {\n    // Ordinal number\n    if (token === \"yo\") {\n      const signedYear = date.getFullYear();\n      // Returns 1 for 1 BC (which is year 0 in JavaScript)\n      const year = signedYear > 0 ? signedYear : 1 - signedYear;\n      return localize.ordinalNumber(year, { unit: \"year\" });\n    }\n\n    return lightFormatters.y(date, token);\n  },\n\n  // Local week-numbering year\n  Y: function (date, token, localize, options) {\n    const signedWeekYear = getWeekYear(date, options);\n    // Returns 1 for 1 BC (which is year 0 in JavaScript)\n    const weekYear = signedWeekYear > 0 ? signedWeekYear : 1 - signedWeekYear;\n\n    // Two digit year\n    if (token === \"YY\") {\n      const twoDigitYear = weekYear % 100;\n      return addLeadingZeros(twoDigitYear, 2);\n    }\n\n    // Ordinal number\n    if (token === \"Yo\") {\n      return localize.ordinalNumber(weekYear, { unit: \"year\" });\n    }\n\n    // Padding\n    return addLeadingZeros(weekYear, token.length);\n  },\n\n  // ISO week-numbering year\n  R: function (date, token) {\n    const isoWeekYear = getISOWeekYear(date);\n\n    // Padding\n    return addLeadingZeros(isoWeekYear, token.length);\n  },\n\n  // Extended year. This is a single number designating the year of this calendar system.\n  // The main difference between `y` and `u` localizers are B.C. years:\n  // | Year | `y` | `u` |\n  // |------|-----|-----|\n  // | AC 1 |   1 |   1 |\n  // | BC 1 |   1 |   0 |\n  // | BC 2 |   2 |  -1 |\n  // Also `yy` always returns the last two digits of a year,\n  // while `uu` pads single digit years to 2 characters and returns other years unchanged.\n  u: function (date, token) {\n    const year = date.getFullYear();\n    return addLeadingZeros(year, token.length);\n  },\n\n  // Quarter\n  Q: function (date, token, localize) {\n    const quarter = Math.ceil((date.getMonth() + 1) / 3);\n    switch (token) {\n      // 1, 2, 3, 4\n      case \"Q\":\n        return String(quarter);\n      // 01, 02, 03, 04\n      case \"QQ\":\n        return addLeadingZeros(quarter, 2);\n      // 1st, 2nd, 3rd, 4th\n      case \"Qo\":\n        return localize.ordinalNumber(quarter, { unit: \"quarter\" });\n      // Q1, Q2, Q3, Q4\n      case \"QQQ\":\n        return localize.quarter(quarter, {\n          width: \"abbreviated\",\n          context: \"formatting\",\n        });\n      // 1, 2, 3, 4 (narrow quarter; could be not numerical)\n      case \"QQQQQ\":\n        return localize.quarter(quarter, {\n          width: \"narrow\",\n          context: \"formatting\",\n        });\n      // 1st quarter, 2nd quarter, ...\n      case \"QQQQ\":\n      default:\n        return localize.quarter(quarter, {\n          width: \"wide\",\n          context: \"formatting\",\n        });\n    }\n  },\n\n  // Stand-alone quarter\n  q: function (date, token, localize) {\n    const quarter = Math.ceil((date.getMonth() + 1) / 3);\n    switch (token) {\n      // 1, 2, 3, 4\n      case \"q\":\n        return String(quarter);\n      // 01, 02, 03, 04\n      case \"qq\":\n        return addLeadingZeros(quarter, 2);\n      // 1st, 2nd, 3rd, 4th\n      case \"qo\":\n        return localize.ordinalNumber(quarter, { unit: \"quarter\" });\n      // Q1, Q2, Q3, Q4\n      case \"qqq\":\n        return localize.quarter(quarter, {\n          width: \"abbreviated\",\n          context: \"standalone\",\n        });\n      // 1, 2, 3, 4 (narrow quarter; could be not numerical)\n      case \"qqqqq\":\n        return localize.quarter(quarter, {\n          width: \"narrow\",\n          context: \"standalone\",\n        });\n      // 1st quarter, 2nd quarter, ...\n      case \"qqqq\":\n      default:\n        return localize.quarter(quarter, {\n          width: \"wide\",\n          context: \"standalone\",\n        });\n    }\n  },\n\n  // Month\n  M: function (date, token, localize) {\n    const month = date.getMonth();\n    switch (token) {\n      case \"M\":\n      case \"MM\":\n        return lightFormatters.M(date, token);\n      // 1st, 2nd, ..., 12th\n      case \"Mo\":\n        return localize.ordinalNumber(month + 1, { unit: \"month\" });\n      // Jan, Feb, ..., Dec\n      case \"MMM\":\n        return localize.month(month, {\n          width: \"abbreviated\",\n          context: \"formatting\",\n        });\n      // J, F, ..., D\n      case \"MMMMM\":\n        return localize.month(month, {\n          width: \"narrow\",\n          context: \"formatting\",\n        });\n      // January, February, ..., December\n      case \"MMMM\":\n      default:\n        return localize.month(month, { width: \"wide\", context: \"formatting\" });\n    }\n  },\n\n  // Stand-alone month\n  L: function (date, token, localize) {\n    const month = date.getMonth();\n    switch (token) {\n      // 1, 2, ..., 12\n      case \"L\":\n        return String(month + 1);\n      // 01, 02, ..., 12\n      case \"LL\":\n        return addLeadingZeros(month + 1, 2);\n      // 1st, 2nd, ..., 12th\n      case \"Lo\":\n        return localize.ordinalNumber(month + 1, { unit: \"month\" });\n      // Jan, Feb, ..., Dec\n      case \"LLL\":\n        return localize.month(month, {\n          width: \"abbreviated\",\n          context: \"standalone\",\n        });\n      // J, F, ..., D\n      case \"LLLLL\":\n        return localize.month(month, {\n          width: \"narrow\",\n          context: \"standalone\",\n        });\n      // January, February, ..., December\n      case \"LLLL\":\n      default:\n        return localize.month(month, { width: \"wide\", context: \"standalone\" });\n    }\n  },\n\n  // Local week of year\n  w: function (date, token, localize, options) {\n    const week = getWeek(date, options);\n\n    if (token === \"wo\") {\n      return localize.ordinalNumber(week, { unit: \"week\" });\n    }\n\n    return addLeadingZeros(week, token.length);\n  },\n\n  // ISO week of year\n  I: function (date, token, localize) {\n    const isoWeek = getISOWeek(date);\n\n    if (token === \"Io\") {\n      return localize.ordinalNumber(isoWeek, { unit: \"week\" });\n    }\n\n    return addLeadingZeros(isoWeek, token.length);\n  },\n\n  // Day of the month\n  d: function (date, token, localize) {\n    if (token === \"do\") {\n      return localize.ordinalNumber(date.getDate(), { unit: \"date\" });\n    }\n\n    return lightFormatters.d(date, token);\n  },\n\n  // Day of year\n  D: function (date, token, localize) {\n    const dayOfYear = getDayOfYear(date);\n\n    if (token === \"Do\") {\n      return localize.ordinalNumber(dayOfYear, { unit: \"dayOfYear\" });\n    }\n\n    return addLeadingZeros(dayOfYear, token.length);\n  },\n\n  // Day of week\n  E: function (date, token, localize) {\n    const dayOfWeek = date.getDay();\n    switch (token) {\n      // Tue\n      case \"E\":\n      case \"EE\":\n      case \"EEE\":\n        return localize.day(dayOfWeek, {\n          width: \"abbreviated\",\n          context: \"formatting\",\n        });\n      // T\n      case \"EEEEE\":\n        return localize.day(dayOfWeek, {\n          width: \"narrow\",\n          context: \"formatting\",\n        });\n      // Tu\n      case \"EEEEEE\":\n        return localize.day(dayOfWeek, {\n          width: \"short\",\n          context: \"formatting\",\n        });\n      // Tuesday\n      case \"EEEE\":\n      default:\n        return localize.day(dayOfWeek, {\n          width: \"wide\",\n          context: \"formatting\",\n        });\n    }\n  },\n\n  // Local day of week\n  e: function (date, token, localize, options) {\n    const dayOfWeek = date.getDay();\n    const localDayOfWeek = (dayOfWeek - options.weekStartsOn + 8) % 7 || 7;\n    switch (token) {\n      // Numerical value (Nth day of week with current locale or weekStartsOn)\n      case \"e\":\n        return String(localDayOfWeek);\n      // Padded numerical value\n      case \"ee\":\n        return addLeadingZeros(localDayOfWeek, 2);\n      // 1st, 2nd, ..., 7th\n      case \"eo\":\n        return localize.ordinalNumber(localDayOfWeek, { unit: \"day\" });\n      case \"eee\":\n        return localize.day(dayOfWeek, {\n          width: \"abbreviated\",\n          context: \"formatting\",\n        });\n      // T\n      case \"eeeee\":\n        return localize.day(dayOfWeek, {\n          width: \"narrow\",\n          context: \"formatting\",\n        });\n      // Tu\n      case \"eeeeee\":\n        return localize.day(dayOfWeek, {\n          width: \"short\",\n          context: \"formatting\",\n        });\n      // Tuesday\n      case \"eeee\":\n      default:\n        return localize.day(dayOfWeek, {\n          width: \"wide\",\n          context: \"formatting\",\n        });\n    }\n  },\n\n  // Stand-alone local day of week\n  c: function (date, token, localize, options) {\n    const dayOfWeek = date.getDay();\n    const localDayOfWeek = (dayOfWeek - options.weekStartsOn + 8) % 7 || 7;\n    switch (token) {\n      // Numerical value (same as in `e`)\n      case \"c\":\n        return String(localDayOfWeek);\n      // Padded numerical value\n      case \"cc\":\n        return addLeadingZeros(localDayOfWeek, token.length);\n      // 1st, 2nd, ..., 7th\n      case \"co\":\n        return localize.ordinalNumber(localDayOfWeek, { unit: \"day\" });\n      case \"ccc\":\n        return localize.day(dayOfWeek, {\n          width: \"abbreviated\",\n          context: \"standalone\",\n        });\n      // T\n      case \"ccccc\":\n        return localize.day(dayOfWeek, {\n          width: \"narrow\",\n          context: \"standalone\",\n        });\n      // Tu\n      case \"cccccc\":\n        return localize.day(dayOfWeek, {\n          width: \"short\",\n          context: \"standalone\",\n        });\n      // Tuesday\n      case \"cccc\":\n      default:\n        return localize.day(dayOfWeek, {\n          width: \"wide\",\n          context: \"standalone\",\n        });\n    }\n  },\n\n  // ISO day of week\n  i: function (date, token, localize) {\n    const dayOfWeek = date.getDay();\n    const isoDayOfWeek = dayOfWeek === 0 ? 7 : dayOfWeek;\n    switch (token) {\n      // 2\n      case \"i\":\n        return String(isoDayOfWeek);\n      // 02\n      case \"ii\":\n        return addLeadingZeros(isoDayOfWeek, token.length);\n      // 2nd\n      case \"io\":\n        return localize.ordinalNumber(isoDayOfWeek, { unit: \"day\" });\n      // Tue\n      case \"iii\":\n        return localize.day(dayOfWeek, {\n          width: \"abbreviated\",\n          context: \"formatting\",\n        });\n      // T\n      case \"iiiii\":\n        return localize.day(dayOfWeek, {\n          width: \"narrow\",\n          context: \"formatting\",\n        });\n      // Tu\n      case \"iiiiii\":\n        return localize.day(dayOfWeek, {\n          width: \"short\",\n          context: \"formatting\",\n        });\n      // Tuesday\n      case \"iiii\":\n      default:\n        return localize.day(dayOfWeek, {\n          width: \"wide\",\n          context: \"formatting\",\n        });\n    }\n  },\n\n  // AM or PM\n  a: function (date, token, localize) {\n    const hours = date.getHours();\n    const dayPeriodEnumValue = hours / 12 >= 1 ? \"pm\" : \"am\";\n\n    switch (token) {\n      case \"a\":\n      case \"aa\":\n        return localize.dayPeriod(dayPeriodEnumValue, {\n          width: \"abbreviated\",\n          context: \"formatting\",\n        });\n      case \"aaa\":\n        return localize\n          .dayPeriod(dayPeriodEnumValue, {\n            width: \"abbreviated\",\n            context: \"formatting\",\n          })\n          .toLowerCase();\n      case \"aaaaa\":\n        return localize.dayPeriod(dayPeriodEnumValue, {\n          width: \"narrow\",\n          context: \"formatting\",\n        });\n      case \"aaaa\":\n      default:\n        return localize.dayPeriod(dayPeriodEnumValue, {\n          width: \"wide\",\n          context: \"formatting\",\n        });\n    }\n  },\n\n  // AM, PM, midnight, noon\n  b: function (date, token, localize) {\n    const hours = date.getHours();\n    let dayPeriodEnumValue;\n    if (hours === 12) {\n      dayPeriodEnumValue = dayPeriodEnum.noon;\n    } else if (hours === 0) {\n      dayPeriodEnumValue = dayPeriodEnum.midnight;\n    } else {\n      dayPeriodEnumValue = hours / 12 >= 1 ? \"pm\" : \"am\";\n    }\n\n    switch (token) {\n      case \"b\":\n      case \"bb\":\n        return localize.dayPeriod(dayPeriodEnumValue, {\n          width: \"abbreviated\",\n          context: \"formatting\",\n        });\n      case \"bbb\":\n        return localize\n          .dayPeriod(dayPeriodEnumValue, {\n            width: \"abbreviated\",\n            context: \"formatting\",\n          })\n          .toLowerCase();\n      case \"bbbbb\":\n        return localize.dayPeriod(dayPeriodEnumValue, {\n          width: \"narrow\",\n          context: \"formatting\",\n        });\n      case \"bbbb\":\n      default:\n        return localize.dayPeriod(dayPeriodEnumValue, {\n          width: \"wide\",\n          context: \"formatting\",\n        });\n    }\n  },\n\n  // in the morning, in the afternoon, in the evening, at night\n  B: function (date, token, localize) {\n    const hours = date.getHours();\n    let dayPeriodEnumValue;\n    if (hours >= 17) {\n      dayPeriodEnumValue = dayPeriodEnum.evening;\n    } else if (hours >= 12) {\n      dayPeriodEnumValue = dayPeriodEnum.afternoon;\n    } else if (hours >= 4) {\n      dayPeriodEnumValue = dayPeriodEnum.morning;\n    } else {\n      dayPeriodEnumValue = dayPeriodEnum.night;\n    }\n\n    switch (token) {\n      case \"B\":\n      case \"BB\":\n      case \"BBB\":\n        return localize.dayPeriod(dayPeriodEnumValue, {\n          width: \"abbreviated\",\n          context: \"formatting\",\n        });\n      case \"BBBBB\":\n        return localize.dayPeriod(dayPeriodEnumValue, {\n          width: \"narrow\",\n          context: \"formatting\",\n        });\n      case \"BBBB\":\n      default:\n        return localize.dayPeriod(dayPeriodEnumValue, {\n          width: \"wide\",\n          context: \"formatting\",\n        });\n    }\n  },\n\n  // Hour [1-12]\n  h: function (date, token, localize) {\n    if (token === \"ho\") {\n      let hours = date.getHours() % 12;\n      if (hours === 0) hours = 12;\n      return localize.ordinalNumber(hours, { unit: \"hour\" });\n    }\n\n    return lightFormatters.h(date, token);\n  },\n\n  // Hour [0-23]\n  H: function (date, token, localize) {\n    if (token === \"Ho\") {\n      return localize.ordinalNumber(date.getHours(), { unit: \"hour\" });\n    }\n\n    return lightFormatters.H(date, token);\n  },\n\n  // Hour [0-11]\n  K: function (date, token, localize) {\n    const hours = date.getHours() % 12;\n\n    if (token === \"Ko\") {\n      return localize.ordinalNumber(hours, { unit: \"hour\" });\n    }\n\n    return addLeadingZeros(hours, token.length);\n  },\n\n  // Hour [1-24]\n  k: function (date, token, localize) {\n    let hours = date.getHours();\n    if (hours === 0) hours = 24;\n\n    if (token === \"ko\") {\n      return localize.ordinalNumber(hours, { unit: \"hour\" });\n    }\n\n    return addLeadingZeros(hours, token.length);\n  },\n\n  // Minute\n  m: function (date, token, localize) {\n    if (token === \"mo\") {\n      return localize.ordinalNumber(date.getMinutes(), { unit: \"minute\" });\n    }\n\n    return lightFormatters.m(date, token);\n  },\n\n  // Second\n  s: function (date, token, localize) {\n    if (token === \"so\") {\n      return localize.ordinalNumber(date.getSeconds(), { unit: \"second\" });\n    }\n\n    return lightFormatters.s(date, token);\n  },\n\n  // Fraction of second\n  S: function (date, token) {\n    return lightFormatters.S(date, token);\n  },\n\n  // Timezone (ISO-8601. If offset is 0, output is always `'Z'`)\n  X: function (date, token, _localize) {\n    const timezoneOffset = date.getTimezoneOffset();\n\n    if (timezoneOffset === 0) {\n      return \"Z\";\n    }\n\n    switch (token) {\n      // Hours and optional minutes\n      case \"X\":\n        return formatTimezoneWithOptionalMinutes(timezoneOffset);\n\n      // Hours, minutes and optional seconds without `:` delimiter\n      // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n      // so this token always has the same output as `XX`\n      case \"XXXX\":\n      case \"XX\": // Hours and minutes without `:` delimiter\n        return formatTimezone(timezoneOffset);\n\n      // Hours, minutes and optional seconds with `:` delimiter\n      // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n      // so this token always has the same output as `XXX`\n      case \"XXXXX\":\n      case \"XXX\": // Hours and minutes with `:` delimiter\n      default:\n        return formatTimezone(timezoneOffset, \":\");\n    }\n  },\n\n  // Timezone (ISO-8601. If offset is 0, output is `'+00:00'` or equivalent)\n  x: function (date, token, _localize) {\n    const timezoneOffset = date.getTimezoneOffset();\n\n    switch (token) {\n      // Hours and optional minutes\n      case \"x\":\n        return formatTimezoneWithOptionalMinutes(timezoneOffset);\n\n      // Hours, minutes and optional seconds without `:` delimiter\n      // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n      // so this token always has the same output as `xx`\n      case \"xxxx\":\n      case \"xx\": // Hours and minutes without `:` delimiter\n        return formatTimezone(timezoneOffset);\n\n      // Hours, minutes and optional seconds with `:` delimiter\n      // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n      // so this token always has the same output as `xxx`\n      case \"xxxxx\":\n      case \"xxx\": // Hours and minutes with `:` delimiter\n      default:\n        return formatTimezone(timezoneOffset, \":\");\n    }\n  },\n\n  // Timezone (GMT)\n  O: function (date, token, _localize) {\n    const timezoneOffset = date.getTimezoneOffset();\n\n    switch (token) {\n      // Short\n      case \"O\":\n      case \"OO\":\n      case \"OOO\":\n        return \"GMT\" + formatTimezoneShort(timezoneOffset, \":\");\n      // Long\n      case \"OOOO\":\n      default:\n        return \"GMT\" + formatTimezone(timezoneOffset, \":\");\n    }\n  },\n\n  // Timezone (specific non-location)\n  z: function (date, token, _localize) {\n    const timezoneOffset = date.getTimezoneOffset();\n\n    switch (token) {\n      // Short\n      case \"z\":\n      case \"zz\":\n      case \"zzz\":\n        return \"GMT\" + formatTimezoneShort(timezoneOffset, \":\");\n      // Long\n      case \"zzzz\":\n      default:\n        return \"GMT\" + formatTimezone(timezoneOffset, \":\");\n    }\n  },\n\n  // Seconds timestamp\n  t: function (date, token, _localize) {\n    const timestamp = Math.trunc(+date / 1000);\n    return addLeadingZeros(timestamp, token.length);\n  },\n\n  // Milliseconds timestamp\n  T: function (date, token, _localize) {\n    return addLeadingZeros(+date, token.length);\n  },\n};\n\nfunction formatTimezoneShort(offset, delimiter = \"\") {\n  const sign = offset > 0 ? \"-\" : \"+\";\n  const absOffset = Math.abs(offset);\n  const hours = Math.trunc(absOffset / 60);\n  const minutes = absOffset % 60;\n  if (minutes === 0) {\n    return sign + String(hours);\n  }\n  return sign + String(hours) + delimiter + addLeadingZeros(minutes, 2);\n}\n\nfunction formatTimezoneWithOptionalMinutes(offset, delimiter) {\n  if (offset % 60 === 0) {\n    const sign = offset > 0 ? \"-\" : \"+\";\n    return sign + addLeadingZeros(Math.abs(offset) / 60, 2);\n  }\n  return formatTimezone(offset, delimiter);\n}\n\nfunction formatTimezone(offset, delimiter = \"\") {\n  const sign = offset > 0 ? \"-\" : \"+\";\n  const absOffset = Math.abs(offset);\n  const hours = addLeadingZeros(Math.trunc(absOffset / 60), 2);\n  const minutes = addLeadingZeros(absOffset % 60, 2);\n  return sign + hours + delimiter + minutes;\n}\n","const dateLongFormatter = (pattern, formatLong) => {\n  switch (pattern) {\n    case \"P\":\n      return formatLong.date({ width: \"short\" });\n    case \"PP\":\n      return formatLong.date({ width: \"medium\" });\n    case \"PPP\":\n      return formatLong.date({ width: \"long\" });\n    case \"PPPP\":\n    default:\n      return formatLong.date({ width: \"full\" });\n  }\n};\n\nconst timeLongFormatter = (pattern, formatLong) => {\n  switch (pattern) {\n    case \"p\":\n      return formatLong.time({ width: \"short\" });\n    case \"pp\":\n      return formatLong.time({ width: \"medium\" });\n    case \"ppp\":\n      return formatLong.time({ width: \"long\" });\n    case \"pppp\":\n    default:\n      return formatLong.time({ width: \"full\" });\n  }\n};\n\nconst dateTimeLongFormatter = (pattern, formatLong) => {\n  const matchResult = pattern.match(/(P+)(p+)?/) || [];\n  const datePattern = matchResult[1];\n  const timePattern = matchResult[2];\n\n  if (!timePattern) {\n    return dateLongFormatter(pattern, formatLong);\n  }\n\n  let dateTimeFormat;\n\n  switch (datePattern) {\n    case \"P\":\n      dateTimeFormat = formatLong.dateTime({ width: \"short\" });\n      break;\n    case \"PP\":\n      dateTimeFormat = formatLong.dateTime({ width: \"medium\" });\n      break;\n    case \"PPP\":\n      dateTimeFormat = formatLong.dateTime({ width: \"long\" });\n      break;\n    case \"PPPP\":\n    default:\n      dateTimeFormat = formatLong.dateTime({ width: \"full\" });\n      break;\n  }\n\n  return dateTimeFormat\n    .replace(\"{{date}}\", dateLongFormatter(datePattern, formatLong))\n    .replace(\"{{time}}\", timeLongFormatter(timePattern, formatLong));\n};\n\nexport const longFormatters = {\n  p: timeLongFormatter,\n  P: dateTimeLongFormatter,\n};\n","const dayOfYearTokenRE = /^D+$/;\nconst weekYearTokenRE = /^Y+$/;\n\nconst throwTokens = [\"D\", \"DD\", \"YY\", \"YYYY\"];\n\nexport function isProtectedDayOfYearToken(token) {\n  return dayOfYearTokenRE.test(token);\n}\n\nexport function isProtectedWeekYearToken(token) {\n  return weekYearTokenRE.test(token);\n}\n\nexport function warnOrThrowProtectedError(token, format, input) {\n  const _message = message(token, format, input);\n  console.warn(_message);\n  if (throwTokens.includes(token)) throw new RangeError(_message);\n}\n\nfunction message(token, format, input) {\n  const subject = token[0] === \"Y\" ? \"years\" : \"days of the month\";\n  return `Use \\`${token.toLowerCase()}\\` instead of \\`${token}\\` (in \\`${format}\\`) for formatting ${subject} to the input \\`${input}\\`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md`;\n}\n","import { defaultLocale } from \"./_lib/defaultLocale.js\";\nimport { getDefaultOptions } from \"./_lib/defaultOptions.js\";\nimport { formatters } from \"./_lib/format/formatters.js\";\nimport { longFormatters } from \"./_lib/format/longFormatters.js\";\nimport {\n  isProtectedDayOfYearToken,\n  isProtectedWeekYearToken,\n  warnOrThrowProtectedError,\n} from \"./_lib/protectedTokens.js\";\nimport { isValid } from \"./isValid.js\";\nimport { toDate } from \"./toDate.js\";\n\n// Rexports of internal for libraries to use.\n// See: https://github.com/date-fns/date-fns/issues/3638#issuecomment-1877082874\nexport { formatters, longFormatters };\n\n// This RegExp consists of three parts separated by `|`:\n// - [yYQqMLwIdDecihHKkms]o matches any available ordinal number token\n//   (one of the certain letters followed by `o`)\n// - (\\w)\\1* matches any sequences of the same letter\n// - '' matches two quote characters in a row\n// - '(''|[^'])+('|$) matches anything surrounded by two quote characters ('),\n//   except a single quote symbol, which ends the sequence.\n//   Two quote characters do not end the sequence.\n//   If there is no matching single quote\n//   then the sequence will continue until the end of the string.\n// - . matches any single character unmatched by previous parts of the RegExps\nconst formattingTokensRegExp =\n  /[yYQqMLwIdDecihHKkms]o|(\\w)\\1*|''|'(''|[^'])+('|$)|./g;\n\n// This RegExp catches symbols escaped by quotes, and also\n// sequences of symbols P, p, and the combinations like `PPPPPPPppppp`\nconst longFormattingTokensRegExp = /P+p+|P+|p+|''|'(''|[^'])+('|$)|./g;\n\nconst escapedStringRegExp = /^'([^]*?)'?$/;\nconst doubleQuoteRegExp = /''/g;\nconst unescapedLatinCharacterRegExp = /[a-zA-Z]/;\n\nexport { format as formatDate };\n\n/**\n * The {@link format} function options.\n */\n\n/**\n * @name format\n * @alias formatDate\n * @category Common Helpers\n * @summary Format the date.\n *\n * @description\n * Return the formatted date string in the given format. The result may vary by locale.\n *\n * > ⚠️ Please note that the `format` tokens differ from Moment.js and other libraries.\n * > See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * The characters wrapped between two single quotes characters (') are escaped.\n * Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.\n * (see the last example)\n *\n * Format of the string is based on Unicode Technical Standard #35:\n * https://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table\n * with a few additions (see note 7 below the table).\n *\n * Accepted patterns:\n * | Unit                            | Pattern | Result examples                   | Notes |\n * |---------------------------------|---------|-----------------------------------|-------|\n * | Era                             | G..GGG  | AD, BC                            |       |\n * |                                 | GGGG    | Anno Domini, Before Christ        | 2     |\n * |                                 | GGGGG   | A, B                              |       |\n * | Calendar year                   | y       | 44, 1, 1900, 2017                 | 5     |\n * |                                 | yo      | 44th, 1st, 0th, 17th              | 5,7   |\n * |                                 | yy      | 44, 01, 00, 17                    | 5     |\n * |                                 | yyy     | 044, 001, 1900, 2017              | 5     |\n * |                                 | yyyy    | 0044, 0001, 1900, 2017            | 5     |\n * |                                 | yyyyy   | ...                               | 3,5   |\n * | Local week-numbering year       | Y       | 44, 1, 1900, 2017                 | 5     |\n * |                                 | Yo      | 44th, 1st, 1900th, 2017th         | 5,7   |\n * |                                 | YY      | 44, 01, 00, 17                    | 5,8   |\n * |                                 | YYY     | 044, 001, 1900, 2017              | 5     |\n * |                                 | YYYY    | 0044, 0001, 1900, 2017            | 5,8   |\n * |                                 | YYYYY   | ...                               | 3,5   |\n * | ISO week-numbering year         | R       | -43, 0, 1, 1900, 2017             | 5,7   |\n * |                                 | RR      | -43, 00, 01, 1900, 2017           | 5,7   |\n * |                                 | RRR     | -043, 000, 001, 1900, 2017        | 5,7   |\n * |                                 | RRRR    | -0043, 0000, 0001, 1900, 2017     | 5,7   |\n * |                                 | RRRRR   | ...                               | 3,5,7 |\n * | Extended year                   | u       | -43, 0, 1, 1900, 2017             | 5     |\n * |                                 | uu      | -43, 01, 1900, 2017               | 5     |\n * |                                 | uuu     | -043, 001, 1900, 2017             | 5     |\n * |                                 | uuuu    | -0043, 0001, 1900, 2017           | 5     |\n * |                                 | uuuuu   | ...                               | 3,5   |\n * | Quarter (formatting)            | Q       | 1, 2, 3, 4                        |       |\n * |                                 | Qo      | 1st, 2nd, 3rd, 4th                | 7     |\n * |                                 | QQ      | 01, 02, 03, 04                    |       |\n * |                                 | QQQ     | Q1, Q2, Q3, Q4                    |       |\n * |                                 | QQQQ    | 1st quarter, 2nd quarter, ...     | 2     |\n * |                                 | QQQQQ   | 1, 2, 3, 4                        | 4     |\n * | Quarter (stand-alone)           | q       | 1, 2, 3, 4                        |       |\n * |                                 | qo      | 1st, 2nd, 3rd, 4th                | 7     |\n * |                                 | qq      | 01, 02, 03, 04                    |       |\n * |                                 | qqq     | Q1, Q2, Q3, Q4                    |       |\n * |                                 | qqqq    | 1st quarter, 2nd quarter, ...     | 2     |\n * |                                 | qqqqq   | 1, 2, 3, 4                        | 4     |\n * | Month (formatting)              | M       | 1, 2, ..., 12                     |       |\n * |                                 | Mo      | 1st, 2nd, ..., 12th               | 7     |\n * |                                 | MM      | 01, 02, ..., 12                   |       |\n * |                                 | MMM     | Jan, Feb, ..., Dec                |       |\n * |                                 | MMMM    | January, February, ..., December  | 2     |\n * |                                 | MMMMM   | J, F, ..., D                      |       |\n * | Month (stand-alone)             | L       | 1, 2, ..., 12                     |       |\n * |                                 | Lo      | 1st, 2nd, ..., 12th               | 7     |\n * |                                 | LL      | 01, 02, ..., 12                   |       |\n * |                                 | LLL     | Jan, Feb, ..., Dec                |       |\n * |                                 | LLLL    | January, February, ..., December  | 2     |\n * |                                 | LLLLL   | J, F, ..., D                      |       |\n * | Local week of year              | w       | 1, 2, ..., 53                     |       |\n * |                                 | wo      | 1st, 2nd, ..., 53th               | 7     |\n * |                                 | ww      | 01, 02, ..., 53                   |       |\n * | ISO week of year                | I       | 1, 2, ..., 53                     | 7     |\n * |                                 | Io      | 1st, 2nd, ..., 53th               | 7     |\n * |                                 | II      | 01, 02, ..., 53                   | 7     |\n * | Day of month                    | d       | 1, 2, ..., 31                     |       |\n * |                                 | do      | 1st, 2nd, ..., 31st               | 7     |\n * |                                 | dd      | 01, 02, ..., 31                   |       |\n * | Day of year                     | D       | 1, 2, ..., 365, 366               | 9     |\n * |                                 | Do      | 1st, 2nd, ..., 365th, 366th       | 7     |\n * |                                 | DD      | 01, 02, ..., 365, 366             | 9     |\n * |                                 | DDD     | 001, 002, ..., 365, 366           |       |\n * |                                 | DDDD    | ...                               | 3     |\n * | Day of week (formatting)        | E..EEE  | Mon, Tue, Wed, ..., Sun           |       |\n * |                                 | EEEE    | Monday, Tuesday, ..., Sunday      | 2     |\n * |                                 | EEEEE   | M, T, W, T, F, S, S               |       |\n * |                                 | EEEEEE  | Mo, Tu, We, Th, Fr, Sa, Su        |       |\n * | ISO day of week (formatting)    | i       | 1, 2, 3, ..., 7                   | 7     |\n * |                                 | io      | 1st, 2nd, ..., 7th                | 7     |\n * |                                 | ii      | 01, 02, ..., 07                   | 7     |\n * |                                 | iii     | Mon, Tue, Wed, ..., Sun           | 7     |\n * |                                 | iiii    | Monday, Tuesday, ..., Sunday      | 2,7   |\n * |                                 | iiiii   | M, T, W, T, F, S, S               | 7     |\n * |                                 | iiiiii  | Mo, Tu, We, Th, Fr, Sa, Su        | 7     |\n * | Local day of week (formatting)  | e       | 2, 3, 4, ..., 1                   |       |\n * |                                 | eo      | 2nd, 3rd, ..., 1st                | 7     |\n * |                                 | ee      | 02, 03, ..., 01                   |       |\n * |                                 | eee     | Mon, Tue, Wed, ..., Sun           |       |\n * |                                 | eeee    | Monday, Tuesday, ..., Sunday      | 2     |\n * |                                 | eeeee   | M, T, W, T, F, S, S               |       |\n * |                                 | eeeeee  | Mo, Tu, We, Th, Fr, Sa, Su        |       |\n * | Local day of week (stand-alone) | c       | 2, 3, 4, ..., 1                   |       |\n * |                                 | co      | 2nd, 3rd, ..., 1st                | 7     |\n * |                                 | cc      | 02, 03, ..., 01                   |       |\n * |                                 | ccc     | Mon, Tue, Wed, ..., Sun           |       |\n * |                                 | cccc    | Monday, Tuesday, ..., Sunday      | 2     |\n * |                                 | ccccc   | M, T, W, T, F, S, S               |       |\n * |                                 | cccccc  | Mo, Tu, We, Th, Fr, Sa, Su        |       |\n * | AM, PM                          | a..aa   | AM, PM                            |       |\n * |                                 | aaa     | am, pm                            |       |\n * |                                 | aaaa    | a.m., p.m.                        | 2     |\n * |                                 | aaaaa   | a, p                              |       |\n * | AM, PM, noon, midnight          | b..bb   | AM, PM, noon, midnight            |       |\n * |                                 | bbb     | am, pm, noon, midnight            |       |\n * |                                 | bbbb    | a.m., p.m., noon, midnight        | 2     |\n * |                                 | bbbbb   | a, p, n, mi                       |       |\n * | Flexible day period             | B..BBB  | at night, in the morning, ...     |       |\n * |                                 | BBBB    | at night, in the morning, ...     | 2     |\n * |                                 | BBBBB   | at night, in the morning, ...     |       |\n * | Hour [1-12]                     | h       | 1, 2, ..., 11, 12                 |       |\n * |                                 | ho      | 1st, 2nd, ..., 11th, 12th         | 7     |\n * |                                 | hh      | 01, 02, ..., 11, 12               |       |\n * | Hour [0-23]                     | H       | 0, 1, 2, ..., 23                  |       |\n * |                                 | Ho      | 0th, 1st, 2nd, ..., 23rd          | 7     |\n * |                                 | HH      | 00, 01, 02, ..., 23               |       |\n * | Hour [0-11]                     | K       | 1, 2, ..., 11, 0                  |       |\n * |                                 | Ko      | 1st, 2nd, ..., 11th, 0th          | 7     |\n * |                                 | KK      | 01, 02, ..., 11, 00               |       |\n * | Hour [1-24]                     | k       | 24, 1, 2, ..., 23                 |       |\n * |                                 | ko      | 24th, 1st, 2nd, ..., 23rd         | 7     |\n * |                                 | kk      | 24, 01, 02, ..., 23               |       |\n * | Minute                          | m       | 0, 1, ..., 59                     |       |\n * |                                 | mo      | 0th, 1st, ..., 59th               | 7     |\n * |                                 | mm      | 00, 01, ..., 59                   |       |\n * | Second                          | s       | 0, 1, ..., 59                     |       |\n * |                                 | so      | 0th, 1st, ..., 59th               | 7     |\n * |                                 | ss      | 00, 01, ..., 59                   |       |\n * | Fraction of second              | S       | 0, 1, ..., 9                      |       |\n * |                                 | SS      | 00, 01, ..., 99                   |       |\n * |                                 | SSS     | 000, 001, ..., 999                |       |\n * |                                 | SSSS    | ...                               | 3     |\n * | Timezone (ISO-8601 w/ Z)        | X       | -08, +0530, Z                     |       |\n * |                                 | XX      | -0800, +0530, Z                   |       |\n * |                                 | XXX     | -08:00, +05:30, Z                 |       |\n * |                                 | XXXX    | -0800, +0530, Z, +123456          | 2     |\n * |                                 | XXXXX   | -08:00, +05:30, Z, +12:34:56      |       |\n * | Timezone (ISO-8601 w/o Z)       | x       | -08, +0530, +00                   |       |\n * |                                 | xx      | -0800, +0530, +0000               |       |\n * |                                 | xxx     | -08:00, +05:30, +00:00            | 2     |\n * |                                 | xxxx    | -0800, +0530, +0000, +123456      |       |\n * |                                 | xxxxx   | -08:00, +05:30, +00:00, +12:34:56 |       |\n * | Timezone (GMT)                  | O...OOO | GMT-8, GMT+5:30, GMT+0            |       |\n * |                                 | OOOO    | GMT-08:00, GMT+05:30, GMT+00:00   | 2     |\n * | Timezone (specific non-locat.)  | z...zzz | GMT-8, GMT+5:30, GMT+0            | 6     |\n * |                                 | zzzz    | GMT-08:00, GMT+05:30, GMT+00:00   | 2,6   |\n * | Seconds timestamp               | t       | 512969520                         | 7     |\n * |                                 | tt      | ...                               | 3,7   |\n * | Milliseconds timestamp          | T       | 512969520900                      | 7     |\n * |                                 | TT      | ...                               | 3,7   |\n * | Long localized date             | P       | 04/29/1453                        | 7     |\n * |                                 | PP      | Apr 29, 1453                      | 7     |\n * |                                 | PPP     | April 29th, 1453                  | 7     |\n * |                                 | PPPP    | Friday, April 29th, 1453          | 2,7   |\n * | Long localized time             | p       | 12:00 AM                          | 7     |\n * |                                 | pp      | 12:00:00 AM                       | 7     |\n * |                                 | ppp     | 12:00:00 AM GMT+2                 | 7     |\n * |                                 | pppp    | 12:00:00 AM GMT+02:00             | 2,7   |\n * | Combination of date and time    | Pp      | 04/29/1453, 12:00 AM              | 7     |\n * |                                 | PPpp    | Apr 29, 1453, 12:00:00 AM         | 7     |\n * |                                 | PPPppp  | April 29th, 1453 at ...           | 7     |\n * |                                 | PPPPpppp| Friday, April 29th, 1453 at ...   | 2,7   |\n * Notes:\n * 1. \"Formatting\" units (e.g. formatting quarter) in the default en-US locale\n *    are the same as \"stand-alone\" units, but are different in some languages.\n *    \"Formatting\" units are declined according to the rules of the language\n *    in the context of a date. \"Stand-alone\" units are always nominative singular:\n *\n *    `format(new Date(2017, 10, 6), 'do LLLL', {locale: cs}) //=> '6. listopad'`\n *\n *    `format(new Date(2017, 10, 6), 'do MMMM', {locale: cs}) //=> '6. listopadu'`\n *\n * 2. Any sequence of the identical letters is a pattern, unless it is escaped by\n *    the single quote characters (see below).\n *    If the sequence is longer than listed in table (e.g. `EEEEEEEEEEE`)\n *    the output will be the same as default pattern for this unit, usually\n *    the longest one (in case of ISO weekdays, `EEEE`). Default patterns for units\n *    are marked with \"2\" in the last column of the table.\n *\n *    `format(new Date(2017, 10, 6), 'MMM') //=> 'Nov'`\n *\n *    `format(new Date(2017, 10, 6), 'MMMM') //=> 'November'`\n *\n *    `format(new Date(2017, 10, 6), 'MMMMM') //=> 'N'`\n *\n *    `format(new Date(2017, 10, 6), 'MMMMMM') //=> 'November'`\n *\n *    `format(new Date(2017, 10, 6), 'MMMMMMM') //=> 'November'`\n *\n * 3. Some patterns could be unlimited length (such as `yyyyyyyy`).\n *    The output will be padded with zeros to match the length of the pattern.\n *\n *    `format(new Date(2017, 10, 6), 'yyyyyyyy') //=> '00002017'`\n *\n * 4. `QQQQQ` and `qqqqq` could be not strictly numerical in some locales.\n *    These tokens represent the shortest form of the quarter.\n *\n * 5. The main difference between `y` and `u` patterns are B.C. years:\n *\n *    | Year | `y` | `u` |\n *    |------|-----|-----|\n *    | AC 1 |   1 |   1 |\n *    | BC 1 |   1 |   0 |\n *    | BC 2 |   2 |  -1 |\n *\n *    Also `yy` always returns the last two digits of a year,\n *    while `uu` pads single digit years to 2 characters and returns other years unchanged:\n *\n *    | Year | `yy` | `uu` |\n *    |------|------|------|\n *    | 1    |   01 |   01 |\n *    | 14   |   14 |   14 |\n *    | 376  |   76 |  376 |\n *    | 1453 |   53 | 1453 |\n *\n *    The same difference is true for local and ISO week-numbering years (`Y` and `R`),\n *    except local week-numbering years are dependent on `options.weekStartsOn`\n *    and `options.firstWeekContainsDate` (compare [getISOWeekYear](https://date-fns.org/docs/getISOWeekYear)\n *    and [getWeekYear](https://date-fns.org/docs/getWeekYear)).\n *\n * 6. Specific non-location timezones are currently unavailable in `date-fns`,\n *    so right now these tokens fall back to GMT timezones.\n *\n * 7. These patterns are not in the Unicode Technical Standard #35:\n *    - `i`: ISO day of week\n *    - `I`: ISO week of year\n *    - `R`: ISO week-numbering year\n *    - `t`: seconds timestamp\n *    - `T`: milliseconds timestamp\n *    - `o`: ordinal number modifier\n *    - `P`: long localized date\n *    - `p`: long localized time\n *\n * 8. `YY` and `YYYY` tokens represent week-numbering years but they are often confused with years.\n *    You should enable `options.useAdditionalWeekYearTokens` to use them. See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * 9. `D` and `DD` tokens represent days of the year but they are often confused with days of the month.\n *    You should enable `options.useAdditionalDayOfYearTokens` to use them. See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * @param date - The original date\n * @param format - The string of tokens\n * @param options - An object with options\n *\n * @returns The formatted date string\n *\n * @throws `date` must not be Invalid Date\n * @throws `options.locale` must contain `localize` property\n * @throws `options.locale` must contain `formatLong` property\n * @throws use `yyyy` instead of `YYYY` for formatting years using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws use `yy` instead of `YY` for formatting years using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws use `d` instead of `D` for formatting days of the month using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws use `dd` instead of `DD` for formatting days of the month using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws format string contains an unescaped latin alphabet character\n *\n * @example\n * // Represent 11 February 2014 in middle-endian format:\n * const result = format(new Date(2014, 1, 11), 'MM/dd/yyyy')\n * //=> '02/11/2014'\n *\n * @example\n * // Represent 2 July 2014 in Esperanto:\n * import { eoLocale } from 'date-fns/locale/eo'\n * const result = format(new Date(2014, 6, 2), \"do 'de' MMMM yyyy\", {\n *   locale: eoLocale\n * })\n * //=> '2-a de julio 2014'\n *\n * @example\n * // Escape string by single quote characters:\n * const result = format(new Date(2014, 6, 2, 15), \"h 'o''clock'\")\n * //=> \"3 o'clock\"\n */\nexport function format(date, formatStr, options) {\n  const defaultOptions = getDefaultOptions();\n  const locale = options?.locale ?? defaultOptions.locale ?? defaultLocale;\n\n  const firstWeekContainsDate =\n    options?.firstWeekContainsDate ??\n    options?.locale?.options?.firstWeekContainsDate ??\n    defaultOptions.firstWeekContainsDate ??\n    defaultOptions.locale?.options?.firstWeekContainsDate ??\n    1;\n\n  const weekStartsOn =\n    options?.weekStartsOn ??\n    options?.locale?.options?.weekStartsOn ??\n    defaultOptions.weekStartsOn ??\n    defaultOptions.locale?.options?.weekStartsOn ??\n    0;\n\n  const originalDate = toDate(date, options?.in);\n\n  if (!isValid(originalDate)) {\n    throw new RangeError(\"Invalid time value\");\n  }\n\n  let parts = formatStr\n    .match(longFormattingTokensRegExp)\n    .map((substring) => {\n      const firstCharacter = substring[0];\n      if (firstCharacter === \"p\" || firstCharacter === \"P\") {\n        const longFormatter = longFormatters[firstCharacter];\n        return longFormatter(substring, locale.formatLong);\n      }\n      return substring;\n    })\n    .join(\"\")\n    .match(formattingTokensRegExp)\n    .map((substring) => {\n      // Replace two single quote characters with one single quote character\n      if (substring === \"''\") {\n        return { isToken: false, value: \"'\" };\n      }\n\n      const firstCharacter = substring[0];\n      if (firstCharacter === \"'\") {\n        return { isToken: false, value: cleanEscapedString(substring) };\n      }\n\n      if (formatters[firstCharacter]) {\n        return { isToken: true, value: substring };\n      }\n\n      if (firstCharacter.match(unescapedLatinCharacterRegExp)) {\n        throw new RangeError(\n          \"Format string contains an unescaped latin alphabet character `\" +\n            firstCharacter +\n            \"`\",\n        );\n      }\n\n      return { isToken: false, value: substring };\n    });\n\n  // invoke localize preprocessor (only for french locales at the moment)\n  if (locale.localize.preprocessor) {\n    parts = locale.localize.preprocessor(originalDate, parts);\n  }\n\n  const formatterOptions = {\n    firstWeekContainsDate,\n    weekStartsOn,\n    locale,\n  };\n\n  return parts\n    .map((part) => {\n      if (!part.isToken) return part.value;\n\n      const token = part.value;\n\n      if (\n        (!options?.useAdditionalWeekYearTokens &&\n          isProtectedWeekYearToken(token)) ||\n        (!options?.useAdditionalDayOfYearTokens &&\n          isProtectedDayOfYearToken(token))\n      ) {\n        warnOrThrowProtectedError(token, formatStr, String(date));\n      }\n\n      const formatter = formatters[token[0]];\n      return formatter(originalDate, token, locale.localize, formatterOptions);\n    })\n    .join(\"\");\n}\n\nfunction cleanEscapedString(input) {\n  const matched = input.match(escapedStringRegExp);\n\n  if (!matched) {\n    return input;\n  }\n\n  return matched[1].replace(doubleQuoteRegExp, \"'\");\n}\n\n// Fallback for modularized imports:\nexport default format;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getDay} function options.\n */\n\n/**\n * @name getDay\n * @category Weekday Helpers\n * @summary Get the day of the week of the given date.\n *\n * @description\n * Get the day of the week of the given date.\n *\n * @param date - The given date\n * @param options - The options\n *\n * @returns The day of week, 0 represents Sunday\n *\n * @example\n * // Which day of the week is 29 February 2012?\n * const result = getDay(new Date(2012, 1, 29))\n * //=> 3\n */\nexport function getDay(date, options) {\n  return toDate(date, options?.in).getDay();\n}\n\n// Fallback for modularized imports:\nexport default getDay;\n","import { constructFrom } from \"./constructFrom.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getDaysInMonth} function options.\n */\n\n/**\n * @name getDaysInMonth\n * @category Month Helpers\n * @summary Get the number of days in a month of the given date.\n *\n * @description\n * Get the number of days in a month of the given date, considering the context if provided.\n *\n * @param date - The given date\n * @param options - An object with options\n *\n * @returns The number of days in a month\n *\n * @example\n * // How many days are in February 2000?\n * const result = getDaysInMonth(new Date(2000, 1))\n * //=> 29\n */\nexport function getDaysInMonth(date, options) {\n  const _date = toDate(date, options?.in);\n  const year = _date.getFullYear();\n  const monthIndex = _date.getMonth();\n  const lastDayOfMonth = constructFrom(_date, 0);\n  lastDayOfMonth.setFullYear(year, monthIndex + 1, 0);\n  lastDayOfMonth.setHours(0, 0, 0, 0);\n  return lastDayOfMonth.getDate();\n}\n\n// Fallback for modularized imports:\nexport default getDaysInMonth;\n","import { getDefaultOptions as getInternalDefaultOptions } from \"./_lib/defaultOptions.js\";\n\n/**\n * @name getDefaultOptions\n * @category Common Helpers\n * @summary Get default options.\n * @pure false\n *\n * @description\n * Returns an object that contains defaults for\n * `options.locale`, `options.weekStartsOn` and `options.firstWeekContainsDate`\n * arguments for all functions.\n *\n * You can change these with [setDefaultOptions](https://date-fns.org/docs/setDefaultOptions).\n *\n * @returns The default options\n *\n * @example\n * const result = getDefaultOptions()\n * //=> {}\n *\n * @example\n * setDefaultOptions({ weekStarsOn: 1, firstWeekContainsDate: 4 })\n * const result = getDefaultOptions()\n * //=> { weekStarsOn: 1, firstWeekContainsDate: 4 }\n */\nexport function getDefaultOptions() {\n  return Object.assign({}, getInternalDefaultOptions());\n}\n\n// Fallback for modularized imports:\nexport default getDefaultOptions;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getHours} function options.\n */\n\n/**\n * @name getHours\n * @category Hour Helpers\n * @summary Get the hours of the given date.\n *\n * @description\n * Get the hours of the given date.\n *\n * @param date - The given date\n * @param options - An object with options\n *\n * @returns The hours\n *\n * @example\n * // Get the hours of 29 February 2012 11:45:00:\n * const result = getHours(new Date(2012, 1, 29, 11, 45))\n * //=> 11\n */\nexport function getHours(date, options) {\n  return toDate(date, options?.in).getHours();\n}\n\n// Fallback for modularized imports:\nexport default getHours;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getISODay} function options.\n */\n\n/**\n * @name getISODay\n * @category Weekday Helpers\n * @summary Get the day of the ISO week of the given date.\n *\n * @description\n * Get the day of the ISO week of the given date,\n * which is 7 for Sunday, 1 for Monday etc.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @param date - The given date\n * @param options - An object with options\n *\n * @returns The day of ISO week\n *\n * @example\n * // Which day of the ISO week is 26 February 2012?\n * const result = getISODay(new Date(2012, 1, 26))\n * //=> 7\n */\nexport function getISODay(date, options) {\n  const day = toDate(date, options?.in).getDay();\n  return day === 0 ? 7 : day;\n}\n\n// Fallback for modularized imports:\nexport default getISODay;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getMinutes} function options.\n */\n\n/**\n * @name getMinutes\n * @category Minute Helpers\n * @summary Get the minutes of the given date.\n *\n * @description\n * Get the minutes of the given date.\n *\n * @param date - The given date\n * @param options - The options\n *\n * @returns The minutes\n *\n * @example\n * // Get the minutes of 29 February 2012 11:45:05:\n * const result = getMinutes(new Date(2012, 1, 29, 11, 45, 5))\n * //=> 45\n */\nexport function getMinutes(date, options) {\n  return toDate(date, options?.in).getMinutes();\n}\n\n// Fallback for modularized imports:\nexport default getMinutes;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getMonth} function options.\n */\n\n/**\n * @name getMonth\n * @category Month Helpers\n * @summary Get the month of the given date.\n *\n * @description\n * Get the month of the given date.\n *\n * @param date - The given date\n * @param options - An object with options\n *\n * @returns The month index (0-11)\n *\n * @example\n * // Which month is 29 February 2012?\n * const result = getMonth(new Date(2012, 1, 29))\n * //=> 1\n */\nexport function getMonth(date, options) {\n  return toDate(date, options?.in).getMonth();\n}\n\n// Fallback for modularized imports:\nexport default getMonth;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * @name getSeconds\n * @category Second Helpers\n * @summary Get the seconds of the given date.\n *\n * @description\n * Get the seconds of the given date.\n *\n * @param date - The given date\n *\n * @returns The seconds\n *\n * @example\n * // Get the seconds of 29 February 2012 11:45:05.123:\n * const result = getSeconds(new Date(2012, 1, 29, 11, 45, 5, 123))\n * //=> 5\n */\nexport function getSeconds(date) {\n  return toDate(date).getSeconds();\n}\n\n// Fallback for modularized imports:\nexport default getSeconds;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getYear} function options.\n */\n\n/**\n * @name getYear\n * @category Year Helpers\n * @summary Get the year of the given date.\n *\n * @description\n * Get the year of the given date.\n *\n * @param date - The given date\n * @param options - An object with options\n *\n * @returns The year\n *\n * @example\n * // Which year is 2 July 2014?\n * const result = getYear(new Date(2014, 6, 2))\n * //=> 2014\n */\nexport function getYear(date, options) {\n  return toDate(date, options?.in).getFullYear();\n}\n\n// Fallback for modularized imports:\nexport default getYear;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * @name isAfter\n * @category Common Helpers\n * @summary Is the first date after the second one?\n *\n * @description\n * Is the first date after the second one?\n *\n * @param date - The date that should be after the other one to return true\n * @param dateToCompare - The date to compare with\n *\n * @returns The first date is after the second date\n *\n * @example\n * // Is 10 July 1989 after 11 February 1987?\n * const result = isAfter(new Date(1989, 6, 10), new Date(1987, 1, 11))\n * //=> true\n */\nexport function isAfter(date, dateToCompare) {\n  return +toDate(date) > +toDate(dateToCompare);\n}\n\n// Fallback for modularized imports:\nexport default isAfter;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * @name isBefore\n * @category Common Helpers\n * @summary Is the first date before the second one?\n *\n * @description\n * Is the first date before the second one?\n *\n * @param date - The date that should be before the other one to return true\n * @param dateToCompare - The date to compare with\n *\n * @returns The first date is before the second date\n *\n * @example\n * // Is 10 July 1989 before 11 February 1987?\n * const result = isBefore(new Date(1989, 6, 10), new Date(1987, 1, 11))\n * //=> false\n */\nexport function isBefore(date, dateToCompare) {\n  return +toDate(date) < +toDate(dateToCompare);\n}\n\n// Fallback for modularized imports:\nexport default isBefore;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * @name isEqual\n * @category Common Helpers\n * @summary Are the given dates equal?\n *\n * @description\n * Are the given dates equal?\n *\n * @param dateLeft - The first date to compare\n * @param dateRight - The second date to compare\n *\n * @returns The dates are equal\n *\n * @example\n * // Are 2 July 2014 06:30:45.000 and 2 July 2014 06:30:45.500 equal?\n * const result = isEqual(\n *   new Date(2014, 6, 2, 6, 30, 45, 0),\n *   new Date(2014, 6, 2, 6, 30, 45, 500)\n * )\n * //=> false\n */\nexport function isEqual(leftDate, rightDate) {\n  return +toDate(leftDate) === +toDate(rightDate);\n}\n\n// Fallback for modularized imports:\nexport default isEqual;\n","import { constructFrom } from \"./constructFrom.js\";\n\n/**\n * @name transpose\n * @category Generic Helpers\n * @summary Transpose the date to the given constructor.\n *\n * @description\n * The function transposes the date to the given constructor. It helps you\n * to transpose the date in the system time zone to say `UTCDate` or any other\n * date extension.\n *\n * @typeParam InputDate - The input `Date` type derived from the passed argument.\n * @typeParam ResultDate - The result `Date` type derived from the passed constructor.\n *\n * @param date - The date to use values from\n * @param constructor - The date constructor to use\n *\n * @returns Date transposed to the given constructor\n *\n * @example\n * // Create July 10, 2022 00:00 in locale time zone\n * const date = new Date(2022, 6, 10)\n * //=> 'Sun Jul 10 2022 00:00:00 GMT+0800 (Singapore Standard Time)'\n *\n * @example\n * // Transpose the date to July 10, 2022 00:00 in UTC\n * transpose(date, UTCDate)\n * //=> 'Sun Jul 10 2022 00:00:00 GMT+0000 (Coordinated Universal Time)'\n */\nexport function transpose(date, constructor) {\n  const date_ = isConstructor(constructor)\n    ? new constructor(0)\n    : constructFrom(constructor, 0);\n  date_.setFullYear(date.getFullYear(), date.getMonth(), date.getDate());\n  date_.setHours(\n    date.getHours(),\n    date.getMinutes(),\n    date.getSeconds(),\n    date.getMilliseconds(),\n  );\n  return date_;\n}\n\nfunction isConstructor(constructor) {\n  return (\n    typeof constructor === \"function\" &&\n    constructor.prototype?.constructor === constructor\n  );\n}\n\n// Fallback for modularized imports:\nexport default transpose;\n","import { constructFrom } from \"../../constructFrom.js\";\nimport { transpose } from \"../../transpose.js\";\n\nconst TIMEZONE_UNIT_PRIORITY = 10;\n\nexport class Setter {\n  subPriority = 0;\n\n  validate(_utcDate, _options) {\n    return true;\n  }\n}\n\nexport class ValueSetter extends Setter {\n  constructor(\n    value,\n    validateValue,\n\n    setValue,\n\n    priority,\n    subPriority,\n  ) {\n    super();\n    this.value = value;\n    this.validateValue = validateValue;\n    this.setValue = setValue;\n    this.priority = priority;\n    if (subPriority) {\n      this.subPriority = subPriority;\n    }\n  }\n\n  validate(date, options) {\n    return this.validateValue(date, this.value, options);\n  }\n\n  set(date, flags, options) {\n    return this.setValue(date, flags, this.value, options);\n  }\n}\n\nexport class DateTimezoneSetter extends Setter {\n  priority = TIMEZONE_UNIT_PRIORITY;\n  subPriority = -1;\n\n  constructor(context, reference) {\n    super();\n    this.context = context || ((date) => constructFrom(reference, date));\n  }\n\n  set(date, flags) {\n    if (flags.timestampIsSet) return date;\n    return constructFrom(date, transpose(date, this.context));\n  }\n}\n","import { ValueSetter } from \"./Setter.js\";\n\nexport class Parser {\n  run(dateString, token, match, options) {\n    const result = this.parse(dateString, token, match, options);\n    if (!result) {\n      return null;\n    }\n\n    return {\n      setter: new ValueSetter(\n        result.value,\n        this.validate,\n        this.set,\n        this.priority,\n        this.subPriority,\n      ),\n      rest: result.rest,\n    };\n  }\n\n  validate(_utcDate, _value, _options) {\n    return true;\n  }\n}\n","import { Parser } from \"../Parser.js\";\n\nexport class EraParser extends Parser {\n  priority = 140;\n\n  parse(dateString, token, match) {\n    switch (token) {\n      // AD, BC\n      case \"G\":\n      case \"GG\":\n      case \"GGG\":\n        return (\n          match.era(dateString, { width: \"abbreviated\" }) ||\n          match.era(dateString, { width: \"narrow\" })\n        );\n\n      // A, B\n      case \"GGGGG\":\n        return match.era(dateString, { width: \"narrow\" });\n      // Anno Domini, Before Christ\n      case \"GGGG\":\n      default:\n        return (\n          match.era(dateString, { width: \"wide\" }) ||\n          match.era(dateString, { width: \"abbreviated\" }) ||\n          match.era(dateString, { width: \"narrow\" })\n        );\n    }\n  }\n\n  set(date, flags, value) {\n    flags.era = value;\n    date.setFullYear(value, 0, 1);\n    date.setHours(0, 0, 0, 0);\n    return date;\n  }\n\n  incompatibleTokens = [\"R\", \"u\", \"t\", \"T\"];\n}\n","export const numericPatterns = {\n  month: /^(1[0-2]|0?\\d)/, // 0 to 12\n  date: /^(3[0-1]|[0-2]?\\d)/, // 0 to 31\n  dayOfYear: /^(36[0-6]|3[0-5]\\d|[0-2]?\\d?\\d)/, // 0 to 366\n  week: /^(5[0-3]|[0-4]?\\d)/, // 0 to 53\n  hour23h: /^(2[0-3]|[0-1]?\\d)/, // 0 to 23\n  hour24h: /^(2[0-4]|[0-1]?\\d)/, // 0 to 24\n  hour11h: /^(1[0-1]|0?\\d)/, // 0 to 11\n  hour12h: /^(1[0-2]|0?\\d)/, // 0 to 12\n  minute: /^[0-5]?\\d/, // 0 to 59\n  second: /^[0-5]?\\d/, // 0 to 59\n\n  singleDigit: /^\\d/, // 0 to 9\n  twoDigits: /^\\d{1,2}/, // 0 to 99\n  threeDigits: /^\\d{1,3}/, // 0 to 999\n  fourDigits: /^\\d{1,4}/, // 0 to 9999\n\n  anyDigitsSigned: /^-?\\d+/,\n  singleDigitSigned: /^-?\\d/, // 0 to 9, -0 to -9\n  twoDigitsSigned: /^-?\\d{1,2}/, // 0 to 99, -0 to -99\n  threeDigitsSigned: /^-?\\d{1,3}/, // 0 to 999, -0 to -999\n  fourDigitsSigned: /^-?\\d{1,4}/, // 0 to 9999, -0 to -9999\n};\n\nexport const timezonePatterns = {\n  basicOptionalMinutes: /^([+-])(\\d{2})(\\d{2})?|Z/,\n  basic: /^([+-])(\\d{2})(\\d{2})|Z/,\n  basicOptionalSeconds: /^([+-])(\\d{2})(\\d{2})((\\d{2}))?|Z/,\n  extended: /^([+-])(\\d{2}):(\\d{2})|Z/,\n  extendedOptionalSeconds: /^([+-])(\\d{2}):(\\d{2})(:(\\d{2}))?|Z/,\n};\n","import {\n  millisecondsInHour,\n  millisecondsInMinute,\n  millisecondsInSecond,\n} from \"../../constants.js\";\n\nimport { numericPatterns } from \"./constants.js\";\n\nexport function mapValue(parseFnResult, mapFn) {\n  if (!parseFnResult) {\n    return parseFnResult;\n  }\n\n  return {\n    value: mapFn(parseFnResult.value),\n    rest: parseFnResult.rest,\n  };\n}\n\nexport function parseNumericPattern(pattern, dateString) {\n  const matchResult = dateString.match(pattern);\n\n  if (!matchResult) {\n    return null;\n  }\n\n  return {\n    value: parseInt(matchResult[0], 10),\n    rest: dateString.slice(matchResult[0].length),\n  };\n}\n\nexport function parseTimezonePattern(pattern, dateString) {\n  const matchResult = dateString.match(pattern);\n\n  if (!matchResult) {\n    return null;\n  }\n\n  // Input is 'Z'\n  if (matchResult[0] === \"Z\") {\n    return {\n      value: 0,\n      rest: dateString.slice(1),\n    };\n  }\n\n  const sign = matchResult[1] === \"+\" ? 1 : -1;\n  const hours = matchResult[2] ? parseInt(matchResult[2], 10) : 0;\n  const minutes = matchResult[3] ? parseInt(matchResult[3], 10) : 0;\n  const seconds = matchResult[5] ? parseInt(matchResult[5], 10) : 0;\n\n  return {\n    value:\n      sign *\n      (hours * millisecondsInHour +\n        minutes * millisecondsInMinute +\n        seconds * millisecondsInSecond),\n    rest: dateString.slice(matchResult[0].length),\n  };\n}\n\nexport function parseAnyDigitsSigned(dateString) {\n  return parseNumericPattern(numericPatterns.anyDigitsSigned, dateString);\n}\n\nexport function parseNDigits(n, dateString) {\n  switch (n) {\n    case 1:\n      return parseNumericPattern(numericPatterns.singleDigit, dateString);\n    case 2:\n      return parseNumericPattern(numericPatterns.twoDigits, dateString);\n    case 3:\n      return parseNumericPattern(numericPatterns.threeDigits, dateString);\n    case 4:\n      return parseNumericPattern(numericPatterns.fourDigits, dateString);\n    default:\n      return parseNumericPattern(new RegExp(\"^\\\\d{1,\" + n + \"}\"), dateString);\n  }\n}\n\nexport function parseNDigitsSigned(n, dateString) {\n  switch (n) {\n    case 1:\n      return parseNumericPattern(numericPatterns.singleDigitSigned, dateString);\n    case 2:\n      return parseNumericPattern(numericPatterns.twoDigitsSigned, dateString);\n    case 3:\n      return parseNumericPattern(numericPatterns.threeDigitsSigned, dateString);\n    case 4:\n      return parseNumericPattern(numericPatterns.fourDigitsSigned, dateString);\n    default:\n      return parseNumericPattern(new RegExp(\"^-?\\\\d{1,\" + n + \"}\"), dateString);\n  }\n}\n\nexport function dayPeriodEnumToHours(dayPeriod) {\n  switch (dayPeriod) {\n    case \"morning\":\n      return 4;\n    case \"evening\":\n      return 17;\n    case \"pm\":\n    case \"noon\":\n    case \"afternoon\":\n      return 12;\n    case \"am\":\n    case \"midnight\":\n    case \"night\":\n    default:\n      return 0;\n  }\n}\n\nexport function normalizeTwoDigitYear(twoDigitYear, currentYear) {\n  const isCommonEra = currentYear > 0;\n  // Absolute number of the current year:\n  // 1 -> 1 AC\n  // 0 -> 1 BC\n  // -1 -> 2 BC\n  const absCurrentYear = isCommonEra ? currentYear : 1 - currentYear;\n\n  let result;\n  if (absCurrentYear <= 50) {\n    result = twoDigitYear || 100;\n  } else {\n    const rangeEnd = absCurrentYear + 50;\n    const rangeEndCentury = Math.trunc(rangeEnd / 100) * 100;\n    const isPreviousCentury = twoDigitYear >= rangeEnd % 100;\n    result = twoDigitYear + rangeEndCentury - (isPreviousCentury ? 100 : 0);\n  }\n\n  return isCommonEra ? result : 1 - result;\n}\n\nexport function isLeapYearIndex(year) {\n  return year % 400 === 0 || (year % 4 === 0 && year % 100 !== 0);\n}\n","import { Parser } from \"../Parser.js\";\n\nimport { mapValue, normalizeTwoDigitYear, parseNDigits } from \"../utils.js\";\n\n// From http://www.unicode.org/reports/tr35/tr35-31/tr35-dates.html#Date_Format_Patterns\n// | Year     |     y | yy |   yyy |  yyyy | yyyyy |\n// |----------|-------|----|-------|-------|-------|\n// | AD 1     |     1 | 01 |   001 |  0001 | 00001 |\n// | AD 12    |    12 | 12 |   012 |  0012 | 00012 |\n// | AD 123   |   123 | 23 |   123 |  0123 | 00123 |\n// | AD 1234  |  1234 | 34 |  1234 |  1234 | 01234 |\n// | AD 12345 | 12345 | 45 | 12345 | 12345 | 12345 |\nexport class YearParser extends Parser {\n  priority = 130;\n  incompatibleTokens = [\"Y\", \"R\", \"u\", \"w\", \"I\", \"i\", \"e\", \"c\", \"t\", \"T\"];\n\n  parse(dateString, token, match) {\n    const valueCallback = (year) => ({\n      year,\n      isTwoDigitYear: token === \"yy\",\n    });\n\n    switch (token) {\n      case \"y\":\n        return mapValue(parseNDigits(4, dateString), valueCallback);\n      case \"yo\":\n        return mapValue(\n          match.ordinalNumber(dateString, {\n            unit: \"year\",\n          }),\n          valueCallback,\n        );\n      default:\n        return mapValue(parseNDigits(token.length, dateString), valueCallback);\n    }\n  }\n\n  validate(_date, value) {\n    return value.isTwoDigitYear || value.year > 0;\n  }\n\n  set(date, flags, value) {\n    const currentYear = date.getFullYear();\n\n    if (value.isTwoDigitYear) {\n      const normalizedTwoDigitYear = normalizeTwoDigitYear(\n        value.year,\n        currentYear,\n      );\n      date.setFullYear(normalizedTwoDigitYear, 0, 1);\n      date.setHours(0, 0, 0, 0);\n      return date;\n    }\n\n    const year =\n      !(\"era\" in flags) || flags.era === 1 ? value.year : 1 - value.year;\n    date.setFullYear(year, 0, 1);\n    date.setHours(0, 0, 0, 0);\n    return date;\n  }\n}\n","import { getWeekYear } from \"../../../getWeekYear.js\";\n\nimport { startOfWeek } from \"../../../startOfWeek.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { mapValue, normalizeTwoDigitYear, parseNDigits } from \"../utils.js\";\n\n// Local week-numbering year\nexport class LocalWeekYearParser extends Parser {\n  priority = 130;\n\n  parse(dateString, token, match) {\n    const valueCallback = (year) => ({\n      year,\n      isTwoDigitYear: token === \"YY\",\n    });\n\n    switch (token) {\n      case \"Y\":\n        return mapValue(parseNDigits(4, dateString), valueCallback);\n      case \"Yo\":\n        return mapValue(\n          match.ordinalNumber(dateString, {\n            unit: \"year\",\n          }),\n          valueCallback,\n        );\n      default:\n        return mapValue(parseNDigits(token.length, dateString), valueCallback);\n    }\n  }\n\n  validate(_date, value) {\n    return value.isTwoDigitYear || value.year > 0;\n  }\n\n  set(date, flags, value, options) {\n    const currentYear = getWeekYear(date, options);\n\n    if (value.isTwoDigitYear) {\n      const normalizedTwoDigitYear = normalizeTwoDigitYear(\n        value.year,\n        currentYear,\n      );\n      date.setFullYear(\n        normalizedTwoDigitYear,\n        0,\n        options.firstWeekContainsDate,\n      );\n      date.setHours(0, 0, 0, 0);\n      return startOfWeek(date, options);\n    }\n\n    const year =\n      !(\"era\" in flags) || flags.era === 1 ? value.year : 1 - value.year;\n    date.setFullYear(year, 0, options.firstWeekContainsDate);\n    date.setHours(0, 0, 0, 0);\n    return startOfWeek(date, options);\n  }\n\n  incompatibleTokens = [\n    \"y\",\n    \"R\",\n    \"u\",\n    \"Q\",\n    \"q\",\n    \"M\",\n    \"L\",\n    \"I\",\n    \"d\",\n    \"D\",\n    \"i\",\n    \"t\",\n    \"T\",\n  ];\n}\n","import { startOfISOWeek } from \"../../../startOfISOWeek.js\";\nimport { constructFrom } from \"../../../constructFrom.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseNDigitsSigned } from \"../utils.js\";\n\n// ISO week-numbering year\nexport class ISOWeekYearParser extends Parser {\n  priority = 130;\n\n  parse(dateString, token) {\n    if (token === \"R\") {\n      return parseNDigitsSigned(4, dateString);\n    }\n\n    return parseNDigitsSigned(token.length, dateString);\n  }\n\n  set(date, _flags, value) {\n    const firstWeekOfYear = constructFrom(date, 0);\n    firstWeekOfYear.setFullYear(value, 0, 4);\n    firstWeekOfYear.setHours(0, 0, 0, 0);\n    return startOfISOWeek(firstWeekOfYear);\n  }\n\n  incompatibleTokens = [\n    \"G\",\n    \"y\",\n    \"Y\",\n    \"u\",\n    \"Q\",\n    \"q\",\n    \"M\",\n    \"L\",\n    \"w\",\n    \"d\",\n    \"D\",\n    \"e\",\n    \"c\",\n    \"t\",\n    \"T\",\n  ];\n}\n","import { Parser } from \"../Parser.js\";\n\nimport { parseNDigitsSigned } from \"../utils.js\";\n\nexport class ExtendedYearParser extends Parser {\n  priority = 130;\n\n  parse(dateString, token) {\n    if (token === \"u\") {\n      return parseNDigitsSigned(4, dateString);\n    }\n\n    return parseNDigitsSigned(token.length, dateString);\n  }\n\n  set(date, _flags, value) {\n    date.setFullYear(value, 0, 1);\n    date.setHours(0, 0, 0, 0);\n    return date;\n  }\n\n  incompatibleTokens = [\"G\", \"y\", \"Y\", \"R\", \"w\", \"I\", \"i\", \"e\", \"c\", \"t\", \"T\"];\n}\n","import { Parser } from \"../Parser.js\";\n\nimport { parseNDigits } from \"../utils.js\";\n\nexport class QuarterParser extends Parser {\n  priority = 120;\n\n  parse(dateString, token, match) {\n    switch (token) {\n      // 1, 2, 3, 4\n      case \"Q\":\n      case \"QQ\": // 01, 02, 03, 04\n        return parseNDigits(token.length, dateString);\n      // 1st, 2nd, 3rd, 4th\n      case \"Qo\":\n        return match.ordinalNumber(dateString, { unit: \"quarter\" });\n      // Q1, Q2, Q3, Q4\n      case \"QQQ\":\n        return (\n          match.quarter(dateString, {\n            width: \"abbreviated\",\n            context: \"formatting\",\n          }) ||\n          match.quarter(dateString, {\n            width: \"narrow\",\n            context: \"formatting\",\n          })\n        );\n\n      // 1, 2, 3, 4 (narrow quarter; could be not numerical)\n      case \"QQQQQ\":\n        return match.quarter(dateString, {\n          width: \"narrow\",\n          context: \"formatting\",\n        });\n      // 1st quarter, 2nd quarter, ...\n      case \"QQQQ\":\n      default:\n        return (\n          match.quarter(dateString, {\n            width: \"wide\",\n            context: \"formatting\",\n          }) ||\n          match.quarter(dateString, {\n            width: \"abbreviated\",\n            context: \"formatting\",\n          }) ||\n          match.quarter(dateString, {\n            width: \"narrow\",\n            context: \"formatting\",\n          })\n        );\n    }\n  }\n\n  validate(_date, value) {\n    return value >= 1 && value <= 4;\n  }\n\n  set(date, _flags, value) {\n    date.setMonth((value - 1) * 3, 1);\n    date.setHours(0, 0, 0, 0);\n    return date;\n  }\n\n  incompatibleTokens = [\n    \"Y\",\n    \"R\",\n    \"q\",\n    \"M\",\n    \"L\",\n    \"w\",\n    \"I\",\n    \"d\",\n    \"D\",\n    \"i\",\n    \"e\",\n    \"c\",\n    \"t\",\n    \"T\",\n  ];\n}\n","import { Parser } from \"../Parser.js\";\n\nimport { parseNDigits } from \"../utils.js\";\n\nexport class StandAloneQuarterParser extends Parser {\n  priority = 120;\n\n  parse(dateString, token, match) {\n    switch (token) {\n      // 1, 2, 3, 4\n      case \"q\":\n      case \"qq\": // 01, 02, 03, 04\n        return parseNDigits(token.length, dateString);\n      // 1st, 2nd, 3rd, 4th\n      case \"qo\":\n        return match.ordinalNumber(dateString, { unit: \"quarter\" });\n      // Q1, Q2, Q3, Q4\n      case \"qqq\":\n        return (\n          match.quarter(dateString, {\n            width: \"abbreviated\",\n            context: \"standalone\",\n          }) ||\n          match.quarter(dateString, {\n            width: \"narrow\",\n            context: \"standalone\",\n          })\n        );\n\n      // 1, 2, 3, 4 (narrow quarter; could be not numerical)\n      case \"qqqqq\":\n        return match.quarter(dateString, {\n          width: \"narrow\",\n          context: \"standalone\",\n        });\n      // 1st quarter, 2nd quarter, ...\n      case \"qqqq\":\n      default:\n        return (\n          match.quarter(dateString, {\n            width: \"wide\",\n            context: \"standalone\",\n          }) ||\n          match.quarter(dateString, {\n            width: \"abbreviated\",\n            context: \"standalone\",\n          }) ||\n          match.quarter(dateString, {\n            width: \"narrow\",\n            context: \"standalone\",\n          })\n        );\n    }\n  }\n\n  validate(_date, value) {\n    return value >= 1 && value <= 4;\n  }\n\n  set(date, _flags, value) {\n    date.setMonth((value - 1) * 3, 1);\n    date.setHours(0, 0, 0, 0);\n    return date;\n  }\n\n  incompatibleTokens = [\n    \"Y\",\n    \"R\",\n    \"Q\",\n    \"M\",\n    \"L\",\n    \"w\",\n    \"I\",\n    \"d\",\n    \"D\",\n    \"i\",\n    \"e\",\n    \"c\",\n    \"t\",\n    \"T\",\n  ];\n}\n","import { numericPatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { mapValue, parseNDigits, parseNumericPattern } from \"../utils.js\";\n\nexport class MonthParser extends Parser {\n  incompatibleTokens = [\n    \"Y\",\n    \"R\",\n    \"q\",\n    \"Q\",\n    \"L\",\n    \"w\",\n    \"I\",\n    \"D\",\n    \"i\",\n    \"e\",\n    \"c\",\n    \"t\",\n    \"T\",\n  ];\n\n  priority = 110;\n\n  parse(dateString, token, match) {\n    const valueCallback = (value) => value - 1;\n\n    switch (token) {\n      // 1, 2, ..., 12\n      case \"M\":\n        return mapValue(\n          parseNumericPattern(numericPatterns.month, dateString),\n          valueCallback,\n        );\n      // 01, 02, ..., 12\n      case \"MM\":\n        return mapValue(parseNDigits(2, dateString), valueCallback);\n      // 1st, 2nd, ..., 12th\n      case \"Mo\":\n        return mapValue(\n          match.ordinalNumber(dateString, {\n            unit: \"month\",\n          }),\n          valueCallback,\n        );\n      // Jan, Feb, ..., Dec\n      case \"MMM\":\n        return (\n          match.month(dateString, {\n            width: \"abbreviated\",\n            context: \"formatting\",\n          }) ||\n          match.month(dateString, { width: \"narrow\", context: \"formatting\" })\n        );\n\n      // J, F, ..., D\n      case \"MMMMM\":\n        return match.month(dateString, {\n          width: \"narrow\",\n          context: \"formatting\",\n        });\n      // January, February, ..., December\n      case \"MMMM\":\n      default:\n        return (\n          match.month(dateString, { width: \"wide\", context: \"formatting\" }) ||\n          match.month(dateString, {\n            width: \"abbreviated\",\n            context: \"formatting\",\n          }) ||\n          match.month(dateString, { width: \"narrow\", context: \"formatting\" })\n        );\n    }\n  }\n\n  validate(_date, value) {\n    return value >= 0 && value <= 11;\n  }\n\n  set(date, _flags, value) {\n    date.setMonth(value, 1);\n    date.setHours(0, 0, 0, 0);\n    return date;\n  }\n}\n","import { numericPatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { mapValue, parseNDigits, parseNumericPattern } from \"../utils.js\";\n\nexport class StandAloneMonthParser extends Parser {\n  priority = 110;\n\n  parse(dateString, token, match) {\n    const valueCallback = (value) => value - 1;\n\n    switch (token) {\n      // 1, 2, ..., 12\n      case \"L\":\n        return mapValue(\n          parseNumericPattern(numericPatterns.month, dateString),\n          valueCallback,\n        );\n      // 01, 02, ..., 12\n      case \"LL\":\n        return mapValue(parseNDigits(2, dateString), valueCallback);\n      // 1st, 2nd, ..., 12th\n      case \"Lo\":\n        return mapValue(\n          match.ordinalNumber(dateString, {\n            unit: \"month\",\n          }),\n          valueCallback,\n        );\n      // Jan, Feb, ..., Dec\n      case \"LLL\":\n        return (\n          match.month(dateString, {\n            width: \"abbreviated\",\n            context: \"standalone\",\n          }) ||\n          match.month(dateString, { width: \"narrow\", context: \"standalone\" })\n        );\n\n      // J, F, ..., D\n      case \"LLLLL\":\n        return match.month(dateString, {\n          width: \"narrow\",\n          context: \"standalone\",\n        });\n      // January, February, ..., December\n      case \"LLLL\":\n      default:\n        return (\n          match.month(dateString, { width: \"wide\", context: \"standalone\" }) ||\n          match.month(dateString, {\n            width: \"abbreviated\",\n            context: \"standalone\",\n          }) ||\n          match.month(dateString, { width: \"narrow\", context: \"standalone\" })\n        );\n    }\n  }\n\n  validate(_date, value) {\n    return value >= 0 && value <= 11;\n  }\n\n  set(date, _flags, value) {\n    date.setMonth(value, 1);\n    date.setHours(0, 0, 0, 0);\n    return date;\n  }\n\n  incompatibleTokens = [\n    \"Y\",\n    \"R\",\n    \"q\",\n    \"Q\",\n    \"M\",\n    \"w\",\n    \"I\",\n    \"D\",\n    \"i\",\n    \"e\",\n    \"c\",\n    \"t\",\n    \"T\",\n  ];\n}\n","import { getWeek } from \"./getWeek.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link setWeek} function options.\n */\n\n/**\n * @name setWeek\n * @category Week Helpers\n * @summary Set the local week to the given date.\n *\n * @description\n * Set the local week to the given date, saving the weekday number.\n * The exact calculation depends on the values of\n * `options.weekStartsOn` (which is the index of the first day of the week)\n * and `options.firstWeekContainsDate` (which is the day of January, which is always in\n * the first week of the week-numbering year)\n *\n * Week numbering: https://en.wikipedia.org/wiki/Week#The_ISO_week_date_system\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param week - The week of the new date\n * @param options - An object with options\n *\n * @returns The new date with the local week set\n *\n * @example\n * // Set the 1st week to 2 January 2005 with default options:\n * const result = setWeek(new Date(2005, 0, 2), 1)\n * //=> Sun Dec 26 2004 00:00:00\n *\n * @example\n * // Set the 1st week to 2 January 2005,\n * // if Monday is the first day of the week,\n * // and the first week of the year always contains 4 January:\n * const result = setWeek(new Date(2005, 0, 2), 1, {\n *   weekStartsOn: 1,\n *   firstWeekContainsDate: 4\n * })\n * //=> Sun Jan 4 2004 00:00:00\n */\nexport function setWeek(date, week, options) {\n  const date_ = toDate(date, options?.in);\n  const diff = getWeek(date_, options) - week;\n  date_.setDate(date_.getDate() - diff * 7);\n  return toDate(date_, options?.in);\n}\n\n// Fallback for modularized imports:\nexport default setWeek;\n","import { setWeek } from \"../../../setWeek.js\";\nimport { startOfWeek } from \"../../../startOfWeek.js\";\nimport { numericPatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseNDigits, parseNumericPattern } from \"../utils.js\";\n\n// Local week of year\nexport class LocalWeekParser extends Parser {\n  priority = 100;\n\n  parse(dateString, token, match) {\n    switch (token) {\n      case \"w\":\n        return parseNumericPattern(numericPatterns.week, dateString);\n      case \"wo\":\n        return match.ordinalNumber(dateString, { unit: \"week\" });\n      default:\n        return parseNDigits(token.length, dateString);\n    }\n  }\n\n  validate(_date, value) {\n    return value >= 1 && value <= 53;\n  }\n\n  set(date, _flags, value, options) {\n    return startOfWeek(setWeek(date, value, options), options);\n  }\n\n  incompatibleTokens = [\n    \"y\",\n    \"R\",\n    \"u\",\n    \"q\",\n    \"Q\",\n    \"M\",\n    \"L\",\n    \"I\",\n    \"d\",\n    \"D\",\n    \"i\",\n    \"t\",\n    \"T\",\n  ];\n}\n","import { getISOWeek } from \"./getISOWeek.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link setISOWeek} function options.\n */\n\n/**\n * @name setISOWeek\n * @category ISO Week Helpers\n * @summary Set the ISO week to the given date.\n *\n * @description\n * Set the ISO week to the given date, saving the weekday number.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The `Date` type of the context function.\n *\n * @param date - The date to be changed\n * @param week - The ISO week of the new date\n * @param options - An object with options\n *\n * @returns The new date with the ISO week set\n *\n * @example\n * // Set the 53rd ISO week to 7 August 2004:\n * const result = setISOWeek(new Date(2004, 7, 7), 53)\n * //=> Sat Jan 01 2005 00:00:00\n */\nexport function setISOWeek(date, week, options) {\n  const _date = toDate(date, options?.in);\n  const diff = getISOWeek(_date, options) - week;\n  _date.setDate(_date.getDate() - diff * 7);\n  return _date;\n}\n\n// Fallback for modularized imports:\nexport default setISOWeek;\n","import { setISOWeek } from \"../../../setISOWeek.js\";\nimport { startOfISOWeek } from \"../../../startOfISOWeek.js\";\nimport { numericPatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseNDigits, parseNumericPattern } from \"../utils.js\";\n\n// ISO week of year\nexport class ISOWeekParser extends Parser {\n  priority = 100;\n\n  parse(dateString, token, match) {\n    switch (token) {\n      case \"I\":\n        return parseNumericPattern(numericPatterns.week, dateString);\n      case \"Io\":\n        return match.ordinalNumber(dateString, { unit: \"week\" });\n      default:\n        return parseNDigits(token.length, dateString);\n    }\n  }\n\n  validate(_date, value) {\n    return value >= 1 && value <= 53;\n  }\n\n  set(date, _flags, value) {\n    return startOfISOWeek(setISOWeek(date, value));\n  }\n\n  incompatibleTokens = [\n    \"y\",\n    \"Y\",\n    \"u\",\n    \"q\",\n    \"Q\",\n    \"M\",\n    \"L\",\n    \"w\",\n    \"d\",\n    \"D\",\n    \"e\",\n    \"c\",\n    \"t\",\n    \"T\",\n  ];\n}\n","import { numericPatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport {\n  isLeapYearIndex,\n  parseNDigits,\n  parseNumericPattern,\n} from \"../utils.js\";\n\nconst DAYS_IN_MONTH = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\nconst DAYS_IN_MONTH_LEAP_YEAR = [\n  31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31,\n];\n\n// Day of the month\nexport class DateParser extends Parser {\n  priority = 90;\n  subPriority = 1;\n\n  parse(dateString, token, match) {\n    switch (token) {\n      case \"d\":\n        return parseNumericPattern(numericPatterns.date, dateString);\n      case \"do\":\n        return match.ordinalNumber(dateString, { unit: \"date\" });\n      default:\n        return parseNDigits(token.length, dateString);\n    }\n  }\n\n  validate(date, value) {\n    const year = date.getFullYear();\n    const isLeapYear = isLeapYearIndex(year);\n    const month = date.getMonth();\n    if (isLeapYear) {\n      return value >= 1 && value <= DAYS_IN_MONTH_LEAP_YEAR[month];\n    } else {\n      return value >= 1 && value <= DAYS_IN_MONTH[month];\n    }\n  }\n\n  set(date, _flags, value) {\n    date.setDate(value);\n    date.setHours(0, 0, 0, 0);\n    return date;\n  }\n\n  incompatibleTokens = [\n    \"Y\",\n    \"R\",\n    \"q\",\n    \"Q\",\n    \"w\",\n    \"I\",\n    \"D\",\n    \"i\",\n    \"e\",\n    \"c\",\n    \"t\",\n    \"T\",\n  ];\n}\n","import { numericPatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport {\n  isLeapYearIndex,\n  parseNDigits,\n  parseNumericPattern,\n} from \"../utils.js\";\n\nexport class DayOfYearParser extends Parser {\n  priority = 90;\n\n  subpriority = 1;\n\n  parse(dateString, token, match) {\n    switch (token) {\n      case \"D\":\n      case \"DD\":\n        return parseNumericPattern(numericPatterns.dayOfYear, dateString);\n      case \"Do\":\n        return match.ordinalNumber(dateString, { unit: \"date\" });\n      default:\n        return parseNDigits(token.length, dateString);\n    }\n  }\n\n  validate(date, value) {\n    const year = date.getFullYear();\n    const isLeapYear = isLeapYearIndex(year);\n    if (isLeapYear) {\n      return value >= 1 && value <= 366;\n    } else {\n      return value >= 1 && value <= 365;\n    }\n  }\n\n  set(date, _flags, value) {\n    date.setMonth(0, value);\n    date.setHours(0, 0, 0, 0);\n    return date;\n  }\n\n  incompatibleTokens = [\n    \"Y\",\n    \"R\",\n    \"q\",\n    \"Q\",\n    \"M\",\n    \"L\",\n    \"w\",\n    \"I\",\n    \"d\",\n    \"E\",\n    \"i\",\n    \"e\",\n    \"c\",\n    \"t\",\n    \"T\",\n  ];\n}\n","import { getDefaultOptions } from \"./_lib/defaultOptions.js\";\nimport { addDays } from \"./addDays.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link setDay} function options.\n */\n\n/**\n * @name setDay\n * @category Weekday Helpers\n * @summary Set the day of the week to the given date.\n *\n * @description\n * Set the day of the week to the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param day - The day of the week of the new date\n * @param options - An object with options.\n *\n * @returns The new date with the day of the week set\n *\n * @example\n * // Set week day to Sunday, with the default weekStartsOn of Sunday:\n * const result = setDay(new Date(2014, 8, 1), 0)\n * //=> Sun Aug 31 2014 00:00:00\n *\n * @example\n * // Set week day to Sunday, with a weekStartsOn of Monday:\n * const result = setDay(new Date(2014, 8, 1), 0, { weekStartsOn: 1 })\n * //=> Sun Sep 07 2014 00:00:00\n */\nexport function setDay(date, day, options) {\n  const defaultOptions = getDefaultOptions();\n  const weekStartsOn =\n    options?.weekStartsOn ??\n    options?.locale?.options?.weekStartsOn ??\n    defaultOptions.weekStartsOn ??\n    defaultOptions.locale?.options?.weekStartsOn ??\n    0;\n\n  const date_ = toDate(date, options?.in);\n  const currentDay = date_.getDay();\n\n  const remainder = day % 7;\n  const dayIndex = (remainder + 7) % 7;\n\n  const delta = 7 - weekStartsOn;\n  const diff =\n    day < 0 || day > 6\n      ? day - ((currentDay + delta) % 7)\n      : ((dayIndex + delta) % 7) - ((currentDay + delta) % 7);\n  return addDays(date_, diff, options);\n}\n\n// Fallback for modularized imports:\nexport default setDay;\n","import { setDay } from \"../../../setDay.js\";\nimport { Parser } from \"../Parser.js\";\n\n// Day of week\nexport class DayParser extends Parser {\n  priority = 90;\n\n  parse(dateString, token, match) {\n    switch (token) {\n      // Tue\n      case \"E\":\n      case \"EE\":\n      case \"EEE\":\n        return (\n          match.day(dateString, {\n            width: \"abbreviated\",\n            context: \"formatting\",\n          }) ||\n          match.day(dateString, { width: \"short\", context: \"formatting\" }) ||\n          match.day(dateString, { width: \"narrow\", context: \"formatting\" })\n        );\n\n      // T\n      case \"EEEEE\":\n        return match.day(dateString, {\n          width: \"narrow\",\n          context: \"formatting\",\n        });\n      // Tu\n      case \"EEEEEE\":\n        return (\n          match.day(dateString, { width: \"short\", context: \"formatting\" }) ||\n          match.day(dateString, { width: \"narrow\", context: \"formatting\" })\n        );\n\n      // Tuesday\n      case \"EEEE\":\n      default:\n        return (\n          match.day(dateString, { width: \"wide\", context: \"formatting\" }) ||\n          match.day(dateString, {\n            width: \"abbreviated\",\n            context: \"formatting\",\n          }) ||\n          match.day(dateString, { width: \"short\", context: \"formatting\" }) ||\n          match.day(dateString, { width: \"narrow\", context: \"formatting\" })\n        );\n    }\n  }\n\n  validate(_date, value) {\n    return value >= 0 && value <= 6;\n  }\n\n  set(date, _flags, value, options) {\n    date = setDay(date, value, options);\n    date.setHours(0, 0, 0, 0);\n    return date;\n  }\n\n  incompatibleTokens = [\"D\", \"i\", \"e\", \"c\", \"t\", \"T\"];\n}\n","import { setDay } from \"../../../setDay.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { mapValue, parseNDigits } from \"../utils.js\";\n\n// Local day of week\nexport class LocalDayParser extends Parser {\n  priority = 90;\n  parse(dateString, token, match, options) {\n    const valueCallback = (value) => {\n      // We want here floor instead of trunc, so we get -7 for value 0 instead of 0\n      const wholeWeekDays = Math.floor((value - 1) / 7) * 7;\n      return ((value + options.weekStartsOn + 6) % 7) + wholeWeekDays;\n    };\n\n    switch (token) {\n      // 3\n      case \"e\":\n      case \"ee\": // 03\n        return mapValue(parseNDigits(token.length, dateString), valueCallback);\n      // 3rd\n      case \"eo\":\n        return mapValue(\n          match.ordinalNumber(dateString, {\n            unit: \"day\",\n          }),\n          valueCallback,\n        );\n      // Tue\n      case \"eee\":\n        return (\n          match.day(dateString, {\n            width: \"abbreviated\",\n            context: \"formatting\",\n          }) ||\n          match.day(dateString, { width: \"short\", context: \"formatting\" }) ||\n          match.day(dateString, { width: \"narrow\", context: \"formatting\" })\n        );\n\n      // T\n      case \"eeeee\":\n        return match.day(dateString, {\n          width: \"narrow\",\n          context: \"formatting\",\n        });\n      // Tu\n      case \"eeeeee\":\n        return (\n          match.day(dateString, { width: \"short\", context: \"formatting\" }) ||\n          match.day(dateString, { width: \"narrow\", context: \"formatting\" })\n        );\n\n      // Tuesday\n      case \"eeee\":\n      default:\n        return (\n          match.day(dateString, { width: \"wide\", context: \"formatting\" }) ||\n          match.day(dateString, {\n            width: \"abbreviated\",\n            context: \"formatting\",\n          }) ||\n          match.day(dateString, { width: \"short\", context: \"formatting\" }) ||\n          match.day(dateString, { width: \"narrow\", context: \"formatting\" })\n        );\n    }\n  }\n\n  validate(_date, value) {\n    return value >= 0 && value <= 6;\n  }\n\n  set(date, _flags, value, options) {\n    date = setDay(date, value, options);\n    date.setHours(0, 0, 0, 0);\n    return date;\n  }\n\n  incompatibleTokens = [\n    \"y\",\n    \"R\",\n    \"u\",\n    \"q\",\n    \"Q\",\n    \"M\",\n    \"L\",\n    \"I\",\n    \"d\",\n    \"D\",\n    \"E\",\n    \"i\",\n    \"c\",\n    \"t\",\n    \"T\",\n  ];\n}\n","import { setDay } from \"../../../setDay.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { mapValue, parseNDigits } from \"../utils.js\";\n\n// Stand-alone local day of week\nexport class StandAloneLocalDayParser extends Parser {\n  priority = 90;\n\n  parse(dateString, token, match, options) {\n    const valueCallback = (value) => {\n      // We want here floor instead of trunc, so we get -7 for value 0 instead of 0\n      const wholeWeekDays = Math.floor((value - 1) / 7) * 7;\n      return ((value + options.weekStartsOn + 6) % 7) + wholeWeekDays;\n    };\n\n    switch (token) {\n      // 3\n      case \"c\":\n      case \"cc\": // 03\n        return mapValue(parseNDigits(token.length, dateString), valueCallback);\n      // 3rd\n      case \"co\":\n        return mapValue(\n          match.ordinalNumber(dateString, {\n            unit: \"day\",\n          }),\n          valueCallback,\n        );\n      // Tue\n      case \"ccc\":\n        return (\n          match.day(dateString, {\n            width: \"abbreviated\",\n            context: \"standalone\",\n          }) ||\n          match.day(dateString, { width: \"short\", context: \"standalone\" }) ||\n          match.day(dateString, { width: \"narrow\", context: \"standalone\" })\n        );\n\n      // T\n      case \"ccccc\":\n        return match.day(dateString, {\n          width: \"narrow\",\n          context: \"standalone\",\n        });\n      // Tu\n      case \"cccccc\":\n        return (\n          match.day(dateString, { width: \"short\", context: \"standalone\" }) ||\n          match.day(dateString, { width: \"narrow\", context: \"standalone\" })\n        );\n\n      // Tuesday\n      case \"cccc\":\n      default:\n        return (\n          match.day(dateString, { width: \"wide\", context: \"standalone\" }) ||\n          match.day(dateString, {\n            width: \"abbreviated\",\n            context: \"standalone\",\n          }) ||\n          match.day(dateString, { width: \"short\", context: \"standalone\" }) ||\n          match.day(dateString, { width: \"narrow\", context: \"standalone\" })\n        );\n    }\n  }\n\n  validate(_date, value) {\n    return value >= 0 && value <= 6;\n  }\n\n  set(date, _flags, value, options) {\n    date = setDay(date, value, options);\n    date.setHours(0, 0, 0, 0);\n    return date;\n  }\n\n  incompatibleTokens = [\n    \"y\",\n    \"R\",\n    \"u\",\n    \"q\",\n    \"Q\",\n    \"M\",\n    \"L\",\n    \"I\",\n    \"d\",\n    \"D\",\n    \"E\",\n    \"i\",\n    \"e\",\n    \"t\",\n    \"T\",\n  ];\n}\n","import { addDays } from \"./addDays.js\";\nimport { getISODay } from \"./getISODay.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link setISODay} function options.\n */\n\n/**\n * @name setISODay\n * @category Weekday Helpers\n * @summary Set the day of the ISO week to the given date.\n *\n * @description\n * Set the day of the ISO week to the given date.\n * ISO week starts with Monday.\n * 7 is the index of Sunday, 1 is the index of Monday, etc.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param day - The day of the ISO week of the new date\n * @param options - An object with options\n *\n * @returns The new date with the day of the ISO week set\n *\n * @example\n * // Set Sunday to 1 September 2014:\n * const result = setISODay(new Date(2014, 8, 1), 7)\n * //=> Sun Sep 07 2014 00:00:00\n */\nexport function setISODay(date, day, options) {\n  const date_ = toDate(date, options?.in);\n  const currentDay = getISODay(date_, options);\n  const diff = day - currentDay;\n  return addDays(date_, diff, options);\n}\n\n// Fallback for modularized imports:\nexport default setISODay;\n","import { setISODay } from \"../../../setISODay.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { mapValue, parseNDigits } from \"../utils.js\";\n\n// ISO day of week\nexport class ISODayParser extends Parser {\n  priority = 90;\n\n  parse(dateString, token, match) {\n    const valueCallback = (value) => {\n      if (value === 0) {\n        return 7;\n      }\n      return value;\n    };\n\n    switch (token) {\n      // 2\n      case \"i\":\n      case \"ii\": // 02\n        return parseNDigits(token.length, dateString);\n      // 2nd\n      case \"io\":\n        return match.ordinalNumber(dateString, { unit: \"day\" });\n      // Tue\n      case \"iii\":\n        return mapValue(\n          match.day(dateString, {\n            width: \"abbreviated\",\n            context: \"formatting\",\n          }) ||\n            match.day(dateString, {\n              width: \"short\",\n              context: \"formatting\",\n            }) ||\n            match.day(dateString, {\n              width: \"narrow\",\n              context: \"formatting\",\n            }),\n          valueCallback,\n        );\n      // T\n      case \"iiiii\":\n        return mapValue(\n          match.day(dateString, {\n            width: \"narrow\",\n            context: \"formatting\",\n          }),\n          valueCallback,\n        );\n      // Tu\n      case \"iiiiii\":\n        return mapValue(\n          match.day(dateString, {\n            width: \"short\",\n            context: \"formatting\",\n          }) ||\n            match.day(dateString, {\n              width: \"narrow\",\n              context: \"formatting\",\n            }),\n          valueCallback,\n        );\n      // Tuesday\n      case \"iiii\":\n      default:\n        return mapValue(\n          match.day(dateString, {\n            width: \"wide\",\n            context: \"formatting\",\n          }) ||\n            match.day(dateString, {\n              width: \"abbreviated\",\n              context: \"formatting\",\n            }) ||\n            match.day(dateString, {\n              width: \"short\",\n              context: \"formatting\",\n            }) ||\n            match.day(dateString, {\n              width: \"narrow\",\n              context: \"formatting\",\n            }),\n          valueCallback,\n        );\n    }\n  }\n\n  validate(_date, value) {\n    return value >= 1 && value <= 7;\n  }\n\n  set(date, _flags, value) {\n    date = setISODay(date, value);\n    date.setHours(0, 0, 0, 0);\n    return date;\n  }\n\n  incompatibleTokens = [\n    \"y\",\n    \"Y\",\n    \"u\",\n    \"q\",\n    \"Q\",\n    \"M\",\n    \"L\",\n    \"w\",\n    \"d\",\n    \"D\",\n    \"E\",\n    \"e\",\n    \"c\",\n    \"t\",\n    \"T\",\n  ];\n}\n","import { Parser } from \"../Parser.js\";\n\nimport { dayPeriodEnumToHours } from \"../utils.js\";\n\nexport class AMPMParser extends Parser {\n  priority = 80;\n\n  parse(dateString, token, match) {\n    switch (token) {\n      case \"a\":\n      case \"aa\":\n      case \"aaa\":\n        return (\n          match.dayPeriod(dateString, {\n            width: \"abbreviated\",\n            context: \"formatting\",\n          }) ||\n          match.dayPeriod(dateString, {\n            width: \"narrow\",\n            context: \"formatting\",\n          })\n        );\n\n      case \"aaaaa\":\n        return match.dayPeriod(dateString, {\n          width: \"narrow\",\n          context: \"formatting\",\n        });\n      case \"aaaa\":\n      default:\n        return (\n          match.dayPeriod(dateString, {\n            width: \"wide\",\n            context: \"formatting\",\n          }) ||\n          match.dayPeriod(dateString, {\n            width: \"abbreviated\",\n            context: \"formatting\",\n          }) ||\n          match.dayPeriod(dateString, {\n            width: \"narrow\",\n            context: \"formatting\",\n          })\n        );\n    }\n  }\n\n  set(date, _flags, value) {\n    date.setHours(dayPeriodEnumToHours(value), 0, 0, 0);\n    return date;\n  }\n\n  incompatibleTokens = [\"b\", \"B\", \"H\", \"k\", \"t\", \"T\"];\n}\n","import { Parser } from \"../Parser.js\";\n\nimport { dayPeriodEnumToHours } from \"../utils.js\";\n\nexport class AMPMMidnightParser extends Parser {\n  priority = 80;\n\n  parse(dateString, token, match) {\n    switch (token) {\n      case \"b\":\n      case \"bb\":\n      case \"bbb\":\n        return (\n          match.dayPeriod(dateString, {\n            width: \"abbreviated\",\n            context: \"formatting\",\n          }) ||\n          match.dayPeriod(dateString, {\n            width: \"narrow\",\n            context: \"formatting\",\n          })\n        );\n\n      case \"bbbbb\":\n        return match.dayPeriod(dateString, {\n          width: \"narrow\",\n          context: \"formatting\",\n        });\n      case \"bbbb\":\n      default:\n        return (\n          match.dayPeriod(dateString, {\n            width: \"wide\",\n            context: \"formatting\",\n          }) ||\n          match.dayPeriod(dateString, {\n            width: \"abbreviated\",\n            context: \"formatting\",\n          }) ||\n          match.dayPeriod(dateString, {\n            width: \"narrow\",\n            context: \"formatting\",\n          })\n        );\n    }\n  }\n\n  set(date, _flags, value) {\n    date.setHours(dayPeriodEnumToHours(value), 0, 0, 0);\n    return date;\n  }\n\n  incompatibleTokens = [\"a\", \"B\", \"H\", \"k\", \"t\", \"T\"];\n}\n","import { Parser } from \"../Parser.js\";\n\nimport { dayPeriodEnumToHours } from \"../utils.js\";\n\n// in the morning, in the afternoon, in the evening, at night\nexport class DayPeriodParser extends Parser {\n  priority = 80;\n\n  parse(dateString, token, match) {\n    switch (token) {\n      case \"B\":\n      case \"BB\":\n      case \"BBB\":\n        return (\n          match.dayPeriod(dateString, {\n            width: \"abbreviated\",\n            context: \"formatting\",\n          }) ||\n          match.dayPeriod(dateString, {\n            width: \"narrow\",\n            context: \"formatting\",\n          })\n        );\n\n      case \"BBBBB\":\n        return match.dayPeriod(dateString, {\n          width: \"narrow\",\n          context: \"formatting\",\n        });\n      case \"BBBB\":\n      default:\n        return (\n          match.dayPeriod(dateString, {\n            width: \"wide\",\n            context: \"formatting\",\n          }) ||\n          match.dayPeriod(dateString, {\n            width: \"abbreviated\",\n            context: \"formatting\",\n          }) ||\n          match.dayPeriod(dateString, {\n            width: \"narrow\",\n            context: \"formatting\",\n          })\n        );\n    }\n  }\n\n  set(date, _flags, value) {\n    date.setHours(dayPeriodEnumToHours(value), 0, 0, 0);\n    return date;\n  }\n\n  incompatibleTokens = [\"a\", \"b\", \"t\", \"T\"];\n}\n","import { numericPatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseNDigits, parseNumericPattern } from \"../utils.js\";\n\nexport class Hour1to12Parser extends Parser {\n  priority = 70;\n\n  parse(dateString, token, match) {\n    switch (token) {\n      case \"h\":\n        return parseNumericPattern(numericPatterns.hour12h, dateString);\n      case \"ho\":\n        return match.ordinalNumber(dateString, { unit: \"hour\" });\n      default:\n        return parseNDigits(token.length, dateString);\n    }\n  }\n\n  validate(_date, value) {\n    return value >= 1 && value <= 12;\n  }\n\n  set(date, _flags, value) {\n    const isPM = date.getHours() >= 12;\n    if (isPM && value < 12) {\n      date.setHours(value + 12, 0, 0, 0);\n    } else if (!isPM && value === 12) {\n      date.setHours(0, 0, 0, 0);\n    } else {\n      date.setHours(value, 0, 0, 0);\n    }\n    return date;\n  }\n\n  incompatibleTokens = [\"H\", \"K\", \"k\", \"t\", \"T\"];\n}\n","import { numericPatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseNDigits, parseNumericPattern } from \"../utils.js\";\n\nexport class Hour0to23Parser extends Parser {\n  priority = 70;\n\n  parse(dateString, token, match) {\n    switch (token) {\n      case \"H\":\n        return parseNumericPattern(numericPatterns.hour23h, dateString);\n      case \"Ho\":\n        return match.ordinalNumber(dateString, { unit: \"hour\" });\n      default:\n        return parseNDigits(token.length, dateString);\n    }\n  }\n\n  validate(_date, value) {\n    return value >= 0 && value <= 23;\n  }\n\n  set(date, _flags, value) {\n    date.setHours(value, 0, 0, 0);\n    return date;\n  }\n\n  incompatibleTokens = [\"a\", \"b\", \"h\", \"K\", \"k\", \"t\", \"T\"];\n}\n","import { numericPatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseNDigits, parseNumericPattern } from \"../utils.js\";\n\nexport class Hour0To11Parser extends Parser {\n  priority = 70;\n\n  parse(dateString, token, match) {\n    switch (token) {\n      case \"K\":\n        return parseNumericPattern(numericPatterns.hour11h, dateString);\n      case \"Ko\":\n        return match.ordinalNumber(dateString, { unit: \"hour\" });\n      default:\n        return parseNDigits(token.length, dateString);\n    }\n  }\n\n  validate(_date, value) {\n    return value >= 0 && value <= 11;\n  }\n\n  set(date, _flags, value) {\n    const isPM = date.getHours() >= 12;\n    if (isPM && value < 12) {\n      date.setHours(value + 12, 0, 0, 0);\n    } else {\n      date.setHours(value, 0, 0, 0);\n    }\n    return date;\n  }\n\n  incompatibleTokens = [\"h\", \"H\", \"k\", \"t\", \"T\"];\n}\n","import { numericPatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseNDigits, parseNumericPattern } from \"../utils.js\";\n\nexport class Hour1To24Parser extends Parser {\n  priority = 70;\n\n  parse(dateString, token, match) {\n    switch (token) {\n      case \"k\":\n        return parseNumericPattern(numericPatterns.hour24h, dateString);\n      case \"ko\":\n        return match.ordinalNumber(dateString, { unit: \"hour\" });\n      default:\n        return parseNDigits(token.length, dateString);\n    }\n  }\n\n  validate(_date, value) {\n    return value >= 1 && value <= 24;\n  }\n\n  set(date, _flags, value) {\n    const hours = value <= 24 ? value % 24 : value;\n    date.setHours(hours, 0, 0, 0);\n    return date;\n  }\n\n  incompatibleTokens = [\"a\", \"b\", \"h\", \"H\", \"K\", \"t\", \"T\"];\n}\n","import { numericPatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseNDigits, parseNumericPattern } from \"../utils.js\";\n\nexport class MinuteParser extends Parser {\n  priority = 60;\n\n  parse(dateString, token, match) {\n    switch (token) {\n      case \"m\":\n        return parseNumericPattern(numericPatterns.minute, dateString);\n      case \"mo\":\n        return match.ordinalNumber(dateString, { unit: \"minute\" });\n      default:\n        return parseNDigits(token.length, dateString);\n    }\n  }\n\n  validate(_date, value) {\n    return value >= 0 && value <= 59;\n  }\n\n  set(date, _flags, value) {\n    date.setMinutes(value, 0, 0);\n    return date;\n  }\n\n  incompatibleTokens = [\"t\", \"T\"];\n}\n","import { numericPatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseNDigits, parseNumericPattern } from \"../utils.js\";\n\nexport class SecondParser extends Parser {\n  priority = 50;\n\n  parse(dateString, token, match) {\n    switch (token) {\n      case \"s\":\n        return parseNumericPattern(numericPatterns.second, dateString);\n      case \"so\":\n        return match.ordinalNumber(dateString, { unit: \"second\" });\n      default:\n        return parseNDigits(token.length, dateString);\n    }\n  }\n\n  validate(_date, value) {\n    return value >= 0 && value <= 59;\n  }\n\n  set(date, _flags, value) {\n    date.setSeconds(value, 0);\n    return date;\n  }\n\n  incompatibleTokens = [\"t\", \"T\"];\n}\n","import { Parser } from \"../Parser.js\";\n\nimport { mapValue, parseNDigits } from \"../utils.js\";\n\nexport class FractionOfSecondParser extends Parser {\n  priority = 30;\n\n  parse(dateString, token) {\n    const valueCallback = (value) =>\n      Math.trunc(value * Math.pow(10, -token.length + 3));\n    return mapValue(parseNDigits(token.length, dateString), valueCallback);\n  }\n\n  set(date, _flags, value) {\n    date.setMilliseconds(value);\n    return date;\n  }\n\n  incompatibleTokens = [\"t\", \"T\"];\n}\n","import { constructFrom } from \"../../../constructFrom.js\";\nimport { getTimezoneOffsetInMilliseconds } from \"../../../_lib/getTimezoneOffsetInMilliseconds.js\";\nimport { timezonePatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseTimezonePattern } from \"../utils.js\";\n\n// Timezone (ISO-8601. +00:00 is `'Z'`)\nexport class ISOTimezoneWithZParser extends Parser {\n  priority = 10;\n\n  parse(dateString, token) {\n    switch (token) {\n      case \"X\":\n        return parseTimezonePattern(\n          timezonePatterns.basicOptionalMinutes,\n          dateString,\n        );\n      case \"XX\":\n        return parseTimezonePattern(timezonePatterns.basic, dateString);\n      case \"XXXX\":\n        return parseTimezonePattern(\n          timezonePatterns.basicOptionalSeconds,\n          dateString,\n        );\n      case \"XXXXX\":\n        return parseTimezonePattern(\n          timezonePatterns.extendedOptionalSeconds,\n          dateString,\n        );\n      case \"XXX\":\n      default:\n        return parseTimezonePattern(timezonePatterns.extended, dateString);\n    }\n  }\n\n  set(date, flags, value) {\n    if (flags.timestampIsSet) return date;\n    return constructFrom(\n      date,\n      date.getTime() - getTimezoneOffsetInMilliseconds(date) - value,\n    );\n  }\n\n  incompatibleTokens = [\"t\", \"T\", \"x\"];\n}\n","import { constructFrom } from \"../../../constructFrom.js\";\nimport { getTimezoneOffsetInMilliseconds } from \"../../../_lib/getTimezoneOffsetInMilliseconds.js\";\nimport { timezonePatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseTimezonePattern } from \"../utils.js\";\n\n// Timezone (ISO-8601)\nexport class ISOTimezoneParser extends Parser {\n  priority = 10;\n\n  parse(dateString, token) {\n    switch (token) {\n      case \"x\":\n        return parseTimezonePattern(\n          timezonePatterns.basicOptionalMinutes,\n          dateString,\n        );\n      case \"xx\":\n        return parseTimezonePattern(timezonePatterns.basic, dateString);\n      case \"xxxx\":\n        return parseTimezonePattern(\n          timezonePatterns.basicOptionalSeconds,\n          dateString,\n        );\n      case \"xxxxx\":\n        return parseTimezonePattern(\n          timezonePatterns.extendedOptionalSeconds,\n          dateString,\n        );\n      case \"xxx\":\n      default:\n        return parseTimezonePattern(timezonePatterns.extended, dateString);\n    }\n  }\n\n  set(date, flags, value) {\n    if (flags.timestampIsSet) return date;\n    return constructFrom(\n      date,\n      date.getTime() - getTimezoneOffsetInMilliseconds(date) - value,\n    );\n  }\n\n  incompatibleTokens = [\"t\", \"T\", \"X\"];\n}\n","import { constructFrom } from \"../../../constructFrom.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseAnyDigitsSigned } from \"../utils.js\";\n\nexport class TimestampSecondsParser extends Parser {\n  priority = 40;\n\n  parse(dateString) {\n    return parseAnyDigitsSigned(dateString);\n  }\n\n  set(date, _flags, value) {\n    return [constructFrom(date, value * 1000), { timestampIsSet: true }];\n  }\n\n  incompatibleTokens = \"*\";\n}\n","import { constructFrom } from \"../../../constructFrom.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseAnyDigitsSigned } from \"../utils.js\";\n\nexport class TimestampMillisecondsParser extends Parser {\n  priority = 20;\n\n  parse(dateString) {\n    return parseAnyDigitsSigned(dateString);\n  }\n\n  set(date, _flags, value) {\n    return [constructFrom(date, value), { timestampIsSet: true }];\n  }\n\n  incompatibleTokens = \"*\";\n}\n","import { EraParser } from \"./parsers/EraParser.js\";\nimport { YearParser } from \"./parsers/YearParser.js\";\nimport { LocalWeekYearParser } from \"./parsers/LocalWeekYearParser.js\";\nimport { ISOWeekYearParser } from \"./parsers/ISOWeekYearParser.js\";\nimport { ExtendedYearParser } from \"./parsers/ExtendedYearParser.js\";\nimport { QuarterParser } from \"./parsers/QuarterParser.js\";\nimport { StandAloneQuarterParser } from \"./parsers/StandAloneQuarterParser.js\";\nimport { MonthParser } from \"./parsers/MonthParser.js\";\nimport { StandAloneMonthParser } from \"./parsers/StandAloneMonthParser.js\";\nimport { LocalWeekParser } from \"./parsers/LocalWeekParser.js\";\nimport { ISOWeekParser } from \"./parsers/ISOWeekParser.js\";\nimport { DateParser } from \"./parsers/DateParser.js\";\nimport { DayOfYearParser } from \"./parsers/DayOfYearParser.js\";\nimport { DayParser } from \"./parsers/DayParser.js\";\nimport { LocalDayParser } from \"./parsers/LocalDayParser.js\";\nimport { StandAloneLocalDayParser } from \"./parsers/StandAloneLocalDayParser.js\";\nimport { ISODayParser } from \"./parsers/ISODayParser.js\";\nimport { AMPMParser } from \"./parsers/AMPMParser.js\";\nimport { AMPMMidnightParser } from \"./parsers/AMPMMidnightParser.js\";\nimport { DayPeriodParser } from \"./parsers/DayPeriodParser.js\";\nimport { Hour1to12Parser } from \"./parsers/Hour1to12Parser.js\";\nimport { Hour0to23Parser } from \"./parsers/Hour0to23Parser.js\";\nimport { Hour0To11Parser } from \"./parsers/Hour0To11Parser.js\";\nimport { Hour1To24Parser } from \"./parsers/Hour1To24Parser.js\";\nimport { MinuteParser } from \"./parsers/MinuteParser.js\";\nimport { SecondParser } from \"./parsers/SecondParser.js\";\nimport { FractionOfSecondParser } from \"./parsers/FractionOfSecondParser.js\";\nimport { ISOTimezoneWithZParser } from \"./parsers/ISOTimezoneWithZParser.js\";\nimport { ISOTimezoneParser } from \"./parsers/ISOTimezoneParser.js\";\nimport { TimestampSecondsParser } from \"./parsers/TimestampSecondsParser.js\";\nimport { TimestampMillisecondsParser } from \"./parsers/TimestampMillisecondsParser.js\";\n\n/*\n * |     | Unit                           |     | Unit                           |\n * |-----|--------------------------------|-----|--------------------------------|\n * |  a  | AM, PM                         |  A* | Milliseconds in day            |\n * |  b  | AM, PM, noon, midnight         |  B  | Flexible day period            |\n * |  c  | Stand-alone local day of week  |  C* | Localized hour w/ day period   |\n * |  d  | Day of month                   |  D  | Day of year                    |\n * |  e  | Local day of week              |  E  | Day of week                    |\n * |  f  |                                |  F* | Day of week in month           |\n * |  g* | Modified Julian day            |  G  | Era                            |\n * |  h  | Hour [1-12]                    |  H  | Hour [0-23]                    |\n * |  i! | ISO day of week                |  I! | ISO week of year               |\n * |  j* | Localized hour w/ day period   |  J* | Localized hour w/o day period  |\n * |  k  | Hour [1-24]                    |  K  | Hour [0-11]                    |\n * |  l* | (deprecated)                   |  L  | Stand-alone month              |\n * |  m  | Minute                         |  M  | Month                          |\n * |  n  |                                |  N  |                                |\n * |  o! | Ordinal number modifier        |  O* | Timezone (GMT)                 |\n * |  p  |                                |  P  |                                |\n * |  q  | Stand-alone quarter            |  Q  | Quarter                        |\n * |  r* | Related Gregorian year         |  R! | ISO week-numbering year        |\n * |  s  | Second                         |  S  | Fraction of second             |\n * |  t! | Seconds timestamp              |  T! | Milliseconds timestamp         |\n * |  u  | Extended year                  |  U* | Cyclic year                    |\n * |  v* | Timezone (generic non-locat.)  |  V* | Timezone (location)            |\n * |  w  | Local week of year             |  W* | Week of month                  |\n * |  x  | Timezone (ISO-8601 w/o Z)      |  X  | Timezone (ISO-8601)            |\n * |  y  | Year (abs)                     |  Y  | Local week-numbering year      |\n * |  z* | Timezone (specific non-locat.) |  Z* | Timezone (aliases)             |\n *\n * Letters marked by * are not implemented but reserved by Unicode standard.\n *\n * Letters marked by ! are non-standard, but implemented by date-fns:\n * - `o` modifies the previous token to turn it into an ordinal (see `parse` docs)\n * - `i` is ISO day of week. For `i` and `ii` is returns numeric ISO week days,\n *   i.e. 7 for Sunday, 1 for Monday, etc.\n * - `I` is ISO week of year, as opposed to `w` which is local week of year.\n * - `R` is ISO week-numbering year, as opposed to `Y` which is local week-numbering year.\n *   `R` is supposed to be used in conjunction with `I` and `i`\n *   for universal ISO week-numbering date, whereas\n *   `Y` is supposed to be used in conjunction with `w` and `e`\n *   for week-numbering date specific to the locale.\n */\nexport const parsers = {\n  G: new EraParser(),\n  y: new YearParser(),\n  Y: new LocalWeekYearParser(),\n  R: new ISOWeekYearParser(),\n  u: new ExtendedYearParser(),\n  Q: new QuarterParser(),\n  q: new StandAloneQuarterParser(),\n  M: new MonthParser(),\n  L: new StandAloneMonthParser(),\n  w: new LocalWeekParser(),\n  I: new ISOWeekParser(),\n  d: new DateParser(),\n  D: new DayOfYearParser(),\n  E: new DayParser(),\n  e: new LocalDayParser(),\n  c: new StandAloneLocalDayParser(),\n  i: new ISODayParser(),\n  a: new AMPMParser(),\n  b: new AMPMMidnightParser(),\n  B: new DayPeriodParser(),\n  h: new Hour1to12Parser(),\n  H: new Hour0to23Parser(),\n  K: new Hour0To11Parser(),\n  k: new Hour1To24Parser(),\n  m: new MinuteParser(),\n  s: new SecondParser(),\n  S: new FractionOfSecondParser(),\n  X: new ISOTimezoneWithZParser(),\n  x: new ISOTimezoneParser(),\n  t: new TimestampSecondsParser(),\n  T: new TimestampMillisecondsParser(),\n};\n","import { defaultLocale } from \"./_lib/defaultLocale.js\";\nimport { longFormatters } from \"./_lib/format/longFormatters.js\";\nimport {\n  isProtectedDayOfYearToken,\n  isProtectedWeekYearToken,\n  warnOrThrowProtectedError,\n} from \"./_lib/protectedTokens.js\";\nimport { constructFrom } from \"./constructFrom.js\";\nimport { getDefaultOptions } from \"./getDefaultOptions.js\";\nimport { toDate } from \"./toDate.js\";\n\nimport { DateTimezoneSetter } from \"./parse/_lib/Setter.js\";\nimport { parsers } from \"./parse/_lib/parsers.js\";\n\n// Rexports of internal for libraries to use.\n// See: https://github.com/date-fns/date-fns/issues/3638#issuecomment-1877082874\nexport { longFormatters, parsers };\n\n/**\n * The {@link parse} function options.\n */\n\n// This RegExp consists of three parts separated by `|`:\n// - [yYQqMLwIdDecihHKkms]o matches any available ordinal number token\n//   (one of the certain letters followed by `o`)\n// - (\\w)\\1* matches any sequences of the same letter\n// - '' matches two quote characters in a row\n// - '(''|[^'])+('|$) matches anything surrounded by two quote characters ('),\n//   except a single quote symbol, which ends the sequence.\n//   Two quote characters do not end the sequence.\n//   If there is no matching single quote\n//   then the sequence will continue until the end of the string.\n// - . matches any single character unmatched by previous parts of the RegExps\nconst formattingTokensRegExp =\n  /[yYQqMLwIdDecihHKkms]o|(\\w)\\1*|''|'(''|[^'])+('|$)|./g;\n\n// This RegExp catches symbols escaped by quotes, and also\n// sequences of symbols P, p, and the combinations like `PPPPPPPppppp`\nconst longFormattingTokensRegExp = /P+p+|P+|p+|''|'(''|[^'])+('|$)|./g;\n\nconst escapedStringRegExp = /^'([^]*?)'?$/;\nconst doubleQuoteRegExp = /''/g;\n\nconst notWhitespaceRegExp = /\\S/;\nconst unescapedLatinCharacterRegExp = /[a-zA-Z]/;\n\n/**\n * @name parse\n * @category Common Helpers\n * @summary Parse the date.\n *\n * @description\n * Return the date parsed from string using the given format string.\n *\n * > ⚠️ Please note that the `format` tokens differ from Moment.js and other libraries.\n * > See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * The characters in the format string wrapped between two single quotes characters (') are escaped.\n * Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.\n *\n * Format of the format string is based on Unicode Technical Standard #35:\n * https://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table\n * with a few additions (see note 5 below the table).\n *\n * Not all tokens are compatible. Combinations that don't make sense or could lead to bugs are prohibited\n * and will throw `RangeError`. For example usage of 24-hour format token with AM/PM token will throw an exception:\n *\n * ```javascript\n * parse('23 AM', 'HH a', new Date())\n * //=> RangeError: The format string mustn't contain `HH` and `a` at the same time\n * ```\n *\n * See the compatibility table: https://docs.google.com/spreadsheets/d/e/2PACX-1vQOPU3xUhplll6dyoMmVUXHKl_8CRDs6_ueLmex3SoqwhuolkuN3O05l4rqx5h1dKX8eb46Ul-CCSrq/pubhtml?gid=0&single=true\n *\n * Accepted format string patterns:\n * | Unit                            |Prior| Pattern | Result examples                   | Notes |\n * |---------------------------------|-----|---------|-----------------------------------|-------|\n * | Era                             | 140 | G..GGG  | AD, BC                            |       |\n * |                                 |     | GGGG    | Anno Domini, Before Christ        | 2     |\n * |                                 |     | GGGGG   | A, B                              |       |\n * | Calendar year                   | 130 | y       | 44, 1, 1900, 2017, 9999           | 4     |\n * |                                 |     | yo      | 44th, 1st, 1900th, 9999999th      | 4,5   |\n * |                                 |     | yy      | 44, 01, 00, 17                    | 4     |\n * |                                 |     | yyy     | 044, 001, 123, 999                | 4     |\n * |                                 |     | yyyy    | 0044, 0001, 1900, 2017            | 4     |\n * |                                 |     | yyyyy   | ...                               | 2,4   |\n * | Local week-numbering year       | 130 | Y       | 44, 1, 1900, 2017, 9000           | 4     |\n * |                                 |     | Yo      | 44th, 1st, 1900th, 9999999th      | 4,5   |\n * |                                 |     | YY      | 44, 01, 00, 17                    | 4,6   |\n * |                                 |     | YYY     | 044, 001, 123, 999                | 4     |\n * |                                 |     | YYYY    | 0044, 0001, 1900, 2017            | 4,6   |\n * |                                 |     | YYYYY   | ...                               | 2,4   |\n * | ISO week-numbering year         | 130 | R       | -43, 1, 1900, 2017, 9999, -9999   | 4,5   |\n * |                                 |     | RR      | -43, 01, 00, 17                   | 4,5   |\n * |                                 |     | RRR     | -043, 001, 123, 999, -999         | 4,5   |\n * |                                 |     | RRRR    | -0043, 0001, 2017, 9999, -9999    | 4,5   |\n * |                                 |     | RRRRR   | ...                               | 2,4,5 |\n * | Extended year                   | 130 | u       | -43, 1, 1900, 2017, 9999, -999    | 4     |\n * |                                 |     | uu      | -43, 01, 99, -99                  | 4     |\n * |                                 |     | uuu     | -043, 001, 123, 999, -999         | 4     |\n * |                                 |     | uuuu    | -0043, 0001, 2017, 9999, -9999    | 4     |\n * |                                 |     | uuuuu   | ...                               | 2,4   |\n * | Quarter (formatting)            | 120 | Q       | 1, 2, 3, 4                        |       |\n * |                                 |     | Qo      | 1st, 2nd, 3rd, 4th                | 5     |\n * |                                 |     | QQ      | 01, 02, 03, 04                    |       |\n * |                                 |     | QQQ     | Q1, Q2, Q3, Q4                    |       |\n * |                                 |     | QQQQ    | 1st quarter, 2nd quarter, ...     | 2     |\n * |                                 |     | QQQQQ   | 1, 2, 3, 4                        | 4     |\n * | Quarter (stand-alone)           | 120 | q       | 1, 2, 3, 4                        |       |\n * |                                 |     | qo      | 1st, 2nd, 3rd, 4th                | 5     |\n * |                                 |     | qq      | 01, 02, 03, 04                    |       |\n * |                                 |     | qqq     | Q1, Q2, Q3, Q4                    |       |\n * |                                 |     | qqqq    | 1st quarter, 2nd quarter, ...     | 2     |\n * |                                 |     | qqqqq   | 1, 2, 3, 4                        | 3     |\n * | Month (formatting)              | 110 | M       | 1, 2, ..., 12                     |       |\n * |                                 |     | Mo      | 1st, 2nd, ..., 12th               | 5     |\n * |                                 |     | MM      | 01, 02, ..., 12                   |       |\n * |                                 |     | MMM     | Jan, Feb, ..., Dec                |       |\n * |                                 |     | MMMM    | January, February, ..., December  | 2     |\n * |                                 |     | MMMMM   | J, F, ..., D                      |       |\n * | Month (stand-alone)             | 110 | L       | 1, 2, ..., 12                     |       |\n * |                                 |     | Lo      | 1st, 2nd, ..., 12th               | 5     |\n * |                                 |     | LL      | 01, 02, ..., 12                   |       |\n * |                                 |     | LLL     | Jan, Feb, ..., Dec                |       |\n * |                                 |     | LLLL    | January, February, ..., December  | 2     |\n * |                                 |     | LLLLL   | J, F, ..., D                      |       |\n * | Local week of year              | 100 | w       | 1, 2, ..., 53                     |       |\n * |                                 |     | wo      | 1st, 2nd, ..., 53th               | 5     |\n * |                                 |     | ww      | 01, 02, ..., 53                   |       |\n * | ISO week of year                | 100 | I       | 1, 2, ..., 53                     | 5     |\n * |                                 |     | Io      | 1st, 2nd, ..., 53th               | 5     |\n * |                                 |     | II      | 01, 02, ..., 53                   | 5     |\n * | Day of month                    |  90 | d       | 1, 2, ..., 31                     |       |\n * |                                 |     | do      | 1st, 2nd, ..., 31st               | 5     |\n * |                                 |     | dd      | 01, 02, ..., 31                   |       |\n * | Day of year                     |  90 | D       | 1, 2, ..., 365, 366               | 7     |\n * |                                 |     | Do      | 1st, 2nd, ..., 365th, 366th       | 5     |\n * |                                 |     | DD      | 01, 02, ..., 365, 366             | 7     |\n * |                                 |     | DDD     | 001, 002, ..., 365, 366           |       |\n * |                                 |     | DDDD    | ...                               | 2     |\n * | Day of week (formatting)        |  90 | E..EEE  | Mon, Tue, Wed, ..., Sun           |       |\n * |                                 |     | EEEE    | Monday, Tuesday, ..., Sunday      | 2     |\n * |                                 |     | EEEEE   | M, T, W, T, F, S, S               |       |\n * |                                 |     | EEEEEE  | Mo, Tu, We, Th, Fr, Sa, Su        |       |\n * | ISO day of week (formatting)    |  90 | i       | 1, 2, 3, ..., 7                   | 5     |\n * |                                 |     | io      | 1st, 2nd, ..., 7th                | 5     |\n * |                                 |     | ii      | 01, 02, ..., 07                   | 5     |\n * |                                 |     | iii     | Mon, Tue, Wed, ..., Sun           | 5     |\n * |                                 |     | iiii    | Monday, Tuesday, ..., Sunday      | 2,5   |\n * |                                 |     | iiiii   | M, T, W, T, F, S, S               | 5     |\n * |                                 |     | iiiiii  | Mo, Tu, We, Th, Fr, Sa, Su        | 5     |\n * | Local day of week (formatting)  |  90 | e       | 2, 3, 4, ..., 1                   |       |\n * |                                 |     | eo      | 2nd, 3rd, ..., 1st                | 5     |\n * |                                 |     | ee      | 02, 03, ..., 01                   |       |\n * |                                 |     | eee     | Mon, Tue, Wed, ..., Sun           |       |\n * |                                 |     | eeee    | Monday, Tuesday, ..., Sunday      | 2     |\n * |                                 |     | eeeee   | M, T, W, T, F, S, S               |       |\n * |                                 |     | eeeeee  | Mo, Tu, We, Th, Fr, Sa, Su        |       |\n * | Local day of week (stand-alone) |  90 | c       | 2, 3, 4, ..., 1                   |       |\n * |                                 |     | co      | 2nd, 3rd, ..., 1st                | 5     |\n * |                                 |     | cc      | 02, 03, ..., 01                   |       |\n * |                                 |     | ccc     | Mon, Tue, Wed, ..., Sun           |       |\n * |                                 |     | cccc    | Monday, Tuesday, ..., Sunday      | 2     |\n * |                                 |     | ccccc   | M, T, W, T, F, S, S               |       |\n * |                                 |     | cccccc  | Mo, Tu, We, Th, Fr, Sa, Su        |       |\n * | AM, PM                          |  80 | a..aaa  | AM, PM                            |       |\n * |                                 |     | aaaa    | a.m., p.m.                        | 2     |\n * |                                 |     | aaaaa   | a, p                              |       |\n * | AM, PM, noon, midnight          |  80 | b..bbb  | AM, PM, noon, midnight            |       |\n * |                                 |     | bbbb    | a.m., p.m., noon, midnight        | 2     |\n * |                                 |     | bbbbb   | a, p, n, mi                       |       |\n * | Flexible day period             |  80 | B..BBB  | at night, in the morning, ...     |       |\n * |                                 |     | BBBB    | at night, in the morning, ...     | 2     |\n * |                                 |     | BBBBB   | at night, in the morning, ...     |       |\n * | Hour [1-12]                     |  70 | h       | 1, 2, ..., 11, 12                 |       |\n * |                                 |     | ho      | 1st, 2nd, ..., 11th, 12th         | 5     |\n * |                                 |     | hh      | 01, 02, ..., 11, 12               |       |\n * | Hour [0-23]                     |  70 | H       | 0, 1, 2, ..., 23                  |       |\n * |                                 |     | Ho      | 0th, 1st, 2nd, ..., 23rd          | 5     |\n * |                                 |     | HH      | 00, 01, 02, ..., 23               |       |\n * | Hour [0-11]                     |  70 | K       | 1, 2, ..., 11, 0                  |       |\n * |                                 |     | Ko      | 1st, 2nd, ..., 11th, 0th          | 5     |\n * |                                 |     | KK      | 01, 02, ..., 11, 00               |       |\n * | Hour [1-24]                     |  70 | k       | 24, 1, 2, ..., 23                 |       |\n * |                                 |     | ko      | 24th, 1st, 2nd, ..., 23rd         | 5     |\n * |                                 |     | kk      | 24, 01, 02, ..., 23               |       |\n * | Minute                          |  60 | m       | 0, 1, ..., 59                     |       |\n * |                                 |     | mo      | 0th, 1st, ..., 59th               | 5     |\n * |                                 |     | mm      | 00, 01, ..., 59                   |       |\n * | Second                          |  50 | s       | 0, 1, ..., 59                     |       |\n * |                                 |     | so      | 0th, 1st, ..., 59th               | 5     |\n * |                                 |     | ss      | 00, 01, ..., 59                   |       |\n * | Seconds timestamp               |  40 | t       | 512969520                         |       |\n * |                                 |     | tt      | ...                               | 2     |\n * | Fraction of second              |  30 | S       | 0, 1, ..., 9                      |       |\n * |                                 |     | SS      | 00, 01, ..., 99                   |       |\n * |                                 |     | SSS     | 000, 001, ..., 999                |       |\n * |                                 |     | SSSS    | ...                               | 2     |\n * | Milliseconds timestamp          |  20 | T       | 512969520900                      |       |\n * |                                 |     | TT      | ...                               | 2     |\n * | Timezone (ISO-8601 w/ Z)        |  10 | X       | -08, +0530, Z                     |       |\n * |                                 |     | XX      | -0800, +0530, Z                   |       |\n * |                                 |     | XXX     | -08:00, +05:30, Z                 |       |\n * |                                 |     | XXXX    | -0800, +0530, Z, +123456          | 2     |\n * |                                 |     | XXXXX   | -08:00, +05:30, Z, +12:34:56      |       |\n * | Timezone (ISO-8601 w/o Z)       |  10 | x       | -08, +0530, +00                   |       |\n * |                                 |     | xx      | -0800, +0530, +0000               |       |\n * |                                 |     | xxx     | -08:00, +05:30, +00:00            | 2     |\n * |                                 |     | xxxx    | -0800, +0530, +0000, +123456      |       |\n * |                                 |     | xxxxx   | -08:00, +05:30, +00:00, +12:34:56 |       |\n * | Long localized date             |  NA | P       | 05/29/1453                        | 5,8   |\n * |                                 |     | PP      | May 29, 1453                      |       |\n * |                                 |     | PPP     | May 29th, 1453                    |       |\n * |                                 |     | PPPP    | Sunday, May 29th, 1453            | 2,5,8 |\n * | Long localized time             |  NA | p       | 12:00 AM                          | 5,8   |\n * |                                 |     | pp      | 12:00:00 AM                       |       |\n * | Combination of date and time    |  NA | Pp      | 05/29/1453, 12:00 AM              |       |\n * |                                 |     | PPpp    | May 29, 1453, 12:00:00 AM         |       |\n * |                                 |     | PPPpp   | May 29th, 1453 at ...             |       |\n * |                                 |     | PPPPpp  | Sunday, May 29th, 1453 at ...     | 2,5,8 |\n * Notes:\n * 1. \"Formatting\" units (e.g. formatting quarter) in the default en-US locale\n *    are the same as \"stand-alone\" units, but are different in some languages.\n *    \"Formatting\" units are declined according to the rules of the language\n *    in the context of a date. \"Stand-alone\" units are always nominative singular.\n *    In `format` function, they will produce different result:\n *\n *    `format(new Date(2017, 10, 6), 'do LLLL', {locale: cs}) //=> '6. listopad'`\n *\n *    `format(new Date(2017, 10, 6), 'do MMMM', {locale: cs}) //=> '6. listopadu'`\n *\n *    `parse` will try to match both formatting and stand-alone units interchangeably.\n *\n * 2. Any sequence of the identical letters is a pattern, unless it is escaped by\n *    the single quote characters (see below).\n *    If the sequence is longer than listed in table:\n *    - for numerical units (`yyyyyyyy`) `parse` will try to match a number\n *      as wide as the sequence\n *    - for text units (`MMMMMMMM`) `parse` will try to match the widest variation of the unit.\n *      These variations are marked with \"2\" in the last column of the table.\n *\n * 3. `QQQQQ` and `qqqqq` could be not strictly numerical in some locales.\n *    These tokens represent the shortest form of the quarter.\n *\n * 4. The main difference between `y` and `u` patterns are B.C. years:\n *\n *    | Year | `y` | `u` |\n *    |------|-----|-----|\n *    | AC 1 |   1 |   1 |\n *    | BC 1 |   1 |   0 |\n *    | BC 2 |   2 |  -1 |\n *\n *    Also `yy` will try to guess the century of two digit year by proximity with `referenceDate`:\n *\n *    `parse('50', 'yy', new Date(2018, 0, 1)) //=> Sat Jan 01 2050 00:00:00`\n *\n *    `parse('75', 'yy', new Date(2018, 0, 1)) //=> Wed Jan 01 1975 00:00:00`\n *\n *    while `uu` will just assign the year as is:\n *\n *    `parse('50', 'uu', new Date(2018, 0, 1)) //=> Sat Jan 01 0050 00:00:00`\n *\n *    `parse('75', 'uu', new Date(2018, 0, 1)) //=> Tue Jan 01 0075 00:00:00`\n *\n *    The same difference is true for local and ISO week-numbering years (`Y` and `R`),\n *    except local week-numbering years are dependent on `options.weekStartsOn`\n *    and `options.firstWeekContainsDate` (compare [setISOWeekYear](https://date-fns.org/docs/setISOWeekYear)\n *    and [setWeekYear](https://date-fns.org/docs/setWeekYear)).\n *\n * 5. These patterns are not in the Unicode Technical Standard #35:\n *    - `i`: ISO day of week\n *    - `I`: ISO week of year\n *    - `R`: ISO week-numbering year\n *    - `o`: ordinal number modifier\n *    - `P`: long localized date\n *    - `p`: long localized time\n *\n * 6. `YY` and `YYYY` tokens represent week-numbering years but they are often confused with years.\n *    You should enable `options.useAdditionalWeekYearTokens` to use them. See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * 7. `D` and `DD` tokens represent days of the year but they are often confused with days of the month.\n *    You should enable `options.useAdditionalDayOfYearTokens` to use them. See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * 8. `P+` tokens do not have a defined priority since they are merely aliases to other tokens based\n *    on the given locale.\n *\n *    using `en-US` locale: `P` => `MM/dd/yyyy`\n *    using `en-US` locale: `p` => `hh:mm a`\n *    using `pt-BR` locale: `P` => `dd/MM/yyyy`\n *    using `pt-BR` locale: `p` => `HH:mm`\n *\n * Values will be assigned to the date in the descending order of its unit's priority.\n * Units of an equal priority overwrite each other in the order of appearance.\n *\n * If no values of higher priority are parsed (e.g. when parsing string 'January 1st' without a year),\n * the values will be taken from 3rd argument `referenceDate` which works as a context of parsing.\n *\n * `referenceDate` must be passed for correct work of the function.\n * If you're not sure which `referenceDate` to supply, create a new instance of Date:\n * `parse('02/11/2014', 'MM/dd/yyyy', new Date())`\n * In this case parsing will be done in the context of the current date.\n * If `referenceDate` is `Invalid Date` or a value not convertible to valid `Date`,\n * then `Invalid Date` will be returned.\n *\n * The result may vary by locale.\n *\n * If `formatString` matches with `dateString` but does not provides tokens, `referenceDate` will be returned.\n *\n * If parsing failed, `Invalid Date` will be returned.\n * Invalid Date is a Date, whose time value is NaN.\n * Time value of Date: http://es5.github.io/#x15.9.1.1\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param dateStr - The string to parse\n * @param formatStr - The string of tokens\n * @param referenceDate - defines values missing from the parsed dateString\n * @param options - An object with options.\n *   see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *   see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * @returns The parsed date\n *\n * @throws `options.locale` must contain `match` property\n * @throws use `yyyy` instead of `YYYY` for formatting years using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws use `yy` instead of `YY` for formatting years using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws use `d` instead of `D` for formatting days of the month using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws use `dd` instead of `DD` for formatting days of the month using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws format string contains an unescaped latin alphabet character\n *\n * @example\n * // Parse 11 February 2014 from middle-endian format:\n * var result = parse('02/11/2014', 'MM/dd/yyyy', new Date())\n * //=> Tue Feb 11 2014 00:00:00\n *\n * @example\n * // Parse 28th of February in Esperanto locale in the context of 2010 year:\n * import eo from 'date-fns/locale/eo'\n * var result = parse('28-a de februaro', \"do 'de' MMMM\", new Date(2010, 0, 1), {\n *   locale: eo\n * })\n * //=> Sun Feb 28 2010 00:00:00\n */\nexport function parse(dateStr, formatStr, referenceDate, options) {\n  const invalidDate = () => constructFrom(options?.in || referenceDate, NaN);\n  const defaultOptions = getDefaultOptions();\n  const locale = options?.locale ?? defaultOptions.locale ?? defaultLocale;\n\n  const firstWeekContainsDate =\n    options?.firstWeekContainsDate ??\n    options?.locale?.options?.firstWeekContainsDate ??\n    defaultOptions.firstWeekContainsDate ??\n    defaultOptions.locale?.options?.firstWeekContainsDate ??\n    1;\n\n  const weekStartsOn =\n    options?.weekStartsOn ??\n    options?.locale?.options?.weekStartsOn ??\n    defaultOptions.weekStartsOn ??\n    defaultOptions.locale?.options?.weekStartsOn ??\n    0;\n\n  if (!formatStr)\n    return dateStr ? invalidDate() : toDate(referenceDate, options?.in);\n\n  const subFnOptions = {\n    firstWeekContainsDate,\n    weekStartsOn,\n    locale,\n  };\n\n  // If timezone isn't specified, it will try to use the context or\n  // the reference date and fallback to the system time zone.\n  const setters = [new DateTimezoneSetter(options?.in, referenceDate)];\n\n  const tokens = formatStr\n    .match(longFormattingTokensRegExp)\n    .map((substring) => {\n      const firstCharacter = substring[0];\n      if (firstCharacter in longFormatters) {\n        const longFormatter = longFormatters[firstCharacter];\n        return longFormatter(substring, locale.formatLong);\n      }\n      return substring;\n    })\n    .join(\"\")\n    .match(formattingTokensRegExp);\n\n  const usedTokens = [];\n\n  for (let token of tokens) {\n    if (\n      !options?.useAdditionalWeekYearTokens &&\n      isProtectedWeekYearToken(token)\n    ) {\n      warnOrThrowProtectedError(token, formatStr, dateStr);\n    }\n    if (\n      !options?.useAdditionalDayOfYearTokens &&\n      isProtectedDayOfYearToken(token)\n    ) {\n      warnOrThrowProtectedError(token, formatStr, dateStr);\n    }\n\n    const firstCharacter = token[0];\n    const parser = parsers[firstCharacter];\n    if (parser) {\n      const { incompatibleTokens } = parser;\n      if (Array.isArray(incompatibleTokens)) {\n        const incompatibleToken = usedTokens.find(\n          (usedToken) =>\n            incompatibleTokens.includes(usedToken.token) ||\n            usedToken.token === firstCharacter,\n        );\n        if (incompatibleToken) {\n          throw new RangeError(\n            `The format string mustn't contain \\`${incompatibleToken.fullToken}\\` and \\`${token}\\` at the same time`,\n          );\n        }\n      } else if (parser.incompatibleTokens === \"*\" && usedTokens.length > 0) {\n        throw new RangeError(\n          `The format string mustn't contain \\`${token}\\` and any other token at the same time`,\n        );\n      }\n\n      usedTokens.push({ token: firstCharacter, fullToken: token });\n\n      const parseResult = parser.run(\n        dateStr,\n        token,\n        locale.match,\n        subFnOptions,\n      );\n\n      if (!parseResult) {\n        return invalidDate();\n      }\n\n      setters.push(parseResult.setter);\n\n      dateStr = parseResult.rest;\n    } else {\n      if (firstCharacter.match(unescapedLatinCharacterRegExp)) {\n        throw new RangeError(\n          \"Format string contains an unescaped latin alphabet character `\" +\n            firstCharacter +\n            \"`\",\n        );\n      }\n\n      // Replace two single quote characters with one single quote character\n      if (token === \"''\") {\n        token = \"'\";\n      } else if (firstCharacter === \"'\") {\n        token = cleanEscapedString(token);\n      }\n\n      // Cut token from string, or, if string doesn't match the token, return Invalid Date\n      if (dateStr.indexOf(token) === 0) {\n        dateStr = dateStr.slice(token.length);\n      } else {\n        return invalidDate();\n      }\n    }\n  }\n\n  // Check if the remaining input contains something other than whitespace\n  if (dateStr.length > 0 && notWhitespaceRegExp.test(dateStr)) {\n    return invalidDate();\n  }\n\n  const uniquePrioritySetters = setters\n    .map((setter) => setter.priority)\n    .sort((a, b) => b - a)\n    .filter((priority, index, array) => array.indexOf(priority) === index)\n    .map((priority) =>\n      setters\n        .filter((setter) => setter.priority === priority)\n        .sort((a, b) => b.subPriority - a.subPriority),\n    )\n    .map((setterArray) => setterArray[0]);\n\n  let date = toDate(referenceDate, options?.in);\n\n  if (isNaN(+date)) return invalidDate();\n\n  const flags = {};\n  for (const setter of uniquePrioritySetters) {\n    if (!setter.validate(date, subFnOptions)) {\n      return invalidDate();\n    }\n\n    const result = setter.set(date, flags, subFnOptions);\n    // Result is tuple (date, flags)\n    if (Array.isArray(result)) {\n      date = result[0];\n      Object.assign(flags, result[1]);\n      // Result is date\n    } else {\n      date = result;\n    }\n  }\n\n  return date;\n}\n\nfunction cleanEscapedString(input) {\n  return input.match(escapedStringRegExp)[1].replace(doubleQuoteRegExp, \"'\");\n}\n\n// Fallback for modularized imports:\nexport default parse;\n","import { normalizeDates } from \"./_lib/normalizeDates.js\";\nimport { startOfQuarter } from \"./startOfQuarter.js\";\n\n/**\n * The {@link isSameQuarter} function options.\n */\n\n/**\n * @name isSameQuarter\n * @category Quarter Helpers\n * @summary Are the given dates in the same quarter (and year)?\n *\n * @description\n * Are the given dates in the same quarter (and year)?\n *\n * @param laterDate - The first date to check\n * @param earlierDate - The second date to check\n * @param options - An object with options\n *\n * @returns The dates are in the same quarter (and year)\n *\n * @example\n * // Are 1 January 2014 and 8 March 2014 in the same quarter?\n * const result = isSameQuarter(new Date(2014, 0, 1), new Date(2014, 2, 8))\n * //=> true\n *\n * @example\n * // Are 1 January 2014 and 1 January 2015 in the same quarter?\n * const result = isSameQuarter(new Date(2014, 0, 1), new Date(2015, 0, 1))\n * //=> false\n */\nexport function isSameQuarter(laterDate, earlierDate, options) {\n  const [dateLeft_, dateRight_] = normalizeDates(\n    options?.in,\n    laterDate,\n    earlierDate,\n  );\n  return +startOfQuarter(dateLeft_) === +startOfQuarter(dateRight_);\n}\n\n// Fallback for modularized imports:\nexport default isSameQuarter;\n","import { addDays } from \"./addDays.js\";\n\n/**\n * The {@link subDays} function options.\n */\n\n/**\n * @name subDays\n * @category Day Helpers\n * @summary Subtract the specified number of days from the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param amount - The amount of days to be subtracted.\n * @param options - An object with options\n *\n * @returns The new date with the days subtracted\n *\n * @example\n * // Subtract 10 days from 1 September 2014:\n * const result = subDays(new Date(2014, 8, 1), 10)\n * //=> Fri Aug 22 2014 00:00:00\n */\nexport function subDays(date, amount, options) {\n  return addDays(date, -amount, options);\n}\n\n// Fallback for modularized imports:\nexport default subDays;\n","import {\n  millisecondsInHour,\n  millisecondsInMinute,\n} from \"./constants.js\";\nimport { constructFrom } from \"./constructFrom.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link parseISO} function options.\n */\n\n/**\n * @name parseISO\n * @category Common Helpers\n * @summary Parse ISO string\n *\n * @description\n * Parse the given string in ISO 8601 format and return an instance of Date.\n *\n * Function accepts complete ISO 8601 formats as well as partial implementations.\n * ISO 8601: http://en.wikipedia.org/wiki/ISO_8601\n *\n * If the argument isn't a string, the function cannot parse the string or\n * the values are invalid, it returns Invalid Date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param argument - The value to convert\n * @param options - An object with options\n *\n * @returns The parsed date in the local time zone\n *\n * @example\n * // Convert string '2014-02-11T11:30:30' to date:\n * const result = parseISO('2014-02-11T11:30:30')\n * //=> Tue Feb 11 2014 11:30:30\n *\n * @example\n * // Convert string '+02014101' to date,\n * // if the additional number of digits in the extended year format is 1:\n * const result = parseISO('+02014101', { additionalDigits: 1 })\n * //=> Fri Apr 11 2014 00:00:00\n */\nexport function parseISO(argument, options) {\n  const invalidDate = () => constructFrom(options?.in, NaN);\n\n  const additionalDigits = options?.additionalDigits ?? 2;\n  const dateStrings = splitDateString(argument);\n\n  let date;\n  if (dateStrings.date) {\n    const parseYearResult = parseYear(dateStrings.date, additionalDigits);\n    date = parseDate(parseYearResult.restDateString, parseYearResult.year);\n  }\n\n  if (!date || isNaN(+date)) return invalidDate();\n\n  const timestamp = +date;\n  let time = 0;\n  let offset;\n\n  if (dateStrings.time) {\n    time = parseTime(dateStrings.time);\n    if (isNaN(time)) return invalidDate();\n  }\n\n  if (dateStrings.timezone) {\n    offset = parseTimezone(dateStrings.timezone);\n    if (isNaN(offset)) return invalidDate();\n  } else {\n    const tmpDate = new Date(timestamp + time);\n    const result = toDate(0, options?.in);\n    result.setFullYear(\n      tmpDate.getUTCFullYear(),\n      tmpDate.getUTCMonth(),\n      tmpDate.getUTCDate(),\n    );\n    result.setHours(\n      tmpDate.getUTCHours(),\n      tmpDate.getUTCMinutes(),\n      tmpDate.getUTCSeconds(),\n      tmpDate.getUTCMilliseconds(),\n    );\n    return result;\n  }\n\n  return toDate(timestamp + time + offset, options?.in);\n}\n\nconst patterns = {\n  dateTimeDelimiter: /[T ]/,\n  timeZoneDelimiter: /[Z ]/i,\n  timezone: /([Z+-].*)$/,\n};\n\nconst dateRegex =\n  /^-?(?:(\\d{3})|(\\d{2})(?:-?(\\d{2}))?|W(\\d{2})(?:-?(\\d{1}))?|)$/;\nconst timeRegex =\n  /^(\\d{2}(?:[.,]\\d*)?)(?::?(\\d{2}(?:[.,]\\d*)?))?(?::?(\\d{2}(?:[.,]\\d*)?))?$/;\nconst timezoneRegex = /^([+-])(\\d{2})(?::?(\\d{2}))?$/;\n\nfunction splitDateString(dateString) {\n  const dateStrings = {};\n  const array = dateString.split(patterns.dateTimeDelimiter);\n  let timeString;\n\n  // The regex match should only return at maximum two array elements.\n  // [date], [time], or [date, time].\n  if (array.length > 2) {\n    return dateStrings;\n  }\n\n  if (/:/.test(array[0])) {\n    timeString = array[0];\n  } else {\n    dateStrings.date = array[0];\n    timeString = array[1];\n    if (patterns.timeZoneDelimiter.test(dateStrings.date)) {\n      dateStrings.date = dateString.split(patterns.timeZoneDelimiter)[0];\n      timeString = dateString.substr(\n        dateStrings.date.length,\n        dateString.length,\n      );\n    }\n  }\n\n  if (timeString) {\n    const token = patterns.timezone.exec(timeString);\n    if (token) {\n      dateStrings.time = timeString.replace(token[1], \"\");\n      dateStrings.timezone = token[1];\n    } else {\n      dateStrings.time = timeString;\n    }\n  }\n\n  return dateStrings;\n}\n\nfunction parseYear(dateString, additionalDigits) {\n  const regex = new RegExp(\n    \"^(?:(\\\\d{4}|[+-]\\\\d{\" +\n      (4 + additionalDigits) +\n      \"})|(\\\\d{2}|[+-]\\\\d{\" +\n      (2 + additionalDigits) +\n      \"})$)\",\n  );\n\n  const captures = dateString.match(regex);\n  // Invalid ISO-formatted year\n  if (!captures) return { year: NaN, restDateString: \"\" };\n\n  const year = captures[1] ? parseInt(captures[1]) : null;\n  const century = captures[2] ? parseInt(captures[2]) : null;\n\n  // either year or century is null, not both\n  return {\n    year: century === null ? year : century * 100,\n    restDateString: dateString.slice((captures[1] || captures[2]).length),\n  };\n}\n\nfunction parseDate(dateString, year) {\n  // Invalid ISO-formatted year\n  if (year === null) return new Date(NaN);\n\n  const captures = dateString.match(dateRegex);\n  // Invalid ISO-formatted string\n  if (!captures) return new Date(NaN);\n\n  const isWeekDate = !!captures[4];\n  const dayOfYear = parseDateUnit(captures[1]);\n  const month = parseDateUnit(captures[2]) - 1;\n  const day = parseDateUnit(captures[3]);\n  const week = parseDateUnit(captures[4]);\n  const dayOfWeek = parseDateUnit(captures[5]) - 1;\n\n  if (isWeekDate) {\n    if (!validateWeekDate(year, week, dayOfWeek)) {\n      return new Date(NaN);\n    }\n    return dayOfISOWeekYear(year, week, dayOfWeek);\n  } else {\n    const date = new Date(0);\n    if (\n      !validateDate(year, month, day) ||\n      !validateDayOfYearDate(year, dayOfYear)\n    ) {\n      return new Date(NaN);\n    }\n    date.setUTCFullYear(year, month, Math.max(dayOfYear, day));\n    return date;\n  }\n}\n\nfunction parseDateUnit(value) {\n  return value ? parseInt(value) : 1;\n}\n\nfunction parseTime(timeString) {\n  const captures = timeString.match(timeRegex);\n  if (!captures) return NaN; // Invalid ISO-formatted time\n\n  const hours = parseTimeUnit(captures[1]);\n  const minutes = parseTimeUnit(captures[2]);\n  const seconds = parseTimeUnit(captures[3]);\n\n  if (!validateTime(hours, minutes, seconds)) {\n    return NaN;\n  }\n\n  return (\n    hours * millisecondsInHour + minutes * millisecondsInMinute + seconds * 1000\n  );\n}\n\nfunction parseTimeUnit(value) {\n  return (value && parseFloat(value.replace(\",\", \".\"))) || 0;\n}\n\nfunction parseTimezone(timezoneString) {\n  if (timezoneString === \"Z\") return 0;\n\n  const captures = timezoneString.match(timezoneRegex);\n  if (!captures) return 0;\n\n  const sign = captures[1] === \"+\" ? -1 : 1;\n  const hours = parseInt(captures[2]);\n  const minutes = (captures[3] && parseInt(captures[3])) || 0;\n\n  if (!validateTimezone(hours, minutes)) {\n    return NaN;\n  }\n\n  return sign * (hours * millisecondsInHour + minutes * millisecondsInMinute);\n}\n\nfunction dayOfISOWeekYear(isoWeekYear, week, day) {\n  const date = new Date(0);\n  date.setUTCFullYear(isoWeekYear, 0, 4);\n  const fourthOfJanuaryDay = date.getUTCDay() || 7;\n  const diff = (week - 1) * 7 + day + 1 - fourthOfJanuaryDay;\n  date.setUTCDate(date.getUTCDate() + diff);\n  return date;\n}\n\n// Validation functions\n\n// February is null to handle the leap year (using ||)\nconst daysInMonths = [31, null, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n\nfunction isLeapYearIndex(year) {\n  return year % 400 === 0 || (year % 4 === 0 && year % 100 !== 0);\n}\n\nfunction validateDate(year, month, date) {\n  return (\n    month >= 0 &&\n    month <= 11 &&\n    date >= 1 &&\n    date <= (daysInMonths[month] || (isLeapYearIndex(year) ? 29 : 28))\n  );\n}\n\nfunction validateDayOfYearDate(year, dayOfYear) {\n  return dayOfYear >= 1 && dayOfYear <= (isLeapYearIndex(year) ? 366 : 365);\n}\n\nfunction validateWeekDate(_year, week, day) {\n  return week >= 1 && week <= 53 && day >= 0 && day <= 6;\n}\n\nfunction validateTime(hours, minutes, seconds) {\n  if (hours === 24) {\n    return minutes === 0 && seconds === 0;\n  }\n\n  return (\n    seconds >= 0 &&\n    seconds < 60 &&\n    minutes >= 0 &&\n    minutes < 60 &&\n    hours >= 0 &&\n    hours < 25\n  );\n}\n\nfunction validateTimezone(_hours, minutes) {\n  return minutes >= 0 && minutes <= 59;\n}\n\n// Fallback for modularized imports:\nexport default parseISO;\n","import { getRoundingMethod } from \"./_lib/getRoundingMethod.js\";\nimport { constructFrom } from \"./constructFrom.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link roundToNearestMinutes} function options.\n */\n\n/**\n * @name roundToNearestMinutes\n * @category Minute Helpers\n * @summary Rounds the given date to the nearest minute\n *\n * @description\n * Rounds the given date to the nearest minute (or number of minutes).\n * Rounds up when the given date is exactly between the nearest round minutes.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to round\n * @param options - An object with options.\n *\n * @returns The new date rounded to the closest minute\n *\n * @example\n * // Round 10 July 2014 12:12:34 to nearest minute:\n * const result = roundToNearestMinutes(new Date(2014, 6, 10, 12, 12, 34))\n * //=> Thu Jul 10 2014 12:13:00\n *\n * @example\n * // Round 10 July 2014 12:12:34 to nearest quarter hour:\n * const result = roundToNearestMinutes(new Date(2014, 6, 10, 12, 12, 34), { nearestTo: 15 })\n * //=> Thu Jul 10 2014 12:15:00\n *\n * @example\n * // Floor (rounds down) 10 July 2014 12:12:34 to nearest minute:\n * const result = roundToNearestMinutes(new Date(2014, 6, 10, 12, 12, 34), { roundingMethod: 'floor' })\n * //=> Thu Jul 10 2014 12:12:00\n *\n * @example\n * // Ceil (rounds up) 10 July 2014 12:12:34 to nearest half hour:\n * const result = roundToNearestMinutes(new Date(2014, 6, 10, 12, 12, 34), { roundingMethod: 'ceil', nearestTo: 30 })\n * //=> Thu Jul 10 2014 12:30:00\n */\nexport function roundToNearestMinutes(date, options) {\n  const nearestTo = options?.nearestTo ?? 1;\n\n  if (nearestTo < 1 || nearestTo > 30) return constructFrom(date, NaN);\n\n  const date_ = toDate(date, options?.in);\n  const fractionalSeconds = date_.getSeconds() / 60;\n  const fractionalMilliseconds = date_.getMilliseconds() / 1000 / 60;\n  const minutes =\n    date_.getMinutes() + fractionalSeconds + fractionalMilliseconds;\n\n  const method = options?.roundingMethod ?? \"round\";\n  const roundingMethod = getRoundingMethod(method);\n\n  const roundedMinutes = roundingMethod(minutes / nearestTo) * nearestTo;\n\n  date_.setMinutes(roundedMinutes, 0, 0);\n  return date_;\n}\n\n// Fallback for modularized imports:\nexport default roundToNearestMinutes;\n","import { constructFrom } from \"./constructFrom.js\";\nimport { getDaysInMonth } from \"./getDaysInMonth.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link setMonth} function options.\n */\n\n/**\n * @name setMonth\n * @category Month Helpers\n * @summary Set the month to the given date.\n *\n * @description\n * Set the month to the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param month - The month index to set (0-11)\n * @param options - The options\n *\n * @returns The new date with the month set\n *\n * @example\n * // Set February to 1 September 2014:\n * const result = setMonth(new Date(2014, 8, 1), 1)\n * //=> Sat Feb 01 2014 00:00:00\n */\nexport function setMonth(date, month, options) {\n  const _date = toDate(date, options?.in);\n  const year = _date.getFullYear();\n  const day = _date.getDate();\n\n  const midMonth = constructFrom(options?.in || date, 0);\n  midMonth.setFullYear(year, month, 15);\n  midMonth.setHours(0, 0, 0, 0);\n  const daysInMonth = getDaysInMonth(midMonth);\n\n  // Set the earlier date, allows to wrap Jan 31 to Feb 28\n  _date.setMonth(month, Math.min(day, daysInMonth));\n  return _date;\n}\n\n// Fallback for modularized imports:\nexport default setMonth;\n","import { constructFrom } from \"./constructFrom.js\";\nimport { setMonth } from \"./setMonth.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link set} function options.\n */\n\n/**\n * @name set\n * @category Common Helpers\n * @summary Set date values to a given date.\n *\n * @description\n * Set date values to a given date.\n *\n * Sets time values to date from object `values`.\n * A value is not set if it is undefined or null or doesn't exist in `values`.\n *\n * Note about bundle size: `set` does not internally use `setX` functions from date-fns but instead opts\n * to use native `Date#setX` methods. If you use this function, you may not want to include the\n * other `setX` functions that date-fns provides if you are concerned about the bundle size.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param values - The date values to be set\n * @param options - The options\n *\n * @returns The new date with options set\n *\n * @example\n * // Transform 1 September 2014 into 20 October 2015 in a single line:\n * const result = set(new Date(2014, 8, 20), { year: 2015, month: 9, date: 20 })\n * //=> Tue Oct 20 2015 00:00:00\n *\n * @example\n * // Set 12 PM to 1 September 2014 01:23:45 to 1 September 2014 12:00:00:\n * const result = set(new Date(2014, 8, 1, 1, 23, 45), { hours: 12 })\n * //=> Mon Sep 01 2014 12:23:45\n */\nexport function set(date, values, options) {\n  let _date = toDate(date, options?.in);\n\n  // Check if date is Invalid Date because Date.prototype.setFullYear ignores the value of Invalid Date\n  if (isNaN(+_date)) return constructFrom(options?.in || date, NaN);\n\n  if (values.year != null) _date.setFullYear(values.year);\n  if (values.month != null) _date = setMonth(_date, values.month);\n  if (values.date != null) _date.setDate(values.date);\n  if (values.hours != null) _date.setHours(values.hours);\n  if (values.minutes != null) _date.setMinutes(values.minutes);\n  if (values.seconds != null) _date.setSeconds(values.seconds);\n  if (values.milliseconds != null) _date.setMilliseconds(values.milliseconds);\n\n  return _date;\n}\n\n// Fallback for modularized imports:\nexport default set;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link setMilliseconds} function options.\n */\n\n/**\n * @name setMilliseconds\n * @category Millisecond Helpers\n * @summary Set the milliseconds to the given date.\n *\n * @description\n * Set the milliseconds to the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param milliseconds - The milliseconds of the new date\n * @param options - The options\n *\n * @returns The new date with the milliseconds set\n *\n * @example\n * // Set 300 milliseconds to 1 September 2014 11:30:40.500:\n * const result = setMilliseconds(new Date(2014, 8, 1, 11, 30, 40, 500), 300)\n * //=> Mon Sep 01 2014 11:30:40.300\n */\nexport function setMilliseconds(date, milliseconds, options) {\n  const _date = toDate(date, options?.in);\n  _date.setMilliseconds(milliseconds);\n  return _date;\n}\n\n// Fallback for modularized imports:\nexport default setMilliseconds;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link setSeconds} function options.\n */\n\n/**\n * @name setSeconds\n * @category Second Helpers\n * @summary Set the seconds to the given date, with context support.\n *\n * @description\n * Set the seconds to the given date, with an optional context for time zone specification.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param seconds - The seconds of the new date\n * @param options - An object with options\n *\n * @returns The new date with the seconds set\n *\n * @example\n * // Set 45 seconds to 1 September 2014 11:30:40:\n * const result = setSeconds(new Date(2014, 8, 1, 11, 30, 40), 45)\n * //=> Mon Sep 01 2014 11:30:45\n */\nexport function setSeconds(date, seconds, options) {\n  const _date = toDate(date, options?.in);\n  _date.setSeconds(seconds);\n  return _date;\n}\n\n// Fallback for modularized imports:\nexport default setSeconds;\n","import { constructFrom } from \"./constructFrom.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link setYear} function options.\n */\n\n/**\n * @name setYear\n * @category Year Helpers\n * @summary Set the year to the given date.\n *\n * @description\n * Set the year to the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param year - The year of the new date\n * @param options - An object with options.\n *\n * @returns The new date with the year set\n *\n * @example\n * // Set year 2013 to 1 September 2014:\n * const result = setYear(new Date(2014, 8, 1), 2013)\n * //=> Sun Sep 01 2013 00:00:00\n */\nexport function setYear(date, year, options) {\n  const date_ = toDate(date, options?.in);\n\n  // Check if date is Invalid Date because Date.prototype.setFullYear ignores the value of Invalid Date\n  if (isNaN(+date_)) return constructFrom(options?.in || date, NaN);\n\n  date_.setFullYear(year);\n  return date_;\n}\n\n// Fallback for modularized imports:\nexport default setYear;\n","import { addMonths } from \"./addMonths.js\";\n\n/**\n * The subMonths function options.\n */\n\n/**\n * @name subMonths\n * @category Month Helpers\n * @summary Subtract the specified number of months from the given date.\n *\n * @description\n * Subtract the specified number of months from the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param amount - The amount of months to be subtracted.\n * @param options - An object with options\n *\n * @returns The new date with the months subtracted\n *\n * @example\n * // Subtract 5 months from 1 February 2015:\n * const result = subMonths(new Date(2015, 1, 1), 5)\n * //=> Mon Sep 01 2014 00:00:00\n */\nexport function subMonths(date, amount, options) {\n  return addMonths(date, -amount, options);\n}\n\n// Fallback for modularized imports:\nexport default subMonths;\n","import { constructFrom } from \"./constructFrom.js\";\nimport { subDays } from \"./subDays.js\";\nimport { subMonths } from \"./subMonths.js\";\n\n/**\n * The {@link sub} function options.\n */\n\n/**\n * @name sub\n * @category Common Helpers\n * @summary Subtract the specified years, months, weeks, days, hours, minutes and seconds from the given date.\n *\n * @description\n * Subtract the specified years, months, weeks, days, hours, minutes and seconds from the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param duration - The object with years, months, weeks, days, hours, minutes and seconds to be subtracted\n * @param options - An object with options\n *\n * | Key     | Description                        |\n * |---------|------------------------------------|\n * | years   | Amount of years to be subtracted   |\n * | months  | Amount of months to be subtracted  |\n * | weeks   | Amount of weeks to be subtracted   |\n * | days    | Amount of days to be subtracted    |\n * | hours   | Amount of hours to be subtracted   |\n * | minutes | Amount of minutes to be subtracted |\n * | seconds | Amount of seconds to be subtracted |\n *\n * All values default to 0\n *\n * @returns The new date with the seconds subtracted\n *\n * @example\n * // Subtract the following duration from 15 June 2017 15:29:20\n * const result = sub(new Date(2017, 5, 15, 15, 29, 20), {\n *   years: 2,\n *   months: 9,\n *   weeks: 1,\n *   days: 7,\n *   hours: 5,\n *   minutes: 9,\n *   seconds: 30\n * })\n * //=> Mon Sep 1 2014 10:19:50\n */\nexport function sub(date, duration, options) {\n  const {\n    years = 0,\n    months = 0,\n    weeks = 0,\n    days = 0,\n    hours = 0,\n    minutes = 0,\n    seconds = 0,\n  } = duration;\n\n  const withoutMonths = subMonths(date, months + years * 12, options);\n  const withoutDays = subDays(withoutMonths, days + weeks * 7, options);\n\n  const minutesToSub = minutes + hours * 60;\n  const secondsToSub = seconds + minutesToSub * 60;\n  const msToSub = secondsToSub * 1000;\n\n  return constructFrom(options?.in || date, +withoutDays - msToSub);\n}\n\n// Fallback for modularized imports:\nexport default sub;\n","import { addYears } from \"./addYears.js\";\n\n/**\n * The {@link subYears} function options.\n */\n\n/**\n * @name subYears\n * @category Year Helpers\n * @summary Subtract the specified number of years from the given date.\n *\n * @description\n * Subtract the specified number of years from the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param amount - The amount of years to be subtracted.\n * @param options - An object with options\n *\n * @returns The new date with the years subtracted\n *\n * @example\n * // Subtract 5 years from 1 September 2014:\n * const result = subYears(new Date(2014, 8, 1), 5)\n * //=> Tue Sep 01 2009 00:00:00\n */\nexport function subYears(date, amount, options) {\n  return addYears(date, -amount, options);\n}\n\n// Fallback for modularized imports:\nexport default subYears;\n","/**\n * Time zone name format.\n */\n\n/**\n * The function returns the time zone name for the given date in the specified\n * time zone.\n *\n * It uses the `Intl.DateTimeFormat` API and by default outputs the time zone\n * name in a long format, e.g. \"Pacific Standard Time\" or\n * \"Singapore Standard Time\".\n *\n * It is possible to specify the format as the third argument using one of the following options\n *\n * - \"short\": e.g. \"EDT\" or \"GMT+8\".\n * - \"long\": e.g. \"Eastern Daylight Time\".\n * - \"shortGeneric\": e.g. \"ET\" or \"Singapore Time\".\n * - \"longGeneric\": e.g. \"Eastern Time\" or \"Singapore Standard Time\".\n *\n * These options correspond to TR35 tokens `z..zzz`, `zzzz`, `v`, and `vvvv` respectively: https://www.unicode.org/reports/tr35/tr35-dates.html#dfst-zone\n *\n * @param timeZone - Time zone name (IANA or UTC offset)\n * @param date - Date object to get the time zone name for\n * @param format - Optional format of the time zone name. Defaults to \"long\". Can be \"short\", \"long\", \"shortGeneric\", or \"longGeneric\".\n *\n * @returns Time zone name (e.g. \"Singapore Standard Time\")\n */\nexport function tzName(timeZone, date, format = \"long\") {\n  return new Intl.DateTimeFormat(\"en-US\", {\n    // Enforces engine to render the time. Without the option JavaScriptCore omits it.\n    hour: \"numeric\",\n    timeZone: timeZone,\n    timeZoneName: format\n  }).format(date).split(/\\s/g) // Format.JS uses non-breaking spaces\n  .slice(2) // Skip the hour and AM/PM parts\n  .join(\" \");\n}","const offsetFormatCache = {};\nconst offsetCache = {};\n\n/**\n * The function returns UTC offset in minutes for the given date in specified\n * time zone.\n *\n * Unlike `Date.prototype.getTimezoneOffset`, this function returns the value\n * mirrored to the sign of the offset in the time zone. For Asia/Singapore\n * (UTC+8), `tzOffset` returns `480`, while `getTimezoneOffset` returns `-480`.\n *\n * It uses `Intl.DateTimeFormat` internally to access otherwise unavailable\n * runtime's time zone data, and falls back to basic manual parsing if Intl API\n * is not supported (e.g., older Node.js versions, React Native's Hermes, etc.).\n *\n * @param timeZone - Time zone name (IANA or UTC offset).\n * @param date - Date to check the offset for.\n *\n * @returns UTC offset in minutes (e.g., `480` for date in UTC+8).\n */\nexport function tzOffset(timeZone, date) {\n  try {\n    // Create `Intl.DateTimeFormat` with `\"longOffset\"` that gives us consistent\n    // date strings like `\"5/19/2026, GMT-08:00\"`.\n    const format = offsetFormatCache[timeZone] ||= new Intl.DateTimeFormat(\"en-US\", {\n      timeZone,\n      timeZoneName: \"longOffset\"\n    }).format;\n\n    // Get `\"-08:00\"`.\n    const offsetStr = format(date).split(\"GMT\")[1];\n\n    // Avoid parsing the same offset string.\n    if (offsetStr in offsetCache) return offsetCache[offsetStr];\n\n    // Calculate offset from `[\"-08\", \"00\"]` and cache it.\n    return calcOffset(offsetStr, offsetStr.split(\":\"));\n  } catch {\n    // Fallback to manual parsing if the runtime doesn't support\n    // `±HH:MM/±HHMM/±HH`. See: https://github.com/nodejs/node/issues/53419.\n    if (timeZone in offsetCache) return offsetCache[timeZone];\n    const captures = timeZone?.match(offsetRe);\n    if (captures) return calcOffset(timeZone, captures.slice(1));\n    return NaN;\n  }\n}\nconst offsetRe = /([+-]\\d\\d):?(\\d\\d)?/;\nfunction calcOffset(cacheStr, values) {\n  const hours = +(values[0] || 0);\n  const minutes = +(values[1] || 0);\n  // Convert seconds to minutes by dividing by 60 to keep the function return in minutes.\n  const seconds = +(values[2] || 0) / 60;\n  return offsetCache[cacheStr] = hours * 60 + minutes > 0 ? hours * 60 + minutes + seconds : hours * 60 - minutes - seconds;\n}","import { tzOffset } from \"../tzOffset/index.js\";\n\n// TZDate stores time in two `Date` objects because native `Date` can only\n// expose local fields in the system time zone.\n//\n// The external date (`this`) stores the real timestamp. It is the value used by\n// `getTime()`, `valueOf()`, UTC getters/setters, comparisons, and arithmetic.\n// Its local getters are not used for target-zone fields because they would read\n// the timestamp through the system time zone.\n//\n// The internal date (`this.internal`) stores the target-zone wall-clock fields.\n// We read and write those fields through UTC getters/setters so the host system\n// time zone cannot reinterpret them. For example, `getHours()` returns\n// `internal.getUTCHours()`, and `setHours()` writes `internal.setUTCHours(...)`.\n//\n// Syncing moves data between the two representations:\n//\n// - `syncToInternal` starts from the external timestamp and rebuilds internal\n//   wall-clock fields using `this.timeZone` offset.\n//\n// - `syncFromInternal` starts from internal wall-clock fields, writes them into\n//   the external date, then adjusts that timestamp for the system/target offset\n//   difference and DST edge cases.\n//\n// The public TZDate value is the combination of both: external is the instant,\n// internal is the wall-clock view of that instant in `this.timeZone`.\n\nexport class TZDateMini extends Date {\n  //#region static\n\n  constructor(...args) {\n    super();\n\n    // Time zone string is always the last string argument unless date string\n    // is passed (as a single argument).\n    if (args.length > 1 && typeof args[args.length - 1] === \"string\") {\n      this.timeZone = args.pop();\n    }\n    this.internal = new Date();\n\n    // Validate the time zone by checking its offset.\n    if (isNaN(tzOffset(this.timeZone, this))) {\n      this.setTime(NaN);\n    } else {\n      if (!args.length) {\n        // No arguments passed: use current time\n        this.setTime(Date.now());\n      } else if (typeof args[0] === \"number\" && (args.length === 1 || args.length === 2 && typeof args[1] !== \"number\")) {\n        // Timestamp passed: use it as is\n        this.setTime(args[0]);\n      } else if (typeof args[0] === \"string\") {\n        // `Date` string passed: parse it as external date\n        this.setTime(+new Date(args[0]));\n      } else if (args[0] instanceof Date) {\n        // `Date` passed: use its timestamp\n        this.setTime(+args[0]);\n      } else {\n        // `Date` values passed:\n\n        // Set it as external date.\n        this.setTime(+new Date(...args));\n\n        // Adjust internal and external dates considering that we might have\n        // landed on the DST hour.\n        adjustToSystemTZ(this, args);\n      }\n    }\n  }\n  static tz(tz, ...args) {\n    return args.length ? new TZDateMini(...args, tz) : new TZDateMini(Date.now(), tz);\n  }\n\n  //#endregion\n\n  //#region time zone\n\n  withTimeZone(timeZone) {\n    return new TZDateMini(+this, timeZone);\n  }\n  getTimezoneOffset() {\n    const offset = -tzOffset(this.timeZone, this);\n    // Remove the seconds offset using `Math.floor` for negative UTC time zones\n    // and `Math.ceil` for positive UTC time zones.\n    return offset > 0 ? Math.floor(offset) : Math.ceil(offset);\n  }\n\n  //#endregion\n\n  //#region time\n\n  setTime(_time) {\n    // Use the native `setTime` to the external date time.\n    Date.prototype.setTime.apply(this, arguments);\n\n    // Then apply it to the internal date adjusting to the timezone offset.\n    syncToInternal(this);\n    return +this;\n  }\n\n  //#endregion\n\n  //#region date-fns integration\n\n  [Symbol.for(\"constructDateFrom\")](date) {\n    return new TZDateMini(+new Date(date), this.timeZone);\n  }\n\n  //#endregion\n}\n\n// Assign getters and setters\nconst re = /^(get|set)(?!UTC)/;\nObject.getOwnPropertyNames(Date.prototype).forEach(method => {\n  if (!re.test(method)) return;\n  const utcMethod = method.replace(re, \"$1UTC\");\n  // Filter out methods without UTC counterparts\n  if (!TZDateMini.prototype[utcMethod]) return;\n  if (method.startsWith(\"get\")) {\n    // Delegate to internal date's UTC method\n    TZDateMini.prototype[method] = function () {\n      return this.internal[utcMethod]();\n    };\n  } else {\n    // Assign regular setter\n    TZDateMini.prototype[method] = function () {\n      Date.prototype[utcMethod].apply(this.internal, arguments);\n      syncFromInternal(this);\n      return +this;\n    };\n\n    // Assign UTC setter\n    TZDateMini.prototype[utcMethod] = function () {\n      Date.prototype[utcMethod].apply(this, arguments);\n      syncToInternal(this);\n      return +this;\n    };\n  }\n});\n\n/**\n * @internal\n * Function syncs time to internal date, applying the current time zone offset.\n *\n * @param {Date} date - `Date` to sync\n */\nfunction syncToInternal(date) {\n  // Start internal from the same real timestamp as external.\n  date.internal.setTime(+date);\n\n  // Shift internal by the target offset so its UTC fields become the target-zone\n  // wall-clock fields for the external timestamp.\n  //\n  //   o internal UTC fields: 2024-02-11 00:00\n  //   |\n  //   | + Asia/Singapore offset (+08:00)\n  //   v\n  //   x internal UTC fields: 2024-02-11 08:00\n  //\n  date.internal.setUTCSeconds(date.internal.getUTCSeconds() -\n  // Round after converting minutes to seconds to avoid fractional offset\n  // precision errors from historical offsets.\n  Math.round(-tzOffset(date.timeZone, date) * 60));\n}\n\n/**\n * @internal\n * Function syncs internal wall-clock fields into the external date.\n *\n * @param {Date} date - The date to sync\n */\nfunction syncFromInternal(date) {\n  // Copy target-zone wall-clock fields from internal into external using native\n  // local setters. At this point external holds the right field values but they\n  // are interpreted in the system time zone; `adjustToSystemTZ` fixes that.\n  Date.prototype.setFullYear.call(date, date.internal.getUTCFullYear(), date.internal.getUTCMonth(), date.internal.getUTCDate());\n  Date.prototype.setHours.call(date, date.internal.getUTCHours(), date.internal.getUTCMinutes(), date.internal.getUTCSeconds(), date.internal.getUTCMilliseconds());\n\n  // Now we have to adjust the date to the system time zone\n  adjustToSystemTZ(date);\n}\n\n/**\n * @internal\n * Function adjusts the date to the system time zone. It uses the time zone\n * differences to calculate the offset and adjust the date.\n *\n * We use it when constructing `TZDate` and syncing the external date from\n * the internal one.\n *\n * @param {TZDate} date - `TZDate` to adjust.\n */\nfunction adjustToSystemTZ(date, constructorArgs) {\n  // Keep the intended target-zone wall-clock value before native Date/system\n  // time zone normalization can move it. Later corrections compare against this\n  // value to distinguish intended DST normalization from accidental drift.\n  const expectedInternalTime = Array.isArray(constructorArgs) ? constructorArgsToInternalTime(constructorArgs) : +date.internal;\n  //#region Initial offset calculation\n\n  // Current target time zone offset at the native timestamp. It may include\n  // historical offset seconds, which we preserve for the seconds adjustment.\n  const offsetWithSeconds = tzOffset(date.timeZone, date);\n\n  // Minute-precision target offset used by minute-based timestamp adjustments.\n  // Historical offsets can contain seconds, so we strip the fractional minute\n  // here and handle remaining seconds in the seconds adjustment below.\n  const offset = offsetWithSeconds > 0 ? Math.floor(offsetWithSeconds) : Math.ceil(offsetWithSeconds);\n\n  //#endregion\n\n  //#region System DST adjustment\n\n  // Native `Date` may normalize the requested wall time when the system time\n  // zone skips that hour for DST.\n  //\n  // We compare the system wall-clock hour represented by the external date with\n  // the wall-clock hour stored in the internal date. If they differ, the next\n  // offset-diff calculation may need the previous system offset, because the\n  // current external timestamp is already after the system DST jump.\n\n  // Previous-hour reference used to detect whether the system offset changed\n  // immediately before the current native timestamp.\n  const prevHour = new Date(+date);\n\n  // Use UTC math so subtracting one hour cannot be normalized back into the\n  // same missing local DST hour.\n  prevHour.setUTCHours(prevHour.getUTCHours() - 1);\n\n  // Current system offset at the native timestamp.\n  const systemOffset = -new Date(+date).getTimezoneOffset();\n\n  // System offset one real hour before the native timestamp.\n  const prevHourSystemOffset = -new Date(+prevHour).getTimezoneOffset();\n\n  // Non-zero when the system offset changed between `prevHour` and `date`.\n  const systemDSTChange = systemOffset - prevHourSystemOffset;\n\n  // System offset to use in the later system-target offset difference.\n  // Defaults to the current system offset and switches to the previous offset\n  // only when native `Date` normalized a missing system wall time.\n  let systemOffsetForDiff = systemOffset;\n  if (systemDSTChange && systemOffset !== offset) {\n    // System wall-clock hour represented by the current external timestamp.\n    const systemHour = Date.prototype.getHours.apply(date);\n\n    // Target wall-clock hour currently stored in internal fields. Constructors\n    // get it from arguments because internal may have already been synced from\n    // the normalized external timestamp; setters get it directly from internal.\n    const expectedHour = Array.isArray(constructorArgs) ? constructorArgs[3] || 0 : date.internal.getUTCHours();\n    if (systemHour !== expectedHour) {\n      // Check whether using the current system offset would keep the target\n      // offset unchanged. If so, the only DST jump we crossed is the system\n      // one, so the diff should use the pre-DST system offset.\n      const testDate = new Date(+date);\n\n      // Difference that the later offset-diff step would apply with the\n      // current system offset.\n      const testOffsetDiff = systemOffset - offset;\n      if (testOffsetDiff) testDate.setUTCMinutes(testDate.getUTCMinutes() + testOffsetDiff);\n\n      // Target offset after applying the current system offset difference.\n      const testOffsetWithSeconds = tzOffset(date.timeZone, testDate);\n\n      // Target offset without historical seconds, matching `offset`.\n      const testOffset = testOffsetWithSeconds > 0 ? Math.floor(testOffsetWithSeconds) : Math.ceil(testOffsetWithSeconds);\n      if (testOffset === offset) systemOffsetForDiff = prevHourSystemOffset;\n    }\n  }\n\n  //#endregion\n\n  //#region System diff adjustment\n\n  // Move external from the system-zone interpretation of internal fields toward\n  // the timestamp that represents those fields in the target time zone.\n  //\n  // At this point native `Date` has treated the internal wall-clock fields as if\n  // they belonged to the system zone. The system-target offset difference moves\n  // external by the distance between that system interpretation and the target\n  // interpretation.\n\n  // Difference between the system offset selected above and the minute-precision\n  // target offset. Positive values move external forward; negative values move\n  // it backward.\n  const offsetDiff = systemOffsetForDiff - offset;\n  if (offsetDiff)\n    // Apply the system-target minute difference to external. Internal is\n    // rebuilt from the final external timestamp after all adjustments are\n    // complete.\n    //\n    //   o  external as target: 2023-01-31 23:00\n    //   |\n    //   |  add `offsetDiff`\n    //   v\n    //   x  external as target: 2023-02-01 12:00\n    //\n    Date.prototype.setUTCMinutes.call(date, Date.prototype.getUTCMinutes.call(date) + offsetDiff);\n\n  //#endregion\n\n  //#region Seconds system diff adjustment\n\n  // Historical time zone offsets can include seconds, but the minute-based\n  // offset adjustment above intentionally used minute precision.\n  //\n  // This adjustment applies the remaining seconds difference to external. For\n  // example, historical Singapore used UTC+06:55:25, while ISO formatting shows\n  // only `+06:55`; without the seconds correction, setter paths keep the wrong\n  // wall-clock seconds.\n\n  // Clone external as a native `Date` so we can inspect how the system time zone\n  // represents the same timestamp.\n  const systemDate = new Date(+date);\n\n  // Zero UTC seconds before reading system seconds. Any remaining local seconds\n  // then come from the system time zone offset rather than from the timestamp's\n  // own seconds value.\n  systemDate.setUTCSeconds(0);\n\n  // Seconds part contributed by the system time zone offset. Negative offsets\n  // need wrapping because `Date#getSeconds()` returns values in the 0..59 range.\n  const systemSecondsOffset = systemOffset > 0 ? systemDate.getSeconds() : (systemDate.getSeconds() - 60) % 60;\n\n  // Seconds part contributed by the target time zone offset.\n  const secondsOffset = Math.round(-(tzOffset(date.timeZone, date) * 60)) % 60;\n  if (secondsOffset || systemSecondsOffset)\n    // Apply the remaining second-level system-target difference to external.\n    //\n    //   o  external as Asia/Singapore: 1900-01-01 00:00:56\n    //   |\n    //   |  + `secondsOffset`\n    //   |  + `systemSecondsOffset`\n    //   v\n    //   x  external as Asia/Singapore: 1900-01-01 00:00:31\n    //\n    Date.prototype.setUTCSeconds.call(date, Date.prototype.getUTCSeconds.call(date) + secondsOffset + systemSecondsOffset);\n\n  //#endregion\n\n  //#region Post-adjustment DST fix\n\n  // The first system-target offset move can cross a target-zone DST boundary.\n  //\n  // When that happens, the target offset at the new external timestamp differs\n  // from the target offset used for `offsetDiff`. We compare the original move\n  // with the move that would be calculated at the new timestamp, then apply the\n  // difference to external.\n\n  // Target offset at the current external timestamp, including historical\n  // seconds for the later seconds adjustment.\n  const postOffsetWithSeconds = tzOffset(date.timeZone, date);\n\n  // Minute-precision target offset at the current external timestamp.\n  const postOffset = postOffsetWithSeconds > 0 ? Math.floor(postOffsetWithSeconds) : Math.ceil(postOffsetWithSeconds);\n\n  // System offset at the current external timestamp.\n  const postSystemOffset = -new Date(+date).getTimezoneOffset();\n\n  // System-target offset difference at the current external timestamp.\n  const postOffsetDiff = postSystemOffset - postOffset;\n\n  // Whether the target offset changed after the first offset move.\n  const offsetChanged = postOffset !== offset;\n\n  // Difference between the current offset move and the move already applied.\n  const postDiff = postOffsetDiff - offsetDiff;\n\n  // If the first offset move already normalized a target DST gap forward, the\n  // generic post-DST correction below would undo that valid normalization. This\n  // happens, for example, with America/New_York 02:00 during spring-forward when\n  // the system zone also changes offset around the same instant.\n  const targetDSTShift = postOffset - offset;\n\n  // Candidate timestamp that would represent the requested wall-clock time with\n  // the post-transition target offset. If it still does not round-trip to the\n  // requested wall-clock fields, the requested time is inside a target DST gap.\n  const postOffsetCandidate = expectedInternalTime - postOffset * 60 * 1000;\n\n  // Only positive target offset shifts are spring-forward gaps. Negative shifts\n  // are fall-back overlaps and still need the regular post-adjustment path.\n  const normalizedTargetDSTGap = targetDSTShift > 0 && targetInternalTime(date) - expectedInternalTime === targetDSTShift * 60 * 1000 && targetInternalTime(date, postOffsetCandidate) !== expectedInternalTime;\n  if (offsetChanged && postDiff && !normalizedTargetDSTGap) {\n    // Apply the target-DST correction to external. In the backward-crossing case\n    // shown here, this lands on an intermediate value that needs `offsetChange`\n    // below.\n    //\n    //   o  external as America/New_York: 2023-03-12 03:00 EDT\n    //   |\n    //   |  + `postDiff`\n    //   v\n    //   x  external as America/New_York: 2023-03-12 01:00 EST\n    //\n    Date.prototype.setUTCMinutes.call(date, Date.prototype.getUTCMinutes.call(date) + postDiff);\n\n    // Target offset after applying `postDiff`. It may change again if the\n    // correction itself crosses a target-zone DST boundary.\n    const newOffsetWithSeconds = tzOffset(date.timeZone, date);\n\n    // Minute-precision target offset after applying `postDiff`.\n    const newOffset = newOffsetWithSeconds > 0 ? Math.floor(newOffsetWithSeconds) : Math.ceil(newOffsetWithSeconds);\n\n    // Offset change caused by the `postDiff` move itself.\n    const offsetChange = postOffset - newOffset;\n\n    // If the correction moved external backward across the target DST boundary,\n    // apply the boundary change so external lands on the valid target-zone\n    // timestamp. Forward crossings are already normalized by native Date, and\n    // applying this correction there would undo the valid post-DST result.\n    if (offsetChange && postDiff < 0) {\n      // Apply the second target-DST correction to external.\n      //\n      //   o  external as America/New_York: 2023-03-12 01:00 EST\n      //   |\n      //   |  + `offsetChange`\n      //   v\n      //   x  external as America/New_York: 2023-03-12 03:00 EDT\n      //\n      Date.prototype.setUTCMinutes.call(date, Date.prototype.getUTCMinutes.call(date) + offsetChange);\n    }\n  }\n\n  //#endregion\n\n  // Rebuild internal wall-clock fields from the final external timestamp.\n  syncToInternal(date);\n\n  // Native Date can normalize historical system offsets with minute and second\n  // precision before we adjust to the target time zone. Correct only small\n  // historical drift so DST gap normalization (usually one hour) remains intact.\n  const expectedTime = constructorArgs ? expectedInternalTime : expectedInternalTime + secondsOffset * 1000;\n  const drift = expectedTime - +date.internal;\n  if (drift && Math.abs(drift) < 30 * 60 * 1000) {\n    Date.prototype.setTime.call(date, +date + drift);\n    syncToInternal(date);\n  }\n}\nfunction constructorArgsToInternalTime(args) {\n  // Mirror Date's date-value constructor defaults while preserving explicit\n  // `undefined` behavior. Missing month/day default, but passed `undefined`\n  // should remain invalid just like `Date.UTC(year, undefined, ...)`.\n  return Date.UTC(args[0], args.length > 1 ? args[1] : 0, args.length > 2 ? args[2] : 1, ...args.slice(3));\n}\nfunction targetInternalTime(date, time) {\n  // Compute the target-zone wall-clock representation for a timestamp without\n  // mutating the TZDate. This mirrors syncToInternal for temporary checks.\n  const internal = new Date(time ?? +date);\n  internal.setUTCSeconds(internal.getUTCSeconds() - Math.round(-tzOffset(date.timeZone, internal) * 60));\n  return +internal;\n}","import { tzName } from \"../tzName/index.js\";\nimport { TZDateMini } from \"./mini.js\";\nexport class TZDate extends TZDateMini {\n  //#region static\n\n  static tz(tz, ...args) {\n    return args.length ? new TZDate(...args, tz) : new TZDate(Date.now(), tz);\n  }\n\n  //#endregion\n\n  //#region representation\n\n  toISOString() {\n    const [sign, hours, minutes] = this.tzComponents();\n    const tz = `${sign}${hours}:${minutes}`;\n    return this.internal.toISOString().slice(0, -1) + tz;\n  }\n  toString() {\n    // \"Tue Aug 13 2024 07:50:19 GMT+0800 (Singapore Standard Time)\";\n    return `${this.toDateString()} ${this.toTimeString()}`;\n  }\n  toDateString() {\n    // toUTCString returns RFC 7231 (\"Mon, 12 Aug 2024 23:36:08 GMT\")\n    const [day, date, month, year] = this.internal.toUTCString().split(\" \");\n    // \"Tue Aug 13 2024\"\n    return `${day?.slice(0, -1) /* Remove \",\" */} ${month} ${date} ${year}`;\n  }\n  toTimeString() {\n    // toUTCString returns RFC 7231 (\"Mon, 12 Aug 2024 23:36:08 GMT\")\n    const time = this.internal.toUTCString().split(\" \")[4];\n    const [sign, hours, minutes] = this.tzComponents();\n    // \"07:42:23 GMT+0800 (Singapore Standard Time)\"\n    return `${time} GMT${sign}${hours}${minutes} (${tzName(this.timeZone, this)})`;\n  }\n  toLocaleString(locales, options) {\n    return Date.prototype.toLocaleString.call(this, locales, {\n      ...options,\n      timeZone: options?.timeZone || this.timeZone\n    });\n  }\n  toLocaleDateString(locales, options) {\n    return Date.prototype.toLocaleDateString.call(this, locales, {\n      ...options,\n      timeZone: options?.timeZone || this.timeZone\n    });\n  }\n  toLocaleTimeString(locales, options) {\n    return Date.prototype.toLocaleTimeString.call(this, locales, {\n      ...options,\n      timeZone: options?.timeZone || this.timeZone\n    });\n  }\n\n  //#endregion\n\n  //#region private\n\n  tzComponents() {\n    const offset = this.getTimezoneOffset();\n    const sign = offset > 0 ? \"-\" : \"+\";\n    const hours = String(Math.floor(Math.abs(offset) / 60)).padStart(2, \"0\");\n    const minutes = String(Math.abs(offset) % 60).padStart(2, \"0\");\n    return [sign, hours, minutes];\n  }\n\n  //#endregion\n\n  withTimeZone(timeZone) {\n    return new TZDate(+this, timeZone);\n  }\n\n  //#region date-fns integration\n\n  [Symbol.for(\"constructDateFrom\")](date) {\n    return new TZDate(+new Date(date), this.timeZone);\n  }\n\n  //#endregion\n}","import { Fragment as e, Teleport as t, Transition as n, computed as r, createBlock as i, createCommentVNode as a, createElementBlock as o, createElementVNode as s, createSlots as c, createTextVNode as l, createVNode as u, defineComponent as d, guardReactiveProps as f, h as p, inject as m, mergeDefaults as h, mergeProps as g, nextTick as _, normalizeClass as v, normalizeProps as y, normalizeStyle as b, onBeforeUpdate as x, onMounted as S, onUnmounted as C, openBlock as w, provide as T, reactive as E, readonly as D, ref as O, renderList as k, renderSlot as A, resolveDynamicComponent as j, toDisplayString as M, toRef as N, toValue as ee, unref as P, useSlots as F, useTemplateRef as I, vShow as te, watch as L, withCtx as R, withDirectives as z, withKeys as B, withModifiers as V } from \"vue\";\nimport { onClickOutside as ne, unrefElement as re, useSwipe as H, useTemplateRefsList as U } from \"@vueuse/core\";\nimport { arrow as W, autoUpdate as ie, flip as ae, offset as oe, shift as G, useFloating as K } from \"@floating-ui/vue\";\nimport { add as q, addDays as J, addMonths as se, addYears as ce, differenceInCalendarDays as le, differenceInYears as ue, eachDayOfInterval as de, eachQuarterOfInterval as fe, endOfQuarter as pe, endOfWeek as me, endOfYear as he, format as ge, getDay as _e, getHours as ve, getISOWeek as ye, getMinutes as be, getMonth as Y, getQuarter as xe, getSeconds as Se, getWeek as Ce, getYear as X, isAfter as we, isBefore as Te, isDate as Ee, isEqual as De, isSameQuarter as Oe, isValid as ke, parse as Ae, roundToNearestMinutes as je, set as Z, setMilliseconds as Me, setMonth as Ne, setSeconds as Pe, setYear as Fe, startOfMonth as Ie, startOfQuarter as Le, startOfWeek as Re, startOfYear as ze, sub as Be, subDays as Ve, subMonths as He, subYears as Ue } from \"date-fns\";\nimport { TZDate as We, TZDate as Ge } from \"@date-fns/tz\";\n//#region src/VueDatePicker/components/Icons/CalendarIcon.ts\nfunction Ke() {\n\treturn p(\"svg\", {\n\t\txmlns: \"http://www.w3.org/2000/svg\",\n\t\tviewBox: \"0 0 32 32\",\n\t\tfill: \"currentColor\",\n\t\t\"aria-hidden\": \"true\",\n\t\tclass: \"dp--icon\",\n\t\trole: \"img\"\n\t}, [\n\t\tp(\"path\", { d: \"M29.333 8c0-2.208-1.792-4-4-4h-18.667c-2.208 0-4 1.792-4 4v18.667c0 2.208 1.792 4 4 4h18.667c2.208 0 4-1.792 4-4v-18.667zM26.667 8v18.667c0 0.736-0.597 1.333-1.333 1.333 0 0-18.667 0-18.667 0-0.736 0-1.333-0.597-1.333-1.333 0 0 0-18.667 0-18.667 0-0.736 0.597-1.333 1.333-1.333 0 0 18.667 0 18.667 0 0.736 0 1.333 0.597 1.333 1.333z\" }),\n\t\tp(\"path\", { d: \"M20 2.667v5.333c0 0.736 0.597 1.333 1.333 1.333s1.333-0.597 1.333-1.333v-5.333c0-0.736-0.597-1.333-1.333-1.333s-1.333 0.597-1.333 1.333z\" }),\n\t\tp(\"path\", { d: \"M9.333 2.667v5.333c0 0.736 0.597 1.333 1.333 1.333s1.333-0.597 1.333-1.333v-5.333c0-0.736-0.597-1.333-1.333-1.333s-1.333 0.597-1.333 1.333z\" }),\n\t\tp(\"path\", { d: \"M4 14.667h24c0.736 0 1.333-0.597 1.333-1.333s-0.597-1.333-1.333-1.333h-24c-0.736 0-1.333 0.597-1.333 1.333s0.597 1.333 1.333 1.333z\" })\n\t]);\n}\n//#endregion\n//#region src/VueDatePicker/components/Icons/CancelIcon.ts\nfunction qe() {\n\treturn p(\"svg\", {\n\t\txmlns: \"http://www.w3.org/2000/svg\",\n\t\tviewBox: \"0 0 32 32\",\n\t\tfill: \"currentColor\",\n\t\t\"aria-hidden\": \"true\",\n\t\tclass: \"dp--icon\",\n\t\trole: \"img\"\n\t}, [p(\"path\", { d: \"M23.057 7.057l-16 16c-0.52 0.52-0.52 1.365 0 1.885s1.365 0.52 1.885 0l16-16c0.52-0.52 0.52-1.365 0-1.885s-1.365-0.52-1.885 0z\" }), p(\"path\", { d: \"M7.057 8.943l16 16c0.52 0.52 1.365 0.52 1.885 0s0.52-1.365 0-1.885l-16-16c-0.52-0.52-1.365-0.52-1.885 0s-0.52 1.365 0 1.885z\" })]);\n}\n//#endregion\n//#region src/VueDatePicker/components/Icons/ChevronLeftIcon.ts\nfunction Je() {\n\treturn p(\"svg\", {\n\t\txmlns: \"http://www.w3.org/2000/svg\",\n\t\tviewBox: \"0 0 32 32\",\n\t\tfill: \"currentColor\",\n\t\t\"aria-hidden\": \"true\",\n\t\tclass: \"dp--icon\",\n\t\trole: \"img\"\n\t}, [p(\"path\", { d: \"M20.943 23.057l-7.057-7.057c0 0 7.057-7.057 7.057-7.057 0.52-0.52 0.52-1.365 0-1.885s-1.365-0.52-1.885 0l-8 8c-0.521 0.521-0.521 1.365 0 1.885l8 8c0.52 0.52 1.365 0.52 1.885 0s0.52-1.365 0-1.885z\" })]);\n}\n//#endregion\n//#region src/VueDatePicker/components/Icons/ChevronRightIcon.ts\nfunction Ye() {\n\treturn p(\"svg\", {\n\t\txmlns: \"http://www.w3.org/2000/svg\",\n\t\tviewBox: \"0 0 32 32\",\n\t\tfill: \"currentColor\",\n\t\t\"aria-hidden\": \"true\",\n\t\tclass: \"dp--icon\",\n\t\trole: \"img\"\n\t}, [p(\"path\", { d: \"M12.943 24.943l8-8c0.521-0.521 0.521-1.365 0-1.885l-8-8c-0.52-0.52-1.365-0.52-1.885 0s-0.52 1.365 0 1.885l7.057 7.057c0 0-7.057 7.057-7.057 7.057-0.52 0.52-0.52 1.365 0 1.885s1.365 0.52 1.885 0z\" })]);\n}\n//#endregion\n//#region src/VueDatePicker/components/Icons/ClockIcon.ts\nfunction Xe() {\n\treturn p(\"svg\", {\n\t\txmlns: \"http://www.w3.org/2000/svg\",\n\t\tviewBox: \"0 0 32 32\",\n\t\tfill: \"currentColor\",\n\t\t\"aria-hidden\": \"true\",\n\t\tclass: \"dp--icon\",\n\t\trole: \"img\"\n\t}, [p(\"path\", { d: \"M16 1.333c-8.095 0-14.667 6.572-14.667 14.667s6.572 14.667 14.667 14.667c8.095 0 14.667-6.572 14.667-14.667s-6.572-14.667-14.667-14.667zM16 4c6.623 0 12 5.377 12 12s-5.377 12-12 12c-6.623 0-12-5.377-12-12s5.377-12 12-12z\" }), p(\"path\", { d: \"M14.667 8v8c0 0.505 0.285 0.967 0.737 1.193l5.333 2.667c0.658 0.329 1.46 0.062 1.789-0.596s0.062-1.46-0.596-1.789l-4.596-2.298c0 0 0-7.176 0-7.176 0-0.736-0.597-1.333-1.333-1.333s-1.333 0.597-1.333 1.333z\" })]);\n}\n//#endregion\n//#region src/VueDatePicker/components/Icons/ChevronUpIcon.ts\nfunction Ze() {\n\treturn p(\"svg\", {\n\t\txmlns: \"http://www.w3.org/2000/svg\",\n\t\tviewBox: \"0 0 32 32\",\n\t\tfill: \"currentColor\",\n\t\t\"aria-hidden\": \"true\",\n\t\tclass: \"dp--icon\",\n\t\trole: \"img\"\n\t}, [p(\"path\", { d: \"M24.943 19.057l-8-8c-0.521-0.521-1.365-0.521-1.885 0l-8 8c-0.52 0.52-0.52 1.365 0 1.885s1.365 0.52 1.885 0l7.057-7.057c0 0 7.057 7.057 7.057 7.057 0.52 0.52 1.365 0.52 1.885 0s0.52-1.365 0-1.885z\" })]);\n}\n//#endregion\n//#region src/VueDatePicker/components/Icons/ChevronDownIcon.ts\nfunction Qe() {\n\treturn p(\"svg\", {\n\t\txmlns: \"http://www.w3.org/2000/svg\",\n\t\tviewBox: \"0 0 32 32\",\n\t\tfill: \"currentColor\",\n\t\t\"aria-hidden\": \"true\",\n\t\tclass: \"dp--icon\",\n\t\trole: \"img\"\n\t}, [p(\"path\", { d: \"M7.057 12.943l8 8c0.521 0.521 1.365 0.521 1.885 0l8-8c0.52-0.52 0.52-1.365 0-1.885s-1.365-0.52-1.885 0l-7.057 7.057c0 0-7.057-7.057-7.057-7.057-0.52-0.52-1.365-0.52-1.885 0s-0.52 1.365 0 1.885z\" })]);\n}\n//#endregion\n//#region src/VueDatePicker/composables/useInjector.ts\nvar $e = Symbol(\"ContextKey\"), et = (e, t) => {\n\tlet { setTimeModelValue: n } = Wt(), i = Ut(e), a = O(null), o = E({\n\t\tmenuFocused: !1,\n\t\tshiftKeyInMenu: !1,\n\t\tisInputFocused: !1,\n\t\tisTextInputDate: !1,\n\t\tarrowNavigationLevel: 0\n\t}), s = i.getDate(/* @__PURE__ */ new Date()), c = O(\"\"), l = O([{\n\t\tmonth: Y(s),\n\t\tyear: X(s)\n\t}]), u = E({\n\t\thours: 0,\n\t\tminutes: 0,\n\t\tseconds: 0\n\t});\n\tn(u, null, s, i.range.value.enabled);\n\tlet d = r({\n\t\tget: () => a.value,\n\t\tset: (e) => {\n\t\t\ta.value = e;\n\t\t}\n\t}), f = r(() => (e) => l.value[e] ? l.value[e].month : 0), p = r(() => (e) => l.value[e] ? l.value[e].year : 0);\n\tT($e, {\n\t\trootProps: e,\n\t\tdefaults: i,\n\t\tmodelValue: d,\n\t\tstate: D(o),\n\t\trootEmit: t,\n\t\tcalendars: l,\n\t\tmonth: f,\n\t\tyear: p,\n\t\ttime: u,\n\t\ttoday: s,\n\t\tinputValue: c,\n\t\tsetState: (e, t) => {\n\t\t\to[e] = t;\n\t\t},\n\t\tupdateTime: () => {\n\t\t\tn(u, d.value, s, i.range.value.enabled);\n\t\t},\n\t\tgetDate: i.getDate,\n\t\tgetDateFromParts: i.getDateFromParts\n\t});\n}, tt = /* @__PURE__ */ function(e) {\n\treturn e.month = \"month\", e.year = \"year\", e;\n}({}), nt = /* @__PURE__ */ function(e) {\n\treturn e.header = \"header\", e.calendar = \"calendar\", e.timePicker = \"timePicker\", e;\n}({}), rt = /* @__PURE__ */ function(e) {\n\treturn e.month = \"month\", e.year = \"year\", e.calendar = \"calendar\", e.time = \"time\", e.minutes = \"minutes\", e.hours = \"hours\", e.seconds = \"seconds\", e;\n}({}), it = [\n\t\"timestamp\",\n\t\"date\",\n\t\"iso\"\n], at = /* @__PURE__ */ function(e) {\n\treturn e.up = \"up\", e.down = \"down\", e.left = \"left\", e.right = \"right\", e;\n}({}), Q = /* @__PURE__ */ function(e) {\n\treturn e.arrowUp = \"ArrowUp\", e.arrowDown = \"ArrowDown\", e.arrowLeft = \"ArrowLeft\", e.arrowRight = \"ArrowRight\", e.enter = \"Enter\", e.space = \" \", e.esc = \"Escape\", e.tab = \"Tab\", e.home = \"Home\", e.end = \"End\", e.pageUp = \"PageUp\", e.pageDown = \"PageDown\", e;\n}({}), ot = /* @__PURE__ */ function(e) {\n\treturn e.MONTH_AND_YEAR = \"MM-yyyy\", e.YEAR = \"yyyy\", e.DATE = \"dd-MM-yyyy\", e;\n}({}), st = /* @__PURE__ */ function(e) {\n\treturn e[e.Sunday = 0] = \"Sunday\", e[e.Monday = 1] = \"Monday\", e[e.Tuesday = 2] = \"Tuesday\", e[e.Wednesday = 3] = \"Wednesday\", e[e.Thursday = 4] = \"Thursday\", e[e.Friday = 5] = \"Friday\", e[e.Saturday = 6] = \"Saturday\", e;\n}({}), ct = Symbol(\"FlowKey\"), lt = (e, t) => {\n\tlet { rootEmit: n, rootProps: i, defaults: { timeConfig: a, flow: o } } = $(), s = O(), c = E({\n\t\t[nt.timePicker]: !a.value.enableTimePicker || i.timePicker || i.monthPicker || i.quarterPicker,\n\t\t[nt.calendar]: !1,\n\t\t[nt.header]: !1\n\t}), l = r(() => i.monthPicker || i.timePicker || i.quarterPicker), u = (e) => {\n\t\tlet t = o.value?.steps.at(0);\n\t\tif (o.value?.steps?.length) {\n\t\t\tif (!e && l.value) return p(t);\n\t\t\te && (c[e] = !0), Object.keys(c).filter((e) => !c[e]).length || p(t);\n\t\t}\n\t}, d = (e) => {\n\t\tif (o.value?.steps?.length && s.value === e) {\n\t\t\tlet e = o.value.steps.at(o.value.steps.indexOf(s.value) + 1);\n\t\t\te ? (s.value = e, n(\"flow-step\", s.value), p()) : i.autoApply && _().then(() => t(\"auto-apply\"));\n\t\t}\n\t}, f = (t, n, ...r) => {\n\t\ts.value === t && e.value && e.value[n]?.(...r);\n\t}, p = (e) => {\n\t\te && (s.value = e), f(rt.month, \"toggleMonthPicker\", !0), f(rt.year, \"toggleYearPicker\", !0), f(rt.calendar, \"toggleTimePicker\", !1), f(rt.time, \"toggleTimePicker\", !0), (s.value === rt.hours || s.value === rt.minutes || s.value === rt.seconds) && f(s.value, \"toggleTimePicker\", !0, s.value);\n\t};\n\treturn T(ct, {\n\t\tchildMount: u,\n\t\tupdateFlowStep: d,\n\t\tflowStep: D(s)\n\t}), { executeFlow: p };\n}, $ = () => {\n\tlet e = m($e);\n\tif (!e) throw Error(\"Can't use context\");\n\treturn e;\n}, ut = () => {\n\tlet e = m(ct);\n\tif (!e) throw Error(\"Can't use flow\");\n\treturn e;\n}, dt = () => {\n\tlet { rootProps: e, state: t, defaults: { textInput: n } } = $(), i = r(() => t.arrowNavigationLevel), a = O(-1), o = O(-1);\n\tL(i, (e, t) => {\n\t\tb(n.value.enabled && n.value.selectOnFocus ? !0 : e === 0 && t > 0);\n\t});\n\tlet s = O([]), c = O(/* @__PURE__ */ new Map()), l = () => {\n\t\tlet e = Array.from(document.querySelectorAll(`[data-dp-action-element=\"${i.value}\"]`)), t = /* @__PURE__ */ new Map(), n = /* @__PURE__ */ new Map();\n\t\tfor (let r of e) {\n\t\t\tlet e = r.getBoundingClientRect(), i = e.top, a = e.left;\n\t\t\tt.has(i) || t.set(i, []), t.get(i).push(r), n.set(r, {\n\t\t\t\trow: i,\n\t\t\t\tcol: a\n\t\t\t});\n\t\t}\n\t\ts.value = Array.from(t.entries()).sort((e, t) => e[0] - t[0]).map(([e, t]) => u(t, n)), c.value = n;\n\t}, u = (e, t) => e.sort((e, n) => {\n\t\tlet r = t.get(e), i = t.get(n);\n\t\treturn r.col - i.col;\n\t}), d = (e, t) => {\n\t\ti.value === 0 && (a.value = e, o.value = t);\n\t}, f = (e) => {\n\t\tif (![\n\t\t\tQ.arrowUp,\n\t\t\tQ.arrowDown,\n\t\t\tQ.arrowLeft,\n\t\t\tQ.arrowRight\n\t\t].includes(e.key)) return;\n\t\tl(), e.preventDefault();\n\t\tlet t = document.activeElement;\n\t\tif (!t?.hasAttribute(\"data-dp-action-element\")) return;\n\t\tlet n = -1, r = -1;\n\t\tfor (let e = 0; e < s.value.length; e++) {\n\t\t\tlet i = s.value[e].indexOf(t);\n\t\t\tif (i !== -1) {\n\t\t\t\tn = e, r = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (n !== -1) switch (e.key) {\n\t\t\tcase Q.arrowLeft: return p(n, r);\n\t\t\tcase Q.arrowRight: return m(n, r);\n\t\t\tcase Q.arrowUp: return h(n, r);\n\t\t\tcase Q.arrowDown: return g(n, r);\n\t\t\tdefault: return;\n\t\t}\n\t}, p = (e, t) => {\n\t\tif (t > 0) {\n\t\t\tlet n = s.value[e][t - 1];\n\t\t\td(e, t - 1), n && n.focus();\n\t\t}\n\t}, m = (e, t) => {\n\t\tif (t < s.value[e].length - 1) {\n\t\t\tlet n = s.value[e][t + 1];\n\t\t\td(e, t + 1), n && n.focus();\n\t\t}\n\t}, h = (e, t) => {\n\t\tif (e > 0) {\n\t\t\tlet n = s.value[e - 1], r = Math.min(t, n.length - 1), i = n[r];\n\t\t\td(e - 1, r), i && i.focus();\n\t\t}\n\t}, g = (e, t) => {\n\t\tif (e < s.value.length - 1) {\n\t\t\tlet n = s.value[e + 1], r = Math.min(t, n.length - 1), i = n[r];\n\t\t\td(e + 1, r), i && i.focus();\n\t\t}\n\t}, v = () => {\n\t\t_().then(() => {\n\t\t\tl();\n\t\t\tlet e = s.value[a.value]?.[o.value];\n\t\t\te && y(e);\n\t\t});\n\t}, y = (e) => {\n\t\trequestAnimationFrame(() => {\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\te.focus({ preventScroll: !0 });\n\t\t\t});\n\t\t});\n\t}, b = (e) => {\n\t\tif (e) return v();\n\t\tlet t = document.querySelector(`[data-dp-element-active=\"${i.value}\"]`);\n\t\tif (t && !e) y(t);\n\t\telse {\n\t\t\tlet e = document.querySelector(`[data-dp-action-element=\"${i.value}\"]`);\n\t\t\te && y(e);\n\t\t}\n\t};\n\tS(() => {\n\t\te.arrowNavigation && (b(!1), document.addEventListener(\"keydown\", f));\n\t}), C(() => {\n\t\te.arrowNavigation && document.removeEventListener(\"keydown\", f);\n\t});\n}, ft = () => {\n\tlet { checkPartialRangeValue: e, checkRangeEnabled: t, isValidDate: n } = ht(), { convertType: r, errorMapper: i } = Wt(), { getDate: a, rootEmit: o, state: s, rootProps: c, inputValue: l, defaults: { textInput: u, range: d, multiDates: f, timeConfig: p, formats: m, weekStart: h }, modelValue: g, updateTime: _ } = $(), { setTime: v, getWeekFromDate: y } = Gt(), { formatSelectedDate: b, formatForTextInput: x } = qt();\n\tL(g, (e, t) => {\n\t\to(\"internal-model-change\", g.value), JSON.stringify(t ?? {}) !== JSON.stringify(e ?? {}) && _();\n\t}, { deep: !0 }), L(d, (e, t) => {\n\t\te.enabled !== t.enabled && (g.value = null, _());\n\t}), L(() => m.value.input, () => {\n\t\tR();\n\t});\n\tlet S = (e) => e ? c.modelType ? B(e) : {\n\t\thours: ve(e),\n\t\tminutes: be(e),\n\t\tseconds: p.value.enableSeconds ? Se(e) : 0\n\t} : null, C = (e) => c.modelType ? B(e) : {\n\t\tmonth: Y(e),\n\t\tyear: X(e)\n\t}, w = (n) => Array.isArray(n) ? f.value.enabled ? n.map((e) => T(e, Fe(a(), e))) : t(() => [Fe(a(), n[0]), n[1] ? Fe(a(), n[1]) : e(d.value.partialRange)], d.value.enabled) : Fe(a(), +n), T = (e, t) => (typeof e == \"string\" || typeof e == \"number\") && c.modelType ? z(e) : t, E = (e) => Array.isArray(e) ? [T(e[0], v(e[0])), T(e[1], v(e[1]))] : T(e, v(e)), D = (n) => {\n\t\tlet r = Z(a(), { date: 1 });\n\t\treturn Array.isArray(n) ? f.value.enabled ? n.map((e) => T(e, Z(r, {\n\t\t\tmonth: +e.month,\n\t\t\tyear: +e.year\n\t\t}))) : t(() => [T(n[0], Z(r, {\n\t\t\tmonth: +n[0].month,\n\t\t\tyear: +n[0].year\n\t\t})), T(n[1], n[1] ? Z(r, {\n\t\t\tmonth: +n[1].month,\n\t\t\tyear: +n[1].year\n\t\t}) : e(d.value.partialRange))], d.value.enabled) : T(n, Z(r, {\n\t\t\tmonth: +n.month,\n\t\t\tyear: +n.year\n\t\t}));\n\t}, O = (e) => {\n\t\tif (Array.isArray(e)) return e.map((e) => z(e));\n\t\tthrow Error(i.dateArr(\"multi-dates\"));\n\t}, k = (e) => {\n\t\tif (Array.isArray(e) && d.value.enabled) {\n\t\t\tlet t = e[0], n = e[1];\n\t\t\treturn [a(Array.isArray(t) ? t[0] : null), Array.isArray(n) && n.length ? a(n[0]) : null];\n\t\t}\n\t\treturn a(e[0]);\n\t}, A = (n) => c.modelAuto ? Array.isArray(n) ? [z(n[0]), z(n[1])] : c.autoApply ? [z(n)] : [z(n), null] : Array.isArray(n) ? t(() => n[1] ? [z(n[0]), n[1] ? z(n[1]) : e(d.value.partialRange)] : [z(n[0])], d.value.enabled) : z(n), j = () => {\n\t\tArray.isArray(g.value) && d.value.enabled && g.value.length === 1 && g.value.push(e(d.value.partialRange));\n\t}, M = () => {\n\t\tlet t = g.value;\n\t\treturn [B(t[0]), t[1] ? B(t[1]) : e(d.value.partialRange)];\n\t}, N = () => Array.isArray(g.value) ? g.value[1] ? M() : B(r(g.value[0])) : [], ee = () => (g.value || []).map((e) => B(e)), P = (e = !1) => (e || j(), c.modelAuto ? N() : f.value.enabled ? ee() : Array.isArray(g.value) ? t(() => M(), d.value.enabled) : B(r(g.value))), F = (e) => !e || Array.isArray(e) && !e.length ? null : c.timePicker ? E(r(e)) : c.monthPicker ? D(r(e)) : c.yearPicker ? w(r(e)) : f.value.enabled ? O(r(e)) : c.weekPicker ? k(r(e)) : A(r(e)), I = (e) => {\n\t\tif (s.isTextInputDate) return;\n\t\tlet t = F(e);\n\t\tn(r(t)) ? (g.value = r(t), R()) : (g.value = null, l.value = \"\");\n\t}, te = () => g.value ? f.value.enabled ? g.value.map((e) => b(e)).join(\"; \") : u.value.enabled ? x() : b(g.value) : \"\", R = () => {\n\t\tl.value = te();\n\t}, z = (e) => c.modelType ? it.includes(c.modelType) ? a(e) : c.modelType === \"format\" && typeof m.value.input == \"string\" ? Ae(e, m.value.input, a(), { locale: c.locale }) : Ae(e, c.modelType, a(), { locale: c.locale }) : a(e), B = (e) => e ? c.modelType ? c.modelType === \"timestamp\" ? +e : c.modelType === \"iso\" ? e.toISOString() : c.modelType === \"format\" && typeof m.value.input == \"string\" ? b(e) : b(e, c.modelType) : e : null, V = (e) => {\n\t\to(\"update:model-value\", e);\n\t}, ne = (e) => Array.isArray(g.value) ? f.value.enabled ? g.value.map((t) => e(t)) : [e(g.value[0]), g.value[1] ? e(g.value[1]) : null] : e(r(g.value)), re = () => {\n\t\tif (Array.isArray(g.value)) {\n\t\t\tlet e = y(g.value[0], h.value), t = g.value[1] ? y(g.value[1], h.value) : [];\n\t\t\treturn [e.map((e) => a(e)), t.map((e) => a(e))];\n\t\t}\n\t\treturn y(g.value, h.value).map((e) => a(e));\n\t}, H = (e) => V(r(ne(e))), U = () => o(\"update:model-value\", re());\n\treturn {\n\t\tcheckBeforeEmit: () => g.value ? d.value.enabled ? d.value.partialRange ? g.value.length >= 1 : g.value.length === 2 : !!g.value : !1,\n\t\tparseExternalModelValue: I,\n\t\tformatInputValue: R,\n\t\temitModelValue: () => (R(), c.monthPicker ? H(C) : c.timePicker ? H(S) : c.yearPicker ? H(X) : c.weekPicker ? U() : V(P()))\n\t};\n}, pt = () => {\n\tlet { defaults: { transitions: e } } = $(), t = r(() => (t) => e.value ? t ? e.value.open : e.value.close : \"\"), n = r(() => (t) => e.value ? t ? e.value.menuAppearTop : e.value.menuAppearBottom : \"\");\n\treturn {\n\t\ttransitionName: t,\n\t\tshowTransition: !!e.value,\n\t\tmenuTransition: n\n\t};\n}, mt = (e) => {\n\tlet { modelValue: t } = $();\n\tL(t, (t, n) => {\n\t\te && JSON.stringify(t ?? {}) !== JSON.stringify(n ?? {}) && e();\n\t}, { deep: !0 });\n}, ht = () => {\n\tlet { defaults: { safeDates: e, range: t, multiDates: n, filters: i, timeConfig: a }, rootProps: o, getDate: s } = $(), { getMapKeyType: c, getMapDate: l, errorMapper: u, convertType: d } = Wt(), { isDateBefore: f, isDateAfter: p, isDateEqual: m, resetDate: h, getDaysInBetween: g, setTimeValue: _, getTimeObj: v, setTime: y } = Gt(), b = (t) => e.value.disabledDates ? typeof e.value.disabledDates == \"function\" ? e.value.disabledDates(s(t)) : !!l(t, e.value.disabledDates) : !1, x = (t) => e.value.maxDate ? o.yearPicker ? X(t) > X(e.value.maxDate) : p(t, e.value.maxDate) : !1, S = (t) => e.value.minDate ? o.yearPicker ? X(t) < X(e.value.minDate) : f(t, e.value.minDate) : !1, C = (e) => {\n\t\tif (!e) return !1;\n\t\tlet t = x(e), n = S(e), r = b(e), a = i.value.months.map((e) => +e).includes(Y(e)), s = i.value.weekDays?.length ? i.value.weekDays.some((t) => +t === _e(e)) : !1, c = O(e), l = X(e), u = l < +o.yearRange[0] || l > +o.yearRange[1];\n\t\treturn !(t || n || r || a || u || s || c);\n\t}, w = (t, n) => f(...H(e.value.minDate, t, n)) || m(...H(e.value.minDate, t, n)), T = (t, n) => p(...H(e.value.maxDate, t, n)) || m(...H(e.value.maxDate, t, n)), E = (t, n, r) => {\n\t\tlet i = !1;\n\t\treturn e.value.maxDate && r && T(t, n) && (i = !0), e.value.minDate && !r && w(t, n) && (i = !0), i;\n\t}, D = (t, n, r, i) => {\n\t\tlet a = !1;\n\t\treturn i && (e.value.minDate || e.value.maxDate) ? e.value.minDate && e.value.maxDate ? a = E(t, n, r) : (e.value.minDate && w(t, n) || e.value.maxDate && T(t, n)) && (a = !0) : a = !0, a;\n\t}, O = (t) => Array.isArray(e.value.allowedDates) && !e.value.allowedDates.length ? !0 : e.value.allowedDates ? !l(t, e.value.allowedDates, c(o.monthPicker, o.yearPicker)) : !1, k = (e) => !C(e), A = (e) => t.value.noDisabledRange ? !de({\n\t\tstart: e[0],\n\t\tend: e[1]\n\t}).some((e) => k(e)) : !0, j = (e) => {\n\t\tif (e) {\n\t\t\tlet t = X(e);\n\t\t\treturn t >= +o.yearRange[0] && t <= o.yearRange[1];\n\t\t}\n\t\treturn !0;\n\t}, M = (e, n) => !!(Array.isArray(e) && e[n] && (t.value.maxRange || t.value.minRange) && j(e[n])), N = (e, n, r = 0) => {\n\t\tif (M(n, r) && j(e)) {\n\t\t\tlet i = le(e, n[r]), a = g(n[r], e), o = a.length === 1 ? 0 : a.filter((e) => k(e)).length, s = Math.abs(i) - (t.value.minMaxRawRange ? 0 : o);\n\t\t\tif (t.value.minRange && t.value.maxRange) return s >= +t.value.minRange && s <= +t.value.maxRange;\n\t\t\tif (t.value.minRange) return s >= +t.value.minRange;\n\t\t\tif (t.value.maxRange) return s <= +t.value.maxRange;\n\t\t}\n\t\treturn !0;\n\t}, ee = () => !a.value.enableTimePicker || o.monthPicker || o.yearPicker || a.value.ignoreTimeValidation, P = (e) => Array.isArray(e) ? [e[0] ? _(e[0]) : null, e[1] ? _(e[1]) : null] : _(e), F = (e, t, n) => t ? e.find((e) => +e.hours === ve(t) && e.minutes === \"*\" ? !0 : +e.minutes === be(t) && +e.hours === ve(t)) && n : !1, I = (e, t, n) => {\n\t\tlet [r, i] = e, [a, o] = t;\n\t\treturn !F(r, a, n) && !F(i, o, n) && n;\n\t}, te = (e, t) => {\n\t\tlet n = Array.isArray(t) ? t : [t];\n\t\treturn Array.isArray(o.disabledTimes) ? Array.isArray(o.disabledTimes[0]) ? I(o.disabledTimes, n, e) : !n.some((t) => F(o.disabledTimes, t, e)) : e;\n\t}, L = (e, t) => {\n\t\tlet n = Array.isArray(t) ? [v(t[0]), t[1] ? v(t[1]) : void 0] : v(t), r = !o.disabledTimes(n);\n\t\treturn e && r;\n\t}, R = (e, t) => o.disabledTimes ? Array.isArray(o.disabledTimes) ? te(t, e) : L(t, e) : t, z = (t) => {\n\t\tlet n = !0;\n\t\tif (!t || ee()) return !0;\n\t\tlet r = !e.value.minDate && !e.value.maxDate ? P(t) : t;\n\t\treturn (o.maxTime || e.value.maxDate) && (n = W(o.maxTime, e.value.maxDate, \"max\", d(r), n)), (o.minTime || e.value.minDate) && (n = W(o.minTime, e.value.minDate, \"min\", d(r), n)), R(t, n);\n\t}, B = (t) => {\n\t\tif (!o.monthPicker) return !0;\n\t\tlet n = !0, r = s(h(t));\n\t\tif (e.value.minDate && e.value.maxDate) {\n\t\t\tlet t = s(h(e.value.minDate)), n = s(h(e.value.maxDate));\n\t\t\treturn p(r, t) && f(r, n) || m(r, t) || m(r, n);\n\t\t}\n\t\tif (e.value.minDate) {\n\t\t\tlet t = s(h(e.value.minDate));\n\t\t\tn = p(r, t) || m(r, t);\n\t\t}\n\t\tif (e.value.maxDate) {\n\t\t\tlet t = s(h(e.value.maxDate));\n\t\t\tn = f(r, t) || m(r, t);\n\t\t}\n\t\treturn n;\n\t}, V = r(() => (e) => !a.value.enableTimePicker || a.value.ignoreTimeValidation ? !0 : z(e)), ne = r(() => (e) => o.monthPicker ? Array.isArray(e) && (t.value.enabled || n.value.enabled) ? !e.filter((e) => !B(e)).length : B(e) : !0), re = (t, n, r) => {\n\t\tif (!n || r && !e.value.maxDate || !r && !e.value.minDate) return !1;\n\t\tlet i = r ? se(t, 1) : He(t, 1), a = [Y(i), X(i)];\n\t\treturn r ? !T(...a) : !w(...a);\n\t}, H = (e, t, n) => [Z(s(e), { date: 1 }), Z(s(), {\n\t\tmonth: t,\n\t\tyear: n,\n\t\tdate: 1\n\t})], U = (e, t, n, r) => {\n\t\tif (!e) return !0;\n\t\tif (r) {\n\t\t\tlet r = n === \"max\" ? Te(e, t) : we(e, t), i = {\n\t\t\t\tseconds: 0,\n\t\t\t\tmilliseconds: 0\n\t\t\t};\n\t\t\treturn r || De(Z(e, i), Z(t, i));\n\t\t}\n\t\treturn n === \"max\" ? e.getTime() <= t.getTime() : e.getTime() >= t.getTime();\n\t}, W = (e, t, n, r, i) => {\n\t\tif (Array.isArray(r)) {\n\t\t\tlet a = ie(e, r[0], t), o = ie(e, r[1], t);\n\t\t\treturn U(r[0], a, n, !!t) && U(r[1], o, n, !!t) && i;\n\t\t}\n\t\treturn U(r, ie(e, r, t), n, !!t) && i;\n\t}, ie = (e, t, n) => e ? y(e, t) : s(n ?? t);\n\treturn {\n\t\tisDisabled: k,\n\t\tvalidateDate: C,\n\t\tvalidateMonthYearInRange: D,\n\t\tisDateRangeAllowed: A,\n\t\tcheckMinMaxRange: N,\n\t\tisValidTime: z,\n\t\tvalidateMonthYear: re,\n\t\tvalidateMinDate: w,\n\t\tvalidateMaxDate: T,\n\t\tisValidDate: (e) => Array.isArray(e) ? ke(e[0]) && (e[1] ? ke(e[1]) : !0) : e ? ke(e) : !1,\n\t\tcheckPartialRangeValue: (e) => {\n\t\t\tif (e) return null;\n\t\t\tthrow Error(u.prop(\"partial-range\"));\n\t\t},\n\t\tcheckRangeEnabled: (e, t) => {\n\t\t\tif (t) return e();\n\t\t\tthrow Error(u.prop(\"range\"));\n\t\t},\n\t\tcheckMinMaxValue: (e, t, n) => {\n\t\t\tlet r = n != null, i = t != null;\n\t\t\tif (!r && !i) return !1;\n\t\t\tlet a = +n, o = +t;\n\t\t\treturn r && i ? +e > a || +e < o : r ? +e > a : i ? +e < o : !1;\n\t\t},\n\t\tisTimeValid: V,\n\t\tisMonthValid: ne\n\t};\n};\n//#endregion\n//#region ../../node_modules/.pnpm/date-fns@4.4.0/node_modules/date-fns/locale/_lib/buildFormatLongFn.js\nfunction gt(e) {\n\treturn (t = {}) => {\n\t\tlet n = t.width ? String(t.width) : e.defaultWidth;\n\t\treturn e.formats[n] || e.formats[e.defaultWidth];\n\t};\n}\n//#endregion\n//#region ../../node_modules/.pnpm/date-fns@4.4.0/node_modules/date-fns/locale/_lib/buildLocalizeFn.js\nfunction _t(e) {\n\treturn (t, n) => {\n\t\tlet r = n?.context ? String(n.context) : \"standalone\", i;\n\t\tif (r === \"formatting\" && e.formattingValues) {\n\t\t\tlet t = e.defaultFormattingWidth || e.defaultWidth, r = n?.width ? String(n.width) : t;\n\t\t\ti = e.formattingValues[r] || e.formattingValues[t];\n\t\t} else {\n\t\t\tlet t = e.defaultWidth, r = n?.width ? String(n.width) : e.defaultWidth;\n\t\t\ti = e.values[r] || e.values[t];\n\t\t}\n\t\tlet a = e.argumentCallback ? e.argumentCallback(t) : t;\n\t\treturn i[a];\n\t};\n}\n//#endregion\n//#region ../../node_modules/.pnpm/date-fns@4.4.0/node_modules/date-fns/locale/_lib/buildMatchFn.js\nfunction vt(e) {\n\treturn (t, n = {}) => {\n\t\tlet r = n.width, i = r && e.matchPatterns[r] || e.matchPatterns[e.defaultMatchWidth], a = t.match(i);\n\t\tif (!a) return null;\n\t\tlet o = a[0], s = r && e.parsePatterns[r] || e.parsePatterns[e.defaultParseWidth], c = Array.isArray(s) ? bt(s, (e) => e.test(o)) : yt(s, (e) => e.test(o)), l;\n\t\tl = e.valueCallback ? e.valueCallback(c) : c, l = n.valueCallback ? n.valueCallback(l) : l;\n\t\tlet u = t.slice(o.length);\n\t\treturn {\n\t\t\tvalue: l,\n\t\t\trest: u\n\t\t};\n\t};\n}\nfunction yt(e, t) {\n\tfor (let n in e) if (Object.prototype.hasOwnProperty.call(e, n) && t(e[n])) return n;\n}\nfunction bt(e, t) {\n\tfor (let n = 0; n < e.length; n++) if (t(e[n])) return n;\n}\n//#endregion\n//#region ../../node_modules/.pnpm/date-fns@4.4.0/node_modules/date-fns/locale/_lib/buildMatchPatternFn.js\nfunction xt(e) {\n\treturn (t, n = {}) => {\n\t\tlet r = t.match(e.matchPattern);\n\t\tif (!r) return null;\n\t\tlet i = r[0], a = t.match(e.parsePattern);\n\t\tif (!a) return null;\n\t\tlet o = e.valueCallback ? e.valueCallback(a[0]) : a[0];\n\t\to = n.valueCallback ? n.valueCallback(o) : o;\n\t\tlet s = t.slice(i.length);\n\t\treturn {\n\t\t\tvalue: o,\n\t\t\trest: s\n\t\t};\n\t};\n}\n//#endregion\n//#region ../../node_modules/.pnpm/date-fns@4.4.0/node_modules/date-fns/locale/en-US/_lib/formatDistance.js\nvar St = {\n\tlessThanXSeconds: {\n\t\tone: \"less than a second\",\n\t\tother: \"less than {{count}} seconds\"\n\t},\n\txSeconds: {\n\t\tone: \"1 second\",\n\t\tother: \"{{count}} seconds\"\n\t},\n\thalfAMinute: \"half a minute\",\n\tlessThanXMinutes: {\n\t\tone: \"less than a minute\",\n\t\tother: \"less than {{count}} minutes\"\n\t},\n\txMinutes: {\n\t\tone: \"1 minute\",\n\t\tother: \"{{count}} minutes\"\n\t},\n\taboutXHours: {\n\t\tone: \"about 1 hour\",\n\t\tother: \"about {{count}} hours\"\n\t},\n\txHours: {\n\t\tone: \"1 hour\",\n\t\tother: \"{{count}} hours\"\n\t},\n\txDays: {\n\t\tone: \"1 day\",\n\t\tother: \"{{count}} days\"\n\t},\n\taboutXWeeks: {\n\t\tone: \"about 1 week\",\n\t\tother: \"about {{count}} weeks\"\n\t},\n\txWeeks: {\n\t\tone: \"1 week\",\n\t\tother: \"{{count}} weeks\"\n\t},\n\taboutXMonths: {\n\t\tone: \"about 1 month\",\n\t\tother: \"about {{count}} months\"\n\t},\n\txMonths: {\n\t\tone: \"1 month\",\n\t\tother: \"{{count}} months\"\n\t},\n\taboutXYears: {\n\t\tone: \"about 1 year\",\n\t\tother: \"about {{count}} years\"\n\t},\n\txYears: {\n\t\tone: \"1 year\",\n\t\tother: \"{{count}} years\"\n\t},\n\toverXYears: {\n\t\tone: \"over 1 year\",\n\t\tother: \"over {{count}} years\"\n\t},\n\talmostXYears: {\n\t\tone: \"almost 1 year\",\n\t\tother: \"almost {{count}} years\"\n\t}\n}, Ct = (e, t, n) => {\n\tlet r, i = St[e];\n\treturn r = typeof i == \"string\" ? i : t === 1 ? i.one : i.other.replace(\"{{count}}\", t.toString()), n?.addSuffix ? n.comparison && n.comparison > 0 ? \"in \" + r : r + \" ago\" : r;\n}, wt = {\n\tlastWeek: \"'last' eeee 'at' p\",\n\tyesterday: \"'yesterday at' p\",\n\ttoday: \"'today at' p\",\n\ttomorrow: \"'tomorrow at' p\",\n\tnextWeek: \"eeee 'at' p\",\n\tother: \"P\"\n}, Tt = (e, t, n, r) => wt[e], Et = {\n\tordinalNumber: (e, t) => {\n\t\tlet n = Number(e), r = n % 100;\n\t\tif (r > 20 || r < 10) switch (r % 10) {\n\t\t\tcase 1: return n + \"st\";\n\t\t\tcase 2: return n + \"nd\";\n\t\t\tcase 3: return n + \"rd\";\n\t\t}\n\t\treturn n + \"th\";\n\t},\n\tera: _t({\n\t\tvalues: {\n\t\t\tnarrow: [\"B\", \"A\"],\n\t\t\tabbreviated: [\"BC\", \"AD\"],\n\t\t\twide: [\"Before Christ\", \"Anno Domini\"]\n\t\t},\n\t\tdefaultWidth: \"wide\"\n\t}),\n\tquarter: _t({\n\t\tvalues: {\n\t\t\tnarrow: [\n\t\t\t\t\"1\",\n\t\t\t\t\"2\",\n\t\t\t\t\"3\",\n\t\t\t\t\"4\"\n\t\t\t],\n\t\t\tabbreviated: [\n\t\t\t\t\"Q1\",\n\t\t\t\t\"Q2\",\n\t\t\t\t\"Q3\",\n\t\t\t\t\"Q4\"\n\t\t\t],\n\t\t\twide: [\n\t\t\t\t\"1st quarter\",\n\t\t\t\t\"2nd quarter\",\n\t\t\t\t\"3rd quarter\",\n\t\t\t\t\"4th quarter\"\n\t\t\t]\n\t\t},\n\t\tdefaultWidth: \"wide\",\n\t\targumentCallback: (e) => e - 1\n\t}),\n\tmonth: _t({\n\t\tvalues: {\n\t\t\tnarrow: [\n\t\t\t\t\"J\",\n\t\t\t\t\"F\",\n\t\t\t\t\"M\",\n\t\t\t\t\"A\",\n\t\t\t\t\"M\",\n\t\t\t\t\"J\",\n\t\t\t\t\"J\",\n\t\t\t\t\"A\",\n\t\t\t\t\"S\",\n\t\t\t\t\"O\",\n\t\t\t\t\"N\",\n\t\t\t\t\"D\"\n\t\t\t],\n\t\t\tabbreviated: [\n\t\t\t\t\"Jan\",\n\t\t\t\t\"Feb\",\n\t\t\t\t\"Mar\",\n\t\t\t\t\"Apr\",\n\t\t\t\t\"May\",\n\t\t\t\t\"Jun\",\n\t\t\t\t\"Jul\",\n\t\t\t\t\"Aug\",\n\t\t\t\t\"Sep\",\n\t\t\t\t\"Oct\",\n\t\t\t\t\"Nov\",\n\t\t\t\t\"Dec\"\n\t\t\t],\n\t\t\twide: [\n\t\t\t\t\"January\",\n\t\t\t\t\"February\",\n\t\t\t\t\"March\",\n\t\t\t\t\"April\",\n\t\t\t\t\"May\",\n\t\t\t\t\"June\",\n\t\t\t\t\"July\",\n\t\t\t\t\"August\",\n\t\t\t\t\"September\",\n\t\t\t\t\"October\",\n\t\t\t\t\"November\",\n\t\t\t\t\"December\"\n\t\t\t]\n\t\t},\n\t\tdefaultWidth: \"wide\"\n\t}),\n\tday: _t({\n\t\tvalues: {\n\t\t\tnarrow: [\n\t\t\t\t\"S\",\n\t\t\t\t\"M\",\n\t\t\t\t\"T\",\n\t\t\t\t\"W\",\n\t\t\t\t\"T\",\n\t\t\t\t\"F\",\n\t\t\t\t\"S\"\n\t\t\t],\n\t\t\tshort: [\n\t\t\t\t\"Su\",\n\t\t\t\t\"Mo\",\n\t\t\t\t\"Tu\",\n\t\t\t\t\"We\",\n\t\t\t\t\"Th\",\n\t\t\t\t\"Fr\",\n\t\t\t\t\"Sa\"\n\t\t\t],\n\t\t\tabbreviated: [\n\t\t\t\t\"Sun\",\n\t\t\t\t\"Mon\",\n\t\t\t\t\"Tue\",\n\t\t\t\t\"Wed\",\n\t\t\t\t\"Thu\",\n\t\t\t\t\"Fri\",\n\t\t\t\t\"Sat\"\n\t\t\t],\n\t\t\twide: [\n\t\t\t\t\"Sunday\",\n\t\t\t\t\"Monday\",\n\t\t\t\t\"Tuesday\",\n\t\t\t\t\"Wednesday\",\n\t\t\t\t\"Thursday\",\n\t\t\t\t\"Friday\",\n\t\t\t\t\"Saturday\"\n\t\t\t]\n\t\t},\n\t\tdefaultWidth: \"wide\"\n\t}),\n\tdayPeriod: _t({\n\t\tvalues: {\n\t\t\tnarrow: {\n\t\t\t\tam: \"a\",\n\t\t\t\tpm: \"p\",\n\t\t\t\tmidnight: \"mi\",\n\t\t\t\tnoon: \"n\",\n\t\t\t\tmorning: \"morning\",\n\t\t\t\tafternoon: \"afternoon\",\n\t\t\t\tevening: \"evening\",\n\t\t\t\tnight: \"night\"\n\t\t\t},\n\t\t\tabbreviated: {\n\t\t\t\tam: \"AM\",\n\t\t\t\tpm: \"PM\",\n\t\t\t\tmidnight: \"midnight\",\n\t\t\t\tnoon: \"noon\",\n\t\t\t\tmorning: \"morning\",\n\t\t\t\tafternoon: \"afternoon\",\n\t\t\t\tevening: \"evening\",\n\t\t\t\tnight: \"night\"\n\t\t\t},\n\t\t\twide: {\n\t\t\t\tam: \"a.m.\",\n\t\t\t\tpm: \"p.m.\",\n\t\t\t\tmidnight: \"midnight\",\n\t\t\t\tnoon: \"noon\",\n\t\t\t\tmorning: \"morning\",\n\t\t\t\tafternoon: \"afternoon\",\n\t\t\t\tevening: \"evening\",\n\t\t\t\tnight: \"night\"\n\t\t\t}\n\t\t},\n\t\tdefaultWidth: \"wide\",\n\t\tformattingValues: {\n\t\t\tnarrow: {\n\t\t\t\tam: \"a\",\n\t\t\t\tpm: \"p\",\n\t\t\t\tmidnight: \"mi\",\n\t\t\t\tnoon: \"n\",\n\t\t\t\tmorning: \"in the morning\",\n\t\t\t\tafternoon: \"in the afternoon\",\n\t\t\t\tevening: \"in the evening\",\n\t\t\t\tnight: \"at night\"\n\t\t\t},\n\t\t\tabbreviated: {\n\t\t\t\tam: \"AM\",\n\t\t\t\tpm: \"PM\",\n\t\t\t\tmidnight: \"midnight\",\n\t\t\t\tnoon: \"noon\",\n\t\t\t\tmorning: \"in the morning\",\n\t\t\t\tafternoon: \"in the afternoon\",\n\t\t\t\tevening: \"in the evening\",\n\t\t\t\tnight: \"at night\"\n\t\t\t},\n\t\t\twide: {\n\t\t\t\tam: \"a.m.\",\n\t\t\t\tpm: \"p.m.\",\n\t\t\t\tmidnight: \"midnight\",\n\t\t\t\tnoon: \"noon\",\n\t\t\t\tmorning: \"in the morning\",\n\t\t\t\tafternoon: \"in the afternoon\",\n\t\t\t\tevening: \"in the evening\",\n\t\t\t\tnight: \"at night\"\n\t\t\t}\n\t\t},\n\t\tdefaultFormattingWidth: \"wide\"\n\t})\n}, Dt = {\n\tordinalNumber: xt({\n\t\tmatchPattern: /^(\\d+)(th|st|nd|rd)?/i,\n\t\tparsePattern: /\\d+/i,\n\t\tvalueCallback: (e) => parseInt(e, 10)\n\t}),\n\tera: vt({\n\t\tmatchPatterns: {\n\t\t\tnarrow: /^(b|a)/i,\n\t\t\tabbreviated: /^(b\\.?\\s?c\\.?|b\\.?\\s?c\\.?\\s?e\\.?|a\\.?\\s?d\\.?|c\\.?\\s?e\\.?)/i,\n\t\t\twide: /^(before christ|before common era|anno domini|common era)/i\n\t\t},\n\t\tdefaultMatchWidth: \"wide\",\n\t\tparsePatterns: { any: [/^b/i, /^(a|c)/i] },\n\t\tdefaultParseWidth: \"any\"\n\t}),\n\tquarter: vt({\n\t\tmatchPatterns: {\n\t\t\tnarrow: /^[1234]/i,\n\t\t\tabbreviated: /^q[1234]/i,\n\t\t\twide: /^[1234](th|st|nd|rd)? quarter/i\n\t\t},\n\t\tdefaultMatchWidth: \"wide\",\n\t\tparsePatterns: { any: [\n\t\t\t/1/i,\n\t\t\t/2/i,\n\t\t\t/3/i,\n\t\t\t/4/i\n\t\t] },\n\t\tdefaultParseWidth: \"any\",\n\t\tvalueCallback: (e) => e + 1\n\t}),\n\tmonth: vt({\n\t\tmatchPatterns: {\n\t\t\tnarrow: /^[jfmasond]/i,\n\t\t\tabbreviated: /^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,\n\t\t\twide: /^(january|february|march|april|may|june|july|august|september|october|november|december)/i\n\t\t},\n\t\tdefaultMatchWidth: \"wide\",\n\t\tparsePatterns: {\n\t\t\tnarrow: [\n\t\t\t\t/^j/i,\n\t\t\t\t/^f/i,\n\t\t\t\t/^m/i,\n\t\t\t\t/^a/i,\n\t\t\t\t/^m/i,\n\t\t\t\t/^j/i,\n\t\t\t\t/^j/i,\n\t\t\t\t/^a/i,\n\t\t\t\t/^s/i,\n\t\t\t\t/^o/i,\n\t\t\t\t/^n/i,\n\t\t\t\t/^d/i\n\t\t\t],\n\t\t\tany: [\n\t\t\t\t/^ja/i,\n\t\t\t\t/^f/i,\n\t\t\t\t/^mar/i,\n\t\t\t\t/^ap/i,\n\t\t\t\t/^may/i,\n\t\t\t\t/^jun/i,\n\t\t\t\t/^jul/i,\n\t\t\t\t/^au/i,\n\t\t\t\t/^s/i,\n\t\t\t\t/^o/i,\n\t\t\t\t/^n/i,\n\t\t\t\t/^d/i\n\t\t\t]\n\t\t},\n\t\tdefaultParseWidth: \"any\"\n\t}),\n\tday: vt({\n\t\tmatchPatterns: {\n\t\t\tnarrow: /^[smtwf]/i,\n\t\t\tshort: /^(su|mo|tu|we|th|fr|sa)/i,\n\t\t\tabbreviated: /^(sun|mon|tue|wed|thu|fri|sat)/i,\n\t\t\twide: /^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i\n\t\t},\n\t\tdefaultMatchWidth: \"wide\",\n\t\tparsePatterns: {\n\t\t\tnarrow: [\n\t\t\t\t/^s/i,\n\t\t\t\t/^m/i,\n\t\t\t\t/^t/i,\n\t\t\t\t/^w/i,\n\t\t\t\t/^t/i,\n\t\t\t\t/^f/i,\n\t\t\t\t/^s/i\n\t\t\t],\n\t\t\tany: [\n\t\t\t\t/^su/i,\n\t\t\t\t/^m/i,\n\t\t\t\t/^tu/i,\n\t\t\t\t/^w/i,\n\t\t\t\t/^th/i,\n\t\t\t\t/^f/i,\n\t\t\t\t/^sa/i\n\t\t\t]\n\t\t},\n\t\tdefaultParseWidth: \"any\"\n\t}),\n\tdayPeriod: vt({\n\t\tmatchPatterns: {\n\t\t\tnarrow: /^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,\n\t\t\tany: /^([ap]\\.?\\s?m\\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i\n\t\t},\n\t\tdefaultMatchWidth: \"any\",\n\t\tparsePatterns: { any: {\n\t\t\tam: /^a/i,\n\t\t\tpm: /^p/i,\n\t\t\tmidnight: /^mi/i,\n\t\t\tnoon: /^no/i,\n\t\t\tmorning: /morning/i,\n\t\t\tafternoon: /afternoon/i,\n\t\t\tevening: /evening/i,\n\t\t\tnight: /night/i\n\t\t} },\n\t\tdefaultParseWidth: \"any\"\n\t})\n}, Ot = {\n\tcode: \"en-US\",\n\tformatDistance: Ct,\n\tformatLong: {\n\t\tdate: gt({\n\t\t\tformats: {\n\t\t\t\tfull: \"EEEE, MMMM do, y\",\n\t\t\t\tlong: \"MMMM do, y\",\n\t\t\t\tmedium: \"MMM d, y\",\n\t\t\t\tshort: \"MM/dd/yyyy\"\n\t\t\t},\n\t\t\tdefaultWidth: \"full\"\n\t\t}),\n\t\ttime: gt({\n\t\t\tformats: {\n\t\t\t\tfull: \"h:mm:ss a zzzz\",\n\t\t\t\tlong: \"h:mm:ss a z\",\n\t\t\t\tmedium: \"h:mm:ss a\",\n\t\t\t\tshort: \"h:mm a\"\n\t\t\t},\n\t\t\tdefaultWidth: \"full\"\n\t\t}),\n\t\tdateTime: gt({\n\t\t\tformats: {\n\t\t\t\tfull: \"{{date}} 'at' {{time}}\",\n\t\t\t\tlong: \"{{date}} 'at' {{time}}\",\n\t\t\t\tmedium: \"{{date}}, {{time}}\",\n\t\t\t\tshort: \"{{date}}, {{time}}\"\n\t\t\t},\n\t\t\tdefaultWidth: \"full\"\n\t\t})\n\t},\n\tformatRelative: Tt,\n\tlocalize: Et,\n\tmatch: Dt,\n\toptions: {\n\t\tweekStartsOn: 0,\n\t\tfirstWeekContainsDate: 1\n\t}\n}, kt = {\n\tnoDisabledRange: !1,\n\tshowLastInRange: !0,\n\tminMaxRawRange: !1,\n\tpartialRange: !0,\n\tdisableTimeRangeValidation: !1,\n\tmaxRange: void 0,\n\tminRange: void 0,\n\tautoRange: void 0,\n\tfixedStart: !1,\n\tfixedEnd: !1,\n\tautoSwitchStartEnd: !0\n}, At = {\n\tallowStopPropagation: !0,\n\tcloseOnScroll: !1,\n\tmodeHeight: 255,\n\tallowPreventDefault: !1,\n\tcloseOnClearValue: !0,\n\tcloseOnAutoApply: !0,\n\tnoSwipe: !1,\n\tkeepActionRow: !1,\n\tonClickOutside: void 0,\n\tonInternalKeydown: void 0,\n\ttabOutClosesMenu: !0,\n\tarrowLeft: void 0,\n\tkeepViewOnOffsetClick: !1,\n\ttimeArrowHoldThreshold: 0,\n\tshadowDom: !1,\n\tmobileBreakpoint: 600,\n\tsetDateOnMenuClose: !1,\n\tescClose: !0,\n\tspaceConfirm: !0,\n\tmonthChangeOnArrows: !0,\n\tmonthChangeOnScroll: !0\n}, jt = {\n\tenterSubmit: !0,\n\ttabSubmit: !0,\n\topenMenu: \"open\",\n\tselectOnFocus: !1,\n\trangeSeparator: \" - \",\n\tescClose: !0,\n\tformat: void 0,\n\tmaskFormat: void 0,\n\tapplyOnBlur: !1,\n\tseparators: void 0\n}, Mt = {\n\tdates: [],\n\tyears: [],\n\tmonths: [],\n\tquarters: [],\n\tweeks: [],\n\tweekdays: [],\n\toptions: { highlightDisabled: !1 }\n}, Nt = {\n\tshowSelect: !0,\n\tshowCancel: !0,\n\tshowNow: !1,\n\tshowPreview: !0,\n\tselectBtnLabel: \"Select\",\n\tcancelBtnLabel: \"Cancel\",\n\tnowBtnLabel: \"Now\",\n\tnowBtnRound: void 0\n}, Pt = {\n\ttoggleOverlay: \"Toggle overlay\",\n\tmenu: \"Datepicker menu\",\n\tinput: \"Datepicker input\",\n\topenTimePicker: \"Open time picker\",\n\tcloseTimePicker: \"Close time Picker\",\n\tincrementValue: (e) => `Increment ${e}`,\n\tdecrementValue: (e) => `Decrement ${e}`,\n\topenTpOverlay: (e) => `Open ${e} overlay`,\n\tamPmButton: \"Switch AM/PM mode\",\n\topenYearsOverlay: \"Open years overlay\",\n\topenMonthsOverlay: \"Open months overlay\",\n\tnextMonth: \"Next month\",\n\tprevMonth: \"Previous month\",\n\tnextYear: \"Next year\",\n\tprevYear: \"Previous year\",\n\tday: void 0,\n\tweekDay: void 0,\n\tclearInput: \"Clear value\",\n\tcalendarIcon: \"Calendar icon\",\n\ttimePicker: \"Time picker\",\n\tmonthPicker: (e) => `Month picker${e ? \" overlay\" : \"\"}`,\n\tyearPicker: (e) => `Year picker${e ? \" overlay\" : \"\"}`,\n\ttimeOverlay: (e) => `${e} overlay`\n}, Ft = {\n\tmenuAppearTop: \"dp-menu-appear-top\",\n\tmenuAppearBottom: \"dp-menu-appear-bottom\",\n\topen: \"dp-slide-down\",\n\tclose: \"dp-slide-up\",\n\tnext: \"calendar-next\",\n\tprevious: \"calendar-prev\",\n\tvNext: \"dp-slide-up\",\n\tvPrevious: \"dp-slide-down\"\n}, It = {\n\tweekDays: [],\n\tmonths: [],\n\tyears: [],\n\ttimes: {\n\t\thours: [],\n\t\tminutes: [],\n\t\tseconds: []\n\t}\n}, Lt = {\n\tmonth: \"LLL\",\n\tyear: \"yyyy\",\n\tweekDay: \"EEEEEE\",\n\tquarter: \"MMMM\",\n\tday: \"d\",\n\tinput: void 0,\n\tpreview: void 0\n}, Rt = {\n\tenableTimePicker: !0,\n\tignoreTimeValidation: !1,\n\tenableSeconds: !1,\n\tenableMinutes: !0,\n\tis24: !0,\n\tnoHoursOverlay: !1,\n\tnoMinutesOverlay: !1,\n\tnoSecondsOverlay: !1,\n\thoursGridIncrement: 1,\n\tminutesGridIncrement: 5,\n\tsecondsGridIncrement: 5,\n\thoursIncrement: 1,\n\tminutesIncrement: 1,\n\tsecondsIncrement: 1,\n\ttimePickerInline: !1,\n\tstartTime: void 0\n}, zt = {\n\tmenuWrapRef: null,\n\tcollapse: !1\n}, Bt = {\n\tyearRange: () => [1900, 2100],\n\tui: () => ({}),\n\tlocale: () => Ot,\n\tdark: !1,\n\ttransitions: !0,\n\thideNavigation: () => [],\n\tvertical: !1,\n\thideMonthYearSelect: !1,\n\tdisableYearSelect: !1,\n\tautoApply: !1,\n\tdisabledDates: () => [],\n\thideOffsetDates: !1,\n\tnoToday: !1,\n\tmarkers: () => [],\n\tpresetDates: () => [],\n\tpreventMinMaxNavigation: !1,\n\treverseYears: !1,\n\tweekPicker: !1,\n\tarrowNavigation: !1,\n\tmonthPicker: !1,\n\tyearPicker: !1,\n\tquarterPicker: !1,\n\ttimePicker: !1,\n\tmodelAuto: !1,\n\tmultiDates: !1,\n\trange: !1,\n\tinline: !1,\n\tsixWeeks: !1,\n\tfocusStartDate: !1,\n\tyearFirst: !1,\n\tloading: !1,\n\tcentered: !1\n}, Vt = {\n\tname: void 0,\n\trequired: !1,\n\tautocomplete: \"off\",\n\tstate: void 0,\n\tclearable: !0,\n\talwaysClearable: !1,\n\thideInputIcon: !1,\n\tid: void 0,\n\tinputmode: \"none\"\n}, Ht = {\n\ttype: \"local\",\n\thideOnOffsetDates: !1,\n\tlabel: \"W\"\n}, Ut = (e) => {\n\tlet { getMapKey: t, getMapKeyType: n, getTimeObjFromCurrent: i } = Wt();\n\tfunction a(t, n) {\n\t\tlet r;\n\t\treturn r = e.timezone ? new Ge(t ?? /* @__PURE__ */ new Date(), e.timezone) : t ? new Date(t) : /* @__PURE__ */ new Date(), n ? Z(r, {\n\t\t\thours: 0,\n\t\t\tminutes: 0,\n\t\t\tseconds: 0,\n\t\t\tmilliseconds: 0\n\t\t}) : r;\n\t}\n\tlet o = (t, n, r = 1) => e.timezone ? new Ge(t, n, r, e.timezone) : new Date(t, n, r), s = () => {\n\t\tlet e = j.value.enableSeconds ? \":ss\" : \"\", t = j.value.enableMinutes ? \":mm\" : \"\";\n\t\treturn j.value.is24 ? `HH${t}${e}` : `hh${t}${e} aa`;\n\t}, c = () => e.monthPicker ? \"MM/yyyy\" : e.timePicker ? s() : e.weekPicker ? `${w.value?.type === \"iso\" ? \"II\" : \"ww\"}-RR` : e.yearPicker ? \"yyyy\" : e.quarterPicker ? \"QQQ/yyyy\" : j.value.enableTimePicker ? `MM/dd/yyyy, ${s()}` : \"MM/dd/yyyy\", l = (e) => i(a(), e, j.value.enableSeconds), u = () => D.value.enabled ? j.value.startTime && Array.isArray(j.value.startTime) ? [l(j.value.startTime[0]), l(j.value.startTime[1])] : null : j.value.startTime && !Array.isArray(j.value.startTime) ? l(j.value.startTime) : null, d = (e) => e ? typeof e == \"boolean\" ? e ? 2 : 0 : Math.max(+e, 2) : 0, f = (r) => {\n\t\tlet i = n(e.monthPicker, e.yearPicker);\n\t\treturn new Map(r.map((e) => {\n\t\t\tlet n = a(e, p.value);\n\t\t\treturn [t(n, i), n];\n\t\t}));\n\t}, p = r(() => e.monthPicker || e.yearPicker || e.quarterPicker), m = r(() => {\n\t\tlet t = typeof e.multiCalendars == \"object\" && e.multiCalendars, n = {\n\t\t\tstatic: !0,\n\t\t\tsolo: !1\n\t\t};\n\t\tif (!e.multiCalendars) return {\n\t\t\t...n,\n\t\t\tcount: d(!1)\n\t\t};\n\t\tlet r = t ? e.multiCalendars : {}, i = d(t ? r.count ?? !0 : e.multiCalendars);\n\t\treturn Object.assign(n, r, { count: i });\n\t}), h = r(() => u()), g = r(() => ({\n\t\t...Pt,\n\t\t...e.ariaLabels\n\t})), _ = r(() => ({\n\t\t...It,\n\t\t...e.filters\n\t})), v = r(() => typeof e.transitions == \"boolean\" ? e.transitions ? Ft : !1 : {\n\t\t...Ft,\n\t\t...e.transitions\n\t}), y = r(() => ({\n\t\t...Nt,\n\t\t...e.actionRow\n\t})), b = r(() => typeof e.textInput == \"object\" ? {\n\t\t...jt,\n\t\t...e.textInput,\n\t\tformat: typeof e.textInput.format == \"string\" ? e.textInput.format : k.value.input,\n\t\tpattern: e.textInput.format ?? k.value.input,\n\t\tenabled: !0\n\t} : {\n\t\t...jt,\n\t\tformat: k.value.input,\n\t\tpattern: k.value.input,\n\t\tenabled: e.textInput\n\t}), x = r(() => {\n\t\tlet t = { input: !1 };\n\t\treturn typeof e.inline == \"object\" ? {\n\t\t\t...t,\n\t\t\t...e.inline,\n\t\t\tenabled: !0\n\t\t} : {\n\t\t\tenabled: e.inline,\n\t\t\t...t\n\t\t};\n\t}), S = r(() => ({\n\t\t...At,\n\t\t...e.config\n\t})), C = r(() => typeof e.highlight == \"function\" ? e.highlight : {\n\t\t...Mt,\n\t\t...e.highlight\n\t}), w = r(() => typeof e.weekNumbers == \"object\" ? {\n\t\ttype: e.weekNumbers?.type ?? Ht.type,\n\t\thideOnOffsetDates: e.weekNumbers?.hideOnOffsetDates ?? Ht.hideOnOffsetDates,\n\t\tlabel: e.weekNumbers.label ?? Ht.label\n\t} : e.weekNumbers ? Ht : void 0), T = r(() => typeof e.multiDates == \"boolean\" ? {\n\t\tenabled: e.multiDates,\n\t\tdragSelect: !0,\n\t\tlimit: null\n\t} : {\n\t\tenabled: !!e.multiDates,\n\t\tlimit: e.multiDates?.limit ? +e.multiDates.limit : null,\n\t\tdragSelect: e.multiDates?.dragSelect ?? !0\n\t}), E = r(() => ({\n\t\tminDate: e.minDate ? a(e.minDate) : null,\n\t\tmaxDate: e.maxDate ? a(e.maxDate) : null,\n\t\tdisabledDates: Array.isArray(e.disabledDates) ? f(e.disabledDates) : e.disabledDates,\n\t\tallowedDates: Array.isArray(e.allowedDates) ? f(e.allowedDates) : null,\n\t\thighlight: typeof C.value == \"object\" && Array.isArray(C.value.dates) ? f(C.value.dates) : C.value,\n\t\tmarkers: e.markers?.length ? new Map(e.markers.map((e) => [t(a(e.date), ot.DATE), e])) : null\n\t})), D = r(() => typeof e.range == \"object\" ? {\n\t\tenabled: !0,\n\t\t...kt,\n\t\t...e.range\n\t} : {\n\t\tenabled: e.range,\n\t\t...kt\n\t}), O = r(() => Object.fromEntries(Object.keys(e.ui).map((t) => {\n\t\tlet n = t, r = e.ui[n];\n\t\treturn n === \"dayClass\" ? [n, e.ui[n]] : [t, typeof e.ui[n] == \"string\" ? { [r]: !0 } : Object.fromEntries(r.map((e) => [e, !0]))];\n\t}))), k = r(() => ({\n\t\t...Lt,\n\t\t...e.formats,\n\t\tinput: e.formats?.input ?? c(),\n\t\tpreview: e.formats?.preview ?? e.formats?.input ?? c()\n\t})), A = r(() => {\n\t\tif (e.teleport) return typeof e.teleport == \"string\" ? e.teleport : typeof e.teleport == \"boolean\" ? \"body\" : e.teleport;\n\t}), j = r(() => ({\n\t\t...Rt,\n\t\t...e.timeConfig\n\t}));\n\treturn {\n\t\ttransitions: v,\n\t\tmultiCalendars: m,\n\t\tstartTime: h,\n\t\tariaLabels: g,\n\t\tfilters: _,\n\t\tactionRow: y,\n\t\ttextInput: b,\n\t\tinline: x,\n\t\tconfig: S,\n\t\thighlight: C,\n\t\tweekNumbers: w,\n\t\trange: D,\n\t\tsafeDates: E,\n\t\tmultiDates: T,\n\t\tui: O,\n\t\tformats: k,\n\t\tteleport: A,\n\t\ttimeConfig: j,\n\t\tflow: r(() => {\n\t\t\tif (e.flow) return {\n\t\t\t\tsteps: [],\n\t\t\t\tpartial: !1,\n\t\t\t\t...e.flow\n\t\t\t};\n\t\t}),\n\t\tinputAttrs: r(() => {\n\t\t\tlet t = b.value.enabled ? \"text\" : \"none\";\n\t\t\treturn e.inputAttrs ? {\n\t\t\t\t...Vt,\n\t\t\t\tinputmode: t,\n\t\t\t\t...e.inputAttrs\n\t\t\t} : {\n\t\t\t\t...Vt,\n\t\t\t\tinputmode: t\n\t\t\t};\n\t\t}),\n\t\tfloatingConfig: r(() => ({\n\t\t\toffset: e.floating?.offset ?? 10,\n\t\t\tarrow: e.floating?.arrow ?? !0,\n\t\t\tstrategy: e.floating?.strategy ?? void 0,\n\t\t\tplacement: e.floating?.placement ?? void 0,\n\t\t\tflip: e.floating?.flip ?? !0,\n\t\t\tshift: e.floating?.shift ?? !0\n\t\t})),\n\t\tweekStart: r(() => e.weekStart || e.weekStart === 0 || e.weekStart === \"0\" ? +e.weekStart : _e(Re(a(), { locale: e.locale }))),\n\t\tgetDate: a,\n\t\tgetDateFromParts: o\n\t};\n}, Wt = () => {\n\tlet e = (e, t) => ge(e, t ?? ot.DATE), t = (e, t) => e ? ot.MONTH_AND_YEAR : t ? ot.YEAR : ot.DATE, n = (t, n, r) => n.get(e(t, r)), r = (e) => e, i = (e) => e === 0 ? e : !e || Number.isNaN(+e) ? null : +e, a = () => [\n\t\t\"a[href]\",\n\t\t\"area[href]\",\n\t\t\"input:not([disabled]):not([type='hidden'])\",\n\t\t\"select:not([disabled])\",\n\t\t\"textarea:not([disabled])\",\n\t\t\"button:not([disabled])\",\n\t\t\"[tabindex]:not([tabindex='-1'])\",\n\t\t\"[data-datepicker-instance]\"\n\t].join(\", \"), o = (e, t) => {\n\t\tlet n = [...document.querySelectorAll(a())];\n\t\tn = n.filter((t) => !e.contains(t) || \"datepicker-instance\" in t.dataset);\n\t\tlet r = n.indexOf(e);\n\t\tif (r >= 0 && (t ? r - 1 >= 0 : r + 1 <= n.length)) return n[r + (t ? -1 : 1)];\n\t}, s = (e) => String(e).padStart(2, \"0\"), c = (e, t) => e?.querySelector(`[data-dp-element=\"${t}\"]`), l = (e, t, n = !1) => {\n\t\te && t.allowStopPropagation && (n && e.stopImmediatePropagation(), e.stopPropagation());\n\t}, u = (e, t, n = !1, r = !0, i) => {\n\t\tif (e.key === Q.enter || e.key === Q.space && r) return n && e.preventDefault(), t();\n\t\tif (i) return i(e);\n\t}, d = (e, t) => {\n\t\tt.allowStopPropagation && e.stopPropagation(), t.allowPreventDefault && e.preventDefault();\n\t}, f = (e) => {\n\t\tif (e) return [...e.querySelectorAll(\"input, button, select, textarea, a[href]\")][0];\n\t}, p = () => \"ontouchstart\" in globalThis || navigator.maxTouchPoints > 0, m = (e) => [\n\t\t12,\n\t\t1,\n\t\t2,\n\t\t3,\n\t\t4,\n\t\t5,\n\t\t6,\n\t\t7,\n\t\t8,\n\t\t9,\n\t\t10,\n\t\t11,\n\t\t12,\n\t\t1,\n\t\t2,\n\t\t3,\n\t\t4,\n\t\t5,\n\t\t6,\n\t\t7,\n\t\t8,\n\t\t9,\n\t\t10,\n\t\t11\n\t][e], h = (e) => {\n\t\tlet t = [], n = (e) => e.filter((e) => !!e);\n\t\tfor (let r = 0; r < e.length; r += 3) {\n\t\t\tlet i = [\n\t\t\t\te[r],\n\t\t\t\te[r + 1],\n\t\t\t\te[r + 2]\n\t\t\t];\n\t\t\tt.push(n(i));\n\t\t}\n\t\treturn t;\n\t}, g = {\n\t\tprop: (e) => `\"${e}\" prop must be enabled!`,\n\t\tdateArr: (e) => `You need to use array as \"model-value\" binding in order to support \"${e}\"`\n\t}, _ = (e, t, n, r, i) => {\n\t\tlet a = {\n\t\t\thours: ve,\n\t\t\tminutes: be,\n\t\t\tseconds: Se\n\t\t};\n\t\tif (!t) return r ? [a[e](n), a[e](n)] : a[e](n);\n\t\tif (Array.isArray(t) && r) {\n\t\t\tlet r = t[0] ?? n, o = t[1];\n\t\t\treturn [a[e](r), o ? a[e](o) : i[e][1] ?? a[e](n)];\n\t\t}\n\t\treturn Array.isArray(t) && !r ? a[e](t.at(-1) ?? n) : a[e](t);\n\t};\n\treturn {\n\t\tgetMapKey: e,\n\t\tgetMapKeyType: t,\n\t\tgetMapDate: n,\n\t\tconvertType: r,\n\t\tgetNumVal: i,\n\t\tfindNextFocusableElement: o,\n\t\tpadZero: s,\n\t\tgetElWithin: c,\n\t\tcheckStopPropagation: l,\n\t\tcheckKeyDown: u,\n\t\thandleEventPropagation: d,\n\t\tfindFocusableEl: f,\n\t\tisTouchDevice: p,\n\t\thoursToAmPmHours: m,\n\t\tgetGroupedList: h,\n\t\tsetTimeModelValue: (e, t, n, r) => {\n\t\t\te.hours = _(\"hours\", t, n, r, e), e.minutes = _(\"minutes\", t, n, r, e), e.seconds = _(\"seconds\", t, n, r, e);\n\t\t},\n\t\tgetTimeObjFromCurrent: (e, t, n) => {\n\t\t\tlet r = {\n\t\t\t\thours: ve(e),\n\t\t\t\tminutes: be(e),\n\t\t\t\tseconds: n ? Se(e) : 0\n\t\t\t};\n\t\t\treturn Object.assign(r, t);\n\t\t},\n\t\terrorMapper: g\n\t};\n}, Gt = () => {\n\tlet { getDate: e } = $(), { getMapDate: t, getGroupedList: n } = Wt(), r = (t, n) => {\n\t\tif (!t) return e();\n\t\tlet r = Z(e(t), {\n\t\t\thours: 0,\n\t\t\tminutes: 0,\n\t\t\tseconds: 0,\n\t\t\tmilliseconds: 0\n\t\t});\n\t\treturn n ? Ie(r) : r;\n\t}, i = (t, n) => {\n\t\tlet r = e(n);\n\t\treturn Z(r, {\n\t\t\thours: +(t.hours ?? ve(r)),\n\t\t\tminutes: +(t.minutes ?? be(r)),\n\t\t\tseconds: +(t.seconds ?? Se(r)),\n\t\t\tmilliseconds: 0\n\t\t});\n\t}, a = (e, t) => [Re(e, { weekStartsOn: +t }), me(e, { weekStartsOn: +t })], o = (e, t) => !e || !t ? !1 : Te(r(e), r(t)), s = (e, t) => !e || !t ? !1 : De(r(e), r(t)), c = (e, t) => !e || !t ? !1 : we(r(e), r(t)), l = (e, t, n) => e?.[0] && e?.[1] ? c(n, e[0]) && o(n, e[1]) : e?.[0] && t ? c(n, e[0]) && o(n, t) || o(n, e[0]) && c(n, t) : !1, u = (e, t) => de({\n\t\tstart: c(e, t) ? t : e,\n\t\tend: c(t, e) ? t : e\n\t}), d = (e) => `dp-${ge(e, \"yyyy-MM-dd\")}`, f = (t) => r(Z(e(t), { date: 1 })), p = (t, n) => {\n\t\tif (n) {\n\t\t\tlet r = X(e(n));\n\t\t\tif (r > t) return 12;\n\t\t\tif (r === t) return Y(e(n));\n\t\t}\n\t}, m = (t, n) => {\n\t\tif (n) {\n\t\t\tlet r = X(e(n));\n\t\t\treturn r < t ? -1 : r === t ? Y(e(n)) : void 0;\n\t\t}\n\t}, h = (t) => {\n\t\tif (t) return X(e(t));\n\t}, g = (e) => ({\n\t\thours: ve(e),\n\t\tminutes: be(e),\n\t\tseconds: Se(e)\n\t});\n\treturn {\n\t\tresetDateTime: r,\n\t\tgroupListAndMap: (e, t) => n(e).map((e) => e.map((e) => {\n\t\t\tlet { active: n, disabled: r, isBetween: i, highlighted: a } = t(e);\n\t\t\treturn {\n\t\t\t\t...e,\n\t\t\t\tactive: n,\n\t\t\t\tdisabled: r,\n\t\t\t\tclassName: {\n\t\t\t\t\t\"dp--active dp--overlay-cell-active\": n,\n\t\t\t\t\t\"dp--overlay-cell\": !n,\n\t\t\t\t\t\"dp--overlay-cell-disabled\": r,\n\t\t\t\t\t\"dp--overlay-cell-pad\": !0,\n\t\t\t\t\t\"dp--overlay-cell-active-disabled\": r && n,\n\t\t\t\t\t\"dp--cell-in-between\": i,\n\t\t\t\t\t\"dp--highlighted\": a\n\t\t\t\t}\n\t\t\t};\n\t\t})),\n\t\tsetTime: i,\n\t\tgetWeekFromDate: a,\n\t\tisDateAfter: c,\n\t\tisDateBefore: o,\n\t\tisDateBetween: l,\n\t\tisDateEqual: s,\n\t\tgetDaysInBetween: u,\n\t\tgetCellId: d,\n\t\tresetDate: f,\n\t\tgetMinMonth: p,\n\t\tgetMaxMonth: m,\n\t\tgetYearFromDate: h,\n\t\tgetTimeObj: g,\n\t\tsetTimeValue: (t) => Z(e(), g(t)),\n\t\tsanitizeTime: (e, t, n) => t && (n || n === 0) ? Object.fromEntries([\n\t\t\t\"hours\",\n\t\t\t\"minutes\",\n\t\t\t\"seconds\"\n\t\t].map((r) => r === t ? [r, n] : [r, Number.isNaN(+e[r]) ? void 0 : +e[r]])) : {\n\t\t\thours: Number.isNaN(+e.hours) ? void 0 : +e.hours,\n\t\t\tminutes: Number.isNaN(+e.minutes) ? void 0 : +e.minutes,\n\t\t\tseconds: Number.isNaN(+(e.seconds ?? \"\")) ? void 0 : +e.seconds\n\t\t},\n\t\tgetBeforeAndAfterInRange: (e, t) => ({\n\t\t\tbefore: Ve(r(t), e),\n\t\t\tafter: J(r(t), e)\n\t\t}),\n\t\tisModelAuto: (e) => Array.isArray(e) ? !!e[0] && !!e[1] : !1,\n\t\tmatchDate: (n, r) => n ? r ? r instanceof Map ? !!t(n, r) : r(e(n)) : !1 : !0,\n\t\tcheckHighlightMonth: (e, t, n) => typeof e == \"function\" ? e({\n\t\t\tmonth: t,\n\t\t\tyear: n\n\t\t}) : e.months.some((e) => e.month === t && e.year === n),\n\t\tcheckHighlightYear: (e, t) => typeof e == \"function\" ? e(t) : e.years.includes(t)\n\t};\n}, Kt = () => {\n\tlet { defaults: { config: e } } = $(), t = O(0);\n\tS(() => {\n\t\tn(), globalThis.addEventListener(\"resize\", n, { passive: !0 });\n\t}), C(() => {\n\t\tglobalThis.removeEventListener(\"resize\", n);\n\t});\n\tlet n = () => {\n\t\tt.value = globalThis.document.documentElement.clientWidth;\n\t};\n\treturn { isMobile: r(() => t.value <= e.value.mobileBreakpoint ? !0 : void 0) };\n}, qt = () => {\n\tlet { getDate: e, state: t, modelValue: n, rootProps: r, defaults: { formats: i, textInput: a } } = $(), o = (t) => ge(Fe(e(), t), i.value.year, { locale: r.locale }), s = (t) => ge(Ne(e(), t), i.value.month, { locale: r.locale }), c = (e) => ge(e, i.value.weekDay, { locale: r.locale }), l = (e) => ge(e, i.value.quarter, { locale: r.locale }), u = (e, t) => [e, t].map((e) => l(e)).join(\"-\"), d = (e) => ge(e, i.value.day, { locale: r.locale }), f = (e, t, n) => {\n\t\tlet o = n ? i.value.preview : i.value.input;\n\t\tif (!e) return \"\";\n\t\tif (typeof o == \"function\") return o(e);\n\t\tlet s = t ?? o, c = { locale: r.locale };\n\t\treturn Array.isArray(e) ? `${ge(e[0], s, c)}${r.modelAuto && !e[1] ? \"\" : a.value.rangeSeparator}${e[1] ? ge(e[1], s, c) : \"\"}` : ge(e, s, c);\n\t}, p = () => {\n\t\tlet e = (e) => ge(e, a.value.format);\n\t\treturn Array.isArray(n.value) ? `${e(n.value[0])}${a.value.rangeSeparator}${n.value[1] ? e(n.value[1]) : \"\"}` : \"\";\n\t};\n\treturn {\n\t\tformatYear: o,\n\t\tformatMonth: s,\n\t\tformatWeekDay: c,\n\t\tformatQuarter: l,\n\t\tformatSelectedDate: f,\n\t\tformatForTextInput: () => t.isInputFocused && n.value ? Array.isArray(n.value) ? p() : typeof a.value.format == \"function\" ? a.value.format(n.value) : ge(n.value, a.value.format) : f(n.value),\n\t\tformatPreview: (e) => f(e, void 0, !0),\n\t\tformatQuarterText: u,\n\t\tformatDay: d\n\t};\n}, Jt = () => {\n\tlet { rootProps: e } = $(), { formatYear: t, formatMonth: n } = qt();\n\treturn {\n\t\tgetMonths: () => [\n\t\t\t0,\n\t\t\t1,\n\t\t\t2,\n\t\t\t3,\n\t\t\t4,\n\t\t\t5,\n\t\t\t6,\n\t\t\t7,\n\t\t\t8,\n\t\t\t9,\n\t\t\t10,\n\t\t\t11\n\t\t].map((e) => ({\n\t\t\ttext: n(e),\n\t\t\tvalue: e\n\t\t})),\n\t\tgetYears: () => {\n\t\t\tlet n = [];\n\t\t\tfor (let r = +e.yearRange[0]; r <= +e.yearRange[1]; r++) n.push({\n\t\t\t\tvalue: +r,\n\t\t\t\ttext: t(r)\n\t\t\t});\n\t\t\treturn e.reverseYears ? n.reverse() : n;\n\t\t},\n\t\tisOutOfYearRange: (t) => t < +e.yearRange[0] || t > +e.yearRange[1]\n\t};\n}, Yt = (e) => ({\n\topenMenu: () => e.value?.openMenu(),\n\tcloseMenu: () => e.value?.closeMenu(),\n\tselectDate: () => e.value?.selectDate(),\n\tclearValue: () => e.value?.clearValue(),\n\tformatInputValue: () => e.value?.formatInputValue(),\n\tupdateInternalModelValue: (t) => e.value?.updateInternalModelValue(t),\n\tsetMonthYear: (t, n) => e.value?.setMonthYear(t, n),\n\tparseModel: () => e.value?.parseModel(),\n\tswitchView: (t, n) => e.value?.switchView(t, n),\n\texecuteFlow: (t) => e.value?.executeFlow(t),\n\ttoggleMenu: () => e.value?.toggleMenu(),\n\tdpMenuRef: () => e.value?.dpMenuRef(),\n\tdpWrapMenuRef: () => e.value?.dpWrapMenuRef(),\n\tinputRef: () => e.value?.inputRef()\n}), Xt = () => ({ boolHtmlAttribute: (e) => e ? !0 : void 0 }), Zt = () => {\n\tlet { getDate: e, rootProps: t, defaults: { textInput: n, startTime: i, timeConfig: a } } = $(), { getTimeObjFromCurrent: o } = Wt(), s = O(!1), c = r(() => Array.isArray(i.value) ? i.value[0] : i.value ?? o(e(), {}, a.value.enableSeconds)), l = (e, t) => {\n\t\tlet n = /[^a-zA-Z0-9]+/g, r = t.split(n), i = e.split(n), a = e.match(n) || [], o = t.match(n) || [], s = \"\";\n\t\tfor (let e = 0; e < r.length && e < i.length; e++) {\n\t\t\te > 0 && o[e - 1] && (s += a[e - 1] || o[e - 1]);\n\t\t\tlet t = r[e]?.length;\n\t\t\ts += i[e]?.slice(0, t);\n\t\t}\n\t\treturn s;\n\t}, u = (n, r, i) => {\n\t\tlet a = Ae(n, l(r, n), e(), { locale: t.locale });\n\t\treturn ke(a) && Ee(a) ? i || s.value || t.timePicker ? a : Z(a, {\n\t\t\thours: +c.value.hours,\n\t\t\tminutes: +c.value.minutes,\n\t\t\tseconds: +(c.value.seconds ?? 0),\n\t\t\tmilliseconds: 0\n\t\t}) : null;\n\t};\n\treturn {\n\t\ttextPasted: s,\n\t\tparseFreeInput: (e, t) => {\n\t\t\tif (typeof n.value.pattern == \"string\") return u(e, n.value.pattern, t);\n\t\t\tif (Array.isArray(n.value.pattern)) {\n\t\t\t\tlet r = null;\n\t\t\t\tfor (let i of n.value.pattern) if (r = u(e, i, t), r) break;\n\t\t\t\treturn r;\n\t\t\t}\n\t\t\treturn typeof n.value.pattern == \"function\" ? n.value.pattern(e) : null;\n\t\t},\n\t\tapplyMaxValues: (e, t) => {\n\t\t\tlet n = {\n\t\t\t\tMM: 12,\n\t\t\t\tDD: 31,\n\t\t\t\thh: 23,\n\t\t\t\tmm: 59,\n\t\t\t\tss: 59\n\t\t\t}, r = \"\", i = 0;\n\t\t\tfor (let a = 0; a < t.length; a++) {\n\t\t\t\tlet o = t[a], s = o.length, c = e.slice(i, i + s);\n\t\t\t\tif (!c) break;\n\t\t\t\tif (c.length < s) r += c;\n\t\t\t\telse {\n\t\t\t\t\tlet e = Number.parseInt(c, 10);\n\t\t\t\t\tn[o] && e > n[o] && (e = n[o]), r += e.toString().padStart(s, \"0\").slice(0, s);\n\t\t\t\t}\n\t\t\t\ti += s;\n\t\t\t}\n\t\t\treturn r;\n\t\t},\n\t\tcreateMaskedValue: (e, t) => {\n\t\t\tlet n = /(YYYY|MM|DD|hh|mm|ss)/g, r = [...t.matchAll(n)].map((e) => e[0]), i = t.replace(n, \"|\").split(\"|\").filter(Boolean), a = r.map((e) => e.length), o = \"\", s = 0;\n\t\t\tfor (let t = 0; t < r.length; t++) {\n\t\t\t\tlet n = a[t], r = e.slice(s, s + n);\n\t\t\t\tif (!r) break;\n\t\t\t\to += r, r.length === n && i[t] && (o += i[t]), s += n;\n\t\t\t}\n\t\t\treturn o;\n\t\t}\n\t};\n}, Qt = /* @__PURE__ */ function(e) {\n\treturn e.Input = \"input\", e.DatePicker = \"date-picker\", e.Calendar = \"calendar\", e.DatePickerHeader = \"date-picker-header\", e.Menu = \"menu\", e.ActionRow = \"action-row\", e.TimePicker = \"time-picker\", e.TimeInput = \"time-input\", e.PassTrough = \"pass-trough\", e.MonthPicker = \"month-picker\", e.YearMode = \"year-mode\", e.QuarterPicker = \"quarter-picker\", e.YearPicker = \"year-picker\", e;\n}({}), $t = [\n\t\"time-input\",\n\t\"time-picker\",\n\t\"pass-trough\"\n], en = [\n\t{\n\t\tname: \"trigger\",\n\t\tuse: [\"input\"]\n\t},\n\t{\n\t\tname: \"input-icon\",\n\t\tuse: [\"input\"]\n\t},\n\t{\n\t\tname: \"clear-icon\",\n\t\tuse: [\"input\"]\n\t},\n\t{\n\t\tname: \"dp-input\",\n\t\tuse: [\"input\"]\n\t},\n\t{\n\t\tname: \"clock-icon\",\n\t\tuse: [\n\t\t\t\"time-picker\",\n\t\t\t\"time-input\",\n\t\t\t\"pass-trough\"\n\t\t]\n\t},\n\t{\n\t\tname: \"arrow-left\",\n\t\tuse: [\n\t\t\t\"date-picker-header\",\n\t\t\t\"pass-trough\",\n\t\t\t\"year-mode\"\n\t\t]\n\t},\n\t{\n\t\tname: \"arrow-right\",\n\t\tuse: [\n\t\t\t\"date-picker-header\",\n\t\t\t\"pass-trough\",\n\t\t\t\"year-mode\"\n\t\t]\n\t},\n\t{\n\t\tname: \"arrow-up\",\n\t\tuse: [\n\t\t\t\"time-picker\",\n\t\t\t\"time-input\",\n\t\t\t\"date-picker-header\",\n\t\t\t\"pass-trough\"\n\t\t]\n\t},\n\t{\n\t\tname: \"arrow-down\",\n\t\tuse: [\n\t\t\t\"time-picker\",\n\t\t\t\"time-input\",\n\t\t\t\"date-picker-header\",\n\t\t\t\"pass-trough\"\n\t\t]\n\t},\n\t{\n\t\tname: \"calendar-icon\",\n\t\tuse: [\n\t\t\t\"date-picker-header\",\n\t\t\t\"time-picker\",\n\t\t\t\"pass-trough\",\n\t\t\t\"year-mode\"\n\t\t]\n\t},\n\t{\n\t\tname: \"day\",\n\t\tuse: [\"calendar\", \"pass-trough\"]\n\t},\n\t{\n\t\tname: \"month-overlay-value\",\n\t\tuse: [\n\t\t\t\"date-picker-header\",\n\t\t\t\"pass-trough\",\n\t\t\t\"month-picker\"\n\t\t]\n\t},\n\t{\n\t\tname: \"year-overlay-value\",\n\t\tuse: [\n\t\t\t\"date-picker-header\",\n\t\t\t\"pass-trough\",\n\t\t\t\"year-mode\",\n\t\t\t\"year-picker\"\n\t\t]\n\t},\n\t{\n\t\tname: \"year-overlay\",\n\t\tuse: [\"date-picker-header\", \"pass-trough\"]\n\t},\n\t{\n\t\tname: \"month-overlay\",\n\t\tuse: [\"date-picker-header\", \"pass-trough\"]\n\t},\n\t{\n\t\tname: \"month-overlay-header\",\n\t\tuse: [\"date-picker-header\", \"pass-trough\"]\n\t},\n\t{\n\t\tname: \"year-overlay-header\",\n\t\tuse: [\"date-picker-header\", \"pass-trough\"]\n\t},\n\t{\n\t\tname: \"hours-overlay-value\",\n\t\tuse: $t\n\t},\n\t{\n\t\tname: \"hours-overlay-header\",\n\t\tuse: $t\n\t},\n\t{\n\t\tname: \"minutes-overlay-value\",\n\t\tuse: $t\n\t},\n\t{\n\t\tname: \"minutes-overlay-header\",\n\t\tuse: $t\n\t},\n\t{\n\t\tname: \"seconds-overlay-value\",\n\t\tuse: $t\n\t},\n\t{\n\t\tname: \"seconds-overlay-header\",\n\t\tuse: $t\n\t},\n\t{\n\t\tname: \"hours\",\n\t\tuse: [\n\t\t\t\"time-input\",\n\t\t\t\"time-picker\",\n\t\t\t\"pass-trough\"\n\t\t]\n\t},\n\t{\n\t\tname: \"minutes\",\n\t\tuse: [\n\t\t\t\"time-input\",\n\t\t\t\"time-picker\",\n\t\t\t\"pass-trough\"\n\t\t]\n\t},\n\t{\n\t\tname: \"seconds\",\n\t\tuse: [\n\t\t\t\"time-input\",\n\t\t\t\"time-picker\",\n\t\t\t\"pass-trough\"\n\t\t]\n\t},\n\t{\n\t\tname: \"month\",\n\t\tuse: [\n\t\t\t\"date-picker-header\",\n\t\t\t\"time-picker\",\n\t\t\t\"pass-trough\"\n\t\t]\n\t},\n\t{\n\t\tname: \"year\",\n\t\tuse: [\n\t\t\t\"date-picker-header\",\n\t\t\t\"time-picker\",\n\t\t\t\"pass-trough\",\n\t\t\t\"year-mode\"\n\t\t]\n\t},\n\t{\n\t\tname: \"action-buttons\",\n\t\tuse: [\"action-row\"]\n\t},\n\t{\n\t\tname: \"action-preview\",\n\t\tuse: [\"action-row\"]\n\t},\n\t{\n\t\tname: \"calendar-header\",\n\t\tuse: [\"calendar\", \"pass-trough\"]\n\t},\n\t{\n\t\tname: \"marker-tooltip\",\n\t\tuse: [\"calendar\", \"pass-trough\"]\n\t},\n\t{\n\t\tname: \"action-extra\",\n\t\tuse: [\"menu\"]\n\t},\n\t{\n\t\tname: \"time-picker-overlay\",\n\t\tuse: [\n\t\t\t\"time-picker\",\n\t\t\t\"time-picker\",\n\t\t\t\"pass-trough\"\n\t\t]\n\t},\n\t{\n\t\tname: \"am-pm-button\",\n\t\tuse: [\n\t\t\t\"time-picker\",\n\t\t\t\"time-input\",\n\t\t\t\"pass-trough\"\n\t\t]\n\t},\n\t{\n\t\tname: \"left-sidebar\",\n\t\tuse: [\"menu\"]\n\t},\n\t{\n\t\tname: \"right-sidebar\",\n\t\tuse: [\"menu\"]\n\t},\n\t{\n\t\tname: \"month-year\",\n\t\tuse: [\n\t\t\t\"date-picker-header\",\n\t\t\t\"pass-trough\",\n\t\t\t\"month-picker\",\n\t\t\t\"year-picker\"\n\t\t]\n\t},\n\t{\n\t\tname: \"time-picker\",\n\t\tuse: [\"date-picker\", \"pass-trough\"]\n\t},\n\t{\n\t\tname: \"action-row\",\n\t\tuse: [\"action-row\"]\n\t},\n\t{\n\t\tname: \"marker\",\n\t\tuse: [\"calendar\", \"pass-trough\"]\n\t},\n\t{\n\t\tname: \"quarter\",\n\t\tuse: [\"quarter-picker\", \"pass-trough\"]\n\t},\n\t{\n\t\tname: \"top-extra\",\n\t\tuse: [\n\t\t\t\"date-picker-header\",\n\t\t\t\"pass-trough\",\n\t\t\t\"month-picker\",\n\t\t\t\"quarter-picker\",\n\t\t\t\"year-picker\"\n\t\t]\n\t},\n\t{\n\t\tname: \"tp-inline-arrow-up\",\n\t\tuse: [\n\t\t\t\"date-picker\",\n\t\t\t\"time-input\",\n\t\t\t\"time-picker\",\n\t\t\t\"pass-trough\"\n\t\t]\n\t},\n\t{\n\t\tname: \"tp-inline-arrow-down\",\n\t\tuse: [\n\t\t\t\"date-picker\",\n\t\t\t\"time-input\",\n\t\t\t\"time-picker\",\n\t\t\t\"pass-trough\"\n\t\t]\n\t},\n\t{\n\t\tname: \"arrow\",\n\t\tuse: [\"menu\"]\n\t},\n\t{\n\t\tname: \"menu-header\",\n\t\tuse: [\"menu\"]\n\t}\n], tn = (e, t) => en.filter((n) => e[n.name] && n.use.includes(t)).map((e) => e.name), nn = (e, t) => en.map((e) => e.name).concat(t?.filter((e) => e.slot).map((e) => e.slot) ?? []).filter((t) => !!e[t]), rn = {\n\tkey: 1,\n\tclass: \"dp--input-wrap\"\n}, an = [\n\t\"id\",\n\t\"name\",\n\t\"inputmode\",\n\t\"placeholder\",\n\t\"disabled\",\n\t\"readonly\",\n\t\"required\",\n\t\"value\",\n\t\"autocomplete\",\n\t\"aria-label\",\n\t\"aria-disabled\",\n\t\"aria-invalid\",\n\t\"aria-expanded\",\n\t\"aria-controls\"\n], on = {\n\tkey: 1,\n\tclass: \"dp--clear-btn\"\n}, sn = [\"aria-label\"], cn = /* @__PURE__ */ d({\n\t__name: \"DatepickerInput\",\n\tprops: { isMenuOpen: {\n\t\ttype: Boolean,\n\t\tdefault: !1\n\t} },\n\temits: [\n\t\t\"clear\",\n\t\t\"open\",\n\t\t\"set-input-date\",\n\t\t\"close\",\n\t\t\"select-date\",\n\t\t\"set-empty-date\",\n\t\t\"toggle\",\n\t\t\"focus\",\n\t\t\"blur\",\n\t\t\"real-blur\"\n\t],\n\tsetup(e, { expose: t, emit: n }) {\n\t\tlet c = n, l = e, { rootEmit: d, inputValue: f, rootProps: p, defaults: { textInput: m, ariaLabels: h, inline: g, config: y, range: b, multiDates: x, ui: S, inputAttrs: C } } = $(), { checkMinMaxRange: T, isValidDate: E } = ht(), { parseFreeInput: D, textPasted: k, createMaskedValue: j, applyMaxValues: M } = Zt(), { checkKeyDown: N, checkStopPropagation: ee } = Wt(), { boolHtmlAttribute: F } = Xt(), te = I(\"dp-input\"), L = O(null), R = O(!1), z = r(() => ({\n\t\t\t\"dp--pointer\": !p.disabled && !p.readonly && !m.value.enabled,\n\t\t\t\"dp--disabled\": p.disabled,\n\t\t\t\"dp--input-readonly\": !m.value.enabled,\n\t\t\t\"dp--input\": !0,\n\t\t\t\"dp--input-not-clearable\": !C.value.clearable,\n\t\t\t\"dp--input-icon-pad\": !C.value.hideInputIcon,\n\t\t\t\"dp--input-valid\": typeof C.value.state == \"boolean\" ? C.value.state : !1,\n\t\t\t\"dp--input-invalid\": typeof C.value.state == \"boolean\" ? !C.value.state : !1,\n\t\t\t\"dp--input-focus\": R.value || l.isMenuOpen,\n\t\t\t\"dp--input-reg\": !m.value.enabled,\n\t\t\t...S.value.input\n\t\t})), B = () => {\n\t\t\tc(\"set-input-date\", null), C && p.autoApply && (c(\"set-empty-date\"), L.value = null);\n\t\t}, ne = (e) => {\n\t\t\tif (m.value.separators?.length) {\n\t\t\t\tlet t = new RegExp(m.value.separators.map((e) => e.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")).join(\"|\"));\n\t\t\t\treturn e.split(t);\n\t\t\t}\n\t\t\treturn e.split(m.value.rangeSeparator);\n\t\t}, re = (e) => {\n\t\t\tlet [t, n] = ne(e);\n\t\t\tif (t) {\n\t\t\t\tlet e = D(t.trim(), f.value), r = n ? D(n.trim(), f.value) : void 0;\n\t\t\t\tif (we(e, r)) return;\n\t\t\t\tlet i = e && r ? [e, r] : [e];\n\t\t\t\tT(r, i, 0) && (L.value = e ? i : null);\n\t\t\t}\n\t\t}, H = () => {\n\t\t\tk.value = !0;\n\t\t}, U = (e) => {\n\t\t\tb.value.enabled ? re(e) : x.value.enabled ? L.value = e.split(\";\").map((e) => D(e.trim())).filter((e) => !!e) : L.value = D(e, f.value);\n\t\t}, W = (e) => {\n\t\t\tlet t = typeof e == \"string\" ? e : e.target?.value, n = m?.value?.maskFormat, r = t;\n\t\t\tif (typeof n == \"string\") {\n\t\t\t\tlet e = [...n.matchAll(/(YYYY|MM|DD|hh|mm|ss)/g)].map((e) => e[0]);\n\t\t\t\tr = j(M(t.replace(/\\D/g, \"\"), e), n);\n\t\t\t}\n\t\t\tr === \"\" ? B() : (m.value.openMenu && !l.isMenuOpen && c(\"open\"), U(r), c(\"set-input-date\", L.value)), k.value = !1, f.value = r, d(\"text-input\", e, L.value);\n\t\t}, ie = (e) => {\n\t\t\tm.value.enabled ? (U(e.target.value), m.value.enterSubmit && E(L.value) && f.value !== \"\" ? (c(\"set-input-date\", L.value, !0), L.value = null) : m.value.enterSubmit && f.value === \"\" && (L.value = null, c(\"clear\"))) : G(e);\n\t\t}, ae = (e, t) => {\n\t\t\tm.value.enabled && m.value.tabSubmit && !t && U(e.target.value), m.value.tabSubmit && E(L.value) && f.value !== \"\" ? (c(\"set-input-date\", L.value, !0, !0), L.value = null) : m.value.tabSubmit && f.value === \"\" && (L.value = null, c(\"clear\"));\n\t\t}, oe = () => {\n\t\t\tR.value = !0, c(\"focus\"), _().then(() => {\n\t\t\t\tm.value.enabled && m.value.selectOnFocus && te.value?.select();\n\t\t\t});\n\t\t}, G = (e) => {\n\t\t\tif (ee(e, y.value, !0), m.value.enabled && m.value.openMenu && !g.value.input) {\n\t\t\t\tif (m.value.openMenu === \"open\" && !l.isMenuOpen) return c(\"open\");\n\t\t\t\tif (m.value.openMenu === \"toggle\") return c(\"toggle\");\n\t\t\t} else m.value.enabled || c(\"toggle\");\n\t\t}, K = () => {\n\t\t\tc(\"real-blur\"), R.value = !1, (!l.isMenuOpen || g.value.enabled && g.value.input) && c(\"blur\"), (p.autoApply && m.value.enabled && L.value && !l.isMenuOpen || m.value.applyOnBlur) && (c(\"set-input-date\", L.value), c(\"select-date\"), L.value = null);\n\t\t}, q = (e) => {\n\t\t\tee(e, y.value, !0), c(\"clear\");\n\t\t}, J = () => {\n\t\t\tc(\"close\");\n\t\t}, se = (e) => {\n\t\t\tif (e.key === \"Tab\" && ae(e), e.key === \"Enter\" && (ie(e), y.value.allowPreventDefault && (e.preventDefault(), ee(e, y.value, !0))), e.key === \"Escape\" && m.value.escClose && J(), !m.value.enabled) {\n\t\t\t\tif (e.code === \"Tab\") return;\n\t\t\t\te.preventDefault();\n\t\t\t}\n\t\t}, ce = () => {\n\t\t\tte.value?.focus({ preventScroll: !0 });\n\t\t}, le = (e) => {\n\t\t\tL.value = e;\n\t\t}, ue = (e) => {\n\t\t\te.key === Q.tab && ae(e, !0);\n\t\t};\n\t\treturn t({\n\t\t\tfocusInput: ce,\n\t\t\tsetParsedDate: le\n\t\t}), (t, n) => (w(), o(\"div\", { onClick: G }, [!t.$slots[\"dp-input\"] && !P(g).enabled ? A(t.$slots, \"trigger\", { key: 0 }) : a(\"\", !0), !t.$slots.trigger && (!P(g).enabled || P(g).input) ? (w(), o(\"div\", rn, [\n\t\t\t!t.$slots.trigger && (!P(g).enabled || P(g).enabled && P(g).input) ? A(t.$slots, \"dp-input\", {\n\t\t\t\tkey: 0,\n\t\t\t\tvalue: P(f),\n\t\t\t\tisMenuOpen: e.isMenuOpen,\n\t\t\t\tonInput: W,\n\t\t\t\tonEnter: ie,\n\t\t\t\tonTab: ae,\n\t\t\t\tonClear: q,\n\t\t\t\tonBlur: K,\n\t\t\t\tonKeypress: se,\n\t\t\t\tonPaste: H,\n\t\t\t\tonFocus: oe,\n\t\t\t\topenMenu: () => t.$emit(\"open\"),\n\t\t\t\tcloseMenu: () => t.$emit(\"close\"),\n\t\t\t\ttoggleMenu: () => t.$emit(\"toggle\")\n\t\t\t}, () => [s(\"input\", {\n\t\t\t\tid: P(C).id,\n\t\t\t\tref: \"dp-input\",\n\t\t\t\t\"data-test-id\": \"dp-input\",\n\t\t\t\tname: P(C).name,\n\t\t\t\tclass: v(z.value),\n\t\t\t\tinputmode: P(C).inputmode,\n\t\t\t\tplaceholder: P(p).placeholder,\n\t\t\t\tdisabled: P(F)(P(p).disabled),\n\t\t\t\treadonly: P(F)(P(p).readonly),\n\t\t\t\trequired: P(F)(P(C).required),\n\t\t\t\tvalue: P(f),\n\t\t\t\tautocomplete: P(C).autocomplete,\n\t\t\t\t\"aria-label\": P(h).input,\n\t\t\t\t\"aria-disabled\": P(p).disabled || void 0,\n\t\t\t\t\"aria-invalid\": P(C).state === !1 ? !0 : void 0,\n\t\t\t\trole: \"combobox\",\n\t\t\t\t\"aria-haspopup\": \"dialog\",\n\t\t\t\t\"aria-expanded\": e.isMenuOpen,\n\t\t\t\t\"aria-controls\": P(p).menuId,\n\t\t\t\tonInput: W,\n\t\t\t\tonBlur: K,\n\t\t\t\tonFocus: oe,\n\t\t\t\tonKeypress: se,\n\t\t\t\tonKeydown: n[0] ||= (e) => se(e),\n\t\t\t\tonPaste: H,\n\t\t\t\tonInvalid: n[1] ||= (e) => P(d)(\"invalid\", e)\n\t\t\t}, null, 42, an)]) : a(\"\", !0),\n\t\t\ts(\"div\", { onClick: n[4] ||= (e) => c(\"toggle\") }, [t.$slots[\"input-icon\"] && !P(C).hideInputIcon ? (w(), o(\"span\", {\n\t\t\t\tkey: 0,\n\t\t\t\tclass: \"dp--input-icon\",\n\t\t\t\tonClick: n[2] ||= (e) => c(\"toggle\")\n\t\t\t}, [A(t.$slots, \"input-icon\")])) : a(\"\", !0), !t.$slots[\"input-icon\"] && !P(C).hideInputIcon && !t.$slots[\"dp-input\"] ? (w(), i(P(Ke), {\n\t\t\t\tkey: 1,\n\t\t\t\t\"aria-label\": P(h)?.calendarIcon,\n\t\t\t\tclass: \"dp--input-icon dp--input-icons\",\n\t\t\t\tonClick: n[3] ||= (e) => c(\"toggle\")\n\t\t\t}, null, 8, [\"aria-label\"])) : a(\"\", !0)]),\n\t\t\tt.$slots[\"clear-icon\"] && (P(C).alwaysClearable || P(f) && P(C).clearable && !P(p).disabled && !P(p).readonly) ? (w(), o(\"span\", on, [A(t.$slots, \"clear-icon\", { clear: q })])) : a(\"\", !0),\n\t\t\t!t.$slots[\"clear-icon\"] && (P(C).alwaysClearable || P(C).clearable && P(f) && !P(p).disabled && !P(p).readonly) ? (w(), o(\"button\", {\n\t\t\t\tkey: 2,\n\t\t\t\t\"aria-label\": P(h)?.clearInput,\n\t\t\t\tclass: \"dp--clear-btn\",\n\t\t\t\ttype: \"button\",\n\t\t\t\t\"data-test-id\": \"clear-input-value-btn\",\n\t\t\t\tonKeydown: n[5] ||= (e) => P(N)(e, () => q(e), !0, P(y).spaceConfirm, ue),\n\t\t\t\tonClick: n[6] ||= V((e) => q(e), [\"prevent\"])\n\t\t\t}, [u(P(qe), { class: \"dp--input-icons\" })], 40, sn)) : a(\"\", !0)\n\t\t])) : a(\"\", !0)]));\n\t}\n}), ln = (e) => {\n\tlet { rootProps: t, modelValue: n, getDate: r, defaults: { range: i, multiDates: a } } = $(), { isDateBefore: o } = Gt(), s = () => {\n\t\tlet e = r();\n\t\treturn t.actionRow?.nowBtnRound && (e = je(e, {\n\t\t\troundingMethod: t.actionRow.nowBtnRound.rounding ?? \"ceil\",\n\t\t\tnearestTo: t.actionRow.nowBtnRound.roundTo ?? 15\n\t\t})), e;\n\t}, c = () => {\n\t\tlet e = s();\n\t\t!i.value.enabled && !a.value.enabled ? n.value = e : n.value && Array.isArray(n.value) && n.value[0] ? a.value.enabled ? n.value = [...n.value, e] : n.value = o(e, n.value[0]) ? [e, n.value[0]] : [n.value[0], e] : n.value = [e], l();\n\t}, l = () => {\n\t\tt.autoApply && e && e(\"select-date\");\n\t};\n\treturn {\n\t\tselectCurrentDate: c,\n\t\tselectOnAutoApply: l\n\t};\n}, un = {\n\tref: \"action-row\",\n\tclass: \"dp--action-row\"\n}, dn = [\"title\"], fn = {\n\tref: \"action-buttons-container\",\n\tclass: \"dp--action-buttons\",\n\t\"data-dp-element\": \"action-row\"\n}, pn = [\"disabled\"], mn = /* @__PURE__ */ d({\n\t__name: \"ActionRow\",\n\tprops: {\n\t\tmenuMount: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: !1\n\t\t},\n\t\tcalendarWidth: { default: 0 }\n\t},\n\temits: [\n\t\t\"close-picker\",\n\t\t\"select-date\",\n\t\t\"select-now\"\n\t],\n\tsetup(t, { emit: n }) {\n\t\tlet i = n, c = t, { rootEmit: u, rootProps: d, modelValue: f, defaults: { actionRow: p, multiCalendars: m, inline: h, range: g, multiDates: _, formats: v } } = $(), { selectCurrentDate: y } = ln(i), { isTimeValid: x, isMonthValid: T } = ht(), { formatPreview: E } = qt(), { checkKeyDown: D, convertType: k } = Wt(), { boolHtmlAttribute: j } = Xt(), N = I(\"action-buttons-container\"), ee = I(\"action-row\"), F = O(!1), te = O({});\n\t\tS(() => {\n\t\t\tL(), globalThis.addEventListener(\"resize\", L);\n\t\t}), C(() => {\n\t\t\tglobalThis.removeEventListener(\"resize\", L);\n\t\t});\n\t\tlet L = () => {\n\t\t\tF.value = !1, setTimeout(() => {\n\t\t\t\tlet e = N.value?.getBoundingClientRect(), t = ee.value?.getBoundingClientRect();\n\t\t\t\te && t && (te.value.maxWidth = `${t.width - e.width - 20}px`), F.value = !0;\n\t\t\t}, 0);\n\t\t}, R = r(() => g.value.enabled && !g.value.partialRange && f.value ? f.value.length === 2 : !0), z = r(() => !x.value(f.value) || !T.value(f.value) || !R.value), B = () => {\n\t\t\tlet e = v.value.preview;\n\t\t\treturn d.timePicker || d.monthPicker, e(k(f.value));\n\t\t}, V = () => {\n\t\t\tlet e = f.value;\n\t\t\treturn m.value.count > 0 ? `${E(e[0])} - ${E(e[1])}` : [E(e[0]), E(e[1])];\n\t\t}, ne = r(() => !f.value || !c.menuMount ? \"\" : typeof v.value.preview == \"string\" ? Array.isArray(f.value) ? f.value.length === 2 && f.value[1] ? V() : _.value.enabled ? f.value.map((e) => `${E(e)}`) : d.modelAuto ? `${E(f.value[0])}` : `${E(f.value[0])} -` : E(f.value) : B()), re = () => _.value.enabled ? \"; \" : \" - \", H = r(() => Array.isArray(ne.value) ? ne.value.join(re()) : ne.value), U = () => {\n\t\t\tx.value(f.value) && T.value(f.value) && R.value ? i(\"select-date\") : u(\"invalid-select\");\n\t\t};\n\t\treturn (t, n) => (w(), o(\"div\", un, [t.$slots[\"action-row\"] ? A(t.$slots, \"action-row\", {\n\t\t\tkey: 0,\n\t\t\tmodelValue: P(f),\n\t\t\tdisabled: z.value,\n\t\t\tselectDate: () => t.$emit(\"select-date\"),\n\t\t\tclosePicker: () => t.$emit(\"close-picker\")\n\t\t}) : (w(), o(e, { key: 1 }, [P(p).showPreview ? (w(), o(\"div\", {\n\t\t\tkey: 0,\n\t\t\tclass: \"dp--selection-preview\",\n\t\t\ttitle: H.value || void 0,\n\t\t\tstyle: b(te.value)\n\t\t}, [t.$slots[\"action-preview\"] && F.value ? A(t.$slots, \"action-preview\", {\n\t\t\tkey: 0,\n\t\t\tvalue: P(f),\n\t\t\tformatValue: H.value\n\t\t}) : a(\"\", !0), !t.$slots[\"action-preview\"] && F.value ? (w(), o(e, { key: 1 }, [l(M(H.value), 1)], 64)) : a(\"\", !0)], 12, dn)) : a(\"\", !0), s(\"div\", fn, [t.$slots[\"action-buttons\"] ? A(t.$slots, \"action-buttons\", {\n\t\t\tkey: 0,\n\t\t\tvalue: P(f),\n\t\t\tselectDate: U,\n\t\t\tselectionDisabled: z.value\n\t\t}) : a(\"\", !0), t.$slots[\"action-buttons\"] ? a(\"\", !0) : (w(), o(e, { key: 1 }, [\n\t\t\t!P(h).enabled && P(p).showCancel ? (w(), o(\"button\", {\n\t\t\t\tkey: 0,\n\t\t\t\tref: \"cancel-btn\",\n\t\t\t\ttype: \"button\",\n\t\t\t\t\"data-dp-action-element\": \"0\",\n\t\t\t\tclass: \"dp--action-button dp--action-cancel\",\n\t\t\t\tonClick: n[0] ||= (e) => t.$emit(\"close-picker\"),\n\t\t\t\tonKeydown: n[1] ||= (e) => P(D)(e, () => t.$emit(\"close-picker\"))\n\t\t\t}, M(P(p).cancelBtnLabel), 545)) : a(\"\", !0),\n\t\t\tP(p).showNow ? (w(), o(\"button\", {\n\t\t\t\tkey: 1,\n\t\t\t\ttype: \"button\",\n\t\t\t\t\"data-dp-action-element\": \"0\",\n\t\t\t\tclass: \"dp--action-button dp--action-cancel\",\n\t\t\t\tonClick: n[2] ||= (...e) => P(y) && P(y)(...e),\n\t\t\t\tonKeydown: n[3] ||= (e) => P(D)(e, () => P(y)())\n\t\t\t}, M(P(p).nowBtnLabel), 33)) : a(\"\", !0),\n\t\t\tP(p).showSelect ? (w(), o(\"button\", {\n\t\t\t\tkey: 2,\n\t\t\t\tref: \"select-btn\",\n\t\t\t\ttype: \"button\",\n\t\t\t\t\"data-dp-action-element\": \"0\",\n\t\t\t\tclass: \"dp--action-button dp--action-select\",\n\t\t\t\tdisabled: P(j)(z.value),\n\t\t\t\t\"data-test-id\": \"select-button\",\n\t\t\t\tonKeydown: n[4] ||= (e) => P(D)(e, () => U()),\n\t\t\t\tonClick: U\n\t\t\t}, M(P(p).selectBtnLabel), 41, pn)) : a(\"\", !0)\n\t\t], 64))], 512)], 64))], 512));\n\t}\n}), hn = () => {\n\tlet { rootProps: e, defaults: { multiCalendars: t } } = $();\n\treturn {\n\t\thideNavigationButtons: r(() => (t) => e.hideNavigation?.includes(t)),\n\t\tshowLeftIcon: r(() => (e) => t.value.count ? t.value.solo ? !0 : e === 0 : !0),\n\t\tshowRightIcon: r(() => (e) => t.value.count ? t.value.solo ? !0 : e === t.value.count - 1 : !0)\n\t};\n}, gn = [\"role\", \"tabindex\"], _n = {\n\tref: \"header\",\n\tclass: \"dp--selection-grid-header\"\n}, vn = [\"aria-label\"], yn = [\n\t\"aria-label\",\n\t\"aria-selected\",\n\t\"aria-disabled\",\n\t\"data-dp-action-element\",\n\t\"data-dp-element-active\",\n\t\"data-test-id\",\n\t\"onClick\",\n\t\"onKeydown\",\n\t\"onMouseover\"\n], bn = [\"aria-label\", \"data-dp-action-element\"], xn = /* @__PURE__ */ d({\n\t__name: \"SelectionOverlay\",\n\tprops: {\n\t\titems: {},\n\t\ttype: {},\n\t\tuseRelative: { type: Boolean },\n\t\theight: {},\n\t\toverlayLabel: {},\n\t\tisLast: { type: Boolean },\n\t\tlevel: {}\n\t},\n\temits: [\n\t\t\"selected\",\n\t\t\"toggle\",\n\t\t\"hover-value\"\n\t],\n\tsetup(t, { emit: n }) {\n\t\tlet i = n, c = t, { setState: u, defaults: { ariaLabels: d, config: f } } = $(), { hideNavigationButtons: p } = hn(), { handleEventPropagation: m, checkKeyDown: h } = Wt(), g = I(\"toggle-button\"), y = I(\"header\"), T = I(\"overlay-container\"), E = I(\"grid-wrap\"), D = U(), j = O(!1), N = O(null), ee = O(), F = O(0);\n\t\tx(() => {\n\t\t\tN.value = null;\n\t\t}), S(async () => {\n\t\t\tawait _(), ie(), u(\"arrowNavigationLevel\", c.level ?? 1);\n\t\t}), C(() => {\n\t\t\tu(\"arrowNavigationLevel\", (c.level ?? 1) - 1);\n\t\t});\n\t\tlet R = r(() => ({\n\t\t\t\"dp--overlay\": !0,\n\t\t\t\"dp--overlay-absolute\": !c.useRelative,\n\t\t\t\"dp--overlay-relative\": c.useRelative\n\t\t})), B = r(() => c.useRelative ? {\n\t\t\theight: `${c.height}px`,\n\t\t\twidth: \"var(--dp-menu-min-width)\"\n\t\t} : void 0), ne = r(() => ({ \"dp--overlay-col\": !0 })), H = r(() => ({\n\t\t\t\"dp--btn-base dp--bg-none\": !0,\n\t\t\t\"dp--button\": !0,\n\t\t\t\"dp--overlay-action\": !0,\n\t\t\t\"dp--over-action-scroll\": j.value,\n\t\t\t\"dp--button-bottom\": c.isLast\n\t\t})), W = r(() => ({\n\t\t\t\"dp--overlay-container\": !0,\n\t\t\t\"dp--container-flex\": c.items?.length <= 6,\n\t\t\t\"dp--container-block\": c.items?.length > 6\n\t\t}));\n\t\tL(() => c.items, () => ie(!1), { deep: !0 });\n\t\tlet ie = (e = !0) => {\n\t\t\t_().then(() => {\n\t\t\t\tlet t = re(E), n = re(g), r = re(T), i = re(y), a = n ? n.getBoundingClientRect().height : 0;\n\t\t\t\tt && (t.getBoundingClientRect().height ? F.value = t.getBoundingClientRect().height - a - (i?.getBoundingClientRect().height ?? 0) : F.value = f.value.modeHeight - a - (i?.getBoundingClientRect().height ?? 0));\n\t\t\t\tlet o = D.value?.find((e) => {\n\t\t\t\t\tlet { dpElementActive: t } = e.dataset;\n\t\t\t\t\treturn t === `${c.level ?? 1}`;\n\t\t\t\t});\n\t\t\t\to && r && e && (r.scrollTop = o.offsetTop - r.offsetTop - (F.value / 2 - o.getBoundingClientRect().height) - a);\n\t\t\t});\n\t\t}, ae = (e) => {\n\t\t\te.disabled || i(\"selected\", e.value);\n\t\t}, oe = () => {\n\t\t\ti(\"toggle\");\n\t\t}, G = (e) => {\n\t\t\tf.value.escClose && (oe(), m(e, f.value));\n\t\t}, K = (e) => {\n\t\t\tee.value = e, i(\"hover-value\", e);\n\t\t}, q = (e) => {\n\t\t\tif (e.key === Q.esc) return G(e);\n\t\t}, J = (e) => {\n\t\t\tif (e.key === Q.enter) return oe();\n\t\t};\n\t\treturn (n, r) => (w(), o(\"div\", {\n\t\t\tref: \"grid-wrap\",\n\t\t\tclass: v(R.value),\n\t\t\tstyle: b(B.value),\n\t\t\trole: t.useRelative ? void 0 : \"presentation\",\n\t\t\ttabindex: t.useRelative ? void 0 : \"0\",\n\t\t\tonKeydown: q,\n\t\t\tonClick: r[0] ||= V(() => {}, [\"prevent\"])\n\t\t}, [\n\t\t\ts(\"div\", _n, [A(n.$slots, \"header\")], 512),\n\t\t\ts(\"div\", {\n\t\t\t\tref: \"overlay-container\",\n\t\t\t\t\"aria-label\": t.overlayLabel,\n\t\t\t\tclass: v(W.value),\n\t\t\t\tstyle: b({ \"--dp-overlay-height\": `${F.value}px` }),\n\t\t\t\trole: \"listbox\"\n\t\t\t}, [A(n.$slots, \"overlay\", {}, () => [(w(!0), o(e, null, k(t.items, (r, i) => (w(), o(\"div\", {\n\t\t\t\tkey: i,\n\t\t\t\tclass: v([\"dp--overlay-row\", { \"dp--flex-row\": t.items.length >= 3 }]),\n\t\t\t\trole: \"presentation\"\n\t\t\t}, [(w(!0), o(e, null, k(r, (e) => (w(), o(\"div\", {\n\t\t\t\tkey: e.value,\n\t\t\t\tref_for: !0,\n\t\t\t\tref_key: \"colRefs\",\n\t\t\t\tref: D,\n\t\t\t\trole: \"option\",\n\t\t\t\tclass: v(ne.value),\n\t\t\t\t\"aria-label\": e.ariaLabel ?? e.text,\n\t\t\t\t\"aria-selected\": e.active || void 0,\n\t\t\t\t\"aria-disabled\": e.disabled || void 0,\n\t\t\t\t\"data-dp-action-element\": t.level ?? 1,\n\t\t\t\t\"data-dp-element-active\": e.active ? t.level ?? 1 : void 0,\n\t\t\t\ttabindex: \"0\",\n\t\t\t\t\"data-test-id\": e.text,\n\t\t\t\tonClick: V((t) => ae(e), [\"prevent\"]),\n\t\t\t\tonKeydown: (t) => P(h)(t, () => ae(e), !0),\n\t\t\t\tonMouseover: (t) => K(e.value)\n\t\t\t}, [s(\"div\", { class: v(e.className) }, [A(n.$slots, \"item\", { item: e }, () => [l(M(e.text), 1)])], 2)], 42, yn))), 128))], 2))), 128))])], 14, vn),\n\t\t\tn.$slots[\"button-icon\"] ? z((w(), o(\"button\", {\n\t\t\t\tkey: 0,\n\t\t\t\tref: \"toggle-button\",\n\t\t\t\ttype: \"button\",\n\t\t\t\t\"aria-label\": P(d)?.toggleOverlay,\n\t\t\t\tclass: v(H.value),\n\t\t\t\ttabindex: \"0\",\n\t\t\t\t\"data-dp-action-element\": t.level ?? 1,\n\t\t\t\tonClick: oe,\n\t\t\t\tonKeydown: J\n\t\t\t}, [A(n.$slots, \"button-icon\")], 42, bn)), [[te, !P(p)(t.type)]]) : a(\"\", !0)\n\t\t], 46, gn));\n\t}\n}), Sn = [\"data-dp-mobile\"], Cn = /* @__PURE__ */ d({\n\t__name: \"InstanceWrap\",\n\tprops: {\n\t\tstretch: { type: Boolean },\n\t\tcollapse: { type: Boolean }\n\t},\n\tsetup(e) {\n\t\tlet { defaults: { multiCalendars: t } } = $(), { isMobile: n } = Kt(), i = r(() => t.value.count > 0 ? [...Array.from({ length: t.value.count }).keys()] : [0]);\n\t\treturn (r, a) => (w(), o(\"div\", {\n\t\t\tclass: v({\n\t\t\t\t\"dp--menu-inner\": !e.stretch,\n\t\t\t\t\"dp--menu--inner-stretched\": e.stretch,\n\t\t\t\t\"dp--flex-display\": P(t).count > 0,\n\t\t\t\t\"dp--flex-display-collapsed\": e.collapse\n\t\t\t}),\n\t\t\t\"data-dp-mobile\": P(n)\n\t\t}, [A(r.$slots, \"default\", {\n\t\t\tinstances: i.value,\n\t\t\twrapClass: { \"dp--instance-calendar\": P(t).count > 0 }\n\t\t})], 10, Sn));\n\t}\n}), wn = [\n\t\"data-dp-element\",\n\t\"tabindex\",\n\t\"inert\",\n\t\"aria-hidden\",\n\t\"disabled\",\n\t\"aria-label\",\n\t\"aria-disabled\"\n], Tn = /* @__PURE__ */ d({\n\t__name: \"ArrowBtn\",\n\tprops: {\n\t\tariaLabel: {},\n\t\telName: {},\n\t\tdisabled: { type: Boolean },\n\t\tinactive: { type: Boolean }\n\t},\n\temits: [\"activate\", \"set-ref\"],\n\tsetup(e, { emit: t }) {\n\t\tlet { boolHtmlAttribute: n } = Xt(), { checkKeyDown: r } = Wt(), i = t;\n\t\treturn (t, a) => (w(), o(\"button\", {\n\t\t\tref: \"arrow-btn\",\n\t\t\ttype: \"button\",\n\t\t\t\"data-dp-element\": e.elName,\n\t\t\t\"data-dp-action-element\": \"0\",\n\t\t\tclass: \"dp--btn-base dp--bg-none dp--arrow-btn-nav\",\n\t\t\ttabindex: e.inactive ? -1 : 0,\n\t\t\tinert: e.inactive || void 0,\n\t\t\t\"aria-hidden\": e.inactive || void 0,\n\t\t\tdisabled: P(n)(e.disabled),\n\t\t\t\"aria-label\": e.ariaLabel,\n\t\t\t\"aria-disabled\": P(n)(e.disabled),\n\t\t\tonClick: a[0] ||= (e) => i(\"activate\"),\n\t\t\tonKeydown: a[1] ||= (e) => P(r)(e, () => i(\"activate\"), !0)\n\t\t}, [s(\"span\", { class: v([\"dp--inner-nav\", { \"dp--inner-nav-disabled\": e.disabled }]) }, [A(t.$slots, \"default\")], 2)], 40, wn));\n\t}\n}), En = [\n\t\"aria-label\",\n\t\"data-test-id\",\n\t\"aria-expanded\"\n], Dn = /* @__PURE__ */ d({\n\t__name: \"YearModePicker\",\n\tprops: {\n\t\titems: {},\n\t\tinstance: {},\n\t\tyear: {},\n\t\tshowYearPicker: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: !1\n\t\t},\n\t\tisDisabled: {}\n\t},\n\temits: [\n\t\t\"handle-year\",\n\t\t\"year-select\",\n\t\t\"toggle-year-picker\"\n\t],\n\tsetup(t, { emit: d }) {\n\t\tlet f = d, p = t, { showRightIcon: m, showLeftIcon: h } = hn(), { rootProps: g, defaults: { config: _, ariaLabels: y, ui: b } } = $(), { showTransition: x, transitionName: S } = pt(), { formatYear: C } = qt(), { boolHtmlAttribute: T } = Xt(), E = O(!1), D = r(() => C(p.year)), k = (e) => {\n\t\t\tE.value = !E.value, f(\"toggle-year-picker\", { show: e });\n\t\t}, j = (e) => {\n\t\t\tE.value = !1, f(\"year-select\", e);\n\t\t}, N = (e = !1) => {\n\t\t\tf(\"handle-year\", e);\n\t\t};\n\t\treturn (r, d) => (w(), o(e, null, [s(\"div\", { class: v([\"dp--year-mode-picker\", { \"dp--hidden-el\": E.value }]) }, [\n\t\t\tP(h)(t.instance) ? (w(), i(Tn, {\n\t\t\t\tkey: 0,\n\t\t\t\tref: \"mpPrevIconRef\",\n\t\t\t\t\"aria-label\": P(y)?.prevYear,\n\t\t\t\tdisabled: P(T)(t.isDisabled(!1)),\n\t\t\t\tclass: v(P(b)?.navBtnPrev),\n\t\t\t\tonActivate: d[0] ||= (e) => N(!1)\n\t\t\t}, {\n\t\t\t\tdefault: R(() => [r.$slots[\"arrow-left\"] ? A(r.$slots, \"arrow-left\", { key: 0 }) : a(\"\", !0), r.$slots[\"arrow-left\"] ? a(\"\", !0) : (w(), i(P(Je), { key: 1 }))]),\n\t\t\t\t_: 3\n\t\t\t}, 8, [\n\t\t\t\t\"aria-label\",\n\t\t\t\t\"disabled\",\n\t\t\t\t\"class\"\n\t\t\t])) : a(\"\", !0),\n\t\t\ts(\"button\", {\n\t\t\t\tref: \"mpYearButtonRef\",\n\t\t\t\tclass: \"dp--btn-base dp--bg-none dp--month-year-select-base dp--year-select\",\n\t\t\t\ttype: \"button\",\n\t\t\t\t\"aria-label\": `${t.year}-${P(y)?.openYearsOverlay}`,\n\t\t\t\t\"data-test-id\": `year-mode-btn-${t.instance}`,\n\t\t\t\t\"aria-haspopup\": \"dialog\",\n\t\t\t\t\"aria-expanded\": t.showYearPicker,\n\t\t\t\t\"data-dp-action-element\": \"0\",\n\t\t\t\tonClick: d[1] ||= () => k(),\n\t\t\t\tonKeydown: d[2] ||= B(V(() => k(), [\"prevent\"]), [\"enter\"])\n\t\t\t}, [r.$slots.year ? A(r.$slots, \"year\", {\n\t\t\t\tkey: 0,\n\t\t\t\ttext: D.value,\n\t\t\t\tvalue: t.year\n\t\t\t}) : a(\"\", !0), r.$slots.year ? a(\"\", !0) : (w(), o(e, { key: 1 }, [l(M(t.year), 1)], 64))], 40, En),\n\t\t\tP(m)(t.instance) ? (w(), i(Tn, {\n\t\t\t\tkey: 1,\n\t\t\t\tref: \"mpNextIconRef\",\n\t\t\t\t\"aria-label\": P(y)?.nextYear,\n\t\t\t\tdisabled: P(T)(t.isDisabled(!0)),\n\t\t\t\tclass: v(P(b)?.navBtnNext),\n\t\t\t\tonActivate: d[3] ||= (e) => N(!0)\n\t\t\t}, {\n\t\t\t\tdefault: R(() => [r.$slots[\"arrow-right\"] ? A(r.$slots, \"arrow-right\", { key: 0 }) : a(\"\", !0), r.$slots[\"arrow-right\"] ? a(\"\", !0) : (w(), i(P(Ye), { key: 1 }))]),\n\t\t\t\t_: 3\n\t\t\t}, 8, [\n\t\t\t\t\"aria-label\",\n\t\t\t\t\"disabled\",\n\t\t\t\t\"class\"\n\t\t\t])) : a(\"\", !0)\n\t\t], 2), u(n, {\n\t\t\tname: P(S)(t.showYearPicker),\n\t\t\tcss: P(x)\n\t\t}, {\n\t\t\tdefault: R(() => [t.showYearPicker ? (w(), i(xn, {\n\t\t\t\tkey: 0,\n\t\t\t\titems: t.items,\n\t\t\t\t\"is-last\": P(g).autoApply && !P(_).keepActionRow,\n\t\t\t\t\"overlay-label\": P(y)?.yearPicker?.(!0),\n\t\t\t\ttype: \"year\",\n\t\t\t\tonToggle: k,\n\t\t\t\tonSelected: d[4] ||= (e) => j(e)\n\t\t\t}, c({\n\t\t\t\t\"button-icon\": R(() => [r.$slots[\"calendar-icon\"] ? A(r.$slots, \"calendar-icon\", { key: 0 }) : a(\"\", !0), r.$slots[\"calendar-icon\"] ? a(\"\", !0) : (w(), i(P(Ke), { key: 1 }))]),\n\t\t\t\t_: 2\n\t\t\t}, [r.$slots[\"year-overlay-value\"] ? {\n\t\t\t\tname: \"item\",\n\t\t\t\tfn: R(({ item: e }) => [A(r.$slots, \"year-overlay-value\", {\n\t\t\t\t\ttext: e.text,\n\t\t\t\t\tvalue: e.value\n\t\t\t\t})]),\n\t\t\t\tkey: \"0\"\n\t\t\t} : void 0]), 1032, [\n\t\t\t\t\"items\",\n\t\t\t\t\"is-last\",\n\t\t\t\t\"overlay-label\"\n\t\t\t])) : a(\"\", !0)]),\n\t\t\t_: 3\n\t\t}, 8, [\"name\", \"css\"])], 64));\n\t}\n}), On = () => {\n\tlet { getDate: e, rootEmit: t, state: n, month: i, year: a, modelValue: o, calendars: s, rootProps: c, defaults: { multiCalendars: l, range: u, safeDates: d, filters: f, highlight: p } } = $(), { resetDate: m, getYearFromDate: h, checkHighlightYear: g, groupListAndMap: _ } = Gt(), { getYears: v } = Jt(), { validateMonthYear: y, checkMinMaxValue: b } = ht(), x = O([!1]), C = r(() => v()), w = r(() => (t, n) => {\n\t\tlet r = Z(m(e()), {\n\t\t\tmonth: i.value(t),\n\t\t\tyear: a.value(t)\n\t\t});\n\t\treturn y(n ? he(r) : ze(r), c.preventMinMaxNavigation, n);\n\t}), T = () => Array.isArray(o.value) && l.value.solo && o.value[1], E = () => {\n\t\tfor (let t = 0; t < l.value.count; t++) if (t === 0) s.value[t] = s.value[0];\n\t\telse if (t === l.value.count - 1 && T()) s.value[t] = {\n\t\t\tmonth: Y(o.value[1]),\n\t\t\tyear: X(o.value[1])\n\t\t};\n\t\telse {\n\t\t\tlet n = Z(e(), s.value[t - 1]);\n\t\t\ts.value[t] = {\n\t\t\t\tmonth: Y(n),\n\t\t\t\tyear: X(ce(n, 1))\n\t\t\t};\n\t\t}\n\t}, D = (t) => {\n\t\tif (!t) return E();\n\t\tlet n = Z(e(), s.value[t]);\n\t\treturn s.value[0].year = X(Ue(n, l.value.count - 1)), E();\n\t}, k = (e, t) => {\n\t\tlet n = ue(t, e);\n\t\treturn u.value.showLastInRange && n > 1 ? t : e;\n\t}, A = (e) => c.focusStartDate || l.value.solo ? e[0] : e[1] ? k(e[0], e[1]) : e[0], j = () => {\n\t\tif (o.value) {\n\t\t\tlet e = Array.isArray(o.value) ? A(o.value) : o.value;\n\t\t\ts.value[0] = {\n\t\t\t\tmonth: Y(e),\n\t\t\t\tyear: X(e)\n\t\t\t};\n\t\t}\n\t}, M = () => {\n\t\tj(), l.value.count && E();\n\t};\n\tL(o, (e, t) => {\n\t\tn.isTextInputDate && JSON.stringify(e ?? {}) !== JSON.stringify(t ?? {}) && M();\n\t}), S(() => {\n\t\tM();\n\t});\n\tlet N = (e, n) => {\n\t\ts.value[n].year = e, t(\"update-month-year\", {\n\t\t\tinstance: n,\n\t\t\tyear: e,\n\t\t\tmonth: s.value[n].month\n\t\t}), l.value.count && !l.value.solo && D(n);\n\t}, ee = r(() => (e) => _(C.value, (t) => ({\n\t\tactive: a.value(e) === t.value,\n\t\tdisabled: b(t.value, h(d.value.minDate), h(d.value.maxDate)) || f.value.years?.includes(t.value),\n\t\thighlighted: g(p.value, t.value)\n\t}))), P = (e, t) => {\n\t\tN(e, t), I(t);\n\t}, F = (e, t = !1) => {\n\t\tw.value(e, t) || N(t ? a.value(e) + 1 : a.value(e) - 1, e);\n\t}, I = (e, n) => {\n\t\tn === void 0 ? x.value[e] = !x.value[e] : x.value[e] = n, x.value[e] ? t(\"overlay-toggle\", {\n\t\t\topen: !0,\n\t\t\toverlay: rt.year\n\t\t}) : t(\"overlay-toggle\", {\n\t\t\topen: !1,\n\t\t\toverlay: rt.year\n\t\t});\n\t};\n\treturn {\n\t\tisDisabled: w,\n\t\tgroupedYears: ee,\n\t\tshowYearPicker: x,\n\t\tselectYear: N,\n\t\tsetStartDate: () => {\n\t\t\tc.startDate && (o.value && c.focusStartDate || !o.value) && N(X(e(c.startDate)), 0);\n\t\t},\n\t\ttoggleYearPicker: I,\n\t\thandleYearSelect: P,\n\t\thandleYear: F\n\t};\n}, kn = () => {\n\tlet { isDateAfter: e, isDateBefore: t, isDateEqual: n } = Gt(), { getDate: r, rootEmit: i, rootProps: a, modelValue: o, defaults: { range: s } } = $();\n\treturn {\n\t\tgetRangeWithFixedDate: (r) => Array.isArray(o.value) && (o.value.length === 2 || o.value.length === 1 && s.value.partialRange) ? s.value.fixedStart && (e(r, o.value[0]) || n(r, o.value[0])) ? [o.value[0], r] : s.value.fixedEnd && (t(r, o.value[1]) || n(r, o.value[1])) ? [r, o.value[1]] : (i(\"invalid-fixed-range\", r), o.value) : [],\n\t\tsetPresetDate: (e) => {\n\t\t\tArray.isArray(e.value) && e.value.length <= 2 && s.value.enabled ? o.value = e.value.map((e) => r(e)) : Array.isArray(e.value) || (o.value = r(e.value));\n\t\t},\n\t\tcheckRangeAutoApply: (e, t, n) => {\n\t\t\ts && (e[0] && e[1] && a.autoApply && t(\"auto-apply\", n), e[0] && !e[1] && (a.modelAuto || s.value.partialRange) && a.autoApply && t(\"auto-apply\", n));\n\t\t},\n\t\tsetMonthOrYearRange: (e) => {\n\t\t\tlet n = o.value ? o.value.slice() : [];\n\t\t\treturn n.length === 2 && n[1] !== null && (n = []), n.length ? (t(e, n[0]) ? n.unshift(e) : n[1] = e, i(\"range-end\", e)) : (n = [e], i(\"range-start\", e)), n;\n\t\t},\n\t\thandleMultiDatesSelect: (e, t) => {\n\t\t\tif (o.value && Array.isArray(o.value)) if (o.value.some((t) => n(e, t))) {\n\t\t\t\tlet t = o.value.filter((t) => !n(t, e));\n\t\t\t\to.value = t.length ? t : null;\n\t\t\t} else (t && +t > o.value.length || !t) && o.value.push(e);\n\t\t\telse o.value = [e];\n\t\t}\n\t};\n}, An = (e) => {\n\tlet { getDate: t, rootEmit: n, state: i, calendars: a, year: o, modelValue: s, rootProps: c, defaults: { range: l, highlight: u, safeDates: d, filters: f, multiDates: p } } = $();\n\tmt(() => {\n\t\ti.isTextInputDate && z(X(t(c.startDate)), 0);\n\t});\n\tlet { checkMinMaxRange: m, checkMinMaxValue: h } = ht(), { isDateBetween: g, resetDateTime: v, resetDate: y, getMinMonth: b, getMaxMonth: x, checkHighlightMonth: C, groupListAndMap: w } = Gt(), { checkRangeAutoApply: T, getRangeWithFixedDate: E, handleMultiDatesSelect: D, setMonthOrYearRange: k, setPresetDate: A } = kn(), { padZero: j } = Wt(), { getMonths: M, isOutOfYearRange: N } = Jt(), { updateFlowStep: ee, childMount: P } = ut(), F = r(() => M()), I = O(null), { groupedYears: te, showYearPicker: L, isDisabled: R, selectYear: z, toggleYearPicker: B, handleYearSelect: V, handleYear: ne, setStartDate: re } = On();\n\tS(() => {\n\t\tP(), re();\n\t});\n\tlet H = (e) => e ? {\n\t\tmonth: Y(e),\n\t\tyear: X(e)\n\t} : {\n\t\tmonth: null,\n\t\tyear: null\n\t}, U = () => s.value ? Array.isArray(s.value) ? s.value.map((e) => H(e)) : H(s.value) : H(), W = (e, t) => {\n\t\tlet n = a.value[e], r = U();\n\t\treturn Array.isArray(r) ? r.some((e) => e.year === n?.year && e.month === t) : n?.year === r.year && t === r.month;\n\t}, ie = (e, t, n) => {\n\t\tlet r = U();\n\t\treturn Array.isArray(r) ? o.value(t) === r[n]?.year && e === r[n]?.month : !1;\n\t}, ae = (e, n) => {\n\t\tif (l.value.enabled) {\n\t\t\tlet r = U();\n\t\t\tif (Array.isArray(s.value) && Array.isArray(r)) {\n\t\t\t\tlet r = ie(e, n, 0) || ie(e, n, 1), i = Z(y(t()), {\n\t\t\t\t\tmonth: e,\n\t\t\t\t\tyear: o.value(n)\n\t\t\t\t});\n\t\t\t\treturn g(s.value, I.value, i) && !r;\n\t\t\t}\n\t\t\treturn !1;\n\t\t}\n\t\treturn !1;\n\t}, oe = r(() => (e) => w(F.value, (t) => {\n\t\tlet n = W(e, t.value), r = ge(G(t.value, e), \"MMMM\", { locale: c.locale });\n\t\treturn {\n\t\t\tactive: n,\n\t\t\tdisabled: h(t.value, b(o.value(e), d.value.minDate), x(o.value(e), d.value.maxDate)) || fe(d.value.disabledDates, o.value(e), t.value) || f.value.months?.includes(t.value) || !pe(d.value.allowedDates, o.value(e), t.value) || N(o.value(e)),\n\t\t\tisBetween: ae(t.value, e),\n\t\t\thighlighted: C(u.value, t.value, o.value(e)),\n\t\t\tariaLabel: r\n\t\t};\n\t})), G = (e, n) => Z(y(t()), {\n\t\tmonth: e,\n\t\tyear: o.value(n)\n\t}), K = (n, r) => {\n\t\ts.value = Z(s.value ? s.value : y(t()), {\n\t\t\tmonth: n,\n\t\t\tyear: o.value(r)\n\t\t}), e(\"auto-apply\"), ee(\"month\");\n\t}, q = (t, n) => {\n\t\tlet r = G(t, n);\n\t\tl.value.fixedEnd || l.value.fixedStart ? s.value = E(r) : s.value ? m(r, s.value) && (s.value = k(G(t, n))) : s.value = [G(t, n)], _().then(() => {\n\t\t\tT(s.value, e, s.value.length < 2);\n\t\t});\n\t}, J = (t, n) => {\n\t\tD(G(t, n), p.value.limit), e(\"auto-apply\", !0);\n\t}, se = (e, t) => (a.value[t].month = e, le(t, a.value[t].year, e), p.value.enabled ? J(e, t) : l.value.enabled ? q(e, t) : K(e, t)), ce = (e, t) => {\n\t\tz(e, t), le(t, e, null);\n\t}, le = (e, t, r) => {\n\t\tlet i = r;\n\t\tif (!i && i !== 0) {\n\t\t\tlet t = U();\n\t\t\ti = Array.isArray(t) ? t[e].month : t.month;\n\t\t}\n\t\tn(\"update-month-year\", {\n\t\t\tinstance: e,\n\t\t\tyear: t,\n\t\t\tmonth: i\n\t\t});\n\t}, ue = (e, t) => {\n\t\tI.value = G(e, t);\n\t}, de = (t) => {\n\t\tA({ value: t }), e(\"auto-apply\");\n\t}, fe = (e, n, r) => {\n\t\tif (e instanceof Map) {\n\t\t\tlet t = `${j(r + 1)}-${n}`;\n\t\t\treturn e.size ? e.has(t) : !1;\n\t\t}\n\t\treturn typeof e == \"function\" ? e(v(Z(t(), {\n\t\t\tmonth: r,\n\t\t\tyear: n\n\t\t}), !0)) : !1;\n\t}, pe = (e, t, n) => {\n\t\tif (e instanceof Map) {\n\t\t\tlet r = `${j(n + 1)}-${t}`;\n\t\t\treturn e.size ? e.has(r) : !0;\n\t\t}\n\t\treturn !0;\n\t};\n\treturn {\n\t\tgroupedMonths: oe,\n\t\tgroupedYears: te,\n\t\tyear: o,\n\t\tisDisabled: R,\n\t\tshowYearPicker: L,\n\t\tmodelValue: s,\n\t\ttoggleYearPicker: B,\n\t\thandleYearSelect: V,\n\t\thandleYear: ne,\n\t\tpresetDate: de,\n\t\tsetHoverDate: ue,\n\t\tselectMonth: se,\n\t\tselectYear: ce,\n\t\tgetModelMonthYear: U\n\t};\n}, jn = /* @__PURE__ */ d({\n\t__name: \"MonthPicker\",\n\tprops: {\n\t\tcollapse: { type: Boolean },\n\t\tmenuWrapRef: {},\n\t\tnoOverlayFocus: { type: Boolean }\n\t},\n\temits: [\"auto-apply\"],\n\tsetup(t, { expose: n, emit: r }) {\n\t\tlet s = r, l = F(), { rootProps: d, defaults: { config: f } } = $(), p = tn(l, Qt.YearMode), { groupedMonths: m, groupedYears: h, year: _, isDisabled: y, showYearPicker: b, modelValue: x, presetDate: S, setHoverDate: C, selectMonth: T, selectYear: E, toggleYearPicker: D, handleYearSelect: O, handleYear: j, getModelMonthYear: M } = An(s);\n\t\treturn n({\n\t\t\tgetSidebarProps: () => ({\n\t\t\t\tmodelValue: x,\n\t\t\t\tyear: _,\n\t\t\t\tgetModelMonthYear: M,\n\t\t\t\tselectMonth: T,\n\t\t\t\tselectYear: E,\n\t\t\t\thandleYear: j\n\t\t\t}),\n\t\t\tpresetDate: S,\n\t\t\ttoggleYearPicker: (e) => D(0, e)\n\t\t}), (n, r) => (w(), i(Cn, {\n\t\t\tcollapse: t.collapse,\n\t\t\tstretch: \"\"\n\t\t}, {\n\t\t\tdefault: R(({ instances: r, wrapClass: i }) => [(w(!0), o(e, null, k(r, (e) => (w(), o(\"div\", {\n\t\t\t\tkey: e,\n\t\t\t\tclass: v(i)\n\t\t\t}, [n.$slots[\"top-extra\"] ? A(n.$slots, \"top-extra\", {\n\t\t\t\tkey: 0,\n\t\t\t\tvalue: P(x)\n\t\t\t}) : a(\"\", !0), A(n.$slots, \"month-year\", g({ ref_for: !0 }, {\n\t\t\t\tmode: \"month\",\n\t\t\t\tyear: P(_),\n\t\t\t\tmonths: P(m)(e),\n\t\t\t\tyears: P(h)(e),\n\t\t\t\tselectMonth: P(T),\n\t\t\t\tselectYear: P(E),\n\t\t\t\tinstance: e\n\t\t\t}), () => [u(xn, {\n\t\t\t\titems: P(m)(e),\n\t\t\t\t\"is-last\": P(d).autoApply && !P(f).keepActionRow,\n\t\t\t\theight: P(f).modeHeight,\n\t\t\t\t\"no-overlay-focus\": !!(t.noOverlayFocus || P(d).textInput),\n\t\t\t\t\"use-relative\": \"\",\n\t\t\t\tlevel: 0,\n\t\t\t\ttype: \"month\",\n\t\t\t\tonSelected: (t) => P(T)(t, e),\n\t\t\t\tonHoverValue: (t) => P(C)(t, e)\n\t\t\t}, c({\n\t\t\t\theader: R(() => [u(Dn, {\n\t\t\t\t\titems: P(h)(e),\n\t\t\t\t\tinstance: e,\n\t\t\t\t\t\"show-year-picker\": P(b)[e],\n\t\t\t\t\tyear: P(_)(e),\n\t\t\t\t\t\"is-disabled\": (t) => P(y)(e, t),\n\t\t\t\t\tonHandleYear: (t) => P(j)(e, t),\n\t\t\t\t\tonYearSelect: (t) => P(O)(t, e),\n\t\t\t\t\tonToggleYearPicker: (t) => P(D)(e, t?.show)\n\t\t\t\t}, c({ _: 2 }, [k(P(p), (e) => ({\n\t\t\t\t\tname: e,\n\t\t\t\t\tfn: R((t) => [A(n.$slots, e, g({ ref_for: !0 }, t))])\n\t\t\t\t}))]), 1032, [\n\t\t\t\t\t\"items\",\n\t\t\t\t\t\"instance\",\n\t\t\t\t\t\"show-year-picker\",\n\t\t\t\t\t\"year\",\n\t\t\t\t\t\"is-disabled\",\n\t\t\t\t\t\"onHandleYear\",\n\t\t\t\t\t\"onYearSelect\",\n\t\t\t\t\t\"onToggleYearPicker\"\n\t\t\t\t])]),\n\t\t\t\t_: 2\n\t\t\t}, [n.$slots[\"month-overlay-value\"] ? {\n\t\t\t\tname: \"item\",\n\t\t\t\tfn: R(({ item: e }) => [A(n.$slots, \"month-overlay-value\", {\n\t\t\t\t\ttext: e.text,\n\t\t\t\t\tvalue: e.value\n\t\t\t\t})]),\n\t\t\t\tkey: \"0\"\n\t\t\t} : void 0]), 1032, [\n\t\t\t\t\"items\",\n\t\t\t\t\"is-last\",\n\t\t\t\t\"height\",\n\t\t\t\t\"no-overlay-focus\",\n\t\t\t\t\"onSelected\",\n\t\t\t\t\"onHoverValue\"\n\t\t\t])])], 2))), 128))]),\n\t\t\t_: 3\n\t\t}, 8, [\"collapse\"]));\n\t}\n}), Mn = (e) => {\n\tlet { rootEmit: t, getDate: n, state: i, modelValue: a, rootProps: o, defaults: { highlight: s, multiDates: c, filters: l, range: u, safeDates: d } } = $(), { getYears: f } = Jt(), { isDateBetween: p, resetDate: m, resetDateTime: h, getYearFromDate: g, checkHighlightYear: v, groupListAndMap: y } = Gt(), { checkRangeAutoApply: b, setMonthOrYearRange: x } = kn(), { checkMinMaxValue: C, checkMinMaxRange: w } = ht();\n\tmt(() => {\n\t\ti.isTextInputDate && (E.value = X(n(o.startDate)));\n\t});\n\tlet T = O(null), E = O();\n\tS(() => {\n\t\to.startDate && (a.value && o.focusStartDate || !a.value) && (E.value = X(n(o.startDate)));\n\t});\n\tlet D = (e) => Array.isArray(a.value) ? a.value.some((t) => X(t) === e) : a.value ? X(a.value) === e : !1, k = (e) => u.value.enabled && Array.isArray(a.value) ? p(a.value, T.value, N(e)) : !1, A = (e) => d.value.allowedDates?.size ? d.value.allowedDates.has(`${e}`) : !0, j = (e) => d.value.disabledDates instanceof Map ? d.value.disabledDates.size ? d.value.disabledDates.has(`${e}`) : !1 : typeof d.value.disabledDates == \"function\" ? d.value.disabledDates(Fe(h(ze(n())), e)) : !0, M = r(() => y(f(), (e) => {\n\t\tlet t = D(e.value);\n\t\treturn {\n\t\t\tactive: t,\n\t\t\tdisabled: C(e.value, g(d.value.minDate), g(d.value.maxDate)) || l.value.years.includes(e.value) || !A(e.value) || j(e.value),\n\t\t\tisBetween: k(e.value) && !t,\n\t\t\thighlighted: v(s.value, e.value)\n\t\t};\n\t})), N = (e) => Fe(m(ze(n())), e);\n\treturn {\n\t\tgroupedYears: M,\n\t\tfocusYear: E,\n\t\tsetHoverValue: (e) => {\n\t\t\tT.value = Fe(m(n()), e);\n\t\t},\n\t\tselectYear: (r) => {\n\t\t\tif (t(\"update-month-year\", {\n\t\t\t\tinstance: 0,\n\t\t\t\tyear: r,\n\t\t\t\tmonth: NaN\n\t\t\t}), c.value.enabled) return a.value ? Array.isArray(a.value) && ((a.value?.map((e) => X(e))).includes(r) ? a.value = a.value.filter((e) => X(e) !== r) : a.value.push(Fe(h(n()), r))) : a.value = [Fe(h(ze(n())), r)], e(\"auto-apply\", !0);\n\t\t\tu.value.enabled ? w(N(r), a.value) && (a.value = x(N(r)), _().then(() => {\n\t\t\t\tb(a.value, e, a.value.length < 2);\n\t\t\t})) : (a.value = N(r), e(\"auto-apply\"));\n\t\t}\n\t};\n}, Nn = /* @__PURE__ */ d({\n\t__name: \"YearPicker\",\n\tprops: {\n\t\tcollapse: { type: Boolean },\n\t\tmenuWrapRef: {},\n\t\tnoOverlayFocus: { type: Boolean }\n\t},\n\temits: [\"auto-apply\"],\n\tsetup(e, { expose: t, emit: n }) {\n\t\tlet r = n, { modelValue: s, defaults: { config: l }, rootProps: u } = $(), { groupedYears: d, focusYear: f, selectYear: p, setHoverValue: m } = Mn(r);\n\t\treturn t({ getSidebarProps: () => ({\n\t\t\tmodelValue: s,\n\t\t\tselectYear: p\n\t\t}) }), (t, n) => (w(), o(\"div\", null, [t.$slots[\"top-extra\"] ? A(t.$slots, \"top-extra\", {\n\t\t\tkey: 0,\n\t\t\tvalue: P(s)\n\t\t}) : a(\"\", !0), t.$slots[\"month-year\"] ? A(t.$slots, \"month-year\", y(g({ key: 1 }, {\n\t\t\tmode: \"year\",\n\t\t\tyears: P(d),\n\t\t\tselectYear: P(p)\n\t\t}))) : (w(), i(xn, {\n\t\t\tkey: 2,\n\t\t\titems: P(d),\n\t\t\t\"is-last\": P(u).autoApply && !P(l).keepActionRow,\n\t\t\theight: P(l).modeHeight,\n\t\t\t\"no-overlay-focus\": !!(e.noOverlayFocus || P(u).textInput),\n\t\t\t\"focus-value\": P(f),\n\t\t\ttype: \"year\",\n\t\t\t\"use-relative\": \"\",\n\t\t\tonSelected: P(p),\n\t\t\tonHoverValue: P(m)\n\t\t}, c({ _: 2 }, [t.$slots[\"year-overlay-value\"] ? {\n\t\t\tname: \"item\",\n\t\t\tfn: R(({ item: e }) => [A(t.$slots, \"year-overlay-value\", {\n\t\t\t\ttext: e.text,\n\t\t\t\tvalue: e.value\n\t\t\t})]),\n\t\t\tkey: \"0\"\n\t\t} : void 0]), 1032, [\n\t\t\t\"items\",\n\t\t\t\"is-last\",\n\t\t\t\"height\",\n\t\t\t\"no-overlay-focus\",\n\t\t\t\"focus-value\",\n\t\t\t\"onSelected\",\n\t\t\t\"onHoverValue\"\n\t\t]))]));\n\t}\n}), Pn = {\n\tkey: 0,\n\tclass: \"dp--time-input\"\n}, Fn = [\"data-compact\", \"data-collapsed\"], In = [\n\t\"data-test-id\",\n\t\"aria-label\",\n\t\"disabled\",\n\t\"data-dp-action-element\",\n\t\"onKeydown\",\n\t\"onClick\",\n\t\"onMousedown\"\n], Ln = [\n\t\"aria-label\",\n\t\"aria-expanded\",\n\t\"disabled\",\n\t\"data-dp-action-element\",\n\t\"data-test-id\",\n\t\"onKeydown\",\n\t\"onClick\"\n], Rn = [\n\t\"data-test-id\",\n\t\"aria-label\",\n\t\"data-dp-action-element\",\n\t\"disabled\",\n\t\"onKeydown\",\n\t\"onClick\",\n\t\"onMousedown\"\n], zn = { key: 0 }, Bn = [\n\t\"aria-label\",\n\t\"disabled\",\n\t\"data-dp-action-element\",\n\t\"data-compact\"\n], Vn = /* @__PURE__ */ d({\n\t__name: \"TimeInput\",\n\tprops: {\n\t\thours: {},\n\t\tminutes: {},\n\t\tseconds: {},\n\t\torder: {},\n\t\tdisabled: { type: Boolean },\n\t\tcloseTimePickerBtn: {},\n\t\tdisabledTimesConfig: {},\n\t\tvalidateTime: {}\n\t},\n\temits: [\n\t\t\"update:hours\",\n\t\t\"update:minutes\",\n\t\t\"update:seconds\",\n\t\t\"overlay-opened\",\n\t\t\"overlay-closed\",\n\t\t\"set-hours\",\n\t\t\"set-minutes\",\n\t\t\"mounted\"\n\t],\n\tsetup(t, { expose: d, emit: f }) {\n\t\tlet p = f, m = t, { getDate: h, rootEmit: g, rootProps: _, defaults: { ariaLabels: y, filters: b, config: x, range: C, multiCalendars: T, timeConfig: D } } = $(), { checkKeyDown: N, hoursToAmPmHours: ee } = Wt(), { boolHtmlAttribute: F } = Xt(), { sanitizeTime: I, groupListAndMap: te } = Gt(), { transitionName: L, showTransition: z } = pt(), B = E({\n\t\t\thours: !1,\n\t\t\tminutes: !1,\n\t\t\tseconds: !1\n\t\t}), V = O(\"AM\"), ne = O(null), re = O(), H = O(!1);\n\t\tS(() => {\n\t\t\tp(\"mounted\");\n\t\t});\n\t\tlet U = (e) => Z(h(), {\n\t\t\thours: e.hours,\n\t\t\tminutes: e.minutes,\n\t\t\tseconds: D.value.enableSeconds ? e.seconds : 0,\n\t\t\tmilliseconds: 0\n\t\t}), W = r(() => _.timePicker || D.value.timePickerInline ? 0 : 1), ie = r(() => (e) => me(e, m[e]) || oe(e, m[e]) || m.disabled), ae = r(() => ({\n\t\t\thours: m.hours,\n\t\t\tminutes: m.minutes,\n\t\t\tseconds: m.seconds\n\t\t})), oe = (e, t) => C.value.enabled && !C.value.disableTimeRangeValidation ? !m.validateTime(e, t) : !1, G = (e, t) => {\n\t\t\tif (C.value.enabled && !C.value.disableTimeRangeValidation) {\n\t\t\t\tlet n = t ? +D.value[`${e}Increment`] : -+D.value[`${e}Increment`], r = m[e] + n;\n\t\t\t\treturn !m.validateTime(e, r);\n\t\t\t}\n\t\t\treturn !1;\n\t\t}, K = r(() => (e) => !Y(+m[e] + +D.value[`${e}Increment`], e) || G(e, !0) || m.disabled), J = r(() => (e) => !Y(m[e] - +D.value[`${e}Increment`], e) || G(e, !1) || m.disabled), se = (e, t) => q(Z(h(), e), t), ce = (e, t) => Be(Z(h(), e), t), le = r(() => ({\n\t\t\t\"dp--time-col\": !0,\n\t\t\t\"dp--time-col-block\": !D.value.timePickerInline,\n\t\t\t\"dp--time-col-reg-block\": !D.value.enableSeconds && D.value.is24 && !D.value.timePickerInline,\n\t\t\t\"dp--time-col-reg-inline\": !D.value.enableSeconds && D.value.is24 && D.value.timePickerInline,\n\t\t\t\"dp--time-col-reg-with-button\": !D.value.enableSeconds && !D.value.is24,\n\t\t\t\"dp--time-col-sec\": D.value.enableSeconds && D.value.is24,\n\t\t\t\"dp--time-col-sec-with-button\": D.value.enableSeconds && !D.value.is24\n\t\t})), ue = r(() => D.value.timePickerInline && C.value.enabled && !T.value.count), de = r(() => {\n\t\t\tlet e = [{ type: \"hours\" }];\n\t\t\treturn D.value.enableMinutes && e.push({\n\t\t\t\ttype: \"\",\n\t\t\t\tseparator: !0\n\t\t\t}, { type: \"minutes\" }), D.value.enableSeconds && e.push({\n\t\t\t\ttype: \"\",\n\t\t\t\tseparator: !0\n\t\t\t}, { type: \"seconds\" }), e;\n\t\t}), fe = r(() => de.value.filter((e) => !e.separator)), pe = r(() => (e) => {\n\t\t\tif (e === \"hours\") {\n\t\t\t\tlet e = ke(+m.hours);\n\t\t\t\treturn {\n\t\t\t\t\ttext: e < 10 ? `0${e}` : `${e}`,\n\t\t\t\t\tvalue: e\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn {\n\t\t\t\ttext: m[e] < 10 ? `0${m[e]}` : `${m[e]}`,\n\t\t\t\tvalue: m[e]\n\t\t\t};\n\t\t}), me = (e, t) => {\n\t\t\tif (!m.disabledTimesConfig) return !1;\n\t\t\tlet n = m.disabledTimesConfig(m.order, e === \"hours\" ? t : void 0);\n\t\t\treturn n[e] ? !!n[e]?.includes(t) : !0;\n\t\t}, he = (e, t) => t === \"hours\" ? V.value === \"AM\" ? e : e + 12 : e, ge = (e) => {\n\t\t\tlet t = D.value.is24 ? 24 : 12, n = e === \"hours\" ? t : 60, r = +D.value[`${e}GridIncrement`], i = e === \"hours\" && !D.value.is24 ? r : 0, a = [];\n\t\t\tfor (let t = i; t < n; t += r) a.push({\n\t\t\t\tvalue: D.value.is24 ? t : he(t, e),\n\t\t\t\ttext: t < 10 ? `0${t}` : `${t}`\n\t\t\t});\n\t\t\treturn e === \"hours\" && !D.value.is24 && a.unshift({\n\t\t\t\tvalue: V.value === \"PM\" ? 12 : 0,\n\t\t\t\ttext: \"12\"\n\t\t\t}), te(a, (t) => ({\n\t\t\t\tactive: !1,\n\t\t\t\tdisabled: b.value.times[e].includes(t.value) || !Y(t.value, e) || me(e, t.value) || oe(e, t.value)\n\t\t\t}));\n\t\t}, _e = (e) => e >= 0 ? e : 59, ye = (e) => e >= 0 ? e : 23, Y = (e, t) => {\n\t\t\tlet n = _.minTime ? U(I(_.minTime)) : null, r = _.maxTime ? U(I(_.maxTime)) : null, i = U(I(ae.value, t, t === \"minutes\" || t === \"seconds\" ? _e(e) : ye(e)));\n\t\t\treturn n && r ? (Te(i, r) || De(i, r)) && (we(i, n) || De(i, n)) : n ? we(i, n) || De(i, n) : r ? Te(i, r) || De(i, r) : !0;\n\t\t}, xe = (e) => D.value[`no${e[0].toUpperCase() + e.slice(1)}Overlay`] || m.disabled, Ce = (e) => {\n\t\t\txe(e) || (B[e] = !B[e], B[e] ? (H.value = !0, p(\"overlay-opened\", e)) : (H.value = !1, p(\"overlay-closed\", e)));\n\t\t}, X = (e) => e === \"hours\" ? ve : e === \"minutes\" ? be : Se, Ee = () => {\n\t\t\tre.value && clearTimeout(re.value);\n\t\t}, Oe = (e, t = !0, n) => {\n\t\t\tlet r = t ? se : ce, i = t ? +D.value[`${e}Increment`] : -+D.value[`${e}Increment`];\n\t\t\tY(+m[e] + i, e) && p(`update:${e}`, X(e)(r({ [e]: +m[e] }, { [e]: +D.value[`${e}Increment`] }))), !n?.keyboard && x.value.timeArrowHoldThreshold && (re.value = setTimeout(() => {\n\t\t\t\tOe(e, t);\n\t\t\t}, x.value.timeArrowHoldThreshold));\n\t\t}, ke = (e) => D.value.is24 ? e : (e >= 12 ? V.value = \"PM\" : V.value = \"AM\", ee(e)), Ae = () => {\n\t\t\tV.value === \"PM\" ? (V.value = \"AM\", p(\"update:hours\", m.hours - 12)) : (V.value = \"PM\", p(\"update:hours\", m.hours + 12)), g(\"am-pm-change\", V.value);\n\t\t}, je = (e) => {\n\t\t\tB[e] = !0;\n\t\t}, Me = (e, t) => (Ce(e), p(`update:${e}`, t));\n\t\treturn d({ openChildCmp: je }), (r, d) => P(_).disabled ? a(\"\", !0) : (w(), o(\"div\", Pn, [\n\t\t\t(w(!0), o(e, null, k(de.value, (n, i) => (w(), o(\"div\", {\n\t\t\t\tkey: i,\n\t\t\t\tclass: v(le.value),\n\t\t\t\t\"data-compact\": ue.value && !P(D).enableSeconds,\n\t\t\t\t\"data-collapsed\": ue.value && P(D).enableSeconds\n\t\t\t}, [n.separator ? (w(), o(e, { key: 0 }, [H.value ? a(\"\", !0) : (w(), o(e, { key: 0 }, [l(\":\")], 64))], 64)) : (w(), o(e, { key: 1 }, [\n\t\t\t\ts(\"button\", {\n\t\t\t\t\ttype: \"button\",\n\t\t\t\t\tclass: v({\n\t\t\t\t\t\t\"dp--btn-base dp--bg-none\": !0,\n\t\t\t\t\t\t\"dp--inc-dec-button\": !P(D).timePickerInline,\n\t\t\t\t\t\t\"dp--inc-dec-button-inline\": P(D).timePickerInline,\n\t\t\t\t\t\t\"dp--tp-inline-btn-top\": P(D).timePickerInline,\n\t\t\t\t\t\t\"dp--inc-dec-button-disabled\": K.value(n.type),\n\t\t\t\t\t\t\"dp--hidden-el\": H.value\n\t\t\t\t\t}),\n\t\t\t\t\t\"data-test-id\": `${n.type}-time-inc-btn-${m.order}`,\n\t\t\t\t\t\"aria-label\": P(y)?.incrementValue(n.type),\n\t\t\t\t\ttabindex: \"0\",\n\t\t\t\t\tdisabled: P(F)(t.disabled),\n\t\t\t\t\t\"data-dp-action-element\": W.value,\n\t\t\t\t\tonKeydown: (e) => P(N)(e, () => Oe(n.type, !0, { keyboard: !0 }), !0),\n\t\t\t\t\tonClick: (e) => P(x).timeArrowHoldThreshold ? void 0 : Oe(n.type, !0),\n\t\t\t\t\tonMousedown: (e) => P(x).timeArrowHoldThreshold ? Oe(n.type, !0) : void 0,\n\t\t\t\t\tonMouseup: Ee\n\t\t\t\t}, [P(D).timePickerInline ? A(r.$slots, \"tp-inline-arrow-up\", { key: 1 }, () => [d[1] ||= s(\"span\", { class: \"dp--tp-inline-btn-bar dp--tp-btn-in-l\" }, null, -1), d[2] ||= s(\"span\", { class: \"dp--tp-inline-btn-bar dp--tp-btn-in-r\" }, null, -1)]) : A(r.$slots, \"arrow-up\", { key: 0 }, () => [u(P(Ze))])], 42, In),\n\t\t\t\ts(\"button\", {\n\t\t\t\t\ttype: \"button\",\n\t\t\t\t\t\"aria-label\": `${pe.value(n.type).text}-${P(y)?.openTpOverlay(n.type)}`,\n\t\t\t\t\t\"aria-haspopup\": \"dialog\",\n\t\t\t\t\t\"aria-expanded\": B[n.type],\n\t\t\t\t\tclass: v({\n\t\t\t\t\t\t\"dp--time-display\": !0,\n\t\t\t\t\t\t\"dp--time-display-block\": !P(D).timePickerInline,\n\t\t\t\t\t\t\"dp--time-display-inline\": P(D).timePickerInline,\n\t\t\t\t\t\t\"dp--btn-base dp--time-invalid\": ie.value(n.type),\n\t\t\t\t\t\t\"dp--btn-base dp--time-overlay-btn\": !ie.value(n.type),\n\t\t\t\t\t\t\"dp--hidden-el\": H.value\n\t\t\t\t\t}),\n\t\t\t\t\tdisabled: P(F)(xe(n.type)),\n\t\t\t\t\ttabindex: \"0\",\n\t\t\t\t\t\"data-dp-action-element\": W.value,\n\t\t\t\t\t\"data-test-id\": `${n.type}-toggle-overlay-btn-${m.order}`,\n\t\t\t\t\tonKeydown: (e) => P(N)(e, () => Ce(n.type), !0),\n\t\t\t\t\tonClick: (e) => Ce(n.type)\n\t\t\t\t}, [A(r.$slots, n.type, {\n\t\t\t\t\ttext: pe.value(n.type).text,\n\t\t\t\t\tvalue: pe.value(n.type).value\n\t\t\t\t}, () => [l(M(pe.value(n.type).text), 1)])], 42, Ln),\n\t\t\t\ts(\"button\", {\n\t\t\t\t\ttype: \"button\",\n\t\t\t\t\tclass: v({\n\t\t\t\t\t\t\"dp--btn-base dp--bg-none\": !0,\n\t\t\t\t\t\t\"dp--inc-dec-button\": !P(D).timePickerInline,\n\t\t\t\t\t\t\"dp--inc-dec-button-inline\": P(D).timePickerInline,\n\t\t\t\t\t\t\"dp--tp-inline-btn-bottom\": P(D).timePickerInline,\n\t\t\t\t\t\t\"dp--inc-dec-button-disabled\": J.value(n.type),\n\t\t\t\t\t\t\"dp--hidden-el\": H.value\n\t\t\t\t\t}),\n\t\t\t\t\t\"data-test-id\": `${n.type}-time-dec-btn-${m.order}`,\n\t\t\t\t\t\"aria-label\": P(y)?.decrementValue(n.type),\n\t\t\t\t\ttabindex: \"0\",\n\t\t\t\t\t\"data-dp-action-element\": W.value,\n\t\t\t\t\tdisabled: P(F)(xe(n.type)),\n\t\t\t\t\tonKeydown: (e) => P(N)(e, () => Oe(n.type, !1, { keyboard: !0 }), !0),\n\t\t\t\t\tonClick: (e) => P(x).timeArrowHoldThreshold ? void 0 : Oe(n.type, !1),\n\t\t\t\t\tonMousedown: (e) => P(x).timeArrowHoldThreshold ? Oe(n.type, !1) : void 0,\n\t\t\t\t\tonMouseup: Ee\n\t\t\t\t}, [P(D).timePickerInline ? A(r.$slots, \"tp-inline-arrow-down\", { key: 1 }, () => [d[3] ||= s(\"span\", { class: \"dp--tp-inline-btn-bar dp--tp-btn-in-l\" }, null, -1), d[4] ||= s(\"span\", { class: \"dp--tp-inline-btn-bar dp--tp-btn-in-r\" }, null, -1)]) : A(r.$slots, \"arrow-down\", { key: 0 }, () => [u(P(Qe))])], 42, Rn)\n\t\t\t], 64))], 10, Fn))), 128)),\n\t\t\tP(D).is24 ? a(\"\", !0) : (w(), o(\"div\", zn, [A(r.$slots, \"am-pm-button\", {\n\t\t\t\ttoggle: Ae,\n\t\t\t\tvalue: V.value\n\t\t\t}, () => [s(\"button\", {\n\t\t\t\tref_key: \"amPmButton\",\n\t\t\t\tref: ne,\n\t\t\t\ttype: \"button\",\n\t\t\t\tclass: \"dp--pm-am-button\",\n\t\t\t\t\"aria-label\": P(y)?.amPmButton,\n\t\t\t\ttabindex: \"0\",\n\t\t\t\tdisabled: P(F)(t.disabled),\n\t\t\t\t\"data-dp-action-element\": W.value,\n\t\t\t\t\"data-compact\": ue.value,\n\t\t\t\tonClick: Ae,\n\t\t\t\tonKeydown: d[0] ||= (e) => P(N)(e, () => Ae(), !0)\n\t\t\t}, M(V.value), 41, Bn)])])),\n\t\t\t(w(!0), o(e, null, k(fe.value, (e) => (w(), i(n, {\n\t\t\t\tkey: e,\n\t\t\t\tname: P(L)(B[e.type]),\n\t\t\t\tcss: P(z)\n\t\t\t}, {\n\t\t\t\tdefault: R(() => [B[e.type] ? (w(), i(xn, {\n\t\t\t\t\tkey: 0,\n\t\t\t\t\titems: ge(e.type),\n\t\t\t\t\t\"is-last\": P(_).autoApply && !P(x).keepActionRow,\n\t\t\t\t\ttype: e.type,\n\t\t\t\t\t\"aria-labels\": P(y),\n\t\t\t\t\tlevel: P(D).timePickerInline || P(_).timePicker ? 1 : 2,\n\t\t\t\t\t\"overlay-label\": P(y).timeOverlay?.(e.type),\n\t\t\t\t\tonSelected: (t) => Me(e.type, t),\n\t\t\t\t\tonToggle: (t) => Ce(e.type)\n\t\t\t\t}, c({\n\t\t\t\t\t\"button-icon\": R(() => [A(r.$slots, \"clock-icon\", {}, () => [r.$slots[\"clock-icon\"] ? a(\"\", !0) : (w(), i(j(P(D).timePickerInline ? P(Ke) : P(Xe)), { key: 0 }))])]),\n\t\t\t\t\t_: 2\n\t\t\t\t}, [r.$slots[`${e.type}-overlay-value`] ? {\n\t\t\t\t\tname: \"item\",\n\t\t\t\t\tfn: R(({ item: t }) => [A(r.$slots, `${e.type}-overlay-value`, {\n\t\t\t\t\t\ttext: t.text,\n\t\t\t\t\t\tvalue: t.value\n\t\t\t\t\t})]),\n\t\t\t\t\tkey: \"0\"\n\t\t\t\t} : void 0, r.$slots[`${e.type}-overlay-header`] ? {\n\t\t\t\t\tname: \"header\",\n\t\t\t\t\tfn: R(() => [A(r.$slots, `${e.type}-overlay-header`, { toggle: () => Ce(e.type) })]),\n\t\t\t\t\tkey: \"1\"\n\t\t\t\t} : void 0]), 1032, [\n\t\t\t\t\t\"items\",\n\t\t\t\t\t\"is-last\",\n\t\t\t\t\t\"type\",\n\t\t\t\t\t\"aria-labels\",\n\t\t\t\t\t\"level\",\n\t\t\t\t\t\"overlay-label\",\n\t\t\t\t\t\"onSelected\",\n\t\t\t\t\t\"onToggle\"\n\t\t\t\t])) : a(\"\", !0)]),\n\t\t\t\t_: 2\n\t\t\t}, 1032, [\"name\", \"css\"]))), 128))\n\t\t]));\n\t}\n}), Hn = [\"data-dp-mobile\"], Un = [\"aria-label\", \"tabindex\"], Wn = [\n\t\"role\",\n\t\"aria-label\",\n\t\"tabindex\"\n], Gn = [\"aria-label\"], Kn = /* @__PURE__ */ d({\n\t__name: \"TimePicker\",\n\tprops: {\n\t\thours: {},\n\t\tminutes: {},\n\t\tseconds: {},\n\t\tdisabledTimesConfig: { type: [Function, null] },\n\t\tnoOverlayFocus: { type: Boolean },\n\t\tvalidateTime: { type: Function }\n\t},\n\temits: [\n\t\t\"update:hours\",\n\t\t\"update:minutes\",\n\t\t\"update:seconds\"\n\t],\n\tsetup(t, { expose: l, emit: d }) {\n\t\tlet f = d, p = t, { rootEmit: m, setState: h, modelValue: y, rootProps: x, defaults: { ariaLabels: C, textInput: T, config: E, range: D, timeConfig: j } } = $(), { isModelAuto: M } = Gt(), { checkKeyDown: N, findFocusableEl: ee } = Wt(), { transitionName: L, showTransition: B } = pt(), { hideNavigationButtons: V } = hn(), { isMobile: ne } = Kt(), { childMount: re } = ut(), H = F(), U = I(\"overlay\"), W = I(\"close-tp-btn\"), ie = I(\"tp-input\"), ae = O(!1);\n\t\tS(() => {\n\t\t\tre(x.timePicker ? void 0 : nt.timePicker);\n\t\t});\n\t\tlet oe = r(() => D.value.enabled && x.modelAuto ? M(y.value) : !0), G = O(!1), K = (e) => ({\n\t\t\thours: Array.isArray(p.hours) ? p.hours[e] : p.hours,\n\t\t\tminutes: Array.isArray(p.minutes) ? p.minutes[e] : p.minutes,\n\t\t\tseconds: Array.isArray(p.seconds) ? p.seconds[e] : p.seconds\n\t\t}), q = r(() => {\n\t\t\tlet e = [];\n\t\t\tif (D.value.enabled) for (let t = 0; t < 2; t++) e.push(K(t));\n\t\t\telse e.push(K(0));\n\t\t\treturn e;\n\t\t}), J = (e, t = \"\") => {\n\t\t\tlet n = e !== G.value;\n\t\t\tG.value = e, h(\"arrowNavigationLevel\", +!!e), n && m(\"overlay-toggle\", {\n\t\t\t\topen: e,\n\t\t\t\toverlay: rt.time\n\t\t\t}), _().then(() => {\n\t\t\t\tt !== \"\" && ie.value?.[0] && ie.value[0].openChildCmp(t);\n\t\t\t});\n\t\t}, se = r(() => ({\n\t\t\t\"dp--btn-base dp--bg-none\": !0,\n\t\t\t\"dp--button\": !0,\n\t\t\t\"dp--button-bottom\": x.autoApply && !E.value.keepActionRow\n\t\t})), ce = tn(H, Qt.TimeInput), le = (e, t, n) => D.value.enabled ? t === 0 ? [e, q.value[1][n]] : [q.value[0][n], e] : e, ue = (e) => {\n\t\t\tf(\"update:hours\", e);\n\t\t}, de = (e) => {\n\t\t\tf(\"update:minutes\", e);\n\t\t}, fe = (e) => {\n\t\t\tf(\"update:seconds\", e);\n\t\t}, pe = () => {\n\t\t\tif (U.value && !T.value.enabled && !p.noOverlayFocus) {\n\t\t\t\tlet e = ee(U.value);\n\t\t\t\te && e.focus({ preventScroll: !0 });\n\t\t\t}\n\t\t}, me = (e) => {\n\t\t\tae.value = !1, m(\"overlay-toggle\", {\n\t\t\t\topen: !1,\n\t\t\t\toverlay: e\n\t\t\t});\n\t\t}, he = (e) => {\n\t\t\tae.value = !0, m(\"overlay-toggle\", {\n\t\t\t\topen: !0,\n\t\t\t\toverlay: e\n\t\t\t});\n\t\t};\n\t\treturn l({ toggleTimePicker: J }), (r, l) => (w(), o(\"div\", {\n\t\t\tclass: \"dp--tp-wrap\",\n\t\t\t\"data-dp-mobile\": P(ne)\n\t\t}, [!P(x).timePicker && !P(j).timePickerInline ? z((w(), o(\"button\", {\n\t\t\tkey: 0,\n\t\t\tref: \"open-tp-btn\",\n\t\t\ttype: \"button\",\n\t\t\t\"data-dp-action-element\": \"0\",\n\t\t\tclass: v({\n\t\t\t\t...se.value,\n\t\t\t\t\"dp--hidden-el\": G.value\n\t\t\t}),\n\t\t\t\"aria-label\": P(C)?.openTimePicker,\n\t\t\ttabindex: t.noOverlayFocus ? void 0 : 0,\n\t\t\t\"data-test-id\": \"open-time-picker-btn\",\n\t\t\tonKeydown: l[0] ||= (e) => P(N)(e, () => J(!0)),\n\t\t\tonClick: l[1] ||= (e) => J(!0)\n\t\t}, [A(r.$slots, \"clock-icon\", {}, () => [u(P(Xe))])], 42, Un)), [[te, !P(V)(\"time\")]]) : a(\"\", !0), u(n, {\n\t\t\tname: P(L)(G.value),\n\t\t\tcss: P(B) && !P(j).timePickerInline\n\t\t}, {\n\t\t\tdefault: R(() => [G.value || P(x).timePicker || P(j).timePickerInline ? (w(), o(\"div\", {\n\t\t\t\tkey: 0,\n\t\t\t\tref: \"overlay\",\n\t\t\t\trole: P(j).timePickerInline ? void 0 : \"dialog\",\n\t\t\t\tclass: v({\n\t\t\t\t\t\"dp--overlay\": !P(j).timePickerInline,\n\t\t\t\t\t\"dp--overlay-absolute\": !P(x).timePicker && !P(j).timePickerInline,\n\t\t\t\t\t\"dp--overlay-relative\": P(x).timePicker\n\t\t\t\t}),\n\t\t\t\tstyle: b(P(x).timePicker ? { height: `${P(E).modeHeight}px` } : void 0),\n\t\t\t\t\"aria-label\": P(C)?.timePicker,\n\t\t\t\ttabindex: P(j).timePickerInline ? void 0 : 0\n\t\t\t}, [s(\"div\", {\n\t\t\t\tclass: v(P(j).timePickerInline ? \"dp--time-picker-inline-container\" : \"dp--overlay-container dp--container-flex dp--time-picker-overlay-container\"),\n\t\t\t\tstyle: { display: \"flex\" }\n\t\t\t}, [A(r.$slots, \"time-picker-overlay\", {\n\t\t\t\thours: t.hours,\n\t\t\t\tminutes: t.minutes,\n\t\t\t\tseconds: t.seconds,\n\t\t\t\tsetHours: ue,\n\t\t\t\tsetMinutes: de,\n\t\t\t\tsetSeconds: fe\n\t\t\t}, () => [s(\"div\", { class: v(P(j).timePickerInline ? \"dp--flex\" : \"dp--overlay-row dp--flex-row\") }, [(w(!0), o(e, null, k(q.value, (e, n) => z((w(), i(Vn, {\n\t\t\t\tkey: n,\n\t\t\t\tref_for: !0,\n\t\t\t\tref: \"tp-input\",\n\t\t\t\thours: e.hours,\n\t\t\t\tminutes: e.minutes,\n\t\t\t\tseconds: e.seconds,\n\t\t\t\torder: n,\n\t\t\t\t\"close-time-picker-btn\": W.value,\n\t\t\t\t\"disabled-times-config\": t.disabledTimesConfig,\n\t\t\t\tdisabled: n === 0 ? P(D).fixedStart : P(D).fixedEnd,\n\t\t\t\t\"validate-time\": (e, r) => t.validateTime(e, le(r, n, e)),\n\t\t\t\t\"onUpdate:hours\": (e) => ue(le(e, n, \"hours\")),\n\t\t\t\t\"onUpdate:minutes\": (e) => de(le(e, n, \"minutes\")),\n\t\t\t\t\"onUpdate:seconds\": (e) => fe(le(e, n, \"seconds\")),\n\t\t\t\tonMounted: pe,\n\t\t\t\tonOverlayClosed: me,\n\t\t\t\tonOverlayOpened: he\n\t\t\t}, c({ _: 2 }, [k(P(ce), (e) => ({\n\t\t\t\tname: e,\n\t\t\t\tfn: R((t) => [A(r.$slots, e, g({ ref_for: !0 }, t))])\n\t\t\t}))]), 1032, [\n\t\t\t\t\"hours\",\n\t\t\t\t\"minutes\",\n\t\t\t\t\"seconds\",\n\t\t\t\t\"order\",\n\t\t\t\t\"close-time-picker-btn\",\n\t\t\t\t\"disabled-times-config\",\n\t\t\t\t\"disabled\",\n\t\t\t\t\"validate-time\",\n\t\t\t\t\"onUpdate:hours\",\n\t\t\t\t\"onUpdate:minutes\",\n\t\t\t\t\"onUpdate:seconds\"\n\t\t\t])), [[te, n === 0 ? !0 : oe.value]])), 128))], 2)]), !P(x).timePicker && !P(j).timePickerInline ? z((w(), o(\"button\", {\n\t\t\t\tkey: 0,\n\t\t\t\tref: \"close-tp-btn\",\n\t\t\t\t\"data-dp-action-element\": \"1\",\n\t\t\t\ttype: \"button\",\n\t\t\t\tclass: v({\n\t\t\t\t\t...se.value,\n\t\t\t\t\t\"dp--hidden-el\": ae.value\n\t\t\t\t}),\n\t\t\t\t\"aria-label\": P(C)?.closeTimePicker,\n\t\t\t\ttabindex: \"0\",\n\t\t\t\tonKeydown: l[2] ||= (e) => P(N)(e, () => J(!1)),\n\t\t\t\tonClick: l[3] ||= (e) => J(!1)\n\t\t\t}, [A(r.$slots, \"calendar-icon\", {}, () => [u(P(Ke))])], 42, Gn)), [[te, !P(V)(\"time\")]]) : a(\"\", !0)], 2)], 14, Wn)) : a(\"\", !0)]),\n\t\t\t_: 3\n\t\t}, 8, [\"name\", \"css\"])], 8, Hn));\n\t}\n}), qn = () => {\n\tlet { getDate: e, modelValue: t, time: n, rootProps: i, defaults: { range: a, timeConfig: o } } = $(), { updateFlowStep: s } = ut(), { isDateEqual: c, setTime: l } = Gt(), u = (e, t) => Array.isArray(n[e]) ? n[e][t] : n[e], d = (e) => o.value.enableSeconds ? Array.isArray(n.seconds) ? n.seconds[e] : n.seconds : 0, f = (t, r) => t ? l(r === void 0 ? {\n\t\thours: n.hours,\n\t\tminutes: n.minutes,\n\t\tseconds: d()\n\t} : {\n\t\thours: u(\"hours\", r),\n\t\tminutes: u(\"minutes\", r),\n\t\tseconds: d(r)\n\t}, t) : Pe(e(), d(r)), p = (e, t) => {\n\t\tn[e] = t;\n\t}, m = r(() => i.modelAuto && a.value.enabled ? Array.isArray(t.value) ? t.value.length > 1 : !1 : a.value.enabled), h = (e, r) => {\n\t\tlet i = Object.fromEntries(Object.keys(n).map((t) => t === e ? [t, r] : [t, n[t]].slice()));\n\t\tif (m.value && !a.value.disableTimeRangeValidation) {\n\t\t\tlet e = (e) => t.value ? l({\n\t\t\t\thours: i.hours[e],\n\t\t\t\tminutes: i.minutes[e],\n\t\t\t\tseconds: i.seconds[e]\n\t\t\t}, t.value[e]) : null, n = (e) => Me(t.value[e], 0);\n\t\t\treturn !(c(e(0), e(1)) && (we(e(0), n(1)) || Te(e(1), n(0))));\n\t\t}\n\t\treturn !0;\n\t}, g = (e, t) => {\n\t\tlet r = n[e] === t ? void 0 : e;\n\t\th(e, t) && (p(e, t), r && _().then(() => s(e)));\n\t}, v = (e) => {\n\t\tg(\"hours\", e);\n\t}, y = (e) => {\n\t\tg(\"minutes\", e);\n\t}, b = (e) => {\n\t\tg(\"seconds\", e);\n\t}, x = (e, n) => {\n\t\tv(e.hours), y(e.minutes), b(e.seconds), t.value && n(t.value);\n\t}, S = (e) => {\n\t\tif (e) {\n\t\t\tlet t = Array.isArray(e), n = t ? [+e[0].hours, +e[1].hours] : +e.hours, r = t ? [+e[0].minutes, +e[1].minutes] : +e.minutes, i = t ? [+(e[0].seconds ?? 0), +(e[1].seconds ?? 0)] : +(e.seconds ?? 0);\n\t\t\tp(\"hours\", n), p(\"minutes\", r), o.value.enableSeconds && p(\"seconds\", i);\n\t\t}\n\t}, C = (e, t) => {\n\t\tlet r = {\n\t\t\thours: Array.isArray(n.hours) ? n.hours[e] : n.hours,\n\t\t\tdisabledArr: []\n\t\t};\n\t\treturn (t || t === 0) && (r.hours = t), Array.isArray(i.disabledTimes) && (r.disabledArr = a.value.enabled && Array.isArray(i.disabledTimes[e]) ? i.disabledTimes[e] : i.disabledTimes), r;\n\t};\n\treturn {\n\t\tassignTime: p,\n\t\tupdateHours: v,\n\t\tupdateMinutes: y,\n\t\tupdateSeconds: b,\n\t\tgetSetDateTime: f,\n\t\tupdateTimeValues: x,\n\t\tgetSecondsValue: d,\n\t\tassignStartTime: S,\n\t\tvalidateTime: h,\n\t\tdisabledTimesConfig: r(() => (e, t) => {\n\t\t\tif (Array.isArray(i.disabledTimes)) {\n\t\t\t\tlet { disabledArr: n, hours: r } = C(e, t), i = n.filter((e) => +e.hours === r);\n\t\t\t\treturn i[0]?.minutes === \"*\" ? {\n\t\t\t\t\thours: [r],\n\t\t\t\t\tminutes: void 0,\n\t\t\t\t\tseconds: void 0\n\t\t\t\t} : {\n\t\t\t\t\thours: [],\n\t\t\t\t\tminutes: i?.map((e) => +e.minutes) ?? [],\n\t\t\t\t\tseconds: i?.map((e) => e.seconds ? +e.seconds : void 0) ?? []\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn {\n\t\t\t\thours: [],\n\t\t\t\tminutes: [],\n\t\t\t\tseconds: []\n\t\t\t};\n\t\t})\n\t};\n}, Jn = (e) => {\n\tlet { getDate: t, time: n, modelValue: r, state: i, defaults: { startTime: a, range: o, timeConfig: s } } = $(), { getTimeObj: c } = Gt();\n\tmt(() => {\n\t\ti.isTextInputDate && b();\n\t});\n\tlet { updateTimeValues: l, getSetDateTime: u, assignTime: d, assignStartTime: f, disabledTimesConfig: p, validateTime: m } = qn(), h = (e) => {\n\t\tlet { hours: t, minutes: n, seconds: r } = e;\n\t\treturn {\n\t\t\thours: +t,\n\t\t\tminutes: +n,\n\t\t\tseconds: r ? +r : 0\n\t\t};\n\t}, g = () => {\n\t\tif (s.value.startTime) {\n\t\t\tif (Array.isArray(s.value.startTime)) {\n\t\t\t\tlet e = h(s.value.startTime[0]), n = h(s.value.startTime[1]);\n\t\t\t\treturn [Z(t(), e), Z(t(), n)];\n\t\t\t}\n\t\t\tlet e = h(s.value.startTime);\n\t\t\treturn Z(t(), e);\n\t\t}\n\t\treturn o.value.enabled ? [null, null] : null;\n\t}, _ = () => {\n\t\tif (o.value.enabled) {\n\t\t\tlet [e, t] = g();\n\t\t\tr.value = [u(e, 0), u(t, 1)];\n\t\t} else r.value = u(g());\n\t}, v = (e) => Array.isArray(e) ? [c(t(e[0])), c(t(e[1]))] : [c(e ?? t())], y = (e, t, n) => {\n\t\td(\"hours\", e), d(\"minutes\", t), d(\"seconds\", s.value.enableSeconds ? n : 0);\n\t}, b = () => {\n\t\tlet [e, t] = v(r.value);\n\t\treturn o.value.enabled ? y([e.hours, t.hours], [e.minutes, t.minutes], [e.seconds, t.seconds]) : y(e.hours, e.minutes, e.seconds);\n\t};\n\tS(() => (f(a.value), r.value ? b() : _()));\n\tlet x = () => {\n\t\tArray.isArray(r.value) ? r.value = r.value.map((e, t) => e && u(e, t)) : r.value = u(r.value), e(\"time-update\");\n\t};\n\treturn {\n\t\tmodelValue: r,\n\t\ttime: n,\n\t\tdisabledTimesConfig: p,\n\t\tvalidateTime: m,\n\t\tupdateTime: (e) => {\n\t\t\tl(e, x);\n\t\t}\n\t};\n}, Yn = /* @__PURE__ */ d({\n\t__name: \"TimePickerSolo\",\n\tprops: {\n\t\tcollapse: { type: Boolean },\n\t\tmenuWrapRef: {},\n\t\tnoOverlayFocus: { type: Boolean }\n\t},\n\temits: [\n\t\t\"time-update\",\n\t\t\"mount\",\n\t\t\"update-flow-step\"\n\t],\n\tsetup(e, { expose: t, emit: n }) {\n\t\tlet r = n, a = tn(F(), Qt.TimePicker), o = I(\"time-input\"), { time: l, modelValue: d, disabledTimesConfig: p, updateTime: m, validateTime: h } = Jn(r);\n\t\treturn S(() => {\n\t\t\tr(\"mount\");\n\t\t}), t({\n\t\t\tgetSidebarProps: () => ({\n\t\t\t\tmodelValue: d,\n\t\t\t\ttime: l,\n\t\t\t\tupdateTime: m\n\t\t\t}),\n\t\t\ttoggleTimePicker: (e, t = \"\") => {\n\t\t\t\to.value?.toggleTimePicker(e, t);\n\t\t\t}\n\t\t}), (e, t) => (w(), i(Cn, {\n\t\t\t\"multi-calendars\": 0,\n\t\t\tstretch: \"\"\n\t\t}, {\n\t\t\tdefault: R(({ wrapClass: n }) => [s(\"div\", { class: v(n) }, [u(Kn, g({ ref: \"time-input\" }, e.$props, {\n\t\t\t\thours: P(l).hours,\n\t\t\t\tminutes: P(l).minutes,\n\t\t\t\tseconds: P(l).seconds,\n\t\t\t\t\"disabled-times-config\": P(p),\n\t\t\t\t\"validate-time\": P(h),\n\t\t\t\t\"onUpdate:hours\": t[0] ||= (e) => P(m)({\n\t\t\t\t\thours: e,\n\t\t\t\t\tminutes: P(l).minutes,\n\t\t\t\t\tseconds: P(l).seconds\n\t\t\t\t}),\n\t\t\t\t\"onUpdate:minutes\": t[1] ||= (e) => P(m)({\n\t\t\t\t\thours: P(l).hours,\n\t\t\t\t\tminutes: e,\n\t\t\t\t\tseconds: P(l).seconds\n\t\t\t\t}),\n\t\t\t\t\"onUpdate:seconds\": t[2] ||= (e) => P(m)({\n\t\t\t\t\thours: P(l).hours,\n\t\t\t\t\tminutes: P(l).minutes,\n\t\t\t\t\tseconds: e\n\t\t\t\t})\n\t\t\t}), c({ _: 2 }, [k(P(a), (t, n) => ({\n\t\t\t\tname: t,\n\t\t\t\tfn: R((n) => [A(e.$slots, t, y(f(n)))])\n\t\t\t}))]), 1040, [\n\t\t\t\t\"hours\",\n\t\t\t\t\"minutes\",\n\t\t\t\t\"seconds\",\n\t\t\t\t\"disabled-times-config\",\n\t\t\t\t\"validate-time\"\n\t\t\t])], 2)]),\n\t\t\t_: 3\n\t\t}));\n\t}\n}), Xn = (e, t) => {\n\tlet { getDate: n, rootProps: i, defaults: { filters: a } } = $(), { validateMonthYearInRange: o, validateMonthYear: s } = ht(), c = (e, t) => {\n\t\tlet n = e;\n\t\treturn a.value.months.includes(Y(n)) ? (n = t ? se(e, 1) : He(e, 1), c(n, t)) : n;\n\t}, l = (e, t) => {\n\t\tlet n = e;\n\t\treturn a.value.years.includes(X(n)) ? (n = t ? ce(e, 1) : Ue(e, 1), l(n, t)) : n;\n\t}, u = (t, r = !1) => {\n\t\tlet s = Z(n(), {\n\t\t\tmonth: e.month,\n\t\t\tyear: e.year\n\t\t}), u = t ? se(s, 1) : He(s, 1);\n\t\ti.disableYearSelect && (u = Fe(u, e.year));\n\t\tlet f = Y(u), p = X(u);\n\t\ta.value.months.includes(f) && (u = c(u, t), f = Y(u), p = X(u)), a.value.years.includes(p) && (u = l(u, t), p = X(u)), o(f, p, t, i.preventMinMaxNavigation) && d(f, p, r);\n\t}, d = (e, n, r = !1) => {\n\t\tt(\"update-month-year\", {\n\t\t\tmonth: e,\n\t\t\tyear: n,\n\t\t\tfromNav: r\n\t\t});\n\t};\n\treturn {\n\t\thandleMonthYearChange: u,\n\t\tisDisabled: r(() => (t) => s(Z(n(), {\n\t\t\tmonth: e.month,\n\t\t\tyear: e.year\n\t\t}), i.preventMinMaxNavigation, t)),\n\t\tupdateMonthYear: d\n\t};\n}, Zn = { class: \"dp--header-wrap\" }, Qn = {\n\tkey: 0,\n\tclass: \"dp--month-year-wrap\"\n}, $n = { key: 0 }, er = { class: \"dp--month-year-wrap\" }, tr = [\n\t\"data-dp-element\",\n\t\"aria-label\",\n\t\"aria-expanded\",\n\t\"data-test-id\",\n\t\"onClick\",\n\t\"onKeydown\"\n], nr = /* @__PURE__ */ d({\n\t__name: \"DpHeader\",\n\tprops: {\n\t\tmonth: {},\n\t\tyear: {},\n\t\tinstance: {},\n\t\tyears: {},\n\t\tmonths: {},\n\t\tmenuWrapRef: {}\n\t},\n\temits: [\"update-month-year\"],\n\tsetup(t, { expose: d, emit: p }) {\n\t\tlet m = p, h = t, { rootEmit: _, rootProps: b, modelValue: x, defaults: { ariaLabels: C, filters: T, config: E, highlight: D, safeDates: N, ui: ee } } = $(), { transitionName: F, showTransition: I } = pt(), { showLeftIcon: te, showRightIcon: L } = hn(), { handleMonthYearChange: z, isDisabled: B, updateMonthYear: V } = Xn(h, m), { getMaxMonth: ne, getMinMonth: re, getYearFromDate: H, groupListAndMap: U, checkHighlightYear: W, checkHighlightMonth: ie } = Gt(), { checkKeyDown: ae } = Wt(), { formatYear: oe } = qt(), { checkMinMaxValue: G } = ht(), { boolHtmlAttribute: K } = Xt(), { childMount: q } = ut(), J = O(!1), se = O(!1), ce = O(!1);\n\t\tS(() => {\n\t\t\tq(nt.header);\n\t\t});\n\t\tlet le = (e) => ({\n\t\t\tget: () => h[e],\n\t\t\tset: (t) => {\n\t\t\t\tlet n = e === tt.month ? tt.year : tt.month;\n\t\t\t\tm(\"update-month-year\", {\n\t\t\t\t\t[e]: t,\n\t\t\t\t\t[n]: h[n]\n\t\t\t\t}), e === tt.month ? _e() : ve();\n\t\t\t}\n\t\t}), ue = r(le(tt.month)), de = r(le(tt.year)), fe = r(() => (e) => ({\n\t\t\tmonth: h.month,\n\t\t\tyear: h.year,\n\t\t\titems: e === tt.month ? h.months : h.years,\n\t\t\tinstance: h.instance,\n\t\t\tupdateMonthYear: V,\n\t\t\ttoggle: e === tt.month ? _e : ve\n\t\t})), pe = r(() => h.months.find((e) => e.value === h.month) || {\n\t\t\ttext: \"\",\n\t\t\tvalue: 0\n\t\t}), me = r(() => U(h.months, (e) => ({\n\t\t\tactive: h.month === e.value,\n\t\t\tdisabled: G(e.value, re(h.year, N.value.minDate), ne(h.year, N.value.maxDate)) || T.value.months.includes(e.value),\n\t\t\thighlighted: ie(D.value, e.value, h.year)\n\t\t}))), he = r(() => U(h.years, (e) => ({\n\t\t\tactive: h.year === e.value,\n\t\t\tdisabled: G(e.value, H(N.value.minDate), H(N.value.maxDate)) || T.value.years.includes(e.value),\n\t\t\thighlighted: W(D.value, e.value)\n\t\t}))), ge = (e, t, n) => {\n\t\t\tn === void 0 ? e.value = !e.value : e.value = n, e.value ? (ce.value = !0, _(\"overlay-toggle\", {\n\t\t\t\topen: !0,\n\t\t\t\toverlay: t\n\t\t\t})) : (ce.value = !1, _(\"overlay-toggle\", {\n\t\t\t\topen: !1,\n\t\t\t\toverlay: t\n\t\t\t}));\n\t\t}, _e = (e) => {\n\t\t\tge(J, rt.month, e);\n\t\t}, ve = (e) => {\n\t\t\tge(se, rt.year, e);\n\t\t}, ye = r(() => [{\n\t\t\ttype: tt.month,\n\t\t\tindex: 1,\n\t\t\ttoggle: _e,\n\t\t\tmodelValue: ue.value,\n\t\t\tupdateModelValue: (e) => ue.value = e,\n\t\t\ttext: pe.value.text,\n\t\t\tshowSelectionGrid: J.value,\n\t\t\titems: me.value,\n\t\t\tariaLabel: C.value?.openMonthsOverlay,\n\t\t\toverlayLabel: C.value.monthPicker?.(!0) ?? void 0\n\t\t}, {\n\t\t\ttype: tt.year,\n\t\t\tindex: 2,\n\t\t\ttoggle: ve,\n\t\t\tmodelValue: de.value,\n\t\t\tupdateModelValue: (e) => de.value = e,\n\t\t\ttext: oe(h.year),\n\t\t\tshowSelectionGrid: se.value,\n\t\t\titems: he.value,\n\t\t\tariaLabel: C.value?.openYearsOverlay,\n\t\t\toverlayLabel: C.value.yearPicker?.(!0) ?? void 0\n\t\t}]), be = r(() => b.disableYearSelect ? [ye.value[0]] : b.yearFirst ? [...ye.value].reverse() : ye.value);\n\t\treturn d({\n\t\t\ttoggleMonthPicker: _e,\n\t\t\ttoggleYearPicker: ve,\n\t\t\thandleMonthYearChange: z\n\t\t}), (r, d) => (w(), o(\"div\", Zn, [r.$slots[\"month-year\"] ? (w(), o(\"div\", Qn, [A(r.$slots, \"month-year\", y(f({\n\t\t\tmode: \"date\",\n\t\t\tmonth: t.month,\n\t\t\tyear: t.year,\n\t\t\tmonths: t.months,\n\t\t\tyears: t.years,\n\t\t\tupdateMonthYear: P(V),\n\t\t\thandleMonthYearChange: P(z),\n\t\t\tinstance: t.instance,\n\t\t\tisDisabled: P(B)\n\t\t})))])) : (w(), o(e, { key: 1 }, [r.$slots[\"top-extra\"] ? (w(), o(\"div\", $n, [A(r.$slots, \"top-extra\", { value: P(x) })])) : a(\"\", !0), s(\"div\", er, [\n\t\t\tP(te)(t.instance) && !P(b).vertical ? (w(), i(Tn, {\n\t\t\t\tkey: 0,\n\t\t\t\t\"aria-label\": P(C)?.prevMonth,\n\t\t\t\tdisabled: P(K)(P(B)(!1)),\n\t\t\t\tinactive: ce.value,\n\t\t\t\tclass: v(P(ee)?.navBtnPrev),\n\t\t\t\t\"el-name\": \"action-prev\",\n\t\t\t\tonActivate: d[0] ||= (e) => P(z)(!1, !0)\n\t\t\t}, {\n\t\t\t\tdefault: R(() => [r.$slots[\"arrow-left\"] ? A(r.$slots, \"arrow-left\", { key: 0 }) : a(\"\", !0), r.$slots[\"arrow-left\"] ? a(\"\", !0) : (w(), i(P(Je), { key: 1 }))]),\n\t\t\t\t_: 3\n\t\t\t}, 8, [\n\t\t\t\t\"aria-label\",\n\t\t\t\t\"disabled\",\n\t\t\t\t\"inactive\",\n\t\t\t\t\"class\"\n\t\t\t])) : a(\"\", !0),\n\t\t\ts(\"div\", { class: v([\"dp--month-year-wrap\", { \"dp--year-disable-select\": P(b).disableYearSelect }]) }, [(w(!0), o(e, null, k(be.value, (d) => (w(), o(e, { key: d.type }, [s(\"button\", {\n\t\t\t\ttype: \"button\",\n\t\t\t\t\"data-dp-element\": `overlay-${d.type}`,\n\t\t\t\tclass: v([\"dp--btn-base dp--bg-none dp--month-year-select-base dp--month-year-select\", { \"dp--hidden-el\": ce.value }]),\n\t\t\t\t\"aria-label\": `${d.text}-${d.ariaLabel}`,\n\t\t\t\t\"aria-haspopup\": \"dialog\",\n\t\t\t\t\"aria-expanded\": d.showSelectionGrid,\n\t\t\t\t\"data-test-id\": `${d.type}-toggle-overlay-${t.instance}`,\n\t\t\t\ttabindex: \"0\",\n\t\t\t\t\"data-dp-action-element\": \"0\",\n\t\t\t\tonClick: (e) => d.toggle(),\n\t\t\t\tonKeydown: (e) => P(ae)(e, () => d.toggle(), !0)\n\t\t\t}, [r.$slots[d.type] ? A(r.$slots, d.type, {\n\t\t\t\tkey: 0,\n\t\t\t\ttext: d.text,\n\t\t\t\tvalue: h[d.type]\n\t\t\t}) : a(\"\", !0), r.$slots[d.type] ? a(\"\", !0) : (w(), o(e, { key: 1 }, [l(M(d.text), 1)], 64))], 42, tr), u(n, {\n\t\t\t\tname: P(F)(d.showSelectionGrid),\n\t\t\t\tcss: P(I)\n\t\t\t}, {\n\t\t\t\tdefault: R(() => [d.showSelectionGrid ? (w(), i(xn, {\n\t\t\t\t\tkey: 0,\n\t\t\t\t\titems: d.items,\n\t\t\t\t\t\"is-last\": P(b).autoApply && !P(E).keepActionRow,\n\t\t\t\t\t\"skip-button-ref\": !1,\n\t\t\t\t\ttype: d.type,\n\t\t\t\t\t\"header-refs\": [],\n\t\t\t\t\t\"menu-wrap-ref\": t.menuWrapRef,\n\t\t\t\t\t\"overlay-label\": d.overlayLabel,\n\t\t\t\t\tonSelected: d.updateModelValue,\n\t\t\t\t\tonToggle: d.toggle\n\t\t\t\t}, c({\n\t\t\t\t\t\"button-icon\": R(() => [r.$slots[\"calendar-icon\"] ? A(r.$slots, \"calendar-icon\", { key: 0 }) : a(\"\", !0), r.$slots[\"calendar-icon\"] ? a(\"\", !0) : (w(), i(P(Ke), { key: 1 }))]),\n\t\t\t\t\t_: 2\n\t\t\t\t}, [\n\t\t\t\t\tr.$slots[`${d.type}-overlay-value`] ? {\n\t\t\t\t\t\tname: \"item\",\n\t\t\t\t\t\tfn: R(({ item: e }) => [A(r.$slots, `${d.type}-overlay-value`, {\n\t\t\t\t\t\t\ttext: e.text,\n\t\t\t\t\t\t\tvalue: e.value\n\t\t\t\t\t\t})]),\n\t\t\t\t\t\tkey: \"0\"\n\t\t\t\t\t} : void 0,\n\t\t\t\t\tr.$slots[`${d.type}-overlay`] ? {\n\t\t\t\t\t\tname: \"overlay\",\n\t\t\t\t\t\tfn: R(() => [A(r.$slots, `${d.type}-overlay`, g({ ref_for: !0 }, fe.value(d.type)))]),\n\t\t\t\t\t\tkey: \"1\"\n\t\t\t\t\t} : void 0,\n\t\t\t\t\tr.$slots[`${d.type}-overlay-header`] ? {\n\t\t\t\t\t\tname: \"header\",\n\t\t\t\t\t\tfn: R(() => [A(r.$slots, `${d.type}-overlay-header`, { toggle: d.toggle })]),\n\t\t\t\t\t\tkey: \"2\"\n\t\t\t\t\t} : void 0\n\t\t\t\t]), 1032, [\n\t\t\t\t\t\"items\",\n\t\t\t\t\t\"is-last\",\n\t\t\t\t\t\"type\",\n\t\t\t\t\t\"menu-wrap-ref\",\n\t\t\t\t\t\"overlay-label\",\n\t\t\t\t\t\"onSelected\",\n\t\t\t\t\t\"onToggle\"\n\t\t\t\t])) : a(\"\", !0)]),\n\t\t\t\t_: 2\n\t\t\t}, 1032, [\"name\", \"css\"])], 64))), 128))], 2),\n\t\t\tP(te)(t.instance) && P(b).vertical ? (w(), i(Tn, {\n\t\t\t\tkey: 1,\n\t\t\t\t\"aria-label\": P(C)?.prevMonth,\n\t\t\t\t\"el-name\": \"action-prev\",\n\t\t\t\tdisabled: P(K)(P(B)(!1)),\n\t\t\t\tinactive: ce.value,\n\t\t\t\tclass: v(P(ee)?.navBtnPrev),\n\t\t\t\tonActivate: d[1] ||= (e) => P(z)(!1, !0)\n\t\t\t}, {\n\t\t\t\tdefault: R(() => [r.$slots[\"arrow-up\"] ? A(r.$slots, \"arrow-up\", { key: 0 }) : a(\"\", !0), r.$slots[\"arrow-up\"] ? a(\"\", !0) : (w(), i(P(Ze), { key: 1 }))]),\n\t\t\t\t_: 3\n\t\t\t}, 8, [\n\t\t\t\t\"aria-label\",\n\t\t\t\t\"disabled\",\n\t\t\t\t\"inactive\",\n\t\t\t\t\"class\"\n\t\t\t])) : a(\"\", !0),\n\t\t\tP(L)(t.instance) ? (w(), i(Tn, {\n\t\t\t\tkey: 2,\n\t\t\t\tref: \"rightIcon\",\n\t\t\t\t\"el-name\": \"action-next\",\n\t\t\t\tdisabled: P(K)(P(B)(!0)),\n\t\t\t\t\"aria-label\": P(C)?.nextMonth,\n\t\t\t\tinactive: ce.value,\n\t\t\t\tclass: v(P(ee)?.navBtnNext),\n\t\t\t\tonActivate: d[2] ||= (e) => P(z)(!0, !0)\n\t\t\t}, {\n\t\t\t\tdefault: R(() => [r.$slots[P(b).vertical ? \"arrow-down\" : \"arrow-right\"] ? A(r.$slots, P(b).vertical ? \"arrow-down\" : \"arrow-right\", { key: 0 }) : a(\"\", !0), r.$slots[P(b).vertical ? \"arrow-down\" : \"arrow-right\"] ? a(\"\", !0) : (w(), i(j(P(b).vertical ? P(Qe) : P(Ye)), { key: 1 }))]),\n\t\t\t\t_: 3\n\t\t\t}, 8, [\n\t\t\t\t\"disabled\",\n\t\t\t\t\"aria-label\",\n\t\t\t\t\"inactive\",\n\t\t\t\t\"class\"\n\t\t\t])) : a(\"\", !0)\n\t\t])], 64))]));\n\t}\n}), rr = [\"inert\", \"aria-hidden\"], ir = {\n\tclass: \"dp--calendar-header\",\n\trole: \"row\"\n}, ar = {\n\tkey: 0,\n\tclass: \"dp--calendar-header-item\",\n\trole: \"gridcell\"\n}, or = [\"aria-label\"], sr = {\n\tkey: 0,\n\tclass: \"dp--calendar-item dp--week-num\",\n\trole: \"gridcell\"\n}, cr = { class: \"dp--cell-inner\" }, lr = [\n\t\"id\",\n\t\"aria-selected\",\n\t\"aria-disabled\",\n\t\"aria-label\",\n\t\"tabindex\",\n\t\"data-test-id\",\n\t\"data-dp-element-active\",\n\t\"onClick\",\n\t\"onTouchend\",\n\t\"onKeydown\",\n\t\"onMouseenter\",\n\t\"onMouseleave\",\n\t\"onMousedown\"\n], ur = /* @__PURE__ */ d({\n\t__name: \"DpCalendar\",\n\tprops: {\n\t\tinstance: {},\n\t\tmappedDates: {},\n\t\tmonth: {},\n\t\tyear: {}\n\t},\n\temits: [\n\t\t\"select-date\",\n\t\t\"set-hover-date\",\n\t\t\"handle-scroll\",\n\t\t\"handle-swipe\"\n\t],\n\tsetup(t, { expose: i, emit: c }) {\n\t\tlet d = c, f = t, { getDate: p, rootEmit: m, rootProps: h, state: g, defaults: { transitions: y, config: x, ariaLabels: T, multiCalendars: E, weekNumbers: D, multiDates: j, ui: N, weekStart: ee } } = $(), { isDateAfter: F, isDateEqual: te, resetDateTime: L, getCellId: z } = Gt(), { checkKeyDown: B, checkStopPropagation: ne, isTouchDevice: U } = Wt(), { formatWeekDay: W } = qt(), { childMount: ie } = ut(), ae = I(\"calendar-wrap\"), oe = I(\"active-tooltip\"), G = O([]), K = O(null), q = O(!0), J = O(!1), se = O(\"\"), ce = O({\n\t\t\tbottom: \"\",\n\t\t\tleft: \"\",\n\t\t\ttransform: \"\"\n\t\t}), le = O({ left: \"50%\" });\n\t\tH(ae, { onSwipeEnd: (e, t) => {\n\t\t\tx.value.noSwipe || (h.vertical ? (t === \"up\" || t === \"down\") && d(\"handle-swipe\", t === \"up\" ? \"left\" : \"right\") : (t === \"left\" || t === \"right\") && d(\"handle-swipe\", t === \"right\" ? \"left\" : \"right\"));\n\t\t} });\n\t\tlet ue = r(() => h.calendar ? h.calendar(f.mappedDates) : f.mappedDates), fe = r(() => h.dayNames ? Array.isArray(h.dayNames) ? h.dayNames : h.dayNames() : Fe());\n\t\tS(() => {\n\t\t\tie(nt.calendar), x.value.monthChangeOnScroll && ae.value && ae.value.addEventListener(\"wheel\", ke, { passive: !1 });\n\t\t}), C(() => {\n\t\t\tx.value.monthChangeOnScroll && ae.value && ae.value.removeEventListener(\"wheel\", ke);\n\t\t});\n\t\tlet pe = (e) => e ? h.vertical ? \"vNext\" : \"next\" : h.vertical ? \"vPrevious\" : \"previous\", he = (e, t) => {\n\t\t\tif (h.transitions) {\n\t\t\t\tlet n = L(Z(p(), {\n\t\t\t\t\tmonth: f.month,\n\t\t\t\t\tyear: f.year\n\t\t\t\t}));\n\t\t\t\tse.value = F(L(Z(p(), {\n\t\t\t\t\tmonth: e,\n\t\t\t\t\tyear: t\n\t\t\t\t})), n) ? y.value[pe(!0)] : y.value[pe(!1)], q.value = !1, _().then(() => q.value = !0);\n\t\t\t}\n\t\t}, _e = r(() => ({ ...N.value.calendar })), ve = (e) => ({\n\t\t\ttype: \"dot\",\n\t\t\t...e\n\t\t}), be = r(() => (e) => {\n\t\t\tlet t = ve(e);\n\t\t\treturn {\n\t\t\t\t\"dp--marker-base\": !0,\n\t\t\t\t\"dp--marker-dot\": t.type === \"dot\",\n\t\t\t\t\"dp--marker-line\": t.type === \"line\"\n\t\t\t};\n\t\t}), Y = r(() => (e) => te(e, K.value)), xe = r(() => ({\n\t\t\t\"dp--calendar\": !0,\n\t\t\t\"dp--calendar-next\": E.value.count > 0 && f.instance !== 0\n\t\t})), Se = r(() => g.arrowNavigationLevel > 0), X = r(() => (e) => h.hideOffsetDates ? e.current : !0), we = async (e, t) => {\n\t\t\tlet { width: n, height: r } = e.getBoundingClientRect();\n\t\t\tK.value = t.value;\n\t\t\tlet i = { left: `${n / 2}px` }, a = -50;\n\t\t\tif (await _(), oe.value?.[0]) {\n\t\t\t\tlet { left: e, width: t } = oe.value[0].getBoundingClientRect();\n\t\t\t\te < 0 && (i = { left: \"0\" }, a = 0, le.value.left = `${n / 2}px`), globalThis.innerWidth < e + t && (i = { right: \"0\" }, a = 0, le.value.left = `${t - n / 2}px`);\n\t\t\t}\n\t\t\tce.value = {\n\t\t\t\tbottom: `${r}px`,\n\t\t\t\t...i,\n\t\t\t\ttransform: `translateX(${a}%)`\n\t\t\t};\n\t\t}, Te = async (e, t, n) => {\n\t\t\tlet r = re(G.value?.[t]?.[n]);\n\t\t\tr && (e.marker?.customPosition && e.marker?.tooltip?.length ? ce.value = e.marker.customPosition(r) : await we(r, e), m(\"tooltip-open\", e.marker));\n\t\t}, Ee = async (e, t, n) => {\n\t\t\tif (J.value && j.value.enabled && j.value.dragSelect) return d(\"select-date\", e);\n\t\t\tif (d(\"set-hover-date\", e), e.marker?.tooltip?.length) {\n\t\t\t\tif (h.hideOffsetDates && !e.current) return;\n\t\t\t\tawait Te(e, t, n);\n\t\t\t}\n\t\t}, De = (e) => {\n\t\t\tK.value && (K.value = null, ce.value = structuredClone({\n\t\t\t\tbottom: \"\",\n\t\t\t\tleft: \"\",\n\t\t\t\ttransform: \"\"\n\t\t\t}), m(\"tooltip-close\", e.marker));\n\t\t}, Oe = (e, t, n) => {\n\t\t\te && (Array.isArray(G.value[t]) ? G.value[t][n] = e : G.value[t] = [e]);\n\t\t}, ke = (e) => {\n\t\t\tx.value.monthChangeOnScroll && (e.preventDefault(), d(\"handle-scroll\", e));\n\t\t}, Ae = (e) => D.value ? D.value.type === \"local\" ? Ce(e.value, {\n\t\t\tweekStartsOn: ee.value,\n\t\t\tlocale: h.locale\n\t\t}) : D.value.type === \"iso\" ? ye(e.value) : typeof D.value.type == \"function\" ? D.value.type(e.value) : \"\" : \"\", je = (e) => {\n\t\t\tlet t = e[0];\n\t\t\treturn D.value?.hideOnOffsetDates ? e.some((e) => e.current) ? Ae(t) : \"\" : Ae(t);\n\t\t}, Me = (e, t, n = !0) => {\n\t\t\t!n && U() || (!j.value.enabled || x.value.allowPreventDefault) && (ne(e, x.value), d(\"select-date\", t));\n\t\t}, Ne = (e) => {\n\t\t\tne(e, x.value);\n\t\t}, Pe = (e) => {\n\t\t\tj.value.enabled && j.value.dragSelect ? (J.value = !0, d(\"select-date\", e)) : j.value.enabled && d(\"select-date\", e);\n\t\t}, Fe = () => {\n\t\t\tlet e = p();\n\t\t\treturn de({\n\t\t\t\tstart: Re(e, {\n\t\t\t\t\tlocale: h.locale,\n\t\t\t\t\tweekStartsOn: ee.value\n\t\t\t\t}),\n\t\t\t\tend: me(e, {\n\t\t\t\t\tlocale: h.locale,\n\t\t\t\t\tweekStartsOn: ee.value\n\t\t\t\t})\n\t\t\t}).map((e) => W(e));\n\t\t}, Ie = (e) => T.value?.day?.(e) ?? ge(e.value, \"MMMM do, yyyy\", { locale: h.locale });\n\t\treturn i({ triggerTransition: he }), (t, r) => (w(), o(\"div\", {\n\t\t\tclass: v(xe.value),\n\t\t\tinert: Se.value || void 0,\n\t\t\t\"aria-hidden\": Se.value || void 0\n\t\t}, [s(\"div\", {\n\t\t\tref: \"calendar-wrap\",\n\t\t\tclass: v(_e.value),\n\t\t\trole: \"grid\"\n\t\t}, [\n\t\t\ts(\"div\", ir, [P(D) ? (w(), o(\"div\", ar, M(P(D).label), 1)) : a(\"\", !0), (w(!0), o(e, null, k(fe.value, (e, n) => (w(), o(\"div\", {\n\t\t\t\tkey: n,\n\t\t\t\tclass: \"dp--calendar-header-item\",\n\t\t\t\trole: \"gridcell\",\n\t\t\t\t\"data-test-id\": \"calendar-header\",\n\t\t\t\t\"aria-label\": P(T)?.weekDay?.(n)\n\t\t\t}, [A(t.$slots, \"calendar-header\", {\n\t\t\t\tday: e,\n\t\t\t\tindex: n\n\t\t\t}, () => [l(M(e), 1)])], 8, or))), 128))]),\n\t\t\tr[2] ||= s(\"div\", { class: \"dp--calendar-header-separator\" }, null, -1),\n\t\t\tu(n, {\n\t\t\t\tname: se.value,\n\t\t\t\tcss: !!P(y)\n\t\t\t}, {\n\t\t\t\tdefault: R(() => [q.value ? (w(), o(\"div\", {\n\t\t\t\t\tkey: 0,\n\t\t\t\t\tclass: \"dp--calendar\",\n\t\t\t\t\trole: \"rowgroup\",\n\t\t\t\t\tonMouseleave: r[1] ||= (e) => J.value = !1\n\t\t\t\t}, [(w(!0), o(e, null, k(ue.value, (n, i) => (w(), o(\"div\", {\n\t\t\t\t\tkey: i,\n\t\t\t\t\tclass: \"dp--calendar-row\",\n\t\t\t\t\trole: \"row\"\n\t\t\t\t}, [P(D) ? (w(), o(\"div\", sr, [s(\"div\", cr, M(je(n.days)), 1)])) : a(\"\", !0), (w(!0), o(e, null, k(n.days, (n, c) => (w(), o(\"div\", {\n\t\t\t\t\tid: P(z)(n.value),\n\t\t\t\t\tref_for: !0,\n\t\t\t\t\tref: (e) => Oe(e, i, c),\n\t\t\t\t\tkey: c + i,\n\t\t\t\t\trole: \"gridcell\",\n\t\t\t\t\tclass: \"dp--calendar-item\",\n\t\t\t\t\t\"aria-selected\": (n.classData[\"dp--active\"] || n.classData[\"dp--range-border-start\"] || n.classData[\"dp--range-border-end\"]) ?? void 0,\n\t\t\t\t\t\"aria-disabled\": n.classData[\"dp--cell-disabled\"] || void 0,\n\t\t\t\t\t\"aria-label\": Ie(n),\n\t\t\t\t\ttabindex: !n.current && P(h).hideOffsetDates ? void 0 : 0,\n\t\t\t\t\t\"data-test-id\": P(z)(n.value),\n\t\t\t\t\t\"data-dp-element-active\": n.classData[\"dp--active\"] ? 0 : void 0,\n\t\t\t\t\t\"data-dp-action-element\": \"0\",\n\t\t\t\t\tonClick: V((e) => Me(e, n), [\"prevent\"]),\n\t\t\t\t\tonTouchend: (e) => Me(e, n, !1),\n\t\t\t\t\tonKeydown: (e) => P(B)(e, () => t.$emit(\"select-date\", n), !1, P(x).spaceConfirm, void 0),\n\t\t\t\t\tonMouseenter: (e) => Ee(n, i, c),\n\t\t\t\t\tonMouseleave: (e) => De(n),\n\t\t\t\t\tonMousedown: (e) => Pe(n),\n\t\t\t\t\tonMouseup: r[0] ||= (e) => J.value = !1\n\t\t\t\t}, [s(\"div\", { class: v([\"dp--cell-inner\", n.classData]) }, [\n\t\t\t\t\tt.$slots.day && X.value(n) ? A(t.$slots, \"day\", {\n\t\t\t\t\t\tkey: 0,\n\t\t\t\t\t\tday: +n.text,\n\t\t\t\t\t\tdate: n.value\n\t\t\t\t\t}) : a(\"\", !0),\n\t\t\t\t\tt.$slots.day ? a(\"\", !0) : (w(), o(e, { key: 1 }, [l(M(n.text), 1)], 64)),\n\t\t\t\t\tn.marker && X.value(n) ? A(t.$slots, \"marker\", {\n\t\t\t\t\t\tkey: 2,\n\t\t\t\t\t\tmarker: n.marker,\n\t\t\t\t\t\tday: +n.text,\n\t\t\t\t\t\tdate: n.value\n\t\t\t\t\t}, () => [s(\"div\", {\n\t\t\t\t\t\tclass: v(be.value(n.marker)),\n\t\t\t\t\t\tstyle: b(n.marker.color ? { backgroundColor: n.marker.color } : {})\n\t\t\t\t\t}, null, 6)]) : a(\"\", !0),\n\t\t\t\t\tY.value(n.value) ? (w(), o(\"div\", {\n\t\t\t\t\t\tkey: 3,\n\t\t\t\t\t\tref_for: !0,\n\t\t\t\t\t\tref: \"active-tooltip\",\n\t\t\t\t\t\tclass: \"dp--marker-tooltip\",\n\t\t\t\t\t\tstyle: b(ce.value)\n\t\t\t\t\t}, [n.marker?.tooltip ? (w(), o(\"div\", {\n\t\t\t\t\t\tkey: 0,\n\t\t\t\t\t\tclass: \"dp--tooltip-content\",\n\t\t\t\t\t\tonClick: Ne\n\t\t\t\t\t}, [(w(!0), o(e, null, k(n.marker.tooltip, (e, r) => (w(), o(\"div\", {\n\t\t\t\t\t\tkey: r,\n\t\t\t\t\t\tclass: \"dp--tooltip-text\"\n\t\t\t\t\t}, [A(t.$slots, \"marker-tooltip\", {\n\t\t\t\t\t\ttooltip: e,\n\t\t\t\t\t\tday: n.value\n\t\t\t\t\t}, () => [s(\"div\", {\n\t\t\t\t\t\tclass: \"dp--tooltip-mark\",\n\t\t\t\t\t\tstyle: b(e.color ? { backgroundColor: e.color } : {})\n\t\t\t\t\t}, null, 4), s(\"div\", null, M(e.text), 1)])]))), 128)), s(\"div\", {\n\t\t\t\t\t\tclass: \"dp--arrow-bottom-tp\",\n\t\t\t\t\t\tstyle: b(le.value)\n\t\t\t\t\t}, null, 4)])) : a(\"\", !0)], 4)) : a(\"\", !0)\n\t\t\t\t], 2)], 40, lr))), 128))]))), 128))], 32)) : a(\"\", !0)]),\n\t\t\t\t_: 3\n\t\t\t}, 8, [\"name\", \"css\"])\n\t\t], 2)], 10, rr));\n\t}\n}), dr = (e, t) => {\n\tlet n = O([]), i = O(/* @__PURE__ */ new Date()), a = O(), { getDate: o, getDateFromParts: s, rootEmit: c, calendars: l, month: u, year: d, time: f, modelValue: p, rootProps: m, today: h, state: g, defaults: { multiCalendars: v, startTime: y, range: b, config: x, safeDates: C, multiDates: w, timeConfig: T, flow: E, weekStart: D } } = $(), { validateMonthYearInRange: k, isDisabled: A, isDateRangeAllowed: j, checkMinMaxRange: M } = ht(), { updateTimeValues: N, getSetDateTime: ee, assignTime: P, assignStartTime: F, validateTime: I, disabledTimesConfig: te } = qn(), { formatDay: L } = qt(), { setTime: R, isDateBefore: z, getDaysInBetween: B } = Gt(), { checkRangeAutoApply: V, getRangeWithFixedDate: ne, handleMultiDatesSelect: re, setPresetDate: H } = kn(), { getMapDate: U } = Wt(), { selectOnAutoApply: W } = ln(e);\n\tmt(() => de(g.isTextInputDate));\n\tlet { updateFlowStep: ie, flowStep: ae } = ut(), oe = (e) => !x.value.keepViewOnOffsetClick || e ? !0 : !a.value, G = (e, t, n, r = !1, i = !1) => {\n\t\toe(i) && (!r && t && n && K(e, t, n), l.value[e] ??= l.value[e] = {\n\t\t\tmonth: 0,\n\t\t\tyear: 0\n\t\t}, l.value[e].month = t ?? l.value[e]?.month, l.value[e].year = n ?? l.value[e]?.year);\n\t}, K = (e, t, n) => {\n\t\t(l.value.at(e)?.month !== t || l.value.at(e)?.year !== n) && c(\"update-month-year\", {\n\t\t\tmonth: t,\n\t\t\tyear: n,\n\t\t\tinstance: e\n\t\t});\n\t}, ce = () => {\n\t\ty.value && F(y.value);\n\t};\n\tS(() => {\n\t\tp.value || (Ee(), ce()), de(!0), m.focusStartDate && m.startDate && Ee();\n\t});\n\tlet le = r(() => E.value?.steps?.length ? E.value.steps.at(-1) === ae.value : !0), ue = () => {\n\t\tm.autoApply && e(\"auto-apply\", !le.value);\n\t}, de = (e = !1) => {\n\t\tif (p.value) return Array.isArray(p.value) ? (n.value = p.value, xe(e)) : he(p.value, e);\n\t\tif (v.value.count && e && !m.startDate) return me(o(), e);\n\t}, fe = () => Array.isArray(p.value) && b.value.enabled ? Y(p.value[0]) === Y(p.value[1] ?? p.value[0]) : !1, pe = (e) => {\n\t\tlet t = se(e, 1);\n\t\treturn {\n\t\t\tmonth: Y(t),\n\t\t\tyear: X(t)\n\t\t};\n\t}, me = (e = o(), t = !1) => {\n\t\tif ((!v.value.count || !v.value.static || t) && G(0, Y(e), X(e), t), v.value.count && (!p.value || fe() || !v.value.solo) && (!v.value.solo || t)) for (let e = 1; e < v.value.count; e++) {\n\t\t\tlet t = q(Z(o(), {\n\t\t\t\tmonth: u.value(e - 1),\n\t\t\t\tyear: d.value(e - 1)\n\t\t\t}), { months: 1 });\n\t\t\tl.value[e] = {\n\t\t\t\tmonth: Y(t),\n\t\t\t\tyear: X(t)\n\t\t\t};\n\t\t}\n\t}, he = (e, t) => {\n\t\tme(e, t), P(\"hours\", ve(e)), P(\"minutes\", be(e)), P(\"seconds\", Se(e)), v.value.count && t && Te();\n\t}, ge = (e) => {\n\t\tif (v.value.count) {\n\t\t\tif (v.value.solo) return 0;\n\t\t\tlet t = Y(e[0]), n = Y(e[1]);\n\t\t\treturn Math.abs(n - t) < v.value.count ? 0 : 1;\n\t\t}\n\t\treturn 1;\n\t}, _e = (e, t) => {\n\t\te[1] && b.value.showLastInRange ? me(e[ge(e)], t) : me(e[0], t);\n\t\tlet n = (t, n) => [t(e[0]), e?.[1] ? t(e[1]) : f[n][1]];\n\t\tP(\"hours\", n(ve, \"hours\")), P(\"minutes\", n(be, \"minutes\")), P(\"seconds\", n(Se, \"seconds\"));\n\t}, ye = (e, t) => {\n\t\tif ((b.value.enabled || m.weekPicker) && !w.value.enabled) return _e(e, t);\n\t\tif (w.value.enabled && t) {\n\t\t\tlet n = e.at(-1);\n\t\t\tif (n) return he(n, t);\n\t\t}\n\t}, xe = (e) => {\n\t\tlet t = p.value;\n\t\tye(t, e), v.value.count && v.value.solo && Te();\n\t}, Ce = (e, n) => {\n\t\tlet r = Z(o(), {\n\t\t\tmonth: u.value(n),\n\t\t\tyear: d.value(n)\n\t\t}), i = e < 0 ? se(r, 1) : He(r, 1);\n\t\tk(Y(i), X(i), e < 0, m.preventMinMaxNavigation) && (G(n, Y(i), X(i)), v.value.count && !v.value.solo && we(n), t());\n\t}, we = (e) => {\n\t\tfor (let t = e - 1; t >= 0; t--) {\n\t\t\tlet e = He(Z(o(), {\n\t\t\t\tmonth: u.value(t + 1),\n\t\t\t\tyear: d.value(t + 1)\n\t\t\t}), 1);\n\t\t\tG(t, Y(e), X(e));\n\t\t}\n\t\tfor (let t = e + 1; t <= v.value.count - 1; t++) {\n\t\t\tlet e = se(Z(o(), {\n\t\t\t\tmonth: u.value(t - 1),\n\t\t\t\tyear: d.value(t - 1)\n\t\t\t}), 1);\n\t\t\tG(t, Y(e), X(e));\n\t\t}\n\t}, Te = () => {\n\t\tif (Array.isArray(p.value) && p.value.length === 2) {\n\t\t\tlet e = o(o(p.value[1] ?? se(p.value[0], 1))), [t, n] = [Y(p.value[0]), X(p.value[0])], [r, i] = [Y(p.value[1]), X(p.value[1])];\n\t\t\t(t !== r || t === r && n !== i) && v.value.solo && G(1, Y(e), X(e));\n\t\t} else p.value && !Array.isArray(p.value) && (G(0, Y(p.value), X(p.value)), me(o()));\n\t}, Ee = () => {\n\t\tm.startDate && (G(0, Y(o(m.startDate)), X(o(m.startDate))), v.value.count && we(0));\n\t}, De = (e, t) => {\n\t\tif (x.value.monthChangeOnScroll) {\n\t\t\tlet n = Date.now() - i.value.getTime(), r = Math.abs(e.deltaY), a = 500;\n\t\t\tr > 1 && (a = 100), r > 100 && (a = 0), n > a && (i.value = /* @__PURE__ */ new Date(), Ce(x.value.monthChangeOnScroll === \"inverse\" ? e.deltaY : -e.deltaY, t));\n\t\t}\n\t}, Oe = (e, t, n = !1) => {\n\t\tx.value.monthChangeOnArrows && m.vertical === n && ke(e, t);\n\t}, ke = (e, t) => {\n\t\tCe(e === \"right\" ? -1 : 1, t);\n\t}, Ae = (e) => {\n\t\tif (C.value.markers) return U(e.value, C.value.markers);\n\t}, je = (e, t) => {\n\t\tswitch (m.sixWeeks === !0 ? \"append\" : m.sixWeeks) {\n\t\t\tcase \"prepend\": return [!0, !1];\n\t\t\tcase \"center\": return [e == 0, !0];\n\t\t\tcase \"fair\": return [e == 0 || t > e, !0];\n\t\t\tcase \"append\": return [!1, !1];\n\t\t\tdefault: return [!1, !1];\n\t\t}\n\t}, Me = (e, t, n) => {\n\t\tif (n) {\n\t\t\tlet r = n.days.at(-1);\n\t\t\tif (r) {\n\t\t\t\tlet n = Pe(J(r.value, 1), Y(t));\n\t\t\t\te.push({ days: n });\n\t\t\t}\n\t\t}\n\t}, Ne = (e, t, n, r) => {\n\t\tif (m.sixWeeks && e.length < 6) {\n\t\t\tlet i = 6 - e.length, [a, o] = je((t.getDay() + 7 - r) % 7, 6 - (n.getDay() + 7 - r) % 7);\n\t\t\tfor (let n = 1; n <= i; n++) if (o ? !!(n % 2) == a : a) {\n\t\t\t\tlet n = e[0].days[0], r = Pe(J(n.value, -7), Y(t));\n\t\t\t\te.unshift({ days: r });\n\t\t\t} else Me(e, t, e.at(-1));\n\t\t}\n\t\treturn e;\n\t}, Pe = (e, t) => {\n\t\tlet n = o(e), r = [];\n\t\tfor (let e = 0; e < 7; e++) {\n\t\t\tlet i = J(n, e), a = Y(i) !== t;\n\t\t\tr.push({\n\t\t\t\ttext: m.hideOffsetDates && a ? \"\" : L(i),\n\t\t\t\tvalue: i,\n\t\t\t\tcurrent: !a,\n\t\t\t\tclassData: {}\n\t\t\t});\n\t\t}\n\t\treturn r;\n\t}, Fe = (e, t) => {\n\t\tlet n = [], r = s(t, e), i = s(t, e + 1, 0), a = Re(r, { weekStartsOn: D.value }), o = (t) => {\n\t\t\tlet r = Pe(t, e);\n\t\t\tn.push({ days: r });\n\t\t\tlet a = r.at(-1)?.value;\n\t\t\tz(a, i) && o(J(t, 7));\n\t\t};\n\t\treturn o(a), Ne(n, r, i, D.value);\n\t}, Ie = (e) => {\n\t\tlet t = R({\n\t\t\thours: f.hours,\n\t\t\tminutes: f.minutes,\n\t\t\tseconds: Ge()\n\t\t}, o(e.value));\n\t\tc(\"date-click\", t), w.value.enabled ? re(t, w.value.limit) : p.value = t, ie(\"calendar\"), _().then(() => {\n\t\t\tue();\n\t\t});\n\t}, Le = (e) => b.value.noDisabledRange ? B(n.value[0], e).some((e) => A(e)) : !1, ze = () => {\n\t\tn.value = p.value ? p.value.slice().filter((e) => !!e) : [], n.value.length === 2 && !(b.value.fixedStart || b.value.fixedEnd) && (n.value = []);\n\t}, Be = (e, t) => {\n\t\tlet r = [o(e.value), J(o(e.value), +b.value.autoRange)];\n\t\tj(r) ? (t && Ve(e.value), n.value = r) : c(\"invalid-date\", e.value);\n\t}, Ve = (e) => {\n\t\tif (G(0, Y(o(e)), X(o(e))), v.value.count > 0) for (let t = 1; t < v.value.count; t++) {\n\t\t\tlet n = pe(Z(o(e), {\n\t\t\t\tyear: d.value(t - 1),\n\t\t\t\tmonth: u.value(t - 1)\n\t\t\t}));\n\t\t\tG(t, n.month, n.year);\n\t\t}\n\t}, Ue = (e) => {\n\t\tif (Le(e.value) || !M(e.value, p.value, +!b.value.fixedStart)) return c(\"invalid-date\", e.value);\n\t\tn.value = ne(o(e.value));\n\t}, We = (e, t) => {\n\t\tif (ze(), b.value.autoRange) return Be(e, t);\n\t\tif (b.value.fixedStart || b.value.fixedEnd) return Ue(e);\n\t\tn.value[0] ? M(o(e.value), p.value) && !Le(e.value) ? z(o(e.value), o(n.value[0])) ? b.value.autoSwitchStartEnd ? (n.value.unshift(o(e.value)), c(\"range-end\", n.value[0])) : (n.value[0] = o(e.value), c(\"range-start\", n.value[0])) : (n.value[1] = o(e.value), c(\"range-end\", n.value[1])) : c(\"invalid-date\", e.value) : (n.value[0] = o(e.value), c(\"range-start\", n.value[0]));\n\t}, Ge = (e = !0) => T.value.enableSeconds ? Array.isArray(f.seconds) ? e ? f.seconds[0] : f.seconds[1] : f.seconds : 0, Ke = (e) => {\n\t\tn.value[e] = R({\n\t\t\thours: f.hours[e],\n\t\t\tminutes: f.minutes[e],\n\t\t\tseconds: Ge(e !== 1)\n\t\t}, n.value[e]);\n\t}, qe = () => {\n\t\tn.value[0] && n.value[1] && +n.value?.[0] > +n.value?.[1] && (n.value.reverse(), c(\"range-start\", n.value[0]), c(\"range-end\", n.value[1]));\n\t}, Je = () => {\n\t\tn.value.length && (n.value[0] && !n.value[1] ? Ke(0) : (Ke(0), Ke(1), ie(\"calendar\")), qe(), p.value = n.value.slice(), V(n.value, e, n.value.length < 2 || E.value?.steps.length ? E.value?.steps.at(-1) !== ae.value : !1));\n\t}, Ye = (e, t = !1) => {\n\t\tif (A(e.value) || !e.current && m.hideOffsetDates) return c(\"invalid-date\", e.value);\n\t\tif (a.value = structuredClone(e), !b.value.enabled) return Ie(e);\n\t\tArray.isArray(f.hours) && Array.isArray(f.minutes) && !w.value.enabled && (We(e, t), Je());\n\t}, Xe = (e, n) => {\n\t\tlet r = u.value(e) !== n.month;\n\t\tG(e, n.month, n.year, !1, !0), v.value.count && !v.value.solo && we(e), t(v.value.solo ? e : void 0), n.fromNav || ie(r ? \"month\" : \"year\");\n\t}, Ze = (e) => {\n\t\tH({ value: e }), W(), m.multiCalendars && _().then(() => de(!0));\n\t}, Qe = () => {\n\t\tif (Array.isArray(p.value)) if (w.value.enabled) {\n\t\t\tlet e = $e();\n\t\t\tp.value[p.value.length - 1] = ee(e);\n\t\t} else p.value = p.value.map((e, t) => e && ee(e, t));\n\t\telse p.value = ee(p.value);\n\t\te(\"time-update\");\n\t}, $e = () => Array.isArray(p.value) && p.value.length ? p.value[p.value.length - 1] : null, et = (e) => {\n\t\tlet t = \"\";\n\t\tif (b.value.enabled && Array.isArray(p.value)) for (let n of Object.keys(e)) {\n\t\t\tlet r = e[n];\n\t\t\tArray.isArray(r) && (f[n][0] !== r[0] && (t = \"range-start\"), f[n][1] !== r[1] && (t = \"range-start\"));\n\t\t}\n\t\treturn t;\n\t};\n\treturn {\n\t\tcalendars: l,\n\t\tmodelValue: p,\n\t\tmonth: u,\n\t\tyear: d,\n\t\ttime: f,\n\t\tdisabledTimesConfig: te,\n\t\ttoday: h,\n\t\tvalidateTime: I,\n\t\tgetCalendarDays: Fe,\n\t\tgetMarker: Ae,\n\t\thandleScroll: De,\n\t\thandleSwipe: ke,\n\t\thandleArrow: Oe,\n\t\tselectDate: Ye,\n\t\tupdateMonthYear: Xe,\n\t\tpresetDate: Ze,\n\t\tupdateTime: (e) => {\n\t\t\tlet t = et(e);\n\t\t\tN(e, Qe), t && c(t, p.value[t === \"range-start\" ? 0 : 1]), E.value?.steps.length && ue();\n\t\t},\n\t\tassignMonthAndYear: me,\n\t\tsetStartTime: ce\n\t};\n}, fr = () => {\n\tlet { isModelAuto: e, matchDate: t, isDateAfter: n, isDateBefore: r, isDateBetween: i, isDateEqual: a, getWeekFromDate: o, getBeforeAndAfterInRange: s } = Gt(), { getDate: c, today: l, rootProps: u, defaults: { multiCalendars: d, multiDates: f, ui: p, highlight: m, safeDates: h, range: g, weekStart: _ }, modelValue: v } = $(), { isDisabled: y } = ht(), b = O(null), x = (e) => {\n\t\t!e.current && u.hideOffsetDates || (b.value = e.value);\n\t}, S = () => {\n\t\tb.value = null;\n\t}, C = (e) => Array.isArray(v.value) && g.value.enabled && v.value[0] && b.value ? e ? n(b.value, v.value[0]) : r(b.value, v.value[0]) : !0, w = (e, t) => {\n\t\tlet n = v.value && Array.isArray(v.value) && v.value ? t ? v.value[0] || null : v.value[1] : null;\n\t\treturn a(c(e.value), n);\n\t}, T = (e) => {\n\t\tlet t = Array.isArray(v.value) ? v.value[0] : null;\n\t\treturn e ? !r(b.value, t) : !0;\n\t}, E = (e, t = !0) => (g.value.enabled || u.weekPicker) && Array.isArray(v.value) && v.value.length === 2 ? u.hideOffsetDates && !e.current ? !1 : a(c(e.value), v.value[+!t]) : g.value.enabled ? w(e, t) && T(t) || a(e.value, Array.isArray(v.value) ? v.value[0] : null) && C(t) : !1, D = (e, t) => {\n\t\tif (Array.isArray(v.value) && v.value[0] && v.value.length === 1) {\n\t\t\tlet i = a(e.value, b.value);\n\t\t\treturn t ? n(v.value[0], e.value) && i : r(v.value[0], e.value) && i;\n\t\t}\n\t\treturn !1;\n\t}, k = (e) => !v.value || u.hideOffsetDates && !e.current ? !1 : g.value.enabled ? u.modelAuto && Array.isArray(v.value) ? a(e.value, v.value[0] ?? l) : !1 : f.value.enabled && Array.isArray(v.value) ? v.value.some((t) => a(t, e.value)) : a(e.value, v.value ? v.value : l), A = (e) => {\n\t\tif (g.value.autoRange || u.weekPicker) {\n\t\t\tif (b.value) {\n\t\t\t\tif (u.hideOffsetDates && !e.current) return !1;\n\t\t\t\tlet t = J(b.value, +g.value.autoRange), n = o(c(b.value), _.value);\n\t\t\t\treturn u.weekPicker ? a(n[1], c(e.value)) : a(t, c(e.value));\n\t\t\t}\n\t\t\treturn !1;\n\t\t}\n\t\treturn !1;\n\t}, j = (e) => {\n\t\tif (g.value.autoRange || u.weekPicker) {\n\t\t\tif (b.value) {\n\t\t\t\tlet t = J(b.value, +g.value.autoRange);\n\t\t\t\tif (u.hideOffsetDates && !e.current) return !1;\n\t\t\t\tlet i = o(c(b.value), _.value);\n\t\t\t\treturn u.weekPicker ? n(e.value, i[0]) && r(e.value, i[1]) : n(e.value, b.value) && r(e.value, t);\n\t\t\t}\n\t\t\treturn !1;\n\t\t}\n\t\treturn !1;\n\t}, M = (e) => {\n\t\tif (g.value.autoRange || u.weekPicker) {\n\t\t\tif (b.value) {\n\t\t\t\tif (u.hideOffsetDates && !e.current) return !1;\n\t\t\t\tlet t = o(c(b.value), _.value);\n\t\t\t\treturn u.weekPicker ? a(t[0], e.value) : a(b.value, e.value);\n\t\t\t}\n\t\t\treturn !1;\n\t\t}\n\t\treturn !1;\n\t}, N = (e) => i(v.value, b.value, e.value), ee = () => u.modelAuto && Array.isArray(v.value) ? !!v.value[0] : !1, P = () => u.modelAuto ? e(v.value) : !0, F = (e) => {\n\t\tif (u.weekPicker) return !1;\n\t\tlet t = g.value.enabled ? !E(e) && !E(e, !1) : !0;\n\t\treturn !y(e.value) && !k(e) && !(!e.current && u.hideOffsetDates) && t;\n\t}, I = (e) => g.value.enabled ? u.modelAuto ? ee() && k(e) : !1 : k(e), te = (e) => m.value ? t(e.value, h.value.highlight) : !1, L = (e) => {\n\t\tlet t = y(e.value);\n\t\treturn t && (typeof m.value == \"function\" ? !m.value(e.value, t) : !m.value.options.highlightDisabled);\n\t}, R = (e) => typeof m.value == \"function\" ? m.value(e.value) : m.value.weekdays?.includes(e.value.getDay()), z = (e) => (g.value.enabled || u.weekPicker) && (!(d.value.count > 0) || e.current) && P() && !(!e.current && u.hideOffsetDates) && !k(e) ? N(e) : !1, B = (e) => {\n\t\tif (Array.isArray(v.value) && v.value.length === 1) {\n\t\t\tlet { before: t, after: n } = s(+g.value.maxRange, v.value[0]);\n\t\t\treturn Te(e.value, t) || we(e.value, n);\n\t\t}\n\t\treturn !1;\n\t}, V = (e) => {\n\t\tif (Array.isArray(v.value) && v.value.length === 1) {\n\t\t\tlet { before: t, after: n } = s(+g.value.minRange, v.value[0]);\n\t\t\treturn i([t, n], v.value[0], e.value);\n\t\t}\n\t\treturn !1;\n\t}, ne = (e) => g.value.enabled && (g.value.maxRange || g.value.minRange) ? g.value.maxRange && g.value.minRange ? B(e) || V(e) : g.value.maxRange ? B(e) : V(e) : !1, re = (e) => {\n\t\tlet { isRangeStart: t, isRangeEnd: i } = ie(e), o = g.value.enabled ? t || i : !1;\n\t\treturn {\n\t\t\t\"dp--cell-offset\": !e.current,\n\t\t\t\"dp--pointer\": !u.disabled && !(!e.current && u.hideOffsetDates) && !y(e.value) && !ne(e),\n\t\t\t\"dp--cell-disabled\": y(e.value) || ne(e),\n\t\t\t\"dp--cell-highlight\": !L(e) && (te(e) || R(e)) && !I(e) && !o && !M(e) && !(z(e) && u.weekPicker) && !i,\n\t\t\t\"dp--cell-highlight-active\": !L(e) && (te(e) || R(e)) && I(e),\n\t\t\t\"dp--today\": !u.noToday && a(e.value, l) && e.current,\n\t\t\t\"dp--past\": r(e.value, l),\n\t\t\t\"dp--future\": n(e.value, l)\n\t\t};\n\t}, H = (e) => ({\n\t\t\"dp--active\": I(e),\n\t\t\"dp--date-hoverable\": F(e)\n\t}), U = (e) => {\n\t\tif (v.value && !Array.isArray(v.value)) {\n\t\t\tlet t = o(v.value, _.value);\n\t\t\treturn {\n\t\t\t\t...q(e),\n\t\t\t\t\"dp--range-border-start dp--active\": a(t[0], e.value),\n\t\t\t\t\"dp--range-border-end dp--active\": a(t[1], e.value),\n\t\t\t\t\"dp--range-preview dp--range-between-week\": n(e.value, t[0]) && r(e.value, t[1])\n\t\t\t};\n\t\t}\n\t\treturn { ...q(e) };\n\t}, W = (e) => {\n\t\tif (v.value && Array.isArray(v.value)) {\n\t\t\tlet t = o(v.value[0], _.value), i = v.value[1] ? o(v.value[1], _.value) : [];\n\t\t\treturn {\n\t\t\t\t...q(e),\n\t\t\t\t\"dp--range-border-start dp--active\": a(t[0], e.value) || a(i[0], e.value),\n\t\t\t\t\"dp--range-border-end dp--active\": a(t[1], e.value) || a(i[1], e.value),\n\t\t\t\t\"dp--range-preview dp--range-between-week\": n(e.value, t[0]) && r(e.value, t[1]) || n(e.value, i[0]) && r(e.value, i[1]),\n\t\t\t\t\"dp--range-between\": n(e.value, t[1]) && r(e.value, i[0])\n\t\t\t};\n\t\t}\n\t\treturn { ...q(e) };\n\t}, ie = (e) => ({\n\t\tisRangeStart: d.value.count > 0 ? e.current && E(e) && P() : E(e) && P(),\n\t\tisRangeEnd: d.value.count > 0 ? e.current && E(e, !1) && P() : E(e, !1) && P()\n\t}), ae = (e) => g.value.enabled && (g.value.fixedStart || g.value.fixedEnd) && Array.isArray(e) && e.length === 2, oe = (e, t, n, r) => !ae(v.value) || !b.value ? !1 : t ? g.value.fixedEnd && a(e.value, b.value) && Te(e.value, v.value[0]) && !n : g.value.fixedStart && a(e.value, b.value) && we(e.value, v.value[1]) && !r, G = (e, t) => !ae(v.value) || !b.value ? !1 : t ? g.value.fixedEnd && we(e.value, b.value) && Te(e.value, v.value[0]) : g.value.fixedStart && Te(e.value, b.value) && we(e.value, v.value[1]), K = (e) => {\n\t\tlet { isRangeStart: t, isRangeEnd: n } = ie(e);\n\t\treturn {\n\t\t\t\"dp--range-border-start dp--active\": t,\n\t\t\t\"dp--range-border-end dp--active\": n,\n\t\t\t\"dp--range-between\": z(e) || G(e, !0) || G(e, !1),\n\t\t\t\"dp--date-hoverable\": a(e.value, b.value) && !t && !n && !u.weekPicker,\n\t\t\t\"dp--date-hoverable dp--date-hoverable-start\": D(e, !0) || oe(e, !0, t, n),\n\t\t\t\"dp--date-hoverable dp--date-hoverable-end\": D(e, !1) || oe(e, !1, t, n)\n\t\t};\n\t}, q = (e) => ({\n\t\t...K(e),\n\t\t\"dp--range-preview dp--cell-auto-range\": j(e),\n\t\t\"dp--range-preview dp--range-border-start dp--cell-auto-range-start\": M(e),\n\t\t\"dp--range-preview dp--range-border-end dp--cell-auto-range-end\": A(e)\n\t}), se = (e) => g.value.enabled ? g.value.autoRange ? q(e) : u.modelAuto ? {\n\t\t...H(e),\n\t\t...K(e)\n\t} : u.weekPicker ? W(e) : K(e) : u.weekPicker ? U(e) : H(e);\n\treturn {\n\t\tsetHoverDate: x,\n\t\tclearHoverDate: S,\n\t\tgetDayClassData: (e) => u.hideOffsetDates && !e.current ? {} : {\n\t\t\t...re(e),\n\t\t\t...se(e),\n\t\t\t[p.value.dayClass ? p.value.dayClass(e.value, v.value) : \"\"]: !0,\n\t\t\t...p.value.calendarCell\n\t\t}\n\t};\n}, pr = { key: 0 }, mr = /* @__PURE__ */ d({\n\t__name: \"DatePicker\",\n\tprops: /*@__PURE__*/ h({\n\t\tcollapse: { type: Boolean },\n\t\tmenuWrapRef: {},\n\t\tnoOverlayFocus: { type: Boolean }\n\t}, zt),\n\temits: [\n\t\t\"focus-menu\",\n\t\t\"select-date\",\n\t\t\"time-update\",\n\t\t\"auto-apply\"\n\t],\n\tsetup(t, { expose: n, emit: s }) {\n\t\tlet l = s, { month: d, year: p, modelValue: m, time: h, disabledTimesConfig: _, today: b, validateTime: x, getCalendarDays: S, getMarker: C, handleArrow: T, handleScroll: E, handleSwipe: D, selectDate: O, updateMonthYear: j, presetDate: M, updateTime: N, assignMonthAndYear: ee, setStartTime: te } = dr(l, de), z = F(), { setHoverDate: B, getDayClassData: V, clearHoverDate: ne } = fr(), { getDate: re, rootEmit: H, rootProps: U, defaults: { multiCalendars: W, timeConfig: ie } } = $(), { getYears: ae, getMonths: oe } = Jt(), { getCellId: G } = Gt(), K = I(\"calendar-header\"), q = I(\"calendar\"), J = I(\"time-picker\"), se = tn(z, Qt.Calendar), ce = tn(z, Qt.DatePickerHeader), le = tn(z, Qt.TimePicker);\n\t\tL(W, (e, t) => {\n\t\t\te.count - t.count > 0 && ee();\n\t\t}, { deep: !0 });\n\t\tlet ue = r(() => (e) => S(d.value(e), p.value(e)).map((e) => ({\n\t\t\t...e,\n\t\t\tdays: e.days.map((e) => (e.marker = C(e), e.classData = V(e), e))\n\t\t})));\n\t\tfunction de(e) {\n\t\t\te || e === 0 ? q.value?.[e]?.triggerTransition(d.value(e), p.value(e)) : q.value?.forEach((e, t) => e?.triggerTransition(d.value(t), p.value(t)));\n\t\t}\n\t\tlet fe = (e, t = 0) => {\n\t\t\tK.value?.[t]?.toggleMonthPicker(e);\n\t\t}, pe = (e, t = 0) => {\n\t\t\tK.value?.[t]?.toggleYearPicker(e);\n\t\t}, he = (e, t) => {\n\t\t\tJ.value?.toggleTimePicker(e, t);\n\t\t}, ge = (e, t) => {\n\t\t\tif (!U.range) {\n\t\t\t\tlet n = m.value ? m.value : b, r = t ? re(t) : n, i = e ? Re(r, { weekStartsOn: 1 }) : me(r, { weekStartsOn: 1 });\n\t\t\t\tO({\n\t\t\t\t\tvalue: i,\n\t\t\t\t\tcurrent: Y(r) === d.value(0),\n\t\t\t\t\ttext: \"\",\n\t\t\t\t\tclassData: {}\n\t\t\t\t}), document.getElementById(G(i))?.focus();\n\t\t\t}\n\t\t}, _e = (e) => {\n\t\t\tK.value?.[0]?.handleMonthYearChange(e, !0);\n\t\t}, ve = (e) => {\n\t\t\tj(0, {\n\t\t\t\tmonth: d.value(0),\n\t\t\t\tyear: p.value(0) + (e ? 1 : -1),\n\t\t\t\tfromNav: !0\n\t\t\t});\n\t\t}, ye = (e) => {\n\t\t\tH(\"overlay-toggle\", {\n\t\t\t\topen: !1,\n\t\t\t\toverlay: e\n\t\t\t}), l(\"focus-menu\");\n\t\t};\n\t\treturn n({\n\t\t\tclearHoverDate: ne,\n\t\t\tpresetDate: M,\n\t\t\thandleArrow: T,\n\t\t\tupdateMonthYear: j,\n\t\t\tsetStartTime: te,\n\t\t\ttoggleMonthPicker: fe,\n\t\t\ttoggleYearPicker: pe,\n\t\t\ttoggleTimePicker: he,\n\t\t\tgetSidebarProps: () => ({\n\t\t\t\tmodelValue: m,\n\t\t\t\tmonth: d,\n\t\t\t\tyear: p,\n\t\t\t\ttime: h,\n\t\t\t\tupdateTime: N,\n\t\t\t\tupdateMonthYear: j,\n\t\t\t\tselectDate: O,\n\t\t\t\tpresetDate: M\n\t\t\t}),\n\t\t\tchangeMonth: _e,\n\t\t\tchangeYear: ve,\n\t\t\tselectWeekDate: ge\n\t\t}), (n, r) => (w(), o(e, null, [u(Cn, { collapse: t.collapse }, {\n\t\t\tdefault: R(({ instances: s, wrapClass: l }) => [(w(!0), o(e, null, k(s, (e) => (w(), o(\"div\", {\n\t\t\t\tkey: e,\n\t\t\t\tclass: v(l)\n\t\t\t}, [P(U).hideMonthYearSelect ? a(\"\", !0) : (w(), i(nr, {\n\t\t\t\tkey: 0,\n\t\t\t\tref_for: !0,\n\t\t\t\tref: \"calendar-header\",\n\t\t\t\tmonths: P(oe)(),\n\t\t\t\tyears: P(ae)(),\n\t\t\t\tmonth: P(d)(e),\n\t\t\t\tyear: P(p)(e),\n\t\t\t\tinstance: e,\n\t\t\t\t\"menu-wrap-ref\": t.menuWrapRef,\n\t\t\t\tonUpdateMonthYear: (t) => P(j)(e, t),\n\t\t\t\tonOverlayClosed: ye\n\t\t\t}, c({ _: 2 }, [k(P(ce), (e) => ({\n\t\t\t\tname: e,\n\t\t\t\tfn: R((t) => [A(n.$slots, e, g({ ref_for: !0 }, t))])\n\t\t\t}))]), 1032, [\n\t\t\t\t\"months\",\n\t\t\t\t\"years\",\n\t\t\t\t\"month\",\n\t\t\t\t\"year\",\n\t\t\t\t\"instance\",\n\t\t\t\t\"menu-wrap-ref\",\n\t\t\t\t\"onUpdateMonthYear\"\n\t\t\t])), u(ur, {\n\t\t\t\tref_for: !0,\n\t\t\t\tref: \"calendar\",\n\t\t\t\t\"mapped-dates\": ue.value(e),\n\t\t\t\tinstance: e,\n\t\t\t\tmonth: P(d)(e),\n\t\t\t\tyear: P(p)(e),\n\t\t\t\tonSelectDate: (t) => P(O)(t, e !== 1),\n\t\t\t\tonSetHoverDate: r[0] ||= (e) => P(B)(e),\n\t\t\t\tonHandleScroll: (t) => P(E)(t, e),\n\t\t\t\tonHandleSwipe: (t) => P(D)(t, e)\n\t\t\t}, c({ _: 2 }, [k(P(se), (e) => ({\n\t\t\t\tname: e,\n\t\t\t\tfn: R((t) => [A(n.$slots, e, g({ ref_for: !0 }, t))])\n\t\t\t}))]), 1032, [\n\t\t\t\t\"mapped-dates\",\n\t\t\t\t\"instance\",\n\t\t\t\t\"month\",\n\t\t\t\t\"year\",\n\t\t\t\t\"onSelectDate\",\n\t\t\t\t\"onHandleScroll\",\n\t\t\t\t\"onHandleSwipe\"\n\t\t\t])], 2))), 128))]),\n\t\t\t_: 3\n\t\t}, 8, [\"collapse\"]), P(ie).enableTimePicker ? (w(), o(\"div\", pr, [A(n.$slots, \"time-picker\", y(f({\n\t\t\ttime: P(h),\n\t\t\tupdateTime: P(N)\n\t\t})), () => [u(Kn, {\n\t\t\tref: \"time-picker\",\n\t\t\thours: P(h).hours,\n\t\t\tminutes: P(h).minutes,\n\t\t\tseconds: P(h).seconds,\n\t\t\t\"disabled-times-config\": P(_),\n\t\t\t\"validate-time\": P(x),\n\t\t\t\"no-overlay-focus\": t.noOverlayFocus,\n\t\t\t\"onUpdate:hours\": r[1] ||= (e) => P(N)({\n\t\t\t\thours: e,\n\t\t\t\tminutes: P(h).minutes,\n\t\t\t\tseconds: P(h).seconds\n\t\t\t}),\n\t\t\t\"onUpdate:minutes\": r[2] ||= (e) => P(N)({\n\t\t\t\thours: P(h).hours,\n\t\t\t\tminutes: e,\n\t\t\t\tseconds: P(h).seconds\n\t\t\t}),\n\t\t\t\"onUpdate:seconds\": r[3] ||= (e) => P(N)({\n\t\t\t\thours: P(h).hours,\n\t\t\t\tminutes: P(h).minutes,\n\t\t\t\tseconds: e\n\t\t\t})\n\t\t}, c({ _: 2 }, [k(P(le), (e) => ({\n\t\t\tname: e,\n\t\t\tfn: R((t) => [A(n.$slots, e, y(f(t)))])\n\t\t}))]), 1032, [\n\t\t\t\"hours\",\n\t\t\t\"minutes\",\n\t\t\t\"seconds\",\n\t\t\t\"disabled-times-config\",\n\t\t\t\"validate-time\",\n\t\t\t\"no-overlay-focus\"\n\t\t])])])) : a(\"\", !0)], 64));\n\t}\n}), hr = (e) => {\n\tlet { getDate: t, modelValue: n, year: i, calendars: a, defaults: { highlight: o, range: s, multiDates: c } } = $(), { isDateBetween: l, isDateEqual: u } = Gt(), { checkRangeAutoApply: d, handleMultiDatesSelect: f, setMonthOrYearRange: p } = kn();\n\tmt();\n\tlet { isDisabled: m } = ht(), { formatQuarterText: h } = qt(), { childMount: g } = ut(), { groupedYears: _, showYearPicker: v, isDisabled: y, selectYear: b, toggleYearPicker: x, handleYearSelect: C, handleYear: w, setStartDate: T } = On(), E = O();\n\tS(() => {\n\t\tg(), T();\n\t});\n\tlet D = r(() => (e) => n.value ? Array.isArray(n.value) ? n.value.some((t) => Oe(e, t)) : Oe(n.value, e) : !1), k = (e) => {\n\t\tif (s.value.enabled) {\n\t\t\tif (Array.isArray(n.value)) {\n\t\t\t\tlet t = u(e, n.value[0]) || u(e, n.value[1]);\n\t\t\t\treturn l(n.value, E.value, e) && !t;\n\t\t\t}\n\t\t\treturn !1;\n\t\t}\n\t\treturn !1;\n\t}, A = (e, t) => e.quarter === xe(t) && e.year === X(t), j = (e) => typeof o.value == \"function\" ? o.value({\n\t\tquarter: xe(e),\n\t\tyear: X(e)\n\t}) : o.value.quarters.some((t) => A(t, e)), M = r(() => (e) => {\n\t\tlet n = Z(t(), { year: i.value(e) });\n\t\treturn fe({\n\t\t\tstart: ze(n),\n\t\t\tend: he(n)\n\t\t}).map((e) => {\n\t\t\tlet t = Le(e), n = pe(e), r = m(e), i = k(t), a = j(t);\n\t\t\treturn {\n\t\t\t\ttext: h(t, n),\n\t\t\t\tvalue: t,\n\t\t\t\tactive: D.value(t),\n\t\t\t\thighlighted: a,\n\t\t\t\tdisabled: r,\n\t\t\t\tisBetween: i\n\t\t\t};\n\t\t});\n\t}), N = (t) => {\n\t\tf(t, c.value.limit), e(\"auto-apply\", !0);\n\t}, ee = (t) => {\n\t\tn.value = p(t), d(n.value, e, n.value.length < 2);\n\t}, P = (t) => {\n\t\tn.value = t, e(\"auto-apply\");\n\t};\n\treturn {\n\t\tgroupedYears: _,\n\t\tyear: i,\n\t\tisDisabled: y,\n\t\tquarters: M,\n\t\tshowYearPicker: v,\n\t\tmodelValue: n,\n\t\tselectYear: b,\n\t\ttoggleYearPicker: x,\n\t\thandleYearSelect: C,\n\t\thandleYear: w,\n\t\tsetHoverDate: (e) => {\n\t\t\tE.value = e;\n\t\t},\n\t\tselectQuarter: (e, t, n) => {\n\t\t\tif (!n) return a.value[t].month = Y(pe(e)), c.value.enabled ? N(e) : s.value.enabled ? ee(e) : P(e);\n\t\t}\n\t};\n}, gr = { class: \"dp--quarter-items\" }, _r = [\n\t\"data-test-id\",\n\t\"disabled\",\n\t\"onClick\",\n\t\"onMouseover\"\n], vr = /* @__PURE__ */ d({\n\t__name: \"QuarterPicker\",\n\tprops: {\n\t\tcollapse: { type: Boolean },\n\t\tmenuWrapRef: {},\n\t\tnoOverlayFocus: { type: Boolean }\n\t},\n\temits: [\"auto-apply\"],\n\tsetup(t, { expose: n, emit: r }) {\n\t\tlet d = r, { defaults: { config: f } } = $(), p = F(), { boolHtmlAttribute: m } = Xt(), h = tn(p, Qt.YearMode), { groupedYears: _, year: y, isDisabled: x, quarters: S, modelValue: C, showYearPicker: T, setHoverDate: E, selectQuarter: D, toggleYearPicker: O, handleYearSelect: j, handleYear: N } = hr(d);\n\t\treturn n({\n\t\t\tgetSidebarProps: () => ({\n\t\t\t\tmodelValue: C,\n\t\t\t\tyear: y,\n\t\t\t\tselectQuarter: D,\n\t\t\t\thandleYearSelect: j,\n\t\t\t\thandleYear: N\n\t\t\t}),\n\t\t\ttoggleYearPicker: (e) => O(0, e)\n\t\t}), (n, r) => (w(), i(Cn, {\n\t\t\tcollapse: t.collapse,\n\t\t\tstretch: \"\"\n\t\t}, {\n\t\t\tdefault: R(({ instances: t, wrapClass: r }) => [(w(!0), o(e, null, k(t, (t) => (w(), o(\"div\", {\n\t\t\t\tkey: t,\n\t\t\t\tclass: v(r)\n\t\t\t}, [s(\"div\", {\n\t\t\t\tclass: \"dp-quarter-picker-wrap\",\n\t\t\t\tstyle: b({ minHeight: `${P(f).modeHeight}px` })\n\t\t\t}, [\n\t\t\t\tn.$slots[\"top-extra\"] ? A(n.$slots, \"top-extra\", {\n\t\t\t\t\tkey: 0,\n\t\t\t\t\tvalue: P(C)\n\t\t\t\t}) : a(\"\", !0),\n\t\t\t\ts(\"div\", null, [u(Dn, {\n\t\t\t\t\titems: P(_)(t),\n\t\t\t\t\tinstance: t,\n\t\t\t\t\t\"show-year-picker\": P(T)[t],\n\t\t\t\t\tyear: P(y)(t),\n\t\t\t\t\t\"is-disabled\": (e) => P(x)(t, e),\n\t\t\t\t\tonHandleYear: (e) => P(N)(t, e),\n\t\t\t\t\tonYearSelect: (e) => P(j)(e, t),\n\t\t\t\t\tonToggleYearPicker: (e) => P(O)(t, e?.show)\n\t\t\t\t}, c({ _: 2 }, [k(P(h), (e) => ({\n\t\t\t\t\tname: e,\n\t\t\t\t\tfn: R((t) => [A(n.$slots, e, g({ ref_for: !0 }, t))])\n\t\t\t\t}))]), 1032, [\n\t\t\t\t\t\"items\",\n\t\t\t\t\t\"instance\",\n\t\t\t\t\t\"show-year-picker\",\n\t\t\t\t\t\"year\",\n\t\t\t\t\t\"is-disabled\",\n\t\t\t\t\t\"onHandleYear\",\n\t\t\t\t\t\"onYearSelect\",\n\t\t\t\t\t\"onToggleYearPicker\"\n\t\t\t\t])]),\n\t\t\t\ts(\"div\", gr, [(w(!0), o(e, null, k(P(S)(t), (e, r) => (w(), o(\"div\", { key: r }, [s(\"button\", {\n\t\t\t\t\ttype: \"button\",\n\t\t\t\t\tclass: v([\"dp--btn-base dp--qr-btn\", {\n\t\t\t\t\t\t\"dp--active\": e.active,\n\t\t\t\t\t\t\"dp--qr-btn-between\": e.isBetween,\n\t\t\t\t\t\t\"dp--qr-btn-disabled\": e.disabled,\n\t\t\t\t\t\t\"dp--highlighted\": e.highlighted\n\t\t\t\t\t}]),\n\t\t\t\t\t\"data-dp-action-element\": \"0\",\n\t\t\t\t\t\"data-test-id\": e.value,\n\t\t\t\t\tdisabled: P(m)(e.disabled),\n\t\t\t\t\tonClick: (n) => P(D)(e.value, t, e.disabled),\n\t\t\t\t\tonMouseover: (t) => P(E)(e.value)\n\t\t\t\t}, [A(n.$slots, \"quarter\", {\n\t\t\t\t\tvalue: e.value,\n\t\t\t\t\ttext: e.text\n\t\t\t\t}, () => [l(M(e.text), 1)])], 42, _r)]))), 128))])\n\t\t\t], 4)], 2))), 128))]),\n\t\t\t_: 3\n\t\t}, 8, [\"collapse\"]));\n\t}\n}), yr = [\n\t\"id\",\n\t\"tabindex\",\n\t\"role\",\n\t\"aria-label\",\n\t\"aria-modal\"\n], br = {\n\tkey: 0,\n\tclass: \"dp--menu-load-container\"\n}, xr = {\n\tkey: 1,\n\tclass: \"dp--menu-header\"\n}, Sr = [\"data-dp-mobile\"], Cr = {\n\tkey: 0,\n\tclass: \"dp--sidebar-left\"\n}, wr = [\"data-dp-mobile\"], Tr = [\n\t\"data-test-id\",\n\t\"data-dp-mobile\",\n\t\"onClick\",\n\t\"onKeydown\"\n], Er = { class: \"dp--instance-calendar\" }, Dr = {\n\tkey: 2,\n\tclass: \"dp--sidebar-right\"\n}, Or = {\n\tkey: 2,\n\tclass: \"dp--action-extra\"\n}, kr = /* @__PURE__ */ d({\n\t__name: \"DatepickerMenu\",\n\tprops: {\n\t\tcollapse: { type: Boolean },\n\t\tnoOverlayFocus: { type: Boolean },\n\t\tgetInputRect: { type: Function }\n\t},\n\temits: [\n\t\t\"close-picker\",\n\t\t\"select-date\",\n\t\t\"auto-apply\",\n\t\t\"time-update\",\n\t\t\"menu-blur\"\n\t],\n\tsetup(t, { expose: n, emit: l }) {\n\t\tlet u = l, d = F(), { state: p, rootProps: m, defaults: { textInput: h, inline: g, config: _, ui: x, ariaLabels: T }, rootEmit: E, setState: D } = $(), { isMobile: N } = Kt(), { handleEventPropagation: te, getElWithin: L, checkStopPropagation: z, checkKeyDown: B } = Wt(), { selectCurrentDate: ne } = ln();\n\t\tdt();\n\t\tlet H = I(\"inner-menu\"), U = I(\"dp-menu\"), W = I(\"dyn-cmp\"), ie = O(0), ae = O(!1), oe = O(!1), { executeFlow: G } = lt(W, u), K = (e) => {\n\t\t\toe.value = !0, _.value.allowPreventDefault && e.preventDefault(), z(e, _.value, !0);\n\t\t};\n\t\tS(() => {\n\t\t\tae.value = !0, q(), globalThis.addEventListener(\"resize\", q);\n\t\t\tlet e = re(U);\n\t\t\te && !h.value.enabled && !g.value.enabled && D(\"menuFocused\", !0), e && (e.addEventListener(\"pointerdown\", K), e.addEventListener(\"mousedown\", K), E(\"menu-mounted\", e)), document.addEventListener(\"mousedown\", we);\n\t\t}), C(() => {\n\t\t\tglobalThis.removeEventListener(\"resize\", q), document.removeEventListener(\"mousedown\", we);\n\t\t\tlet e = re(U);\n\t\t\te && (e.removeEventListener(\"pointerdown\", K), e.removeEventListener(\"mousedown\", K), E(\"menu-unmounted\", e));\n\t\t});\n\t\tlet q = () => {\n\t\t\tlet e = re(H);\n\t\t\te && (ie.value = e.getBoundingClientRect().width);\n\t\t}, J = r(() => m.monthPicker ? jn : m.yearPicker ? Nn : m.timePicker ? Yn : m.quarterPicker ? vr : mr), se = () => {\n\t\t\tlet e = re(U);\n\t\t\te && e.focus({ preventScroll: !0 });\n\t\t}, ce = r(() => W.value?.getSidebarProps() || {}), le = tn(d, Qt.ActionRow), ue = tn(d, Qt.PassTrough), de = r(() => ({\n\t\t\t\"dp--menu-unclickable dp--menu-disabled\": m.disabled,\n\t\t\t\"dp--menu-unclickable dp--menu-readonly\": m.readonly,\n\t\t\t\"dp--menu-unclickable dp-menu-loading\": m.loading\n\t\t})), fe = r(() => ({\n\t\t\t\"dp--menu\": !0,\n\t\t\t\"dp--menu-index\": !g.value.enabled,\n\t\t\t\"dp--relative\": g.value.enabled,\n\t\t\t...x.value.menu\n\t\t})), pe = (e) => {\n\t\t\tz(e, _.value, !0);\n\t\t}, me = (e) => {\n\t\t\t_.value.escClose && (u(\"close-picker\"), te(e, _.value));\n\t\t}, he = (e) => {\n\t\t\tm.arrowNavigation || (e === at.left || e === at.up ? ye(\"handleArrow\", at.left, 0, e === at.up) : ye(\"handleArrow\", at.right, 0, e === at.down));\n\t\t}, ge = (e) => {\n\t\t\tD(\"shiftKeyInMenu\", e.shiftKey), _.value.tabOutClosesMenu && !m.hideMonthYearSelect && e.code === Q.tab && e.target.classList.contains(\"dp--menu\") && p.shiftKeyInMenu && (e.preventDefault(), z(e, _.value, !0), u(\"close-picker\"));\n\t\t}, _e = (e) => {\n\t\t\tW.value?.toggleTimePicker(!1, !1), W.value?.toggleMonthPicker(!1, e), W.value?.toggleYearPicker(!1, e);\n\t\t}, ve = (e, t = 0) => e === \"month\" ? W.value?.toggleMonthPicker(!0, t) : e === \"year\" ? W.value?.toggleYearPicker(!0, t) : e === \"time\" ? W.value?.toggleTimePicker(!0) : _e(t), ye = (e, ...t) => {\n\t\t\tW.value?.[e] && W.value?.[e](...t);\n\t\t}, be = (e) => {\n\t\t\tye(\"presetDate\", ee(e));\n\t\t}, Y = () => {\n\t\t\tye(\"clearHoverDate\");\n\t\t}, xe = (e, t) => {\n\t\t\tye(\"updateMonthYear\", e, t);\n\t\t}, Se = (e, t) => {\n\t\t\te.preventDefault(), he(t);\n\t\t}, Ce = (e) => {\n\t\t\t_.value.allowPreventDefault && (e.preventDefault(), z(e, _.value, !0));\n\t\t}, X = (e) => {\n\t\t\tif (_.value.onInternalKeydown?.(e) !== !1) {\n\t\t\t\tif (ge(e), e.key === Q.home || e.key === Q.end) return ye(\"selectWeekDate\", e.key === Q.home, e.target.getAttribute(\"id\"));\n\t\t\t\tswitch ((e.key === Q.pageUp || e.key === Q.pageDown) && (e.shiftKey ? (ye(\"changeYear\", e.key === Q.pageUp), L(U.value, \"overlay-year\")?.focus()) : (ye(\"changeMonth\", e.key === Q.pageUp), L(U.value, e.key === Q.pageUp ? \"action-prev\" : \"action-next\")?.focus()), e.target.getAttribute(\"id\") && U.value?.focus({ preventScroll: !0 })), e.key) {\n\t\t\t\t\tcase Q.esc: return me(e);\n\t\t\t\t\tcase Q.enter: return Ce(e);\n\t\t\t\t\tcase Q.arrowLeft: return Se(e, at.left);\n\t\t\t\t\tcase Q.arrowRight: return Se(e, at.right);\n\t\t\t\t\tcase Q.arrowUp: return Se(e, at.up);\n\t\t\t\t\tcase Q.arrowDown: return Se(e, at.down);\n\t\t\t\t\tdefault: return;\n\t\t\t\t}\n\t\t\t}\n\t\t}, we = (e) => {\n\t\t\tg.value.enabled && !g.value.input && !U.value?.contains(e.target) && oe.value && (oe.value = !1, u(\"menu-blur\"));\n\t\t};\n\t\treturn n({\n\t\t\tupdateMonthYear: xe,\n\t\t\tswitchView: ve,\n\t\t\tonValueCleared: () => {\n\t\t\t\tW.value?.setStartTime?.();\n\t\t\t},\n\t\t\texecuteFlow: G\n\t\t}), (n, r) => (w(), o(\"div\", {\n\t\t\tid: P(m).menuId,\n\t\t\tref: \"dp-menu\",\n\t\t\ttabindex: P(g).enabled ? void 0 : \"0\",\n\t\t\trole: P(g).enabled ? void 0 : \"dialog\",\n\t\t\t\"aria-label\": P(T)?.menu,\n\t\t\t\"aria-modal\": P(g).enabled ? void 0 : !0,\n\t\t\tclass: v(fe.value),\n\t\t\tonMouseleave: Y,\n\t\t\tonClick: pe,\n\t\t\tonKeydown: X\n\t\t}, [\n\t\t\t(P(m).disabled || P(m).readonly) && P(g).enabled || P(m).loading ? (w(), o(\"div\", {\n\t\t\t\tkey: 0,\n\t\t\t\tclass: v(de.value)\n\t\t\t}, [P(m).loading ? (w(), o(\"div\", br, [...r[5] ||= [s(\"span\", { class: \"dp--menu-loader\" }, null, -1)]])) : a(\"\", !0)], 2)) : a(\"\", !0),\n\t\t\tn.$slots[\"menu-header\"] ? (w(), o(\"div\", xr, [A(n.$slots, \"menu-header\")])) : a(\"\", !0),\n\t\t\tA(n.$slots, \"arrow\"),\n\t\t\ts(\"div\", {\n\t\t\t\tref: \"inner-menu\",\n\t\t\t\tclass: v({\n\t\t\t\t\t\"dp--menu-content-wrapper\": P(m).presetDates?.length || !!n.$slots[\"left-sidebar\"] || !!n.$slots[\"right-sidebar\"],\n\t\t\t\t\t\"dp--menu-content-wrapper-collapsed\": t.collapse && (P(m).presetDates?.length || !!n.$slots[\"left-sidebar\"] || !!n.$slots[\"right-sidebar\"])\n\t\t\t\t}),\n\t\t\t\t\"data-dp-mobile\": P(N),\n\t\t\t\tstyle: b({ \"--dp-menu-width\": `${ie.value}px` })\n\t\t\t}, [\n\t\t\t\tn.$slots[\"left-sidebar\"] ? (w(), o(\"div\", Cr, [A(n.$slots, \"left-sidebar\", y(f(ce.value)))])) : a(\"\", !0),\n\t\t\t\tP(m).presetDates.length ? (w(), o(\"div\", {\n\t\t\t\t\tkey: 1,\n\t\t\t\t\tclass: v({\n\t\t\t\t\t\t\"dp--preset-dates-collapsed\": t.collapse,\n\t\t\t\t\t\t\"dp--preset-dates\": !0\n\t\t\t\t\t}),\n\t\t\t\t\t\"data-dp-mobile\": P(N)\n\t\t\t\t}, [(w(!0), o(e, null, k(P(m).presetDates, (r, i) => (w(), o(e, { key: i }, [r.slot ? A(n.$slots, r.slot, {\n\t\t\t\t\tkey: 0,\n\t\t\t\t\tpresetDate: be,\n\t\t\t\t\tlabel: r.label,\n\t\t\t\t\tvalue: r.value\n\t\t\t\t}) : (w(), o(\"button\", {\n\t\t\t\t\tkey: 1,\n\t\t\t\t\ttype: \"button\",\n\t\t\t\t\tstyle: b(r.style || {}),\n\t\t\t\t\tclass: v([\"dp--btn dp--preset-range\", { \"dp--preset-range-collapsed\": t.collapse }]),\n\t\t\t\t\t\"data-test-id\": r.testId ?? void 0,\n\t\t\t\t\t\"data-dp-mobile\": P(N),\n\t\t\t\t\tonClick: V((e) => be(r.value), [\"prevent\"]),\n\t\t\t\t\tonKeydown: (e) => P(B)(e, () => be(r.value), !0)\n\t\t\t\t}, M(r.label), 47, Tr))], 64))), 128))], 10, wr)) : a(\"\", !0),\n\t\t\t\ts(\"div\", Er, [(w(), i(j(J.value), {\n\t\t\t\t\tref: \"dyn-cmp\",\n\t\t\t\t\tcollapse: t.collapse,\n\t\t\t\t\t\"no-overlay-focus\": t.noOverlayFocus,\n\t\t\t\t\t\"menu-wrap-ref\": U.value,\n\t\t\t\t\tonFocusMenu: se,\n\t\t\t\t\tonSelectDate: r[0] ||= (e) => n.$emit(\"select-date\"),\n\t\t\t\t\tonAutoApply: r[1] ||= (e) => n.$emit(\"auto-apply\", e),\n\t\t\t\t\tonTimeUpdate: r[2] ||= (e) => n.$emit(\"time-update\")\n\t\t\t\t}, c({ _: 2 }, [k(P(ue), (e) => ({\n\t\t\t\t\tname: e,\n\t\t\t\t\tfn: R((t) => [A(n.$slots, e, y(f({ ...t })))])\n\t\t\t\t}))]), 1064, [\n\t\t\t\t\t\"collapse\",\n\t\t\t\t\t\"no-overlay-focus\",\n\t\t\t\t\t\"menu-wrap-ref\"\n\t\t\t\t]))]),\n\t\t\t\tn.$slots[\"right-sidebar\"] ? (w(), o(\"div\", Dr, [A(n.$slots, \"right-sidebar\", y(f(ce.value)))])) : a(\"\", !0)\n\t\t\t], 14, Sr),\n\t\t\tn.$slots[\"action-extra\"] ? (w(), o(\"div\", Or, [n.$slots[\"action-extra\"] ? A(n.$slots, \"action-extra\", {\n\t\t\t\tkey: 0,\n\t\t\t\tselectCurrentDate: P(ne)\n\t\t\t}) : a(\"\", !0)])) : a(\"\", !0),\n\t\t\t!P(m).autoApply || P(_).keepActionRow ? (w(), i(mn, {\n\t\t\t\tkey: 3,\n\t\t\t\t\"menu-mount\": ae.value,\n\t\t\t\t\"calendar-width\": ie.value,\n\t\t\t\tonClosePicker: r[3] ||= (e) => n.$emit(\"close-picker\"),\n\t\t\t\tonSelectDate: r[4] ||= (e) => n.$emit(\"select-date\"),\n\t\t\t\tonSelectNow: P(ne)\n\t\t\t}, c({ _: 2 }, [k(P(le), (e) => ({\n\t\t\t\tname: e,\n\t\t\t\tfn: R((t) => [A(n.$slots, e, y(f(t)))])\n\t\t\t}))]), 1032, [\n\t\t\t\t\"menu-mount\",\n\t\t\t\t\"calendar-width\",\n\t\t\t\t\"onSelectNow\"\n\t\t\t])) : a(\"\", !0)\n\t\t], 42, yr));\n\t}\n}), Ar = d({\n\tname: \"MaybeTeleport\",\n\tprops: {\n\t\tto: {\n\t\t\ttype: [String, Object],\n\t\t\tdefault: void 0\n\t\t},\n\t\tdisabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: !1\n\t\t}\n\t},\n\tsetup(e, { slots: n }) {\n\t\treturn () => {\n\t\t\tlet r = n.default?.();\n\t\t\treturn e.to && !e.disabled ? p(t, { to: e.to }, r) : r;\n\t\t};\n\t}\n}), jr = [\"data-dp-mobile\"], Mr = /* @__PURE__ */ d({\n\t__name: \"VueDatePicker\",\n\tsetup(e, { expose: t }) {\n\t\tlet { rootEmit: l, setState: d, inputValue: p, modelValue: m, rootProps: h, defaults: { inline: g, config: x, textInput: T, range: E, multiDates: D, teleport: j, floatingConfig: M, flow: ee } } = $(), { validateDate: te, isValidTime: z } = ht(), { menuTransition: B, showTransition: V } = pt(), { isMobile: re } = Kt(), { findNextFocusableElement: H, getNumVal: U } = Wt(), q = F(), J = O(!1), se = O(g.value.enabled), ce = O(g.value.enabled || h.centered), le = N(h, \"modelValue\"), ue = N(h, \"timezone\"), de = I(\"dp-menu-wrap\"), fe = I(\"dp-menu\"), pe = I(\"input-cmp\"), me = I(\"picker-wrapper\"), he = I(\"menu-arrow\"), ge = O(!1), _e = O(!1), ve = O(!1), ye = O(!0), { floatingStyles: be, middlewareData: Y, placement: xe, y: Se } = K(pe, de, {\n\t\t\tstrategy: M.value.strategy,\n\t\t\tplacement: M.value.placement,\n\t\t\tmiddleware: ((e) => (M.value.flip && e.push(ae(typeof M.value.flip == \"object\" ? M.value.flip : {})), M.value.shift && e.push(G(typeof M.value.shift == \"object\" ? M.value.shift : {})), M.value.arrow && e.push(W({ element: M.value.arrow === !0 ? he : M.value.arrow })), e))([oe(M.value.offset)]),\n\t\t\twhileElementsMounted: ie\n\t\t});\n\t\tS(() => {\n\t\t\twe(h.modelValue), _().then(() => {\n\t\t\t\tg.value.enabled || globalThis.addEventListener(\"resize\", Me);\n\t\t\t}), g.value.enabled && (J.value = !0), globalThis.addEventListener(\"keyup\", Ne), globalThis.addEventListener(\"keydown\", Pe);\n\t\t}), C(() => {\n\t\t\tg.value.enabled || globalThis.removeEventListener(\"resize\", Me), globalThis.removeEventListener(\"keyup\", Ne), globalThis.removeEventListener(\"keydown\", Pe);\n\t\t});\n\t\tlet Ce = nn(q, h.presetDates), X = tn(q, Qt.Input);\n\t\tL([le, ue], () => {\n\t\t\twe(le.value);\n\t\t}, { deep: !0 }), L([xe, Se], () => {\n\t\t\t!g.value.enabled && !h.centered && ye.value && (ce.value = !1, _().then(() => {\n\t\t\t\tye.value = !1, ce.value = !0;\n\t\t\t}));\n\t\t});\n\t\tlet { parseExternalModelValue: we, emitModelValue: Te, formatInputValue: Ee, checkBeforeEmit: De } = ft(), Oe = r(() => ({\n\t\t\t\"dp--main\": !0,\n\t\t\t\"dp--theme-dark\": h.dark,\n\t\t\t\"dp--theme-light\": !h.dark,\n\t\t\t\"dp--flex-display\": g.value.enabled,\n\t\t\t\"dp--flex-display-collapsed\": ve.value,\n\t\t\t\"dp--flex-display-with-input\": g.value.input\n\t\t})), ke = r(() => h.dark ? \"dp--theme-dark\" : \"dp--theme-light\"), Ae = r(() => g.value.enabled && (h.timePicker || h.monthPicker || h.yearPicker || h.quarterPicker)), je = () => pe.value?.$el?.getBoundingClientRect() ?? {\n\t\t\twidth: 0,\n\t\t\tleft: 0,\n\t\t\tright: 0\n\t\t}, Z = () => {\n\t\t\tJ.value && x.value.closeOnScroll && Ue();\n\t\t}, Me = () => {\n\t\t\tlet e = fe.value?.$el.getBoundingClientRect().width ?? 0;\n\t\t\tve.value = document.body.offsetWidth <= e;\n\t\t}, Ne = (e) => {\n\t\t\tif (e.key === \"Tab\" && !g.value.enabled && x.value.tabOutClosesMenu) {\n\t\t\t\tlet e = me.value?.contains(document.activeElement), t = de.value?.contains(document.activeElement);\n\t\t\t\t!e && !t && Ue();\n\t\t\t}\n\t\t\t_e.value = e.shiftKey;\n\t\t}, Pe = (e) => {\n\t\t\t_e.value = e.shiftKey;\n\t\t}, Fe = () => {\n\t\t\t!h.disabled && !h.readonly && (ye.value = !0, se.value = !0, J.value = !0, J.value && l(\"open\"), J.value || He(), we(h.modelValue));\n\t\t}, Ie = () => {\n\t\t\tp.value = \"\", He(), fe.value?.onValueCleared(), pe.value?.setParsedDate(null), l(\"update:model-value\", null), l(\"cleared\"), x.value.closeOnClearValue && Ue();\n\t\t}, Le = () => {\n\t\t\tlet e = m.value;\n\t\t\treturn !e || !Array.isArray(e) && te(e) ? !0 : Array.isArray(e) ? D.value.enabled || e.length === 2 && te(e[0]) && te(e[1]) ? !0 : E.value.partialRange && !h.timePicker ? te(e[0]) : !1 : !1;\n\t\t}, Re = () => {\n\t\t\tDe() && Le() ? (Te(), Ue()) : l(\"invalid-select\");\n\t\t}, ze = (e) => {\n\t\t\tBe(), Te(), x.value.closeOnAutoApply && !e && Ue();\n\t\t}, Be = () => {\n\t\t\tpe.value && T.value.enabled && pe.value.setParsedDate(m.value);\n\t\t}, Ve = (e = !1) => {\n\t\t\th.autoApply && z(m.value) && Le() && (E.value.enabled && Array.isArray(m.value) ? (E.value.partialRange || m.value.length === 2) && ze(e) : ze(e));\n\t\t}, He = () => {\n\t\t\tT.value.enabled || (m.value = null);\n\t\t}, Ue = (e = !1) => {\n\t\t\tye.value = !0, e && m.value && x.value.setDateOnMenuClose && Re(), g.value.enabled || (J.value && (J.value = !1, d(\"menuFocused\", !1), d(\"shiftKeyInMenu\", !1), l(\"closed\"), p.value && we(le.value)), He(), l(\"blur\"));\n\t\t}, We = () => {\n\t\t\t!g.value.enabled && !J.value && (se.value = !1);\n\t\t}, Ge = (e, t, n = !1) => {\n\t\t\tif (!e) {\n\t\t\t\tm.value = null;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlet r = Array.isArray(e) ? e.every((e) => te(e)) : te(e), i = z(e);\n\t\t\tr && i ? (d(\"isTextInputDate\", !0), m.value = e, t ? (ge.value = n, Re(), l(\"text-submit\")) : h.autoApply && Ve(!0), _().then(() => {\n\t\t\t\td(\"isTextInputDate\", !1);\n\t\t\t})) : l(\"invalid-date\", e);\n\t\t}, Ke = () => {\n\t\t\th.autoApply && z(m.value) && Te(), Be();\n\t\t}, qe = () => J.value ? Ue() : Fe(), Je = (e) => {\n\t\t\tm.value = e;\n\t\t}, Ye = () => {\n\t\t\tT.value.enabled && (d(\"isInputFocused\", !0), Ee()), l(\"focus\");\n\t\t}, Xe = () => {\n\t\t\tT.value.enabled && (d(\"isInputFocused\", !1), we(h.modelValue), ge.value && H(me.value, _e.value)?.focus()), l(\"blur\");\n\t\t}, Ze = (e, t) => {\n\t\t\tfe.value && fe.value.updateMonthYear(t ?? 0, {\n\t\t\t\tmonth: U(e.month),\n\t\t\t\tyear: U(e.year)\n\t\t\t});\n\t\t}, Qe = (e) => {\n\t\t\twe(e ?? h.modelValue);\n\t\t}, $e = (e, t) => {\n\t\t\tfe.value?.switchView(e, t);\n\t\t}, et = (e, t) => {\n\t\t\tif (J.value) return x.value.onClickOutside ? x.value.onClickOutside(e, t) : Ue(!0);\n\t\t};\n\t\treturn ne(de, (e) => et(Le, e), { ignore: [pe] }), t({\n\t\t\tcloseMenu: Ue,\n\t\t\tselectDate: Re,\n\t\t\tclearValue: Ie,\n\t\t\topenMenu: Fe,\n\t\t\tonScroll: Z,\n\t\t\tformatInputValue: Ee,\n\t\t\tupdateInternalModelValue: Je,\n\t\t\tsetMonthYear: Ze,\n\t\t\tparseModel: Qe,\n\t\t\tswitchView: $e,\n\t\t\ttoggleMenu: qe,\n\t\t\texecuteFlow: (e) => {\n\t\t\t\tfe.value?.executeFlow(e ?? ee.value?.steps?.at(0));\n\t\t\t},\n\t\t\tgetDpWrapMenuRef: () => de,\n\t\t\tdpMenuRef: () => fe,\n\t\t\tdpWrapMenuRef: () => de,\n\t\t\tinputRef: () => pe\n\t\t}), (e, t) => (w(), o(\"div\", {\n\t\t\tref: \"picker-wrapper\",\n\t\t\tclass: v(Oe.value),\n\t\t\t\"data-datepicker-instance\": \"\",\n\t\t\t\"data-dp-mobile\": P(re)\n\t\t}, [u(cn, {\n\t\t\tref: \"input-cmp\",\n\t\t\t\"is-menu-open\": J.value,\n\t\t\tonClear: Ie,\n\t\t\tonOpen: Fe,\n\t\t\tonSetInputDate: Ge,\n\t\t\tonSetEmptyDate: P(Te),\n\t\t\tonSelectDate: Re,\n\t\t\tonToggle: qe,\n\t\t\tonClose: Ue,\n\t\t\tonFocus: Ye,\n\t\t\tonBlur: Xe,\n\t\t\tonRealBlur: t[0] ||= (e) => P(d)(\"isInputFocused\", !1)\n\t\t}, c({ _: 2 }, [k(P(X), (t) => ({\n\t\t\tname: t,\n\t\t\tfn: R((n) => [A(e.$slots, t, y(f(n)))])\n\t\t}))]), 1032, [\"is-menu-open\", \"onSetEmptyDate\"]), u(P(Ar), {\n\t\t\tto: P(j),\n\t\t\tdisabled: !P(j)\n\t\t}, {\n\t\t\tdefault: R(() => [se.value ? (w(), o(\"div\", {\n\t\t\t\tkey: 0,\n\t\t\t\tref: \"dp-menu-wrap\",\n\t\t\t\tclass: v({\n\t\t\t\t\t\"dp--menu-wrapper\": !P(g).enabled,\n\t\t\t\t\t\"dp--outer-menu-wrap\": !0,\n\t\t\t\t\t\"dp--centered\": P(h).centered\n\t\t\t\t}),\n\t\t\t\tstyle: b(!P(g).enabled && !P(h).centered ? P(be) : void 0)\n\t\t\t}, [u(n, {\n\t\t\t\tname: P(B)(P(xe).startsWith(\"top\")),\n\t\t\t\tcss: P(V) && !P(g).enabled && !P(h).centered && ce.value,\n\t\t\t\tappear: \"\",\n\t\t\t\tonAfterLeave: We\n\t\t\t}, {\n\t\t\t\tdefault: R(() => [J.value && ce.value ? (w(), i(kr, {\n\t\t\t\t\tkey: 0,\n\t\t\t\t\tref: \"dp-menu\",\n\t\t\t\t\tclass: v({ [ke.value]: !0 }),\n\t\t\t\t\t\"no-overlay-focus\": Ae.value,\n\t\t\t\t\tcollapse: ve.value,\n\t\t\t\t\t\"get-input-rect\": je,\n\t\t\t\t\tonClosePicker: Ue,\n\t\t\t\t\tonSelectDate: Re,\n\t\t\t\t\tonAutoApply: Ve,\n\t\t\t\t\tonTimeUpdate: Ke,\n\t\t\t\t\tonMenuBlur: t[1] ||= (e) => P(l)(\"blur\")\n\t\t\t\t}, c({ _: 2 }, [k(P(Ce), (t) => ({\n\t\t\t\t\tname: t,\n\t\t\t\t\tfn: R((n) => [A(e.$slots, t, y(f({ ...n })))])\n\t\t\t\t})), !P(g).enabled && !P(h).centered && P(M).arrow === !0 ? {\n\t\t\t\t\tname: \"arrow\",\n\t\t\t\t\tfn: R(() => [s(\"div\", {\n\t\t\t\t\t\tref: \"menu-arrow\",\n\t\t\t\t\t\tclass: v({\n\t\t\t\t\t\t\t\"dp--arrow-top\": P(xe).includes(\"bottom\"),\n\t\t\t\t\t\t\t\"dp--arrow-bottom\": P(xe).includes(\"top\")\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tstyle: b({\n\t\t\t\t\t\t\tleft: P(Y).arrow?.x == null ? \"\" : `${P(Y).arrow.x - P(Y).arrow.centerOffset}px`,\n\t\t\t\t\t\t\ttop: P(Y).arrow?.y == null ? \"\" : `${P(Y).arrow.y}px`\n\t\t\t\t\t\t})\n\t\t\t\t\t}, null, 6)]),\n\t\t\t\t\tkey: \"0\"\n\t\t\t\t} : void 0]), 1032, [\n\t\t\t\t\t\"class\",\n\t\t\t\t\t\"no-overlay-focus\",\n\t\t\t\t\t\"collapse\"\n\t\t\t\t])) : a(\"\", !0)]),\n\t\t\t\t_: 3\n\t\t\t}, 8, [\"name\", \"css\"])], 6)) : a(\"\", !0)]),\n\t\t\t_: 3\n\t\t}, 8, [\"to\", \"disabled\"])], 10, jr));\n\t}\n}), Nr = /* @__PURE__ */ d({\n\t__name: \"VueDatePickerRoot\",\n\tprops: /*@__PURE__*/ h({\n\t\tmultiCalendars: { type: [\n\t\t\tBoolean,\n\t\t\tNumber,\n\t\t\tString,\n\t\t\tObject\n\t\t] },\n\t\tmodelValue: {},\n\t\tmodelType: {},\n\t\tdark: { type: Boolean },\n\t\ttransitions: { type: [Boolean, Object] },\n\t\tariaLabels: {},\n\t\thideNavigation: {},\n\t\ttimezone: {},\n\t\tvertical: { type: Boolean },\n\t\thideMonthYearSelect: { type: Boolean },\n\t\tdisableYearSelect: { type: Boolean },\n\t\tyearRange: {},\n\t\tautoApply: { type: Boolean },\n\t\tdisabledDates: { type: [Array, Function] },\n\t\tstartDate: {},\n\t\thideOffsetDates: { type: Boolean },\n\t\tnoToday: { type: Boolean },\n\t\tallowedDates: {},\n\t\tmarkers: {},\n\t\tpresetDates: {},\n\t\tflow: {},\n\t\tpreventMinMaxNavigation: { type: Boolean },\n\t\treverseYears: { type: Boolean },\n\t\tweekPicker: { type: Boolean },\n\t\tfilters: {},\n\t\tarrowNavigation: { type: Boolean },\n\t\thighlight: { type: [Function, Object] },\n\t\tteleport: { type: [Boolean, String] },\n\t\tcentered: { type: Boolean },\n\t\tlocale: {},\n\t\tweekStart: {},\n\t\tweekNumbers: { type: [Boolean, Object] },\n\t\tdayNames: { type: [Function, Array] },\n\t\tmonthPicker: { type: Boolean },\n\t\tyearPicker: { type: Boolean },\n\t\tmodelAuto: { type: Boolean },\n\t\tformats: {},\n\t\tmultiDates: { type: [Boolean, Object] },\n\t\tminDate: {},\n\t\tmaxDate: {},\n\t\tminTime: {},\n\t\tmaxTime: {},\n\t\tinputAttrs: {},\n\t\ttimeConfig: {},\n\t\tplaceholder: {},\n\t\ttimePicker: { type: Boolean },\n\t\trange: { type: [Boolean, Object] },\n\t\tmenuId: {},\n\t\tdisabled: { type: Boolean },\n\t\treadonly: { type: Boolean },\n\t\tinline: { type: [Boolean, Object] },\n\t\ttextInput: { type: [Boolean, Object] },\n\t\tsixWeeks: { type: [Boolean, String] },\n\t\tactionRow: {},\n\t\tfocusStartDate: { type: Boolean },\n\t\tdisabledTimes: { type: [Function, Array] },\n\t\tcalendar: { type: Function },\n\t\tconfig: {},\n\t\tquarterPicker: { type: Boolean },\n\t\tyearFirst: { type: Boolean },\n\t\tloading: { type: Boolean },\n\t\tui: {},\n\t\tfloating: {}\n\t}, Bt),\n\temits: [\n\t\t\"update:model-value\",\n\t\t\"internal-model-change\",\n\t\t\"text-submit\",\n\t\t\"text-input\",\n\t\t\"open\",\n\t\t\"closed\",\n\t\t\"focus\",\n\t\t\"blur\",\n\t\t\"cleared\",\n\t\t\"flow-step\",\n\t\t\"update-month-year\",\n\t\t\"invalid-select\",\n\t\t\"invalid-fixed-range\",\n\t\t\"invalid-date\",\n\t\t\"tooltip-open\",\n\t\t\"tooltip-close\",\n\t\t\"am-pm-change\",\n\t\t\"range-start\",\n\t\t\"range-end\",\n\t\t\"date-click\",\n\t\t\"overlay-toggle\",\n\t\t\"invalid\",\n\t\t\"menu-mounted\",\n\t\t\"menu-unmounted\"\n\t],\n\tsetup(e, { expose: t, emit: n }) {\n\t\tlet r = n, a = e;\n\t\tet(a, r);\n\t\tlet o = nn(F(), a.presetDates);\n\t\treturn t(Yt(I(\"date-picker\"))), (e, t) => (w(), i(Mr, { ref: \"date-picker\" }, c({ _: 2 }, [k(P(o), (t) => ({\n\t\t\tname: t,\n\t\t\tfn: R((n) => [A(e.$slots, t, y(f(n)))])\n\t\t}))]), 1536));\n\t}\n});\n//#endregion\nexport { We as TZDate, Nr as VueDatePicker, st as WeekStart };\n","const formatDistanceLocale = {\n  lessThanXSeconds: {\n    one: \"minder dan een seconde\",\n    other: \"minder dan {{count}} seconden\",\n  },\n\n  xSeconds: {\n    one: \"1 seconde\",\n    other: \"{{count}} seconden\",\n  },\n\n  halfAMinute: \"een halve minuut\",\n\n  lessThanXMinutes: {\n    one: \"minder dan een minuut\",\n    other: \"minder dan {{count}} minuten\",\n  },\n\n  xMinutes: {\n    one: \"een minuut\",\n    other: \"{{count}} minuten\",\n  },\n\n  aboutXHours: {\n    one: \"ongeveer 1 uur\",\n    other: \"ongeveer {{count}} uur\",\n  },\n\n  xHours: {\n    one: \"1 uur\",\n    other: \"{{count}} uur\",\n  },\n\n  xDays: {\n    one: \"1 dag\",\n    other: \"{{count}} dagen\",\n  },\n\n  aboutXWeeks: {\n    one: \"ongeveer 1 week\",\n    other: \"ongeveer {{count}} weken\",\n  },\n\n  xWeeks: {\n    one: \"1 week\",\n    other: \"{{count}} weken\",\n  },\n\n  aboutXMonths: {\n    one: \"ongeveer 1 maand\",\n    other: \"ongeveer {{count}} maanden\",\n  },\n\n  xMonths: {\n    one: \"1 maand\",\n    other: \"{{count}} maanden\",\n  },\n\n  aboutXYears: {\n    one: \"ongeveer 1 jaar\",\n    other: \"ongeveer {{count}} jaar\",\n  },\n\n  xYears: {\n    one: \"1 jaar\",\n    other: \"{{count}} jaar\",\n  },\n\n  overXYears: {\n    one: \"meer dan 1 jaar\",\n    other: \"meer dan {{count}} jaar\",\n  },\n\n  almostXYears: {\n    one: \"bijna 1 jaar\",\n    other: \"bijna {{count}} jaar\",\n  },\n};\n\nexport const formatDistance = (token, count, options) => {\n  let result;\n\n  const tokenValue = formatDistanceLocale[token];\n  if (typeof tokenValue === \"string\") {\n    result = tokenValue;\n  } else if (count === 1) {\n    result = tokenValue.one;\n  } else {\n    result = tokenValue.other.replace(\"{{count}}\", String(count));\n  }\n\n  if (options?.addSuffix) {\n    if (options.comparison && options.comparison > 0) {\n      return \"over \" + result;\n    } else {\n      return result + \" geleden\";\n    }\n  }\n\n  return result;\n};\n","import { buildFormatLongFn } from \"../../_lib/buildFormatLongFn.js\";\n\nconst dateFormats = {\n  full: \"EEEE d MMMM y\",\n  long: \"d MMMM y\",\n  medium: \"d MMM y\",\n  short: \"dd-MM-y\",\n};\n\nconst timeFormats = {\n  full: \"HH:mm:ss zzzz\",\n  long: \"HH:mm:ss z\",\n  medium: \"HH:mm:ss\",\n  short: \"HH:mm\",\n};\n\nconst dateTimeFormats = {\n  full: \"{{date}} 'om' {{time}}\",\n  long: \"{{date}} 'om' {{time}}\",\n  medium: \"{{date}}, {{time}}\",\n  short: \"{{date}}, {{time}}\",\n};\n\nexport const formatLong = {\n  date: buildFormatLongFn({\n    formats: dateFormats,\n    defaultWidth: \"full\",\n  }),\n\n  time: buildFormatLongFn({\n    formats: timeFormats,\n    defaultWidth: \"full\",\n  }),\n\n  dateTime: buildFormatLongFn({\n    formats: dateTimeFormats,\n    defaultWidth: \"full\",\n  }),\n};\n","const formatRelativeLocale = {\n  lastWeek: \"'afgelopen' eeee 'om' p\",\n  yesterday: \"'gisteren om' p\",\n  today: \"'vandaag om' p\",\n  tomorrow: \"'morgen om' p\",\n  nextWeek: \"eeee 'om' p\",\n  other: \"P\",\n};\n\nexport const formatRelative = (token, _date, _baseDate, _options) =>\n  formatRelativeLocale[token];\n","import { buildLocalizeFn } from \"../../_lib/buildLocalizeFn.js\";\n\nconst eraValues = {\n  narrow: [\"v.C.\", \"n.C.\"],\n  abbreviated: [\"v.Chr.\", \"n.Chr.\"],\n  wide: [\"voor Christus\", \"na Christus\"],\n};\n\nconst quarterValues = {\n  narrow: [\"1\", \"2\", \"3\", \"4\"],\n  abbreviated: [\"K1\", \"K2\", \"K3\", \"K4\"],\n  wide: [\"1e kwartaal\", \"2e kwartaal\", \"3e kwartaal\", \"4e kwartaal\"],\n};\n\nconst monthValues = {\n  narrow: [\"J\", \"F\", \"M\", \"A\", \"M\", \"J\", \"J\", \"A\", \"S\", \"O\", \"N\", \"D\"],\n  abbreviated: [\n    \"jan.\",\n    \"feb.\",\n    \"mrt.\",\n    \"apr.\",\n    \"mei\",\n    \"jun.\",\n    \"jul.\",\n    \"aug.\",\n    \"sep.\",\n    \"okt.\",\n    \"nov.\",\n    \"dec.\",\n  ],\n\n  wide: [\n    \"januari\",\n    \"februari\",\n    \"maart\",\n    \"april\",\n    \"mei\",\n    \"juni\",\n    \"juli\",\n    \"augustus\",\n    \"september\",\n    \"oktober\",\n    \"november\",\n    \"december\",\n  ],\n};\n\nconst dayValues = {\n  narrow: [\"Z\", \"M\", \"D\", \"W\", \"D\", \"V\", \"Z\"],\n  short: [\"zo\", \"ma\", \"di\", \"wo\", \"do\", \"vr\", \"za\"],\n  abbreviated: [\"zon\", \"maa\", \"din\", \"woe\", \"don\", \"vri\", \"zat\"],\n  wide: [\n    \"zondag\",\n    \"maandag\",\n    \"dinsdag\",\n    \"woensdag\",\n    \"donderdag\",\n    \"vrijdag\",\n    \"zaterdag\",\n  ],\n};\n\nconst dayPeriodValues = {\n  narrow: {\n    am: \"AM\",\n    pm: \"PM\",\n    midnight: \"middernacht\",\n    noon: \"het middaguur\",\n    morning: \"'s ochtends\",\n    afternoon: \"'s middags\",\n    evening: \"'s avonds\",\n    night: \"'s nachts\",\n  },\n  abbreviated: {\n    am: \"AM\",\n    pm: \"PM\",\n    midnight: \"middernacht\",\n    noon: \"het middaguur\",\n    morning: \"'s ochtends\",\n    afternoon: \"'s middags\",\n    evening: \"'s avonds\",\n    night: \"'s nachts\",\n  },\n  wide: {\n    am: \"AM\",\n    pm: \"PM\",\n    midnight: \"middernacht\",\n    noon: \"het middaguur\",\n    morning: \"'s ochtends\",\n    afternoon: \"'s middags\",\n    evening: \"'s avonds\",\n    night: \"'s nachts\",\n  },\n};\n\nconst ordinalNumber = (dirtyNumber, _options) => {\n  const number = Number(dirtyNumber);\n  return number + \"e\";\n};\n\nexport const localize = {\n  ordinalNumber,\n\n  era: buildLocalizeFn({\n    values: eraValues,\n    defaultWidth: \"wide\",\n  }),\n\n  quarter: buildLocalizeFn({\n    values: quarterValues,\n    defaultWidth: \"wide\",\n    argumentCallback: (quarter) => quarter - 1,\n  }),\n\n  month: buildLocalizeFn({\n    values: monthValues,\n    defaultWidth: \"wide\",\n  }),\n\n  day: buildLocalizeFn({\n    values: dayValues,\n    defaultWidth: \"wide\",\n  }),\n\n  dayPeriod: buildLocalizeFn({\n    values: dayPeriodValues,\n    defaultWidth: \"wide\",\n  }),\n};\n","import { buildMatchFn } from \"../../_lib/buildMatchFn.js\";\nimport { buildMatchPatternFn } from \"../../_lib/buildMatchPatternFn.js\";\n\nconst matchOrdinalNumberPattern = /^(\\d+)e?/i;\nconst parseOrdinalNumberPattern = /\\d+/i;\n\nconst matchEraPatterns = {\n  narrow: /^([vn]\\.? ?C\\.?)/,\n  abbreviated: /^([vn]\\. ?Chr\\.?)/,\n  wide: /^((voor|na) Christus)/,\n};\nconst parseEraPatterns = {\n  any: [/^v/, /^n/],\n};\n\nconst matchQuarterPatterns = {\n  narrow: /^[1234]/i,\n  abbreviated: /^K[1234]/i,\n  wide: /^[1234]e kwartaal/i,\n};\nconst parseQuarterPatterns = {\n  any: [/1/i, /2/i, /3/i, /4/i],\n};\n\nconst matchMonthPatterns = {\n  narrow: /^[jfmasond]/i,\n  abbreviated: /^(jan.|feb.|mrt.|apr.|mei|jun.|jul.|aug.|sep.|okt.|nov.|dec.)/i,\n  wide: /^(januari|februari|maart|april|mei|juni|juli|augustus|september|oktober|november|december)/i,\n};\nconst parseMonthPatterns = {\n  narrow: [\n    /^j/i,\n    /^f/i,\n    /^m/i,\n    /^a/i,\n    /^m/i,\n    /^j/i,\n    /^j/i,\n    /^a/i,\n    /^s/i,\n    /^o/i,\n    /^n/i,\n    /^d/i,\n  ],\n\n  any: [\n    /^jan/i,\n    /^feb/i,\n    /^m(r|a)/i,\n    /^apr/i,\n    /^mei/i,\n    /^jun/i,\n    /^jul/i,\n    /^aug/i,\n    /^sep/i,\n    /^okt/i,\n    /^nov/i,\n    /^dec/i,\n  ],\n};\n\nconst matchDayPatterns = {\n  narrow: /^[zmdwv]/i,\n  short: /^(zo|ma|di|wo|do|vr|za)/i,\n  abbreviated: /^(zon|maa|din|woe|don|vri|zat)/i,\n  wide: /^(zondag|maandag|dinsdag|woensdag|donderdag|vrijdag|zaterdag)/i,\n};\nconst parseDayPatterns = {\n  narrow: [/^z/i, /^m/i, /^d/i, /^w/i, /^d/i, /^v/i, /^z/i],\n  any: [/^zo/i, /^ma/i, /^di/i, /^wo/i, /^do/i, /^vr/i, /^za/i],\n};\n\nconst matchDayPeriodPatterns = {\n  any: /^(am|pm|middernacht|het middaguur|'s (ochtends|middags|avonds|nachts))/i,\n};\nconst parseDayPeriodPatterns = {\n  any: {\n    am: /^am/i,\n    pm: /^pm/i,\n    midnight: /^middernacht/i,\n    noon: /^het middaguur/i,\n    morning: /ochtend/i,\n    afternoon: /middag/i,\n    evening: /avond/i,\n    night: /nacht/i,\n  },\n};\n\nexport const match = {\n  ordinalNumber: buildMatchPatternFn({\n    matchPattern: matchOrdinalNumberPattern,\n    parsePattern: parseOrdinalNumberPattern,\n    valueCallback: (value) => parseInt(value, 10),\n  }),\n\n  era: buildMatchFn({\n    matchPatterns: matchEraPatterns,\n    defaultMatchWidth: \"wide\",\n    parsePatterns: parseEraPatterns,\n    defaultParseWidth: \"any\",\n  }),\n\n  quarter: buildMatchFn({\n    matchPatterns: matchQuarterPatterns,\n    defaultMatchWidth: \"wide\",\n    parsePatterns: parseQuarterPatterns,\n    defaultParseWidth: \"any\",\n    valueCallback: (index) => index + 1,\n  }),\n\n  month: buildMatchFn({\n    matchPatterns: matchMonthPatterns,\n    defaultMatchWidth: \"wide\",\n    parsePatterns: parseMonthPatterns,\n    defaultParseWidth: \"any\",\n  }),\n\n  day: buildMatchFn({\n    matchPatterns: matchDayPatterns,\n    defaultMatchWidth: \"wide\",\n    parsePatterns: parseDayPatterns,\n    defaultParseWidth: \"any\",\n  }),\n\n  dayPeriod: buildMatchFn({\n    matchPatterns: matchDayPeriodPatterns,\n    defaultMatchWidth: \"any\",\n    parsePatterns: parseDayPeriodPatterns,\n    defaultParseWidth: \"any\",\n  }),\n};\n","import { formatDistance } from \"./nl/_lib/formatDistance.js\";\nimport { formatLong } from \"./nl/_lib/formatLong.js\";\nimport { formatRelative } from \"./nl/_lib/formatRelative.js\";\nimport { localize } from \"./nl/_lib/localize.js\";\nimport { match } from \"./nl/_lib/match.js\";\n\n/**\n * @category Locales\n * @summary Dutch locale.\n * @language Dutch\n * @iso-639-2 nld\n * @author Jorik Tangelder [@jtangelder](https://github.com/jtangelder)\n * @author Ruben Stolk [@rubenstolk](https://github.com/rubenstolk)\n * @author Lode Vanhove [@bitcrumb](https://github.com/bitcrumb)\n * @author Edo Rivai [@edorivai](https://github.com/edorivai)\n * @author Niels Keurentjes [@curry684](https://github.com/curry684)\n * @author Stefan Vermaas [@stefanvermaas](https://github.com/stefanvermaas)\n */\nexport const nl = {\n  code: \"nl\",\n  formatDistance: formatDistance,\n  formatLong: formatLong,\n  formatRelative: formatRelative,\n  localize: localize,\n  match: match,\n  options: {\n    weekStartsOn: 1 /* Monday */,\n    firstWeekContainsDate: 4,\n  },\n};\n\n// Fallback for modularized imports:\nexport default nl;\n","<script setup lang=\"ts\">\nimport { computed, nextTick, ref, watch } from \"vue\";\nimport { VueDatePicker } from \"@vuepic/vue-datepicker\";\nimport { format, isValid, parse, parseISO } from \"date-fns\";\nimport { nl } from \"date-fns/locale/nl\";\nimport \"@vuepic/vue-datepicker/dist/main.css\";\n\ndefineOptions({ inheritAttrs: false });\nconst props = withDefaults(defineProps<{ id: string; modelValue: string; disabled?: boolean; required?: boolean }>(), {\n  disabled: false,\n  required: true,\n});\nconst emit = defineEmits<{\n  \"update:modelValue\": [value: string];\n  commit: [event: KeyboardEvent];\n}>();\nconst picker = ref<InstanceType<typeof VueDatePicker> | null>(null);\nconst input = ref<HTMLInputElement | null>(null);\nconst draft = ref(\"\");\nconst error = ref(\"\");\nconst maskTail = computed(() => /^(?:\\d{1,2}|\\d{2}-\\d{1,2}|\\d{2}-\\d{2}-\\d{1,3})$/.test(draft.value)\n  ? \"dd-mm-jjjj\".slice(draft.value.length) : \"\");\n\nwatch(() => props.modelValue, value => {\n  const parsed = parseISO(value);\n  draft.value = isValid(parsed) ? format(parsed, \"dd-MM-yyyy\") : value;\n  error.value = \"\";\n}, { immediate: true });\n\nfunction parseInput(): Date | null {\n  const match = draft.value.trim().match(/^(\\d{1,2})[-/](\\d{1,2})(?:[-/](\\d{4}))?$/);\n  if (!match) return null;\n  // Missing years use the current local year; date-fns rejects impossible calendar dates.\n  const value = [match[1], match[2], match[3] ?? String(new Date().getFullYear())].join(\"-\");\n  const parsed = parse(value, \"d-M-yyyy\", new Date());\n  return isValid(parsed) ? parsed : null;\n}\n\n/** Commit the visible draft before booking, so invalid text cannot reuse an earlier date. */\nfunction validate(): boolean {\n  if (!props.required && !draft.value.trim()) {\n    draft.value = \"\";\n    error.value = \"\";\n    emit(\"update:modelValue\", \"\");\n    return true;\n  }\n  const value = parseInput();\n  error.value = value ? \"\" : \"Vul een geldige datum in.\";\n  if (!value) return false;\n  draft.value = format(value, \"dd-MM-yyyy\");\n  emit(\"update:modelValue\", format(value, \"yyyy-MM-dd\"));\n  return true;\n}\n\nfunction focus(): void {\n  input.value?.focus();\n}\n\nfunction onInput(event: Event): void {\n  const field = event.target as HTMLInputElement;\n  const cursor = field.selectionStart ?? field.value.length;\n  let value = field.value.trim().replace(/[/.]/g, \"-\");\n  const iso = value.match(/^(\\d{4})-(\\d{2})-(\\d{2})$/);\n  if (iso) value = [iso[3], iso[2], iso[1]].join(\"-\");\n  const parts = value.split(\"-\");\n  const digits = value.replace(/-/g, \"\");\n  // Keep explicit short dates such as 3/4; compact typing uses fixed day/month slots.\n  const shortDate = parts.length > 1 && parts[0].length === 1\n    || parts.length > 2 && parts[1].length === 1;\n  if (!shortDate && /^\\d{1,8}$/.test(digits))\n    value = [digits.slice(0, 2), digits.slice(2, 4), digits.slice(4)].filter(Boolean).join(\"-\");\n  if (value !== field.value) {\n    const before = field.value.slice(0, cursor).replace(/\\D/g, \"\").length;\n    field.value = value;\n    const position = iso ? value.length : Math.min(value.length, before + (before > 2 ? 1 : 0) + (before > 4 ? 1 : 0));\n    field.setSelectionRange(position, position);\n  }\n  draft.value = value;\n  error.value = \"\";\n}\n\nfunction normalizeInput(): void {\n  // Do not move a submit button during its click by inserting an error on blur.\n  if (parseInput() || !props.required) validate();\n}\n\nfunction onSelected(value: string | null): void {\n  if (!value) return;\n  draft.value = format(parseISO(value), \"dd-MM-yyyy\");\n  error.value = \"\";\n  emit(\"update:modelValue\", value);\n  void nextTick(focus);\n}\n\nfunction onKeydown({ event, isMenuOpen }: { event: KeyboardEvent; isMenuOpen: boolean }): void {\n  if (event.key === \"Escape\" && isMenuOpen) {\n    event.preventDefault();\n    event.stopPropagation();\n    picker.value?.closeMenu();\n    return;\n  }\n  if (event.key === \"ArrowDown\") {\n    event.preventDefault();\n    event.stopPropagation();\n    validate();\n    picker.value?.openMenu();\n    return;\n  }\n  if (event.ctrlKey || event.metaKey || event.altKey || ![\"Enter\", \"Tab\"].includes(event.key)) return;\n  const valid = validate();\n  if (event.key === \"Enter\") {\n    event.preventDefault();\n    event.stopPropagation();\n    if (!valid) return;\n  }\n  // Tab may leave invalid text; processing still validates the draft and restores focus.\n  emit(\"commit\", event);\n}\n\nfunction onClosed(): void {\n  // Restore keyboard focus after an overlay disappears, without stealing outside-click focus.\n  const menu = document.getElementById(\"dp-menu-\" + props.id);\n  void nextTick(() => {\n    if (document.activeElement === document.body || menu?.contains(document.activeElement)) focus();\n  });\n}\n\ndefineExpose({ validate, focus });\n</script>\n\n<template>\n  <div class=\"hh-date-input\" :class=\"$attrs.class\">\n    <VueDatePicker\n      ref=\"picker\"\n      :model-value=\"modelValue\"\n      model-type=\"yyyy-MM-dd\"\n      :locale=\"nl\"\n      :formats=\"{ input: 'dd-MM-yyyy' }\"\n      :time-config=\"{ enableTimePicker: false }\"\n      :text-input=\"{ openMenu: false }\"\n      :input-attrs=\"{ clearable: false, hideInputIcon: true }\"\n      :ui=\"{ menu: 'hh-date-menu' }\"\n      :menu-id=\"'dp-menu-' + id\"\n      :aria-labels=\"{\n        menu: 'Datum kiezen', input: 'Datum', nextMonth: 'Volgende maand', prevMonth: 'Vorige maand',\n        nextYear: 'Volgend jaar', prevYear: 'Vorig jaar', openMonthsOverlay: 'Maand kiezen',\n        openYearsOverlay: 'Jaar kiezen', monthPicker: () => 'Maand kiezen', yearPicker: () => 'Jaar kiezen',\n        day: ({ value }) => format(value, 'EEEE d MMMM yyyy', { locale: nl }),\n      }\"\n      :week-start=\"1\"\n      :disabled=\"disabled\"\n      auto-apply\n      arrow-navigation\n      teleport\n      @update:model-value=\"onSelected\"\n      @closed=\"onClosed\"\n    >\n      <template #dp-input=\"{ isMenuOpen, onFocus, onBlur, toggleMenu }\">\n        <div class=\"hh-date-input__field\">\n          <input\n            v-bind=\"$attrs\"\n            :id=\"id\"\n            ref=\"input\"\n            :value=\"draft\"\n            type=\"text\"\n            role=\"combobox\"\n            class=\"hh-input hh-date-input__input\"\n            :class=\"{ 'hh-input--error': error }\"\n            placeholder=\"dd-mm-jjjj\"\n            inputmode=\"numeric\"\n            autocomplete=\"off\"\n            :disabled=\"disabled\"\n            :required=\"required\"\n            :aria-invalid=\"Boolean(error) || $attrs['aria-invalid'] === true || $attrs['aria-invalid'] === 'true'\"\n            :aria-describedby=\"error ? id + '-error' : undefined\"\n            :aria-controls=\"isMenuOpen ? 'dp-menu-' + id : undefined\"\n            aria-haspopup=\"dialog\"\n            :aria-expanded=\"isMenuOpen\"\n            @input=\"onInput\"\n            @focus=\"onFocus\"\n            @blur=\"normalizeInput(); onBlur()\"\n            @keydown=\"onKeydown({ event: $event, isMenuOpen })\"\n          />\n          <span v-if=\"maskTail\" class=\"hh-date-input__mask\" aria-hidden=\"true\"><span>{{ draft }}</span>{{ maskTail }}</span>\n          <button\n            class=\"hh-date-input__button\"\n            type=\"button\"\n            tabindex=\"-1\"\n            aria-label=\"Kalender openen\"\n            title=\"Kalender openen (pijl omlaag)\"\n            :disabled=\"disabled\"\n            :aria-expanded=\"isMenuOpen\"\n            @click.stop=\"toggleMenu\"\n          >\n            <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.75\" aria-hidden=\"true\">\n              <rect x=\"3\" y=\"5\" width=\"18\" height=\"16\" rx=\"2\" />\n              <path d=\"M16 3v4M8 3v4M3 11h18\" />\n            </svg>\n          </button>\n        </div>\n      </template>\n    </VueDatePicker>\n    <p v-if=\"error\" :id=\"id + '-error'\" class=\"hh-date-input__error\" role=\"alert\">{{ error }}</p>\n  </div>\n</template>\n\n<style scoped>\n.hh-date-input { width: 100%; min-width: 150px; }\n.hh-date-input__field { position: relative; }\n.hh-date-input__input { padding-right: 36px; font-weight: 400; }\n.hh-date-input__mask { position: absolute; left: 11px; top: 50%; transform: translateY(-50%); font: 400 14px var(--hh-font); color: var(--hh-fg-subtle); pointer-events: none; }\n.hh-date-input__mask > span { visibility: hidden; }\n.hh-date-input__button {\n  position: absolute;\n  inset: 1px 1px 1px auto;\n  width: 32px;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  padding: 0;\n  border: 0;\n  border-radius: var(--hh-radius);\n  background: transparent;\n  color: var(--hh-fg-muted);\n  cursor: pointer;\n}\n.hh-date-input__button:disabled { opacity: 0.5; cursor: default; }\n.hh-date-input__button:focus-visible { outline: 2px solid var(--hh-accent); }\n@media (hover: hover) {\n  .hh-date-input__button:hover:enabled { background: var(--hh-accent-soft); color: var(--hh-accent); }\n}\n.hh-date-input__error { margin: 4px 0 0; color: var(--hh-danger); font-size: 14px; font-weight: 400; }\n</style>\n\n<style>\n/* The teleported calendar cannot inherit the field's theme variables. */\n.hh-date-menu.dp--theme-light {\n  --dp-font-family: var(--hh-font);\n  --dp-font-size: 14px;\n  --dp-border-radius: var(--hh-radius);\n  --dp-background-color: var(--hh-surface);\n  --dp-text-color: var(--hh-fg);\n  --dp-primary-color: var(--hh-accent);\n  --dp-primary-text-color: var(--hh-accent-fg);\n  --dp-hover-color: var(--hh-accent-soft);\n  --dp-hover-text-color: var(--hh-fg);\n  --dp-hover-icon-color: var(--hh-accent);\n  --dp-secondary-color: var(--hh-fg-subtle);\n  --dp-icon-color: var(--hh-fg-muted);\n  --dp-border-color: var(--hh-line-strong);\n  --dp-menu-border-color: var(--hh-line-strong);\n}\n</style>\n","import { mergeProps as _mergeProps, createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, withModifiers as _withModifiers, withCtx as _withCtx, createVNode as _createVNode, normalizeClass as _normalizeClass } from \"vue\"\n\nconst _hoisted_1 = { class: \"hh-date-input__field\" }\nconst _hoisted_2 = [\"id\", \"value\", \"disabled\", \"required\", \"aria-invalid\", \"aria-describedby\", \"aria-controls\", \"aria-expanded\", \"onFocus\", \"onBlur\", \"onKeydown\"]\nconst _hoisted_3 = {\n  key: 0,\n  class: \"hh-date-input__mask\",\n  \"aria-hidden\": \"true\"\n}\nconst _hoisted_4 = [\"disabled\", \"aria-expanded\", \"onClick\"]\nconst _hoisted_5 = [\"id\"]\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return (_openBlock(), _createElementBlock(\"div\", {\n    class: _normalizeClass([\"hh-date-input\", _ctx.$attrs.class])\n  }, [\n    _createVNode($setup[\"VueDatePicker\"], {\n      ref: \"picker\",\n      \"model-value\": $props.modelValue,\n      \"model-type\": \"yyyy-MM-dd\",\n      locale: $setup.nl,\n      formats: { input: 'dd-MM-yyyy' },\n      \"time-config\": { enableTimePicker: false },\n      \"text-input\": { openMenu: false },\n      \"input-attrs\": { clearable: false, hideInputIcon: true },\n      ui: { menu: 'hh-date-menu' },\n      \"menu-id\": 'dp-menu-' + $props.id,\n      \"aria-labels\": {\n        menu: 'Datum kiezen', input: 'Datum', nextMonth: 'Volgende maand', prevMonth: 'Vorige maand',\n        nextYear: 'Volgend jaar', prevYear: 'Vorig jaar', openMonthsOverlay: 'Maand kiezen',\n        openYearsOverlay: 'Jaar kiezen', monthPicker: () => 'Maand kiezen', yearPicker: () => 'Jaar kiezen',\n        day: ({ value }) => $setup.format(value, 'EEEE d MMMM yyyy', { locale: $setup.nl }),\n      },\n      \"week-start\": 1,\n      disabled: $props.disabled,\n      \"auto-apply\": \"\",\n      \"arrow-navigation\": \"\",\n      teleport: \"\",\n      \"onUpdate:modelValue\": $setup.onSelected,\n      onClosed: $setup.onClosed\n    }, {\n      \"dp-input\": _withCtx(({ isMenuOpen, onFocus, onBlur, toggleMenu }) => [\n        _createElementVNode(\"div\", _hoisted_1, [\n          _createElementVNode(\"input\", _mergeProps(_ctx.$attrs, {\n            id: $props.id,\n            ref: \"input\",\n            value: $setup.draft,\n            type: \"text\",\n            role: \"combobox\",\n            class: [\"hh-input hh-date-input__input\", { 'hh-input--error': $setup.error }],\n            placeholder: \"dd-mm-jjjj\",\n            inputmode: \"numeric\",\n            autocomplete: \"off\",\n            disabled: $props.disabled,\n            required: $props.required,\n            \"aria-invalid\": Boolean($setup.error) || _ctx.$attrs['aria-invalid'] === true || _ctx.$attrs['aria-invalid'] === 'true',\n            \"aria-describedby\": $setup.error ? $props.id + '-error' : undefined,\n            \"aria-controls\": isMenuOpen ? 'dp-menu-' + $props.id : undefined,\n            \"aria-haspopup\": \"dialog\",\n            \"aria-expanded\": isMenuOpen,\n            onInput: $setup.onInput,\n            onFocus: onFocus,\n            onBlur: $event => {$setup.normalizeInput(); onBlur()},\n            onKeydown: $event => ($setup.onKeydown({ event: $event, isMenuOpen }))\n          }), null, 16 /* FULL_PROPS */, _hoisted_2),\n          ($setup.maskTail)\n            ? (_openBlock(), _createElementBlock(\"span\", _hoisted_3, [\n                _createElementVNode(\"span\", null, _toDisplayString($setup.draft), 1 /* TEXT */),\n                _createTextVNode(_toDisplayString($setup.maskTail), 1 /* TEXT */)\n              ]))\n            : _createCommentVNode(\"v-if\", true),\n          _createElementVNode(\"button\", {\n            class: \"hh-date-input__button\",\n            type: \"button\",\n            tabindex: \"-1\",\n            \"aria-label\": \"Kalender openen\",\n            title: \"Kalender openen (pijl omlaag)\",\n            disabled: $props.disabled,\n            \"aria-expanded\": isMenuOpen,\n            onClick: _withModifiers(toggleMenu, [\"stop\"])\n          }, _cache[0] || (_cache[0] = [\n            _createElementVNode(\"svg\", {\n              width: \"18\",\n              height: \"18\",\n              viewBox: \"0 0 24 24\",\n              fill: \"none\",\n              stroke: \"currentColor\",\n              \"stroke-width\": \"1.75\",\n              \"aria-hidden\": \"true\"\n            }, [\n              _createElementVNode(\"rect\", {\n                x: \"3\",\n                y: \"5\",\n                width: \"18\",\n                height: \"16\",\n                rx: \"2\"\n              }),\n              _createElementVNode(\"path\", { d: \"M16 3v4M8 3v4M3 11h18\" })\n            ], -1 /* CACHED */)\n          ]), 8 /* PROPS */, _hoisted_4)\n        ])\n      ]),\n      _: 1 /* STABLE */\n    }, 8 /* PROPS */, [\"model-value\", \"locale\", \"menu-id\", \"aria-labels\", \"disabled\"]),\n    ($setup.error)\n      ? (_openBlock(), _createElementBlock(\"p\", {\n          key: 0,\n          id: $props.id + '-error',\n          class: \"hh-date-input__error\",\n          role: \"alert\"\n        }, _toDisplayString($setup.error), 9 /* TEXT, PROPS */, _hoisted_5))\n      : _createCommentVNode(\"v-if\", true)\n  ], 2 /* CLASS */))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/DateInput.vue?type=script\";import \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/DateInput.vue?type=style&index=0\";import \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/DateInput.vue?type=style&index=1\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/DateInput.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/DateInput.vue\";script.__scopeId = \"data-v-c2cade27\";export default script;","<template>\n  <AppDialog :title=\"isEdit ? 'Betalingsherinnering bewerken' : 'Nieuwe betalingsherinnering'\" wide @close=\"emit('close')\">\n    <div v-if=\"loading\" class=\"hh-empty\">Laden…</div>\n    <template v-else>\n      <p v-if=\"error\" class=\"hh-formerror\">{{ error }}</p>\n\n      <FormField label=\"Herinneringsdatum\" for-id=\"rem-date\" required>\n        <DateInput id=\"rem-date\" ref=\"dateInput\" v-model=\"form.date\" :disabled=\"saving\" data-autofocus />\n      </FormField>\n\n      <FormField label=\"Facturen\" :error=\"fieldErrors.invoices\"\n                 hint=\"Alleen verstuurde, nog openstaande facturen.\">\n        <p v-if=\"rows.length === 0\" class=\"hh-muted\">Geen verstuurde openstaande facturen voor deze klant.</p>\n        <div v-else class=\"rfd__list\">\n          <label v-for=\"row in rows\" :key=\"row.id\" class=\"rfd__row\">\n            <input v-model=\"row.checked\" type=\"checkbox\" />\n            <span class=\"rfd__nr\">{{ row.number }}</span>\n            <span class=\"rfd__date\">{{ formatDate(row.date) }}</span>\n            <span class=\"rfd__amt\">{{ formatEuro(row.openAmount) }}</span>\n          </label>\n        </div>\n      </FormField>\n\n      <FormField label=\"Tekst\" for-id=\"rem-text\" hint=\"Verschijnt boven de fakturenlijst op de herinnering.\">\n        <textarea id=\"rem-text\" v-model=\"form.text\" class=\"hh-input rfd__text\" rows=\"4\"></textarea>\n      </FormField>\n    </template>\n\n    <template #footer>\n      <button class=\"hh-btn\" type=\"button\" @click=\"emit('close')\">Annuleren</button>\n      <button class=\"hh-btn hh-btn--primary\" type=\"button\" :disabled=\"loading || saving\" @click=\"submit\">\n        {{ saving ? \"Opslaan…\" : (isEdit ? \"Opslaan\" : \"Aanmaken\") }}\n      </button>\n    </template>\n  </AppDialog>\n</template>\n\n<script setup lang=\"ts\">\n// Aanmaken + bewerken van een betalingsherinnering. De fakturen-picker toont\n// alleen al VERSTUURDE, nog openstaande fakturen (plus, in bewerk-modus, de\n// fakturen die al op de herinnering staan). Herbruikbaar vanuit het\n// klant-tabblad en het fakturen-overzicht.\nimport { computed, nextTick, onMounted, reactive, ref, useTemplateRef } from \"vue\";\nimport { Money } from \"@webhare/std\";\nimport { useApi } from \"../lib/api\";\nimport { formatDate, formatEuro } from \"../lib/format\";\nimport { showToast } from \"../lib/toast\";\nimport AppDialog from \"./AppDialog.vue\";\nimport DateInput from \"./DateInput.vue\";\nimport FormField from \"./FormField.vue\";\n\nconst api = useApi();\n\nconst props = defineProps<{ customerId: number; reminderId?: number }>();\nconst emit = defineEmits<{ close: []; saved: [id: number] }>();\n\ntype Invoice = Awaited<ReturnType<typeof api.listInvoices>>[number];\ninterface Row { id: number; number: string; date: string; openAmount: Money; checked: boolean }\n\nconst isEdit = computed(() => props.reminderId !== undefined);\n\nconst loading = ref(true);\nconst saving = ref(false);\nconst dateInput = useTemplateRef<InstanceType<typeof DateInput>>(\"dateInput\");\nconst error = ref(\"\");\nconst rows = reactive<Row[]>([]);\nconst form = reactive({ date: todayIso(), text: defaultText() });\nconst fieldErrors = reactive<Record<string, string>>({});\n\nfunction todayIso(): string {\n  return new Date().toISOString().slice(0, 10);\n}\n\nfunction defaultText(): string {\n  return [\n    \"Volgens onze administratie staan onderstaande facturen nog open.\",\n    \"Wij verzoeken u vriendelijk het openstaande bedrag alsnog te voldoen.\",\n  ].join(\"\\n\");\n}\n\nonMounted(async () => {\n  try {\n    const invoices = await api.listInvoices({ customerId: props.customerId });\n    let selected = new Set<number>();\n    if (props.reminderId !== undefined) {\n      const reminder = await api.getReminder({ id: props.reminderId });\n      if (reminder) {\n        form.date = reminder.date.slice(0, 10);\n        form.text = reminder.textLines.join(\"\\n\");\n        selected = new Set(reminder.invoices.map((line) => line.id));\n      }\n    }\n    // Kandidaten: verstuurde fakturen die nog openstaan, plus (in bewerk-modus)\n    // de fakturen die al op de herinnering staan (ook als inmiddels betaald).\n    const candidates = invoices.filter((invoice: Invoice) =>\n      invoice.sent && (Money.check(invoice.openAmount, \">\", \"0\") || selected.has(invoice.id)));\n    for (const invoice of candidates) {\n      rows.push({\n        id: invoice.id,\n        number: invoice.number,\n        date: invoice.date,\n        openAmount: invoice.openAmount,\n        // Nieuw: alles vooraangevinkt; bewerken: alleen wat al op de herinnering stond.\n        checked: props.reminderId === undefined ? true : selected.has(invoice.id),\n      });\n    }\n  } catch (e) {\n    error.value = e instanceof Error ? e.message : \"Kon de facturen niet laden.\";\n  } finally {\n    loading.value = false;\n    await nextTick();\n    dateInput.value?.focus();\n  }\n});\n\nasync function submit(): Promise<void> {\n  if (loading.value || saving.value) return;\n  if (!dateInput.value?.validate()) {\n    dateInput.value?.focus();\n    return;\n  }\n  for (const key of Object.keys(fieldErrors)) delete fieldErrors[key];\n  const invoiceIds = rows.filter((row) => row.checked).map((row) => row.id);\n  if (invoiceIds.length === 0) {\n    fieldErrors.invoices = \"Selecteer minstens één factuur.\";\n    return;\n  }\n  const textLines = form.text.split(\"\\n\");\n\n  saving.value = true;\n  error.value = \"\";\n  try {\n    if (props.reminderId !== undefined) {\n      await api.updateReminder({ id: props.reminderId, customerId: props.customerId, date: form.date, textLines, invoiceIds });\n      emit(\"saved\", props.reminderId);\n    } else {\n      const { id } = await api.createReminder({ customerId: props.customerId, date: form.date, textLines, invoiceIds });\n      showToast(\"Betalingsherinnering aangemaakt.\");\n      emit(\"saved\", id);\n    }\n  } catch (e) {\n    error.value = e instanceof Error ? e.message : \"Opslaan mislukt.\";\n  } finally {\n    saving.value = false;\n  }\n}\n</script>\n\n<style scoped>\n.rfd__list {\n  display: grid;\n  gap: 2px;\n  max-height: 280px;\n  overflow-y: auto;\n  border: 1px solid var(--hh-line);\n  border-radius: var(--hh-radius);\n  padding: 6px;\n}\n.rfd__row {\n  display: grid;\n  grid-template-columns: 22px 1fr auto auto;\n  align-items: center;\n  gap: 10px;\n  padding: 6px 8px;\n  border-radius: var(--hh-radius);\n  font-size: 13.5px;\n  cursor: pointer;\n}\n.rfd__row:hover {\n  background: var(--hh-surface-2);\n}\n.rfd__nr {\n  font-family: var(--hh-mono);\n}\n.rfd__date {\n  color: var(--hh-fg-muted);\n  font-size: 12.5px;\n}\n.rfd__amt {\n  font-variant-numeric: tabular-nums;\n  white-space: nowrap;\n}\n.rfd__text {\n  min-height: 90px;\n  font-family: inherit;\n}\n</style>\n","import { openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString, createVNode as _createVNode, withCtx as _withCtx, renderList as _renderList, Fragment as _Fragment, vModelCheckbox as _vModelCheckbox, createElementVNode as _createElementVNode, withDirectives as _withDirectives, vModelText as _vModelText, createBlock as _createBlock } from \"vue\"\n\nconst _hoisted_1 = {\n  key: 0,\n  class: \"hh-empty\"\n}\nconst _hoisted_2 = {\n  key: 0,\n  class: \"hh-formerror\"\n}\nconst _hoisted_3 = {\n  key: 0,\n  class: \"hh-muted\"\n}\nconst _hoisted_4 = {\n  key: 1,\n  class: \"rfd__list\"\n}\nconst _hoisted_5 = [\"onUpdate:modelValue\"]\nconst _hoisted_6 = { class: \"rfd__nr\" }\nconst _hoisted_7 = { class: \"rfd__date\" }\nconst _hoisted_8 = { class: \"rfd__amt\" }\nconst _hoisted_9 = [\"disabled\"]\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return (_openBlock(), _createBlock($setup[\"AppDialog\"], {\n    title: $setup.isEdit ? 'Betalingsherinnering bewerken' : 'Nieuwe betalingsherinnering',\n    wide: \"\",\n    onClose: _cache[3] || (_cache[3] = $event => ($setup.emit('close')))\n  }, {\n    footer: _withCtx(() => [\n      _createElementVNode(\"button\", {\n        class: \"hh-btn\",\n        type: \"button\",\n        onClick: _cache[2] || (_cache[2] = $event => ($setup.emit('close')))\n      }, \"Annuleren\"),\n      _createElementVNode(\"button\", {\n        class: \"hh-btn hh-btn--primary\",\n        type: \"button\",\n        disabled: $setup.loading || $setup.saving,\n        onClick: $setup.submit\n      }, _toDisplayString($setup.saving ? \"Opslaan…\" : ($setup.isEdit ? \"Opslaan\" : \"Aanmaken\")), 9 /* TEXT, PROPS */, _hoisted_9)\n    ]),\n    default: _withCtx(() => [\n      ($setup.loading)\n        ? (_openBlock(), _createElementBlock(\"div\", _hoisted_1, \"Laden…\"))\n        : (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n            ($setup.error)\n              ? (_openBlock(), _createElementBlock(\"p\", _hoisted_2, _toDisplayString($setup.error), 1 /* TEXT */))\n              : _createCommentVNode(\"v-if\", true),\n            _createVNode($setup[\"FormField\"], {\n              label: \"Herinneringsdatum\",\n              \"for-id\": \"rem-date\",\n              required: \"\"\n            }, {\n              default: _withCtx(() => [\n                _createVNode($setup[\"DateInput\"], {\n                  id: \"rem-date\",\n                  ref: \"dateInput\",\n                  modelValue: $setup.form.date,\n                  \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => (($setup.form.date) = $event)),\n                  disabled: $setup.saving,\n                  \"data-autofocus\": \"\"\n                }, null, 8 /* PROPS */, [\"modelValue\", \"disabled\"])\n              ]),\n              _: 1 /* STABLE */\n            }),\n            _createVNode($setup[\"FormField\"], {\n              label: \"Facturen\",\n              error: $setup.fieldErrors.invoices,\n              hint: \"Alleen verstuurde, nog openstaande facturen.\"\n            }, {\n              default: _withCtx(() => [\n                ($setup.rows.length === 0)\n                  ? (_openBlock(), _createElementBlock(\"p\", _hoisted_3, \"Geen verstuurde openstaande facturen voor deze klant.\"))\n                  : (_openBlock(), _createElementBlock(\"div\", _hoisted_4, [\n                      (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.rows, (row) => {\n                        return (_openBlock(), _createElementBlock(\"label\", {\n                          key: row.id,\n                          class: \"rfd__row\"\n                        }, [\n                          _withDirectives(_createElementVNode(\"input\", {\n                            \"onUpdate:modelValue\": $event => ((row.checked) = $event),\n                            type: \"checkbox\"\n                          }, null, 8 /* PROPS */, _hoisted_5), [\n                            [_vModelCheckbox, row.checked]\n                          ]),\n                          _createElementVNode(\"span\", _hoisted_6, _toDisplayString(row.number), 1 /* TEXT */),\n                          _createElementVNode(\"span\", _hoisted_7, _toDisplayString($setup.formatDate(row.date)), 1 /* TEXT */),\n                          _createElementVNode(\"span\", _hoisted_8, _toDisplayString($setup.formatEuro(row.openAmount)), 1 /* TEXT */)\n                        ]))\n                      }), 128 /* KEYED_FRAGMENT */))\n                    ]))\n              ]),\n              _: 1 /* STABLE */\n            }, 8 /* PROPS */, [\"error\"]),\n            _createVNode($setup[\"FormField\"], {\n              label: \"Tekst\",\n              \"for-id\": \"rem-text\",\n              hint: \"Verschijnt boven de fakturenlijst op de herinnering.\"\n            }, {\n              default: _withCtx(() => [\n                _withDirectives(_createElementVNode(\"textarea\", {\n                  id: \"rem-text\",\n                  \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => (($setup.form.text) = $event)),\n                  class: \"hh-input rfd__text\",\n                  rows: \"4\"\n                }, null, 512 /* NEED_PATCH */), [\n                  [_vModelText, $setup.form.text]\n                ])\n              ]),\n              _: 1 /* STABLE */\n            })\n          ], 64 /* STABLE_FRAGMENT */))\n    ]),\n    _: 1 /* STABLE */\n  }, 8 /* PROPS */, [\"title\"]))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/ReminderFormDialog.vue?type=script\";import \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/ReminderFormDialog.vue?type=style&index=0\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/ReminderFormDialog.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/ReminderFormDialog.vue\";script.__scopeId = \"data-v-614deadb\";export default script;","<template>\n  <section>\n    <RouterLink class=\"detail__back\" :to=\"customerListTarget\">&larr; Klanten</RouterLink>\n\n    <div v-if=\"loading\" class=\"hh-empty\">Laden…</div>\n    <p v-else-if=\"!customer\" class=\"hh-formerror\">Klant niet gevonden.</p>\n\n    <template v-else>\n      <div class=\"hh-page__bar\">\n        <div>\n          <h1 class=\"hh-page__title\">\n            {{ displayName }}\n            <span v-if=\"customer.archived\" class=\"hh-badge\">gearchiveerd</span>\n          </h1>\n          <p class=\"hh-page__sub\">Klant <span class=\"detail__mono\">{{ customer.number }}</span></p>\n        </div>\n        <div class=\"detail__actions\">\n          <button class=\"hh-btn\" type=\"button\" :disabled=\"archiveSaving\" @click=\"yearManagementOpen = true\">Jaar afsluiten</button>\n          <button class=\"hh-btn\" type=\"button\" :disabled=\"archiveSaving\" @click=\"editOpen = true\">Bewerken</button>\n          <button class=\"hh-btn\" :class=\"customer.archived ? 'hh-btn--primary' : 'hh-btn--danger'\" type=\"button\" :disabled=\"archiveSaving\"\n            @click=\"customer.archived ? setCustomerArchived(false) : openArchive()\">\n            {{ archiveSaving ? \"Bezig…\" : customer.archived ? \"Terughalen\" : \"Archiveren\" }}\n          </button>\n        </div>\n      </div>\n      <p v-if=\"archiveError && !archiveOpen\" class=\"hh-formerror\" role=\"alert\">{{ archiveError }}</p>\n\n      <div class=\"detail__tabs\" role=\"tablist\">\n        <button\n          v-for=\"tab in TABS\"\n          :key=\"tab.id\"\n          class=\"detail__tab\"\n          :class=\"{ 'detail__tab--active': activeTab === tab.id }\"\n          type=\"button\"\n          role=\"tab\"\n          :aria-selected=\"activeTab === tab.id\"\n          @click=\"activeTab = tab.id\"\n        >{{ tab.label }}</button>\n      </div>\n\n      <!-- Gegevens + budgetten -->\n      <div v-if=\"activeTab === 'gegevens'\" class=\"detail__cols\">\n        <section class=\"hh-card detail__panel\">\n          <h2 class=\"detail__ptitle\">Gegevens</h2>\n          <dl class=\"detail__dl\">\n            <div><dt>Contactpersoon</dt><dd>{{ [customer.contactTitle, customer.contactName].filter(Boolean).join(\" \") || \"\\u2014\" }}</dd></div>\n            <div><dt>Adres</dt><dd>{{ customer.address || \"\\u2014\" }}</dd></div>\n            <div><dt>Postcode / plaats</dt><dd>{{ [customer.postalCode, customer.city].filter(Boolean).join(\"  \") || \"\\u2014\" }}</dd></div>\n            <div><dt>Telefoon</dt><dd>{{ customer.phone || \"\\u2014\" }}</dd></div>\n            <div><dt>Telefoon (reserve)</dt><dd>{{ customer.phone2 || \"\\u2014\" }}</dd></div>\n            <div><dt>E-mail</dt><dd>{{ customer.email || \"\\u2014\" }}</dd></div>\n            <div><dt>Minimumjaar</dt><dd>{{ customer.minYear || \"geen\" }}</dd></div>\n          </dl>\n        </section>\n\n        <section class=\"hh-card detail__panel\">\n          <div class=\"detail__phead\">\n            <h2 class=\"detail__ptitle\">Budgetten per jaar</h2>\n            <button class=\"hh-btn hh-btn--small\" type=\"button\" @click=\"openBudget()\">+ Budget</button>\n          </div>\n          <p v-if=\"customer.budgets.length === 0\" class=\"hh-muted\">Nog geen budgetten ingesteld.</p>\n          <table v-else class=\"hh-table\">\n            <thead><tr><th>Jaar</th><th class=\"hh-table__num\">Budget</th><th style=\"width: 70px\"></th></tr></thead>\n            <tbody>\n              <tr v-for=\"budget in customer.budgets\" :key=\"budget.id\">\n                <td class=\"hh-table__code\">{{ budget.fiscalYear }}</td>\n                <td class=\"hh-table__num\">{{ formatEuro(budget.budget) }}</td>\n                <td><button class=\"hh-btn hh-btn--small\" type=\"button\" @click=\"openBudget(budget)\">Wijzig</button></td>\n              </tr>\n            </tbody>\n          </table>\n        </section>\n      </div>\n\n      <!-- Saldi per jaar -->\n      <div v-else-if=\"activeTab === 'saldi'\" class=\"hh-card\">\n        <p v-if=\"years.length === 0\" class=\"hh-empty\">Nog geen boekingen voor deze klant.</p>\n        <table v-else class=\"hh-table\">\n          <thead>\n            <tr>\n              <th>Jaar</th>\n              <th class=\"hh-table__num\">Uren</th>\n              <th class=\"hh-table__num\">Gedeclareerd</th>\n              <th class=\"hh-table__num\">Nog te declareren</th>\n              <th class=\"hh-table__num\">Budget</th>\n              <th class=\"hh-table__num\">Besteed</th>\n              <th style=\"width: 150px\"></th>\n            </tr>\n          </thead>\n          <tbody>\n            <tr v-for=\"year in years\" :key=\"year\">\n              <td class=\"hh-table__code\">\n                {{ year }}\n                <span v-if=\"saldi[year]?.closed\" class=\"hh-badge\">afgesloten</span>\n              </td>\n              <td class=\"hh-table__num\">{{ saldi[year] ? formatHours(saldi[year].tellen.totalHours) : \"…\" }}</td>\n              <td class=\"hh-table__num\">{{ saldi[year] ? formatEuro(saldi[year].tellen.declared) : \"…\" }}</td>\n              <td class=\"hh-table__num\">{{ saldi[year] ? formatEuro(saldi[year].tellen.toDeclare) : \"…\" }}</td>\n              <td class=\"hh-table__num\">{{ budgetFor(year) !== null ? formatEuro(budgetFor(year)!) : \"\\u2014\" }}</td>\n              <td class=\"hh-table__num\">{{ saldi[year] ? formatEuro(saldi[year].tellen.totalCosts) : \"…\" }}</td>\n              <td>\n                <button v-if=\"saldi[year]\" class=\"hh-btn hh-btn--small\" type=\"button\" @click=\"yearManagementOpen = true\">Jaar beheren</button>\n              </td>\n            </tr>\n          </tbody>\n        </table>\n      </div>\n\n      <!-- Produktiestaat -->\n      <div v-else-if=\"activeTab === 'produktie'\">\n        <div v-if=\"years.length > 0\" class=\"hh-toolbar\">\n          <label class=\"detail__ylabel\">Jaar\n            <select v-model.number=\"produktieYear\" class=\"hh-select detail__yselect\">\n              <option v-if=\"produktieYear > 0 && !years.includes(produktieYear)\" :value=\"produktieYear\">{{ produktieYear }}</option>\n              <option v-for=\"year in years\" :key=\"year\" :value=\"year\">{{ year }}</option>\n            </select>\n          </label>\n        </div>\n        <div class=\"hh-card\">\n          <p v-if=\"years.length === 0\" class=\"hh-empty\">Nog geen boekingen voor deze klant.</p>\n          <table v-else class=\"hh-table\">\n            <thead><tr><th>Groep</th><th class=\"hh-table__num\">Uren</th><th class=\"hh-table__num\">Bedrag</th></tr></thead>\n            <tbody>\n              <tr v-for=\"group in production.groups\" :key=\"group.group\">\n                <td>{{ group.label }}</td>\n                <td class=\"hh-table__num\">{{ formatHours(group.hours) }}</td>\n                <td class=\"hh-table__num\">{{ formatEuro(group.amount) }}</td>\n              </tr>\n              <tr v-if=\"production.groups.length === 0\"><td colspan=\"3\" class=\"hh-muted\">Geen uren in dit jaar.</td></tr>\n              <tr class=\"detail__subtotal\">\n                <td>Subtotaal uren</td>\n                <td class=\"hh-table__num\">{{ formatHours(production.hoursTotal) }}</td>\n                <td class=\"hh-table__num\">{{ formatEuro(production.hoursAmountTotal) }}</td>\n              </tr>\n              <tr>\n                <td>Verschotten</td>\n                <td class=\"hh-table__num\"></td>\n                <td class=\"hh-table__num\">{{ formatEuro(production.expensesTotal) }}</td>\n              </tr>\n              <tr class=\"detail__total\">\n                <td>Totaal produktie</td>\n                <td class=\"hh-table__num\"></td>\n                <td class=\"hh-table__num\">{{ formatEuro(production.grandTotal) }}</td>\n              </tr>\n            </tbody>\n          </table>\n        </div>\n      </div>\n\n      <!-- Boekingen -->\n      <div v-else-if=\"activeTab === 'boekingen'\">\n        <div class=\"hh-toolbar\">\n          <label class=\"detail__ylabel\">Jaar\n            <select v-model=\"boekingenYear\" class=\"hh-select detail__yselect\">\n              <option value=\"all\">Alle jaren</option>\n              <option v-if=\"boekingenYear !== 'all' && !years.includes(Number(boekingenYear))\" :value=\"boekingenYear\">{{ boekingenYear }}</option>\n              <option v-for=\"year in years\" :key=\"year\" :value=\"String(year)\">{{ year }}</option>\n            </select>\n          </label>\n        </div>\n\n        <section class=\"detail__block\">\n          <h2 class=\"detail__ptitle\">Facturen</h2>\n          <div class=\"hh-card\">\n          <p v-if=\"filteredInvoices.length === 0\" class=\"hh-empty\">Geen facturen.</p>\n          <table v-else class=\"hh-table\">\n            <thead><tr><th>Nummer</th><th>Datum</th><th class=\"hh-table__num\">Excl. btw</th></tr></thead>\n            <tbody>\n              <tr v-for=\"invoice in filteredInvoices\" :key=\"invoice.id\" class=\"is-clickable\" @click=\"openInvoice(invoice.id)\">\n                <td class=\"hh-table__code\">{{ invoice.number }}</td>\n                <td>{{ formatDate(invoice.date) }}</td>\n                <td class=\"hh-table__num\">{{ formatEuro(invoice.amount) }}</td>\n              </tr>\n            </tbody>\n          </table>\n          </div>\n        </section>\n\n        <section class=\"detail__block\">\n          <h2 class=\"detail__ptitle\">Uren</h2>\n          <div class=\"hh-card\">\n          <p v-if=\"filteredEntries.length === 0\" class=\"hh-empty\">Geen urenregels.</p>\n          <table v-else class=\"hh-table\">\n            <thead><tr><th>Datum</th><th>Werknemer</th><th>Werkz.</th><th>Omschrijving</th><th class=\"hh-table__num\">Uren</th><th class=\"hh-table__num\">Bedrag</th></tr></thead>\n            <tbody>\n              <tr v-for=\"entry in filteredEntries\" :key=\"entry.id\">\n                <td>{{ formatDate(entry.date) }}</td>\n                <td>{{ entry.employeeName }}</td>\n                <td class=\"hh-table__code\">{{ entry.activityCode }}</td>\n                <td class=\"hh-muted\">{{ entry.description || \"\\u2014\" }}</td>\n                <td class=\"hh-table__num\">{{ formatHours(entry.hours) }}</td>\n                <td class=\"hh-table__num\">{{ formatEuro(entry.amount) }}</td>\n              </tr>\n            </tbody>\n          </table>\n          </div>\n        </section>\n\n        <section class=\"detail__block\">\n          <h2 class=\"detail__ptitle\">Verschotten</h2>\n          <div class=\"hh-card\">\n          <p v-if=\"filteredExpenses.length === 0\" class=\"hh-empty\">Geen verschotten.</p>\n          <table v-else class=\"hh-table\">\n            <thead><tr><th>Datum</th><th>Boekjaar</th><th>Soort</th><th>Omschrijving</th><th class=\"hh-table__num\">Bedrag</th></tr></thead>\n            <tbody>\n              <tr v-for=\"expense in filteredExpenses\" :key=\"expense.id\">\n                <td>{{ formatDate(expense.date) }}</td>\n                <td class=\"hh-table__code\">{{ expense.fiscalYear }}</td>\n                <td class=\"hh-muted\">{{ kindLabel(expense.kind) }}</td>\n                <td>{{ expense.description || \"\\u2014\" }}<span v-if=\"expense.transferPartnerId\" class=\"detail__transfer\">{{ expenseTransferLabel(expense) }}</span></td>\n                <td class=\"hh-table__num\">{{ formatEuro(expense.amount) }}</td>\n              </tr>\n            </tbody>\n          </table>\n          </div>\n        </section>\n      </div>\n\n      <!-- Betalingsherinneringen -->\n      <div v-else-if=\"activeTab === 'herinneringen'\">\n        <div class=\"hh-toolbar\">\n          <div class=\"detail__spacer\"></div>\n          <button class=\"hh-btn hh-btn--primary hh-btn--small\" type=\"button\" @click=\"reminderCreateOpen = true\">+ Nieuwe betalingsherinnering</button>\n        </div>\n        <div class=\"hh-card\">\n          <div v-if=\"remindersLoading\" class=\"hh-empty\">Laden\\u2026</div>\n          <p v-else-if=\"reminders.length === 0\" class=\"hh-empty\">Nog geen betalingsherinneringen voor deze klant.</p>\n          <table v-else class=\"hh-table\">\n            <thead>\n              <tr>\n                <th>Nummer</th>\n                <th>Datum</th>\n                <th class=\"hh-table__num\">Facturen</th>\n                <th class=\"hh-table__num\">Totaal openstaand</th>\n                <th>Status</th>\n              </tr>\n            </thead>\n            <tbody>\n              <tr v-for=\"reminder in reminders\" :key=\"reminder.id\" class=\"is-clickable\" @click=\"openReminder(reminder.id)\">\n                <td class=\"hh-table__code\">{{ reminder.number }}</td>\n                <td>{{ formatDate(reminder.date) }}</td>\n                <td class=\"hh-table__num\">{{ reminder.invoiceCount }}</td>\n                <td class=\"hh-table__num\">{{ formatEuro(reminder.totalOpen) }}</td>\n                <td><span v-if=\"reminder.sent\" class=\"hh-badge\">verzonden {{ formatDate(reminder.sentDate) }}</span><span v-else class=\"hh-badge hh-badge--warn\">concept</span></td>\n              </tr>\n            </tbody>\n          </table>\n        </div>\n      </div>\n    </template>\n\n    <!-- Klant bewerken -->\n    <CustomerFormDialog v-if=\"editOpen && customer\" :customer=\"customer\" @close=\"editOpen = false\" @saved=\"onEdited\" />\n\n    <AppDialog v-if=\"archiveOpen && customer\" title=\"Klant archiveren\" @close=\"closeArchive\">\n      <p>Weet je zeker dat je <strong>{{ displayName }}</strong> wilt archiveren? De klant verdwijnt uit de actieve lijst. De historie blijft bewaard.</p>\n      <p v-if=\"archiveError\" class=\"hh-formerror\" role=\"alert\">{{ archiveError }}</p>\n      <template #footer>\n        <button class=\"hh-btn\" type=\"button\" data-autofocus :disabled=\"archiveSaving\" @click=\"closeArchive\">Annuleren</button>\n        <button class=\"hh-btn hh-btn--danger\" type=\"button\" :disabled=\"archiveSaving\" @click=\"setCustomerArchived(true)\">\n          {{ archiveSaving ? \"Archiveren…\" : \"Archiveren\" }}\n        </button>\n      </template>\n    </AppDialog>\n\n    <!-- Nieuwe betalingsherinnering -->\n    <ReminderFormDialog v-if=\"reminderCreateOpen\" :customer-id=\"customerId\" @close=\"reminderCreateOpen = false\" @saved=\"onReminderCreated\" />\n\n    <!-- Budget toevoegen/wijzigen -->\n    <AppDialog v-if=\"budgetOpen\" :title=\"budgetEditing ? 'Budget wijzigen' : 'Budget toevoegen'\" @close=\"budgetOpen = false\">\n      <form @submit.prevent=\"submitBudget\">\n        <p v-if=\"budgetError\" class=\"hh-formerror\">{{ budgetError }}</p>\n        <FormField label=\"Jaar\" for-id=\"b-year\" required :error=\"budgetFieldErrors.year\">\n          <input id=\"b-year\" v-model.number=\"budgetForm.year\" class=\"hh-input hh-input--num\" data-autofocus inputmode=\"numeric\" :disabled=\"Boolean(budgetEditing)\" :class=\"{ 'hh-input--error': budgetFieldErrors.year }\" />\n        </FormField>\n        <FormField label=\"Budget (€)\" for-id=\"b-amount\" required :error=\"budgetFieldErrors.amount\">\n          <input id=\"b-amount\" v-model.trim=\"budgetForm.amount\" class=\"hh-input hh-input--num\" inputmode=\"decimal\" :class=\"{ 'hh-input--error': budgetFieldErrors.amount }\" />\n        </FormField>\n        <button type=\"submit\" hidden></button>\n      </form>\n      <template #footer>\n        <button class=\"hh-btn\" type=\"button\" @click=\"budgetOpen = false\">Annuleren</button>\n        <button class=\"hh-btn hh-btn--primary\" type=\"button\" :disabled=\"budgetSaving\" @click=\"submitBudget\">{{ budgetSaving ? \"Opslaan…\" : \"Opslaan\" }}</button>\n      </template>\n    </AppDialog>\n\n    <AppDialog v-if=\"yearManagementOpen\" title=\"Boekjaren beheren\" wide @close=\"yearManagementOpen = false\">\n      <p v-if=\"yearManagementError\" class=\"hh-formerror\">{{ yearManagementError }}</p>\n      <div class=\"hh-card\">\n        <table class=\"hh-table\">\n          <thead><tr><th>Jaar</th><th>Status</th><th>Boekingen</th><th></th></tr></thead>\n          <tbody>\n            <tr v-for=\"year in managedYears\" :key=\"year.fiscalYear\">\n              <td class=\"hh-table__code\">{{ year.fiscalYear }}</td>\n              <td>{{ year.closed ? \"Afgesloten\" : \"Open\" }}<span v-if=\"year.belowMinimum\" class=\"hh-muted\"> (vóór minimumjaar)</span></td>\n              <td>{{ year.hasBookings ? \"Ja\" : \"Geen\" }}</td>\n              <td><button class=\"hh-btn hh-btn--small\" type=\"button\" :disabled=\"closing\" @click=\"year.closed ? reopenYear(year.fiscalYear) : openCloseYear(year.fiscalYear)\">{{ year.closed ? \"Heropenen\" : \"Jaar afsluiten\" }}</button></td>\n            </tr>\n          </tbody>\n        </table>\n      </div>\n      <p class=\"detail__yearnote\">Het minimumjaar blijft gelden, ook na heropenen.</p>\n      <template #footer><button class=\"hh-btn\" type=\"button\" @click=\"yearManagementOpen = false\">Sluiten</button></template>\n    </AppDialog>\n\n    <!-- Jaarafsluiting (klassieke checklist-bevestiging) -->\n    <AppDialog v-if=\"closeYearTarget !== null\" :title=\"`Jaar ${closeYearTarget} afsluiten`\" @close=\"closeYearTarget = null\">\n      <p class=\"detail__closeintro\">Loop de checklist na voordat je het jaar afsluit. Na afsluiten zijn er geen boekingen meer mogelijk voor dit jaar (de historie blijft bewaard).</p>\n      <ul class=\"detail__checklist\">\n        <li v-for=\"(item, index) in checklist\" :key=\"index\">\n          <label><input v-model=\"item.checked\" type=\"checkbox\" /> {{ item.label }}</label>\n        </li>\n      </ul>\n      <p v-if=\"closeYearError\" class=\"hh-formerror\">{{ closeYearError }}</p>\n      <template #footer>\n        <button class=\"hh-btn\" type=\"button\" @click=\"closeYearTarget = null\">Terug</button>\n        <button class=\"hh-btn hh-btn--primary\" type=\"button\" data-autofocus :disabled=\"closing\" @click=\"confirmCloseYear\">{{ closing ? \"Afsluiten…\" : \"Jaar afsluiten\" }}</button>\n      </template>\n    </AppDialog>\n  </section>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, onMounted, reactive, ref, watch } from \"vue\";\nimport { RouterLink, useRoute, useRouter } from \"vue-router\";\nimport { Money } from \"@webhare/std\";\nimport { useApi } from \"../lib/api\";\nimport { formatDate, formatEuro, formatHours } from \"../lib/format\";\nimport { expenseTransferLabel } from \"../lib/expenseTransfer\";\nimport { buildProductionStatement } from \"../lib/production\";\nimport { useEscapeBack } from \"../lib/useEscapeBack\";\nimport { customerDetailStateToQuery, parseCustomerDetailState } from \"../lib/customerDetailState\";\nimport { queryRecord, sameQuery } from \"../lib/routeQuery\";\nimport { customerListPosition } from \"../lib/customerNavigation\";\nimport { useToast } from \"../lib/toast\";\nimport AppDialog from \"../components/AppDialog.vue\";\nimport CustomerFormDialog from \"../components/CustomerFormDialog.vue\";\nimport ReminderFormDialog from \"../components/ReminderFormDialog.vue\";\nimport FormField from \"../components/FormField.vue\";\n\nconst api = useApi();\nconst showToast = useToast();\n\ntype CustomerDetail = NonNullable<Awaited<ReturnType<typeof api.getCustomer>>>;\ntype Tellen = Awaited<ReturnType<typeof api.tellen>>;\ntype TimeEntry = Awaited<ReturnType<typeof api.listTimeEntries>>[number];\ntype Invoice = Awaited<ReturnType<typeof api.listInvoices>>[number];\ntype Expense = Awaited<ReturnType<typeof api.listExpenses>>[number];\ntype Reminder = Awaited<ReturnType<typeof api.listReminders>>[number];\ntype BudgetItem = CustomerDetail[\"budgets\"][number];\n\nconst TABS = [\n  { id: \"gegevens\", label: \"Gegevens\" },\n  { id: \"saldi\", label: \"Saldi per jaar\" },\n  { id: \"produktie\", label: \"Produktiestaat\" },\n  { id: \"boekingen\", label: \"Boekingen\" },\n  { id: \"herinneringen\", label: \"Betalingsherinneringen\" },\n] as const;\ntype TabId = (typeof TABS)[number][\"id\"];\n\nconst route = useRoute();\nconst router = useRouter();\nconst customerListTarget = { name: \"klanten\", query: customerListPosition?.query ?? {} };\nconst customerId = computed(() => Number(route.params.id));\n\nconst loading = ref(true);\nconst customer = ref<CustomerDetail | null>(null);\nconst archiveOpen = ref(false);\nconst archiveSaving = ref(false);\nconst archiveError = ref(\"\");\nconst entries = ref<TimeEntry[]>([]);\nconst invoices = ref<Invoice[]>([]);\nconst expenses = ref<Expense[]>([]);\nconst reminders = ref<Reminder[]>([]);\nconst remindersLoading = ref(false);\nconst remindersLoaded = ref(false);\nconst reminderCreateOpen = ref(false);\nconst groupLabels = ref<string[]>([]);\nconst expenseKinds = ref<string[]>([]);\nconst managedYears = ref<Awaited<ReturnType<typeof api.listCustomerYears>>>([]);\nconst yearManagementOpen = ref(false);\nconst yearManagementError = ref(\"\");\nconst saldi = reactive<Record<number, { tellen: Tellen; closed: boolean }>>({});\n\nconst restored = parseCustomerDetailState(queryRecord(route.query));\nconst activeTab = ref<TabId>(restored.tab);\n\nconst displayName = computed(() => customer.value ? (customer.value.company || customer.value.contactName || `Klant ${customer.value.number}`) : \"\");\n\nconst years = computed<number[]>(() => {\n  const set = new Set<number>();\n  for (const entry of entries.value) set.add(entry.fiscalYear);\n  for (const invoice of invoices.value) set.add(invoice.fiscalYear);\n  for (const expense of expenses.value) set.add(expense.fiscalYear);\n  for (const budget of customer.value?.budgets ?? []) set.add(budget.fiscalYear);\n  return [...set].sort((a, b) => b - a);\n});\n\nconst produktieYear = ref(restored.productionYear);\nconst boekingenYear = ref(restored.bookingsYear);\nconst defaultProductionYear = ref(0);\n\n// Write tab and both year filters together so changing tabs cannot erase a year.\nwatch([activeTab, produktieYear, boekingenYear, defaultProductionYear], () => {\n  const next = { ...queryRecord(route.query) };\n  delete next.tab;\n  delete next.produktiejaar;\n  delete next.boekingenjaar;\n  Object.assign(next, customerDetailStateToQuery({\n    state: { tab: activeTab.value, productionYear: produktieYear.value, bookingsYear: boekingenYear.value },\n    defaultProductionYear: defaultProductionYear.value,\n  }));\n  if (!sameQuery(next, queryRecord(route.query))) void router.replace({ query: next });\n});\n\nconst production = computed(() => buildProductionStatement({\n  entries: entries.value.filter((e) => e.fiscalYear === produktieYear.value).map((e) => ({ activityCode: e.activityCode, hours: e.hours, amount: e.amount })),\n  expenses: expenses.value.filter((e) => e.fiscalYear === produktieYear.value).map((e) => ({ amount: e.amount })),\n  groupLabels: groupLabels.value,\n}));\n\nconst filteredInvoices = computed(() => filterYear(invoices.value));\nconst filteredEntries = computed(() => filterYear(entries.value));\nconst filteredExpenses = computed(() => filterYear(expenses.value));\n\nfunction filterYear<T extends { fiscalYear: number }>(rows: T[]): T[] {\n  if (boekingenYear.value === \"all\") return rows;\n  const year = Number(boekingenYear.value);\n  return rows.filter((row) => row.fiscalYear === year);\n}\n\nfunction budgetFor(year: number): Money | null {\n  const budget = customer.value?.budgets.find((b) => b.fiscalYear === year);\n  return budget ? budget.budget : null;\n}\n\nfunction kindLabel(kind: number): string {\n  return (expenseKinds.value[kind] ?? \"\").trim() || `Soort ${kind}`;\n}\n\nasync function load(): Promise<void> {\n  loading.value = true;\n  remindersLoaded.value = false;\n  reminders.value = [];\n  for (const key of Object.keys(saldi)) delete saldi[Number(key)];\n  try {\n    const id = customerId.value;\n    const [detail, entryRows, invoiceRows, expenseRows, settings] = await Promise.all([\n      api.getCustomer({ id }),\n      api.listTimeEntries({ customerId: id }),\n      api.listInvoices({ customerId: id }),\n      api.listExpenses({ customerId: id }),\n      api.getSettings(),\n    ]);\n    customer.value = detail;\n    entries.value = entryRows;\n    invoices.value = invoiceRows;\n    expenses.value = expenseRows;\n    groupLabels.value = settings.activityGroups ?? [];\n    expenseKinds.value = settings.expenseKinds ?? [];\n    defaultProductionYear.value = years.value[0] ?? new Date().getFullYear();\n    // Only an unresolved default may change after loading; a valid URL year wins.\n    if (produktieYear.value === 0) produktieYear.value = defaultProductionYear.value;\n    await loadSaldi();\n    if (activeTab.value === \"herinneringen\") void loadReminders();\n  } finally {\n    loading.value = false;\n  }\n}\n\nasync function loadReminders(): Promise<void> {\n  remindersLoading.value = true;\n  try {\n    reminders.value = await api.listReminders({ customerId: customerId.value });\n    remindersLoaded.value = true;\n  } finally {\n    remindersLoading.value = false;\n  }\n}\n\n// Herinneringen lazy laden zodra het tabblad geopend wordt (indien nog niet geladen).\nwatch(activeTab, (tab) => {\n  if (tab === \"herinneringen\" && !remindersLoaded.value) void loadReminders();\n});\n\nasync function loadSaldi(): Promise<void> {\n  const id = customerId.value;\n  managedYears.value = await api.listCustomerYears({ customerId: id });\n  await Promise.all(years.value.map(async (year) => {\n    const [tellen, closed] = await Promise.all([\n      api.tellen({ customerId: id, fiscalYear: year }),\n      api.isYearClosed({ customerId: id, fiscalYear: year }),\n    ]);\n    saldi[year] = { tellen, closed };\n  }));\n}\n\nfunction openArchive(): void {\n  archiveError.value = \"\";\n  archiveOpen.value = true;\n}\n\nfunction closeArchive(): void {\n  if (!archiveSaving.value) archiveOpen.value = false;\n}\n\nasync function setCustomerArchived(archived: boolean): Promise<void> {\n  const current = customer.value;\n  if (!current || archiveSaving.value) return;\n  archiveSaving.value = true;\n  archiveError.value = \"\";\n  try {\n    if (archived) await api.archiveCustomer({ id: current.id });\n    else await api.restoreCustomer({ id: current.id });\n    if (customerId.value !== current.id) return;\n    archiveOpen.value = false;\n    customer.value = { ...current, archived };\n    showToast(archived ? \"Klant gearchiveerd.\" : \"Klant teruggehaald.\");\n    try {\n      const detail = await api.getCustomer({ id: current.id });\n      if (customerId.value === current.id) customer.value = detail;\n    } catch {\n      // The write already succeeded; a refresh failure must not invite a duplicate mutation.\n      if (customerId.value === current.id) archiveError.value = \"De klantstatus is aangepast, maar de gegevens konden niet worden vernieuwd. Herlaad de pagina.\";\n    }\n  } catch (error) {\n    if (customerId.value === current.id) archiveError.value = error instanceof Error ? error.message : \"De klantstatus kon niet worden aangepast.\";\n  } finally {\n    archiveSaving.value = false;\n  }\n}\n\n// ── Klant bewerken ─────────────────────────────────────────────────────────\nconst editOpen = ref(false);\nfunction onEdited(): void {\n  editOpen.value = false;\n  void load();\n}\n\n// ── Budget ───────────────────────────────────────────────────────────────\nconst budgetOpen = ref(false);\nconst budgetEditing = ref<BudgetItem | null>(null);\nconst budgetSaving = ref(false);\nconst budgetError = ref(\"\");\nconst budgetForm = reactive({ year: new Date().getFullYear(), amount: \"\" });\nconst budgetFieldErrors = reactive<Record<string, string>>({});\n\nfunction openBudget(budget?: BudgetItem): void {\n  budgetEditing.value = budget ?? null;\n  budgetForm.year = budget?.fiscalYear ?? (years.value[0] ?? new Date().getFullYear());\n  budgetForm.amount = budget ? String(budget.budget) : \"\";\n  budgetError.value = \"\";\n  for (const key of Object.keys(budgetFieldErrors)) delete budgetFieldErrors[key];\n  budgetOpen.value = true;\n}\n\nasync function submitBudget(): Promise<void> {\n  for (const key of Object.keys(budgetFieldErrors)) delete budgetFieldErrors[key];\n  if (!budgetForm.year || budgetForm.year < 1900) budgetFieldErrors.year = \"Vul een geldig jaar in.\";\n  if (!/^\\d+([.,]\\d+)?$/.test(budgetForm.amount)) budgetFieldErrors.amount = \"Ongeldig bedrag.\";\n  if (Object.keys(budgetFieldErrors).length > 0) return;\n\n  budgetSaving.value = true;\n  budgetError.value = \"\";\n  try {\n    await api.setCustomerBudget({ customerId: customerId.value, fiscalYear: Number(budgetForm.year), budget: budgetForm.amount });\n    budgetOpen.value = false;\n    await load();\n  } catch (e) {\n    budgetError.value = e instanceof Error ? e.message : \"Opslaan mislukt.\";\n  } finally {\n    budgetSaving.value = false;\n  }\n}\n\n// ── Jaarafsluiting ─────────────────────────────────────────────────────────\nconst closeYearTarget = ref<number | null>(null);\nconst closing = ref(false);\nconst closeYearError = ref(\"\");\nconst checklist = reactive([\n  { label: \"Alle uren voor dit jaar zijn ingevoerd.\", checked: false },\n  { label: \"Alle verschotten zijn geboekt.\", checked: false },\n  { label: \"De eindfactuur is verstuurd.\", checked: false },\n]);\n\nfunction openCloseYear(year: number): void {\n  yearManagementOpen.value = false;\n  closeYearTarget.value = year;\n  closeYearError.value = \"\";\n  for (const item of checklist) item.checked = false;\n}\n\nasync function confirmCloseYear(): Promise<void> {\n  if (closeYearTarget.value === null) return;\n  if (!checklist.every((item) => item.checked)) {\n    closeYearError.value = \"Vink alle punten aan om te bevestigen.\";\n    return;\n  }\n  closing.value = true;\n  closeYearError.value = \"\";\n  try {\n    await api.closeYear({ customerId: customerId.value, fiscalYear: closeYearTarget.value });\n    closeYearTarget.value = null;\n    await loadSaldi();\n  } catch (e) {\n    closeYearError.value = e instanceof Error ? e.message : \"Afsluiten mislukt.\";\n  } finally {\n    closing.value = false;\n  }\n}\n\nasync function reopenYear(fiscalYear: number): Promise<void> {\n  closing.value = true;\n  yearManagementError.value = \"\";\n  try {\n    await api.reopenYear({ customerId: customerId.value, fiscalYear });\n    await loadSaldi();\n  } catch (error) {\n    yearManagementError.value = error instanceof Error ? error.message : \"Heropenen mislukt.\";\n  } finally {\n    closing.value = false;\n  }\n}\n\nfunction openInvoice(id: number): void {\n  void router.push({ name: \"fakturen-detail\", params: { id: String(id) } });\n}\n\nfunction openReminder(id: number): void {\n  void router.push({ name: \"herinneringen-detail\", params: { id: String(id) } });\n}\n\nfunction onReminderCreated(id: number): void {\n  reminderCreateOpen.value = false;\n  void router.push({ name: \"herinneringen-detail\", params: { id: String(id) } });\n}\n\n// Escape gaat terug naar de klantenlijst (zoals de \"terug\"-link), tenzij er een\n// dialoog open staat of je in een veld typt.\nuseEscapeBack(customerListTarget);\n\nwatch(customerId, () => { archiveOpen.value = false; archiveError.value = \"\"; void load(); });\nonMounted(() => { void load(); });\n</script>\n\n<style scoped>\n.detail__actions {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 8px;\n}\n.detail__yearnote {\n  margin: 12px 0 0;\n  color: var(--hh-fg-muted);\n}\n.detail__back {\n  display: inline-block;\n  margin-bottom: 12px;\n  color: var(--hh-fg-muted);\n  text-decoration: none;\n  font-size: 13px;\n}\n.detail__back:hover {\n  color: var(--hh-accent);\n}\n.detail__mono {\n  font-family: var(--hh-mono);\n}\n.detail__tabs {\n  display: flex;\n  gap: 2px;\n  margin-bottom: 18px;\n  border-bottom: 1px solid var(--hh-line);\n}\n.detail__tab {\n  padding: 8px 14px;\n  border: 0;\n  border-bottom: 2px solid transparent;\n  background: transparent;\n  color: var(--hh-fg-muted);\n  font-family: var(--hh-font);\n  font-size: 13.5px;\n  font-weight: 500;\n  cursor: pointer;\n}\n.detail__tab:hover {\n  color: var(--hh-fg);\n}\n.detail__tab--active {\n  color: var(--hh-accent-strong);\n  border-bottom-color: var(--hh-accent);\n}\n.detail__cols {\n  display: grid;\n  grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));\n  gap: 18px;\n}\n.detail__panel {\n  padding: 16px 18px;\n}\n.detail__phead {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  margin-bottom: 10px;\n}\n.detail__ptitle {\n  margin: 0 0 10px;\n  font-size: 15px;\n  font-weight: 700;\n}\n.detail__block {\n  margin-bottom: 16px;\n}\n.detail__transfer {\n  display: block;\n  margin-top: 3px;\n  font-size: 12px;\n  color: var(--hh-fg-muted);\n}\n.detail__dl {\n  margin: 0;\n  display: grid;\n  gap: 10px;\n}\n.detail__dl div {\n  display: grid;\n  grid-template-columns: 130px 1fr;\n  gap: 10px;\n}\n.detail__dl dt {\n  color: var(--hh-fg-muted);\n  font-size: 12.5px;\n}\n.detail__dl dd {\n  margin: 0;\n  font-size: 13.5px;\n}\n.detail__ylabel {\n  display: inline-flex;\n  align-items: center;\n  gap: 8px;\n  font-size: 13px;\n  color: var(--hh-fg-muted);\n}\n.detail__spacer {\n  flex: 1;\n}\n.detail__yselect {\n  width: auto;\n}\n.detail__subtotal td,\n.detail__total td {\n  font-weight: 600;\n  border-top: 1px solid var(--hh-line-strong);\n}\n.detail__total td {\n  color: var(--hh-accent-strong);\n}\n.detail__closeintro {\n  margin: 0 0 12px;\n  font-size: 13.5px;\n  color: var(--hh-fg-muted);\n}\n.detail__checklist {\n  margin: 0 0 4px;\n  padding: 0;\n  list-style: none;\n  display: grid;\n  gap: 8px;\n}\n.detail__checklist label {\n  display: flex;\n  align-items: flex-start;\n  gap: 8px;\n  font-size: 13.5px;\n  cursor: pointer;\n}\n</style>\n","import { createTextVNode as _createTextVNode, withCtx as _withCtx, createVNode as _createVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, normalizeClass as _normalizeClass, renderList as _renderList, Fragment as _Fragment, vModelSelect as _vModelSelect, withDirectives as _withDirectives, createBlock as _createBlock, vModelText as _vModelText, withModifiers as _withModifiers, vModelCheckbox as _vModelCheckbox } from \"vue\"\n\nconst _hoisted_1 = {\n  key: 0,\n  class: \"hh-empty\"\n}\nconst _hoisted_2 = {\n  key: 1,\n  class: \"hh-formerror\"\n}\nconst _hoisted_3 = { class: \"hh-page__bar\" }\nconst _hoisted_4 = { class: \"hh-page__title\" }\nconst _hoisted_5 = {\n  key: 0,\n  class: \"hh-badge\"\n}\nconst _hoisted_6 = { class: \"hh-page__sub\" }\nconst _hoisted_7 = { class: \"detail__mono\" }\nconst _hoisted_8 = { class: \"detail__actions\" }\nconst _hoisted_9 = [\"disabled\"]\nconst _hoisted_10 = [\"disabled\"]\nconst _hoisted_11 = [\"disabled\"]\nconst _hoisted_12 = {\n  key: 0,\n  class: \"hh-formerror\",\n  role: \"alert\"\n}\nconst _hoisted_13 = {\n  class: \"detail__tabs\",\n  role: \"tablist\"\n}\nconst _hoisted_14 = [\"aria-selected\", \"onClick\"]\nconst _hoisted_15 = {\n  key: 1,\n  class: \"detail__cols\"\n}\nconst _hoisted_16 = { class: \"hh-card detail__panel\" }\nconst _hoisted_17 = { class: \"detail__dl\" }\nconst _hoisted_18 = { class: \"hh-card detail__panel\" }\nconst _hoisted_19 = { class: \"detail__phead\" }\nconst _hoisted_20 = {\n  key: 0,\n  class: \"hh-muted\"\n}\nconst _hoisted_21 = {\n  key: 1,\n  class: \"hh-table\"\n}\nconst _hoisted_22 = { class: \"hh-table__code\" }\nconst _hoisted_23 = { class: \"hh-table__num\" }\nconst _hoisted_24 = [\"onClick\"]\nconst _hoisted_25 = { class: \"hh-card\" }\nconst _hoisted_26 = {\n  key: 0,\n  class: \"hh-empty\"\n}\nconst _hoisted_27 = {\n  key: 1,\n  class: \"hh-table\"\n}\nconst _hoisted_28 = { class: \"hh-table__code\" }\nconst _hoisted_29 = {\n  key: 0,\n  class: \"hh-badge\"\n}\nconst _hoisted_30 = { class: \"hh-table__num\" }\nconst _hoisted_31 = { class: \"hh-table__num\" }\nconst _hoisted_32 = { class: \"hh-table__num\" }\nconst _hoisted_33 = { class: \"hh-table__num\" }\nconst _hoisted_34 = { class: \"hh-table__num\" }\nconst _hoisted_35 = {\n  key: 0,\n  class: \"hh-toolbar\"\n}\nconst _hoisted_36 = { class: \"detail__ylabel\" }\nconst _hoisted_37 = [\"value\"]\nconst _hoisted_38 = [\"value\"]\nconst _hoisted_39 = { class: \"hh-card\" }\nconst _hoisted_40 = {\n  key: 0,\n  class: \"hh-empty\"\n}\nconst _hoisted_41 = {\n  key: 1,\n  class: \"hh-table\"\n}\nconst _hoisted_42 = { class: \"hh-table__num\" }\nconst _hoisted_43 = { class: \"hh-table__num\" }\nconst _hoisted_44 = { key: 0 }\nconst _hoisted_45 = { class: \"detail__subtotal\" }\nconst _hoisted_46 = { class: \"hh-table__num\" }\nconst _hoisted_47 = { class: \"hh-table__num\" }\nconst _hoisted_48 = { class: \"hh-table__num\" }\nconst _hoisted_49 = { class: \"detail__total\" }\nconst _hoisted_50 = { class: \"hh-table__num\" }\nconst _hoisted_51 = { class: \"hh-toolbar\" }\nconst _hoisted_52 = { class: \"detail__ylabel\" }\nconst _hoisted_53 = [\"value\"]\nconst _hoisted_54 = [\"value\"]\nconst _hoisted_55 = { class: \"detail__block\" }\nconst _hoisted_56 = { class: \"hh-card\" }\nconst _hoisted_57 = {\n  key: 0,\n  class: \"hh-empty\"\n}\nconst _hoisted_58 = {\n  key: 1,\n  class: \"hh-table\"\n}\nconst _hoisted_59 = [\"onClick\"]\nconst _hoisted_60 = { class: \"hh-table__code\" }\nconst _hoisted_61 = { class: \"hh-table__num\" }\nconst _hoisted_62 = { class: \"detail__block\" }\nconst _hoisted_63 = { class: \"hh-card\" }\nconst _hoisted_64 = {\n  key: 0,\n  class: \"hh-empty\"\n}\nconst _hoisted_65 = {\n  key: 1,\n  class: \"hh-table\"\n}\nconst _hoisted_66 = { class: \"hh-table__code\" }\nconst _hoisted_67 = { class: \"hh-muted\" }\nconst _hoisted_68 = { class: \"hh-table__num\" }\nconst _hoisted_69 = { class: \"hh-table__num\" }\nconst _hoisted_70 = { class: \"detail__block\" }\nconst _hoisted_71 = { class: \"hh-card\" }\nconst _hoisted_72 = {\n  key: 0,\n  class: \"hh-empty\"\n}\nconst _hoisted_73 = {\n  key: 1,\n  class: \"hh-table\"\n}\nconst _hoisted_74 = { class: \"hh-table__code\" }\nconst _hoisted_75 = { class: \"hh-muted\" }\nconst _hoisted_76 = {\n  key: 0,\n  class: \"detail__transfer\"\n}\nconst _hoisted_77 = { class: \"hh-table__num\" }\nconst _hoisted_78 = { class: \"hh-toolbar\" }\nconst _hoisted_79 = { class: \"hh-card\" }\nconst _hoisted_80 = {\n  key: 0,\n  class: \"hh-empty\"\n}\nconst _hoisted_81 = {\n  key: 1,\n  class: \"hh-empty\"\n}\nconst _hoisted_82 = {\n  key: 2,\n  class: \"hh-table\"\n}\nconst _hoisted_83 = [\"onClick\"]\nconst _hoisted_84 = { class: \"hh-table__code\" }\nconst _hoisted_85 = { class: \"hh-table__num\" }\nconst _hoisted_86 = { class: \"hh-table__num\" }\nconst _hoisted_87 = {\n  key: 0,\n  class: \"hh-badge\"\n}\nconst _hoisted_88 = {\n  key: 1,\n  class: \"hh-badge hh-badge--warn\"\n}\nconst _hoisted_89 = {\n  key: 0,\n  class: \"hh-formerror\",\n  role: \"alert\"\n}\nconst _hoisted_90 = [\"disabled\"]\nconst _hoisted_91 = [\"disabled\"]\nconst _hoisted_92 = {\n  key: 0,\n  class: \"hh-formerror\"\n}\nconst _hoisted_93 = [\"disabled\"]\nconst _hoisted_94 = [\"disabled\"]\nconst _hoisted_95 = {\n  key: 0,\n  class: \"hh-formerror\"\n}\nconst _hoisted_96 = { class: \"hh-card\" }\nconst _hoisted_97 = { class: \"hh-table\" }\nconst _hoisted_98 = { class: \"hh-table__code\" }\nconst _hoisted_99 = {\n  key: 0,\n  class: \"hh-muted\"\n}\nconst _hoisted_100 = [\"disabled\", \"onClick\"]\nconst _hoisted_101 = { class: \"detail__checklist\" }\nconst _hoisted_102 = [\"onUpdate:modelValue\"]\nconst _hoisted_103 = {\n  key: 0,\n  class: \"hh-formerror\"\n}\nconst _hoisted_104 = [\"disabled\"]\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return (_openBlock(), _createElementBlock(\"section\", null, [\n    _createVNode($setup[\"RouterLink\"], {\n      class: \"detail__back\",\n      to: $setup.customerListTarget\n    }, {\n      default: _withCtx(() => _cache[19] || (_cache[19] = [\n        _createTextVNode(\"← Klanten\", -1 /* CACHED */)\n      ])),\n      _: 1 /* STABLE */,\n      __: [19]\n    }),\n    ($setup.loading)\n      ? (_openBlock(), _createElementBlock(\"div\", _hoisted_1, \"Laden…\"))\n      : (!$setup.customer)\n        ? (_openBlock(), _createElementBlock(\"p\", _hoisted_2, \"Klant niet gevonden.\"))\n        : (_openBlock(), _createElementBlock(_Fragment, { key: 2 }, [\n            _createElementVNode(\"div\", _hoisted_3, [\n              _createElementVNode(\"div\", null, [\n                _createElementVNode(\"h1\", _hoisted_4, [\n                  _createTextVNode(_toDisplayString($setup.displayName) + \" \", 1 /* TEXT */),\n                  ($setup.customer.archived)\n                    ? (_openBlock(), _createElementBlock(\"span\", _hoisted_5, \"gearchiveerd\"))\n                    : _createCommentVNode(\"v-if\", true)\n                ]),\n                _createElementVNode(\"p\", _hoisted_6, [\n                  _cache[20] || (_cache[20] = _createTextVNode(\"Klant \", -1 /* CACHED */)),\n                  _createElementVNode(\"span\", _hoisted_7, _toDisplayString($setup.customer.number), 1 /* TEXT */)\n                ])\n              ]),\n              _createElementVNode(\"div\", _hoisted_8, [\n                _createElementVNode(\"button\", {\n                  class: \"hh-btn\",\n                  type: \"button\",\n                  disabled: $setup.archiveSaving,\n                  onClick: _cache[0] || (_cache[0] = $event => ($setup.yearManagementOpen = true))\n                }, \"Jaar afsluiten\", 8 /* PROPS */, _hoisted_9),\n                _createElementVNode(\"button\", {\n                  class: \"hh-btn\",\n                  type: \"button\",\n                  disabled: $setup.archiveSaving,\n                  onClick: _cache[1] || (_cache[1] = $event => ($setup.editOpen = true))\n                }, \"Bewerken\", 8 /* PROPS */, _hoisted_10),\n                _createElementVNode(\"button\", {\n                  class: _normalizeClass([\"hh-btn\", $setup.customer.archived ? 'hh-btn--primary' : 'hh-btn--danger']),\n                  type: \"button\",\n                  disabled: $setup.archiveSaving,\n                  onClick: _cache[2] || (_cache[2] = $event => ($setup.customer.archived ? $setup.setCustomerArchived(false) : $setup.openArchive()))\n                }, _toDisplayString($setup.archiveSaving ? \"Bezig…\" : $setup.customer.archived ? \"Terughalen\" : \"Archiveren\"), 11 /* TEXT, CLASS, PROPS */, _hoisted_11)\n              ])\n            ]),\n            ($setup.archiveError && !$setup.archiveOpen)\n              ? (_openBlock(), _createElementBlock(\"p\", _hoisted_12, _toDisplayString($setup.archiveError), 1 /* TEXT */))\n              : _createCommentVNode(\"v-if\", true),\n            _createElementVNode(\"div\", _hoisted_13, [\n              (_openBlock(), _createElementBlock(_Fragment, null, _renderList($setup.TABS, (tab) => {\n                return _createElementVNode(\"button\", {\n                  key: tab.id,\n                  class: _normalizeClass([\"detail__tab\", { 'detail__tab--active': $setup.activeTab === tab.id }]),\n                  type: \"button\",\n                  role: \"tab\",\n                  \"aria-selected\": $setup.activeTab === tab.id,\n                  onClick: $event => ($setup.activeTab = tab.id)\n                }, _toDisplayString(tab.label), 11 /* TEXT, CLASS, PROPS */, _hoisted_14)\n              }), 64 /* STABLE_FRAGMENT */))\n            ]),\n            _createCommentVNode(\" Gegevens + budgetten \"),\n            ($setup.activeTab === 'gegevens')\n              ? (_openBlock(), _createElementBlock(\"div\", _hoisted_15, [\n                  _createElementVNode(\"section\", _hoisted_16, [\n                    _cache[28] || (_cache[28] = _createElementVNode(\"h2\", { class: \"detail__ptitle\" }, \"Gegevens\", -1 /* CACHED */)),\n                    _createElementVNode(\"dl\", _hoisted_17, [\n                      _createElementVNode(\"div\", null, [\n                        _cache[21] || (_cache[21] = _createElementVNode(\"dt\", null, \"Contactpersoon\", -1 /* CACHED */)),\n                        _createElementVNode(\"dd\", null, _toDisplayString([$setup.customer.contactTitle, $setup.customer.contactName].filter(Boolean).join(\" \") || \"\\u2014\"), 1 /* TEXT */)\n                      ]),\n                      _createElementVNode(\"div\", null, [\n                        _cache[22] || (_cache[22] = _createElementVNode(\"dt\", null, \"Adres\", -1 /* CACHED */)),\n                        _createElementVNode(\"dd\", null, _toDisplayString($setup.customer.address || \"\\u2014\"), 1 /* TEXT */)\n                      ]),\n                      _createElementVNode(\"div\", null, [\n                        _cache[23] || (_cache[23] = _createElementVNode(\"dt\", null, \"Postcode / plaats\", -1 /* CACHED */)),\n                        _createElementVNode(\"dd\", null, _toDisplayString([$setup.customer.postalCode, $setup.customer.city].filter(Boolean).join(\"  \") || \"\\u2014\"), 1 /* TEXT */)\n                      ]),\n                      _createElementVNode(\"div\", null, [\n                        _cache[24] || (_cache[24] = _createElementVNode(\"dt\", null, \"Telefoon\", -1 /* CACHED */)),\n                        _createElementVNode(\"dd\", null, _toDisplayString($setup.customer.phone || \"\\u2014\"), 1 /* TEXT */)\n                      ]),\n                      _createElementVNode(\"div\", null, [\n                        _cache[25] || (_cache[25] = _createElementVNode(\"dt\", null, \"Telefoon (reserve)\", -1 /* CACHED */)),\n                        _createElementVNode(\"dd\", null, _toDisplayString($setup.customer.phone2 || \"\\u2014\"), 1 /* TEXT */)\n                      ]),\n                      _createElementVNode(\"div\", null, [\n                        _cache[26] || (_cache[26] = _createElementVNode(\"dt\", null, \"E-mail\", -1 /* CACHED */)),\n                        _createElementVNode(\"dd\", null, _toDisplayString($setup.customer.email || \"\\u2014\"), 1 /* TEXT */)\n                      ]),\n                      _createElementVNode(\"div\", null, [\n                        _cache[27] || (_cache[27] = _createElementVNode(\"dt\", null, \"Minimumjaar\", -1 /* CACHED */)),\n                        _createElementVNode(\"dd\", null, _toDisplayString($setup.customer.minYear || \"geen\"), 1 /* TEXT */)\n                      ])\n                    ])\n                  ]),\n                  _createElementVNode(\"section\", _hoisted_18, [\n                    _createElementVNode(\"div\", _hoisted_19, [\n                      _cache[29] || (_cache[29] = _createElementVNode(\"h2\", { class: \"detail__ptitle\" }, \"Budgetten per jaar\", -1 /* CACHED */)),\n                      _createElementVNode(\"button\", {\n                        class: \"hh-btn hh-btn--small\",\n                        type: \"button\",\n                        onClick: _cache[3] || (_cache[3] = $event => ($setup.openBudget()))\n                      }, \"+ Budget\")\n                    ]),\n                    ($setup.customer.budgets.length === 0)\n                      ? (_openBlock(), _createElementBlock(\"p\", _hoisted_20, \"Nog geen budgetten ingesteld.\"))\n                      : (_openBlock(), _createElementBlock(\"table\", _hoisted_21, [\n                          _cache[30] || (_cache[30] = _createElementVNode(\"thead\", null, [\n                            _createElementVNode(\"tr\", null, [\n                              _createElementVNode(\"th\", null, \"Jaar\"),\n                              _createElementVNode(\"th\", { class: \"hh-table__num\" }, \"Budget\"),\n                              _createElementVNode(\"th\", { style: {\"width\":\"70px\"} })\n                            ])\n                          ], -1 /* CACHED */)),\n                          _createElementVNode(\"tbody\", null, [\n                            (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.customer.budgets, (budget) => {\n                              return (_openBlock(), _createElementBlock(\"tr\", {\n                                key: budget.id\n                              }, [\n                                _createElementVNode(\"td\", _hoisted_22, _toDisplayString(budget.fiscalYear), 1 /* TEXT */),\n                                _createElementVNode(\"td\", _hoisted_23, _toDisplayString($setup.formatEuro(budget.budget)), 1 /* TEXT */),\n                                _createElementVNode(\"td\", null, [\n                                  _createElementVNode(\"button\", {\n                                    class: \"hh-btn hh-btn--small\",\n                                    type: \"button\",\n                                    onClick: $event => ($setup.openBudget(budget))\n                                  }, \"Wijzig\", 8 /* PROPS */, _hoisted_24)\n                                ])\n                              ]))\n                            }), 128 /* KEYED_FRAGMENT */))\n                          ])\n                        ]))\n                  ])\n                ]))\n              : ($setup.activeTab === 'saldi')\n                ? (_openBlock(), _createElementBlock(_Fragment, { key: 2 }, [\n                    _createCommentVNode(\" Saldi per jaar \"),\n                    _createElementVNode(\"div\", _hoisted_25, [\n                      ($setup.years.length === 0)\n                        ? (_openBlock(), _createElementBlock(\"p\", _hoisted_26, \"Nog geen boekingen voor deze klant.\"))\n                        : (_openBlock(), _createElementBlock(\"table\", _hoisted_27, [\n                            _cache[31] || (_cache[31] = _createElementVNode(\"thead\", null, [\n                              _createElementVNode(\"tr\", null, [\n                                _createElementVNode(\"th\", null, \"Jaar\"),\n                                _createElementVNode(\"th\", { class: \"hh-table__num\" }, \"Uren\"),\n                                _createElementVNode(\"th\", { class: \"hh-table__num\" }, \"Gedeclareerd\"),\n                                _createElementVNode(\"th\", { class: \"hh-table__num\" }, \"Nog te declareren\"),\n                                _createElementVNode(\"th\", { class: \"hh-table__num\" }, \"Budget\"),\n                                _createElementVNode(\"th\", { class: \"hh-table__num\" }, \"Besteed\"),\n                                _createElementVNode(\"th\", { style: {\"width\":\"150px\"} })\n                              ])\n                            ], -1 /* CACHED */)),\n                            _createElementVNode(\"tbody\", null, [\n                              (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.years, (year) => {\n                                return (_openBlock(), _createElementBlock(\"tr\", { key: year }, [\n                                  _createElementVNode(\"td\", _hoisted_28, [\n                                    _createTextVNode(_toDisplayString(year) + \" \", 1 /* TEXT */),\n                                    ($setup.saldi[year]?.closed)\n                                      ? (_openBlock(), _createElementBlock(\"span\", _hoisted_29, \"afgesloten\"))\n                                      : _createCommentVNode(\"v-if\", true)\n                                  ]),\n                                  _createElementVNode(\"td\", _hoisted_30, _toDisplayString($setup.saldi[year] ? $setup.formatHours($setup.saldi[year].tellen.totalHours) : \"…\"), 1 /* TEXT */),\n                                  _createElementVNode(\"td\", _hoisted_31, _toDisplayString($setup.saldi[year] ? $setup.formatEuro($setup.saldi[year].tellen.declared) : \"…\"), 1 /* TEXT */),\n                                  _createElementVNode(\"td\", _hoisted_32, _toDisplayString($setup.saldi[year] ? $setup.formatEuro($setup.saldi[year].tellen.toDeclare) : \"…\"), 1 /* TEXT */),\n                                  _createElementVNode(\"td\", _hoisted_33, _toDisplayString($setup.budgetFor(year) !== null ? $setup.formatEuro($setup.budgetFor(year)!) : \"\\u2014\"), 1 /* TEXT */),\n                                  _createElementVNode(\"td\", _hoisted_34, _toDisplayString($setup.saldi[year] ? $setup.formatEuro($setup.saldi[year].tellen.totalCosts) : \"…\"), 1 /* TEXT */),\n                                  _createElementVNode(\"td\", null, [\n                                    ($setup.saldi[year])\n                                      ? (_openBlock(), _createElementBlock(\"button\", {\n                                          key: 0,\n                                          class: \"hh-btn hh-btn--small\",\n                                          type: \"button\",\n                                          onClick: _cache[4] || (_cache[4] = $event => ($setup.yearManagementOpen = true))\n                                        }, \"Jaar beheren\"))\n                                      : _createCommentVNode(\"v-if\", true)\n                                  ])\n                                ]))\n                              }), 128 /* KEYED_FRAGMENT */))\n                            ])\n                          ]))\n                    ])\n                  ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n                : ($setup.activeTab === 'produktie')\n                  ? (_openBlock(), _createElementBlock(_Fragment, { key: 3 }, [\n                      _createCommentVNode(\" Produktiestaat \"),\n                      _createElementVNode(\"div\", null, [\n                        ($setup.years.length > 0)\n                          ? (_openBlock(), _createElementBlock(\"div\", _hoisted_35, [\n                              _createElementVNode(\"label\", _hoisted_36, [\n                                _cache[32] || (_cache[32] = _createTextVNode(\"Jaar \", -1 /* CACHED */)),\n                                _withDirectives(_createElementVNode(\"select\", {\n                                  \"onUpdate:modelValue\": _cache[5] || (_cache[5] = $event => (($setup.produktieYear) = $event)),\n                                  class: \"hh-select detail__yselect\"\n                                }, [\n                                  ($setup.produktieYear > 0 && !$setup.years.includes($setup.produktieYear))\n                                    ? (_openBlock(), _createElementBlock(\"option\", {\n                                        key: 0,\n                                        value: $setup.produktieYear\n                                      }, _toDisplayString($setup.produktieYear), 9 /* TEXT, PROPS */, _hoisted_37))\n                                    : _createCommentVNode(\"v-if\", true),\n                                  (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.years, (year) => {\n                                    return (_openBlock(), _createElementBlock(\"option\", {\n                                      key: year,\n                                      value: year\n                                    }, _toDisplayString(year), 9 /* TEXT, PROPS */, _hoisted_38))\n                                  }), 128 /* KEYED_FRAGMENT */))\n                                ], 512 /* NEED_PATCH */), [\n                                  [\n                                    _vModelSelect,\n                                    $setup.produktieYear,\n                                    void 0,\n                                    { number: true }\n                                  ]\n                                ])\n                              ])\n                            ]))\n                          : _createCommentVNode(\"v-if\", true),\n                        _createElementVNode(\"div\", _hoisted_39, [\n                          ($setup.years.length === 0)\n                            ? (_openBlock(), _createElementBlock(\"p\", _hoisted_40, \"Nog geen boekingen voor deze klant.\"))\n                            : (_openBlock(), _createElementBlock(\"table\", _hoisted_41, [\n                                _cache[39] || (_cache[39] = _createElementVNode(\"thead\", null, [\n                                  _createElementVNode(\"tr\", null, [\n                                    _createElementVNode(\"th\", null, \"Groep\"),\n                                    _createElementVNode(\"th\", { class: \"hh-table__num\" }, \"Uren\"),\n                                    _createElementVNode(\"th\", { class: \"hh-table__num\" }, \"Bedrag\")\n                                  ])\n                                ], -1 /* CACHED */)),\n                                _createElementVNode(\"tbody\", null, [\n                                  (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.production.groups, (group) => {\n                                    return (_openBlock(), _createElementBlock(\"tr\", {\n                                      key: group.group\n                                    }, [\n                                      _createElementVNode(\"td\", null, _toDisplayString(group.label), 1 /* TEXT */),\n                                      _createElementVNode(\"td\", _hoisted_42, _toDisplayString($setup.formatHours(group.hours)), 1 /* TEXT */),\n                                      _createElementVNode(\"td\", _hoisted_43, _toDisplayString($setup.formatEuro(group.amount)), 1 /* TEXT */)\n                                    ]))\n                                  }), 128 /* KEYED_FRAGMENT */)),\n                                  ($setup.production.groups.length === 0)\n                                    ? (_openBlock(), _createElementBlock(\"tr\", _hoisted_44, _cache[33] || (_cache[33] = [\n                                        _createElementVNode(\"td\", {\n                                          colspan: \"3\",\n                                          class: \"hh-muted\"\n                                        }, \"Geen uren in dit jaar.\", -1 /* CACHED */)\n                                      ])))\n                                    : _createCommentVNode(\"v-if\", true),\n                                  _createElementVNode(\"tr\", _hoisted_45, [\n                                    _cache[34] || (_cache[34] = _createElementVNode(\"td\", null, \"Subtotaal uren\", -1 /* CACHED */)),\n                                    _createElementVNode(\"td\", _hoisted_46, _toDisplayString($setup.formatHours($setup.production.hoursTotal)), 1 /* TEXT */),\n                                    _createElementVNode(\"td\", _hoisted_47, _toDisplayString($setup.formatEuro($setup.production.hoursAmountTotal)), 1 /* TEXT */)\n                                  ]),\n                                  _createElementVNode(\"tr\", null, [\n                                    _cache[35] || (_cache[35] = _createElementVNode(\"td\", null, \"Verschotten\", -1 /* CACHED */)),\n                                    _cache[36] || (_cache[36] = _createElementVNode(\"td\", { class: \"hh-table__num\" }, null, -1 /* CACHED */)),\n                                    _createElementVNode(\"td\", _hoisted_48, _toDisplayString($setup.formatEuro($setup.production.expensesTotal)), 1 /* TEXT */)\n                                  ]),\n                                  _createElementVNode(\"tr\", _hoisted_49, [\n                                    _cache[37] || (_cache[37] = _createElementVNode(\"td\", null, \"Totaal produktie\", -1 /* CACHED */)),\n                                    _cache[38] || (_cache[38] = _createElementVNode(\"td\", { class: \"hh-table__num\" }, null, -1 /* CACHED */)),\n                                    _createElementVNode(\"td\", _hoisted_50, _toDisplayString($setup.formatEuro($setup.production.grandTotal)), 1 /* TEXT */)\n                                  ])\n                                ])\n                              ]))\n                        ])\n                      ])\n                    ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n                  : ($setup.activeTab === 'boekingen')\n                    ? (_openBlock(), _createElementBlock(_Fragment, { key: 4 }, [\n                        _createCommentVNode(\" Boekingen \"),\n                        _createElementVNode(\"div\", null, [\n                          _createElementVNode(\"div\", _hoisted_51, [\n                            _createElementVNode(\"label\", _hoisted_52, [\n                              _cache[41] || (_cache[41] = _createTextVNode(\"Jaar \", -1 /* CACHED */)),\n                              _withDirectives(_createElementVNode(\"select\", {\n                                \"onUpdate:modelValue\": _cache[6] || (_cache[6] = $event => (($setup.boekingenYear) = $event)),\n                                class: \"hh-select detail__yselect\"\n                              }, [\n                                _cache[40] || (_cache[40] = _createElementVNode(\"option\", { value: \"all\" }, \"Alle jaren\", -1 /* CACHED */)),\n                                ($setup.boekingenYear !== 'all' && !$setup.years.includes(Number($setup.boekingenYear)))\n                                  ? (_openBlock(), _createElementBlock(\"option\", {\n                                      key: 0,\n                                      value: $setup.boekingenYear\n                                    }, _toDisplayString($setup.boekingenYear), 9 /* TEXT, PROPS */, _hoisted_53))\n                                  : _createCommentVNode(\"v-if\", true),\n                                (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.years, (year) => {\n                                  return (_openBlock(), _createElementBlock(\"option\", {\n                                    key: year,\n                                    value: String(year)\n                                  }, _toDisplayString(year), 9 /* TEXT, PROPS */, _hoisted_54))\n                                }), 128 /* KEYED_FRAGMENT */))\n                              ], 512 /* NEED_PATCH */), [\n                                [_vModelSelect, $setup.boekingenYear]\n                              ])\n                            ])\n                          ]),\n                          _createElementVNode(\"section\", _hoisted_55, [\n                            _cache[43] || (_cache[43] = _createElementVNode(\"h2\", { class: \"detail__ptitle\" }, \"Facturen\", -1 /* CACHED */)),\n                            _createElementVNode(\"div\", _hoisted_56, [\n                              ($setup.filteredInvoices.length === 0)\n                                ? (_openBlock(), _createElementBlock(\"p\", _hoisted_57, \"Geen facturen.\"))\n                                : (_openBlock(), _createElementBlock(\"table\", _hoisted_58, [\n                                    _cache[42] || (_cache[42] = _createElementVNode(\"thead\", null, [\n                                      _createElementVNode(\"tr\", null, [\n                                        _createElementVNode(\"th\", null, \"Nummer\"),\n                                        _createElementVNode(\"th\", null, \"Datum\"),\n                                        _createElementVNode(\"th\", { class: \"hh-table__num\" }, \"Excl. btw\")\n                                      ])\n                                    ], -1 /* CACHED */)),\n                                    _createElementVNode(\"tbody\", null, [\n                                      (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.filteredInvoices, (invoice) => {\n                                        return (_openBlock(), _createElementBlock(\"tr\", {\n                                          key: invoice.id,\n                                          class: \"is-clickable\",\n                                          onClick: $event => ($setup.openInvoice(invoice.id))\n                                        }, [\n                                          _createElementVNode(\"td\", _hoisted_60, _toDisplayString(invoice.number), 1 /* TEXT */),\n                                          _createElementVNode(\"td\", null, _toDisplayString($setup.formatDate(invoice.date)), 1 /* TEXT */),\n                                          _createElementVNode(\"td\", _hoisted_61, _toDisplayString($setup.formatEuro(invoice.amount)), 1 /* TEXT */)\n                                        ], 8 /* PROPS */, _hoisted_59))\n                                      }), 128 /* KEYED_FRAGMENT */))\n                                    ])\n                                  ]))\n                            ])\n                          ]),\n                          _createElementVNode(\"section\", _hoisted_62, [\n                            _cache[45] || (_cache[45] = _createElementVNode(\"h2\", { class: \"detail__ptitle\" }, \"Uren\", -1 /* CACHED */)),\n                            _createElementVNode(\"div\", _hoisted_63, [\n                              ($setup.filteredEntries.length === 0)\n                                ? (_openBlock(), _createElementBlock(\"p\", _hoisted_64, \"Geen urenregels.\"))\n                                : (_openBlock(), _createElementBlock(\"table\", _hoisted_65, [\n                                    _cache[44] || (_cache[44] = _createElementVNode(\"thead\", null, [\n                                      _createElementVNode(\"tr\", null, [\n                                        _createElementVNode(\"th\", null, \"Datum\"),\n                                        _createElementVNode(\"th\", null, \"Werknemer\"),\n                                        _createElementVNode(\"th\", null, \"Werkz.\"),\n                                        _createElementVNode(\"th\", null, \"Omschrijving\"),\n                                        _createElementVNode(\"th\", { class: \"hh-table__num\" }, \"Uren\"),\n                                        _createElementVNode(\"th\", { class: \"hh-table__num\" }, \"Bedrag\")\n                                      ])\n                                    ], -1 /* CACHED */)),\n                                    _createElementVNode(\"tbody\", null, [\n                                      (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.filteredEntries, (entry) => {\n                                        return (_openBlock(), _createElementBlock(\"tr\", {\n                                          key: entry.id\n                                        }, [\n                                          _createElementVNode(\"td\", null, _toDisplayString($setup.formatDate(entry.date)), 1 /* TEXT */),\n                                          _createElementVNode(\"td\", null, _toDisplayString(entry.employeeName), 1 /* TEXT */),\n                                          _createElementVNode(\"td\", _hoisted_66, _toDisplayString(entry.activityCode), 1 /* TEXT */),\n                                          _createElementVNode(\"td\", _hoisted_67, _toDisplayString(entry.description || \"\\u2014\"), 1 /* TEXT */),\n                                          _createElementVNode(\"td\", _hoisted_68, _toDisplayString($setup.formatHours(entry.hours)), 1 /* TEXT */),\n                                          _createElementVNode(\"td\", _hoisted_69, _toDisplayString($setup.formatEuro(entry.amount)), 1 /* TEXT */)\n                                        ]))\n                                      }), 128 /* KEYED_FRAGMENT */))\n                                    ])\n                                  ]))\n                            ])\n                          ]),\n                          _createElementVNode(\"section\", _hoisted_70, [\n                            _cache[47] || (_cache[47] = _createElementVNode(\"h2\", { class: \"detail__ptitle\" }, \"Verschotten\", -1 /* CACHED */)),\n                            _createElementVNode(\"div\", _hoisted_71, [\n                              ($setup.filteredExpenses.length === 0)\n                                ? (_openBlock(), _createElementBlock(\"p\", _hoisted_72, \"Geen verschotten.\"))\n                                : (_openBlock(), _createElementBlock(\"table\", _hoisted_73, [\n                                    _cache[46] || (_cache[46] = _createElementVNode(\"thead\", null, [\n                                      _createElementVNode(\"tr\", null, [\n                                        _createElementVNode(\"th\", null, \"Datum\"),\n                                        _createElementVNode(\"th\", null, \"Boekjaar\"),\n                                        _createElementVNode(\"th\", null, \"Soort\"),\n                                        _createElementVNode(\"th\", null, \"Omschrijving\"),\n                                        _createElementVNode(\"th\", { class: \"hh-table__num\" }, \"Bedrag\")\n                                      ])\n                                    ], -1 /* CACHED */)),\n                                    _createElementVNode(\"tbody\", null, [\n                                      (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.filteredExpenses, (expense) => {\n                                        return (_openBlock(), _createElementBlock(\"tr\", {\n                                          key: expense.id\n                                        }, [\n                                          _createElementVNode(\"td\", null, _toDisplayString($setup.formatDate(expense.date)), 1 /* TEXT */),\n                                          _createElementVNode(\"td\", _hoisted_74, _toDisplayString(expense.fiscalYear), 1 /* TEXT */),\n                                          _createElementVNode(\"td\", _hoisted_75, _toDisplayString($setup.kindLabel(expense.kind)), 1 /* TEXT */),\n                                          _createElementVNode(\"td\", null, [\n                                            _createTextVNode(_toDisplayString(expense.description || \"\\u2014\"), 1 /* TEXT */),\n                                            (expense.transferPartnerId)\n                                              ? (_openBlock(), _createElementBlock(\"span\", _hoisted_76, _toDisplayString($setup.expenseTransferLabel(expense)), 1 /* TEXT */))\n                                              : _createCommentVNode(\"v-if\", true)\n                                          ]),\n                                          _createElementVNode(\"td\", _hoisted_77, _toDisplayString($setup.formatEuro(expense.amount)), 1 /* TEXT */)\n                                        ]))\n                                      }), 128 /* KEYED_FRAGMENT */))\n                                    ])\n                                  ]))\n                            ])\n                          ])\n                        ])\n                      ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n                    : ($setup.activeTab === 'herinneringen')\n                      ? (_openBlock(), _createElementBlock(_Fragment, { key: 5 }, [\n                          _createCommentVNode(\" Betalingsherinneringen \"),\n                          _createElementVNode(\"div\", null, [\n                            _createElementVNode(\"div\", _hoisted_78, [\n                              _cache[48] || (_cache[48] = _createElementVNode(\"div\", { class: \"detail__spacer\" }, null, -1 /* CACHED */)),\n                              _createElementVNode(\"button\", {\n                                class: \"hh-btn hh-btn--primary hh-btn--small\",\n                                type: \"button\",\n                                onClick: _cache[7] || (_cache[7] = $event => ($setup.reminderCreateOpen = true))\n                              }, \"+ Nieuwe betalingsherinnering\")\n                            ]),\n                            _createElementVNode(\"div\", _hoisted_79, [\n                              ($setup.remindersLoading)\n                                ? (_openBlock(), _createElementBlock(\"div\", _hoisted_80, \"Laden\\\\u2026\"))\n                                : ($setup.reminders.length === 0)\n                                  ? (_openBlock(), _createElementBlock(\"p\", _hoisted_81, \"Nog geen betalingsherinneringen voor deze klant.\"))\n                                  : (_openBlock(), _createElementBlock(\"table\", _hoisted_82, [\n                                      _cache[49] || (_cache[49] = _createElementVNode(\"thead\", null, [\n                                        _createElementVNode(\"tr\", null, [\n                                          _createElementVNode(\"th\", null, \"Nummer\"),\n                                          _createElementVNode(\"th\", null, \"Datum\"),\n                                          _createElementVNode(\"th\", { class: \"hh-table__num\" }, \"Facturen\"),\n                                          _createElementVNode(\"th\", { class: \"hh-table__num\" }, \"Totaal openstaand\"),\n                                          _createElementVNode(\"th\", null, \"Status\")\n                                        ])\n                                      ], -1 /* CACHED */)),\n                                      _createElementVNode(\"tbody\", null, [\n                                        (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.reminders, (reminder) => {\n                                          return (_openBlock(), _createElementBlock(\"tr\", {\n                                            key: reminder.id,\n                                            class: \"is-clickable\",\n                                            onClick: $event => ($setup.openReminder(reminder.id))\n                                          }, [\n                                            _createElementVNode(\"td\", _hoisted_84, _toDisplayString(reminder.number), 1 /* TEXT */),\n                                            _createElementVNode(\"td\", null, _toDisplayString($setup.formatDate(reminder.date)), 1 /* TEXT */),\n                                            _createElementVNode(\"td\", _hoisted_85, _toDisplayString(reminder.invoiceCount), 1 /* TEXT */),\n                                            _createElementVNode(\"td\", _hoisted_86, _toDisplayString($setup.formatEuro(reminder.totalOpen)), 1 /* TEXT */),\n                                            _createElementVNode(\"td\", null, [\n                                              (reminder.sent)\n                                                ? (_openBlock(), _createElementBlock(\"span\", _hoisted_87, \"verzonden \" + _toDisplayString($setup.formatDate(reminder.sentDate)), 1 /* TEXT */))\n                                                : (_openBlock(), _createElementBlock(\"span\", _hoisted_88, \"concept\"))\n                                            ])\n                                          ], 8 /* PROPS */, _hoisted_83))\n                                        }), 128 /* KEYED_FRAGMENT */))\n                                      ])\n                                    ]))\n                            ])\n                          ])\n                        ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */))\n                      : _createCommentVNode(\"v-if\", true)\n          ], 64 /* STABLE_FRAGMENT */)),\n    _createCommentVNode(\" Klant bewerken \"),\n    ($setup.editOpen && $setup.customer)\n      ? (_openBlock(), _createBlock($setup[\"CustomerFormDialog\"], {\n          key: 3,\n          customer: $setup.customer,\n          onClose: _cache[8] || (_cache[8] = $event => ($setup.editOpen = false)),\n          onSaved: $setup.onEdited\n        }, null, 8 /* PROPS */, [\"customer\"]))\n      : _createCommentVNode(\"v-if\", true),\n    ($setup.archiveOpen && $setup.customer)\n      ? (_openBlock(), _createBlock($setup[\"AppDialog\"], {\n          key: 4,\n          title: \"Klant archiveren\",\n          onClose: $setup.closeArchive\n        }, {\n          footer: _withCtx(() => [\n            _createElementVNode(\"button\", {\n              class: \"hh-btn\",\n              type: \"button\",\n              \"data-autofocus\": \"\",\n              disabled: $setup.archiveSaving,\n              onClick: $setup.closeArchive\n            }, \"Annuleren\", 8 /* PROPS */, _hoisted_90),\n            _createElementVNode(\"button\", {\n              class: \"hh-btn hh-btn--danger\",\n              type: \"button\",\n              disabled: $setup.archiveSaving,\n              onClick: _cache[9] || (_cache[9] = $event => ($setup.setCustomerArchived(true)))\n            }, _toDisplayString($setup.archiveSaving ? \"Archiveren…\" : \"Archiveren\"), 9 /* TEXT, PROPS */, _hoisted_91)\n          ]),\n          default: _withCtx(() => [\n            _createElementVNode(\"p\", null, [\n              _cache[50] || (_cache[50] = _createTextVNode(\"Weet je zeker dat je \", -1 /* CACHED */)),\n              _createElementVNode(\"strong\", null, _toDisplayString($setup.displayName), 1 /* TEXT */),\n              _cache[51] || (_cache[51] = _createTextVNode(\" wilt archiveren? De klant verdwijnt uit de actieve lijst. De historie blijft bewaard.\", -1 /* CACHED */))\n            ]),\n            ($setup.archiveError)\n              ? (_openBlock(), _createElementBlock(\"p\", _hoisted_89, _toDisplayString($setup.archiveError), 1 /* TEXT */))\n              : _createCommentVNode(\"v-if\", true)\n          ]),\n          _: 1 /* STABLE */\n        }))\n      : _createCommentVNode(\"v-if\", true),\n    _createCommentVNode(\" Nieuwe betalingsherinnering \"),\n    ($setup.reminderCreateOpen)\n      ? (_openBlock(), _createBlock($setup[\"ReminderFormDialog\"], {\n          key: 5,\n          \"customer-id\": $setup.customerId,\n          onClose: _cache[10] || (_cache[10] = $event => ($setup.reminderCreateOpen = false)),\n          onSaved: $setup.onReminderCreated\n        }, null, 8 /* PROPS */, [\"customer-id\"]))\n      : _createCommentVNode(\"v-if\", true),\n    _createCommentVNode(\" Budget toevoegen/wijzigen \"),\n    ($setup.budgetOpen)\n      ? (_openBlock(), _createBlock($setup[\"AppDialog\"], {\n          key: 6,\n          title: $setup.budgetEditing ? 'Budget wijzigen' : 'Budget toevoegen',\n          onClose: _cache[14] || (_cache[14] = $event => ($setup.budgetOpen = false))\n        }, {\n          footer: _withCtx(() => [\n            _createElementVNode(\"button\", {\n              class: \"hh-btn\",\n              type: \"button\",\n              onClick: _cache[13] || (_cache[13] = $event => ($setup.budgetOpen = false))\n            }, \"Annuleren\"),\n            _createElementVNode(\"button\", {\n              class: \"hh-btn hh-btn--primary\",\n              type: \"button\",\n              disabled: $setup.budgetSaving,\n              onClick: $setup.submitBudget\n            }, _toDisplayString($setup.budgetSaving ? \"Opslaan…\" : \"Opslaan\"), 9 /* TEXT, PROPS */, _hoisted_94)\n          ]),\n          default: _withCtx(() => [\n            _createElementVNode(\"form\", {\n              onSubmit: _withModifiers($setup.submitBudget, [\"prevent\"])\n            }, [\n              ($setup.budgetError)\n                ? (_openBlock(), _createElementBlock(\"p\", _hoisted_92, _toDisplayString($setup.budgetError), 1 /* TEXT */))\n                : _createCommentVNode(\"v-if\", true),\n              _createVNode($setup[\"FormField\"], {\n                label: \"Jaar\",\n                \"for-id\": \"b-year\",\n                required: \"\",\n                error: $setup.budgetFieldErrors.year\n              }, {\n                default: _withCtx(() => [\n                  _withDirectives(_createElementVNode(\"input\", {\n                    id: \"b-year\",\n                    \"onUpdate:modelValue\": _cache[11] || (_cache[11] = $event => (($setup.budgetForm.year) = $event)),\n                    class: _normalizeClass([\"hh-input hh-input--num\", { 'hh-input--error': $setup.budgetFieldErrors.year }]),\n                    \"data-autofocus\": \"\",\n                    inputmode: \"numeric\",\n                    disabled: Boolean($setup.budgetEditing)\n                  }, null, 10 /* CLASS, PROPS */, _hoisted_93), [\n                    [\n                      _vModelText,\n                      $setup.budgetForm.year,\n                      void 0,\n                      { number: true }\n                    ]\n                  ])\n                ]),\n                _: 1 /* STABLE */\n              }, 8 /* PROPS */, [\"error\"]),\n              _createVNode($setup[\"FormField\"], {\n                label: \"Budget (€)\",\n                \"for-id\": \"b-amount\",\n                required: \"\",\n                error: $setup.budgetFieldErrors.amount\n              }, {\n                default: _withCtx(() => [\n                  _withDirectives(_createElementVNode(\"input\", {\n                    id: \"b-amount\",\n                    \"onUpdate:modelValue\": _cache[12] || (_cache[12] = $event => (($setup.budgetForm.amount) = $event)),\n                    class: _normalizeClass([\"hh-input hh-input--num\", { 'hh-input--error': $setup.budgetFieldErrors.amount }]),\n                    inputmode: \"decimal\"\n                  }, null, 2 /* CLASS */), [\n                    [\n                      _vModelText,\n                      $setup.budgetForm.amount,\n                      void 0,\n                      { trim: true }\n                    ]\n                  ])\n                ]),\n                _: 1 /* STABLE */\n              }, 8 /* PROPS */, [\"error\"]),\n              _cache[52] || (_cache[52] = _createElementVNode(\"button\", {\n                type: \"submit\",\n                hidden: \"\"\n              }, null, -1 /* CACHED */))\n            ], 32 /* NEED_HYDRATION */)\n          ]),\n          _: 1 /* STABLE */\n        }, 8 /* PROPS */, [\"title\"]))\n      : _createCommentVNode(\"v-if\", true),\n    ($setup.yearManagementOpen)\n      ? (_openBlock(), _createBlock($setup[\"AppDialog\"], {\n          key: 7,\n          title: \"Boekjaren beheren\",\n          wide: \"\",\n          onClose: _cache[16] || (_cache[16] = $event => ($setup.yearManagementOpen = false))\n        }, {\n          footer: _withCtx(() => [\n            _createElementVNode(\"button\", {\n              class: \"hh-btn\",\n              type: \"button\",\n              onClick: _cache[15] || (_cache[15] = $event => ($setup.yearManagementOpen = false))\n            }, \"Sluiten\")\n          ]),\n          default: _withCtx(() => [\n            ($setup.yearManagementError)\n              ? (_openBlock(), _createElementBlock(\"p\", _hoisted_95, _toDisplayString($setup.yearManagementError), 1 /* TEXT */))\n              : _createCommentVNode(\"v-if\", true),\n            _createElementVNode(\"div\", _hoisted_96, [\n              _createElementVNode(\"table\", _hoisted_97, [\n                _cache[53] || (_cache[53] = _createElementVNode(\"thead\", null, [\n                  _createElementVNode(\"tr\", null, [\n                    _createElementVNode(\"th\", null, \"Jaar\"),\n                    _createElementVNode(\"th\", null, \"Status\"),\n                    _createElementVNode(\"th\", null, \"Boekingen\"),\n                    _createElementVNode(\"th\")\n                  ])\n                ], -1 /* CACHED */)),\n                _createElementVNode(\"tbody\", null, [\n                  (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.managedYears, (year) => {\n                    return (_openBlock(), _createElementBlock(\"tr\", {\n                      key: year.fiscalYear\n                    }, [\n                      _createElementVNode(\"td\", _hoisted_98, _toDisplayString(year.fiscalYear), 1 /* TEXT */),\n                      _createElementVNode(\"td\", null, [\n                        _createTextVNode(_toDisplayString(year.closed ? \"Afgesloten\" : \"Open\"), 1 /* TEXT */),\n                        (year.belowMinimum)\n                          ? (_openBlock(), _createElementBlock(\"span\", _hoisted_99, \" (vóór minimumjaar)\"))\n                          : _createCommentVNode(\"v-if\", true)\n                      ]),\n                      _createElementVNode(\"td\", null, _toDisplayString(year.hasBookings ? \"Ja\" : \"Geen\"), 1 /* TEXT */),\n                      _createElementVNode(\"td\", null, [\n                        _createElementVNode(\"button\", {\n                          class: \"hh-btn hh-btn--small\",\n                          type: \"button\",\n                          disabled: $setup.closing,\n                          onClick: $event => (year.closed ? $setup.reopenYear(year.fiscalYear) : $setup.openCloseYear(year.fiscalYear))\n                        }, _toDisplayString(year.closed ? \"Heropenen\" : \"Jaar afsluiten\"), 9 /* TEXT, PROPS */, _hoisted_100)\n                      ])\n                    ]))\n                  }), 128 /* KEYED_FRAGMENT */))\n                ])\n              ])\n            ]),\n            _cache[54] || (_cache[54] = _createElementVNode(\"p\", { class: \"detail__yearnote\" }, \"Het minimumjaar blijft gelden, ook na heropenen.\", -1 /* CACHED */))\n          ]),\n          _: 1 /* STABLE */,\n          __: [54]\n        }))\n      : _createCommentVNode(\"v-if\", true),\n    _createCommentVNode(\" Jaarafsluiting (klassieke checklist-bevestiging) \"),\n    ($setup.closeYearTarget !== null)\n      ? (_openBlock(), _createBlock($setup[\"AppDialog\"], {\n          key: 8,\n          title: `Jaar ${$setup.closeYearTarget} afsluiten`,\n          onClose: _cache[18] || (_cache[18] = $event => ($setup.closeYearTarget = null))\n        }, {\n          footer: _withCtx(() => [\n            _createElementVNode(\"button\", {\n              class: \"hh-btn\",\n              type: \"button\",\n              onClick: _cache[17] || (_cache[17] = $event => ($setup.closeYearTarget = null))\n            }, \"Terug\"),\n            _createElementVNode(\"button\", {\n              class: \"hh-btn hh-btn--primary\",\n              type: \"button\",\n              \"data-autofocus\": \"\",\n              disabled: $setup.closing,\n              onClick: $setup.confirmCloseYear\n            }, _toDisplayString($setup.closing ? \"Afsluiten…\" : \"Jaar afsluiten\"), 9 /* TEXT, PROPS */, _hoisted_104)\n          ]),\n          default: _withCtx(() => [\n            _cache[55] || (_cache[55] = _createElementVNode(\"p\", { class: \"detail__closeintro\" }, \"Loop de checklist na voordat je het jaar afsluit. Na afsluiten zijn er geen boekingen meer mogelijk voor dit jaar (de historie blijft bewaard).\", -1 /* CACHED */)),\n            _createElementVNode(\"ul\", _hoisted_101, [\n              (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.checklist, (item, index) => {\n                return (_openBlock(), _createElementBlock(\"li\", { key: index }, [\n                  _createElementVNode(\"label\", null, [\n                    _withDirectives(_createElementVNode(\"input\", {\n                      \"onUpdate:modelValue\": $event => ((item.checked) = $event),\n                      type: \"checkbox\"\n                    }, null, 8 /* PROPS */, _hoisted_102), [\n                      [_vModelCheckbox, item.checked]\n                    ]),\n                    _createTextVNode(\" \" + _toDisplayString(item.label), 1 /* TEXT */)\n                  ])\n                ]))\n              }), 128 /* KEYED_FRAGMENT */))\n            ]),\n            ($setup.closeYearError)\n              ? (_openBlock(), _createElementBlock(\"p\", _hoisted_103, _toDisplayString($setup.closeYearError), 1 /* TEXT */))\n              : _createCommentVNode(\"v-if\", true)\n          ]),\n          _: 1 /* STABLE */,\n          __: [55]\n        }, 8 /* PROPS */, [\"title\"]))\n      : _createCommentVNode(\"v-if\", true)\n  ]))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/CustomerDetailView.vue?type=script\";import \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/CustomerDetailView.vue?type=style&index=0\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/CustomerDetailView.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/CustomerDetailView.vue\";script.__scopeId = \"data-v-7f617474\";export default script;","export interface ArchiveListState {\n  includeArchived: boolean;\n}\n\nexport function parseArchiveListState(query: Record<string, string | undefined>): ArchiveListState {\n  return { includeArchived: query.archief === \"1\" };\n}\n\nexport function archiveListStateToQuery(state: ArchiveListState): Record<string, string> {\n  return state.includeArchived ? { archief: \"1\" } : {};\n}\n","<template>\n  <form @submit.prevent=\"submit\">\n    <p v-if=\"formError\" class=\"hh-formerror\" role=\"alert\">{{ formError }}</p>\n    <fieldset class=\"employee-form__fields\" :disabled=\"saving\">\n      <FormField label=\"Code\" for-id=\"emp-code\" required :error=\"fieldErrors.code\">\n        <input id=\"emp-code\" v-model.trim=\"form.code\" class=\"hh-input hh-input--mono\" data-autofocus :class=\"{ 'hh-input--error': fieldErrors.code }\" maxlength=\"4\" />\n      </FormField>\n      <div class=\"employee-form__row\">\n        <FormField label=\"Voornaam\" for-id=\"emp-first\" :error=\"fieldErrors.firstName\">\n          <input id=\"emp-first\" v-model.trim=\"form.firstName\" class=\"hh-input\" :class=\"{ 'hh-input--error': fieldErrors.firstName }\" />\n        </FormField>\n        <FormField label=\"Initialen\" for-id=\"emp-initials\" :error=\"fieldErrors.initials\">\n          <input id=\"emp-initials\" v-model.trim=\"form.initials\" class=\"hh-input\" :class=\"{ 'hh-input--error': fieldErrors.initials }\" />\n        </FormField>\n        <FormField label=\"Achternaam\" for-id=\"emp-last\" :error=\"fieldErrors.lastName\">\n          <input id=\"emp-last\" v-model.trim=\"form.lastName\" class=\"hh-input\" :class=\"{ 'hh-input--error': fieldErrors.lastName }\" />\n        </FormField>\n      </div>\n      <FormField label=\"Uurtarief (€)\" for-id=\"emp-rate\" :error=\"fieldErrors.hourlyRate\">\n        <input id=\"emp-rate\" v-model.trim=\"form.hourlyRate\" class=\"hh-input hh-input--num\" :class=\"{ 'hh-input--error': fieldErrors.hourlyRate }\" inputmode=\"decimal\" />\n      </FormField>\n    </fieldset>\n    <div class=\"employee-form__actions\">\n      <button class=\"hh-btn\" type=\"button\" :disabled=\"saving\" @click=\"emit('cancel')\">Annuleren</button>\n      <button class=\"hh-btn hh-btn--primary\" type=\"submit\" :disabled=\"saving\">\n        {{ saving ? \"Opslaan…\" : employee ? \"Opslaan\" : \"Aanmaken\" }}\n      </button>\n    </div>\n  </form>\n</template>\n\n<script setup lang=\"ts\">\nimport { reactive, ref } from \"vue\";\nimport { Money } from \"@webhare/std\";\nimport { useApi } from \"../lib/api\";\nimport { useOrganizationDirty } from \"../lib/organization\";\nimport FormField from \"./FormField.vue\";\n\nconst api = useApi();\ntype Employee = NonNullable<Awaited<ReturnType<typeof api.getEmployee>>>;\nconst props = withDefaults(defineProps<{ employee?: Employee | null }>(), { employee: null });\nconst emit = defineEmits<{ cancel: []; saved: [number]; busy: [boolean] }>();\nconst saving = ref(false);\nconst formError = ref(\"\");\nconst fieldErrors = reactive<Record<string, string>>({});\n// Money is als object altijd truthy: expliciet op 0 toetsen voor een leeg veld.\nconst hourlyRate = props.employee && Money.check(props.employee.hourlyRate, \"!=\", \"0\") ? String(props.employee.hourlyRate) : \"\";\nconst form = reactive({\n  code: props.employee?.code ?? \"\",\n  firstName: props.employee?.firstName ?? \"\",\n  initials: props.employee?.initials ?? \"\",\n  lastName: props.employee?.lastName ?? \"\",\n  hourlyRate,\n});\nlet savedSnapshot = JSON.stringify(form);\nuseOrganizationDirty(() => savedSnapshot !== JSON.stringify(form));\n\nfunction validate(): boolean {\n  for (const key of Object.keys(fieldErrors)) delete fieldErrors[key];\n  if (!form.code) fieldErrors.code = \"Code is verplicht.\";\n  if (!form.firstName && !form.lastName) fieldErrors.lastName = \"Vul een voornaam of achternaam in.\";\n  if (form.hourlyRate && !/^\\d+([.,]\\d+)?$/.test(form.hourlyRate)) fieldErrors.hourlyRate = \"Ongeldig bedrag.\";\n  return Object.keys(fieldErrors).length === 0;\n}\n\nasync function submit(): Promise<void> {\n  if (saving.value || !validate()) return;\n  saving.value = true;\n  emit(\"busy\", true);\n  formError.value = \"\";\n  try {\n    const payload = {\n      code: form.code,\n      firstName: form.firstName,\n      initials: form.initials,\n      lastName: form.lastName,\n      hourlyRate: form.hourlyRate || undefined,\n    };\n    const id = props.employee?.id ?? await api.createEmployee(payload);\n    if (props.employee) await api.updateEmployee({ id, ...payload });\n    savedSnapshot = JSON.stringify(form);\n    emit(\"saved\", id);\n  } catch (error) {\n    formError.value = error instanceof Error ? error.message : \"Opslaan mislukt.\";\n  } finally {\n    saving.value = false;\n    emit(\"busy\", false);\n  }\n}\n</script>\n\n<style scoped>\n.employee-form__fields {\n  border: 0;\n  padding: 0;\n  margin: 0;\n  min-width: 0;\n}\n.employee-form__row {\n  display: grid;\n  grid-template-columns: minmax(0, 1fr) 80px minmax(0, 1.25fr);\n  gap: 10px;\n}\n.employee-form__actions {\n  display: flex;\n  justify-content: flex-end;\n  gap: 8px;\n}\n@media (max-width: 480px) {\n  .employee-form__row { grid-template-columns: 1fr; }\n}\n</style>\n","import { toDisplayString as _toDisplayString, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, vModelText as _vModelText, normalizeClass as _normalizeClass, createElementVNode as _createElementVNode, withDirectives as _withDirectives, withCtx as _withCtx, createVNode as _createVNode, withModifiers as _withModifiers } from \"vue\"\n\nconst _hoisted_1 = {\n  key: 0,\n  class: \"hh-formerror\",\n  role: \"alert\"\n}\nconst _hoisted_2 = [\"disabled\"]\nconst _hoisted_3 = { class: \"employee-form__row\" }\nconst _hoisted_4 = { class: \"employee-form__actions\" }\nconst _hoisted_5 = [\"disabled\"]\nconst _hoisted_6 = [\"disabled\"]\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return (_openBlock(), _createElementBlock(\"form\", {\n    onSubmit: _withModifiers($setup.submit, [\"prevent\"])\n  }, [\n    ($setup.formError)\n      ? (_openBlock(), _createElementBlock(\"p\", _hoisted_1, _toDisplayString($setup.formError), 1 /* TEXT */))\n      : _createCommentVNode(\"v-if\", true),\n    _createElementVNode(\"fieldset\", {\n      class: \"employee-form__fields\",\n      disabled: $setup.saving\n    }, [\n      _createVNode($setup[\"FormField\"], {\n        label: \"Code\",\n        \"for-id\": \"emp-code\",\n        required: \"\",\n        error: $setup.fieldErrors.code\n      }, {\n        default: _withCtx(() => [\n          _withDirectives(_createElementVNode(\"input\", {\n            id: \"emp-code\",\n            \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => (($setup.form.code) = $event)),\n            class: _normalizeClass([\"hh-input hh-input--mono\", { 'hh-input--error': $setup.fieldErrors.code }]),\n            \"data-autofocus\": \"\",\n            maxlength: \"4\"\n          }, null, 2 /* CLASS */), [\n            [\n              _vModelText,\n              $setup.form.code,\n              void 0,\n              { trim: true }\n            ]\n          ])\n        ]),\n        _: 1 /* STABLE */\n      }, 8 /* PROPS */, [\"error\"]),\n      _createElementVNode(\"div\", _hoisted_3, [\n        _createVNode($setup[\"FormField\"], {\n          label: \"Voornaam\",\n          \"for-id\": \"emp-first\",\n          error: $setup.fieldErrors.firstName\n        }, {\n          default: _withCtx(() => [\n            _withDirectives(_createElementVNode(\"input\", {\n              id: \"emp-first\",\n              \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => (($setup.form.firstName) = $event)),\n              class: _normalizeClass([\"hh-input\", { 'hh-input--error': $setup.fieldErrors.firstName }])\n            }, null, 2 /* CLASS */), [\n              [\n                _vModelText,\n                $setup.form.firstName,\n                void 0,\n                { trim: true }\n              ]\n            ])\n          ]),\n          _: 1 /* STABLE */\n        }, 8 /* PROPS */, [\"error\"]),\n        _createVNode($setup[\"FormField\"], {\n          label: \"Initialen\",\n          \"for-id\": \"emp-initials\",\n          error: $setup.fieldErrors.initials\n        }, {\n          default: _withCtx(() => [\n            _withDirectives(_createElementVNode(\"input\", {\n              id: \"emp-initials\",\n              \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => (($setup.form.initials) = $event)),\n              class: _normalizeClass([\"hh-input\", { 'hh-input--error': $setup.fieldErrors.initials }])\n            }, null, 2 /* CLASS */), [\n              [\n                _vModelText,\n                $setup.form.initials,\n                void 0,\n                { trim: true }\n              ]\n            ])\n          ]),\n          _: 1 /* STABLE */\n        }, 8 /* PROPS */, [\"error\"]),\n        _createVNode($setup[\"FormField\"], {\n          label: \"Achternaam\",\n          \"for-id\": \"emp-last\",\n          error: $setup.fieldErrors.lastName\n        }, {\n          default: _withCtx(() => [\n            _withDirectives(_createElementVNode(\"input\", {\n              id: \"emp-last\",\n              \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => (($setup.form.lastName) = $event)),\n              class: _normalizeClass([\"hh-input\", { 'hh-input--error': $setup.fieldErrors.lastName }])\n            }, null, 2 /* CLASS */), [\n              [\n                _vModelText,\n                $setup.form.lastName,\n                void 0,\n                { trim: true }\n              ]\n            ])\n          ]),\n          _: 1 /* STABLE */\n        }, 8 /* PROPS */, [\"error\"])\n      ]),\n      _createVNode($setup[\"FormField\"], {\n        label: \"Uurtarief (€)\",\n        \"for-id\": \"emp-rate\",\n        error: $setup.fieldErrors.hourlyRate\n      }, {\n        default: _withCtx(() => [\n          _withDirectives(_createElementVNode(\"input\", {\n            id: \"emp-rate\",\n            \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => (($setup.form.hourlyRate) = $event)),\n            class: _normalizeClass([\"hh-input hh-input--num\", { 'hh-input--error': $setup.fieldErrors.hourlyRate }]),\n            inputmode: \"decimal\"\n          }, null, 2 /* CLASS */), [\n            [\n              _vModelText,\n              $setup.form.hourlyRate,\n              void 0,\n              { trim: true }\n            ]\n          ])\n        ]),\n        _: 1 /* STABLE */\n      }, 8 /* PROPS */, [\"error\"])\n    ], 8 /* PROPS */, _hoisted_2),\n    _createElementVNode(\"div\", _hoisted_4, [\n      _createElementVNode(\"button\", {\n        class: \"hh-btn\",\n        type: \"button\",\n        disabled: $setup.saving,\n        onClick: _cache[5] || (_cache[5] = $event => ($setup.emit('cancel')))\n      }, \"Annuleren\", 8 /* PROPS */, _hoisted_5),\n      _createElementVNode(\"button\", {\n        class: \"hh-btn hh-btn--primary\",\n        type: \"submit\",\n        disabled: $setup.saving\n      }, _toDisplayString($setup.saving ? \"Opslaan…\" : $props.employee ? \"Opslaan\" : \"Aanmaken\"), 9 /* TEXT, PROPS */, _hoisted_6)\n    ])\n  ], 32 /* NEED_HYDRATION */))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/EmployeeForm.vue?type=script\";import \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/EmployeeForm.vue?type=style&index=0\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/EmployeeForm.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/EmployeeForm.vue\";script.__scopeId = \"data-v-b48ca8b6\";export default script;","<template>\n  <section>\n    <div class=\"hh-page__bar\">\n      <h1 class=\"hh-page__title\">Werknemers</h1>\n      <button class=\"hh-btn hh-btn--primary\" type=\"button\" @click=\"openNew\">\n        <span aria-hidden=\"true\">+</span> Nieuwe werknemer <kbd class=\"emp__kbd\">n</kbd>\n      </button>\n    </div>\n\n    <div class=\"hh-toolbar\">\n      <label class=\"emp__toggle\">\n        <input v-model=\"includeArchived\" type=\"checkbox\" @change=\"load\" />\n        Toon gearchiveerd\n      </label>\n    </div>\n\n    <p v-if=\"error\" class=\"hh-formerror\">{{ error }}</p>\n\n    <div class=\"hh-card\">\n      <div v-if=\"loading\" class=\"hh-empty\">Laden…</div>\n      <p v-else-if=\"rows.length === 0\" class=\"hh-empty\">Nog geen werknemers. Druk op <kbd>n</kbd> voor een nieuwe.</p>\n      <table v-else class=\"hh-table\">\n        <thead>\n          <tr>\n            <th style=\"width: 90px\">Code</th>\n            <th>Naam</th>\n            <th class=\"hh-table__num\" style=\"width: 130px\">Uurtarief</th>\n          </tr>\n        </thead>\n        <tbody>\n          <tr\n            v-for=\"(row, index) in rows\"\n            :key=\"row.id\"\n            :data-list-row=\"index\"\n            tabindex=\"0\"\n            class=\"is-clickable\"\n            :class=\"{ 'is-active': index === activeIndex, 'is-archived': row.archived }\"\n            @click=\"openDetail(row)\"\n            @keydown.enter.stop.prevent=\"openDetail(row)\"\n            @keydown.space.stop.prevent=\"openDetail(row)\"\n          >\n            <td class=\"hh-table__code\">{{ row.code }}</td>\n            <td>{{ row.name }} <span v-if=\"row.archived\" class=\"hh-badge\">gearchiveerd</span></td>\n            <td class=\"hh-table__num\">{{ formatEuro(row.hourlyRate) }}</td>\n          </tr>\n        </tbody>\n      </table>\n    </div>\n\n    <AppDialog v-if=\"formOpen\" title=\"Nieuwe werknemer\" @close=\"closeForm\">\n      <EmployeeForm @cancel=\"closeForm\" @saved=\"onCreated\" @busy=\"formSaving = $event\" />\n    </AppDialog>\n  </section>\n</template>\n\n<script setup lang=\"ts\">\nimport { onMounted, ref, watch } from \"vue\";\nimport { useRoute, useRouter } from \"vue-router\";\nimport { useApi } from \"../lib/api\";\nimport { formatEuro } from \"../lib/format\";\nimport { useListKeyboard } from \"../lib/useListKeyboard\";\nimport { archiveListStateToQuery, parseArchiveListState } from \"../lib/archiveListState\";\nimport { queryRecord, sameQuery } from \"../lib/routeQuery\";\nimport AppDialog from \"../components/AppDialog.vue\";\nimport EmployeeForm from \"../components/EmployeeForm.vue\";\n\nconst api = useApi();\n\ntype EmployeeRow = Awaited<ReturnType<typeof api.listEmployees>>[number];\n\nconst route = useRoute();\nconst router = useRouter();\n\nconst rows = ref<EmployeeRow[]>([]);\nconst loading = ref(true);\nconst error = ref(\"\");\nconst includeArchived = ref(parseArchiveListState(queryRecord(route.query)).includeArchived);\n\nwatch(includeArchived, (value) => {\n  const next = archiveListStateToQuery({ includeArchived: value });\n  if (!sameQuery(next, queryRecord(route.query))) void router.replace({ query: next });\n});\n\nconst formOpen = ref(false);\nconst formSaving = ref(false);\n\nconst { activeIndex } = useListKeyboard({\n  itemCount: () => rows.value.length,\n  onNew: openNew,\n  onOpen: (index) => openDetail(rows.value[index]),\n});\n\nasync function load(): Promise<void> {\n  loading.value = true;\n  error.value = \"\";\n  try {\n    rows.value = await api.listEmployees({ includeArchived: includeArchived.value });\n  } catch {\n    error.value = \"Kon de werknemers niet laden.\";\n  } finally {\n    loading.value = false;\n  }\n}\n\nfunction openNew(): void {\n  formOpen.value = true;\n}\n\nfunction openDetail(row: EmployeeRow): void {\n  void router.push({ name: \"werknemers-detail\", params: { id: String(row.id) }, query: route.query });\n}\n\nfunction closeForm(): void {\n  if (!formSaving.value) formOpen.value = false;\n}\n\nfunction onCreated(): void {\n  formOpen.value = false;\n  void load();\n}\n\nonMounted(load);\n</script>\n\n<style scoped>\n.emp__toggle {\n  display: inline-flex;\n  align-items: center;\n  gap: 6px;\n  font-size: 13px;\n  color: var(--hh-fg-muted);\n  cursor: pointer;\n}\n.emp__kbd,\nkbd {\n  font-family: var(--hh-mono);\n  font-size: 11px;\n  padding: 1px 5px;\n  border: 1px solid var(--hh-line-strong);\n  border-radius: 4px;\n  background: var(--hh-surface-2);\n  color: var(--hh-fg-muted);\n}\n.emp__kbd {\n  margin-left: 4px;\n  background: rgba(255, 255, 255, 0.2);\n  border-color: rgba(255, 255, 255, 0.4);\n  color: var(--hh-accent-fg);\n}\n</style>\n","import { createElementVNode as _createElementVNode, createTextVNode as _createTextVNode, vModelCheckbox as _vModelCheckbox, withDirectives as _withDirectives, toDisplayString as _toDisplayString, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, renderList as _renderList, Fragment as _Fragment, withModifiers as _withModifiers, withKeys as _withKeys, normalizeClass as _normalizeClass, createVNode as _createVNode, withCtx as _withCtx, createBlock as _createBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"hh-toolbar\" }\nconst _hoisted_2 = { class: \"emp__toggle\" }\nconst _hoisted_3 = {\n  key: 0,\n  class: \"hh-formerror\"\n}\nconst _hoisted_4 = { class: \"hh-card\" }\nconst _hoisted_5 = {\n  key: 0,\n  class: \"hh-empty\"\n}\nconst _hoisted_6 = {\n  key: 1,\n  class: \"hh-empty\"\n}\nconst _hoisted_7 = {\n  key: 2,\n  class: \"hh-table\"\n}\nconst _hoisted_8 = [\"data-list-row\", \"onClick\", \"onKeydown\"]\nconst _hoisted_9 = { class: \"hh-table__code\" }\nconst _hoisted_10 = {\n  key: 0,\n  class: \"hh-badge\"\n}\nconst _hoisted_11 = { class: \"hh-table__num\" }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return (_openBlock(), _createElementBlock(\"section\", null, [\n    _createElementVNode(\"div\", { class: \"hh-page__bar\" }, [\n      _cache[3] || (_cache[3] = _createElementVNode(\"h1\", { class: \"hh-page__title\" }, \"Werknemers\", -1 /* CACHED */)),\n      _createElementVNode(\"button\", {\n        class: \"hh-btn hh-btn--primary\",\n        type: \"button\",\n        onClick: $setup.openNew\n      }, _cache[2] || (_cache[2] = [\n        _createElementVNode(\"span\", { \"aria-hidden\": \"true\" }, \"+\", -1 /* CACHED */),\n        _createTextVNode(\" Nieuwe werknemer \", -1 /* CACHED */),\n        _createElementVNode(\"kbd\", { class: \"emp__kbd\" }, \"n\", -1 /* CACHED */)\n      ]))\n    ]),\n    _createElementVNode(\"div\", _hoisted_1, [\n      _createElementVNode(\"label\", _hoisted_2, [\n        _withDirectives(_createElementVNode(\"input\", {\n          \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => (($setup.includeArchived) = $event)),\n          type: \"checkbox\",\n          onChange: $setup.load\n        }, null, 544 /* NEED_HYDRATION, NEED_PATCH */), [\n          [_vModelCheckbox, $setup.includeArchived]\n        ]),\n        _cache[4] || (_cache[4] = _createTextVNode(\" Toon gearchiveerd \", -1 /* CACHED */))\n      ])\n    ]),\n    ($setup.error)\n      ? (_openBlock(), _createElementBlock(\"p\", _hoisted_3, _toDisplayString($setup.error), 1 /* TEXT */))\n      : _createCommentVNode(\"v-if\", true),\n    _createElementVNode(\"div\", _hoisted_4, [\n      ($setup.loading)\n        ? (_openBlock(), _createElementBlock(\"div\", _hoisted_5, \"Laden…\"))\n        : ($setup.rows.length === 0)\n          ? (_openBlock(), _createElementBlock(\"p\", _hoisted_6, _cache[5] || (_cache[5] = [\n              _createTextVNode(\"Nog geen werknemers. Druk op \", -1 /* CACHED */),\n              _createElementVNode(\"kbd\", null, \"n\", -1 /* CACHED */),\n              _createTextVNode(\" voor een nieuwe.\", -1 /* CACHED */)\n            ])))\n          : (_openBlock(), _createElementBlock(\"table\", _hoisted_7, [\n              _cache[6] || (_cache[6] = _createElementVNode(\"thead\", null, [\n                _createElementVNode(\"tr\", null, [\n                  _createElementVNode(\"th\", { style: {\"width\":\"90px\"} }, \"Code\"),\n                  _createElementVNode(\"th\", null, \"Naam\"),\n                  _createElementVNode(\"th\", {\n                    class: \"hh-table__num\",\n                    style: {\"width\":\"130px\"}\n                  }, \"Uurtarief\")\n                ])\n              ], -1 /* CACHED */)),\n              _createElementVNode(\"tbody\", null, [\n                (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.rows, (row, index) => {\n                  return (_openBlock(), _createElementBlock(\"tr\", {\n                    key: row.id,\n                    \"data-list-row\": index,\n                    tabindex: \"0\",\n                    class: _normalizeClass([\"is-clickable\", { 'is-active': index === $setup.activeIndex, 'is-archived': row.archived }]),\n                    onClick: $event => ($setup.openDetail(row)),\n                    onKeydown: [\n                      _withKeys(_withModifiers($event => ($setup.openDetail(row)), [\"stop\",\"prevent\"]), [\"enter\"]),\n                      _withKeys(_withModifiers($event => ($setup.openDetail(row)), [\"stop\",\"prevent\"]), [\"space\"])\n                    ]\n                  }, [\n                    _createElementVNode(\"td\", _hoisted_9, _toDisplayString(row.code), 1 /* TEXT */),\n                    _createElementVNode(\"td\", null, [\n                      _createTextVNode(_toDisplayString(row.name) + \" \", 1 /* TEXT */),\n                      (row.archived)\n                        ? (_openBlock(), _createElementBlock(\"span\", _hoisted_10, \"gearchiveerd\"))\n                        : _createCommentVNode(\"v-if\", true)\n                    ]),\n                    _createElementVNode(\"td\", _hoisted_11, _toDisplayString($setup.formatEuro(row.hourlyRate)), 1 /* TEXT */)\n                  ], 42 /* CLASS, PROPS, NEED_HYDRATION */, _hoisted_8))\n                }), 128 /* KEYED_FRAGMENT */))\n              ])\n            ]))\n    ]),\n    ($setup.formOpen)\n      ? (_openBlock(), _createBlock($setup[\"AppDialog\"], {\n          key: 1,\n          title: \"Nieuwe werknemer\",\n          onClose: $setup.closeForm\n        }, {\n          default: _withCtx(() => [\n            _createVNode($setup[\"EmployeeForm\"], {\n              onCancel: $setup.closeForm,\n              onSaved: $setup.onCreated,\n              onBusy: _cache[1] || (_cache[1] = $event => ($setup.formSaving = $event))\n            })\n          ]),\n          _: 1 /* STABLE */\n        }))\n      : _createCommentVNode(\"v-if\", true)\n  ]))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/EmployeesView.vue?type=script\";import \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/EmployeesView.vue?type=style&index=0\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/EmployeesView.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/EmployeesView.vue\";script.__scopeId = \"data-v-b63608c3\";export default script;","<template>\n  <section>\n    <RouterLink class=\"employee__back\" :to=\"employeeListTarget\">&larr; Werknemers</RouterLink>\n    <p v-if=\"loading\" class=\"hh-empty\">Laden…</p>\n    <p v-else-if=\"error\" class=\"hh-formerror\" role=\"alert\">{{ error }}</p>\n    <p v-else-if=\"!employee\" class=\"hh-empty\">Werknemer niet gevonden.</p>\n    <template v-else>\n      <div class=\"hh-page__bar\">\n        <div>\n          <h1 class=\"hh-page__title\">{{ employee.name }} <span v-if=\"employee.archived\" class=\"hh-badge\">gearchiveerd</span></h1>\n          <p class=\"hh-page__sub\">Werknemer <span class=\"hh-table__code\">{{ employee.code }}</span></p>\n        </div>\n        <div v-if=\"!editOpen\" class=\"employee__actions\">\n          <button class=\"hh-btn\" :class=\"employee.archived ? 'hh-btn--primary' : 'hh-btn--danger'\" type=\"button\" :disabled=\"archiveSaving\"\n            @click=\"employee.archived ? setEmployeeArchived(false) : openArchive()\">\n            {{ archiveSaving ? \"Bezig…\" : employee.archived ? \"Terughalen\" : \"Archiveren\" }}\n          </button>\n          <button ref=\"editButton\" class=\"hh-btn\" type=\"button\" :disabled=\"archiveSaving\" @click=\"openEdit\">Bewerken</button>\n        </div>\n      </div>\n      <p v-if=\"archiveError && !archiveOpen\" class=\"hh-formerror\" role=\"alert\">{{ archiveError }}</p>\n      <div class=\"hh-card employee__card\">\n        <h2 class=\"employee__heading\">{{ editOpen ? \"Werknemer bewerken\" : \"Gegevens\" }}</h2>\n        <EmployeeForm v-if=\"editOpen\" :employee=\"employee\" @cancel=\"closeEdit\" @saved=\"onEdited\" />\n        <dl v-else class=\"employee__data\">\n          <dt>Code</dt><dd class=\"hh-table__code\">{{ employee.code }}</dd>\n          <dt>Voornaam</dt><dd>{{ employee.firstName || \"Niet ingevuld\" }}</dd>\n          <dt>Initialen</dt><dd>{{ employee.initials || \"Niet ingevuld\" }}</dd>\n          <dt>Achternaam</dt><dd>{{ employee.lastName || \"Niet ingevuld\" }}</dd>\n          <dt>Uurtarief</dt><dd>{{ formatEuro(employee.hourlyRate) }}</dd>\n        </dl>\n      </div>\n    </template>\n\n    <AppDialog v-if=\"archiveOpen && employee\" title=\"Werknemer archiveren\" @close=\"closeArchive\">\n      <p>Weet je zeker dat je <strong>{{ employee.name }}</strong> wilt archiveren? De werknemer verdwijnt uit de actieve lijst. De gegevens en uren blijven bewaard.</p>\n      <p v-if=\"archiveError\" class=\"hh-formerror\" role=\"alert\">{{ archiveError }}</p>\n      <template #footer>\n        <button class=\"hh-btn\" type=\"button\" data-autofocus :disabled=\"archiveSaving\" @click=\"closeArchive\">Annuleren</button>\n        <button class=\"hh-btn hh-btn--danger\" type=\"button\" :disabled=\"archiveSaving\" @click=\"setEmployeeArchived(true)\">\n          {{ archiveSaving ? \"Archiveren…\" : \"Archiveren\" }}\n        </button>\n      </template>\n    </AppDialog>\n  </section>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, nextTick, ref, watch } from \"vue\";\nimport { useRoute } from \"vue-router\";\nimport { useApi } from \"../lib/api\";\nimport { formatEuro } from \"../lib/format\";\nimport { useEscapeBack } from \"../lib/useEscapeBack\";\nimport { useToast } from \"../lib/toast\";\nimport AppDialog from \"../components/AppDialog.vue\";\nimport EmployeeForm from \"../components/EmployeeForm.vue\";\n\nconst api = useApi();\nconst showToast = useToast();\nconst route = useRoute();\nconst employeeId = computed(() => Number(route.params.id));\ntype Employee = NonNullable<Awaited<ReturnType<typeof api.getEmployee>>>;\nconst employee = ref<Employee | null>(null);\nconst loading = ref(true);\nconst error = ref(\"\");\nconst editOpen = ref(false);\nconst editButton = ref<HTMLButtonElement | null>(null);\nconst archiveOpen = ref(false);\nconst archiveSaving = ref(false);\nconst archiveError = ref(\"\");\n// Carry the archive filter through detail URLs so returning or refreshing keeps it.\nconst employeeListTarget = { name: \"werknemers\", query: { ...route.query } };\nuseEscapeBack(employeeListTarget);\n\nasync function load(): Promise<void> {\n  const id = employeeId.value;\n  loading.value = true;\n  error.value = \"\";\n  employee.value = null;\n  try {\n    const detail = await api.getEmployee({ id });\n    if (employeeId.value === id) employee.value = detail;\n  } catch (failure) {\n    if (employeeId.value === id) error.value = failure instanceof Error ? failure.message : \"Kon de werknemer niet laden.\";\n  } finally {\n    if (employeeId.value === id) loading.value = false;\n  }\n}\n\nasync function openEdit(): Promise<void> {\n  editOpen.value = true;\n  await nextTick();\n  const input = document.getElementById(\"emp-code\") as HTMLInputElement | null;\n  input?.focus();\n  input?.select();\n}\n\nasync function closeEdit(): Promise<void> {\n  editOpen.value = false;\n  await nextTick();\n  editButton.value?.focus();\n}\n\nfunction onEdited(): void {\n  editOpen.value = false;\n  showToast(\"Werknemer opgeslagen.\");\n  void load();\n}\n\nfunction openArchive(): void {\n  archiveError.value = \"\";\n  archiveOpen.value = true;\n}\n\nfunction closeArchive(): void {\n  if (!archiveSaving.value) archiveOpen.value = false;\n}\n\nasync function setEmployeeArchived(archived: boolean): Promise<void> {\n  const current = employee.value;\n  if (!current || archiveSaving.value) return;\n  archiveSaving.value = true;\n  archiveError.value = \"\";\n  try {\n    if (archived) await api.archiveEmployee({ id: current.id });\n    else await api.restoreEmployee({ id: current.id });\n    if (employeeId.value !== current.id) return;\n    archiveOpen.value = false;\n    employee.value = { ...current, archived };\n    showToast(archived ? \"Werknemer gearchiveerd.\" : \"Werknemer teruggehaald.\");\n    try {\n      const detail = await api.getEmployee({ id: current.id });\n      if (employeeId.value === current.id) employee.value = detail;\n    } catch {\n      // The write already succeeded; a failed refresh must not invite another write.\n      if (employeeId.value === current.id) archiveError.value = \"De werknemerstatus is aangepast, maar de gegevens konden niet worden vernieuwd. Herlaad de pagina.\";\n    }\n  } catch (failure) {\n    if (employeeId.value === current.id) archiveError.value = failure instanceof Error ? failure.message : \"De werknemerstatus kon niet worden aangepast.\";\n  } finally {\n    archiveSaving.value = false;\n  }\n}\n\nwatch(employeeId, () => {\n  editOpen.value = false;\n  archiveOpen.value = false;\n  archiveError.value = \"\";\n  void load();\n}, { immediate: true });\n</script>\n\n<style scoped>\n.employee__back {\n  display: inline-block;\n  margin-bottom: 14px;\n  color: var(--hh-fg-muted);\n  text-decoration: none;\n}\n.employee__back:hover { color: var(--hh-accent); }\n.employee__actions {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 8px;\n}\n.employee__card {\n  max-width: 640px;\n  padding: 18px;\n}\n.employee__heading {\n  margin: 0 0 14px;\n  font-size: 17px;\n}\n.employee__data {\n  display: grid;\n  grid-template-columns: minmax(110px, 1fr) 2fr;\n  gap: 14px;\n  margin: 0;\n}\n.employee__data dt { color: var(--hh-fg-muted); }\n.employee__data dd {\n  margin: 0;\n  overflow-wrap: anywhere;\n}\n</style>\n","import { createTextVNode as _createTextVNode, resolveComponent as _resolveComponent, withCtx as _withCtx, createVNode as _createVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, normalizeClass as _normalizeClass, createBlock as _createBlock, Fragment as _Fragment } from \"vue\"\n\nconst _hoisted_1 = {\n  key: 0,\n  class: \"hh-empty\"\n}\nconst _hoisted_2 = {\n  key: 1,\n  class: \"hh-formerror\",\n  role: \"alert\"\n}\nconst _hoisted_3 = {\n  key: 2,\n  class: \"hh-empty\"\n}\nconst _hoisted_4 = { class: \"hh-page__bar\" }\nconst _hoisted_5 = { class: \"hh-page__title\" }\nconst _hoisted_6 = {\n  key: 0,\n  class: \"hh-badge\"\n}\nconst _hoisted_7 = { class: \"hh-page__sub\" }\nconst _hoisted_8 = { class: \"hh-table__code\" }\nconst _hoisted_9 = {\n  key: 0,\n  class: \"employee__actions\"\n}\nconst _hoisted_10 = [\"disabled\"]\nconst _hoisted_11 = [\"disabled\"]\nconst _hoisted_12 = {\n  key: 0,\n  class: \"hh-formerror\",\n  role: \"alert\"\n}\nconst _hoisted_13 = { class: \"hh-card employee__card\" }\nconst _hoisted_14 = { class: \"employee__heading\" }\nconst _hoisted_15 = {\n  key: 1,\n  class: \"employee__data\"\n}\nconst _hoisted_16 = { class: \"hh-table__code\" }\nconst _hoisted_17 = {\n  key: 0,\n  class: \"hh-formerror\",\n  role: \"alert\"\n}\nconst _hoisted_18 = [\"disabled\"]\nconst _hoisted_19 = [\"disabled\"]\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  const _component_RouterLink = _resolveComponent(\"RouterLink\")\n\n  return (_openBlock(), _createElementBlock(\"section\", null, [\n    _createVNode(_component_RouterLink, {\n      class: \"employee__back\",\n      to: $setup.employeeListTarget\n    }, {\n      default: _withCtx(() => _cache[2] || (_cache[2] = [\n        _createTextVNode(\"← Werknemers\", -1 /* CACHED */)\n      ])),\n      _: 1 /* STABLE */,\n      __: [2]\n    }),\n    ($setup.loading)\n      ? (_openBlock(), _createElementBlock(\"p\", _hoisted_1, \"Laden…\"))\n      : ($setup.error)\n        ? (_openBlock(), _createElementBlock(\"p\", _hoisted_2, _toDisplayString($setup.error), 1 /* TEXT */))\n        : (!$setup.employee)\n          ? (_openBlock(), _createElementBlock(\"p\", _hoisted_3, \"Werknemer niet gevonden.\"))\n          : (_openBlock(), _createElementBlock(_Fragment, { key: 3 }, [\n              _createElementVNode(\"div\", _hoisted_4, [\n                _createElementVNode(\"div\", null, [\n                  _createElementVNode(\"h1\", _hoisted_5, [\n                    _createTextVNode(_toDisplayString($setup.employee.name) + \" \", 1 /* TEXT */),\n                    ($setup.employee.archived)\n                      ? (_openBlock(), _createElementBlock(\"span\", _hoisted_6, \"gearchiveerd\"))\n                      : _createCommentVNode(\"v-if\", true)\n                  ]),\n                  _createElementVNode(\"p\", _hoisted_7, [\n                    _cache[3] || (_cache[3] = _createTextVNode(\"Werknemer \", -1 /* CACHED */)),\n                    _createElementVNode(\"span\", _hoisted_8, _toDisplayString($setup.employee.code), 1 /* TEXT */)\n                  ])\n                ]),\n                (!$setup.editOpen)\n                  ? (_openBlock(), _createElementBlock(\"div\", _hoisted_9, [\n                      _createElementVNode(\"button\", {\n                        class: _normalizeClass([\"hh-btn\", $setup.employee.archived ? 'hh-btn--primary' : 'hh-btn--danger']),\n                        type: \"button\",\n                        disabled: $setup.archiveSaving,\n                        onClick: _cache[0] || (_cache[0] = $event => ($setup.employee.archived ? $setup.setEmployeeArchived(false) : $setup.openArchive()))\n                      }, _toDisplayString($setup.archiveSaving ? \"Bezig…\" : $setup.employee.archived ? \"Terughalen\" : \"Archiveren\"), 11 /* TEXT, CLASS, PROPS */, _hoisted_10),\n                      _createElementVNode(\"button\", {\n                        ref: \"editButton\",\n                        class: \"hh-btn\",\n                        type: \"button\",\n                        disabled: $setup.archiveSaving,\n                        onClick: $setup.openEdit\n                      }, \"Bewerken\", 8 /* PROPS */, _hoisted_11)\n                    ]))\n                  : _createCommentVNode(\"v-if\", true)\n              ]),\n              ($setup.archiveError && !$setup.archiveOpen)\n                ? (_openBlock(), _createElementBlock(\"p\", _hoisted_12, _toDisplayString($setup.archiveError), 1 /* TEXT */))\n                : _createCommentVNode(\"v-if\", true),\n              _createElementVNode(\"div\", _hoisted_13, [\n                _createElementVNode(\"h2\", _hoisted_14, _toDisplayString($setup.editOpen ? \"Werknemer bewerken\" : \"Gegevens\"), 1 /* TEXT */),\n                ($setup.editOpen)\n                  ? (_openBlock(), _createBlock($setup[\"EmployeeForm\"], {\n                      key: 0,\n                      employee: $setup.employee,\n                      onCancel: $setup.closeEdit,\n                      onSaved: $setup.onEdited\n                    }, null, 8 /* PROPS */, [\"employee\"]))\n                  : (_openBlock(), _createElementBlock(\"dl\", _hoisted_15, [\n                      _cache[4] || (_cache[4] = _createElementVNode(\"dt\", null, \"Code\", -1 /* CACHED */)),\n                      _createElementVNode(\"dd\", _hoisted_16, _toDisplayString($setup.employee.code), 1 /* TEXT */),\n                      _cache[5] || (_cache[5] = _createElementVNode(\"dt\", null, \"Voornaam\", -1 /* CACHED */)),\n                      _createElementVNode(\"dd\", null, _toDisplayString($setup.employee.firstName || \"Niet ingevuld\"), 1 /* TEXT */),\n                      _cache[6] || (_cache[6] = _createElementVNode(\"dt\", null, \"Initialen\", -1 /* CACHED */)),\n                      _createElementVNode(\"dd\", null, _toDisplayString($setup.employee.initials || \"Niet ingevuld\"), 1 /* TEXT */),\n                      _cache[7] || (_cache[7] = _createElementVNode(\"dt\", null, \"Achternaam\", -1 /* CACHED */)),\n                      _createElementVNode(\"dd\", null, _toDisplayString($setup.employee.lastName || \"Niet ingevuld\"), 1 /* TEXT */),\n                      _cache[8] || (_cache[8] = _createElementVNode(\"dt\", null, \"Uurtarief\", -1 /* CACHED */)),\n                      _createElementVNode(\"dd\", null, _toDisplayString($setup.formatEuro($setup.employee.hourlyRate)), 1 /* TEXT */)\n                    ]))\n              ])\n            ], 64 /* STABLE_FRAGMENT */)),\n    ($setup.archiveOpen && $setup.employee)\n      ? (_openBlock(), _createBlock($setup[\"AppDialog\"], {\n          key: 4,\n          title: \"Werknemer archiveren\",\n          onClose: $setup.closeArchive\n        }, {\n          footer: _withCtx(() => [\n            _createElementVNode(\"button\", {\n              class: \"hh-btn\",\n              type: \"button\",\n              \"data-autofocus\": \"\",\n              disabled: $setup.archiveSaving,\n              onClick: $setup.closeArchive\n            }, \"Annuleren\", 8 /* PROPS */, _hoisted_18),\n            _createElementVNode(\"button\", {\n              class: \"hh-btn hh-btn--danger\",\n              type: \"button\",\n              disabled: $setup.archiveSaving,\n              onClick: _cache[1] || (_cache[1] = $event => ($setup.setEmployeeArchived(true)))\n            }, _toDisplayString($setup.archiveSaving ? \"Archiveren…\" : \"Archiveren\"), 9 /* TEXT, PROPS */, _hoisted_19)\n          ]),\n          default: _withCtx(() => [\n            _createElementVNode(\"p\", null, [\n              _cache[9] || (_cache[9] = _createTextVNode(\"Weet je zeker dat je \", -1 /* CACHED */)),\n              _createElementVNode(\"strong\", null, _toDisplayString($setup.employee.name), 1 /* TEXT */),\n              _cache[10] || (_cache[10] = _createTextVNode(\" wilt archiveren? De werknemer verdwijnt uit de actieve lijst. De gegevens en uren blijven bewaard.\", -1 /* CACHED */))\n            ]),\n            ($setup.archiveError)\n              ? (_openBlock(), _createElementBlock(\"p\", _hoisted_17, _toDisplayString($setup.archiveError), 1 /* TEXT */))\n              : _createCommentVNode(\"v-if\", true)\n          ]),\n          _: 1 /* STABLE */\n        }))\n      : _createCommentVNode(\"v-if\", true)\n  ]))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/EmployeeDetailView.vue?type=script\";import \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/EmployeeDetailView.vue?type=style&index=0\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/EmployeeDetailView.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/EmployeeDetailView.vue\";script.__scopeId = \"data-v-a36bc1a2\";export default script;","<template>\n  <form @submit.prevent=\"submit\">\n    <p v-if=\"formError\" class=\"hh-formerror\" role=\"alert\">{{ formError }}</p>\n    <fieldset class=\"activity-form__fields\" :disabled=\"saving\">\n      <FormField label=\"Code\" for-id=\"act-code\" required :error=\"fieldErrors.code\" :hint=\"groupHint\">\n        <input id=\"act-code\" v-model.trim=\"form.code\" class=\"hh-input hh-input--mono\" data-autofocus :class=\"{ 'hh-input--error': fieldErrors.code }\" maxlength=\"4\" />\n      </FormField>\n      <FormField label=\"Omschrijving\" for-id=\"act-desc\" required :error=\"fieldErrors.description\">\n        <input id=\"act-desc\" v-model.trim=\"form.description\" class=\"hh-input\" :class=\"{ 'hh-input--error': fieldErrors.description }\" />\n      </FormField>\n      <label class=\"activity-form__check\">\n        <input v-model=\"form.isFree\" type=\"checkbox\" />\n        Vrije omschrijving verplicht bij ureninvoer (X-code)\n      </label>\n    </fieldset>\n    <div class=\"activity-form__actions\">\n      <button class=\"hh-btn\" type=\"button\" :disabled=\"saving\" @click=\"emit('cancel')\">Annuleren</button>\n      <button class=\"hh-btn hh-btn--primary\" type=\"submit\" :disabled=\"saving\">\n        {{ saving ? \"Opslaan…\" : activity ? \"Opslaan\" : \"Aanmaken\" }}\n      </button>\n    </div>\n  </form>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, reactive, ref } from \"vue\";\nimport { useApi } from \"../lib/api\";\nimport { formatActivityGroup } from \"../lib/format\";\nimport { useOrganizationDirty } from \"../lib/organization\";\nimport FormField from \"./FormField.vue\";\n\nconst api = useApi();\ntype Activity = NonNullable<Awaited<ReturnType<typeof api.getActivity>>>;\nconst props = withDefaults(defineProps<{ activity?: Activity | null; groupLabels: string[] }>(), { activity: null });\nconst emit = defineEmits<{ cancel: []; saved: [number]; busy: [boolean] }>();\nconst saving = ref(false);\nconst formError = ref(\"\");\nconst fieldErrors = reactive<Record<string, string>>({});\nconst form = reactive({\n  code: props.activity?.code ?? \"\",\n  description: props.activity?.description ?? \"\",\n  isFree: props.activity?.isFree ?? false,\n});\nlet savedSnapshot = JSON.stringify(form);\nuseOrganizationDirty(() => savedSnapshot !== JSON.stringify(form));\nconst groupHint = computed(() => form.code ? formatActivityGroup({ group: form.code.charAt(0), labels: props.groupLabels }) : \"\");\n\nfunction validate(): boolean {\n  for (const key of Object.keys(fieldErrors)) delete fieldErrors[key];\n  if (!form.code) fieldErrors.code = \"Code is verplicht.\";\n  if (!form.description) fieldErrors.description = \"Vul een omschrijving in.\";\n  return Object.keys(fieldErrors).length === 0;\n}\n\nasync function submit(): Promise<void> {\n  if (saving.value || !validate()) return;\n  saving.value = true;\n  emit(\"busy\", true);\n  formError.value = \"\";\n  try {\n    const payload = { code: form.code, description: form.description, isFree: form.isFree };\n    const id = props.activity?.id ?? await api.createActivity(payload);\n    if (props.activity) await api.updateActivity({ id, ...payload });\n    savedSnapshot = JSON.stringify(form);\n    emit(\"saved\", id);\n  } catch (error) {\n    formError.value = error instanceof Error ? error.message : \"Opslaan mislukt.\";\n  } finally {\n    saving.value = false;\n    emit(\"busy\", false);\n  }\n}\n</script>\n\n<style scoped>\n.activity-form__fields {\n  border: 0;\n  padding: 0;\n  margin: 0;\n  min-width: 0;\n}\n.activity-form__check {\n  display: flex;\n  align-items: flex-start;\n  gap: 8px;\n  margin: 4px 0 16px;\n  font-size: 13px;\n  color: var(--hh-fg-muted);\n  cursor: pointer;\n}\n.activity-form__actions {\n  display: flex;\n  justify-content: flex-end;\n  gap: 8px;\n}\n</style>\n","import { toDisplayString as _toDisplayString, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, vModelText as _vModelText, normalizeClass as _normalizeClass, createElementVNode as _createElementVNode, withDirectives as _withDirectives, withCtx as _withCtx, createVNode as _createVNode, vModelCheckbox as _vModelCheckbox, createTextVNode as _createTextVNode, withModifiers as _withModifiers } from \"vue\"\n\nconst _hoisted_1 = {\n  key: 0,\n  class: \"hh-formerror\",\n  role: \"alert\"\n}\nconst _hoisted_2 = [\"disabled\"]\nconst _hoisted_3 = { class: \"activity-form__check\" }\nconst _hoisted_4 = { class: \"activity-form__actions\" }\nconst _hoisted_5 = [\"disabled\"]\nconst _hoisted_6 = [\"disabled\"]\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return (_openBlock(), _createElementBlock(\"form\", {\n    onSubmit: _withModifiers($setup.submit, [\"prevent\"])\n  }, [\n    ($setup.formError)\n      ? (_openBlock(), _createElementBlock(\"p\", _hoisted_1, _toDisplayString($setup.formError), 1 /* TEXT */))\n      : _createCommentVNode(\"v-if\", true),\n    _createElementVNode(\"fieldset\", {\n      class: \"activity-form__fields\",\n      disabled: $setup.saving\n    }, [\n      _createVNode($setup[\"FormField\"], {\n        label: \"Code\",\n        \"for-id\": \"act-code\",\n        required: \"\",\n        error: $setup.fieldErrors.code,\n        hint: $setup.groupHint\n      }, {\n        default: _withCtx(() => [\n          _withDirectives(_createElementVNode(\"input\", {\n            id: \"act-code\",\n            \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => (($setup.form.code) = $event)),\n            class: _normalizeClass([\"hh-input hh-input--mono\", { 'hh-input--error': $setup.fieldErrors.code }]),\n            \"data-autofocus\": \"\",\n            maxlength: \"4\"\n          }, null, 2 /* CLASS */), [\n            [\n              _vModelText,\n              $setup.form.code,\n              void 0,\n              { trim: true }\n            ]\n          ])\n        ]),\n        _: 1 /* STABLE */\n      }, 8 /* PROPS */, [\"error\", \"hint\"]),\n      _createVNode($setup[\"FormField\"], {\n        label: \"Omschrijving\",\n        \"for-id\": \"act-desc\",\n        required: \"\",\n        error: $setup.fieldErrors.description\n      }, {\n        default: _withCtx(() => [\n          _withDirectives(_createElementVNode(\"input\", {\n            id: \"act-desc\",\n            \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => (($setup.form.description) = $event)),\n            class: _normalizeClass([\"hh-input\", { 'hh-input--error': $setup.fieldErrors.description }])\n          }, null, 2 /* CLASS */), [\n            [\n              _vModelText,\n              $setup.form.description,\n              void 0,\n              { trim: true }\n            ]\n          ])\n        ]),\n        _: 1 /* STABLE */\n      }, 8 /* PROPS */, [\"error\"]),\n      _createElementVNode(\"label\", _hoisted_3, [\n        _withDirectives(_createElementVNode(\"input\", {\n          \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => (($setup.form.isFree) = $event)),\n          type: \"checkbox\"\n        }, null, 512 /* NEED_PATCH */), [\n          [_vModelCheckbox, $setup.form.isFree]\n        ]),\n        _cache[4] || (_cache[4] = _createTextVNode(\" Vrije omschrijving verplicht bij ureninvoer (X-code) \", -1 /* CACHED */))\n      ])\n    ], 8 /* PROPS */, _hoisted_2),\n    _createElementVNode(\"div\", _hoisted_4, [\n      _createElementVNode(\"button\", {\n        class: \"hh-btn\",\n        type: \"button\",\n        disabled: $setup.saving,\n        onClick: _cache[3] || (_cache[3] = $event => ($setup.emit('cancel')))\n      }, \"Annuleren\", 8 /* PROPS */, _hoisted_5),\n      _createElementVNode(\"button\", {\n        class: \"hh-btn hh-btn--primary\",\n        type: \"submit\",\n        disabled: $setup.saving\n      }, _toDisplayString($setup.saving ? \"Opslaan…\" : $props.activity ? \"Opslaan\" : \"Aanmaken\"), 9 /* TEXT, PROPS */, _hoisted_6)\n    ])\n  ], 32 /* NEED_HYDRATION */))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/ActivityForm.vue?type=script\";import \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/ActivityForm.vue?type=style&index=0\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/ActivityForm.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/ActivityForm.vue\";script.__scopeId = \"data-v-9a71c68f\";export default script;","<template>\n  <section>\n    <div class=\"hh-page__bar\">\n      <div>\n        <h1 class=\"hh-page__title\">Werkzaamheden</h1>\n        <p class=\"hh-page__sub\">Code = groepcijfer + letter (bv. <span class=\"act__mono\">3C</span>). Codes met een vrije omschrijving dwingen bij ureninvoer een eigen tekst af.</p>\n      </div>\n      <button class=\"hh-btn hh-btn--primary\" type=\"button\" @click=\"openNew\">\n        <span aria-hidden=\"true\">+</span> Nieuwe werkzaamheid\n      </button>\n    </div>\n\n    <div class=\"hh-toolbar\">\n      <label class=\"act__toggle\">\n        <input v-model=\"includeArchived\" type=\"checkbox\" @change=\"load\" />\n        Toon gearchiveerd\n      </label>\n    </div>\n\n    <p v-if=\"error\" class=\"hh-formerror\">{{ error }}</p>\n\n    <div class=\"hh-card\">\n      <div v-if=\"loading\" class=\"hh-empty\">Laden…</div>\n      <p v-else-if=\"rows.length === 0\" class=\"hh-empty\">Nog geen werkzaamheden. Druk op <kbd>n</kbd> voor een nieuwe.</p>\n      <table v-else class=\"hh-table\">\n        <thead>\n          <tr>\n            <th style=\"width: 80px\">Code</th>\n            <th style=\"width: 160px\">Groep</th>\n            <th>Omschrijving</th>\n          </tr>\n        </thead>\n        <tbody>\n          <tr\n            v-for=\"(row, index) in rows\"\n            :key=\"row.id\"\n            :data-list-row=\"index\"\n            tabindex=\"0\"\n            class=\"is-clickable\"\n            :class=\"{ 'is-active': index === activeIndex, 'is-archived': row.archived }\"\n            @click=\"openDetail(row)\"\n            @keydown.enter.stop.prevent=\"openDetail(row)\"\n            @keydown.space.stop.prevent=\"openDetail(row)\"\n          >\n            <td class=\"hh-table__code\">{{ row.code }}</td>\n            <td class=\"hh-muted\">{{ formatActivityGroup({ group: row.group, labels: groupLabels }) }}</td>\n            <td>\n              {{ row.description }}\n              <span v-if=\"row.isFree\" class=\"hh-badge hh-badge--warn\">vrije omschrijving</span>\n              <span v-if=\"row.archived\" class=\"hh-badge\">gearchiveerd</span>\n            </td>\n          </tr>\n        </tbody>\n      </table>\n    </div>\n\n    <AppDialog v-if=\"formOpen\" title=\"Nieuwe werkzaamheid\" @close=\"closeForm\">\n      <ActivityForm :group-labels=\"groupLabels\" @cancel=\"closeForm\" @saved=\"onCreated\" @busy=\"formSaving = $event\" />\n    </AppDialog>\n  </section>\n</template>\n\n<script setup lang=\"ts\">\nimport { onMounted, ref, watch } from \"vue\";\nimport { useRoute, useRouter } from \"vue-router\";\nimport { useApi } from \"../lib/api\";\nimport { formatActivityGroup } from \"../lib/format\";\nimport { useListKeyboard } from \"../lib/useListKeyboard\";\nimport { archiveListStateToQuery, parseArchiveListState } from \"../lib/archiveListState\";\nimport { queryRecord, sameQuery } from \"../lib/routeQuery\";\nimport AppDialog from \"../components/AppDialog.vue\";\nimport ActivityForm from \"../components/ActivityForm.vue\";\n\nconst api = useApi();\n\ntype ActivityRow = Awaited<ReturnType<typeof api.listActivities>>[number];\n\nconst route = useRoute();\nconst router = useRouter();\n\nconst rows = ref<ActivityRow[]>([]);\nconst groupLabels = ref<string[]>([]);\nconst loading = ref(true);\nconst error = ref(\"\");\nconst includeArchived = ref(parseArchiveListState(queryRecord(route.query)).includeArchived);\n\nwatch(includeArchived, (value) => {\n  const next = archiveListStateToQuery({ includeArchived: value });\n  if (!sameQuery(next, queryRecord(route.query))) void router.replace({ query: next });\n});\n\nconst formOpen = ref(false);\nconst formSaving = ref(false);\n\nconst { activeIndex } = useListKeyboard({\n  itemCount: () => rows.value.length,\n  onNew: openNew,\n  onOpen: (index) => openDetail(rows.value[index]),\n});\n\nasync function load(): Promise<void> {\n  loading.value = true;\n  error.value = \"\";\n  try {\n    const [activities, settings] = await Promise.all([\n      api.listActivities({ includeArchived: includeArchived.value }),\n      api.getSettings(),\n    ]);\n    rows.value = activities;\n    groupLabels.value = settings.activityGroups ?? [];\n  } catch {\n    error.value = \"Kon de werkzaamheden niet laden.\";\n  } finally {\n    loading.value = false;\n  }\n}\n\nfunction openNew(): void {\n  formOpen.value = true;\n}\n\nfunction openDetail(row: ActivityRow): void {\n  void router.push({ name: \"werkzaamheden-detail\", params: { id: String(row.id) }, query: route.query });\n}\n\nfunction closeForm(): void {\n  if (!formSaving.value) formOpen.value = false;\n}\n\nfunction onCreated(): void {\n  formOpen.value = false;\n  void load();\n}\n\nonMounted(load);\n</script>\n\n<style scoped>\n.act__mono {\n  font-family: var(--hh-mono);\n}\n.act__toggle {\n  display: inline-flex;\n  align-items: center;\n  gap: 6px;\n  font-size: 13px;\n  color: var(--hh-fg-muted);\n  cursor: pointer;\n}\nkbd {\n  font-family: var(--hh-mono);\n  font-size: 11px;\n  padding: 1px 5px;\n  border: 1px solid var(--hh-line-strong);\n  border-radius: 4px;\n  background: var(--hh-surface-2);\n  color: var(--hh-fg-muted);\n}\n</style>\n","import { createElementVNode as _createElementVNode, createTextVNode as _createTextVNode, vModelCheckbox as _vModelCheckbox, withDirectives as _withDirectives, toDisplayString as _toDisplayString, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, renderList as _renderList, Fragment as _Fragment, withModifiers as _withModifiers, withKeys as _withKeys, normalizeClass as _normalizeClass, createVNode as _createVNode, withCtx as _withCtx, createBlock as _createBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"hh-toolbar\" }\nconst _hoisted_2 = { class: \"act__toggle\" }\nconst _hoisted_3 = {\n  key: 0,\n  class: \"hh-formerror\"\n}\nconst _hoisted_4 = { class: \"hh-card\" }\nconst _hoisted_5 = {\n  key: 0,\n  class: \"hh-empty\"\n}\nconst _hoisted_6 = {\n  key: 1,\n  class: \"hh-empty\"\n}\nconst _hoisted_7 = {\n  key: 2,\n  class: \"hh-table\"\n}\nconst _hoisted_8 = [\"data-list-row\", \"onClick\", \"onKeydown\"]\nconst _hoisted_9 = { class: \"hh-table__code\" }\nconst _hoisted_10 = { class: \"hh-muted\" }\nconst _hoisted_11 = {\n  key: 0,\n  class: \"hh-badge hh-badge--warn\"\n}\nconst _hoisted_12 = {\n  key: 1,\n  class: \"hh-badge\"\n}\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return (_openBlock(), _createElementBlock(\"section\", null, [\n    _createElementVNode(\"div\", { class: \"hh-page__bar\" }, [\n      _cache[3] || (_cache[3] = _createElementVNode(\"div\", null, [\n        _createElementVNode(\"h1\", { class: \"hh-page__title\" }, \"Werkzaamheden\"),\n        _createElementVNode(\"p\", { class: \"hh-page__sub\" }, [\n          _createTextVNode(\"Code = groepcijfer + letter (bv. \"),\n          _createElementVNode(\"span\", { class: \"act__mono\" }, \"3C\"),\n          _createTextVNode(\"). Codes met een vrije omschrijving dwingen bij ureninvoer een eigen tekst af.\")\n        ])\n      ], -1 /* CACHED */)),\n      _createElementVNode(\"button\", {\n        class: \"hh-btn hh-btn--primary\",\n        type: \"button\",\n        onClick: $setup.openNew\n      }, _cache[2] || (_cache[2] = [\n        _createElementVNode(\"span\", { \"aria-hidden\": \"true\" }, \"+\", -1 /* CACHED */),\n        _createTextVNode(\" Nieuwe werkzaamheid \", -1 /* CACHED */)\n      ]))\n    ]),\n    _createElementVNode(\"div\", _hoisted_1, [\n      _createElementVNode(\"label\", _hoisted_2, [\n        _withDirectives(_createElementVNode(\"input\", {\n          \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => (($setup.includeArchived) = $event)),\n          type: \"checkbox\",\n          onChange: $setup.load\n        }, null, 544 /* NEED_HYDRATION, NEED_PATCH */), [\n          [_vModelCheckbox, $setup.includeArchived]\n        ]),\n        _cache[4] || (_cache[4] = _createTextVNode(\" Toon gearchiveerd \", -1 /* CACHED */))\n      ])\n    ]),\n    ($setup.error)\n      ? (_openBlock(), _createElementBlock(\"p\", _hoisted_3, _toDisplayString($setup.error), 1 /* TEXT */))\n      : _createCommentVNode(\"v-if\", true),\n    _createElementVNode(\"div\", _hoisted_4, [\n      ($setup.loading)\n        ? (_openBlock(), _createElementBlock(\"div\", _hoisted_5, \"Laden…\"))\n        : ($setup.rows.length === 0)\n          ? (_openBlock(), _createElementBlock(\"p\", _hoisted_6, _cache[5] || (_cache[5] = [\n              _createTextVNode(\"Nog geen werkzaamheden. Druk op \", -1 /* CACHED */),\n              _createElementVNode(\"kbd\", null, \"n\", -1 /* CACHED */),\n              _createTextVNode(\" voor een nieuwe.\", -1 /* CACHED */)\n            ])))\n          : (_openBlock(), _createElementBlock(\"table\", _hoisted_7, [\n              _cache[6] || (_cache[6] = _createElementVNode(\"thead\", null, [\n                _createElementVNode(\"tr\", null, [\n                  _createElementVNode(\"th\", { style: {\"width\":\"80px\"} }, \"Code\"),\n                  _createElementVNode(\"th\", { style: {\"width\":\"160px\"} }, \"Groep\"),\n                  _createElementVNode(\"th\", null, \"Omschrijving\")\n                ])\n              ], -1 /* CACHED */)),\n              _createElementVNode(\"tbody\", null, [\n                (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.rows, (row, index) => {\n                  return (_openBlock(), _createElementBlock(\"tr\", {\n                    key: row.id,\n                    \"data-list-row\": index,\n                    tabindex: \"0\",\n                    class: _normalizeClass([\"is-clickable\", { 'is-active': index === $setup.activeIndex, 'is-archived': row.archived }]),\n                    onClick: $event => ($setup.openDetail(row)),\n                    onKeydown: [\n                      _withKeys(_withModifiers($event => ($setup.openDetail(row)), [\"stop\",\"prevent\"]), [\"enter\"]),\n                      _withKeys(_withModifiers($event => ($setup.openDetail(row)), [\"stop\",\"prevent\"]), [\"space\"])\n                    ]\n                  }, [\n                    _createElementVNode(\"td\", _hoisted_9, _toDisplayString(row.code), 1 /* TEXT */),\n                    _createElementVNode(\"td\", _hoisted_10, _toDisplayString($setup.formatActivityGroup({ group: row.group, labels: $setup.groupLabels })), 1 /* TEXT */),\n                    _createElementVNode(\"td\", null, [\n                      _createTextVNode(_toDisplayString(row.description) + \" \", 1 /* TEXT */),\n                      (row.isFree)\n                        ? (_openBlock(), _createElementBlock(\"span\", _hoisted_11, \"vrije omschrijving\"))\n                        : _createCommentVNode(\"v-if\", true),\n                      (row.archived)\n                        ? (_openBlock(), _createElementBlock(\"span\", _hoisted_12, \"gearchiveerd\"))\n                        : _createCommentVNode(\"v-if\", true)\n                    ])\n                  ], 42 /* CLASS, PROPS, NEED_HYDRATION */, _hoisted_8))\n                }), 128 /* KEYED_FRAGMENT */))\n              ])\n            ]))\n    ]),\n    ($setup.formOpen)\n      ? (_openBlock(), _createBlock($setup[\"AppDialog\"], {\n          key: 1,\n          title: \"Nieuwe werkzaamheid\",\n          onClose: $setup.closeForm\n        }, {\n          default: _withCtx(() => [\n            _createVNode($setup[\"ActivityForm\"], {\n              \"group-labels\": $setup.groupLabels,\n              onCancel: $setup.closeForm,\n              onSaved: $setup.onCreated,\n              onBusy: _cache[1] || (_cache[1] = $event => ($setup.formSaving = $event))\n            }, null, 8 /* PROPS */, [\"group-labels\"])\n          ]),\n          _: 1 /* STABLE */\n        }))\n      : _createCommentVNode(\"v-if\", true)\n  ]))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/ActivitiesView.vue?type=script\";import \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/ActivitiesView.vue?type=style&index=0\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/ActivitiesView.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/ActivitiesView.vue\";script.__scopeId = \"data-v-648d1d7c\";export default script;","<template>\n  <section>\n    <RouterLink class=\"activity__back\" :to=\"activityListTarget\">&larr; Werkzaamheden</RouterLink>\n    <p v-if=\"loading\" class=\"hh-empty\">Laden…</p>\n    <p v-else-if=\"error\" class=\"hh-formerror\" role=\"alert\">{{ error }}</p>\n    <p v-else-if=\"!activity\" class=\"hh-empty\">Werkzaamheid niet gevonden.</p>\n    <template v-else>\n      <div class=\"hh-page__bar\">\n        <div>\n          <h1 class=\"hh-page__title\">{{ activity.description }} <span v-if=\"activity.archived\" class=\"hh-badge\">gearchiveerd</span></h1>\n          <p class=\"hh-page__sub\">Werkzaamheid <span class=\"hh-table__code\">{{ activity.code }}</span></p>\n        </div>\n        <div v-if=\"!editOpen\" class=\"activity__actions\">\n          <button class=\"hh-btn\" :class=\"activity.archived ? 'hh-btn--primary' : 'hh-btn--danger'\" type=\"button\" :disabled=\"archiveSaving\"\n            @click=\"activity.archived ? setActivityArchived(false) : openArchive()\">\n            {{ archiveSaving ? \"Bezig…\" : activity.archived ? \"Terughalen\" : \"Archiveren\" }}\n          </button>\n          <button ref=\"editButton\" class=\"hh-btn\" type=\"button\" :disabled=\"archiveSaving\" @click=\"openEdit\">Bewerken</button>\n        </div>\n      </div>\n      <p v-if=\"archiveError && !archiveOpen\" class=\"hh-formerror\" role=\"alert\">{{ archiveError }}</p>\n      <div class=\"hh-card activity__card\">\n        <h2 class=\"activity__heading\">{{ editOpen ? \"Werkzaamheid bewerken\" : \"Gegevens\" }}</h2>\n        <ActivityForm v-if=\"editOpen\" :activity=\"activity\" :group-labels=\"groupLabels\" @cancel=\"closeEdit\" @saved=\"onEdited\" />\n        <dl v-else class=\"activity__data\">\n          <dt>Code</dt><dd class=\"hh-table__code\">{{ activity.code }}</dd>\n          <dt>Groep</dt><dd>{{ formatActivityGroup({ group: activity.group, labels: groupLabels }) }}</dd>\n          <dt>Omschrijving</dt><dd>{{ activity.description }}</dd>\n          <dt>Vrije omschrijving</dt><dd>{{ activity.isFree ? \"Verplicht bij ureninvoer\" : \"Niet verplicht\" }}</dd>\n        </dl>\n      </div>\n    </template>\n\n    <AppDialog v-if=\"archiveOpen && activity\" title=\"Werkzaamheid archiveren\" @close=\"closeArchive\">\n      <p>Weet je zeker dat je <strong>{{ activity.code }} ({{ activity.description }})</strong> wilt archiveren? De werkzaamheid verdwijnt uit de actieve lijst. De gegevens en uren blijven bewaard.</p>\n      <p v-if=\"archiveError\" class=\"hh-formerror\" role=\"alert\">{{ archiveError }}</p>\n      <template #footer>\n        <button class=\"hh-btn\" type=\"button\" data-autofocus :disabled=\"archiveSaving\" @click=\"closeArchive\">Annuleren</button>\n        <button class=\"hh-btn hh-btn--danger\" type=\"button\" :disabled=\"archiveSaving\" @click=\"setActivityArchived(true)\">\n          {{ archiveSaving ? \"Archiveren…\" : \"Archiveren\" }}\n        </button>\n      </template>\n    </AppDialog>\n  </section>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, nextTick, ref, watch } from \"vue\";\nimport { useRoute } from \"vue-router\";\nimport { useApi } from \"../lib/api\";\nimport { formatActivityGroup } from \"../lib/format\";\nimport { useEscapeBack } from \"../lib/useEscapeBack\";\nimport { useToast } from \"../lib/toast\";\nimport AppDialog from \"../components/AppDialog.vue\";\nimport ActivityForm from \"../components/ActivityForm.vue\";\n\nconst api = useApi();\nconst showToast = useToast();\nconst route = useRoute();\nconst activityId = computed(() => Number(route.params.id));\ntype Activity = NonNullable<Awaited<ReturnType<typeof api.getActivity>>>;\nconst activity = ref<Activity | null>(null);\nconst groupLabels = ref<string[]>([]);\nconst loading = ref(true);\nconst error = ref(\"\");\nconst editOpen = ref(false);\nconst editButton = ref<HTMLButtonElement | null>(null);\nconst archiveOpen = ref(false);\nconst archiveSaving = ref(false);\nconst archiveError = ref(\"\");\n// Carry the archive filter through detail URLs so returning or refreshing keeps it.\nconst activityListTarget = { name: \"werkzaamheden\", query: { ...route.query } };\nuseEscapeBack(activityListTarget);\n\nasync function load(): Promise<void> {\n  const id = activityId.value;\n  loading.value = true;\n  error.value = \"\";\n  activity.value = null;\n  try {\n    const [detail, settings] = await Promise.all([api.getActivity({ id }), api.getSettings()]);\n    if (activityId.value !== id) return;\n    activity.value = detail;\n    groupLabels.value = settings.activityGroups ?? [];\n  } catch (failure) {\n    if (activityId.value === id) error.value = failure instanceof Error ? failure.message : \"Kon de werkzaamheid niet laden.\";\n  } finally {\n    if (activityId.value === id) loading.value = false;\n  }\n}\n\nasync function openEdit(): Promise<void> {\n  editOpen.value = true;\n  await nextTick();\n  const input = document.getElementById(\"act-code\") as HTMLInputElement | null;\n  input?.focus();\n  input?.select();\n}\n\nasync function closeEdit(): Promise<void> {\n  editOpen.value = false;\n  await nextTick();\n  editButton.value?.focus();\n}\n\nfunction onEdited(): void {\n  editOpen.value = false;\n  showToast(\"Werkzaamheid opgeslagen.\");\n  void load();\n}\n\nfunction openArchive(): void {\n  archiveError.value = \"\";\n  archiveOpen.value = true;\n}\n\nfunction closeArchive(): void {\n  if (!archiveSaving.value) archiveOpen.value = false;\n}\n\nasync function setActivityArchived(archived: boolean): Promise<void> {\n  const current = activity.value;\n  if (!current || archiveSaving.value) return;\n  archiveSaving.value = true;\n  archiveError.value = \"\";\n  try {\n    if (archived) await api.archiveActivity({ id: current.id });\n    else await api.restoreActivity({ id: current.id });\n    if (activityId.value !== current.id) return;\n    archiveOpen.value = false;\n    activity.value = { ...current, archived };\n    showToast(archived ? \"Werkzaamheid gearchiveerd.\" : \"Werkzaamheid teruggehaald.\");\n    try {\n      const detail = await api.getActivity({ id: current.id });\n      if (activityId.value === current.id) activity.value = detail;\n    } catch {\n      // The write already succeeded; a failed refresh must not invite another write.\n      if (activityId.value === current.id) archiveError.value = \"De werkzaamheidstatus is aangepast, maar de gegevens konden niet worden vernieuwd. Herlaad de pagina.\";\n    }\n  } catch (failure) {\n    if (activityId.value === current.id) archiveError.value = failure instanceof Error ? failure.message : \"De werkzaamheidstatus kon niet worden aangepast.\";\n  } finally {\n    archiveSaving.value = false;\n  }\n}\n\nwatch(activityId, () => {\n  editOpen.value = false;\n  archiveOpen.value = false;\n  archiveError.value = \"\";\n  void load();\n}, { immediate: true });\n</script>\n\n<style scoped>\n.activity__back {\n  display: inline-block;\n  margin-bottom: 14px;\n  color: var(--hh-fg-muted);\n  text-decoration: none;\n}\n.activity__back:hover { color: var(--hh-accent); }\n.activity__actions {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 8px;\n}\n.activity__card {\n  max-width: 640px;\n  padding: 18px;\n}\n.activity__heading {\n  margin: 0 0 14px;\n  font-size: 17px;\n}\n.activity__data {\n  display: grid;\n  grid-template-columns: minmax(110px, 1fr) 2fr;\n  gap: 14px;\n  margin: 0;\n}\n.activity__data dt { color: var(--hh-fg-muted); }\n.activity__data dd {\n  margin: 0;\n  overflow-wrap: anywhere;\n}\n</style>\n","import { createTextVNode as _createTextVNode, resolveComponent as _resolveComponent, withCtx as _withCtx, createVNode as _createVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, normalizeClass as _normalizeClass, createBlock as _createBlock, Fragment as _Fragment } from \"vue\"\n\nconst _hoisted_1 = {\n  key: 0,\n  class: \"hh-empty\"\n}\nconst _hoisted_2 = {\n  key: 1,\n  class: \"hh-formerror\",\n  role: \"alert\"\n}\nconst _hoisted_3 = {\n  key: 2,\n  class: \"hh-empty\"\n}\nconst _hoisted_4 = { class: \"hh-page__bar\" }\nconst _hoisted_5 = { class: \"hh-page__title\" }\nconst _hoisted_6 = {\n  key: 0,\n  class: \"hh-badge\"\n}\nconst _hoisted_7 = { class: \"hh-page__sub\" }\nconst _hoisted_8 = { class: \"hh-table__code\" }\nconst _hoisted_9 = {\n  key: 0,\n  class: \"activity__actions\"\n}\nconst _hoisted_10 = [\"disabled\"]\nconst _hoisted_11 = [\"disabled\"]\nconst _hoisted_12 = {\n  key: 0,\n  class: \"hh-formerror\",\n  role: \"alert\"\n}\nconst _hoisted_13 = { class: \"hh-card activity__card\" }\nconst _hoisted_14 = { class: \"activity__heading\" }\nconst _hoisted_15 = {\n  key: 1,\n  class: \"activity__data\"\n}\nconst _hoisted_16 = { class: \"hh-table__code\" }\nconst _hoisted_17 = {\n  key: 0,\n  class: \"hh-formerror\",\n  role: \"alert\"\n}\nconst _hoisted_18 = [\"disabled\"]\nconst _hoisted_19 = [\"disabled\"]\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  const _component_RouterLink = _resolveComponent(\"RouterLink\")\n\n  return (_openBlock(), _createElementBlock(\"section\", null, [\n    _createVNode(_component_RouterLink, {\n      class: \"activity__back\",\n      to: $setup.activityListTarget\n    }, {\n      default: _withCtx(() => _cache[2] || (_cache[2] = [\n        _createTextVNode(\"← Werkzaamheden\", -1 /* CACHED */)\n      ])),\n      _: 1 /* STABLE */,\n      __: [2]\n    }),\n    ($setup.loading)\n      ? (_openBlock(), _createElementBlock(\"p\", _hoisted_1, \"Laden…\"))\n      : ($setup.error)\n        ? (_openBlock(), _createElementBlock(\"p\", _hoisted_2, _toDisplayString($setup.error), 1 /* TEXT */))\n        : (!$setup.activity)\n          ? (_openBlock(), _createElementBlock(\"p\", _hoisted_3, \"Werkzaamheid niet gevonden.\"))\n          : (_openBlock(), _createElementBlock(_Fragment, { key: 3 }, [\n              _createElementVNode(\"div\", _hoisted_4, [\n                _createElementVNode(\"div\", null, [\n                  _createElementVNode(\"h1\", _hoisted_5, [\n                    _createTextVNode(_toDisplayString($setup.activity.description) + \" \", 1 /* TEXT */),\n                    ($setup.activity.archived)\n                      ? (_openBlock(), _createElementBlock(\"span\", _hoisted_6, \"gearchiveerd\"))\n                      : _createCommentVNode(\"v-if\", true)\n                  ]),\n                  _createElementVNode(\"p\", _hoisted_7, [\n                    _cache[3] || (_cache[3] = _createTextVNode(\"Werkzaamheid \", -1 /* CACHED */)),\n                    _createElementVNode(\"span\", _hoisted_8, _toDisplayString($setup.activity.code), 1 /* TEXT */)\n                  ])\n                ]),\n                (!$setup.editOpen)\n                  ? (_openBlock(), _createElementBlock(\"div\", _hoisted_9, [\n                      _createElementVNode(\"button\", {\n                        class: _normalizeClass([\"hh-btn\", $setup.activity.archived ? 'hh-btn--primary' : 'hh-btn--danger']),\n                        type: \"button\",\n                        disabled: $setup.archiveSaving,\n                        onClick: _cache[0] || (_cache[0] = $event => ($setup.activity.archived ? $setup.setActivityArchived(false) : $setup.openArchive()))\n                      }, _toDisplayString($setup.archiveSaving ? \"Bezig…\" : $setup.activity.archived ? \"Terughalen\" : \"Archiveren\"), 11 /* TEXT, CLASS, PROPS */, _hoisted_10),\n                      _createElementVNode(\"button\", {\n                        ref: \"editButton\",\n                        class: \"hh-btn\",\n                        type: \"button\",\n                        disabled: $setup.archiveSaving,\n                        onClick: $setup.openEdit\n                      }, \"Bewerken\", 8 /* PROPS */, _hoisted_11)\n                    ]))\n                  : _createCommentVNode(\"v-if\", true)\n              ]),\n              ($setup.archiveError && !$setup.archiveOpen)\n                ? (_openBlock(), _createElementBlock(\"p\", _hoisted_12, _toDisplayString($setup.archiveError), 1 /* TEXT */))\n                : _createCommentVNode(\"v-if\", true),\n              _createElementVNode(\"div\", _hoisted_13, [\n                _createElementVNode(\"h2\", _hoisted_14, _toDisplayString($setup.editOpen ? \"Werkzaamheid bewerken\" : \"Gegevens\"), 1 /* TEXT */),\n                ($setup.editOpen)\n                  ? (_openBlock(), _createBlock($setup[\"ActivityForm\"], {\n                      key: 0,\n                      activity: $setup.activity,\n                      \"group-labels\": $setup.groupLabels,\n                      onCancel: $setup.closeEdit,\n                      onSaved: $setup.onEdited\n                    }, null, 8 /* PROPS */, [\"activity\", \"group-labels\"]))\n                  : (_openBlock(), _createElementBlock(\"dl\", _hoisted_15, [\n                      _cache[4] || (_cache[4] = _createElementVNode(\"dt\", null, \"Code\", -1 /* CACHED */)),\n                      _createElementVNode(\"dd\", _hoisted_16, _toDisplayString($setup.activity.code), 1 /* TEXT */),\n                      _cache[5] || (_cache[5] = _createElementVNode(\"dt\", null, \"Groep\", -1 /* CACHED */)),\n                      _createElementVNode(\"dd\", null, _toDisplayString($setup.formatActivityGroup({ group: $setup.activity.group, labels: $setup.groupLabels })), 1 /* TEXT */),\n                      _cache[6] || (_cache[6] = _createElementVNode(\"dt\", null, \"Omschrijving\", -1 /* CACHED */)),\n                      _createElementVNode(\"dd\", null, _toDisplayString($setup.activity.description), 1 /* TEXT */),\n                      _cache[7] || (_cache[7] = _createElementVNode(\"dt\", null, \"Vrije omschrijving\", -1 /* CACHED */)),\n                      _createElementVNode(\"dd\", null, _toDisplayString($setup.activity.isFree ? \"Verplicht bij ureninvoer\" : \"Niet verplicht\"), 1 /* TEXT */)\n                    ]))\n              ])\n            ], 64 /* STABLE_FRAGMENT */)),\n    ($setup.archiveOpen && $setup.activity)\n      ? (_openBlock(), _createBlock($setup[\"AppDialog\"], {\n          key: 4,\n          title: \"Werkzaamheid archiveren\",\n          onClose: $setup.closeArchive\n        }, {\n          footer: _withCtx(() => [\n            _createElementVNode(\"button\", {\n              class: \"hh-btn\",\n              type: \"button\",\n              \"data-autofocus\": \"\",\n              disabled: $setup.archiveSaving,\n              onClick: $setup.closeArchive\n            }, \"Annuleren\", 8 /* PROPS */, _hoisted_18),\n            _createElementVNode(\"button\", {\n              class: \"hh-btn hh-btn--danger\",\n              type: \"button\",\n              disabled: $setup.archiveSaving,\n              onClick: _cache[1] || (_cache[1] = $event => ($setup.setActivityArchived(true)))\n            }, _toDisplayString($setup.archiveSaving ? \"Archiveren…\" : \"Archiveren\"), 9 /* TEXT, PROPS */, _hoisted_19)\n          ]),\n          default: _withCtx(() => [\n            _createElementVNode(\"p\", null, [\n              _cache[8] || (_cache[8] = _createTextVNode(\"Weet je zeker dat je \", -1 /* CACHED */)),\n              _createElementVNode(\"strong\", null, _toDisplayString($setup.activity.code) + \" (\" + _toDisplayString($setup.activity.description) + \")\", 1 /* TEXT */),\n              _cache[9] || (_cache[9] = _createTextVNode(\" wilt archiveren? De werkzaamheid verdwijnt uit de actieve lijst. De gegevens en uren blijven bewaard.\", -1 /* CACHED */))\n            ]),\n            ($setup.archiveError)\n              ? (_openBlock(), _createElementBlock(\"p\", _hoisted_17, _toDisplayString($setup.archiveError), 1 /* TEXT */))\n              : _createCommentVNode(\"v-if\", true)\n          ]),\n          _: 1 /* STABLE */\n        }))\n      : _createCommentVNode(\"v-if\", true)\n  ]))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/ActivityDetailView.vue?type=script\";import \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/ActivityDetailView.vue?type=style&index=0\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/ActivityDetailView.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/ActivityDetailView.vue\";script.__scopeId = \"data-v-9c5991a8\";export default script;","import { Money } from \"@webhare/std\";\nimport { isValidTimeEntryHours } from \"../../../../js/internal/domain\";\n\nexport const HOURS_INPUT_ERROR = \"Vul uren in tussen -999 en 999, anders dan nul.\";\n\nexport function isHoursDraft(value: string): boolean {\n  return /^-?\\d*([.,]\\d*)?$/.test(value);\n}\n\nexport function parseHoursInput(value: string): Money | null {\n  if (!isHoursDraft(value) || !/\\d/.test(value)) return null;\n  try {\n    const hours = new Money(value.replace(\",\", \".\"));\n    return isValidTimeEntryHours(hours) ? hours : null;\n  } catch {\n    return null;\n  }\n}\n","<template>\n  <div class=\"combo\" :class=\"{ 'combo--open': open }\">\n    <input\n      ref=\"input\"\n      v-bind=\"$attrs\"\n      class=\"hh-input combo__input\"\n      :class=\"{ 'hh-input--error': error }\"\n      :value=\"query\"\n      :placeholder=\"placeholder\"\n      role=\"combobox\"\n      aria-autocomplete=\"list\"\n      :aria-expanded=\"open\"\n      :aria-controls=\"listId\"\n      :aria-activedescendant=\"open && filtered[highlight] ? `${listId}-${filtered[highlight].id}` : undefined\"\n      autocomplete=\"off\"\n      spellcheck=\"false\"\n      @input=\"onInput\"\n      @focus=\"onFocus\"\n      @blur=\"onBlur\"\n      @keydown=\"onKeydown\"\n    />\n    <button\n      class=\"combo__toggle\"\n      type=\"button\"\n      tabindex=\"-1\"\n      aria-label=\"Keuzelijst openen of sluiten\"\n      :aria-expanded=\"open\"\n      :aria-controls=\"listId\"\n      :disabled=\"($attrs.disabled !== undefined && $attrs.disabled !== false) || ($attrs.readonly !== undefined && $attrs.readonly !== false)\"\n      @mousedown.prevent\n      @click=\"toggleDropdown\"\n    >\n      <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n        <path d=\"m4 6 4 4 4-4\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n      </svg>\n    </button>\n    <!-- Keep the popup outside cards and dialog bodies that clip overflow. -->\n    <Teleport to=\"body\">\n      <ul v-if=\"open\" :id=\"listId\" ref=\"list\" class=\"combo__list\" :style=\"listPosition\" role=\"listbox\">\n        <li\n          v-for=\"(option, index) in filtered\"\n          :key=\"option.id\"\n          :id=\"`${listId}-${option.id}`\"\n          class=\"combo__option\"\n          :class=\"{ 'combo__option--active': index === highlight }\"\n          role=\"option\"\n          :aria-selected=\"index === highlight\"\n          @mousedown.prevent=\"choose(option)\"\n          @mouseenter=\"highlight = index\"\n        >\n          <span class=\"combo__label\">{{ option.label }}</span>\n          <span v-if=\"option.sub\" class=\"combo__sub\">{{ option.sub }}</span>\n        </li>\n        <li v-if=\"!filtered.length\" class=\"combo__empty\" role=\"presentation\">Geen resultaten</li>\n      </ul>\n    </Teleport>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\n// Type-ahead combobox (toetsenbord-first). Filtert op label én sub. Enter kiest\n// de gemarkeerde optie en emit 'commit' zodat de ouder (uren-grid) door kan naar\n// het volgende veld; is er niets open dan is Enter puur 'commit'. Esc sluit\n// alleen de lijst (en stopt propagatie) zodat de grid-Esc niet meteen afgaat.\nimport { computed, nextTick, ref, useId, watch, type CSSProperties } from \"vue\";\n\ndefineOptions({ inheritAttrs: false });\n\nexport interface ComboOption {\n  id: number;\n  label: string;\n  sub?: string;\n}\n\nconst props = withDefaults(defineProps<{\n  modelValue: number | null;\n  options: ComboOption[];\n  placeholder?: string;\n  error?: boolean;\n}>(), { placeholder: \"\", error: false });\n\nconst emit = defineEmits<{ \"update:modelValue\": [number | null]; commit: []; navrow: [number]; shifttab: [KeyboardEvent] }>();\n\nconst input = ref<HTMLInputElement | null>(null);\nconst list = ref<HTMLUListElement | null>(null);\nconst listPosition = ref<CSSProperties>({});\nconst listId = `combo-${useId()}`;\nconst query = ref(\"\");\nconst searchTerm = ref(\"\");\nconst open = ref(false);\nconst highlight = ref(0);\n\nconst selectedLabel = computed(() => props.options.find((o) => o.id === props.modelValue)?.label ?? \"\");\n\nconst filtered = computed<ComboOption[]>(() => {\n  const term = searchTerm.value.trim().toLowerCase();\n  if (!term) return props.options;\n  return props.options.filter((o) => `${o.label} ${o.sub ?? \"\"}`.toLowerCase().includes(term));\n});\n\nwatch(selectedLabel, (label) => { query.value = label; }, { immediate: true });\nwatch([highlight, filtered], () => {\n  void nextTick(scrollHighlightedOption);\n});\nwatch(open, (isOpen, _wasOpen, onCleanup) => {\n  if (!isOpen) return;\n  updateListPosition();\n  void nextTick(scrollHighlightedOption);\n  window.addEventListener(\"resize\", updateListPosition);\n  window.addEventListener(\"scroll\", onAnchorScroll, true);\n  const observer = new ResizeObserver(updateListPosition);\n  if (input.value) observer.observe(input.value);\n  onCleanup(() => {\n    window.removeEventListener(\"resize\", updateListPosition);\n    window.removeEventListener(\"scroll\", onAnchorScroll, true);\n    observer.disconnect();\n  });\n});\n\nfunction updateListPosition(): void {\n  if (!input.value) return;\n  const rect = input.value.getBoundingClientRect();\n  if (rect.bottom <= 0 || rect.top >= window.innerHeight) {\n    open.value = false;\n    return;\n  }\n  const margin = 8;\n  const gap = 2;\n  const below = window.innerHeight - rect.bottom - gap - margin;\n  const above = rect.top - gap - margin;\n  const placeBelow = below >= 240 || below >= above;\n  const width = Math.min(rect.width, window.innerWidth - margin * 2);\n  listPosition.value = {\n    left: `${Math.max(margin, Math.min(rect.left, window.innerWidth - width - margin))}px`,\n    width: `${width}px`,\n    maxHeight: `${Math.max(0, Math.min(240, placeBelow ? below : above))}px`,\n    ...(placeBelow ? { top: `${rect.bottom + gap}px` } : { bottom: `${window.innerHeight - rect.top + gap}px` })\n  };\n}\n\nfunction onAnchorScroll(event: Event): void {\n  if (event.target !== list.value) updateListPosition();\n}\n\nfunction scrollHighlightedOption(): void {\n  const menu = list.value;\n  const option = menu?.children[highlight.value] as HTMLElement | undefined;\n  if (!menu || !option) return;\n  // scrollIntoView also scrolls overflow:hidden cards and the page itself.\n  // Only change the popup's own scroll position to keep its anchor stationary.\n  if (option.offsetTop < menu.scrollTop) {\n    menu.scrollTop = option.offsetTop;\n  } else if (option.offsetTop + option.offsetHeight > menu.scrollTop + menu.clientHeight) {\n    menu.scrollTop = option.offsetTop + option.offsetHeight - menu.clientHeight;\n  }\n}\n\nfunction onInput(event: Event): void {\n  query.value = (event.target as HTMLInputElement).value;\n  searchTerm.value = query.value;\n  if (!query.value) emit(\"update:modelValue\", null);\n  // Clearing a selection must survive Tab instead of choosing the first option.\n  open.value = Boolean(query.value);\n  highlight.value = 0;\n}\n\nfunction openDropdown(): void {\n  // Browsing must ignore both the selected label and any previous text search.\n  searchTerm.value = \"\";\n  query.value = selectedLabel.value;\n  highlight.value = Math.max(0, props.options.findIndex((option) => option.id === props.modelValue));\n  open.value = true;\n}\n\nfunction toggleDropdown(): void {\n  if (input.value?.disabled || input.value?.readOnly) return;\n  input.value?.focus({ preventScroll: true });\n  if (open.value) {\n    open.value = false;\n    query.value = selectedLabel.value;\n  } else {\n    openDropdown();\n  }\n}\n\nfunction onFocus(): void {\n  nextTick(() => input.value?.select());\n}\n\nfunction onBlur(): void {\n  open.value = false;\n  query.value = selectedLabel.value; // revert vrije tekst naar de selectie\n}\n\nfunction choose(option: ComboOption): void {\n  emit(\"update:modelValue\", option.id);\n  query.value = option.label;\n  open.value = false;\n  emit(\"commit\");\n}\n\nfunction onKeydown(event: KeyboardEvent): void {\n  switch (event.key) {\n    case \"ArrowDown\":\n      if (open.value) {\n        event.preventDefault();\n        event.stopPropagation();\n        highlight.value = Math.max(0, Math.min(highlight.value + 1, filtered.value.length - 1));\n      } else if (event.altKey) {\n        // Alt+pijl-omlaag opent de lijst (muisvrij bladeren zonder te typen).\n        event.preventDefault();\n        openDropdown();\n      } else {\n        // Gesloten lijst: pijltje verplaatst naar de regel eronder.\n        event.preventDefault();\n        emit(\"navrow\", 1);\n      }\n      break;\n    case \"ArrowUp\":\n      if (open.value) {\n        event.preventDefault();\n        event.stopPropagation();\n        highlight.value = Math.max(highlight.value - 1, 0);\n      } else {\n        event.preventDefault();\n        emit(\"navrow\", -1);\n      }\n      break;\n    case \"Enter\":\n      // Modifier+Enter is de globale 'Verwerk uren'-sneltoets; laat die bubbelen.\n      if (event.metaKey || event.ctrlKey || event.altKey) break;\n      event.preventDefault();\n      if (open.value && filtered.value[highlight.value]) {\n        choose(filtered.value[highlight.value]);\n      } else {\n        emit(\"commit\");\n      }\n      break;\n    case \"Tab\":\n      if (event.shiftKey) {\n        // Shift+Tab: laat de ouder beslissen (bv. een lege net-aangemaakte regel\n        // verwijderen). Kiest bewust géén gemarkeerde optie (we gaan terug).\n        emit(\"shifttab\", event);\n        open.value = false;\n        break;\n      }\n      // Kies de gemarkeerde optie bij vooruit-tabben, maar laat Tab z'n werk doen.\n      if (open.value && filtered.value[highlight.value]) {\n        const option = filtered.value[highlight.value];\n        emit(\"update:modelValue\", option.id);\n        query.value = option.label;\n      }\n      open.value = false;\n      break;\n    case \"Escape\":\n      if (open.value) { event.preventDefault(); event.stopPropagation(); open.value = false; }\n      break;\n  }\n}\n\ndefineExpose({ focus: () => input.value?.focus() });\n</script>\n\n<style scoped>\n.combo {\n  position: relative;\n}\n.combo__input {\n  padding-right: 34px;\n}\n.combo__toggle {\n  position: absolute;\n  top: 1px;\n  right: 1px;\n  bottom: 1px;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  width: 30px;\n  padding: 0;\n  border: 0;\n  border-radius: var(--hh-radius);\n  color: var(--hh-fg-subtle);\n  background: transparent;\n  cursor: pointer;\n}\n.combo__toggle:disabled {\n  cursor: default;\n}\n.combo__toggle:hover:not(:disabled) {\n  color: var(--hh-fg);\n  background: var(--hh-accent-soft);\n}\n.combo__empty {\n  padding: 6px 9px;\n  color: var(--hh-fg-subtle);\n}\n.combo__list {\n  position: fixed;\n  /* Body teleport escapes clipping; this layer also clears the modal backdrop. */\n  z-index: 120;\n  max-height: 240px;\n  margin: 0;\n  padding: 4px;\n  overflow-y: auto;\n  list-style: none;\n  border: 1px solid var(--hh-line-strong);\n  border-radius: var(--hh-radius);\n  background: var(--hh-surface);\n  box-shadow: var(--hh-shadow);\n}\n.combo__option {\n  display: flex;\n  align-items: baseline;\n  gap: 8px;\n  padding: 6px 9px;\n  border-radius: 6px;\n  cursor: pointer;\n}\n.combo__option--active {\n  background: var(--hh-accent-soft);\n}\n.combo__label {\n  font-size: 13.5px;\n  color: var(--hh-fg);\n}\n.combo__sub {\n  font-family: var(--hh-mono);\n  font-size: 12px;\n  color: var(--hh-fg-subtle);\n}\n</style>\n","import { mergeProps as _mergeProps, createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, withModifiers as _withModifiers, createCommentVNode as _createCommentVNode, renderList as _renderList, Fragment as _Fragment, toDisplayString as _toDisplayString, normalizeClass as _normalizeClass, normalizeStyle as _normalizeStyle, Teleport as _Teleport, createBlock as _createBlock } from \"vue\"\n\nconst _hoisted_1 = [\"value\", \"placeholder\", \"aria-expanded\", \"aria-activedescendant\"]\nconst _hoisted_2 = [\"aria-expanded\", \"disabled\"]\nconst _hoisted_3 = [\"id\", \"aria-selected\", \"onMousedown\", \"onMouseenter\"]\nconst _hoisted_4 = { class: \"combo__label\" }\nconst _hoisted_5 = {\n  key: 0,\n  class: \"combo__sub\"\n}\nconst _hoisted_6 = {\n  key: 0,\n  class: \"combo__empty\",\n  role: \"presentation\"\n}\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return (_openBlock(), _createElementBlock(\"div\", {\n    class: _normalizeClass([\"combo\", { 'combo--open': $setup.open }])\n  }, [\n    _createElementVNode(\"input\", _mergeProps({ ref: \"input\" }, _ctx.$attrs, {\n      class: [\"hh-input combo__input\", { 'hh-input--error': $props.error }],\n      value: $setup.query,\n      placeholder: $props.placeholder,\n      role: \"combobox\",\n      \"aria-autocomplete\": \"list\",\n      \"aria-expanded\": $setup.open,\n      \"aria-controls\": $setup.listId,\n      \"aria-activedescendant\": $setup.open && $setup.filtered[$setup.highlight] ? `${$setup.listId}-${$setup.filtered[$setup.highlight].id}` : undefined,\n      autocomplete: \"off\",\n      spellcheck: \"false\",\n      onInput: $setup.onInput,\n      onFocus: $setup.onFocus,\n      onBlur: $setup.onBlur,\n      onKeydown: $setup.onKeydown\n    }), null, 16 /* FULL_PROPS */, _hoisted_1),\n    _createElementVNode(\"button\", {\n      class: \"combo__toggle\",\n      type: \"button\",\n      tabindex: \"-1\",\n      \"aria-label\": \"Keuzelijst openen of sluiten\",\n      \"aria-expanded\": $setup.open,\n      \"aria-controls\": $setup.listId,\n      disabled: (_ctx.$attrs.disabled !== undefined && _ctx.$attrs.disabled !== false) || (_ctx.$attrs.readonly !== undefined && _ctx.$attrs.readonly !== false),\n      onMousedown: _cache[0] || (_cache[0] = _withModifiers(() => {}, [\"prevent\"])),\n      onClick: $setup.toggleDropdown\n    }, _cache[1] || (_cache[1] = [\n      _createElementVNode(\"svg\", {\n        width: \"16\",\n        height: \"16\",\n        viewBox: \"0 0 16 16\",\n        fill: \"none\",\n        \"aria-hidden\": \"true\"\n      }, [\n        _createElementVNode(\"path\", {\n          d: \"m4 6 4 4 4-4\",\n          stroke: \"currentColor\",\n          \"stroke-width\": \"1.5\",\n          \"stroke-linecap\": \"round\",\n          \"stroke-linejoin\": \"round\"\n        })\n      ], -1 /* CACHED */)\n    ]), 40 /* PROPS, NEED_HYDRATION */, _hoisted_2),\n    _createCommentVNode(\" Keep the popup outside cards and dialog bodies that clip overflow. \"),\n    (_openBlock(), _createBlock(_Teleport, { to: \"body\" }, [\n      ($setup.open)\n        ? (_openBlock(), _createElementBlock(\"ul\", {\n            key: 0,\n            id: $setup.listId,\n            ref: \"list\",\n            class: \"combo__list\",\n            style: _normalizeStyle($setup.listPosition),\n            role: \"listbox\"\n          }, [\n            (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.filtered, (option, index) => {\n              return (_openBlock(), _createElementBlock(\"li\", {\n                key: option.id,\n                id: `${$setup.listId}-${option.id}`,\n                class: _normalizeClass([\"combo__option\", { 'combo__option--active': index === $setup.highlight }]),\n                role: \"option\",\n                \"aria-selected\": index === $setup.highlight,\n                onMousedown: _withModifiers($event => ($setup.choose(option)), [\"prevent\"]),\n                onMouseenter: $event => ($setup.highlight = index)\n              }, [\n                _createElementVNode(\"span\", _hoisted_4, _toDisplayString(option.label), 1 /* TEXT */),\n                (option.sub)\n                  ? (_openBlock(), _createElementBlock(\"span\", _hoisted_5, _toDisplayString(option.sub), 1 /* TEXT */))\n                  : _createCommentVNode(\"v-if\", true)\n              ], 42 /* CLASS, PROPS, NEED_HYDRATION */, _hoisted_3))\n            }), 128 /* KEYED_FRAGMENT */)),\n            (!$setup.filtered.length)\n              ? (_openBlock(), _createElementBlock(\"li\", _hoisted_6, \"Geen resultaten\"))\n              : _createCommentVNode(\"v-if\", true)\n          ], 4 /* STYLE */))\n        : _createCommentVNode(\"v-if\", true)\n    ]))\n  ], 2 /* CLASS */))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/Combobox.vue?type=script\";import \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/Combobox.vue?type=style&index=0\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/Combobox.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/Combobox.vue\";script.__scopeId = \"data-v-181d60d8\";export default script;","<template>\n  <section class=\"he\">\n    <div class=\"hh-page__bar\">\n      <div>\n        <h1 class=\"hh-page__title\">Uren invoeren</h1>\n        <p class=\"hh-page__sub\">Enter of Tab springt naar het volgende veld; op de laatste kolom begint een nieuwe regel. In de omschrijving maakt Enter een nieuwe tekstregel. Pijltjes omhoog/omlaag gaan tussen regels. <kbd>Cmd/Ctrl+Enter</kbd> verwerkt, <kbd>Esc</kbd> wist of gaat terug.</p>\n      </div>\n    </div>\n\n    <p v-if=\"loadError\" class=\"hh-formerror\">{{ loadError }}</p>\n    <p v-if=\"notice\" class=\"he__notice\">{{ notice }}</p>\n\n    <!-- Kop: werknemer / datum / week -->\n    <div class=\"hh-card he__head\">\n      <label class=\"he__hlabel he__employee\">Werknemer\n        <Combobox\n          ref=\"employeeCombo\"\n          :model-value=\"employeeId\"\n          :options=\"employeeOptions\"\n          aria-label=\"Werknemer\"\n          placeholder=\"Code of naam…\"\n          :error=\"Boolean(submitError && !employeeId)\"\n          :aria-invalid=\"Boolean(submitError && !employeeId)\"\n          @update:model-value=\"employeeId = $event ?? 0\"\n          @commit=\"onEmployeeChosen\"\n        />\n      </label>\n      <div class=\"he__hlabel he__date\">\n        <label for=\"he-date\">Datum</label>\n        <DateInput id=\"he-date\" ref=\"dateInput\" v-model=\"date\" :disabled=\"saving\" @commit=\"onDateKeydown\" />\n      </div>\n      <label class=\"he__hlabel\">Week\n        <input :value=\"week\" type=\"text\" class=\"hh-input hh-input--num he__week\" readonly tabindex=\"-1\" aria-label=\"Week, berekend uit datum\" />\n      </label>\n    </div>\n\n    <p v-if=\"!employeeId\" class=\"he__pickhint\">Kies eerst een werknemer om uren in te voeren.</p>\n\n    <template v-else>\n    <!-- Regels -->\n    <div class=\"hh-card he__gridwrap\">\n      <table class=\"hg\">\n        <thead>\n          <tr>\n            <th style=\"width: 90px\">Uren</th>\n            <th>Klant</th>\n            <th style=\"width: 84px\">Jaar</th>\n            <th style=\"width: 32%\">Werkzaamheden</th>\n            <th class=\"hh-table__num\" style=\"width: 100px\">Bedrag</th>\n            <th style=\"width: 34px\"></th>\n          </tr>\n        </thead>\n        <tbody>\n          <template v-for=\"(row, index) in rows\" :key=\"row.key\">\n          <tr :class=\"{ 'hg__row--error': rowErrors[index] }\">\n            <td>\n              <input\n                :value=\"row.hours\"\n                class=\"hh-input hh-input--num\"\n                :class=\"{ 'hh-input--error': rowErrors[index]?.hours }\"\n                :aria-invalid=\"Boolean(rowErrors[index]?.hours)\"\n                :aria-describedby=\"rowErrors[index]?.hours ? `he-hours-error-${row.key}` : undefined\"\n                :data-row=\"index\"\n                :data-col=\"0\"\n                aria-label=\"Uren\"\n                inputmode=\"decimal\"\n                placeholder=\"0\"\n                @input=\"onHoursInput({ index, event: $event })\"\n                @blur=\"onHoursBlur(index)\"\n                @keydown.enter.exact=\"onHoursCommit({ index, event: $event })\"\n                @keydown.tab.exact=\"onHoursCommit({ index, event: $event })\"\n                @keydown.shift.tab=\"onFirstCellShiftTab({ index, event: $event })\"\n                @keydown.up.prevent=\"moveVertical(index, 0, -1)\"\n                @keydown.down.prevent=\"moveVertical(index, 0, 1)\"\n              />\n              <span v-if=\"rowErrors[index]?.hours\" :id=\"`he-hours-error-${row.key}`\" class=\"hg__error\" role=\"alert\">{{ rowErrors[index]?.hours }}</span>\n            </td>\n            <td>\n              <Combobox\n                v-model=\"row.customerId\"\n                :options=\"customerOptions\"\n                :data-row=\"index\"\n                :data-col=\"1\"\n                aria-label=\"Klant\"\n                :error=\"Boolean(rowErrors[index]?.customer)\"\n                placeholder=\"Nummer of naam…\"\n                @commit=\"advance(index, 1)\"\n                @navrow=\"(delta) => moveVertical(index, 1, delta)\"\n              />\n            </td>\n            <td>\n              <input\n                v-model=\"row.year\"\n                class=\"hh-input hh-input--num\"\n                :class=\"{ 'hh-input--error': rowErrors[index]?.year }\"\n                :data-row=\"index\"\n                :data-col=\"2\"\n                aria-label=\"Jaar\"\n                inputmode=\"numeric\"\n                maxlength=\"4\"\n                placeholder=\"JJ\"\n                @keydown.enter.exact.prevent=\"advance(index, 2)\"\n                @keydown.up.prevent=\"moveVertical(index, 2, -1)\"\n                @keydown.down.prevent=\"moveVertical(index, 2, 1)\"\n                @blur=\"onYearBlur(index)\"\n              />\n            </td>\n            <td>\n              <Combobox\n                :model-value=\"row.activityId\"\n                :options=\"activityOptions\"\n                :data-row=\"index\"\n                :data-col=\"3\"\n                aria-label=\"Werkzaamheden\"\n                :error=\"Boolean(rowErrors[index]?.activity)\"\n                placeholder=\"Code of omschrijving…\"\n                @update:model-value=\"onActivityChange({ index, activityId: $event })\"\n                @commit=\"advance(index, 3)\"\n                @keydown.tab.exact.prevent=\"onActivityTab(index)\"\n                @navrow=\"(delta) => moveVertical(index, 3, delta)\"\n              />\n            </td>\n            <td class=\"hh-table__num\">{{ rowAmount(row) }}</td>\n            <td>\n              <button class=\"hg__del\" type=\"button\" tabindex=\"-1\" title=\"Regel verwijderen\" @click=\"removeRow(index)\" :disabled=\"rows.length === 1\">×</button>\n            </td>\n          </tr>\n          <tr v-if=\"isFree(row.activityId)\" :class=\"{ 'hg__row--error': rowErrors[index]?.description }\">\n            <td colspan=\"6\">\n              <label class=\"hg__description\">Omschrijving\n              <textarea\n                :ref=\"resizeDescription\"\n                v-model=\"row.description\"\n                class=\"hh-input hg__description-input\"\n                :class=\"{ 'hh-input--error': rowErrors[index]?.description }\"\n                :data-row=\"index\"\n                :data-col=\"4\"\n                rows=\"1\"\n                aria-label=\"Omschrijving\"\n                aria-required=\"true\"\n                placeholder=\"Vrije omschrijving verplicht\"\n                @keydown.tab.exact.prevent=\"advance(index, 4)\"\n                @keydown.up.prevent=\"moveVertical(index, 4, -1)\"\n                @keydown.down.prevent=\"moveVertical(index, 4, 1)\"\n                @input=\"onDescriptionInput({ index, event: $event })\"\n                @blur=\"onDescriptionBlur(index)\"\n              ></textarea>\n              </label>\n            </td>\n          </tr>\n          </template>\n        </tbody>\n        <tfoot>\n          <tr>\n            <td class=\"hh-table__num hg__foot\">{{ formatHours(totalHours) }}</td>\n            <td colspan=\"3\" class=\"hg__foot\">{{ filledRows.length }} regel(s)</td>\n            <td class=\"hh-table__num hg__foot\">{{ formatEuro(totalAmount) }}</td>\n            <td></td>\n          </tr>\n        </tfoot>\n      </table>\n    </div>\n\n    <div class=\"he__actions\">\n      <button class=\"hh-btn\" type=\"button\" @click=\"addRowFromButton\">+ Regel</button>\n      <button class=\"hh-btn hh-btn--primary\" type=\"button\" :disabled=\"saving\" @click=\"onVerwerkClick\">\n        {{ saving ? \"Verwerken…\" : \"Verwerk uren\" }}\n      </button>\n      <button class=\"hh-btn hh-btn--danger\" type=\"button\" @click=\"clearConfirmOpen = true\">Alle invoer wissen</button>\n    </div>\n\n    <p v-if=\"submitError\" class=\"hh-formerror he__submiterror\">{{ submitError }}</p>\n    </template>\n\n    <!-- Esc: wissen of terug. -->\n    <AppDialog v-if=\"escDialogOpen\" title=\"Uren invoeren\" @close=\"escDialogOpen = false\">\n      <p>Wat wil je met de ingevoerde uren doen?</p>\n      <template #footer>\n        <button class=\"hh-btn hh-btn--danger\" type=\"button\" @click=\"clearAll\">Wissen alle invoer</button>\n        <button class=\"hh-btn\" type=\"button\" data-autofocus @click=\"escDialogOpen = false\">Terug naar invoer</button>\n      </template>\n    </AppDialog>\n\n    <!-- Bevestiging bij het wissen van alle invoer. -->\n    <AppDialog v-if=\"clearConfirmOpen\" title=\"Alle invoer wissen?\" @close=\"clearConfirmOpen = false\">\n      <p>Weet je zeker dat je alle ingevoerde regels wilt wissen?</p>\n      <template #footer>\n        <button class=\"hh-btn\" type=\"button\" data-autofocus @click=\"clearConfirmOpen = false\">Annuleren</button>\n        <button class=\"hh-btn hh-btn--danger\" type=\"button\" @click=\"clearAll\">Wissen</button>\n      </template>\n    </AppDialog>\n\n    <!-- Bevestiging bij verwerken (tegen per ongeluk submitten). -->\n    <AppDialog v-if=\"verwerkDialogOpen\" title=\"Uren verwerken?\" @close=\"verwerkDialogOpen = false\">\n      <p>Weet je zeker dat je {{ filledRows.length }} urenregel(s) wilt verwerken?</p>\n      <template #footer>\n        <label class=\"he__remember\">\n          <input type=\"checkbox\" v-model=\"rememberChoice\" />\n          Onthoud mijn keuze\n        </label>\n        <button class=\"hh-btn\" type=\"button\" @click=\"verwerkDialogOpen = false\">Terug</button>\n        <button class=\"hh-btn hh-btn--primary\" type=\"button\" data-autofocus @click=\"verwerkConfirmed\">Verwerken</button>\n      </template>\n    </AppDialog>\n  </section>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, nextTick, onBeforeUnmount, onMounted, reactive, ref, watch } from \"vue\";\nimport { Money } from \"@webhare/std\";\nimport { useOrganizationDirty } from \"../lib/organization\";\nimport { useApi } from \"../lib/api\";\nimport { formatEuro, formatHours } from \"../lib/format\";\nimport { HOURS_INPUT_ERROR, isHoursDraft, parseHoursInput } from \"../lib/hoursInput\";\nimport { expandFiscalYear, fiscalYearOf, isoWeek, todayISODate } from \"../lib/dates\";\nimport { isPreferenceSet, setPreference, scopedPreferenceStorageKey } from \"../lib/preferences\";\nimport Combobox, { type ComboOption } from \"../components/Combobox.vue\";\nimport AppDialog from \"../components/AppDialog.vue\";\nimport DateInput from \"../components/DateInput.vue\";\n\nconst api = useApi();\n\ntype Employee = Awaited<ReturnType<typeof api.listEmployees>>[number];\ntype Customer = Awaited<ReturnType<typeof api.listCustomers>>[number];\ntype Activity = Awaited<ReturnType<typeof api.listActivities>>[number];\n\ninterface GridRow {\n  key: number;\n  customerId: number | null;\n  activityId: number | null;\n  year: string;\n  hours: string;\n  description: string;\n}\ninterface RowError {\n  customer?: boolean;\n  activity?: boolean;\n  year?: boolean;\n  hours?: string;\n  description?: boolean;\n}\n\n// The description column is present only for free-description activities.\nconst LAST_COL = 4;\n\nconst employees = ref<Employee[]>([]);\nconst customers = ref<Customer[]>([]);\nconst activities = ref<Activity[]>([]);\nconst loadError = ref(\"\");\nconst notice = ref(\"\");\nconst userEmail = ref(\"\");\n\nconst employeeId = ref(0);\nconst employeeCombo = ref<InstanceType<typeof Combobox> | null>(null);\nconst employeeOptions = computed<ComboOption[]>(() => employees.value.map(employee => ({\n  id: employee.id,\n  label: `${employee.code} · ${employee.name}`,\n})));\nconst date = ref(todayISODate());\nconst dateInput = ref<InstanceType<typeof DateInput> | null>(null);\nconst week = computed(() => {\n  const d = new Date(date.value);\n  return Number.isNaN(d.getTime()) ? isoWeek(new Date()) : isoWeek(d);\n});\n\nfunction defaultYear(): string {\n  return String(fiscalYearOf(date.value) || new Date().getFullYear());\n}\n\nlet nextKey = 1;\nfunction blankRow(): GridRow {\n  return { key: nextKey++, customerId: null, activityId: null, year: defaultYear(), hours: \"\", description: \"\" };\n}\nconst rows = reactive<GridRow[]>([blankRow()]);\nuseOrganizationDirty(() => rows.some(row => row.customerId !== null || row.activityId !== null || row.hours !== \"\" || row.description !== \"\"));\nconst rowErrors = reactive<Record<number, RowError | undefined>>({});\n\nconst saving = ref(false);\nconst submitError = ref(\"\");\nconst escDialogOpen = ref(false);\nconst verwerkDialogOpen = ref(false);\nconst clearConfirmOpen = ref(false);\nconst rememberChoice = ref(false);\n\nconst customerOptions = computed<ComboOption[]>(() => customers.value.map((c) => ({\n  id: c.id,\n  label: c.company || c.contactName || `Klant ${c.number}`,\n  sub: c.number,\n})));\n\n// Toon de code in het veld zelf, bv. \"1A Administratieverw.\"; typen op code of\n// omschrijving blijft filteren (de code zit nu in het label).\nconst activityOptions = computed<ComboOption[]>(() => activities.value.map((a) => ({\n  id: a.id,\n  label: [a.code, a.description].filter(Boolean).join(\" · \"),\n})));\n\nconst ZERO = new Money(\"0\");\n\nconst employeeRate = computed(() => employees.value.find((e) => e.id === employeeId.value)?.hourlyRate ?? ZERO);\n\nconst filledRows = computed(() => rows.filter(isFilled));\nconst totalHours = computed(() => filledRows.value.reduce((sum, row) => Money.add(sum, parseHours(row.hours)), ZERO));\nconst totalAmount = computed(() => filledRows.value.reduce((sum, row) => Money.add(sum, Money.multiply(parseHours(row.hours), employeeRate.value)), ZERO));\n\n// Uren exact als Money (net als de server); ongeldige invoer telt als 0.\nfunction parseHours(value: string): Money {\n  return parseHoursInput(value) ?? ZERO;\n}\n\n// Een regel telt als \"begonnen\" zodra er een werkzaamheid, uren of omschrijving\n// is. Een vooringevulde klant (overgenomen van de vorige regel) en het boekjaar\n// (heeft altijd een standaardwaarde) tellen NIET mee: zo wordt de laatste\n// net-aangemaakte regel genegeerd bij verwerken en kan die met Shift+Tab weer weg.\nfunction isFilled(row: GridRow): boolean {\n  return row.activityId !== null || row.hours.trim() !== \"\" || (isFree(row.activityId) && row.description.trim() !== \"\");\n}\n\nfunction isFree(activityId: number | null): boolean {\n  return activities.value.find((a) => a.id === activityId)?.isFree ?? false;\n}\n\nfunction lastColumn(row: GridRow): number {\n  return isFree(row.activityId) ? LAST_COL : LAST_COL - 1;\n}\n\nfunction onActivityChange({ index, activityId }: { index: number; activityId: number | null }): void {\n  rows[index].activityId = activityId;\n  clearRowError(index, \"activity\");\n  if (!isFree(activityId)) clearRowError(index, \"description\");\n}\n\nfunction onActivityTab(index: number): void {\n  // The combobox selects its highlighted option in its own Tab handler first.\n  void nextTick(() => advance(index, 3));\n}\n\nfunction rowAmount(row: GridRow): string {\n  if (!isFilled(row) || !row.hours.trim()) return \"\";\n  return formatEuro(Money.multiply(parseHours(row.hours), employeeRate.value));\n}\n\n// ── localStorage per gebruiker (best-effort, zoals LoginForm) ────────────────\nfunction readLastEmployee(email: string): number | null {\n  try {\n    const raw = localStorage.getItem(scopedPreferenceStorageKey(\"lastEmployee\"));\n    const id = raw ? Number(raw) : 0;\n    return id > 0 ? id : null;\n  } catch { return null; }\n}\nfunction writeLastEmployee(email: string, id: number): void {\n  try { localStorage.setItem(scopedPreferenceStorageKey(\"lastEmployee\"), String(id)); } catch { /* ignore */ }\n}\n\n// ── Regels ───────────────────────────────────────────────────────────────────\nfunction addRow(prefill?: { customerId?: number | null; year?: string }): GridRow {\n  const row = blankRow();\n  if (prefill?.customerId != null) row.customerId = prefill.customerId;\n  if (prefill?.year) row.year = prefill.year;\n  rows.push(row);\n  return row;\n}\n\nfunction addRowFromButton(): void {\n  const last = rows[rows.length - 1];\n  addRow({ customerId: last?.customerId ?? null, year: last?.year });\n  focusCell(rows.length - 1, 0);\n}\n\nfunction removeRow(index: number): void {\n  if (rows.length === 1) return;\n  rows.splice(index, 1);\n  // Fouten zijn op index gebaseerd; na een structurele wijziging opnieuw opbouwen.\n  for (const key of Object.keys(rowErrors)) delete rowErrors[Number(key)];\n}\n\n// \"Leeg\" = nog niet begonnen (een vooringevulde klant/boekjaar telt niet mee).\nfunction isRowEmpty(row: GridRow): boolean {\n  return !isFilled(row);\n}\n\n// ── Focus / navigatie ────────────────────────────────────────────────────────\nfunction focusCell(row: number, col: number): void {\n  void nextTick(() => {\n    if (!rows[row]) return;\n    const targetCol = Math.min(col, lastColumn(rows[row]));\n    const el = document.querySelector<HTMLElement>(`.hg [data-row=\"${row}\"][data-col=\"${targetCol}\"]`);\n    el?.focus();\n    if (el instanceof HTMLInputElement) el.select();\n  });\n}\n\nfunction moveVertical(row: number, col: number, delta: number): void {\n  const target = row + delta;\n  if (target < 0 || target >= rows.length) return;\n  focusCell(target, col);\n}\n\nfunction advance(row: number, col: number): void {\n  if (col < lastColumn(rows[row])) {\n    focusCell(row, col + 1);\n    return;\n  }\n  // Laatste kolom: zorg voor een volgende regel (klant + boekjaar vooringevuld) en spring erheen.\n  if (row === rows.length - 1) {\n    const cur = rows[row];\n    addRow({ customerId: cur.customerId, year: cur.year });\n  }\n  focusCell(row + 1, 0);\n}\n\nfunction onFirstCellShiftTab({ index, event }: { index: number; event: KeyboardEvent }): void {\n  // Remove an empty trailing row and return to the previous row's last visible field.\n  if (index === rows.length - 1 && rows.length > 1 && isRowEmpty(rows[index])) {\n    event.preventDefault();\n    removeRow(index);\n    focusCell(index - 1, LAST_COL);\n  }\n}\n\n// ── Veld-validatie op blur ─────────────────────────────────────────────────\nfunction onHoursInput({ index, event }: { index: number; event: Event }): void {\n  const input = event.target as HTMLInputElement;\n  if (!isHoursDraft(input.value)) {\n    input.value = rows[index].hours;\n    rowErrors[index] = { ...rowErrors[index], hours: \"Gebruik alleen cijfers, één punt of komma en eventueel een minteken vooraan.\" };\n    return;\n  }\n  rows[index].hours = input.value;\n  clearRowError(index, \"hours\");\n}\n\nfunction onHoursBlur(index: number): boolean {\n  const row = rows[index];\n  const hours = parseHoursInput(row.hours);\n  if (!hours) {\n    if (isFilled(row)) rowErrors[index] = { ...rowErrors[index], hours: HOURS_INPUT_ERROR };\n    return false;\n  }\n  row.hours = String(hours).replace(\".\", \",\");\n  clearRowError(index, \"hours\");\n  return true;\n}\n\nfunction onHoursCommit({ index, event }: { index: number; event: KeyboardEvent }): void {\n  if (!onHoursBlur(index)) {\n    event.preventDefault();\n    rowErrors[index] = { ...rowErrors[index], hours: HOURS_INPUT_ERROR };\n    return;\n  }\n  if (event.key === \"Enter\") {\n    event.preventDefault();\n    advance(index, 0);\n  }\n}\n\nfunction onYearBlur(index: number): void {\n  const expanded = expandFiscalYear(rows[index].year);\n  if (expanded) rows[index].year = String(expanded);\n}\n\nfunction resizeDescription(element: unknown): void {\n  if (!(element instanceof HTMLTextAreaElement)) return;\n  element.style.height = \"auto\";\n  element.style.height = `${element.scrollHeight + element.offsetHeight - element.clientHeight}px`;\n}\n\nfunction onDescriptionInput({ index, event }: { index: number; event: Event }): void {\n  resizeDescription(event.target);\n  const error = rowErrors[index];\n  if (error?.description) clearRowError(index, \"description\");\n}\n\nfunction onDescriptionBlur(index: number): void {\n  const row = rows[index];\n  if (isFree(row.activityId) && !row.description.trim()) {\n    rowErrors[index] = { ...rowErrors[index], description: true };\n  } else {\n    clearRowError(index, \"description\");\n  }\n}\n\nfunction clearRowError(index: number, field: keyof RowError): void {\n  const error = rowErrors[index];\n  if (!error?.[field]) return;\n  const { [field]: _drop, ...rest } = error;\n  rowErrors[index] = Object.keys(rest).length ? rest : undefined;\n}\n\n// ── Verwerken ────────────────────────────────────────────────────────────────\nfunction validate(): boolean {\n  for (const key of Object.keys(rowErrors)) delete rowErrors[Number(key)];\n  submitError.value = \"\";\n\n  if (dateInput.value && !dateInput.value.validate()) {\n    dateInput.value.focus();\n    return false;\n  }\n\n  if (!employeeId.value) {\n    submitError.value = \"Kies eerst een werknemer.\";\n    employeeCombo.value?.focus();\n    return false;\n  }\n  if (filledRows.value.length === 0) {\n    submitError.value = \"Voer minimaal één regel in.\";\n    return false;\n  }\n\n  // Kolom-index per foutveld, zodat de focus naar het eerste (bovenste, meest\n  // linkse) foute veld springt.\n  const colOf: Record<keyof RowError, number> = { hours: 0, customer: 1, year: 2, activity: 3, description: 4 };\n  let firstBadRow: number | null = null;\n  let firstBadCol = 0;\n  rows.forEach((row, index) => {\n    if (!isFilled(row)) return;\n    const error: RowError = {};\n    if (row.customerId === null) error.customer = true;\n    if (row.activityId === null) error.activity = true;\n    if (expandFiscalYear(row.year) === 0) error.year = true;\n    if (!parseHoursInput(row.hours)) error.hours = HOURS_INPUT_ERROR;\n    if (isFree(row.activityId) && !row.description.trim()) error.description = true;\n    const fields = Object.keys(error) as (keyof RowError)[];\n    if (fields.length > 0) {\n      rowErrors[index] = error;\n      if (firstBadRow === null) {\n        firstBadRow = index;\n        firstBadCol = Math.min(...fields.map((field) => colOf[field]));\n      }\n    }\n  });\n\n  if (firstBadRow !== null) {\n    submitError.value = \"Sommige regels zijn onvolledig. Controleer de gemarkeerde velden.\";\n    focusCell(firstBadRow, firstBadCol);\n    return false;\n  }\n  return true;\n}\n\nfunction onVerwerkClick(): void {\n  if (!validate()) return;\n  if (userEmail.value && isPreferenceSet(userEmail.value, \"skipVerwerkConfirm\")) {\n    void doVerwerk();\n  } else {\n    rememberChoice.value = false;   // schone start per keer dat de dialoog opent\n    verwerkDialogOpen.value = true;\n  }\n}\n\nfunction verwerkConfirmed(): void {\n  // Aangevinkt \"Onthoud mijn keuze\" -> voortaan direct verwerken zonder dialoog.\n  if (rememberChoice.value && userEmail.value) setPreference(userEmail.value, \"skipVerwerkConfirm\");\n  verwerkDialogOpen.value = false;\n  void doVerwerk();\n}\n\nasync function doVerwerk(): Promise<void> {\n  saving.value = true;\n  submitError.value = \"\";\n  try {\n    const entries = filledRows.value.map((row) => ({\n      customerId: row.customerId as number,\n      activityId: row.activityId as number,\n      date: date.value,\n      fiscalYear: expandFiscalYear(row.year),\n      week: week.value || 0,\n      hours: String(parseHours(row.hours)),\n      // Keep the draft when switching back, but never book a hidden description for a fixed activity.\n      description: isFree(row.activityId) ? row.description.trim() : \"\",\n    }));\n    const created = await api.createTimeEntries({ employeeId: employeeId.value, entries });\n    notice.value = `${created.length} urenregel(s) verwerkt.`;\n    resetRows();\n    focusCell(0, 0);\n  } catch (e) {\n    submitError.value = e instanceof Error ? e.message : \"Verwerken mislukt.\";\n  } finally {\n    saving.value = false;\n  }\n}\n\nfunction resetRows(): void {\n  rows.splice(0, rows.length, blankRow());\n  for (const key of Object.keys(rowErrors)) delete rowErrors[Number(key)];\n}\n\nfunction clearAll(): void {\n  resetRows();\n  escDialogOpen.value = false;\n  clearConfirmOpen.value = false;\n  submitError.value = \"\";\n  notice.value = \"\";\n  focusCell(0, 0);\n}\n\n// Werknemer gekozen in de pulldown: toon het grid en spring naar de eerste cel.\nfunction onEmployeeChosen(): void {\n  if (employeeId.value > 0) focusCell(0, 0);\n}\n\n// The native picker previously added a separate Chromium Tab stop that could\n// not receive a tabindex. Keep the same direct grid/employee navigation with\n// DateInput; its calendar button is mouse-accessible and ArrowDown opens it.\nfunction onDateKeydown(event: KeyboardEvent): void {\n  if (![\"Enter\", \"Tab\"].includes(event.key) || event.ctrlKey || event.metaKey || event.altKey) return;\n  const target = event.shiftKey\n    ? employeeCombo.value\n    : document.querySelector<HTMLElement>('.hg [data-row=\"0\"][data-col=\"0\"]');\n  if (!target) return; // niets om heen te springen: laat de browser Tab afhandelen\n  event.preventDefault();\n  target.focus();\n  if (target instanceof HTMLInputElement) target.select();\n}\n\nfunction onGlobalKeydown(event: KeyboardEvent): void {\n  if (!employeeId.value) return; // zonder werknemer is er nog geen invoer\n  const dialogOpen = escDialogOpen.value || verwerkDialogOpen.value || clearConfirmOpen.value;\n  if (event.key === \"Enter\" && (event.metaKey || event.ctrlKey || event.altKey)) {\n    if (dialogOpen) return;\n    event.preventDefault();\n    onVerwerkClick();\n    return;\n  }\n  if (event.key === \"Escape\" && !dialogOpen) {\n    event.preventDefault();\n    escDialogOpen.value = true;\n  }\n}\n\nasync function load(): Promise<void> {\n  try {\n    const [me, emps, custs, acts] = await Promise.all([\n      api.me(),\n      api.listEmployees(),\n      api.listCustomers(),\n      api.listActivities(),\n    ]);\n    userEmail.value = me.email;\n    employees.value = emps;\n    customers.value = custs;\n    activities.value = acts;\n\n    const stored = userEmail.value ? readLastEmployee(userEmail.value) : null;\n    if (stored && emps.some((e) => e.id === stored)) {\n      employeeId.value = stored;\n    } else if (emps.length === 1) {\n      employeeId.value = emps[0].id;\n    }\n    void nextTick(() => employeeCombo.value?.focus());\n  } catch {\n    loadError.value = \"Kon werknemers, klanten of werkzaamheden niet laden.\";\n  }\n}\n\nwatch(employeeId, (id) => {\n  if (userEmail.value && id > 0) writeLastEmployee(userEmail.value, id);\n});\n\nonMounted(() => {\n  void load();\n  window.addEventListener(\"keydown\", onGlobalKeydown);\n});\nonBeforeUnmount(() => window.removeEventListener(\"keydown\", onGlobalKeydown));\n</script>\n\n<style scoped>\n.he__notice {\n  margin: 0 0 12px;\n  padding: 9px 12px;\n  border: 1px solid rgba(37, 122, 62, 0.5);\n  border-radius: var(--hh-radius);\n  background: var(--hh-accent-soft);\n  color: var(--hh-accent-strong);\n  font-size: 13px;\n}\n.he__head {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 16px;\n  padding: 14px 18px;\n  margin-bottom: 14px;\n}\n.he__pickhint {\n  margin: 0;\n  padding: 16px 18px;\n  border: 1px dashed var(--hh-line-strong);\n  border-radius: var(--hh-radius);\n  background: var(--hh-surface-2);\n  color: var(--hh-fg-muted);\n  font-size: 13.5px;\n}\n.he__hlabel {\n  display: flex;\n  flex-direction: column;\n  gap: 4px;\n  font-size: 12.5px;\n  font-weight: 600;\n  color: var(--hh-fg-muted);\n}\n.he__employee {\n  width: 320px;\n  max-width: 100%;\n}\n.he__date { width: 170px; }\n.he__week {\n  width: 72px;\n  background: var(--hh-surface-2);\n  border-style: dashed;\n  color: var(--hh-fg-muted);\n  cursor: default;\n}\n.he__gridwrap {\n  padding: 4px;\n  overflow: visible;\n}\n.hg {\n  width: 100%;\n  border-collapse: collapse;\n}\n.hg thead th {\n  padding: 8px 8px;\n  text-align: left;\n  font-size: 11.5px;\n  font-weight: 600;\n  letter-spacing: 0.03em;\n  text-transform: uppercase;\n  color: var(--hh-fg-muted);\n}\n.hg tbody td {\n  padding: 4px 6px;\n  vertical-align: top;\n}\n.hg__row--error td {\n  background: var(--hh-danger-soft);\n}\n.hg__description {\n  display: flex;\n  flex-direction: column;\n  gap: 4px;\n  padding-bottom: 6px;\n  font-size: 14px;\n  color: var(--hh-fg-muted);\n}\n.hg__description-input {\n  box-sizing: border-box;\n  min-height: 34px;\n  overflow: hidden;\n  resize: none;\n  line-height: 1.5;\n}\n.hg__error {\n  display: block;\n  margin-top: 4px;\n  color: var(--hh-danger);\n  font-size: 14px;\n}\n.hg__del {\n  width: 26px;\n  height: 34px;\n  border: 0;\n  background: transparent;\n  color: var(--hh-fg-subtle);\n  font-size: 18px;\n  cursor: pointer;\n}\n.hg__del:hover:not(:disabled) {\n  color: var(--hh-danger);\n}\n.hg__del:disabled {\n  opacity: 0.3;\n  cursor: default;\n}\n.hg__foot {\n  padding: 10px 8px;\n  font-weight: 600;\n  border-top: 1px solid var(--hh-line-strong);\n}\n.he__actions {\n  display: flex;\n  gap: 8px;\n  margin-top: 14px;\n}\n.he__submiterror {\n  margin-top: 12px;\n}\n.he__remember {\n  margin-right: auto;\n  display: flex;\n  align-items: center;\n  gap: 6px;\n  font-size: 13px;\n  color: var(--hh-fg-muted);\n  cursor: pointer;\n}\n.he__remember input {\n  cursor: pointer;\n}\nkbd {\n  font-family: var(--hh-mono);\n  font-size: 11px;\n  padding: 1px 5px;\n  border: 1px solid var(--hh-line-strong);\n  border-radius: 4px;\n  background: var(--hh-surface-2);\n  color: var(--hh-fg-muted);\n}\n</style>\n","import { createElementVNode as _createElementVNode, createTextVNode as _createTextVNode, toDisplayString as _toDisplayString, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, createVNode as _createVNode, renderList as _renderList, Fragment as _Fragment, withModifiers as _withModifiers, withKeys as _withKeys, normalizeClass as _normalizeClass, vModelText as _vModelText, withDirectives as _withDirectives, withCtx as _withCtx, createBlock as _createBlock, vModelCheckbox as _vModelCheckbox } from \"vue\"\n\nconst _hoisted_1 = { class: \"he\" }\nconst _hoisted_2 = {\n  key: 0,\n  class: \"hh-formerror\"\n}\nconst _hoisted_3 = {\n  key: 1,\n  class: \"he__notice\"\n}\nconst _hoisted_4 = { class: \"hh-card he__head\" }\nconst _hoisted_5 = { class: \"he__hlabel he__employee\" }\nconst _hoisted_6 = { class: \"he__hlabel he__date\" }\nconst _hoisted_7 = { class: \"he__hlabel\" }\nconst _hoisted_8 = [\"value\"]\nconst _hoisted_9 = {\n  key: 2,\n  class: \"he__pickhint\"\n}\nconst _hoisted_10 = { class: \"hh-card he__gridwrap\" }\nconst _hoisted_11 = { class: \"hg\" }\nconst _hoisted_12 = [\"value\", \"aria-invalid\", \"aria-describedby\", \"data-row\", \"onInput\", \"onBlur\", \"onKeydown\"]\nconst _hoisted_13 = [\"id\"]\nconst _hoisted_14 = [\"onUpdate:modelValue\", \"data-row\", \"onKeydown\", \"onBlur\"]\nconst _hoisted_15 = { class: \"hh-table__num\" }\nconst _hoisted_16 = [\"onClick\", \"disabled\"]\nconst _hoisted_17 = { colspan: \"6\" }\nconst _hoisted_18 = { class: \"hg__description\" }\nconst _hoisted_19 = [\"onUpdate:modelValue\", \"data-row\", \"onKeydown\", \"onInput\", \"onBlur\"]\nconst _hoisted_20 = { class: \"hh-table__num hg__foot\" }\nconst _hoisted_21 = {\n  colspan: \"3\",\n  class: \"hg__foot\"\n}\nconst _hoisted_22 = { class: \"hh-table__num hg__foot\" }\nconst _hoisted_23 = { class: \"he__actions\" }\nconst _hoisted_24 = [\"disabled\"]\nconst _hoisted_25 = {\n  key: 0,\n  class: \"hh-formerror he__submiterror\"\n}\nconst _hoisted_26 = { class: \"he__remember\" }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return (_openBlock(), _createElementBlock(\"section\", _hoisted_1, [\n    _cache[19] || (_cache[19] = _createElementVNode(\"div\", { class: \"hh-page__bar\" }, [\n      _createElementVNode(\"div\", null, [\n        _createElementVNode(\"h1\", { class: \"hh-page__title\" }, \"Uren invoeren\"),\n        _createElementVNode(\"p\", { class: \"hh-page__sub\" }, [\n          _createTextVNode(\"Enter of Tab springt naar het volgende veld; op de laatste kolom begint een nieuwe regel. In de omschrijving maakt Enter een nieuwe tekstregel. Pijltjes omhoog/omlaag gaan tussen regels. \"),\n          _createElementVNode(\"kbd\", null, \"Cmd/Ctrl+Enter\"),\n          _createTextVNode(\" verwerkt, \"),\n          _createElementVNode(\"kbd\", null, \"Esc\"),\n          _createTextVNode(\" wist of gaat terug.\")\n        ])\n      ])\n    ], -1 /* CACHED */)),\n    ($setup.loadError)\n      ? (_openBlock(), _createElementBlock(\"p\", _hoisted_2, _toDisplayString($setup.loadError), 1 /* TEXT */))\n      : _createCommentVNode(\"v-if\", true),\n    ($setup.notice)\n      ? (_openBlock(), _createElementBlock(\"p\", _hoisted_3, _toDisplayString($setup.notice), 1 /* TEXT */))\n      : _createCommentVNode(\"v-if\", true),\n    _createCommentVNode(\" Kop: werknemer / datum / week \"),\n    _createElementVNode(\"div\", _hoisted_4, [\n      _createElementVNode(\"label\", _hoisted_5, [\n        _cache[10] || (_cache[10] = _createTextVNode(\"Werknemer \", -1 /* CACHED */)),\n        _createVNode($setup[\"Combobox\"], {\n          ref: \"employeeCombo\",\n          \"model-value\": $setup.employeeId,\n          options: $setup.employeeOptions,\n          \"aria-label\": \"Werknemer\",\n          placeholder: \"Code of naam…\",\n          error: Boolean($setup.submitError && !$setup.employeeId),\n          \"aria-invalid\": Boolean($setup.submitError && !$setup.employeeId),\n          \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => ($setup.employeeId = $event ?? 0)),\n          onCommit: $setup.onEmployeeChosen\n        }, null, 8 /* PROPS */, [\"model-value\", \"options\", \"error\", \"aria-invalid\"])\n      ]),\n      _createElementVNode(\"div\", _hoisted_6, [\n        _cache[11] || (_cache[11] = _createElementVNode(\"label\", { for: \"he-date\" }, \"Datum\", -1 /* CACHED */)),\n        _createVNode($setup[\"DateInput\"], {\n          id: \"he-date\",\n          ref: \"dateInput\",\n          modelValue: $setup.date,\n          \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => (($setup.date) = $event)),\n          disabled: $setup.saving,\n          onCommit: $setup.onDateKeydown\n        }, null, 8 /* PROPS */, [\"modelValue\", \"disabled\"])\n      ]),\n      _createElementVNode(\"label\", _hoisted_7, [\n        _cache[12] || (_cache[12] = _createTextVNode(\"Week \", -1 /* CACHED */)),\n        _createElementVNode(\"input\", {\n          value: $setup.week,\n          type: \"text\",\n          class: \"hh-input hh-input--num he__week\",\n          readonly: \"\",\n          tabindex: \"-1\",\n          \"aria-label\": \"Week, berekend uit datum\"\n        }, null, 8 /* PROPS */, _hoisted_8)\n      ])\n    ]),\n    (!$setup.employeeId)\n      ? (_openBlock(), _createElementBlock(\"p\", _hoisted_9, \"Kies eerst een werknemer om uren in te voeren.\"))\n      : (_openBlock(), _createElementBlock(_Fragment, { key: 3 }, [\n          _createCommentVNode(\" Regels \"),\n          _createElementVNode(\"div\", _hoisted_10, [\n            _createElementVNode(\"table\", _hoisted_11, [\n              _cache[15] || (_cache[15] = _createElementVNode(\"thead\", null, [\n                _createElementVNode(\"tr\", null, [\n                  _createElementVNode(\"th\", { style: {\"width\":\"90px\"} }, \"Uren\"),\n                  _createElementVNode(\"th\", null, \"Klant\"),\n                  _createElementVNode(\"th\", { style: {\"width\":\"84px\"} }, \"Jaar\"),\n                  _createElementVNode(\"th\", { style: {\"width\":\"32%\"} }, \"Werkzaamheden\"),\n                  _createElementVNode(\"th\", {\n                    class: \"hh-table__num\",\n                    style: {\"width\":\"100px\"}\n                  }, \"Bedrag\"),\n                  _createElementVNode(\"th\", { style: {\"width\":\"34px\"} })\n                ])\n              ], -1 /* CACHED */)),\n              _createElementVNode(\"tbody\", null, [\n                (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.rows, (row, index) => {\n                  return (_openBlock(), _createElementBlock(_Fragment, {\n                    key: row.key\n                  }, [\n                    _createElementVNode(\"tr\", {\n                      class: _normalizeClass({ 'hg__row--error': $setup.rowErrors[index] })\n                    }, [\n                      _createElementVNode(\"td\", null, [\n                        _createElementVNode(\"input\", {\n                          value: row.hours,\n                          class: _normalizeClass([\"hh-input hh-input--num\", { 'hh-input--error': $setup.rowErrors[index]?.hours }]),\n                          \"aria-invalid\": Boolean($setup.rowErrors[index]?.hours),\n                          \"aria-describedby\": $setup.rowErrors[index]?.hours ? `he-hours-error-${row.key}` : undefined,\n                          \"data-row\": index,\n                          \"data-col\": 0,\n                          \"aria-label\": \"Uren\",\n                          inputmode: \"decimal\",\n                          placeholder: \"0\",\n                          onInput: $event => ($setup.onHoursInput({ index, event: $event })),\n                          onBlur: $event => ($setup.onHoursBlur(index)),\n                          onKeydown: [\n                            _withKeys(_withModifiers($event => ($setup.onHoursCommit({ index, event: $event })), [\"exact\"]), [\"enter\"]),\n                            _withKeys(_withModifiers($event => ($setup.onHoursCommit({ index, event: $event })), [\"exact\"]), [\"tab\"]),\n                            _withKeys(_withModifiers($event => ($setup.onFirstCellShiftTab({ index, event: $event })), [\"shift\"]), [\"tab\"]),\n                            _withKeys(_withModifiers($event => ($setup.moveVertical(index, 0, -1)), [\"prevent\"]), [\"up\"]),\n                            _withKeys(_withModifiers($event => ($setup.moveVertical(index, 0, 1)), [\"prevent\"]), [\"down\"])\n                          ]\n                        }, null, 42 /* CLASS, PROPS, NEED_HYDRATION */, _hoisted_12),\n                        ($setup.rowErrors[index]?.hours)\n                          ? (_openBlock(), _createElementBlock(\"span\", {\n                              key: 0,\n                              id: `he-hours-error-${row.key}`,\n                              class: \"hg__error\",\n                              role: \"alert\"\n                            }, _toDisplayString($setup.rowErrors[index]?.hours), 9 /* TEXT, PROPS */, _hoisted_13))\n                          : _createCommentVNode(\"v-if\", true)\n                      ]),\n                      _createElementVNode(\"td\", null, [\n                        _createVNode($setup[\"Combobox\"], {\n                          modelValue: row.customerId,\n                          \"onUpdate:modelValue\": $event => ((row.customerId) = $event),\n                          options: $setup.customerOptions,\n                          \"data-row\": index,\n                          \"data-col\": 1,\n                          \"aria-label\": \"Klant\",\n                          error: Boolean($setup.rowErrors[index]?.customer),\n                          placeholder: \"Nummer of naam…\",\n                          onCommit: $event => ($setup.advance(index, 1)),\n                          onNavrow: (delta) => $setup.moveVertical(index, 1, delta)\n                        }, null, 8 /* PROPS */, [\"modelValue\", \"onUpdate:modelValue\", \"options\", \"data-row\", \"error\", \"onCommit\", \"onNavrow\"])\n                      ]),\n                      _createElementVNode(\"td\", null, [\n                        _withDirectives(_createElementVNode(\"input\", {\n                          \"onUpdate:modelValue\": $event => ((row.year) = $event),\n                          class: _normalizeClass([\"hh-input hh-input--num\", { 'hh-input--error': $setup.rowErrors[index]?.year }]),\n                          \"data-row\": index,\n                          \"data-col\": 2,\n                          \"aria-label\": \"Jaar\",\n                          inputmode: \"numeric\",\n                          maxlength: \"4\",\n                          placeholder: \"JJ\",\n                          onKeydown: [\n                            _withKeys(_withModifiers($event => ($setup.advance(index, 2)), [\"exact\",\"prevent\"]), [\"enter\"]),\n                            _withKeys(_withModifiers($event => ($setup.moveVertical(index, 2, -1)), [\"prevent\"]), [\"up\"]),\n                            _withKeys(_withModifiers($event => ($setup.moveVertical(index, 2, 1)), [\"prevent\"]), [\"down\"])\n                          ],\n                          onBlur: $event => ($setup.onYearBlur(index))\n                        }, null, 42 /* CLASS, PROPS, NEED_HYDRATION */, _hoisted_14), [\n                          [_vModelText, row.year]\n                        ])\n                      ]),\n                      _createElementVNode(\"td\", null, [\n                        _createVNode($setup[\"Combobox\"], {\n                          \"model-value\": row.activityId,\n                          options: $setup.activityOptions,\n                          \"data-row\": index,\n                          \"data-col\": 3,\n                          \"aria-label\": \"Werkzaamheden\",\n                          error: Boolean($setup.rowErrors[index]?.activity),\n                          placeholder: \"Code of omschrijving…\",\n                          \"onUpdate:modelValue\": $event => ($setup.onActivityChange({ index, activityId: $event })),\n                          onCommit: $event => ($setup.advance(index, 3)),\n                          onKeydown: _withKeys(_withModifiers($event => ($setup.onActivityTab(index)), [\"exact\",\"prevent\"]), [\"tab\"]),\n                          onNavrow: (delta) => $setup.moveVertical(index, 3, delta)\n                        }, null, 8 /* PROPS */, [\"model-value\", \"options\", \"data-row\", \"error\", \"onUpdate:modelValue\", \"onCommit\", \"onKeydown\", \"onNavrow\"])\n                      ]),\n                      _createElementVNode(\"td\", _hoisted_15, _toDisplayString($setup.rowAmount(row)), 1 /* TEXT */),\n                      _createElementVNode(\"td\", null, [\n                        _createElementVNode(\"button\", {\n                          class: \"hg__del\",\n                          type: \"button\",\n                          tabindex: \"-1\",\n                          title: \"Regel verwijderen\",\n                          onClick: $event => ($setup.removeRow(index)),\n                          disabled: $setup.rows.length === 1\n                        }, \"×\", 8 /* PROPS */, _hoisted_16)\n                      ])\n                    ], 2 /* CLASS */),\n                    ($setup.isFree(row.activityId))\n                      ? (_openBlock(), _createElementBlock(\"tr\", {\n                          key: 0,\n                          class: _normalizeClass({ 'hg__row--error': $setup.rowErrors[index]?.description })\n                        }, [\n                          _createElementVNode(\"td\", _hoisted_17, [\n                            _createElementVNode(\"label\", _hoisted_18, [\n                              _cache[13] || (_cache[13] = _createTextVNode(\"Omschrijving \", -1 /* CACHED */)),\n                              _withDirectives(_createElementVNode(\"textarea\", {\n                                ref_for: true,\n                                ref: $setup.resizeDescription,\n                                \"onUpdate:modelValue\": $event => ((row.description) = $event),\n                                class: _normalizeClass([\"hh-input hg__description-input\", { 'hh-input--error': $setup.rowErrors[index]?.description }]),\n                                \"data-row\": index,\n                                \"data-col\": 4,\n                                rows: \"1\",\n                                \"aria-label\": \"Omschrijving\",\n                                \"aria-required\": \"true\",\n                                placeholder: \"Vrije omschrijving verplicht\",\n                                onKeydown: [\n                                  _withKeys(_withModifiers($event => ($setup.advance(index, 4)), [\"exact\",\"prevent\"]), [\"tab\"]),\n                                  _withKeys(_withModifiers($event => ($setup.moveVertical(index, 4, -1)), [\"prevent\"]), [\"up\"]),\n                                  _withKeys(_withModifiers($event => ($setup.moveVertical(index, 4, 1)), [\"prevent\"]), [\"down\"])\n                                ],\n                                onInput: $event => ($setup.onDescriptionInput({ index, event: $event })),\n                                onBlur: $event => ($setup.onDescriptionBlur(index))\n                              }, null, 42 /* CLASS, PROPS, NEED_HYDRATION */, _hoisted_19), [\n                                [_vModelText, row.description]\n                              ])\n                            ])\n                          ])\n                        ], 2 /* CLASS */))\n                      : _createCommentVNode(\"v-if\", true)\n                  ], 64 /* STABLE_FRAGMENT */))\n                }), 128 /* KEYED_FRAGMENT */))\n              ]),\n              _createElementVNode(\"tfoot\", null, [\n                _createElementVNode(\"tr\", null, [\n                  _createElementVNode(\"td\", _hoisted_20, _toDisplayString($setup.formatHours($setup.totalHours)), 1 /* TEXT */),\n                  _createElementVNode(\"td\", _hoisted_21, _toDisplayString($setup.filledRows.length) + \" regel(s)\", 1 /* TEXT */),\n                  _createElementVNode(\"td\", _hoisted_22, _toDisplayString($setup.formatEuro($setup.totalAmount)), 1 /* TEXT */),\n                  _cache[14] || (_cache[14] = _createElementVNode(\"td\", null, null, -1 /* CACHED */))\n                ])\n              ])\n            ])\n          ]),\n          _createElementVNode(\"div\", _hoisted_23, [\n            _createElementVNode(\"button\", {\n              class: \"hh-btn\",\n              type: \"button\",\n              onClick: $setup.addRowFromButton\n            }, \"+ Regel\"),\n            _createElementVNode(\"button\", {\n              class: \"hh-btn hh-btn--primary\",\n              type: \"button\",\n              disabled: $setup.saving,\n              onClick: $setup.onVerwerkClick\n            }, _toDisplayString($setup.saving ? \"Verwerken…\" : \"Verwerk uren\"), 9 /* TEXT, PROPS */, _hoisted_24),\n            _createElementVNode(\"button\", {\n              class: \"hh-btn hh-btn--danger\",\n              type: \"button\",\n              onClick: _cache[2] || (_cache[2] = $event => ($setup.clearConfirmOpen = true))\n            }, \"Alle invoer wissen\")\n          ]),\n          ($setup.submitError)\n            ? (_openBlock(), _createElementBlock(\"p\", _hoisted_25, _toDisplayString($setup.submitError), 1 /* TEXT */))\n            : _createCommentVNode(\"v-if\", true)\n        ], 64 /* STABLE_FRAGMENT */)),\n    _createCommentVNode(\" Esc: wissen of terug. \"),\n    ($setup.escDialogOpen)\n      ? (_openBlock(), _createBlock($setup[\"AppDialog\"], {\n          key: 4,\n          title: \"Uren invoeren\",\n          onClose: _cache[4] || (_cache[4] = $event => ($setup.escDialogOpen = false))\n        }, {\n          footer: _withCtx(() => [\n            _createElementVNode(\"button\", {\n              class: \"hh-btn hh-btn--danger\",\n              type: \"button\",\n              onClick: $setup.clearAll\n            }, \"Wissen alle invoer\"),\n            _createElementVNode(\"button\", {\n              class: \"hh-btn\",\n              type: \"button\",\n              \"data-autofocus\": \"\",\n              onClick: _cache[3] || (_cache[3] = $event => ($setup.escDialogOpen = false))\n            }, \"Terug naar invoer\")\n          ]),\n          default: _withCtx(() => [\n            _cache[16] || (_cache[16] = _createElementVNode(\"p\", null, \"Wat wil je met de ingevoerde uren doen?\", -1 /* CACHED */))\n          ]),\n          _: 1 /* STABLE */,\n          __: [16]\n        }))\n      : _createCommentVNode(\"v-if\", true),\n    _createCommentVNode(\" Bevestiging bij het wissen van alle invoer. \"),\n    ($setup.clearConfirmOpen)\n      ? (_openBlock(), _createBlock($setup[\"AppDialog\"], {\n          key: 5,\n          title: \"Alle invoer wissen?\",\n          onClose: _cache[6] || (_cache[6] = $event => ($setup.clearConfirmOpen = false))\n        }, {\n          footer: _withCtx(() => [\n            _createElementVNode(\"button\", {\n              class: \"hh-btn\",\n              type: \"button\",\n              \"data-autofocus\": \"\",\n              onClick: _cache[5] || (_cache[5] = $event => ($setup.clearConfirmOpen = false))\n            }, \"Annuleren\"),\n            _createElementVNode(\"button\", {\n              class: \"hh-btn hh-btn--danger\",\n              type: \"button\",\n              onClick: $setup.clearAll\n            }, \"Wissen\")\n          ]),\n          default: _withCtx(() => [\n            _cache[17] || (_cache[17] = _createElementVNode(\"p\", null, \"Weet je zeker dat je alle ingevoerde regels wilt wissen?\", -1 /* CACHED */))\n          ]),\n          _: 1 /* STABLE */,\n          __: [17]\n        }))\n      : _createCommentVNode(\"v-if\", true),\n    _createCommentVNode(\" Bevestiging bij verwerken (tegen per ongeluk submitten). \"),\n    ($setup.verwerkDialogOpen)\n      ? (_openBlock(), _createBlock($setup[\"AppDialog\"], {\n          key: 6,\n          title: \"Uren verwerken?\",\n          onClose: _cache[9] || (_cache[9] = $event => ($setup.verwerkDialogOpen = false))\n        }, {\n          footer: _withCtx(() => [\n            _createElementVNode(\"label\", _hoisted_26, [\n              _withDirectives(_createElementVNode(\"input\", {\n                type: \"checkbox\",\n                \"onUpdate:modelValue\": _cache[7] || (_cache[7] = $event => (($setup.rememberChoice) = $event))\n              }, null, 512 /* NEED_PATCH */), [\n                [_vModelCheckbox, $setup.rememberChoice]\n              ]),\n              _cache[18] || (_cache[18] = _createTextVNode(\" Onthoud mijn keuze \", -1 /* CACHED */))\n            ]),\n            _createElementVNode(\"button\", {\n              class: \"hh-btn\",\n              type: \"button\",\n              onClick: _cache[8] || (_cache[8] = $event => ($setup.verwerkDialogOpen = false))\n            }, \"Terug\"),\n            _createElementVNode(\"button\", {\n              class: \"hh-btn hh-btn--primary\",\n              type: \"button\",\n              \"data-autofocus\": \"\",\n              onClick: $setup.verwerkConfirmed\n            }, \"Verwerken\")\n          ]),\n          default: _withCtx(() => [\n            _createElementVNode(\"p\", null, \"Weet je zeker dat je \" + _toDisplayString($setup.filledRows.length) + \" urenregel(s) wilt verwerken?\", 1 /* TEXT */)\n          ]),\n          _: 1 /* STABLE */\n        }))\n      : _createCommentVNode(\"v-if\", true)\n  ]))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/HoursEntryView.vue?type=script\";import \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/HoursEntryView.vue?type=style&index=0\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/HoursEntryView.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/HoursEntryView.vue\";script.__scopeId = \"data-v-d2786a82\";export default script;","export interface HoursOverviewState {\n  customerId: number;\n  employeeId: number;\n  activityId: number;\n  year: string;\n  groupBy: \"none\" | \"customer\" | \"employee\";\n}\n\n/** Invalid or missing URL values fall back to the unfiltered overview. */\nexport function parseHoursOverviewState(query: Record<string, string | undefined>): HoursOverviewState {\n  const id = (value: string | undefined) => value && /^\\d+$/.test(value) && Number.isSafeInteger(Number(value)) ? Number(value) : 0;\n  return {\n    customerId: id(query.klant),\n    employeeId: id(query.werknemer),\n    activityId: id(query.werkzaamheid),\n    year: query.jaar && /^[1-9]\\d{3}$/.test(query.jaar) ? query.jaar : \"all\",\n    groupBy: query.groeperen === \"customer\" || query.groeperen === \"employee\" ? query.groeperen : \"none\",\n  };\n}\n\n/** Default filters are omitted so the unfiltered list has a clean URL. */\nexport function hoursOverviewStateToQuery(state: HoursOverviewState): Record<string, string> {\n  const query: Record<string, string> = {};\n  if (state.customerId) query.klant = String(state.customerId);\n  if (state.employeeId) query.werknemer = String(state.employeeId);\n  if (state.activityId) query.werkzaamheid = String(state.activityId);\n  if (state.year !== \"all\") query.jaar = state.year;\n  if (state.groupBy !== \"none\") query.groeperen = state.groupBy;\n  return query;\n}\n","<script setup lang=\"ts\">\nimport { computed, nextTick, reactive, ref, useTemplateRef, watch } from \"vue\";\nimport { Money } from \"@webhare/std\";\nimport { useApi } from \"../lib/api\";\nimport { expandFiscalYear, isoWeek } from \"../lib/dates\";\nimport { formatEuro } from \"../lib/format\";\nimport { HOURS_INPUT_ERROR, isHoursDraft, parseHoursInput } from \"../lib/hoursInput\";\nimport AppDialog from \"./AppDialog.vue\";\nimport Combobox from \"./Combobox.vue\";\nimport DateInput from \"./DateInput.vue\";\nimport FormField from \"./FormField.vue\";\n\nconst api = useApi();\n\ntype Entry = Awaited<ReturnType<typeof api.listTimeEntries>>[number];\ntype Customer = Awaited<ReturnType<typeof api.listCustomers>>[number];\ntype Employee = Awaited<ReturnType<typeof api.listEmployees>>[number];\ntype Activity = Awaited<ReturnType<typeof api.listActivities>>[number];\n\nconst props = defineProps<{ entry: Entry; customers: Customer[]; employees: Employee[]; activities: Activity[] }>();\nconst emit = defineEmits<{ close: []; saved: [] }>();\nconst formElement = useTemplateRef<HTMLFormElement>(\"formElement\");\nconst dateInput = useTemplateRef<InstanceType<typeof DateInput>>(\"dateInput\");\nconst saving = ref(false);\nconst formError = ref(\"\");\nconst fieldErrors = reactive<Record<string, string>>({});\nconst form = reactive({\n  customerId: props.entry.customerId as number | null,\n  employeeId: props.entry.employeeId,\n  activityId: props.entry.activityId as number | null,\n  date: props.entry.date.slice(0, 10),\n  fiscalYear: String(props.entry.fiscalYear),\n  week: props.entry.week,\n  hours: String(props.entry.hours).replace(\".\", \",\"),\n  description: props.entry.description,\n});\n\n// Historical entries can still reference archived records absent from the active pickers.\nconst customerOptions = computed(() => {\n  const options = props.customers.map(c => ({ id: c.id, label: c.company || c.contactName, sub: c.number }));\n  return options.some(c => c.id === props.entry.customerId) ? options\n    : [{ id: props.entry.customerId, label: props.entry.customerTitle, sub: \"Gearchiveerd\" }, ...options];\n});\nconst activityOptions = computed(() => {\n  const options = props.activities.map(a => ({ id: a.id, label: [a.code, a.description].filter(Boolean).join(\" · \") }));\n  return options.some(a => a.id === props.entry.activityId) ? options\n    : [{ id: props.entry.activityId, label: props.entry.activityCode, sub: \"Gearchiveerd\" }, ...options];\n});\nconst employeeOptions = computed(() => {\n  const options = props.employees.map(employee => ({ id: employee.id, label: `${employee.code} · ${employee.name}` }));\n  // Keep the original employee selectable even when it has since been archived.\n  return options.some(employee => employee.id === props.entry.employeeId) ? options\n    : [{ id: props.entry.employeeId, label: `${props.entry.employeeName} (gearchiveerd)` }, ...options];\n});\n\nconst rate = computed(() => form.employeeId === props.entry.employeeId ? props.entry.rate\n  : props.employees.find(e => e.id === form.employeeId)?.hourlyRate ?? new Money(\"0\"));\nconst parsedHours = computed(() => parseHoursInput(form.hours));\nconst amount = computed(() => Money.multiply(parsedHours.value ?? new Money(\"0\"), rate.value));\n\nwatch(() => form.date, date => {\n  // Keep the imported week until the date changes; the fiscal year remains an independent booking choice.\n  if (date) form.week = isoWeek(new Date(`${date}T12:00:00`));\n});\n\nfunction close(): void {\n  if (!saving.value) emit(\"close\");\n}\n\nfunction onHoursInput(event: Event): void {\n  const input = event.target as HTMLInputElement;\n  if (!isHoursDraft(input.value)) {\n    input.value = form.hours;\n    fieldErrors.hours = \"Gebruik alleen cijfers, één punt of komma en eventueel een minteken vooraan.\";\n    return;\n  }\n  form.hours = input.value;\n  delete fieldErrors.hours;\n}\n\nfunction onHoursBlur(): boolean {\n  if (!parsedHours.value) {\n    fieldErrors.hours = HOURS_INPUT_ERROR;\n    return false;\n  }\n  form.hours = String(parsedHours.value).replace(\".\", \",\");\n  delete fieldErrors.hours;\n  return true;\n}\n\nfunction onHoursCommit(event: KeyboardEvent): void {\n  if (!onHoursBlur()) event.preventDefault();\n}\n\nfunction validate(): boolean {\n  for (const key of Object.keys(fieldErrors)) delete fieldErrors[key];\n  if (!form.customerId) fieldErrors.customerId = \"Kies een klant.\";\n  if (!form.employeeId) fieldErrors.employeeId = \"Kies een werknemer.\";\n  if (!form.activityId) fieldErrors.activityId = \"Kies een werkzaamheid.\";\n  if (!form.date || Number.isNaN(new Date(form.date).getTime())) fieldErrors.date = \"Vul een geldige datum in.\";\n  if (!expandFiscalYear(form.fiscalYear)) fieldErrors.fiscalYear = \"Vul een geldig boekjaar in (1900 t/m 2100).\";\n  if (!parsedHours.value) fieldErrors.hours = HOURS_INPUT_ERROR;\n  return Object.keys(fieldErrors).length === 0;\n}\n\nasync function submit(): Promise<void> {\n  if (saving.value) return;\n  if (!dateInput.value?.validate()) {\n    dateInput.value?.focus();\n    return;\n  }\n  if (!validate()) {\n    await nextTick();\n    formElement.value?.querySelector<HTMLElement>('[aria-invalid=\"true\"]')?.focus();\n    return;\n  }\n  saving.value = true;\n  formError.value = \"\";\n  try {\n    // Flush the date watcher before storing its derived week.\n    await nextTick();\n    await api.updateTimeEntry({\n      id: props.entry.id,\n      customerId: form.customerId!,\n      employeeId: form.employeeId,\n      activityId: form.activityId!,\n      date: form.date,\n      fiscalYear: expandFiscalYear(form.fiscalYear),\n      week: form.week,\n      hours: String(parsedHours.value),\n      description: form.description.trim(),\n    });\n    emit(\"saved\");\n  } catch (error) {\n    formError.value = error instanceof Error ? error.message : \"De urenmutatie kon niet worden opgeslagen.\";\n  } finally {\n    saving.value = false;\n  }\n}\n</script>\n\n<template>\n  <AppDialog title=\"Urenmutatie bewerken\" wide @close=\"close\">\n    <form ref=\"formElement\" novalidate @submit.prevent=\"submit\">\n      <p v-if=\"formError\" class=\"hh-formerror\" role=\"alert\">{{ formError }}</p>\n      <fieldset class=\"tef__fields\" :disabled=\"saving\">\n        <FormField label=\"Klant\" for-id=\"te-customer\" required :error=\"fieldErrors.customerId\">\n          <Combobox id=\"te-customer\" placeholder=\"Nummer of naam…\" v-model=\"form.customerId\" :options=\"customerOptions\" :error=\"Boolean(fieldErrors.customerId)\" :aria-invalid=\"Boolean(fieldErrors.customerId)\" data-autofocus />\n        </FormField>\n        <FormField label=\"Werknemer\" for-id=\"te-employee\" required :error=\"fieldErrors.employeeId\">\n          <Combobox id=\"te-employee\" placeholder=\"Code of naam…\" :model-value=\"form.employeeId\" :options=\"employeeOptions\" :error=\"Boolean(fieldErrors.employeeId)\" :aria-invalid=\"Boolean(fieldErrors.employeeId)\" @update:model-value=\"form.employeeId = $event ?? 0\" />\n        </FormField>\n        <FormField label=\"Werkzaamheid\" for-id=\"te-activity\" required :error=\"fieldErrors.activityId\">\n          <Combobox id=\"te-activity\" placeholder=\"Code of omschrijving…\" v-model=\"form.activityId\" :options=\"activityOptions\" :error=\"Boolean(fieldErrors.activityId)\" :aria-invalid=\"Boolean(fieldErrors.activityId)\" />\n        </FormField>\n        <div class=\"tef__grid\">\n          <FormField label=\"Datum\" for-id=\"te-date\" required :error=\"fieldErrors.date\">\n            <DateInput id=\"te-date\" ref=\"dateInput\" v-model=\"form.date\" :disabled=\"saving\" :aria-invalid=\"Boolean(fieldErrors.date)\" />\n          </FormField>\n          <FormField label=\"Boekjaar\" for-id=\"te-year\" required :error=\"fieldErrors.fiscalYear\">\n            <input id=\"te-year\" v-model=\"form.fiscalYear\" class=\"hh-input\" inputmode=\"numeric\" maxlength=\"4\" :aria-invalid=\"Boolean(fieldErrors.fiscalYear)\" />\n          </FormField>\n          <FormField label=\"Uren\" for-id=\"te-hours\" required :error=\"fieldErrors.hours\">\n            <input id=\"te-hours\" :value=\"form.hours\" class=\"hh-input\" inputmode=\"decimal\" :aria-invalid=\"Boolean(fieldErrors.hours)\" @input=\"onHoursInput\" @blur=\"onHoursBlur\" @keydown.tab.exact=\"onHoursCommit\" @keydown.enter.exact=\"onHoursCommit\" />\n          </FormField>\n        </div>\n        <FormField label=\"Omschrijving\" for-id=\"te-description\">\n          <textarea id=\"te-description\" v-model=\"form.description\" class=\"hh-input\" rows=\"3\"></textarea>\n        </FormField>\n        <p class=\"tef__amount\">Uurtarief {{ formatEuro(rate) }} · Bedrag <strong>{{ formatEuro(amount) }}</strong></p>\n      </fieldset>\n      <button type=\"submit\" hidden></button>\n    </form>\n    <template #footer>\n      <button class=\"hh-btn\" type=\"button\" :disabled=\"saving\" @click=\"close\">Annuleren</button>\n      <button class=\"hh-btn hh-btn--primary\" type=\"button\" :disabled=\"saving\" @click=\"submit\">{{ saving ? \"Opslaan…\" : \"Opslaan\" }}</button>\n    </template>\n  </AppDialog>\n</template>\n\n<style scoped>\n.tef__fields {\n  min-width: 0;\n  margin: 0;\n  padding: 0;\n  border: 0;\n}\n.tef__grid {\n  display: grid;\n  gap: 10px;\n}\n.tef__amount {\n  margin: 0;\n  color: var(--hh-fg-muted);\n}\n@media (min-width: 600px) {\n  .tef__grid {\n    grid-template-columns: repeat(3, minmax(0, 1fr));\n  }\n}\n</style>\n","import { toDisplayString as _toDisplayString, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, createVNode as _createVNode, withCtx as _withCtx, vModelText as _vModelText, createElementVNode as _createElementVNode, withDirectives as _withDirectives, withModifiers as _withModifiers, withKeys as _withKeys, createTextVNode as _createTextVNode, createBlock as _createBlock } from \"vue\"\n\nconst _hoisted_1 = {\n  key: 0,\n  class: \"hh-formerror\",\n  role: \"alert\"\n}\nconst _hoisted_2 = [\"disabled\"]\nconst _hoisted_3 = { class: \"tef__grid\" }\nconst _hoisted_4 = [\"aria-invalid\"]\nconst _hoisted_5 = [\"value\", \"aria-invalid\", \"onKeydown\"]\nconst _hoisted_6 = { class: \"tef__amount\" }\nconst _hoisted_7 = [\"disabled\"]\nconst _hoisted_8 = [\"disabled\"]\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return (_openBlock(), _createBlock($setup[\"AppDialog\"], {\n    title: \"Urenmutatie bewerken\",\n    wide: \"\",\n    onClose: $setup.close\n  }, {\n    footer: _withCtx(() => [\n      _createElementVNode(\"button\", {\n        class: \"hh-btn\",\n        type: \"button\",\n        disabled: $setup.saving,\n        onClick: $setup.close\n      }, \"Annuleren\", 8 /* PROPS */, _hoisted_7),\n      _createElementVNode(\"button\", {\n        class: \"hh-btn hh-btn--primary\",\n        type: \"button\",\n        disabled: $setup.saving,\n        onClick: $setup.submit\n      }, _toDisplayString($setup.saving ? \"Opslaan…\" : \"Opslaan\"), 9 /* TEXT, PROPS */, _hoisted_8)\n    ]),\n    default: _withCtx(() => [\n      _createElementVNode(\"form\", {\n        ref: \"formElement\",\n        novalidate: \"\",\n        onSubmit: _withModifiers($setup.submit, [\"prevent\"])\n      }, [\n        ($setup.formError)\n          ? (_openBlock(), _createElementBlock(\"p\", _hoisted_1, _toDisplayString($setup.formError), 1 /* TEXT */))\n          : _createCommentVNode(\"v-if\", true),\n        _createElementVNode(\"fieldset\", {\n          class: \"tef__fields\",\n          disabled: $setup.saving\n        }, [\n          _createVNode($setup[\"FormField\"], {\n            label: \"Klant\",\n            \"for-id\": \"te-customer\",\n            required: \"\",\n            error: $setup.fieldErrors.customerId\n          }, {\n            default: _withCtx(() => [\n              _createVNode($setup[\"Combobox\"], {\n                id: \"te-customer\",\n                placeholder: \"Nummer of naam…\",\n                modelValue: $setup.form.customerId,\n                \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => (($setup.form.customerId) = $event)),\n                options: $setup.customerOptions,\n                error: Boolean($setup.fieldErrors.customerId),\n                \"aria-invalid\": Boolean($setup.fieldErrors.customerId),\n                \"data-autofocus\": \"\"\n              }, null, 8 /* PROPS */, [\"modelValue\", \"options\", \"error\", \"aria-invalid\"])\n            ]),\n            _: 1 /* STABLE */\n          }, 8 /* PROPS */, [\"error\"]),\n          _createVNode($setup[\"FormField\"], {\n            label: \"Werknemer\",\n            \"for-id\": \"te-employee\",\n            required: \"\",\n            error: $setup.fieldErrors.employeeId\n          }, {\n            default: _withCtx(() => [\n              _createVNode($setup[\"Combobox\"], {\n                id: \"te-employee\",\n                placeholder: \"Code of naam…\",\n                \"model-value\": $setup.form.employeeId,\n                options: $setup.employeeOptions,\n                error: Boolean($setup.fieldErrors.employeeId),\n                \"aria-invalid\": Boolean($setup.fieldErrors.employeeId),\n                \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => ($setup.form.employeeId = $event ?? 0))\n              }, null, 8 /* PROPS */, [\"model-value\", \"options\", \"error\", \"aria-invalid\"])\n            ]),\n            _: 1 /* STABLE */\n          }, 8 /* PROPS */, [\"error\"]),\n          _createVNode($setup[\"FormField\"], {\n            label: \"Werkzaamheid\",\n            \"for-id\": \"te-activity\",\n            required: \"\",\n            error: $setup.fieldErrors.activityId\n          }, {\n            default: _withCtx(() => [\n              _createVNode($setup[\"Combobox\"], {\n                id: \"te-activity\",\n                placeholder: \"Code of omschrijving…\",\n                modelValue: $setup.form.activityId,\n                \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => (($setup.form.activityId) = $event)),\n                options: $setup.activityOptions,\n                error: Boolean($setup.fieldErrors.activityId),\n                \"aria-invalid\": Boolean($setup.fieldErrors.activityId)\n              }, null, 8 /* PROPS */, [\"modelValue\", \"options\", \"error\", \"aria-invalid\"])\n            ]),\n            _: 1 /* STABLE */\n          }, 8 /* PROPS */, [\"error\"]),\n          _createElementVNode(\"div\", _hoisted_3, [\n            _createVNode($setup[\"FormField\"], {\n              label: \"Datum\",\n              \"for-id\": \"te-date\",\n              required: \"\",\n              error: $setup.fieldErrors.date\n            }, {\n              default: _withCtx(() => [\n                _createVNode($setup[\"DateInput\"], {\n                  id: \"te-date\",\n                  ref: \"dateInput\",\n                  modelValue: $setup.form.date,\n                  \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => (($setup.form.date) = $event)),\n                  disabled: $setup.saving,\n                  \"aria-invalid\": Boolean($setup.fieldErrors.date)\n                }, null, 8 /* PROPS */, [\"modelValue\", \"disabled\", \"aria-invalid\"])\n              ]),\n              _: 1 /* STABLE */\n            }, 8 /* PROPS */, [\"error\"]),\n            _createVNode($setup[\"FormField\"], {\n              label: \"Boekjaar\",\n              \"for-id\": \"te-year\",\n              required: \"\",\n              error: $setup.fieldErrors.fiscalYear\n            }, {\n              default: _withCtx(() => [\n                _withDirectives(_createElementVNode(\"input\", {\n                  id: \"te-year\",\n                  \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => (($setup.form.fiscalYear) = $event)),\n                  class: \"hh-input\",\n                  inputmode: \"numeric\",\n                  maxlength: \"4\",\n                  \"aria-invalid\": Boolean($setup.fieldErrors.fiscalYear)\n                }, null, 8 /* PROPS */, _hoisted_4), [\n                  [_vModelText, $setup.form.fiscalYear]\n                ])\n              ]),\n              _: 1 /* STABLE */\n            }, 8 /* PROPS */, [\"error\"]),\n            _createVNode($setup[\"FormField\"], {\n              label: \"Uren\",\n              \"for-id\": \"te-hours\",\n              required: \"\",\n              error: $setup.fieldErrors.hours\n            }, {\n              default: _withCtx(() => [\n                _createElementVNode(\"input\", {\n                  id: \"te-hours\",\n                  value: $setup.form.hours,\n                  class: \"hh-input\",\n                  inputmode: \"decimal\",\n                  \"aria-invalid\": Boolean($setup.fieldErrors.hours),\n                  onInput: $setup.onHoursInput,\n                  onBlur: $setup.onHoursBlur,\n                  onKeydown: [\n                    _withKeys(_withModifiers($setup.onHoursCommit, [\"exact\"]), [\"tab\"]),\n                    _withKeys(_withModifiers($setup.onHoursCommit, [\"exact\"]), [\"enter\"])\n                  ]\n                }, null, 40 /* PROPS, NEED_HYDRATION */, _hoisted_5)\n              ]),\n              _: 1 /* STABLE */\n            }, 8 /* PROPS */, [\"error\"])\n          ]),\n          _createVNode($setup[\"FormField\"], {\n            label: \"Omschrijving\",\n            \"for-id\": \"te-description\"\n          }, {\n            default: _withCtx(() => [\n              _withDirectives(_createElementVNode(\"textarea\", {\n                id: \"te-description\",\n                \"onUpdate:modelValue\": _cache[5] || (_cache[5] = $event => (($setup.form.description) = $event)),\n                class: \"hh-input\",\n                rows: \"3\"\n              }, null, 512 /* NEED_PATCH */), [\n                [_vModelText, $setup.form.description]\n              ])\n            ]),\n            _: 1 /* STABLE */\n          }),\n          _createElementVNode(\"p\", _hoisted_6, [\n            _createTextVNode(\"Uurtarief \" + _toDisplayString($setup.formatEuro($setup.rate)) + \" · Bedrag \", 1 /* TEXT */),\n            _createElementVNode(\"strong\", null, _toDisplayString($setup.formatEuro($setup.amount)), 1 /* TEXT */)\n          ])\n        ], 8 /* PROPS */, _hoisted_2),\n        _cache[6] || (_cache[6] = _createElementVNode(\"button\", {\n          type: \"submit\",\n          hidden: \"\"\n        }, null, -1 /* CACHED */))\n      ], 544 /* NEED_HYDRATION, NEED_PATCH */)\n    ]),\n    _: 1 /* STABLE */\n  }))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/TimeEntryFormDialog.vue?type=script\";import \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/TimeEntryFormDialog.vue?type=style&index=0\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/TimeEntryFormDialog.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/TimeEntryFormDialog.vue\";script.__scopeId = \"data-v-003149c2\";export default script;","<template>\n  <section ref=\"overview\" :style=\"{ '--ov-sticky-top': `${appBarHeight}px` }\">\n    <div class=\"hh-page__bar\">\n      <h1 class=\"hh-page__title\">Urenoverzicht</h1>\n    </div>\n\n    <div class=\"hh-card ov__filters\">\n      <label class=\"ov__f\">Klant\n        <Combobox :model-value=\"filterCustomer\" :options=\"customerOptions\" aria-label=\"Klant\" placeholder=\"Nummer of naam…\" @update:model-value=\"filterCustomer = $event ?? 0\" />\n      </label>\n      <label class=\"ov__f\">Werknemer\n        <Combobox :model-value=\"filterEmployee\" :options=\"employeeOptions\" aria-label=\"Werknemer\" placeholder=\"Code of naam…\" @update:model-value=\"filterEmployee = $event ?? 0\" />\n      </label>\n      <label class=\"ov__f\">Werkzaamheid\n        <Combobox :model-value=\"filterActivity\" :options=\"activityOptions\" aria-label=\"Werkzaamheid\" placeholder=\"Code of omschrijving…\" @update:model-value=\"filterActivity = $event ?? 0\" />\n      </label>\n      <label class=\"ov__f\">Jaar\n        <select v-model=\"filterYear\" class=\"hh-select\">\n          <option value=\"all\">Alle jaren</option>\n          <option v-if=\"filterYear !== 'all' && !years.includes(Number(filterYear))\" :value=\"filterYear\">{{ filterYear }}</option>\n          <option v-for=\"year in years\" :key=\"year\" :value=\"String(year)\">{{ year }}</option>\n        </select>\n      </label>\n      <label class=\"ov__f\">Groeperen op\n        <select v-model=\"groupBy\" class=\"hh-select\">\n          <option value=\"none\">Niets</option>\n          <option value=\"customer\">Klant</option>\n          <option value=\"employee\">Werknemer</option>\n        </select>\n      </label>\n    </div>\n\n    <p v-if=\"error\" class=\"hh-formerror\">{{ error }}</p>\n\n    <div class=\"hh-card ov__results\">\n      <div v-if=\"loading\" class=\"hh-empty\">Laden…</div>\n      <p v-else-if=\"visibleEntries.length === 0\" class=\"hh-empty\">Geen urenregels voor deze selectie.</p>\n      <table v-else class=\"hh-table\">\n        <thead>\n          <tr class=\"ov__columnhead\" :class=\"{ 'ov__columnhead--sticky': groupBy === 'none' }\">\n            <th style=\"width: 100px\">Datum</th>\n            <th v-if=\"showCustomerColumn\">Klant</th>\n            <th v-if=\"showEmployeeColumn\">Werknemer</th>\n            <th style=\"width: 70px\">Werkz.</th>\n            <th>Omschrijving</th>\n            <th class=\"hh-table__num\" style=\"width: 80px\">Uren</th>\n            <th class=\"hh-table__num\" style=\"width: 100px\">Bedrag</th>\n          </tr>\n        </thead>\n        <template v-for=\"group in renderedGroups\" :key=\"group.key\">\n          <tbody>\n            <tr v-if=\"groupBy !== 'none'\" class=\"ov__grouphead\">\n              <td :colspan=\"descriptionColumnCount\">{{ group.label }}</td>\n              <td class=\"hh-table__num\">{{ formatHours(group.hours) }}</td>\n              <td class=\"hh-table__num\">{{ formatEuro(group.amount) }}</td>\n            </tr>\n            <tr\n              v-for=\"entry in group.entries\"\n              :key=\"entry.id\"\n              class=\"is-clickable\"\n              role=\"button\"\n              tabindex=\"0\"\n              :aria-label=\"`Urenmutatie bewerken: ${formatDate(entry.date)}, ${entry.customerTitle}, ${entry.employeeName}`\"\n              @click=\"editTarget = entry\"\n              @keydown.enter.prevent=\"editTarget = entry\"\n              @keydown.space.prevent=\"editTarget = entry\"\n            >\n              <td>{{ formatDate(entry.date) }}</td>\n              <td v-if=\"showCustomerColumn\">{{ entry.customerTitle }}</td>\n              <td v-if=\"showEmployeeColumn\">{{ entry.employeeName }}</td>\n              <td class=\"hh-table__code\">{{ entry.activityCode }}</td>\n              <td class=\"hh-muted\">{{ entryDescription(entry) }}</td>\n              <td class=\"hh-table__num\">{{ formatHours(entry.hours) }}</td>\n              <td class=\"hh-table__num\">{{ formatEuro(entry.amount) }}</td>\n            </tr>\n          </tbody>\n        </template>\n        <tfoot>\n          <tr class=\"ov__total\">\n            <td :colspan=\"descriptionColumnCount\">Totaal ({{ visibleEntries.length }} regels)</td>\n            <td class=\"hh-table__num\">{{ formatHours(totalHours) }}</td>\n            <td class=\"hh-table__num\">{{ formatEuro(totalAmount) }}</td>\n          </tr>\n        </tfoot>\n      </table>\n      <div v-if=\"!loading && hasMore\" ref=\"loadMoreTrigger\" class=\"ov__more\">\n        <span class=\"hh-muted\" aria-live=\"polite\">{{ shownEntryCount.toLocaleString(\"nl-NL\") }} van {{ visibleEntries.length.toLocaleString(\"nl-NL\") }} urenregels</span>\n        <button type=\"button\" class=\"hh-btn\" @click=\"loadMore({ focus: true })\">Meer urenregels tonen</button>\n      </div>\n    </div>\n    <TimeEntryFormDialog\n      v-if=\"editTarget\"\n      :entry=\"editTarget\"\n      :customers=\"customers\"\n      :employees=\"employees\"\n      :activities=\"activities\"\n      @close=\"editTarget = null\"\n      @saved=\"onEntrySaved\"\n    />\n  </section>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, nextTick, onMounted, onUnmounted, ref, useTemplateRef, watch } from \"vue\";\nimport { useRoute, useRouter } from \"vue-router\";\nimport { Money } from \"@webhare/std\";\nimport Combobox, { type ComboOption } from \"../components/Combobox.vue\";\nimport { useApi } from \"../lib/api\";\nimport { employeeReportName, entryDescription, formatDate, formatEuro, formatHours } from \"../lib/format\";\nimport { hoursOverviewStateToQuery, parseHoursOverviewState } from \"../lib/hoursOverviewState\";\nimport { queryRecord, sameQuery } from \"../lib/routeQuery\";\nimport TimeEntryFormDialog from \"../components/TimeEntryFormDialog.vue\";\n\nconst api = useApi();\n\ntype Entry = Awaited<ReturnType<typeof api.listTimeEntries>>[number];\ntype Customer = Awaited<ReturnType<typeof api.listCustomers>>[number];\ntype Employee = Awaited<ReturnType<typeof api.listEmployees>>[number];\ntype Activity = Awaited<ReturnType<typeof api.listActivities>>[number];\n\nconst customers = ref<Customer[]>([]);\nconst customerOptions = computed<ComboOption[]>(() => [\n  { id: 0, label: \"Alle klanten\" },\n  ...customers.value.map((customer) => ({ id: customer.id, label: customer.company || customer.contactName || `Klant ${customer.number}`, sub: customer.number })),\n]);\nconst employees = ref<Employee[]>([]);\nconst activities = ref<Activity[]>([]);\nconst employeeOptions = computed<ComboOption[]>(() => [\n  { id: 0, label: \"Alle werknemers\" },\n  ...employees.value.map(employee => ({ id: employee.id, label: `${employee.code} · ${employeeReportName(employee) || employee.name}` })),\n]);\nconst activityOptions = computed<ComboOption[]>(() => [\n  { id: 0, label: \"Alle werkzaamheden\" },\n  ...activities.value.map(activity => ({ id: activity.id, label: `${activity.code} · ${activity.description}` })),\n]);\nconst entries = ref<Entry[]>([]);\nconst BATCH_SIZE = 100;\nconst renderLimit = ref(BATCH_SIZE);\nconst loading = ref(true);\nconst error = ref(\"\");\nconst editTarget = ref<Entry | null>(null);\n\nconst route = useRoute();\nconst router = useRouter();\n// Restore before the first fetch so the server receives the bookmarked filters.\nconst restored = parseHoursOverviewState(queryRecord(route.query));\nconst filterCustomer = ref(restored.customerId);\nconst filterEmployee = ref(restored.employeeId);\nconst filterActivity = ref(restored.activityId);\nconst filterYear = ref(restored.year);\nconst groupBy = ref(restored.groupBy);\nconst showCustomerColumn = computed(() => groupBy.value !== \"customer\");\nconst showEmployeeColumn = computed(() => groupBy.value !== \"employee\");\nconst descriptionColumnCount = computed(() => 3 + Number(showCustomerColumn.value) + Number(showEmployeeColumn.value));\n\nconst overview = useTemplateRef<HTMLElement>(\"overview\");\nconst loadMoreTrigger = useTemplateRef<HTMLElement>(\"loadMoreTrigger\");\nconst appBarHeight = ref(0);\nlet appBarObserver: ResizeObserver | undefined;\nlet loadObserver: IntersectionObserver | undefined;\n\nonMounted(() => {\n  if (typeof IntersectionObserver !== \"undefined\") {\n    loadObserver = new IntersectionObserver(changes => {\n      // A filter change can remove a trigger whose intersection notification is still queued.\n      if (changes.some(change => change.isIntersecting && change.target === loadMoreTrigger.value)) loadMore();\n    }, { rootMargin: \"600px 0px\" });\n  }\n  const appBar = overview.value?.closest(\".app\")?.querySelector<HTMLElement>(\".app__bar\");\n  if (!appBar) return;\n  // Follow the actual menu height, including font zoom and wrapped menu items.\n  const updateAppBarHeight = () => { appBarHeight.value = Math.ceil(appBar.getBoundingClientRect().height); };\n  updateAppBarHeight();\n  appBarObserver = new ResizeObserver(updateAppBarHeight);\n  appBarObserver.observe(appBar);\n});\n\nonUnmounted(() => { appBarObserver?.disconnect(); loadObserver?.disconnect(); });\n\nwatch([filterCustomer, filterEmployee, filterActivity, filterYear, groupBy], () => {\n  renderLimit.value = BATCH_SIZE;\n  const next = hoursOverviewStateToQuery({\n    customerId: filterCustomer.value,\n    employeeId: filterEmployee.value,\n    activityId: filterActivity.value,\n    year: filterYear.value,\n    groupBy: groupBy.value,\n  });\n  if (!sameQuery(next, queryRecord(route.query))) void router.replace({ query: next });\n});\n\nconst years = computed<number[]>(() => [...new Set(entries.value.map((e) => e.fiscalYear))].sort((a, b) => b - a));\n\nconst visibleEntries = computed<Entry[]>(() =>\n  filterYear.value === \"all\" ? entries.value : entries.value.filter((e) => e.fiscalYear === Number(filterYear.value)));\n\nconst ZERO = new Money(\"0\");\n\nconst totalHours = computed(() => visibleEntries.value.reduce((sum, e) => Money.add(sum, e.hours), ZERO));\nconst totalAmount = computed(() => visibleEntries.value.reduce((sum, e) => Money.add(sum, e.amount), ZERO));\n\ninterface Group { key: string; label: string; entries: Entry[]; hours: Money; amount: Money }\n\nconst groups = computed<Group[]>(() => {\n  if (groupBy.value === \"none\") {\n    return [{ key: \"\", label: \"\", entries: visibleEntries.value, hours: totalHours.value, amount: totalAmount.value }];\n  }\n  // Short report labels can coincide; employee IDs keep their totals separate.\n  const keyed = Object.groupBy(visibleEntries.value, (entry) =>\n    groupBy.value === \"customer\" ? entry.customerTitle : String(entry.employeeId));\n  return Object.entries(keyed)\n    .map(([key, groupEntries]) => {\n      const list = groupEntries ?? [];\n      return {\n        key,\n        label: (groupBy.value === \"employee\" ? list[0]?.employeeName : key) || \"(onbekend)\",\n        entries: list,\n        hours: list.reduce((sum, e) => Money.add(sum, e.hours), ZERO),\n        amount: list.reduce((sum, e) => Money.add(sum, e.amount), ZERO),\n      };\n    })\n    .sort((a, b) => a.label.localeCompare(b.label, \"nl\"));\n});\n\n// shortcut: Keep full data for totals and retain shown rows; add windowing if browsing the entire archive becomes slow.\nconst renderedGroups = computed<Group[]>(() => {\n  let remaining = renderLimit.value;\n  const shown: Group[] = [];\n  for (const group of groups.value) {\n    if (remaining <= 0) break;\n    const entries = group.entries.slice(0, remaining);\n    if (entries.length) shown.push({ ...group, entries });\n    remaining -= entries.length;\n  }\n  return shown;\n});\nconst shownEntryCount = computed(() => Math.min(renderLimit.value, visibleEntries.value.length));\nconst hasMore = computed(() => shownEntryCount.value < visibleEntries.value.length);\n\nfunction loadMore({ focus = false }: { focus?: boolean } = {}): void {\n  if (loading.value || !hasMore.value) return;\n  const firstNewIndex = shownEntryCount.value;\n  renderLimit.value = Math.min(renderLimit.value + BATCH_SIZE, visibleEntries.value.length);\n  // Return keyboard users to the new rows instead of following the button further down the page.\n  if (focus) void nextTick(() => overview.value?.querySelectorAll<HTMLElement>(\"tr.is-clickable\")[firstNewIndex]?.focus({ preventScroll: true }));\n}\n\nwatch([loadMoreTrigger, renderLimit, loading, hasMore], () => {\n  loadObserver?.disconnect();\n  // Reobserve each batch so a tall viewport keeps filling until the trigger moves below it.\n  if (loadMoreTrigger.value && !loading.value && hasMore.value) loadObserver?.observe(loadMoreTrigger.value);\n}, { flush: \"post\" });\n\nasync function loadFilters(): Promise<void> {\n  const [custs, emps, acts] = await Promise.all([api.listCustomers(), api.listEmployees(), api.listActivities()]);\n  customers.value = custs;\n  employees.value = emps;\n  activities.value = acts;\n}\n\nasync function loadEntries(options: { background?: boolean } = {}): Promise<void> {\n  // A save refresh keeps the rows mounted so scroll position and dialog return focus survive.\n  if (!options.background) loading.value = true;\n  error.value = \"\";\n  try {\n    entries.value = await api.listTimeEntries({\n      customerId: filterCustomer.value || undefined,\n      employeeId: filterEmployee.value || undefined,\n      activityId: filterActivity.value || undefined,\n    });\n  } catch {\n    error.value = \"Kon de urenregels niet laden.\";\n  } finally {\n    loading.value = false;\n  }\n}\n\nasync function onEntrySaved(): Promise<void> {\n  editTarget.value = null;\n  await loadEntries({ background: true });\n}\n\nwatch([filterCustomer, filterEmployee, filterActivity], () => { void loadEntries(); });\n\nonMounted(async () => {\n  await loadFilters();\n  await loadEntries();\n});\n</script>\n\n<style scoped>\n.combo { min-width: 240px; }\n.ov__filters {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 14px;\n  padding: 14px 18px;\n  margin-bottom: 14px;\n}\n.ov__f {\n  display: flex;\n  flex-direction: column;\n  gap: 4px;\n  font-size: 12.5px;\n  font-weight: 600;\n  color: var(--hh-fg-muted);\n}\n.ov__f .hh-select {\n  min-width: 160px;\n}\n.ov__results {\n  /* Preserve rounded clipping without trapping sticky rows in a scroll container. */\n  overflow: clip;\n}\n.ov__more {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  justify-content: space-between;\n  gap: 12px;\n  padding: 14px 18px;\n  border-top: 1px solid var(--hh-line);\n  overflow-anchor: none;\n}\n.ov__columnhead--sticky,\n.ov__grouphead {\n  position: sticky;\n  top: var(--ov-sticky-top);\n  z-index: 1;\n}\n.ov__grouphead td {\n  background: var(--hh-surface-2);\n  font-weight: 700;\n  font-size: 12.5px;\n}\n.ov__total td {\n  padding: 12px;\n  font-weight: 700;\n  border-top: 2px solid var(--hh-line-strong);\n}\n</style>\n","import { createElementVNode as _createElementVNode, createVNode as _createVNode, createTextVNode as _createTextVNode, toDisplayString as _toDisplayString, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, renderList as _renderList, Fragment as _Fragment, vModelSelect as _vModelSelect, withDirectives as _withDirectives, normalizeClass as _normalizeClass, withModifiers as _withModifiers, withKeys as _withKeys, createBlock as _createBlock, normalizeStyle as _normalizeStyle } from \"vue\"\n\nconst _hoisted_1 = { class: \"hh-card ov__filters\" }\nconst _hoisted_2 = { class: \"ov__f\" }\nconst _hoisted_3 = { class: \"ov__f\" }\nconst _hoisted_4 = { class: \"ov__f\" }\nconst _hoisted_5 = { class: \"ov__f\" }\nconst _hoisted_6 = [\"value\"]\nconst _hoisted_7 = [\"value\"]\nconst _hoisted_8 = { class: \"ov__f\" }\nconst _hoisted_9 = {\n  key: 0,\n  class: \"hh-formerror\"\n}\nconst _hoisted_10 = { class: \"hh-card ov__results\" }\nconst _hoisted_11 = {\n  key: 0,\n  class: \"hh-empty\"\n}\nconst _hoisted_12 = {\n  key: 1,\n  class: \"hh-empty\"\n}\nconst _hoisted_13 = {\n  key: 2,\n  class: \"hh-table\"\n}\nconst _hoisted_14 = { key: 0 }\nconst _hoisted_15 = { key: 1 }\nconst _hoisted_16 = {\n  key: 0,\n  class: \"ov__grouphead\"\n}\nconst _hoisted_17 = [\"colspan\"]\nconst _hoisted_18 = { class: \"hh-table__num\" }\nconst _hoisted_19 = { class: \"hh-table__num\" }\nconst _hoisted_20 = [\"aria-label\", \"onClick\", \"onKeydown\"]\nconst _hoisted_21 = { key: 0 }\nconst _hoisted_22 = { key: 1 }\nconst _hoisted_23 = { class: \"hh-table__code\" }\nconst _hoisted_24 = { class: \"hh-muted\" }\nconst _hoisted_25 = { class: \"hh-table__num\" }\nconst _hoisted_26 = { class: \"hh-table__num\" }\nconst _hoisted_27 = { class: \"ov__total\" }\nconst _hoisted_28 = [\"colspan\"]\nconst _hoisted_29 = { class: \"hh-table__num\" }\nconst _hoisted_30 = { class: \"hh-table__num\" }\nconst _hoisted_31 = {\n  key: 3,\n  ref: \"loadMoreTrigger\",\n  class: \"ov__more\"\n}\nconst _hoisted_32 = {\n  class: \"hh-muted\",\n  \"aria-live\": \"polite\"\n}\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return (_openBlock(), _createElementBlock(\"section\", {\n    ref: \"overview\",\n    style: _normalizeStyle({ '--ov-sticky-top': `${$setup.appBarHeight}px` })\n  }, [\n    _cache[19] || (_cache[19] = _createElementVNode(\"div\", { class: \"hh-page__bar\" }, [\n      _createElementVNode(\"h1\", { class: \"hh-page__title\" }, \"Urenoverzicht\")\n    ], -1 /* CACHED */)),\n    _createElementVNode(\"div\", _hoisted_1, [\n      _createElementVNode(\"label\", _hoisted_2, [\n        _cache[7] || (_cache[7] = _createTextVNode(\"Klant \", -1 /* CACHED */)),\n        _createVNode($setup[\"Combobox\"], {\n          \"model-value\": $setup.filterCustomer,\n          options: $setup.customerOptions,\n          \"aria-label\": \"Klant\",\n          placeholder: \"Nummer of naam…\",\n          \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => ($setup.filterCustomer = $event ?? 0))\n        }, null, 8 /* PROPS */, [\"model-value\", \"options\"])\n      ]),\n      _createElementVNode(\"label\", _hoisted_3, [\n        _cache[8] || (_cache[8] = _createTextVNode(\"Werknemer \", -1 /* CACHED */)),\n        _createVNode($setup[\"Combobox\"], {\n          \"model-value\": $setup.filterEmployee,\n          options: $setup.employeeOptions,\n          \"aria-label\": \"Werknemer\",\n          placeholder: \"Code of naam…\",\n          \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => ($setup.filterEmployee = $event ?? 0))\n        }, null, 8 /* PROPS */, [\"model-value\", \"options\"])\n      ]),\n      _createElementVNode(\"label\", _hoisted_4, [\n        _cache[9] || (_cache[9] = _createTextVNode(\"Werkzaamheid \", -1 /* CACHED */)),\n        _createVNode($setup[\"Combobox\"], {\n          \"model-value\": $setup.filterActivity,\n          options: $setup.activityOptions,\n          \"aria-label\": \"Werkzaamheid\",\n          placeholder: \"Code of omschrijving…\",\n          \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => ($setup.filterActivity = $event ?? 0))\n        }, null, 8 /* PROPS */, [\"model-value\", \"options\"])\n      ]),\n      _createElementVNode(\"label\", _hoisted_5, [\n        _cache[11] || (_cache[11] = _createTextVNode(\"Jaar \", -1 /* CACHED */)),\n        _withDirectives(_createElementVNode(\"select\", {\n          \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => (($setup.filterYear) = $event)),\n          class: \"hh-select\"\n        }, [\n          _cache[10] || (_cache[10] = _createElementVNode(\"option\", { value: \"all\" }, \"Alle jaren\", -1 /* CACHED */)),\n          ($setup.filterYear !== 'all' && !$setup.years.includes(Number($setup.filterYear)))\n            ? (_openBlock(), _createElementBlock(\"option\", {\n                key: 0,\n                value: $setup.filterYear\n              }, _toDisplayString($setup.filterYear), 9 /* TEXT, PROPS */, _hoisted_6))\n            : _createCommentVNode(\"v-if\", true),\n          (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.years, (year) => {\n            return (_openBlock(), _createElementBlock(\"option\", {\n              key: year,\n              value: String(year)\n            }, _toDisplayString(year), 9 /* TEXT, PROPS */, _hoisted_7))\n          }), 128 /* KEYED_FRAGMENT */))\n        ], 512 /* NEED_PATCH */), [\n          [_vModelSelect, $setup.filterYear]\n        ])\n      ]),\n      _createElementVNode(\"label\", _hoisted_8, [\n        _cache[13] || (_cache[13] = _createTextVNode(\"Groeperen op \", -1 /* CACHED */)),\n        _withDirectives(_createElementVNode(\"select\", {\n          \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => (($setup.groupBy) = $event)),\n          class: \"hh-select\"\n        }, _cache[12] || (_cache[12] = [\n          _createElementVNode(\"option\", { value: \"none\" }, \"Niets\", -1 /* CACHED */),\n          _createElementVNode(\"option\", { value: \"customer\" }, \"Klant\", -1 /* CACHED */),\n          _createElementVNode(\"option\", { value: \"employee\" }, \"Werknemer\", -1 /* CACHED */)\n        ]), 512 /* NEED_PATCH */), [\n          [_vModelSelect, $setup.groupBy]\n        ])\n      ])\n    ]),\n    ($setup.error)\n      ? (_openBlock(), _createElementBlock(\"p\", _hoisted_9, _toDisplayString($setup.error), 1 /* TEXT */))\n      : _createCommentVNode(\"v-if\", true),\n    _createElementVNode(\"div\", _hoisted_10, [\n      ($setup.loading)\n        ? (_openBlock(), _createElementBlock(\"div\", _hoisted_11, \"Laden…\"))\n        : ($setup.visibleEntries.length === 0)\n          ? (_openBlock(), _createElementBlock(\"p\", _hoisted_12, \"Geen urenregels voor deze selectie.\"))\n          : (_openBlock(), _createElementBlock(\"table\", _hoisted_13, [\n              _createElementVNode(\"thead\", null, [\n                _createElementVNode(\"tr\", {\n                  class: _normalizeClass([\"ov__columnhead\", { 'ov__columnhead--sticky': $setup.groupBy === 'none' }])\n                }, [\n                  _cache[14] || (_cache[14] = _createElementVNode(\"th\", { style: {\"width\":\"100px\"} }, \"Datum\", -1 /* CACHED */)),\n                  ($setup.showCustomerColumn)\n                    ? (_openBlock(), _createElementBlock(\"th\", _hoisted_14, \"Klant\"))\n                    : _createCommentVNode(\"v-if\", true),\n                  ($setup.showEmployeeColumn)\n                    ? (_openBlock(), _createElementBlock(\"th\", _hoisted_15, \"Werknemer\"))\n                    : _createCommentVNode(\"v-if\", true),\n                  _cache[15] || (_cache[15] = _createElementVNode(\"th\", { style: {\"width\":\"70px\"} }, \"Werkz.\", -1 /* CACHED */)),\n                  _cache[16] || (_cache[16] = _createElementVNode(\"th\", null, \"Omschrijving\", -1 /* CACHED */)),\n                  _cache[17] || (_cache[17] = _createElementVNode(\"th\", {\n                    class: \"hh-table__num\",\n                    style: {\"width\":\"80px\"}\n                  }, \"Uren\", -1 /* CACHED */)),\n                  _cache[18] || (_cache[18] = _createElementVNode(\"th\", {\n                    class: \"hh-table__num\",\n                    style: {\"width\":\"100px\"}\n                  }, \"Bedrag\", -1 /* CACHED */))\n                ], 2 /* CLASS */)\n              ]),\n              (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.renderedGroups, (group) => {\n                return (_openBlock(), _createElementBlock(\"tbody\", {\n                  key: group.key\n                }, [\n                  ($setup.groupBy !== 'none')\n                    ? (_openBlock(), _createElementBlock(\"tr\", _hoisted_16, [\n                        _createElementVNode(\"td\", { colspan: $setup.descriptionColumnCount }, _toDisplayString(group.label), 9 /* TEXT, PROPS */, _hoisted_17),\n                        _createElementVNode(\"td\", _hoisted_18, _toDisplayString($setup.formatHours(group.hours)), 1 /* TEXT */),\n                        _createElementVNode(\"td\", _hoisted_19, _toDisplayString($setup.formatEuro(group.amount)), 1 /* TEXT */)\n                      ]))\n                    : _createCommentVNode(\"v-if\", true),\n                  (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(group.entries, (entry) => {\n                    return (_openBlock(), _createElementBlock(\"tr\", {\n                      key: entry.id,\n                      class: \"is-clickable\",\n                      role: \"button\",\n                      tabindex: \"0\",\n                      \"aria-label\": `Urenmutatie bewerken: ${$setup.formatDate(entry.date)}, ${entry.customerTitle}, ${entry.employeeName}`,\n                      onClick: $event => ($setup.editTarget = entry),\n                      onKeydown: [\n                        _withKeys(_withModifiers($event => ($setup.editTarget = entry), [\"prevent\"]), [\"enter\"]),\n                        _withKeys(_withModifiers($event => ($setup.editTarget = entry), [\"prevent\"]), [\"space\"])\n                      ]\n                    }, [\n                      _createElementVNode(\"td\", null, _toDisplayString($setup.formatDate(entry.date)), 1 /* TEXT */),\n                      ($setup.showCustomerColumn)\n                        ? (_openBlock(), _createElementBlock(\"td\", _hoisted_21, _toDisplayString(entry.customerTitle), 1 /* TEXT */))\n                        : _createCommentVNode(\"v-if\", true),\n                      ($setup.showEmployeeColumn)\n                        ? (_openBlock(), _createElementBlock(\"td\", _hoisted_22, _toDisplayString(entry.employeeName), 1 /* TEXT */))\n                        : _createCommentVNode(\"v-if\", true),\n                      _createElementVNode(\"td\", _hoisted_23, _toDisplayString(entry.activityCode), 1 /* TEXT */),\n                      _createElementVNode(\"td\", _hoisted_24, _toDisplayString($setup.entryDescription(entry)), 1 /* TEXT */),\n                      _createElementVNode(\"td\", _hoisted_25, _toDisplayString($setup.formatHours(entry.hours)), 1 /* TEXT */),\n                      _createElementVNode(\"td\", _hoisted_26, _toDisplayString($setup.formatEuro(entry.amount)), 1 /* TEXT */)\n                    ], 40 /* PROPS, NEED_HYDRATION */, _hoisted_20))\n                  }), 128 /* KEYED_FRAGMENT */))\n                ]))\n              }), 128 /* KEYED_FRAGMENT */)),\n              _createElementVNode(\"tfoot\", null, [\n                _createElementVNode(\"tr\", _hoisted_27, [\n                  _createElementVNode(\"td\", { colspan: $setup.descriptionColumnCount }, \"Totaal (\" + _toDisplayString($setup.visibleEntries.length) + \" regels)\", 9 /* TEXT, PROPS */, _hoisted_28),\n                  _createElementVNode(\"td\", _hoisted_29, _toDisplayString($setup.formatHours($setup.totalHours)), 1 /* TEXT */),\n                  _createElementVNode(\"td\", _hoisted_30, _toDisplayString($setup.formatEuro($setup.totalAmount)), 1 /* TEXT */)\n                ])\n              ])\n            ])),\n      (!$setup.loading && $setup.hasMore)\n        ? (_openBlock(), _createElementBlock(\"div\", _hoisted_31, [\n            _createElementVNode(\"span\", _hoisted_32, _toDisplayString($setup.shownEntryCount.toLocaleString(\"nl-NL\")) + \" van \" + _toDisplayString($setup.visibleEntries.length.toLocaleString(\"nl-NL\")) + \" urenregels\", 1 /* TEXT */),\n            _createElementVNode(\"button\", {\n              type: \"button\",\n              class: \"hh-btn\",\n              onClick: _cache[5] || (_cache[5] = $event => ($setup.loadMore({ focus: true })))\n            }, \"Meer urenregels tonen\")\n          ], 512 /* NEED_PATCH */))\n        : _createCommentVNode(\"v-if\", true)\n    ]),\n    ($setup.editTarget)\n      ? (_openBlock(), _createBlock($setup[\"TimeEntryFormDialog\"], {\n          key: 1,\n          entry: $setup.editTarget,\n          customers: $setup.customers,\n          employees: $setup.employees,\n          activities: $setup.activities,\n          onClose: _cache[6] || (_cache[6] = $event => ($setup.editTarget = null)),\n          onSaved: $setup.onEntrySaved\n        }, null, 8 /* PROPS */, [\"entry\", \"customers\", \"employees\", \"activities\"]))\n      : _createCommentVNode(\"v-if\", true)\n  ], 4 /* STYLE */))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/HoursOverviewView.vue?type=script\";import \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/HoursOverviewView.vue?type=style&index=0\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/HoursOverviewView.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/HoursOverviewView.vue\";script.__scopeId = \"data-v-3b2ba048\";export default script;","// Weekoverzicht: aggregatie van urenregels per (ISO-)week inclusief detailregels,\n// plus de filters <-> URL-query. Pure functies (alleen Money uit @webhare/std,\n// puur en bundelbaar) zodat ze via `wh runtest` unit-testbaar zijn. Uren en\n// bedragen zijn Money (exact decimaal), sommen via Money.add.\n\nimport { Money } from \"@webhare/std\";\n\nconst ZERO = new Money(\"0\");\n\n/** Urenregel-invoer voor de weekaggregatie (subset van de RPC-TimeEntry). */\nexport interface WeekAggregateInput {\n  id: number;\n  week: number;\n  date: string;             // ISO\n  customerTitle: string;\n  /** Live entries supply the ID; label-only callers retain their existing grouping. */\n  employeeId?: number;\n  employeeName: string;\n  activityCode: string;\n  activityTitle?: string;\n  description: string;\n  hours: Money;\n  amount: Money;\n}\n\n/** Detailregel binnen een week (zoals getoond bij het uitklappen). */\nexport interface WeekEntry {\n  id: number;\n  date: string;\n  customerTitle: string;\n  employeeName: string;\n  activityCode: string;\n  activityTitle?: string;\n  description: string;\n  hours: Money;\n  amount: Money;\n}\n\n/** Verdeling van uren per werknemer binnen een week. */\nexport interface WeekPart {\n  employeeId?: number;\n  label: string;\n  hours: Money;\n}\n\n/** Eén weekrij: totalen + verdeling per werknemer + detailregels. */\nexport interface WeekRow {\n  week: number;\n  hours: Money;\n  amount: Money;\n  parts: WeekPart[];\n  entries: WeekEntry[];\n}\n\n/**\n * Bouwt de weekrijen uit (reeds op jaar/werknemer gefilterde) urenregels: per\n * week de totalen, de verdeling per werknemer (alfabetisch NL), en de losse\n * detailregels (op datum oplopend, gelijke datum -> id oplopend).\n *\n * @param entries - De gefilterde urenregels\n */\nexport function buildWeekRows(entries: WeekAggregateInput[]): WeekRow[] {\n  const byWeek = Object.groupBy(entries, (entry) => String(entry.week));\n  return Object.entries(byWeek)\n    .map(([week, list]) => {\n      const rows = list ?? [];\n      // Initials and first names are display labels, not unique employee identities.\n      const byEmployee = Object.groupBy(rows, (entry) => entry.employeeId !== undefined ? String(entry.employeeId) : entry.employeeName || \"(onbekend)\");\n      const parts = Object.entries(byEmployee)\n        .map(([, empRows]) => ({ employeeId: empRows?.[0]?.employeeId, label: empRows?.[0]?.employeeName || \"(onbekend)\", hours: (empRows ?? []).reduce((sum, e) => Money.add(sum, e.hours), ZERO) }))\n        .sort((a, b) => a.label.localeCompare(b.label, \"nl\"));\n      const details: WeekEntry[] = rows\n        .map((e) => ({\n          id: e.id,\n          date: e.date,\n          customerTitle: e.customerTitle,\n          employeeName: e.employeeName,\n          activityCode: e.activityCode,\n          activityTitle: e.activityTitle,\n          description: e.description,\n          hours: e.hours,\n          amount: e.amount,\n        }))\n        .sort((a, b) => (a.date < b.date ? -1 : a.date > b.date ? 1 : a.id - b.id));\n      return {\n        week: Number(week),\n        hours: rows.reduce((sum, e) => Money.add(sum, e.hours), ZERO),\n        amount: rows.reduce((sum, e) => Money.add(sum, e.amount), ZERO),\n        parts,\n        entries: details,\n      };\n    })\n    .sort((a, b) => a.week - b.week);\n}\n\n/**\n * The ISO week-year of an hours entry, derived from its work date and stored week.\n * The week overview filters on this instead of the fiscal year, so a week shows the\n * hours worked in it regardless of the fiscal year they were booked against.\n */\nexport function weekYear(entry: { date: string; week: number }): number {\n  const year = Number(entry.date.slice(0, 4));\n  const month = Number(entry.date.slice(5, 7));\n  if (entry.week === 1 && month === 12) return year + 1;\n  if (entry.week >= 52 && month === 1) return year - 1;\n  return year;\n}\n\n/** Weekoverzicht-filters: jaar + werknemer + weekkeuze. */\nexport interface WeekFilters {\n  year: number;\n  employeeId: number;   // 0 = alle werknemers\n  week: number;         // 0 = alle weken (jaaroverzicht); N = alleen week N\n}\n\nfunction toInt(value: string | undefined): number | undefined {\n  if (value === undefined || value === \"\") return undefined;\n  const n = Number.parseInt(value, 10);\n  return Number.isFinite(n) ? n : undefined;\n}\n\n/**\n * Leest de weekfilters uit een route-query. Ontbrekende/ongeldige waarden vallen\n * netjes terug (jaar op de meegegeven default, rest neutraal) zodat een handmatig\n * bewerkte URL nooit crasht.\n *\n * @param query - De route-query als platte string-record\n * @param defaultYear - Terugvaljaar als de URL geen jaar bevat\n */\nexport function parseWeekFilters(query: Record<string, string | undefined>, defaultYear: number): WeekFilters {\n  return {\n    year: toInt(query.jaar) ?? defaultYear,\n    employeeId: toInt(query.werknemer) ?? 0,\n    week: toInt(query.week) ?? 0,\n  };\n}\n\n/**\n * Serialiseert de weekfilters naar een route-query. Alleen niet-default waarden\n * worden opgenomen, zodat de \"kale\" weergave een schone URL houdt.\n *\n * @param filters - De huidige filters\n * @param defaultYear - Het jaar dat als default geldt (wordt weggelaten uit de query)\n */\nexport function weekFiltersToQuery(filters: WeekFilters, defaultYear: number): Record<string, string> {\n  const query: Record<string, string> = {};\n  if (filters.year !== defaultYear) query.jaar = String(filters.year);\n  if (filters.employeeId !== 0) query.werknemer = String(filters.employeeId);\n  if (filters.week !== 0) query.week = String(filters.week);\n  return query;\n}\n","import { createElementVNode as _createElementVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, toDisplayString as _toDisplayString } from \"vue\"\n\nconst _hoisted_1 = { class: \"hh-table wk-entries\" }\nconst _hoisted_2 = { class: \"hh-table__code\" }\nconst _hoisted_3 = { class: \"hh-muted\" }\nconst _hoisted_4 = { class: \"hh-table__num\" }\nconst _hoisted_5 = { class: \"hh-table__num\" }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return (_openBlock(), _createElementBlock(\"table\", _hoisted_1, [\n    _cache[0] || (_cache[0] = _createElementVNode(\"thead\", null, [\n      _createElementVNode(\"tr\", null, [\n        _createElementVNode(\"th\", { style: {\"width\":\"100px\"} }, \"Datum\"),\n        _createElementVNode(\"th\", null, \"Klant\"),\n        _createElementVNode(\"th\", null, \"Werknemer\"),\n        _createElementVNode(\"th\", { style: {\"width\":\"70px\"} }, \"Werkz.\"),\n        _createElementVNode(\"th\", null, \"Omschrijving\"),\n        _createElementVNode(\"th\", {\n          class: \"hh-table__num\",\n          style: {\"width\":\"80px\"}\n        }, \"Uren\"),\n        _createElementVNode(\"th\", {\n          class: \"hh-table__num\",\n          style: {\"width\":\"100px\"}\n        }, \"Bedrag\")\n      ])\n    ], -1 /* CACHED */)),\n    _createElementVNode(\"tbody\", null, [\n      (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($props.entries, (entry) => {\n        return (_openBlock(), _createElementBlock(\"tr\", {\n          key: entry.id\n        }, [\n          _createElementVNode(\"td\", null, _toDisplayString($setup.formatDate(entry.date)), 1 /* TEXT */),\n          _createElementVNode(\"td\", null, _toDisplayString(entry.customerTitle), 1 /* TEXT */),\n          _createElementVNode(\"td\", null, _toDisplayString(entry.employeeName), 1 /* TEXT */),\n          _createElementVNode(\"td\", _hoisted_2, _toDisplayString(entry.activityCode), 1 /* TEXT */),\n          _createElementVNode(\"td\", _hoisted_3, _toDisplayString($setup.entryDescription(entry)), 1 /* TEXT */),\n          _createElementVNode(\"td\", _hoisted_4, _toDisplayString($setup.formatHours(entry.hours)), 1 /* TEXT */),\n          _createElementVNode(\"td\", _hoisted_5, _toDisplayString($setup.formatEuro(entry.amount)), 1 /* TEXT */)\n        ]))\n      }), 128 /* KEYED_FRAGMENT */))\n    ])\n  ]))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/WeekEntriesTable.vue?type=script\";import \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/WeekEntriesTable.vue?type=style&index=0\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/WeekEntriesTable.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/WeekEntriesTable.vue\";script.__scopeId = \"data-v-d896a063\";export default script;","<template>\n  <section>\n    <div class=\"hh-page__bar\">\n      <h1 class=\"hh-page__title\">Weekoverzicht</h1>\n    </div>\n\n    <div class=\"hh-card wk__filters\">\n      <label class=\"wk__f\">Jaar\n        <select v-model=\"filterYear\" class=\"hh-select\">\n          <option v-for=\"year in years\" :key=\"year\" :value=\"String(year)\">{{ year }}</option>\n          <option v-if=\"years.length === 0\" :value=\"String(currentYear)\">{{ currentYear }}</option>\n        </select>\n      </label>\n      <label class=\"wk__f\">Werknemer\n        <Combobox :model-value=\"filterEmployee\" :options=\"employeeOptions\" aria-label=\"Werknemer\" placeholder=\"Code of naam…\" @update:model-value=\"filterEmployee = $event ?? 0\" />\n      </label>\n      <label class=\"wk__f\">Week\n        <select v-model.number=\"filterWeek\" class=\"hh-select\">\n          <option :value=\"0\">Alle weken</option>\n          <option v-for=\"w in weekOptions\" :key=\"w\" :value=\"w\">Week {{ w }}</option>\n        </select>\n      </label>\n    </div>\n\n    <p v-if=\"error\" class=\"hh-formerror\">{{ error }}</p>\n\n    <div class=\"hh-card\">\n      <div v-if=\"loading\" class=\"hh-empty\">Laden…</div>\n\n      <!-- Week-modus: één week gekozen -> alleen de urenregistraties van die week. -->\n      <template v-else-if=\"detailMode\">\n        <div class=\"wk__detailbar\">\n          <span class=\"wk__detailtitle\">Urenregistraties · week {{ filterWeek }}</span>\n          <span class=\"wk__detailtotals\">{{ formatHours(detailRow?.hours ?? 0) }} uur · {{ formatEuro(detailRow?.amount ?? 0) }}</span>\n        </div>\n        <p v-if=\"!detailRow || detailRow.entries.length === 0\" class=\"hh-empty\">Geen urenregels voor deze week.</p>\n        <WeekEntriesTable v-else :entries=\"detailRow.entries\" />\n      </template>\n\n      <!-- Jaaroverzicht: alle weken, met inline-uitklap per week. -->\n      <template v-else>\n        <p v-if=\"weeks.length === 0\" class=\"hh-empty\">Geen urenregels voor dit jaar.</p>\n        <table v-else class=\"hh-table\">\n          <thead>\n            <tr>\n              <th style=\"width: 120px\">Week</th>\n              <th>Verdeling</th>\n              <th class=\"hh-table__num\" style=\"width: 90px\">Uren</th>\n              <th class=\"hh-table__num\" style=\"width: 110px\">Bedrag</th>\n            </tr>\n          </thead>\n          <tbody>\n            <template v-for=\"wk in weeks\" :key=\"wk.week\">\n              <tr\n                class=\"is-clickable wk__row\"\n                :class=\"{ 'is-active': expandedWeek === wk.week }\"\n                role=\"button\"\n                tabindex=\"0\"\n                :aria-expanded=\"expandedWeek === wk.week\"\n                @click=\"toggleWeek(wk.week)\"\n                @keydown.enter.prevent=\"toggleWeek(wk.week)\"\n                @keydown.space.prevent=\"toggleWeek(wk.week)\"\n              >\n                <td class=\"hh-table__code\">\n                  <span class=\"wk__caret\" :class=\"{ 'wk__caret--open': expandedWeek === wk.week }\" aria-hidden=\"true\">▸</span>\n                  Week {{ wk.week }}\n                </td>\n                <td class=\"wk__breakdown\">\n                  <span v-for=\"part in wk.parts\" :key=\"part.employeeId ?? part.label\" class=\"wk__part\">\n                    {{ part.label }} <strong>{{ formatHours(part.hours) }}</strong>\n                  </span>\n                </td>\n                <td class=\"hh-table__num\">{{ formatHours(wk.hours) }}</td>\n                <td class=\"hh-table__num\">{{ formatEuro(wk.amount) }}</td>\n              </tr>\n              <tr v-if=\"expandedWeek === wk.week\" class=\"wk__detailrow\">\n                <td colspan=\"4\" class=\"wk__detailcell\">\n                  <WeekEntriesTable :entries=\"wk.entries\" />\n                </td>\n              </tr>\n            </template>\n          </tbody>\n          <tfoot>\n            <tr class=\"wk__total\">\n              <td colspan=\"2\">Totaal</td>\n              <td class=\"hh-table__num\">{{ formatHours(totalHours) }}</td>\n              <td class=\"hh-table__num\">{{ formatEuro(totalAmount) }}</td>\n            </tr>\n          </tfoot>\n        </table>\n      </template>\n    </div>\n  </section>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, onMounted, ref, watch } from \"vue\";\nimport { useRoute, useRouter } from \"vue-router\";\nimport { Money } from \"@webhare/std\";\nimport { useApi } from \"../lib/api\";\nimport { employeeReportName, formatEuro, formatHours } from \"../lib/format\";\nimport { buildWeekRows, parseWeekFilters, weekFiltersToQuery, weekYear, type WeekFilters } from \"../lib/weekOverview\";\nimport { queryRecord, sameQuery } from \"../lib/routeQuery\";\nimport WeekEntriesTable from \"../components/WeekEntriesTable.vue\";\nimport Combobox, { type ComboOption } from \"../components/Combobox.vue\";\n\nconst api = useApi();\n\ntype Entry = Awaited<ReturnType<typeof api.listTimeEntries>>[number];\ntype Employee = Awaited<ReturnType<typeof api.listEmployees>>[number];\n\nconst route = useRoute();\nconst router = useRouter();\n\nconst employees = ref<Employee[]>([]);\nconst employeeOptions = computed<ComboOption[]>(() => [\n  { id: 0, label: \"Alle werknemers\" },\n  ...employees.value.map(employee => ({ id: employee.id, label: `${employee.code} · ${employeeReportName(employee) || employee.name}` })),\n]);\nconst entries = ref<Entry[]>([]);\nconst loading = ref(true);\nconst error = ref(\"\");\n\n// Filters herstellen uit de URL (refresh-stabiel en deelbaar; \"terug\" komt terug\n// op deze selectie). De week-keuze switcht de view naar de detail-tabel.\nconst currentYear = new Date().getFullYear();\nconst restored = parseWeekFilters(queryRecord(route.query), currentYear);\nconst urlHadYear = \"jaar\" in queryRecord(route.query);\n\nconst filterYear = ref<string>(String(restored.year));\nconst filterEmployee = ref(restored.employeeId);\nconst filterWeek = ref(restored.week);\n// Inline-uitklap in het jaaroverzicht: vluchtige UI-state, bewust niet in de URL\n// (de week-filter dekt de deelbare \"focus op week\"-staat af).\nconst expandedWeek = ref(0);\n\nconst years = computed<number[]>(() => [...new Set(entries.value.map(weekYear))].sort((a, b) => b - a));\n\nconst yearEntries = computed<Entry[]>(() => {\n  const year = Number(filterYear.value);\n  return entries.value.filter((e) => weekYear(e) === year && (filterEmployee.value === 0 || e.employeeId === filterEmployee.value));\n});\n\nconst ZERO = new Money(\"0\");\n\nconst totalHours = computed(() => yearEntries.value.reduce((sum, e) => Money.add(sum, e.hours), ZERO));\nconst totalAmount = computed(() => yearEntries.value.reduce((sum, e) => Money.add(sum, e.amount), ZERO));\n\nconst weeks = computed(() => buildWeekRows(yearEntries.value));\nconst weekOptions = computed<number[]>(() => weeks.value.map((wk) => wk.week));\n\nconst detailMode = computed(() => filterWeek.value > 0);\nconst detailRow = computed(() => weeks.value.find((wk) => wk.week === filterWeek.value) ?? null);\n\nfunction toggleWeek(week: number): void {\n  expandedWeek.value = expandedWeek.value === week ? 0 : week;\n}\n\n// Wisselen van jaar/werknemer maakt de weekkeuze + uitklap ongeldig -> terug naar\n// het volledige jaaroverzicht.\nwatch([filterYear, filterEmployee], () => {\n  filterWeek.value = 0;\n  expandedWeek.value = 0;\n});\n\n// Filters -> URL spiegelen: blijven behouden bij refresh en zijn deelbaar.\nconst currentFilters = computed<WeekFilters>(() => ({\n  year: Number(filterYear.value),\n  employeeId: filterEmployee.value,\n  week: filterWeek.value,\n}));\n\nwatch(currentFilters, (filters) => {\n  const next = weekFiltersToQuery(filters, currentYear);\n  if (!sameQuery(next, queryRecord(route.query))) void router.replace({ query: next });\n});\n\nasync function load(): Promise<void> {\n  loading.value = true;\n  error.value = \"\";\n  try {\n    const [emps, rows] = await Promise.all([api.listEmployees(), api.listTimeEntries()]);\n    employees.value = emps;\n    entries.value = rows;\n    // Alleen automatisch naar het nieuwste jaar-met-data springen als de URL geen\n    // jaar oplegde (een deelbare/ge-refreshte URL wint).\n    if (!urlHadYear && !years.value.includes(Number(filterYear.value)) && years.value.length > 0) {\n      filterYear.value = String(years.value[0]);\n    }\n  } catch {\n    error.value = \"Kon de urenregels niet laden.\";\n  } finally {\n    loading.value = false;\n  }\n}\n\n// Klant-, werknemer- en jaarfilter zijn allemaal client-side (één fetch bij mount).\nonMounted(load);\n</script>\n\n<style scoped>\n.wk__filters {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 14px;\n  padding: 14px 18px;\n  margin-bottom: 14px;\n}\n.wk__f {\n  display: flex;\n  flex-direction: column;\n  gap: 4px;\n  font-size: 12.5px;\n  font-weight: 600;\n  color: var(--hh-fg-muted);\n}\n.wk__f .hh-select {\n  min-width: 160px;\n}\n.wk__caret {\n  display: inline-block;\n  width: 1em;\n  color: var(--hh-fg-subtle);\n  transition: transform 0.12s ease;\n}\n.wk__caret--open {\n  transform: rotate(90deg);\n  color: var(--hh-accent);\n}\n.wk__breakdown {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 12px;\n}\n.wk__part {\n  font-size: 12.5px;\n  color: var(--hh-fg-muted);\n}\n.wk__part strong {\n  font-family: var(--hh-mono);\n  color: var(--hh-fg);\n}\n.wk__detailcell {\n  padding: 0 12px 12px 32px;\n  background: var(--hh-accent-soft);\n  box-shadow: inset 3px 0 0 var(--hh-accent);\n}\n.wk__detailbar {\n  display: flex;\n  align-items: baseline;\n  justify-content: space-between;\n  gap: 12px;\n  padding: 12px 14px;\n  border-bottom: 1px solid var(--hh-line);\n}\n.wk__detailtitle {\n  font-weight: 700;\n  color: var(--hh-fg);\n}\n.wk__detailtotals {\n  font-family: var(--hh-mono);\n  color: var(--hh-fg-muted);\n}\n.wk__total td {\n  font-weight: 700;\n  border-top: 2px solid var(--hh-line-strong);\n  /* tfoot heeft geen globale hh-table-padding: expliciet ademruimte links/rechts/onder. */\n  padding: 12px 12px 14px;\n}\n</style>\n","import { createElementVNode as _createElementVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, toDisplayString as _toDisplayString, createCommentVNode as _createCommentVNode, vModelSelect as _vModelSelect, withDirectives as _withDirectives, createTextVNode as _createTextVNode, createVNode as _createVNode, createBlock as _createBlock, normalizeClass as _normalizeClass, withModifiers as _withModifiers, withKeys as _withKeys } from \"vue\"\n\nconst _hoisted_1 = { class: \"hh-card wk__filters\" }\nconst _hoisted_2 = { class: \"wk__f\" }\nconst _hoisted_3 = [\"value\"]\nconst _hoisted_4 = [\"value\"]\nconst _hoisted_5 = { class: \"wk__f\" }\nconst _hoisted_6 = { class: \"wk__f\" }\nconst _hoisted_7 = [\"value\"]\nconst _hoisted_8 = {\n  key: 0,\n  class: \"hh-formerror\"\n}\nconst _hoisted_9 = { class: \"hh-card\" }\nconst _hoisted_10 = {\n  key: 0,\n  class: \"hh-empty\"\n}\nconst _hoisted_11 = { class: \"wk__detailbar\" }\nconst _hoisted_12 = { class: \"wk__detailtitle\" }\nconst _hoisted_13 = { class: \"wk__detailtotals\" }\nconst _hoisted_14 = {\n  key: 0,\n  class: \"hh-empty\"\n}\nconst _hoisted_15 = {\n  key: 0,\n  class: \"hh-empty\"\n}\nconst _hoisted_16 = {\n  key: 1,\n  class: \"hh-table\"\n}\nconst _hoisted_17 = [\"aria-expanded\", \"onClick\", \"onKeydown\"]\nconst _hoisted_18 = { class: \"hh-table__code\" }\nconst _hoisted_19 = { class: \"wk__breakdown\" }\nconst _hoisted_20 = { class: \"hh-table__num\" }\nconst _hoisted_21 = { class: \"hh-table__num\" }\nconst _hoisted_22 = {\n  key: 0,\n  class: \"wk__detailrow\"\n}\nconst _hoisted_23 = {\n  colspan: \"4\",\n  class: \"wk__detailcell\"\n}\nconst _hoisted_24 = { class: \"wk__total\" }\nconst _hoisted_25 = { class: \"hh-table__num\" }\nconst _hoisted_26 = { class: \"hh-table__num\" }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return (_openBlock(), _createElementBlock(\"section\", null, [\n    _cache[9] || (_cache[9] = _createElementVNode(\"div\", { class: \"hh-page__bar\" }, [\n      _createElementVNode(\"h1\", { class: \"hh-page__title\" }, \"Weekoverzicht\")\n    ], -1 /* CACHED */)),\n    _createElementVNode(\"div\", _hoisted_1, [\n      _createElementVNode(\"label\", _hoisted_2, [\n        _cache[3] || (_cache[3] = _createTextVNode(\"Jaar \", -1 /* CACHED */)),\n        _withDirectives(_createElementVNode(\"select\", {\n          \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => (($setup.filterYear) = $event)),\n          class: \"hh-select\"\n        }, [\n          (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.years, (year) => {\n            return (_openBlock(), _createElementBlock(\"option\", {\n              key: year,\n              value: String(year)\n            }, _toDisplayString(year), 9 /* TEXT, PROPS */, _hoisted_3))\n          }), 128 /* KEYED_FRAGMENT */)),\n          ($setup.years.length === 0)\n            ? (_openBlock(), _createElementBlock(\"option\", {\n                key: 0,\n                value: String($setup.currentYear)\n              }, _toDisplayString($setup.currentYear), 9 /* TEXT, PROPS */, _hoisted_4))\n            : _createCommentVNode(\"v-if\", true)\n        ], 512 /* NEED_PATCH */), [\n          [_vModelSelect, $setup.filterYear]\n        ])\n      ]),\n      _createElementVNode(\"label\", _hoisted_5, [\n        _cache[4] || (_cache[4] = _createTextVNode(\"Werknemer \", -1 /* CACHED */)),\n        _createVNode($setup[\"Combobox\"], {\n          \"model-value\": $setup.filterEmployee,\n          options: $setup.employeeOptions,\n          \"aria-label\": \"Werknemer\",\n          placeholder: \"Code of naam…\",\n          \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => ($setup.filterEmployee = $event ?? 0))\n        }, null, 8 /* PROPS */, [\"model-value\", \"options\"])\n      ]),\n      _createElementVNode(\"label\", _hoisted_6, [\n        _cache[6] || (_cache[6] = _createTextVNode(\"Week \", -1 /* CACHED */)),\n        _withDirectives(_createElementVNode(\"select\", {\n          \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => (($setup.filterWeek) = $event)),\n          class: \"hh-select\"\n        }, [\n          _cache[5] || (_cache[5] = _createElementVNode(\"option\", { value: 0 }, \"Alle weken\", -1 /* CACHED */)),\n          (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.weekOptions, (w) => {\n            return (_openBlock(), _createElementBlock(\"option\", {\n              key: w,\n              value: w\n            }, \"Week \" + _toDisplayString(w), 9 /* TEXT, PROPS */, _hoisted_7))\n          }), 128 /* KEYED_FRAGMENT */))\n        ], 512 /* NEED_PATCH */), [\n          [\n            _vModelSelect,\n            $setup.filterWeek,\n            void 0,\n            { number: true }\n          ]\n        ])\n      ])\n    ]),\n    ($setup.error)\n      ? (_openBlock(), _createElementBlock(\"p\", _hoisted_8, _toDisplayString($setup.error), 1 /* TEXT */))\n      : _createCommentVNode(\"v-if\", true),\n    _createElementVNode(\"div\", _hoisted_9, [\n      ($setup.loading)\n        ? (_openBlock(), _createElementBlock(\"div\", _hoisted_10, \"Laden…\"))\n        : ($setup.detailMode)\n          ? (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n              _createCommentVNode(\" Week-modus: één week gekozen -> alleen de urenregistraties van die week. \"),\n              _createElementVNode(\"div\", _hoisted_11, [\n                _createElementVNode(\"span\", _hoisted_12, \"Urenregistraties · week \" + _toDisplayString($setup.filterWeek), 1 /* TEXT */),\n                _createElementVNode(\"span\", _hoisted_13, _toDisplayString($setup.formatHours($setup.detailRow?.hours ?? 0)) + \" uur · \" + _toDisplayString($setup.formatEuro($setup.detailRow?.amount ?? 0)), 1 /* TEXT */)\n              ]),\n              (!$setup.detailRow || $setup.detailRow.entries.length === 0)\n                ? (_openBlock(), _createElementBlock(\"p\", _hoisted_14, \"Geen urenregels voor deze week.\"))\n                : (_openBlock(), _createBlock($setup[\"WeekEntriesTable\"], {\n                    key: 1,\n                    entries: $setup.detailRow.entries\n                  }, null, 8 /* PROPS */, [\"entries\"]))\n            ], 64 /* STABLE_FRAGMENT */))\n          : (_openBlock(), _createElementBlock(_Fragment, { key: 2 }, [\n              _createCommentVNode(\" Jaaroverzicht: alle weken, met inline-uitklap per week. \"),\n              ($setup.weeks.length === 0)\n                ? (_openBlock(), _createElementBlock(\"p\", _hoisted_15, \"Geen urenregels voor dit jaar.\"))\n                : (_openBlock(), _createElementBlock(\"table\", _hoisted_16, [\n                    _cache[8] || (_cache[8] = _createElementVNode(\"thead\", null, [\n                      _createElementVNode(\"tr\", null, [\n                        _createElementVNode(\"th\", { style: {\"width\":\"120px\"} }, \"Week\"),\n                        _createElementVNode(\"th\", null, \"Verdeling\"),\n                        _createElementVNode(\"th\", {\n                          class: \"hh-table__num\",\n                          style: {\"width\":\"90px\"}\n                        }, \"Uren\"),\n                        _createElementVNode(\"th\", {\n                          class: \"hh-table__num\",\n                          style: {\"width\":\"110px\"}\n                        }, \"Bedrag\")\n                      ])\n                    ], -1 /* CACHED */)),\n                    _createElementVNode(\"tbody\", null, [\n                      (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.weeks, (wk) => {\n                        return (_openBlock(), _createElementBlock(_Fragment, {\n                          key: wk.week\n                        }, [\n                          _createElementVNode(\"tr\", {\n                            class: _normalizeClass([\"is-clickable wk__row\", { 'is-active': $setup.expandedWeek === wk.week }]),\n                            role: \"button\",\n                            tabindex: \"0\",\n                            \"aria-expanded\": $setup.expandedWeek === wk.week,\n                            onClick: $event => ($setup.toggleWeek(wk.week)),\n                            onKeydown: [\n                              _withKeys(_withModifiers($event => ($setup.toggleWeek(wk.week)), [\"prevent\"]), [\"enter\"]),\n                              _withKeys(_withModifiers($event => ($setup.toggleWeek(wk.week)), [\"prevent\"]), [\"space\"])\n                            ]\n                          }, [\n                            _createElementVNode(\"td\", _hoisted_18, [\n                              _createElementVNode(\"span\", {\n                                class: _normalizeClass([\"wk__caret\", { 'wk__caret--open': $setup.expandedWeek === wk.week }]),\n                                \"aria-hidden\": \"true\"\n                              }, \"▸\", 2 /* CLASS */),\n                              _createTextVNode(\" Week \" + _toDisplayString(wk.week), 1 /* TEXT */)\n                            ]),\n                            _createElementVNode(\"td\", _hoisted_19, [\n                              (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(wk.parts, (part) => {\n                                return (_openBlock(), _createElementBlock(\"span\", {\n                                  key: part.employeeId ?? part.label,\n                                  class: \"wk__part\"\n                                }, [\n                                  _createTextVNode(_toDisplayString(part.label) + \" \", 1 /* TEXT */),\n                                  _createElementVNode(\"strong\", null, _toDisplayString($setup.formatHours(part.hours)), 1 /* TEXT */)\n                                ]))\n                              }), 128 /* KEYED_FRAGMENT */))\n                            ]),\n                            _createElementVNode(\"td\", _hoisted_20, _toDisplayString($setup.formatHours(wk.hours)), 1 /* TEXT */),\n                            _createElementVNode(\"td\", _hoisted_21, _toDisplayString($setup.formatEuro(wk.amount)), 1 /* TEXT */)\n                          ], 42 /* CLASS, PROPS, NEED_HYDRATION */, _hoisted_17),\n                          ($setup.expandedWeek === wk.week)\n                            ? (_openBlock(), _createElementBlock(\"tr\", _hoisted_22, [\n                                _createElementVNode(\"td\", _hoisted_23, [\n                                  _createVNode($setup[\"WeekEntriesTable\"], {\n                                    entries: wk.entries\n                                  }, null, 8 /* PROPS */, [\"entries\"])\n                                ])\n                              ]))\n                            : _createCommentVNode(\"v-if\", true)\n                        ], 64 /* STABLE_FRAGMENT */))\n                      }), 128 /* KEYED_FRAGMENT */))\n                    ]),\n                    _createElementVNode(\"tfoot\", null, [\n                      _createElementVNode(\"tr\", _hoisted_24, [\n                        _cache[7] || (_cache[7] = _createElementVNode(\"td\", { colspan: \"2\" }, \"Totaal\", -1 /* CACHED */)),\n                        _createElementVNode(\"td\", _hoisted_25, _toDisplayString($setup.formatHours($setup.totalHours)), 1 /* TEXT */),\n                        _createElementVNode(\"td\", _hoisted_26, _toDisplayString($setup.formatEuro($setup.totalAmount)), 1 /* TEXT */)\n                      ])\n                    ])\n                  ]))\n            ], 64 /* STABLE_FRAGMENT */))\n    ])\n  ]))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/HoursWeekView.vue?type=script\";import \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/HoursWeekView.vue?type=style&index=0\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/HoursWeekView.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/HoursWeekView.vue\";script.__scopeId = \"data-v-fb1d80af\";export default script;","// Periodefilter voor lijstweergaven: een modus (jaar/maand/week/losse periode)\n// wordt omgezet naar een inclusieve datumrange (YYYY-MM-DD). Pure functies, geen\n// @webhare-runtime imports, zodat ze via `wh runtest` unit-testbaar zijn.\n\nimport { isoWeek } from \"./dates\";\n\nexport type PeriodMode = \"all\" | \"year\" | \"month\" | \"week\" | \"range\";\n\nexport interface PeriodSelection {\n  mode: PeriodMode;\n  year?: number;      // year/month/week\n  month?: number;     // 1-12 (month)\n  week?: number;      // 1-53 ISO (week)\n  from?: string;      // YYYY-MM-DD (range)\n  until?: string;     // YYYY-MM-DD (range)\n}\n\nexport interface DateRange {\n  from: string;   // YYYY-MM-DD, inclusief\n  until: string;  // YYYY-MM-DD, inclusief\n}\n\nconst MS_PER_DAY = 24 * 3600 * 1000;\n\n/** Nederlandse maandnamen, index 0 = januari (voor de maand-dropdown). */\nexport const MONTH_NAMES = [\n  \"januari\", \"februari\", \"maart\", \"april\", \"mei\", \"juni\",\n  \"juli\", \"augustus\", \"september\", \"oktober\", \"november\", \"december\",\n];\n\nfunction pad2(value: number): string {\n  return String(value).padStart(2, \"0\");\n}\n\n/** Een lokale Date naar YYYY-MM-DD (lokale kalenderdatum). */\nfunction toIsoDate(date: Date): string {\n  return `${date.getFullYear()}-${pad2(date.getMonth() + 1)}-${pad2(date.getDate())}`;\n}\n\n/** Aantal dagen in een maand (1-based maand). */\nfunction daysInMonth(year: number, month: number): number {\n  return new Date(year, month, 0).getDate();\n}\n\n/** De maandag van een ISO-week (week 1 bevat de eerste donderdag van het jaar). */\nexport function mondayOfIsoWeek(year: number, week: number): Date {\n  const jan4 = new Date(year, 0, 4);\n  const dayOfWeek = jan4.getDay() || 7; // zondag = 7\n  const mondayOfWeek1 = new Date(year, 0, 4 - (dayOfWeek - 1));\n  return new Date(mondayOfWeek1.getFullYear(), mondayOfWeek1.getMonth(), mondayOfWeek1.getDate() + (week - 1) * 7);\n}\n\n/** Aantal ISO-weken in een jaar (52 of 53). */\nexport function weeksInYear(year: number): number {\n  return isoWeek(new Date(year, 11, 28)); // 28 dec zit altijd in de laatste week\n}\n\n/**\n * Zet een periodekeuze om naar een inclusieve datumrange, of null (\"Alles\").\n *\n * @param selection - De gekozen modus met bijbehorende velden\n */\nexport function resolvePeriodRange(selection: PeriodSelection): DateRange | null {\n  switch (selection.mode) {\n    case \"year\": {\n      const year = selection.year ?? 0;\n      return { from: `${year}-01-01`, until: `${year}-12-31` };\n    }\n    case \"month\": {\n      const year = selection.year ?? 0;\n      const month = selection.month ?? 1;\n      return { from: `${year}-${pad2(month)}-01`, until: `${year}-${pad2(month)}-${pad2(daysInMonth(year, month))}` };\n    }\n    case \"week\": {\n      const year = selection.year ?? 0;\n      const week = selection.week ?? 1;\n      const monday = mondayOfIsoWeek(year, week);\n      const sunday = new Date(monday.getTime() + 6 * MS_PER_DAY);\n      return { from: toIsoDate(monday), until: toIsoDate(sunday) };\n    }\n    case \"range\": {\n      if (!selection.from && !selection.until) return null;\n      return { from: selection.from ?? \"0000-01-01\", until: selection.until ?? \"9999-12-31\" };\n    }\n    case \"all\":\n    default:\n      return null;\n  }\n}\n\n/**\n * Valt een (ISO-)datum binnen de range? Vergelijking op het datumdeel (YYYY-MM-DD);\n * grenzen inclusief. Een null-range betekent \"geen filter\" -> altijd waar.\n *\n * @param isoDate - Datum als ISO-string (bv. \"2026-07-15T00:00:00.000Z\")\n * @param range - De datumrange, of null\n */\nexport function isDateInRange(isoDate: string, range: DateRange | null): boolean {\n  if (!range) return true;\n  const day = isoDate.slice(0, 10);\n  return day >= range.from && day <= range.until;\n}\n","// Fakturenlijst-state <-> URL-query + sortering. Pure functies (alleen Money\n// uit @webhare/std, puur en bundelbaar), zodat ze via `wh runtest`\n// unit-testbaar zijn.\n//\n// De view spiegelt zijn filters + sortering naar de route-query (hash-router),\n// zodat een refresh dezelfde selectie herstelt en een URL deelbaar is.\n\nimport { Money } from \"@webhare/std\";\nimport { type PeriodMode, type PeriodSelection } from \"./period\";\n\nexport type SortKey = \"date\" | \"number\" | \"customer\" | \"fiscalYear\" | \"amount\" | \"margin\";\nexport type SortDir = \"asc\" | \"desc\";\nexport interface InvoiceSort {\n  key: SortKey;\n  dir: SortDir;\n}\n\nexport const DEFAULT_SORT: InvoiceSort = { key: \"date\", dir: \"asc\" };\n\nexport interface InvoiceListState {\n  customerId: number;\n  period: PeriodSelection;\n  sort: InvoiceSort;\n}\n\nexport interface StateFallback {\n  year: number;\n  month: number;\n  week: number;\n}\n\n/** Minimale faktuurvorm die de sortering nodig heeft. */\nexport interface SortableInvoice {\n  date: string;             // ISO\n  number: string;           // KLT.JJ/NNN\n  customerTitle?: string;   // alleen nodig voor sorteren op klant\n  fiscalYear: number;\n  amount: Money;\n  margin: Money;\n}\n\nconst PERIOD_MODES: PeriodMode[] = [\"all\", \"year\", \"month\", \"week\", \"range\"];\nconst SORT_KEYS: SortKey[] = [\"date\", \"number\", \"customer\", \"fiscalYear\", \"amount\", \"margin\"];\n\nfunction toInt(value: string | undefined): number | undefined {\n  if (value === undefined || value === \"\") return undefined;\n  const n = Number.parseInt(value, 10);\n  return Number.isFinite(n) ? n : undefined;\n}\n\n/** Standaard sorteerrichting bij het (voor het eerst) kiezen van een kolom: oplopend. */\nexport function defaultDirFor(_key: SortKey): SortDir {\n  return \"asc\";\n}\n\n/**\n * Bouwt de lijst-state uit een route-query. Onbekende/ontbrekende waarden vallen\n * netjes terug op defaults (een handmatig bewerkte URL mag nooit crashen).\n *\n * @param query - De route-query als platte string-record (eerste waarde per sleutel)\n * @param fallback - Huidig jaar/maand/week voor modi die (nog) geen waarde in de URL hebben\n */\nexport function queryToState(query: Record<string, string | undefined>, fallback: StateFallback): InvoiceListState {\n  const customerId = toInt(query.klant) ?? 0;\n  const mode: PeriodMode = PERIOD_MODES.includes(query.periode as PeriodMode) ? (query.periode as PeriodMode) : \"all\";\n  const period: PeriodSelection = {\n    mode,\n    year: toInt(query.jaar) ?? fallback.year,\n    month: toInt(query.maand) ?? fallback.month,\n    week: toInt(query.week) ?? fallback.week,\n    from: query.van || undefined,\n    until: query.tot || undefined,\n  };\n  const key: SortKey = SORT_KEYS.includes(query.sort as SortKey) ? (query.sort as SortKey) : \"date\";\n  const dir: SortDir = query.richting === \"asc\" || query.richting === \"desc\" ? query.richting : defaultDirFor(key);\n  return { customerId, period, sort: { key, dir } };\n}\n\n/**\n * Serialiseert de lijst-state naar een route-query. Alleen niet-default waarden\n * worden opgenomen, zodat de \"kale\" lijst een schone URL houdt.\n *\n * @param state - De huidige lijst-state\n */\nexport function stateToQuery(state: InvoiceListState): Record<string, string> {\n  const query: Record<string, string> = {};\n  if (state.customerId) query.klant = String(state.customerId);\n\n  const period = state.period;\n  switch (period.mode) {\n    case \"year\":\n      query.periode = \"year\";\n      query.jaar = String(period.year ?? \"\");\n      break;\n    case \"month\":\n      query.periode = \"month\";\n      query.jaar = String(period.year ?? \"\");\n      query.maand = String(period.month ?? \"\");\n      break;\n    case \"week\":\n      query.periode = \"week\";\n      query.jaar = String(period.year ?? \"\");\n      query.week = String(period.week ?? \"\");\n      break;\n    case \"range\":\n      query.periode = \"range\";\n      if (period.from) query.van = period.from;\n      if (period.until) query.tot = period.until;\n      break;\n    case \"all\":\n    default:\n      break;\n  }\n\n  if (state.sort.key !== DEFAULT_SORT.key || state.sort.dir !== DEFAULT_SORT.dir) {\n    query.sort = state.sort.key;\n    query.richting = state.sort.dir;\n  }\n  return query;\n}\n\nfunction compareBy(a: SortableInvoice, b: SortableInvoice, key: SortKey): number {\n  switch (key) {\n    case \"number\": return a.number.localeCompare(b.number, \"nl\", { numeric: true });\n    case \"customer\": return (a.customerTitle ?? \"\").localeCompare(b.customerTitle ?? \"\", \"nl\");\n    case \"fiscalYear\": return a.fiscalYear - b.fiscalYear;\n    case \"amount\": return Money.cmp(a.amount, b.amount);\n    case \"margin\": return Money.cmp(a.margin, b.margin);\n    case \"date\":\n    default: return a.date < b.date ? -1 : a.date > b.date ? 1 : 0;\n  }\n}\n\n/**\n * Sorteert een kopie van de lijst op de gekozen sleutel/richting. Bij gelijke\n * waarde is de tiebreak altijd het volgnummer (oplopend), voor een stabiele orde.\n *\n * @param list - De te sorteren fakturen\n * @param sort - Sleutel + richting\n */\nexport function sortInvoices<T extends SortableInvoice>(list: T[], sort: InvoiceSort): T[] {\n  const factor = sort.dir === \"asc\" ? 1 : -1;\n  return [...list].sort((a, b) =>\n    factor * compareBy(a, b, sort.key) || a.number.localeCompare(b.number, \"nl\", { numeric: true }));\n}\n","<template>\n  <section>\n    <div class=\"hh-page__bar\">\n      <div>\n        <h1 class=\"hh-page__title\">Facturen</h1>\n        <p class=\"hh-page__sub\">Klik een factuur voor de printweergave en betalingsregistratie. Druk op <kbd>n</kbd> voor een nieuwe, <kbd>o</kbd> voor het overzicht fakturen/uren.</p>\n      </div>\n      <div class=\"inv__actions\">\n        <RouterLink class=\"hh-btn\" :to=\"statementTarget\">Overzicht fakturen/uren</RouterLink>\n        <RouterLink class=\"hh-btn hh-btn--primary\" :to=\"{ name: 'fakturen-nieuw' }\">+ Nieuwe factuur</RouterLink>\n      </div>\n    </div>\n\n    <div class=\"hh-card inv__filters\">\n      <label class=\"inv__f\">Klant\n        <Combobox :model-value=\"filterCustomer\" :options=\"customerOptions\" aria-label=\"Klant\" placeholder=\"Nummer of naam…\" @update:model-value=\"filterCustomer = $event ?? 0\" />\n      </label>\n\n      <label class=\"inv__f\">Periode\n        <select v-model=\"periodMode\" class=\"hh-select\">\n          <option value=\"all\">Alles</option>\n          <option value=\"year\">Jaar</option>\n          <option value=\"month\">Maand</option>\n          <option value=\"week\">Week</option>\n          <option value=\"range\">Periode</option>\n        </select>\n      </label>\n\n      <label v-if=\"periodMode === 'year'\" class=\"inv__f\">Jaar\n        <select v-model.number=\"selYear\" class=\"hh-select\">\n          <option v-for=\"y in yearOptions\" :key=\"y\" :value=\"y\">{{ y }}</option>\n        </select>\n      </label>\n\n      <template v-if=\"periodMode === 'month'\">\n        <label class=\"inv__f\">Maand\n          <select v-model.number=\"selMonth\" class=\"hh-select\">\n            <option v-for=\"m in monthOptions\" :key=\"m.value\" :value=\"m.value\">{{ m.label }}</option>\n          </select>\n        </label>\n        <label class=\"inv__f\">Jaar\n          <select v-model.number=\"selYear\" class=\"hh-select\">\n            <option v-for=\"y in yearOptions\" :key=\"y\" :value=\"y\">{{ y }}</option>\n          </select>\n        </label>\n      </template>\n\n      <template v-if=\"periodMode === 'week'\">\n        <label class=\"inv__f\">Week\n          <select v-model.number=\"selWeek\" class=\"hh-select\">\n            <option v-for=\"w in weekOptions\" :key=\"w\" :value=\"w\">week {{ w }}</option>\n          </select>\n        </label>\n        <label class=\"inv__f\">Jaar\n          <select v-model.number=\"selYear\" class=\"hh-select\">\n            <option v-for=\"y in yearOptions\" :key=\"y\" :value=\"y\">{{ y }}</option>\n          </select>\n        </label>\n      </template>\n\n      <template v-if=\"periodMode === 'range'\">\n        <div class=\"inv__f\">\n          <label for=\"inv-from\">Van</label>\n          <DateInput id=\"inv-from\" v-model=\"rangeFrom\" class=\"inv__date\" :required=\"false\" />\n        </div>\n        <div class=\"inv__f\">\n          <label for=\"inv-until\">Tot</label>\n          <DateInput id=\"inv-until\" v-model=\"rangeUntil\" class=\"inv__date\" :required=\"false\" />\n        </div>\n      </template>\n\n      <!-- Statusfilter tijdelijk verborgen (op verzoek): geen filter, geen kolom.\n      <label class=\"inv__f\">Status\n        <select v-model=\"filterStatus\" class=\"hh-select\">\n          <option value=\"all\">Alle</option>\n          <option value=\"open\">Openstaand</option>\n          <option value=\"paid\">Betaald</option>\n        </select>\n      </label>\n      -->\n\n      <div class=\"inv__spacer\"></div>\n      <button\n        v-if=\"filterCustomer\"\n        class=\"hh-btn\"\n        type=\"button\"\n        :disabled=\"openForCustomer === 0\"\n        :title=\"openForCustomer === 0 ? 'Geen verstuurde openstaande facturen voor deze klant' : ''\"\n        @click=\"openReminder\"\n      >Betalingsherinnering ({{ openForCustomer }})</button>\n    </div>\n\n    <ReminderFormDialog\n      v-if=\"reminderCreateOpen && filterCustomer\"\n      :customer-id=\"filterCustomer\"\n      @close=\"reminderCreateOpen = false\"\n      @saved=\"onReminderCreated\"\n    />\n\n    <p v-if=\"error\" class=\"hh-formerror\">{{ error }}</p>\n\n    <div class=\"hh-card\">\n      <div v-if=\"loading\" class=\"hh-empty\">Laden…</div>\n      <p v-else-if=\"visibleInvoices.length === 0\" class=\"hh-empty\">Geen facturen voor deze selectie.</p>\n      <table v-else class=\"hh-table\">\n        <thead>\n          <tr>\n            <th\n              v-for=\"col in columns\"\n              :key=\"col.key\"\n              :class=\"['inv__th', { 'hh-table__num': col.num, 'is-sorted': sort.key === col.key }]\"\n              :style=\"{ width: col.width }\"\n              :aria-sort=\"ariaSort(col.key)\"\n              @click=\"toggleSort(col.key)\"\n            >{{ col.label }}<span class=\"inv__sortarrow\" aria-hidden=\"true\">{{ sortIndicator(col.key) }}</span></th>\n            <!-- Soort- en Status-kolom verwijderd/verborgen op verzoek. -->\n          </tr>\n        </thead>\n        <tbody>\n          <tr\n            v-for=\"(invoice, index) in visibleInvoices\"\n            :key=\"invoice.id\"\n            :data-list-row=\"index\"\n            class=\"is-clickable\"\n            :class=\"{ 'is-active': index === activeIndex }\"\n            @click=\"open(invoice.id)\"\n          >\n            <td>{{ formatDate(invoice.date) }}</td>\n            <td class=\"hh-table__code\">{{ invoice.number }}</td>\n            <td v-if=\"!filterCustomer\">{{ invoice.customerTitle || emptyMark }}</td>\n            <td class=\"hh-table__num\">{{ invoice.fiscalYear }}</td>\n            <td class=\"hh-table__num\">{{ formatEuro(invoice.amount) }}</td>\n            <td class=\"hh-table__num\">{{ hasMargin(invoice) ? formatEuro(invoice.margin) : emptyMark }}</td>\n          </tr>\n        </tbody>\n        <tfoot>\n          <tr class=\"inv__total\">\n            <td :colspan=\"filterCustomer ? 3 : 4\">Totaal ({{ visibleInvoices.length }} facturen)</td>\n            <td class=\"hh-table__num\">{{ formatEuro(totalAmount) }}</td>\n            <td class=\"hh-table__num\">{{ totalMargin ? formatEuro(totalMargin) : emptyMark }}</td>\n          </tr>\n        </tfoot>\n      </table>\n    </div>\n  </section>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, onMounted, ref, watch } from \"vue\";\nimport { RouterLink, useRoute, useRouter } from \"vue-router\";\nimport { Money } from \"@webhare/std\";\nimport Combobox, { type ComboOption } from \"../components/Combobox.vue\";\nimport { useApi } from \"../lib/api\";\nimport { formatDate, formatEuro } from \"../lib/format\";\nimport { isoWeek } from \"../lib/dates\";\nimport { isDateInRange, MONTH_NAMES, type PeriodMode, resolvePeriodRange, weeksInYear } from \"../lib/period\";\nimport { DEFAULT_SORT, defaultDirFor, type InvoiceSort, queryToState, type SortKey, sortInvoices, stateToQuery } from \"../lib/invoiceListState\";\nimport { useListKeyboard } from \"../lib/useListKeyboard\";\nimport ReminderFormDialog from \"../components/ReminderFormDialog.vue\";\nimport DateInput from \"../components/DateInput.vue\";\n\nconst api = useApi();\n\ntype Invoice = Awaited<ReturnType<typeof api.listInvoices>>[number];\ntype Customer = Awaited<ReturnType<typeof api.listCustomers>>[number];\n\nconst router = useRouter();\nconst route = useRoute();\n\nconst invoices = ref<Invoice[]>([]);\nconst customers = ref<Customer[]>([]);\nconst customerOptions = computed<ComboOption[]>(() => [\n  { id: 0, label: \"Alle klanten\" },\n  ...customers.value.map((customer) => ({ id: customer.id, label: customer.company || customer.contactName || `Klant ${customer.number}`, sub: customer.number })),\n]);\nconst loading = ref(true);\nconst error = ref(\"\");\n\n// Eerste-waarde-record van de route-query (query-waarden kunnen arrays zijn).\nfunction queryRecord(query: typeof route.query): Record<string, string | undefined> {\n  const rec: Record<string, string | undefined> = {};\n  for (const [key, value] of Object.entries(query)) rec[key] = Array.isArray(value) ? (value[0] ?? undefined) : (value ?? undefined);\n  return rec;\n}\n\n// Filters + sortering herstellen uit de URL (refresh-stabiel en deelbaar).\nconst now = new Date();\nconst restored = queryToState(queryRecord(route.query), { year: now.getFullYear(), month: now.getMonth() + 1, week: isoWeek(now) });\nconst urlHadYear = \"jaar\" in queryRecord(route.query);\n\nconst filterCustomer = ref(restored.customerId);\n// const filterStatus = ref<\"all\" | \"open\" | \"paid\">(\"all\");  // statusfilter tijdelijk uit\n\n// Periodefilter: modus + bijbehorende keuze -> datumrange (op factuurdatum).\nconst periodMode = ref<PeriodMode>(restored.period.mode);\nconst selYear = ref(restored.period.year ?? now.getFullYear());\nconst selMonth = ref(restored.period.month ?? now.getMonth() + 1);\nconst selWeek = ref(restored.period.week ?? isoWeek(now));\nconst rangeFrom = ref(restored.period.from ?? \"\");\nconst rangeUntil = ref(restored.period.until ?? \"\");\nconst sort = ref<InvoiceSort>({ ...restored.sort });\n\n// Em-dash als lege-cel-marker zonder een letterlijke em-dash in de bron (no-emdash-hook).\nconst emptyMark = String.fromCharCode(8212);\n\nconst monthOptions = MONTH_NAMES.map((name, i) => ({ value: i + 1, label: name.charAt(0).toUpperCase() + name.slice(1) }));\n\nconst yearOptions = computed<number[]>(() => {\n  const set = new Set<number>(invoices.value.map((i) => i.fiscalYear));\n  set.add(now.getFullYear());\n  set.add(selYear.value);\n  return [...set].sort((a, b) => b - a);\n});\n\nconst weekOptions = computed<number[]>(() => Array.from({ length: weeksInYear(selYear.value) }, (_, i) => i + 1));\n\nconst range = computed(() => resolvePeriodRange({\n  mode: periodMode.value,\n  year: selYear.value,\n  month: selMonth.value,\n  week: selWeek.value,\n  from: rangeFrom.value || undefined,\n  until: rangeUntil.value || undefined,\n}));\n\nconst filteredInvoices = computed<Invoice[]>(() => invoices.value.filter((invoice) => {\n  if (filterCustomer.value && invoice.customerId !== filterCustomer.value) return false;\n  if (!isDateInRange(invoice.date, range.value)) return false;\n  // if (filterStatus.value === \"open\" && invoice.paid) return false;\n  // if (filterStatus.value === \"paid\" && !invoice.paid) return false;\n  return true;\n}));\n\nconst visibleInvoices = computed<Invoice[]>(() => sortInvoices(filteredInvoices.value, sort.value));\n\nconst ZERO = new Money(\"0\");\nconst totalAmount = computed(() => visibleInvoices.value.reduce((sum, i) => Money.add(sum, i.amount), ZERO));\nconst totalMargin = computed(() => visibleInvoices.value.reduce((sum, i) => Money.add(sum, i.margin), ZERO));\n\n// Money is als object altijd truthy: expliciet op 0 toetsen voor de lege-cel-marker.\nfunction hasMargin(invoice: Invoice): boolean {\n  return Money.check(invoice.margin, \"!=\", ZERO);\n}\n\n// Sorteerbare kolommen: klik een kop om te sorteren, nogmaals klikken keert de richting om.\n// De Klant-kolom verschijnt alleen bij \"Alle klanten\"; bij een gekozen klant is die redundant.\ntype Column = { key: SortKey; label: string; width: string; num?: boolean };\nconst columns = computed<Column[]>(() => {\n  const cols: Column[] = [\n    { key: \"date\", label: \"Datum\", width: \"110px\" },\n    { key: \"number\", label: \"Factuurnummer\", width: \"130px\" },\n  ];\n  if (!filterCustomer.value) cols.push({ key: \"customer\", label: \"Klant\", width: \"auto\" });\n  cols.push(\n    { key: \"fiscalYear\", label: \"Fiscaal jaar\", width: \"100px\", num: true },\n    { key: \"amount\", label: \"Declaratie (ex btw)\", width: \"150px\", num: true },\n    { key: \"margin\", label: \"Marge\", width: \"120px\", num: true },\n  );\n  return cols;\n});\n\nfunction toggleSort(key: SortKey): void {\n  sort.value = sort.value.key === key\n    ? { key, dir: sort.value.dir === \"asc\" ? \"desc\" : \"asc\" }\n    : { key, dir: defaultDirFor(key) };\n}\n\nfunction sortIndicator(key: SortKey): string {\n  if (sort.value.key !== key) return \"\";\n  return sort.value.dir === \"asc\" ? \"▲\" : \"▼\"; // ▲ / ▼\n}\n\nfunction ariaSort(key: SortKey): \"ascending\" | \"descending\" | \"none\" {\n  if (sort.value.key !== key) return \"none\";\n  return sort.value.dir === \"asc\" ? \"ascending\" : \"descending\";\n}\n\n// State -> URL spiegelen: filters + sortering blijven behouden bij refresh en zijn deelbaar.\nconst currentState = computed(() => ({\n  customerId: filterCustomer.value,\n  period: {\n    mode: periodMode.value,\n    year: selYear.value,\n    month: selMonth.value,\n    week: selWeek.value,\n    from: rangeFrom.value || undefined,\n    until: rangeUntil.value || undefined,\n  },\n  sort: sort.value,\n}));\n\nfunction sameQuery(a: Record<string, string | undefined>, b: Record<string, string | undefined>): boolean {\n  const aKeys = Object.keys(a);\n  const bKeys = Object.keys(b);\n  return aKeys.length === bKeys.length && aKeys.every((key) => a[key] === b[key]);\n}\n\nwatch(currentState, (state) => {\n  const next = stateToQuery(state);\n  if (!sameQuery(next, queryRecord(route.query))) void router.replace({ query: next });\n});\n\n// Klant-kolom verdwijnt zodra een klant is gekozen; sorteer dan niet meer op klant.\nwatch(filterCustomer, (id) => {\n  if (id && sort.value.key === \"customer\") sort.value = { ...DEFAULT_SORT };\n});\n\n// Verstuurde, nog openstaande fakturen van de geselecteerde klant (de kandidaten\n// voor een betalingsherinnering: je herinnert alleen aan al verzonden fakturen).\nconst openForCustomer = computed(() =>\n  filterCustomer.value ? invoices.value.filter((i) => i.customerId === filterCustomer.value && i.sent && !i.paid).length : 0);\n\nconst { activeIndex } = useListKeyboard({\n  itemCount: () => visibleInvoices.value.length,\n  onNew: goNew,\n  onOpen: (index) => open(visibleInvoices.value[index].id),\n});\n\nfunction open(id: number): void {\n  void router.push({ name: \"fakturen-detail\", params: { id: String(id) } });\n}\n\nfunction goNew(): void {\n  void router.push({ name: \"fakturen-nieuw\" });\n}\n\nconst statementTarget = computed(() => ({ name: \"fakturen-overzicht\", query: filterCustomer.value ? { klant: String(filterCustomer.value) } : {} }));\n\nfunction onStatementKey(event: KeyboardEvent): void {\n  const el = document.activeElement as HTMLElement | null;\n  const typing = el && (el.tagName === \"INPUT\" || el.tagName === \"TEXTAREA\" || el.tagName === \"SELECT\" || el.isContentEditable);\n  if (event.key !== \"o\" || typing || event.metaKey || event.ctrlKey || event.altKey || document.querySelector(\".dialog-backdrop\")) return;\n  event.preventDefault();\n  void router.push(statementTarget.value);\n}\nonMounted(() => window.addEventListener(\"keydown\", onStatementKey));\nonBeforeUnmount(() => window.removeEventListener(\"keydown\", onStatementKey));\n\nconst reminderCreateOpen = ref(false);\n\nfunction openReminder(): void {\n  if (!filterCustomer.value || openForCustomer.value === 0) return;\n  reminderCreateOpen.value = true;\n}\n\nfunction onReminderCreated(id: number): void {\n  reminderCreateOpen.value = false;\n  void router.push({ name: \"herinneringen-detail\", params: { id: String(id) } });\n}\n\nonMounted(async () => {\n  try {\n    const [invoiceRows, customerRows] = await Promise.all([api.listInvoices(), api.listCustomers()]);\n    invoices.value = invoiceRows;\n    customers.value = customerRows;\n    const presentYears = invoiceRows.map((i) => i.fiscalYear);\n    // Nieuwste jaar als voorkeuze, maar een via de URL vastgezet jaar niet overschrijven.\n    if (!urlHadYear && presentYears.length) selYear.value = Math.max(...presentYears);\n  } catch {\n    error.value = \"Kon de facturen niet laden.\";\n  } finally {\n    loading.value = false;\n  }\n});\n</script>\n\n<style scoped>\n.inv__actions {\n  display: flex;\n  gap: 8px;\n}\n.combo { min-width: 240px; }\n.inv__filters {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: flex-end;\n  gap: 14px;\n  padding: 14px 18px;\n  margin-bottom: 14px;\n}\n.inv__f {\n  display: flex;\n  flex-direction: column;\n  gap: 4px;\n  font-size: 12.5px;\n  font-weight: 600;\n  color: var(--hh-fg-muted);\n}\n.inv__f .hh-select {\n  min-width: 160px;\n}\n.inv__f .inv__date {\n  width: 170px;\n  min-width: 150px;\n}\n.inv__spacer {\n  flex: 1;\n}\n.inv__total td {\n  font-weight: 700;\n  border-top: 2px solid var(--hh-line-strong);\n}\n\n/* Sorteerbare kolomkoppen. */\n.hh-table thead th.inv__th {\n  cursor: pointer;\n  user-select: none;\n}\n.hh-table thead th.inv__th:hover {\n  color: var(--hh-fg);\n}\n.hh-table thead th.inv__th.is-sorted {\n  color: var(--hh-fg);\n}\n/* Num-koppen (declaratie + marge) rechts uitlijnen; wint van de globale thead-th left-align. */\n.hh-table thead th.inv__th.hh-table__num {\n  text-align: right;\n}\n.inv__sortarrow {\n  display: inline-block;\n  width: 0.9em;\n  margin-left: 4px;\n  font-size: 0.8em;\n  color: var(--hh-accent);\n}\n</style>\n","import { createElementVNode as _createElementVNode, createTextVNode as _createTextVNode, withCtx as _withCtx, createVNode as _createVNode, vModelSelect as _vModelSelect, withDirectives as _withDirectives, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, toDisplayString as _toDisplayString, createCommentVNode as _createCommentVNode, createBlock as _createBlock, normalizeClass as _normalizeClass, normalizeStyle as _normalizeStyle, createStaticVNode as _createStaticVNode } from \"vue\"\n\nconst _hoisted_1 = { class: \"hh-page__bar\" }\nconst _hoisted_2 = { class: \"inv__actions\" }\nconst _hoisted_3 = { class: \"hh-card inv__filters\" }\nconst _hoisted_4 = { class: \"inv__f\" }\nconst _hoisted_5 = { class: \"inv__f\" }\nconst _hoisted_6 = {\n  key: 0,\n  class: \"inv__f\"\n}\nconst _hoisted_7 = [\"value\"]\nconst _hoisted_8 = { class: \"inv__f\" }\nconst _hoisted_9 = [\"value\"]\nconst _hoisted_10 = { class: \"inv__f\" }\nconst _hoisted_11 = [\"value\"]\nconst _hoisted_12 = { class: \"inv__f\" }\nconst _hoisted_13 = [\"value\"]\nconst _hoisted_14 = { class: \"inv__f\" }\nconst _hoisted_15 = [\"value\"]\nconst _hoisted_16 = { class: \"inv__f\" }\nconst _hoisted_17 = { class: \"inv__f\" }\nconst _hoisted_18 = [\"disabled\", \"title\"]\nconst _hoisted_19 = {\n  key: 1,\n  class: \"hh-formerror\"\n}\nconst _hoisted_20 = { class: \"hh-card\" }\nconst _hoisted_21 = {\n  key: 0,\n  class: \"hh-empty\"\n}\nconst _hoisted_22 = {\n  key: 1,\n  class: \"hh-empty\"\n}\nconst _hoisted_23 = {\n  key: 2,\n  class: \"hh-table\"\n}\nconst _hoisted_24 = [\"aria-sort\", \"onClick\"]\nconst _hoisted_25 = {\n  class: \"inv__sortarrow\",\n  \"aria-hidden\": \"true\"\n}\nconst _hoisted_26 = [\"data-list-row\", \"onClick\"]\nconst _hoisted_27 = { class: \"hh-table__code\" }\nconst _hoisted_28 = { key: 0 }\nconst _hoisted_29 = { class: \"hh-table__num\" }\nconst _hoisted_30 = { class: \"hh-table__num\" }\nconst _hoisted_31 = { class: \"hh-table__num\" }\nconst _hoisted_32 = { class: \"inv__total\" }\nconst _hoisted_33 = [\"colspan\"]\nconst _hoisted_34 = { class: \"hh-table__num\" }\nconst _hoisted_35 = { class: \"hh-table__num\" }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return (_openBlock(), _createElementBlock(\"section\", null, [\n    _createElementVNode(\"div\", _hoisted_1, [\n      _cache[12] || (_cache[12] = _createElementVNode(\"div\", null, [\n        _createElementVNode(\"h1\", { class: \"hh-page__title\" }, \"Facturen\"),\n        _createElementVNode(\"p\", { class: \"hh-page__sub\" }, [\n          _createTextVNode(\"Klik een factuur voor de printweergave en betalingsregistratie. Druk op \"),\n          _createElementVNode(\"kbd\", null, \"n\"),\n          _createTextVNode(\" voor een nieuwe, \"),\n          _createElementVNode(\"kbd\", null, \"o\"),\n          _createTextVNode(\" voor het overzicht fakturen/uren.\")\n        ])\n      ], -1 /* CACHED */)),\n      _createElementVNode(\"div\", _hoisted_2, [\n        _createVNode($setup[\"RouterLink\"], {\n          class: \"hh-btn\",\n          to: $setup.statementTarget\n        }, {\n          default: _withCtx(() => _cache[10] || (_cache[10] = [\n            _createTextVNode(\"Overzicht fakturen/uren\", -1 /* CACHED */)\n          ])),\n          _: 1 /* STABLE */,\n          __: [10]\n        }, 8 /* PROPS */, [\"to\"]),\n        _createVNode($setup[\"RouterLink\"], {\n          class: \"hh-btn hh-btn--primary\",\n          to: { name: 'fakturen-nieuw' }\n        }, {\n          default: _withCtx(() => _cache[11] || (_cache[11] = [\n            _createTextVNode(\"+ Nieuwe factuur\", -1 /* CACHED */)\n          ])),\n          _: 1 /* STABLE */,\n          __: [11]\n        })\n      ])\n    ]),\n    _createElementVNode(\"div\", _hoisted_3, [\n      _createElementVNode(\"label\", _hoisted_4, [\n        _cache[13] || (_cache[13] = _createTextVNode(\"Klant \", -1 /* CACHED */)),\n        _createVNode($setup[\"Combobox\"], {\n          \"model-value\": $setup.filterCustomer,\n          options: $setup.customerOptions,\n          \"aria-label\": \"Klant\",\n          placeholder: \"Nummer of naam…\",\n          \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => ($setup.filterCustomer = $event ?? 0))\n        }, null, 8 /* PROPS */, [\"model-value\", \"options\"])\n      ]),\n      _createElementVNode(\"label\", _hoisted_5, [\n        _cache[15] || (_cache[15] = _createTextVNode(\"Periode \", -1 /* CACHED */)),\n        _withDirectives(_createElementVNode(\"select\", {\n          \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => (($setup.periodMode) = $event)),\n          class: \"hh-select\"\n        }, _cache[14] || (_cache[14] = [\n          _createStaticVNode(\"<option value=\\\"all\\\" data-v-1300ea33>Alles</option><option value=\\\"year\\\" data-v-1300ea33>Jaar</option><option value=\\\"month\\\" data-v-1300ea33>Maand</option><option value=\\\"week\\\" data-v-1300ea33>Week</option><option value=\\\"range\\\" data-v-1300ea33>Periode</option>\", 5)\n        ]), 512 /* NEED_PATCH */), [\n          [_vModelSelect, $setup.periodMode]\n        ])\n      ]),\n      ($setup.periodMode === 'year')\n        ? (_openBlock(), _createElementBlock(\"label\", _hoisted_6, [\n            _cache[16] || (_cache[16] = _createTextVNode(\"Jaar \", -1 /* CACHED */)),\n            _withDirectives(_createElementVNode(\"select\", {\n              \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => (($setup.selYear) = $event)),\n              class: \"hh-select\"\n            }, [\n              (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.yearOptions, (y) => {\n                return (_openBlock(), _createElementBlock(\"option\", {\n                  key: y,\n                  value: y\n                }, _toDisplayString(y), 9 /* TEXT, PROPS */, _hoisted_7))\n              }), 128 /* KEYED_FRAGMENT */))\n            ], 512 /* NEED_PATCH */), [\n              [\n                _vModelSelect,\n                $setup.selYear,\n                void 0,\n                { number: true }\n              ]\n            ])\n          ]))\n        : _createCommentVNode(\"v-if\", true),\n      ($setup.periodMode === 'month')\n        ? (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n            _createElementVNode(\"label\", _hoisted_8, [\n              _cache[17] || (_cache[17] = _createTextVNode(\"Maand \", -1 /* CACHED */)),\n              _withDirectives(_createElementVNode(\"select\", {\n                \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => (($setup.selMonth) = $event)),\n                class: \"hh-select\"\n              }, [\n                (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.monthOptions, (m) => {\n                  return (_openBlock(), _createElementBlock(\"option\", {\n                    key: m.value,\n                    value: m.value\n                  }, _toDisplayString(m.label), 9 /* TEXT, PROPS */, _hoisted_9))\n                }), 128 /* KEYED_FRAGMENT */))\n              ], 512 /* NEED_PATCH */), [\n                [\n                  _vModelSelect,\n                  $setup.selMonth,\n                  void 0,\n                  { number: true }\n                ]\n              ])\n            ]),\n            _createElementVNode(\"label\", _hoisted_10, [\n              _cache[18] || (_cache[18] = _createTextVNode(\"Jaar \", -1 /* CACHED */)),\n              _withDirectives(_createElementVNode(\"select\", {\n                \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => (($setup.selYear) = $event)),\n                class: \"hh-select\"\n              }, [\n                (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.yearOptions, (y) => {\n                  return (_openBlock(), _createElementBlock(\"option\", {\n                    key: y,\n                    value: y\n                  }, _toDisplayString(y), 9 /* TEXT, PROPS */, _hoisted_11))\n                }), 128 /* KEYED_FRAGMENT */))\n              ], 512 /* NEED_PATCH */), [\n                [\n                  _vModelSelect,\n                  $setup.selYear,\n                  void 0,\n                  { number: true }\n                ]\n              ])\n            ])\n          ], 64 /* STABLE_FRAGMENT */))\n        : _createCommentVNode(\"v-if\", true),\n      ($setup.periodMode === 'week')\n        ? (_openBlock(), _createElementBlock(_Fragment, { key: 2 }, [\n            _createElementVNode(\"label\", _hoisted_12, [\n              _cache[19] || (_cache[19] = _createTextVNode(\"Week \", -1 /* CACHED */)),\n              _withDirectives(_createElementVNode(\"select\", {\n                \"onUpdate:modelValue\": _cache[5] || (_cache[5] = $event => (($setup.selWeek) = $event)),\n                class: \"hh-select\"\n              }, [\n                (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.weekOptions, (w) => {\n                  return (_openBlock(), _createElementBlock(\"option\", {\n                    key: w,\n                    value: w\n                  }, \"week \" + _toDisplayString(w), 9 /* TEXT, PROPS */, _hoisted_13))\n                }), 128 /* KEYED_FRAGMENT */))\n              ], 512 /* NEED_PATCH */), [\n                [\n                  _vModelSelect,\n                  $setup.selWeek,\n                  void 0,\n                  { number: true }\n                ]\n              ])\n            ]),\n            _createElementVNode(\"label\", _hoisted_14, [\n              _cache[20] || (_cache[20] = _createTextVNode(\"Jaar \", -1 /* CACHED */)),\n              _withDirectives(_createElementVNode(\"select\", {\n                \"onUpdate:modelValue\": _cache[6] || (_cache[6] = $event => (($setup.selYear) = $event)),\n                class: \"hh-select\"\n              }, [\n                (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.yearOptions, (y) => {\n                  return (_openBlock(), _createElementBlock(\"option\", {\n                    key: y,\n                    value: y\n                  }, _toDisplayString(y), 9 /* TEXT, PROPS */, _hoisted_15))\n                }), 128 /* KEYED_FRAGMENT */))\n              ], 512 /* NEED_PATCH */), [\n                [\n                  _vModelSelect,\n                  $setup.selYear,\n                  void 0,\n                  { number: true }\n                ]\n              ])\n            ])\n          ], 64 /* STABLE_FRAGMENT */))\n        : _createCommentVNode(\"v-if\", true),\n      ($setup.periodMode === 'range')\n        ? (_openBlock(), _createElementBlock(_Fragment, { key: 3 }, [\n            _createElementVNode(\"div\", _hoisted_16, [\n              _cache[21] || (_cache[21] = _createElementVNode(\"label\", { for: \"inv-from\" }, \"Van\", -1 /* CACHED */)),\n              _createVNode($setup[\"DateInput\"], {\n                id: \"inv-from\",\n                modelValue: $setup.rangeFrom,\n                \"onUpdate:modelValue\": _cache[7] || (_cache[7] = $event => (($setup.rangeFrom) = $event)),\n                class: \"inv__date\",\n                required: false\n              }, null, 8 /* PROPS */, [\"modelValue\"])\n            ]),\n            _createElementVNode(\"div\", _hoisted_17, [\n              _cache[22] || (_cache[22] = _createElementVNode(\"label\", { for: \"inv-until\" }, \"Tot\", -1 /* CACHED */)),\n              _createVNode($setup[\"DateInput\"], {\n                id: \"inv-until\",\n                modelValue: $setup.rangeUntil,\n                \"onUpdate:modelValue\": _cache[8] || (_cache[8] = $event => (($setup.rangeUntil) = $event)),\n                class: \"inv__date\",\n                required: false\n              }, null, 8 /* PROPS */, [\"modelValue\"])\n            ])\n          ], 64 /* STABLE_FRAGMENT */))\n        : _createCommentVNode(\"v-if\", true),\n      _createCommentVNode(\" Statusfilter tijdelijk verborgen (op verzoek): geen filter, geen kolom.\\n      <label class=\\\"inv__f\\\">Status\\n        <select v-model=\\\"filterStatus\\\" class=\\\"hh-select\\\">\\n          <option value=\\\"all\\\">Alle</option>\\n          <option value=\\\"open\\\">Openstaand</option>\\n          <option value=\\\"paid\\\">Betaald</option>\\n        </select>\\n      </label>\\n      \"),\n      _cache[23] || (_cache[23] = _createElementVNode(\"div\", { class: \"inv__spacer\" }, null, -1 /* CACHED */)),\n      ($setup.filterCustomer)\n        ? (_openBlock(), _createElementBlock(\"button\", {\n            key: 4,\n            class: \"hh-btn\",\n            type: \"button\",\n            disabled: $setup.openForCustomer === 0,\n            title: $setup.openForCustomer === 0 ? 'Geen verstuurde openstaande facturen voor deze klant' : '',\n            onClick: $setup.openReminder\n          }, \"Betalingsherinnering (\" + _toDisplayString($setup.openForCustomer) + \")\", 9 /* TEXT, PROPS */, _hoisted_18))\n        : _createCommentVNode(\"v-if\", true)\n    ]),\n    ($setup.reminderCreateOpen && $setup.filterCustomer)\n      ? (_openBlock(), _createBlock($setup[\"ReminderFormDialog\"], {\n          key: 0,\n          \"customer-id\": $setup.filterCustomer,\n          onClose: _cache[9] || (_cache[9] = $event => ($setup.reminderCreateOpen = false)),\n          onSaved: $setup.onReminderCreated\n        }, null, 8 /* PROPS */, [\"customer-id\"]))\n      : _createCommentVNode(\"v-if\", true),\n    ($setup.error)\n      ? (_openBlock(), _createElementBlock(\"p\", _hoisted_19, _toDisplayString($setup.error), 1 /* TEXT */))\n      : _createCommentVNode(\"v-if\", true),\n    _createElementVNode(\"div\", _hoisted_20, [\n      ($setup.loading)\n        ? (_openBlock(), _createElementBlock(\"div\", _hoisted_21, \"Laden…\"))\n        : ($setup.visibleInvoices.length === 0)\n          ? (_openBlock(), _createElementBlock(\"p\", _hoisted_22, \"Geen facturen voor deze selectie.\"))\n          : (_openBlock(), _createElementBlock(\"table\", _hoisted_23, [\n              _createElementVNode(\"thead\", null, [\n                _createElementVNode(\"tr\", null, [\n                  (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.columns, (col) => {\n                    return (_openBlock(), _createElementBlock(\"th\", {\n                      key: col.key,\n                      class: _normalizeClass(['inv__th', { 'hh-table__num': col.num, 'is-sorted': $setup.sort.key === col.key }]),\n                      style: _normalizeStyle({ width: col.width }),\n                      \"aria-sort\": $setup.ariaSort(col.key),\n                      onClick: $event => ($setup.toggleSort(col.key))\n                    }, [\n                      _createTextVNode(_toDisplayString(col.label), 1 /* TEXT */),\n                      _createElementVNode(\"span\", _hoisted_25, _toDisplayString($setup.sortIndicator(col.key)), 1 /* TEXT */)\n                    ], 14 /* CLASS, STYLE, PROPS */, _hoisted_24))\n                  }), 128 /* KEYED_FRAGMENT */)),\n                  _createCommentVNode(\" Soort- en Status-kolom verwijderd/verborgen op verzoek. \")\n                ])\n              ]),\n              _createElementVNode(\"tbody\", null, [\n                (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.visibleInvoices, (invoice, index) => {\n                  return (_openBlock(), _createElementBlock(\"tr\", {\n                    key: invoice.id,\n                    \"data-list-row\": index,\n                    class: _normalizeClass([\"is-clickable\", { 'is-active': index === $setup.activeIndex }]),\n                    onClick: $event => ($setup.open(invoice.id))\n                  }, [\n                    _createElementVNode(\"td\", null, _toDisplayString($setup.formatDate(invoice.date)), 1 /* TEXT */),\n                    _createElementVNode(\"td\", _hoisted_27, _toDisplayString(invoice.number), 1 /* TEXT */),\n                    (!$setup.filterCustomer)\n                      ? (_openBlock(), _createElementBlock(\"td\", _hoisted_28, _toDisplayString(invoice.customerTitle || $setup.emptyMark), 1 /* TEXT */))\n                      : _createCommentVNode(\"v-if\", true),\n                    _createElementVNode(\"td\", _hoisted_29, _toDisplayString(invoice.fiscalYear), 1 /* TEXT */),\n                    _createElementVNode(\"td\", _hoisted_30, _toDisplayString($setup.formatEuro(invoice.amount)), 1 /* TEXT */),\n                    _createElementVNode(\"td\", _hoisted_31, _toDisplayString($setup.hasMargin(invoice) ? $setup.formatEuro(invoice.margin) : $setup.emptyMark), 1 /* TEXT */)\n                  ], 10 /* CLASS, PROPS */, _hoisted_26))\n                }), 128 /* KEYED_FRAGMENT */))\n              ]),\n              _createElementVNode(\"tfoot\", null, [\n                _createElementVNode(\"tr\", _hoisted_32, [\n                  _createElementVNode(\"td\", {\n                    colspan: $setup.filterCustomer ? 3 : 4\n                  }, \"Totaal (\" + _toDisplayString($setup.visibleInvoices.length) + \" facturen)\", 9 /* TEXT, PROPS */, _hoisted_33),\n                  _createElementVNode(\"td\", _hoisted_34, _toDisplayString($setup.formatEuro($setup.totalAmount)), 1 /* TEXT */),\n                  _createElementVNode(\"td\", _hoisted_35, _toDisplayString($setup.totalMargin ? $setup.formatEuro($setup.totalMargin) : $setup.emptyMark), 1 /* TEXT */)\n                ])\n              ])\n            ]))\n    ])\n  ]))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/InvoicesView.vue?type=script\";import \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/InvoicesView.vue?type=style&index=0\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/InvoicesView.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/InvoicesView.vue\";script.__scopeId = \"data-v-1300ea33\";export default script;","// Faktuur-preview-logica (NL). Pure functies op Money (exact decimaal), zodat de\n// previews in de frontend byte-voor-byte reconciliëren met de server-berekening.\n// De btw/marge-kern komt rechtstreeks uit js/internal/domain.ts (pure kernel,\n// geen DB-imports): één waarheid voor client én server. Unit-testbaar via\n// `wh runtest` (tests/frontend-logic.test.ts).\n\nimport { Money } from \"@webhare/std\";\nimport { amountInclVat, suggestMargin as domainSuggestMargin, vatAmount } from \"../../../../js/internal/domain\";\n\nconst ZERO = new Money(\"0\");\n\n/**\n * Btw-bedrag en bedrag inclusief btw over een bedrag exclusief btw. Exact\n * decimaal, commercieel afgerond op centen (identiek aan de server: domain.ts).\n *\n * @param input - Bedrag exclusief btw en btw-percentage (bv. 21)\n */\nexport function vatBreakdown(input: { amountExcl: Money; vatRate: Money }): { vat: Money; inclVat: Money } {\n  return {\n    vat: vatAmount(input.amountExcl, input.vatRate),\n    inclVat: amountInclVat(input.amountExcl, input.vatRate),\n  };\n}\n\n/**\n * Marge-suggestie: declareer je meer dan er nog te declareren staat, dan wordt\n * het verschil als marge voorgesteld (V_Marge in het origineel). Anders 0.\n *\n * @param input - Het in te voeren declaratiebedrag en het huidige \"nog te declareren\"-saldo\n */\nexport function suggestMargin(input: { declareAmount: Money; toDeclare: Money }): Money {\n  return domainSuggestMargin(input.declareAmount, input.toDeclare);\n}\n\n/**\n * Opslaginformatie voor het te factureren bedrag t.o.v. de getelde kosten\n * (\"nog te declareren\"). Het verschil (deltaEuro) is exact (Money); het\n * percentage is puur ter indicatie en wordt bewust als number teruggegeven\n * (weergave, geen geldbedrag). Basis nul -> percentage 0 (geen deling door nul).\n *\n * @param input - Het in te voeren bedrag en de getelde kosten (\"nog te declareren\")\n */\nexport function upliftInfo(input: { amount: Money; toDeclare: Money }): { deltaEuro: Money; deltaPct: number } {\n  const deltaEuro = Money.subtract(input.amount, input.toDeclare);\n  const base = input.toDeclare.toNumber();\n  const deltaPct = base === 0 ? 0 : (deltaEuro.toNumber() / base) * 100;\n  return { deltaEuro, deltaPct };\n}\n\n/**\n * Parseert een door de gebruiker ingevoerd bedrag (\"12,50\" of \"12.50\") naar\n * Money, of null als het formaat niet klopt. Randspaties worden getrimd.\n *\n * @param input - De ruwe invoerstring\n */\nexport function parseAmount(input: string): Money | null {\n  const trimmed = input.trim();\n  if (!/^-?\\d+([.,]\\d+)?$/.test(trimmed)) return null;\n  try {\n    return new Money(trimmed.replace(\",\", \".\"));\n  } catch {\n    return null; // buiten het veilige bereik van Money\n  }\n}\n\n/**\n * Totaal van openstaande bedragen (betalingsherinnering), exact opgeteld.\n *\n * @param amounts - De openstaande bedragen incl. btw\n */\nexport function sumOpen(amounts: Money[]): Money {\n  return amounts.reduce((total, amount) => Money.add(total, amount), ZERO);\n}\n","<template>\n  <section>\n    <div class=\"hh-page__bar\">\n      <div>\n        <h1 class=\"hh-page__title\">{{ pageTitle }}</h1>\n        <p class=\"hh-page__sub\">{{ pageSub }}</p>\n      </div>\n      <button class=\"hh-btn\" type=\"button\" @click=\"requestLeave\">{{ editBlocked ? \"Terug\" : \"Annuleren\" }}</button>\n    </div>\n\n    <p v-if=\"loadError\" class=\"hh-formerror\">{{ loadError }}</p>\n\n    <div v-if=\"!editBlocked\" class=\"wz__cols\">\n      <div class=\"wz__form\">\n        <!-- 1. Klant en jaar -->\n        <section class=\"hh-card wz__panel\">\n          <h2 class=\"wz__ptitle\">1 · Klant en jaar</h2>\n          <div class=\"wz__grid\">\n            <FormField label=\"Klant\" for-id=\"wz-customer\" required :error=\"fieldErrors.customer\">\n              <Combobox\n                ref=\"customerCombo\"\n                v-model=\"customerId\"\n                :options=\"customerOptions\"\n                :error=\"Boolean(fieldErrors.customer)\"\n                placeholder=\"Nummer of naam…\"\n              />\n            </FormField>\n            <FormField label=\"Factuurdatum\" for-id=\"wz-date\" required>\n              <DateInput id=\"wz-date\" ref=\"dateInput\" v-model=\"invoiceDate\" :disabled=\"saving\" @update:model-value=\"onDateChange\" />\n            </FormField>\n            <FormField label=\"Boekjaar\" for-id=\"wz-year\" required :error=\"fieldErrors.year\">\n              <input\n                id=\"wz-year\"\n                v-model=\"fiscalYearInput\"\n                class=\"hh-input hh-input--num\"\n                inputmode=\"numeric\"\n                :class=\"{ 'hh-input--error': fieldErrors.year }\"\n                @input=\"yearTouched = true\"\n                @blur=\"onYearBlur\"\n              />\n            </FormField>\n          </div>\n        </section>\n\n        <!-- 2. Te factureren -->\n        <section class=\"hh-card wz__panel\">\n          <h2 class=\"wz__ptitle\">2 · Te factureren</h2>\n          <p v-if=\"tellen\" class=\"wz__base\">Nog te declareren: <strong>{{ formatEuro(tellen.toDeclare) }}</strong></p>\n          <FormField label=\"Te factureren (€, excl. btw)\" for-id=\"wz-amount\" required :error=\"fieldErrors.amount\" :hint=\"upliftText\">\n            <input\n              id=\"wz-amount\"\n              v-model.trim=\"amount\"\n              class=\"hh-input hh-input--num\"\n              inputmode=\"decimal\"\n              placeholder=\"0,00\"\n              :class=\"{ 'hh-input--error': fieldErrors.amount }\"\n              @input=\"amountTouched = true\"\n            />\n          </FormField>\n        </section>\n\n        <!-- 3. Tekstregels -->\n        <section class=\"hh-card wz__panel\">\n          <div class=\"wz__phead\">\n            <h2 class=\"wz__ptitle\">3 · Tekstregels</h2>\n            <span class=\"hh-muted wz__count\">{{ usedTextLines }}/{{ MAX_TEXT_LINES }} regels</span>\n          </div>\n          <div v-if=\"invoiceTexts.length\" class=\"wz__textpicker\">\n            <FormField label=\"Vaste omschrijving\" for-id=\"wz-text-choice\">\n              <Combobox id=\"wz-text-choice\" v-model=\"selectedInvoiceText\" :options=\"invoiceTextOptions\" placeholder=\"Zoek een omschrijving…\" :disabled=\"saving\" />\n            </FormField>\n            <button class=\"hh-btn\" type=\"button\" :disabled=\"saving || selectedInvoiceText === null\" @click=\"appendInvoiceText\">Toevoegen</button>\n          </div>\n          <textarea\n            v-model=\"textBlock\"\n            class=\"hh-input wz__textarea\"\n            :class=\"{ 'hh-input--error': fieldErrors.text }\"\n            rows=\"6\"\n            placeholder=\"Honorarium voor verrichte werkzaamheden inzake…\"\n          ></textarea>\n          <p v-if=\"fieldErrors.text\" class=\"hh-formerror wz__texterror\">{{ fieldErrors.text }}</p>\n        </section>\n\n        <!-- 4. Type en adressering -->\n        <section class=\"hh-card wz__panel\">\n          <h2 class=\"wz__ptitle\">4 · Soort factuur</h2>\n          <div class=\"wz__radios\">\n            <label v-for=\"opt in TYPE_OPTIONS\" :key=\"opt.value\" class=\"wz__radio\">\n              <input v-model=\"invoiceType\" type=\"radio\" name=\"invoiceType\" :value=\"opt.value\" />\n              <span><strong>{{ opt.label }}</strong><br /><span class=\"hh-muted\">{{ opt.hint }}</span></span>\n            </label>\n          </div>\n\n          <label class=\"wz__alttoggle\">\n            <input v-model=\"altAddressEnabled\" type=\"checkbox\" /> Afwijkend adres (factureren aan derde)\n          </label>\n\n          <div v-if=\"altAddressEnabled\" class=\"wz__alt\">\n            <FormField label=\"Naam / t.a.v.\" for-id=\"wz-alt-name\">\n              <input id=\"wz-alt-name\" v-model.trim=\"altName\" class=\"hh-input\" placeholder=\"Bedrijfs- of persoonsnaam\" />\n            </FormField>\n            <div class=\"wz__altrow\">\n              <FormField label=\"Postcode\" for-id=\"wz-alt-zip\">\n                <input id=\"wz-alt-zip\" v-model.trim=\"altZip\" class=\"hh-input\" placeholder=\"1234 AB\" autocomplete=\"off\" @blur=\"lookupAlt\" />\n              </FormField>\n              <FormField label=\"Huisnummer\" for-id=\"wz-alt-houseno\">\n                <input id=\"wz-alt-houseno\" v-model.trim=\"altHouseNo\" class=\"hh-input\" placeholder=\"12\" autocomplete=\"off\" @blur=\"lookupAlt\" />\n              </FormField>\n            </div>\n            <div class=\"wz__altrow\">\n              <FormField label=\"Straat\" for-id=\"wz-alt-street\">\n                <input id=\"wz-alt-street\" v-model.trim=\"altStreet\" class=\"hh-input\" placeholder=\"Wordt opgehaald via de postcode\" />\n              </FormField>\n              <FormField label=\"Plaats\" for-id=\"wz-alt-city\">\n                <input id=\"wz-alt-city\" v-model.trim=\"altCity\" class=\"hh-input\" placeholder=\"Wordt opgehaald via de postcode\" />\n              </FormField>\n            </div>\n            <p v-if=\"altLookupText\" class=\"wz__altstatus\" :class=\"{ 'wz__altstatus--err': altLookupState === 'notfound' || altLookupState === 'error' }\">\n              {{ altLookupText }}\n            </p>\n          </div>\n        </section>\n      </div>\n\n      <!-- Samenvatting + verwerken -->\n      <aside class=\"wz__aside\">\n        <div class=\"hh-card wz__summary\">\n          <h2 class=\"wz__ptitle\">Samenvatting</h2>\n\n          <template v-if=\"!customerId || !validYear\">\n            <p class=\"hh-muted\">Kies eerst een klant en boekjaar.</p>\n          </template>\n          <template v-else-if=\"tellenLoading\">\n            <p class=\"hh-muted\">Tellen…</p>\n          </template>\n          <template v-else-if=\"tellen\">\n            <dl class=\"wz__dl\">\n              <div><dt>{{ isEdit ? \"Nummer\" : \"Volgend nummer\" }}</dt><dd class=\"wz__mono\">{{ displayNumber || \"…\" }}</dd></div>\n              <div><dt>Kosten (uren + verschotten)</dt><dd>{{ formatEuro(tellen.totalCosts) }}</dd></div>\n              <div><dt>Al gedeclareerd</dt><dd>{{ formatEuro(tellen.declared) }}</dd></div>\n              <div><dt>Nog te declareren</dt><dd :class=\"{ 'wz__neg': isNegative(tellen.toDeclare) }\">{{ formatEuro(tellen.toDeclare) }}</dd></div>\n            </dl>\n\n            <div class=\"wz__afterhead\">Na deze factuur</div>\n            <dl class=\"wz__dl\">\n              <div><dt>Bedrag excl. btw</dt><dd>{{ formatEuro(amountNum) }}</dd></div>\n              <div><dt>Btw ({{ vatNum }}%)</dt><dd>{{ formatEuro(vat.vat) }}</dd></div>\n              <div class=\"wz__strong\"><dt>Incl. btw</dt><dd>{{ formatEuro(vat.inclVat) }}</dd></div>\n              <div><dt>Marge</dt><dd>{{ formatEuro(marginNum) }}</dd></div>\n              <div><dt>Nog te declareren daarna</dt><dd :class=\"{ 'wz__neg': isNegative(newToDeclare) }\">{{ formatEuro(newToDeclare) }}</dd></div>\n            </dl>\n          </template>\n          <p v-if=\"tellenError\" class=\"hh-formerror\">{{ tellenError }}</p>\n\n          <p v-if=\"submitError\" class=\"hh-formerror wz__submiterror\">{{ submitError }}</p>\n\n          <button class=\"hh-btn hh-btn--primary wz__submit\" type=\"button\" :disabled=\"saving\" @click=\"submit\">\n            {{ saving ? (isEdit ? \"Opslaan…\" : \"Verwerken…\") : (isEdit ? \"Wijzigingen opslaan\" : \"Verwerk deze factuur\") }}\n          </button>\n        </div>\n      </aside>\n    </div>\n\n    <!-- Esc / Annuleren met niet-opgeslagen invoer. -->\n    <AppDialog v-if=\"leaveConfirmOpen\" title=\"Factuur niet opgeslagen\" @close=\"leaveConfirmOpen = false\">\n      <p>Je hebt gegevens ingevuld die nog niet zijn verwerkt. Weet je zeker dat je terug wilt naar het overzicht?</p>\n      <template #footer>\n        <button class=\"hh-btn\" type=\"button\" data-autofocus @click=\"leaveConfirmOpen = false\">Blijf hier</button>\n        <button class=\"hh-btn hh-btn--danger\" type=\"button\" @click=\"goBack\">Terug naar overzicht</button>\n      </template>\n    </AppDialog>\n  </section>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, nextTick, onBeforeUnmount, onMounted, reactive, ref, watch } from \"vue\";\nimport { useRoute, useRouter } from \"vue-router\";\nimport { Money } from \"@webhare/std\";\nimport { useOrganizationDirty } from \"../lib/organization\";\nimport { useApi } from \"../lib/api\";\nimport { formatEuro } from \"../lib/format\";\nimport { expandFiscalYear, fiscalYearOf, todayISODate } from \"../lib/dates\";\nimport { parseAmount, suggestMargin, upliftInfo, vatBreakdown } from \"../lib/invoicing\";\nimport Combobox, { type ComboOption } from \"../components/Combobox.vue\";\nimport FormField from \"../components/FormField.vue\";\nimport AppDialog from \"../components/AppDialog.vue\";\nimport DateInput from \"../components/DateInput.vue\";\n\nconst api = useApi();\n\ntype Customer = Awaited<ReturnType<typeof api.listCustomers>>[number];\ntype Tellen = Awaited<ReturnType<typeof api.tellen>>;\ntype Invoice = NonNullable<Awaited<ReturnType<typeof api.getInvoice>>>;\ntype InvoiceType = \"with_advances\" | \"standalone\" | \"isolated\";\n\nconst MAX_TEXT_LINES = 12;\n\nconst TYPE_OPTIONS: Array<{ value: InvoiceType; label: string; hint: string }> = [\n  { value: \"standalone\", label: \"Losse factuur\", hint: \"Een gewone declaratie zonder voorschotverrekening.\" },\n  { value: \"with_advances\", label: \"Met voorschot\", hint: \"Verrekent eerdere facturen van dit jaar als voorschot.\" },\n  { value: \"isolated\", label: \"Geïsoleerd\", hint: \"Telt niet mee in de voorschotverrekening.\" },\n];\n\nconst router = useRouter();\nconst route = useRoute();\n\n// Bewerk-modus: dezelfde wizard, maar met een geladen faktuur (route /:id/bewerken).\nconst editId = computed<number | null>(() => (route.params.id ? Number(route.params.id) : null));\nconst isEdit = computed(() => editId.value !== null);\nconst originalInvoice = ref<Invoice | null>(null);\nconst editBlocked = ref(false);\n\nconst pageTitle = computed(() => (isEdit.value ? \"Factuur bewerken\" : \"Nieuwe factuur\"));\nconst pageSub = computed(() => (isEdit.value\n  ? \"Pas de factuurgegevens aan. Dit kan zolang de factuur nog niet is verzonden.\"\n  : \"Kies klant en jaar; Happy Hours telt en stelt het te factureren bedrag en nummer voor.\"));\n\nconst customers = ref<Customer[]>([]);\nconst loadError = ref(\"\");\nconst customerCombo = ref<InstanceType<typeof Combobox> | null>(null);\n\nconst customerId = ref<number | null>(null);\nconst invoiceDate = ref(todayISODate());\nconst dateInput = ref<InstanceType<typeof DateInput> | null>(null);\nconst fiscalYearInput = ref<string>(String(fiscalYearOf(todayISODate()) || new Date().getFullYear()));\nconst yearTouched = ref(false);\n\nconst amount = ref(\"\");\nconst amountTouched = ref(false);\nconst vatRate = ref(\"21\");\n\nconst textBlock = ref(\"\");\nconst invoiceTexts = ref<string[]>([]);\nconst selectedInvoiceText = ref<number | null>(null);\nconst invoiceTextOptions = computed<ComboOption[]>(() => invoiceTexts.value.map((text, id) => ({ id, label: text })));\nconst invoiceType = ref<InvoiceType>(\"standalone\");\n\n// Afwijkend adres (factureren aan derde): losse velden + PDOK postcode-check.\nconst altAddressEnabled = ref(false);\nconst altName = ref(\"\");\nconst altZip = ref(\"\");\nconst altHouseNo = ref(\"\");\nconst altStreet = ref(\"\");\nconst altCity = ref(\"\");\nconst altLookupState = ref<\"\" | \"loading\" | \"ok\" | \"notfound\" | \"error\">(\"\");\n\nconst tellen = ref<Tellen | null>(null);\nconst nextNumber = ref(\"\");\nconst tellenLoading = ref(false);\nconst tellenError = ref(\"\");\n\nconst saving = ref(false);\nconst submitError = ref(\"\");\nconst fieldErrors = reactive<Record<string, string>>({});\n\nconst leaveConfirmOpen = ref(false);\n\nconst customerOptions = computed<ComboOption[]>(() => customers.value.map((c) => ({\n  id: c.id,\n  label: c.company || c.contactName || `Klant ${c.number}`,\n  sub: c.number,\n})));\n\n// Boekjaar accepteert 2 cijfers (09 -> 2009), net als de uren-invoer.\nconst fiscalYear = computed(() => expandFiscalYear(fiscalYearInput.value));\nconst validYear = computed(() => fiscalYear.value >= 1900);\n\nconst ZERO = new Money(\"0\");\n\nconst amountNum = computed(() => parseAmount(amount.value) ?? ZERO);\nconst vatNum = computed(() => parseAmount(vatRate.value) ?? ZERO);\nconst vat = computed(() => vatBreakdown({ amountExcl: amountNum.value, vatRate: vatNum.value }));\n// Opslag = het deel van het te factureren bedrag boven de getelde kosten (auto afgeleid).\nconst marginNum = computed(() => (tellen.value ? suggestMargin({ declareAmount: amountNum.value, toDeclare: tellen.value.toDeclare }) : ZERO));\nconst newToDeclare = computed(() =>\n  (tellen.value ? Money.subtract(tellen.value.toDeclare, Money.subtract(amountNum.value, marginNum.value)) : ZERO));\nconst isNegative = (value: Money): boolean => Money.check(value, \"<\", ZERO);\n\n// Opslag-indicatie onder het bedragveld (leeg wanneer het bedrag gelijk is aan de getelde kosten).\nconst upliftText = computed(() => {\n  if (!tellen.value) return \"\";\n  const { deltaEuro, deltaPct } = upliftInfo({ amount: amountNum.value, toDeclare: tellen.value.toDeclare });\n  const delta = deltaEuro.toNumber();\n  if (Math.abs(delta) < 0.005) return \"\";\n  const euroStr = (delta >= 0 ? \"+\" : \"\") + formatEuro(deltaEuro);\n  const pctStr = (deltaPct >= 0 ? \"+\" : \"\") + deltaPct.toFixed(1).replace(\".\", \",\") + \"%\";\n  return `${euroStr} (${pctStr}) ${delta >= 0 ? \"boven\" : \"onder\"} nog te declareren`;\n});\n\nconst textLines = computed<string[]>(() => splitLines(textBlock.value, MAX_TEXT_LINES));\nconst usedTextLines = computed(() => textLines.value.length);\n\nfunction appendInvoiceText(): void {\n  const text = selectedInvoiceText.value === null ? undefined : invoiceTexts.value[selectedInvoiceText.value];\n  if (!text) return;\n  const current = textBlock.value.replace(/\\n+$/, \"\");\n  const next = current ? `${current}\\n${text}` : text;\n  // A menu selection must not silently drop existing lines at the invoice limit.\n  if (next.split(\"\\n\").length > MAX_TEXT_LINES) {\n    fieldErrors.text = `Gebruik maximaal ${MAX_TEXT_LINES} tekstregels.`;\n    return;\n  }\n  textBlock.value = next;\n  selectedInvoiceText.value = null;\n  delete fieldErrors.text;\n}\n\nconst altLookupText = computed(() => {\n  switch (altLookupState.value) {\n    case \"loading\": return \"Adres ophalen…\";\n    case \"notfound\": return \"Geen adres gevonden bij deze postcode en huisnummer.\";\n    case \"error\": return \"Adrescontrole is niet beschikbaar.\";\n    default: return \"\";\n  }\n});\n\n// Weergegeven faktuurnummer: bij gelijke klant+jaar het bestaande nummer, anders\n// (nieuw of verplaatst naar een andere klant/jaar) het herberekende volgende nummer.\nconst displayNumber = computed(() => {\n  const orig = originalInvoice.value;\n  if (orig && customerId.value === orig.customerId && fiscalYear.value === orig.fiscalYear) {\n    return orig.number;\n  }\n  return nextNumber.value;\n});\n\n// Iets gewijzigd? Snapshot van alle velden vergeleken met de baseline (vastgelegd\n// na de mount-defaults resp. na het prefillen in bewerk-modus). Werkt voor beide modi.\nconst baseline = ref(\"\");\nfunction formSnapshot(): string {\n  return JSON.stringify({\n    customerId: customerId.value,\n    invoiceDate: invoiceDate.value,\n    fiscalYearInput: fiscalYearInput.value,\n    amount: amount.value,\n    vatRate: vatRate.value,\n    textBlock: textBlock.value,\n    invoiceType: invoiceType.value,\n    altAddressEnabled: altAddressEnabled.value,\n    altName: altName.value,\n    altZip: altZip.value,\n    altHouseNo: altHouseNo.value,\n    altStreet: altStreet.value,\n    altCity: altCity.value,\n  });\n}\nconst isDirty = computed(() => baseline.value !== \"\" && formSnapshot() !== baseline.value);\nuseOrganizationDirty(() => isDirty.value);\n\n// Regels: trim trailing lege regels, cap op max.\nfunction splitLines(block: string, max: number): string[] {\n  const lines = block.split(\"\\n\").map((line) => line.replace(/\\s+$/, \"\"));\n  while (lines.length && lines[lines.length - 1] === \"\") lines.pop();\n  return lines.slice(0, max);\n}\n\nfunction onDateChange(): void {\n  if (yearTouched.value) return;\n  const year = fiscalYearOf(invoiceDate.value);\n  if (year) fiscalYearInput.value = String(year);\n}\n\n// Bij verlaten van het veld: 2-cijferige invoer uitklappen naar het volledige jaartal.\nfunction onYearBlur(): void {\n  const year = expandFiscalYear(fiscalYearInput.value);\n  if (year) fiscalYearInput.value = String(year);\n}\n\nasync function lookupAlt(): Promise<void> {\n  const zip = altZip.value.trim();\n  const houseNumber = altHouseNo.value.trim();\n  if (!zip || !houseNumber) return;\n  altLookupState.value = \"loading\";\n  try {\n    const res = await api.lookupAddress({ zip, houseNumber });\n    if (res.status === \"ok\") {\n      altStreet.value = res.street;\n      altCity.value = res.city;\n      if (res.zip) altZip.value = res.zip;   // genormaliseerde postcode (\"7521 AM\")\n      altLookupState.value = \"ok\";\n    } else {\n      altLookupState.value = \"notfound\";\n    }\n  } catch {\n    altLookupState.value = \"error\";\n  }\n}\n\n// Prefill \"Te factureren\" op de getelde kosten zolang de gebruiker het bedrag niet zelf raakte.\nwatch(tellen, (loaded) => {\n  if (loaded && !amountTouched.value) amount.value = loaded.toDeclare.toString();\n});\n\n// Tellen + volgend nummer laden zodra klant + geldig jaar bekend zijn.\nwatch([customerId, fiscalYear], () => { void loadTellen(); });\n\n// Only the latest customer/year selection may fill the summary; an older lookup that\n// resolves later would otherwise show the number of a fiscal year no longer selected.\nlet tellenRequest = 0;\n\nasync function loadTellen(): Promise<void> {\n  const request = ++tellenRequest;\n  tellenError.value = \"\";\n  if (!customerId.value || !validYear.value) {\n    tellen.value = null;\n    nextNumber.value = \"\";\n    tellenLoading.value = false;\n    return;\n  }\n  tellenLoading.value = true;\n  try {\n    const [tellenResult, number] = await Promise.all([\n      api.tellen({\n        customerId: customerId.value,\n        fiscalYear: fiscalYear.value,\n        ...(editId.value ? { excludeInvoiceId: editId.value } : {}),\n      }),\n      api.nextInvoiceNumber({ customerId: customerId.value, fiscalYear: fiscalYear.value }),\n    ]);\n    if (request !== tellenRequest) return;\n    tellen.value = tellenResult;\n    nextNumber.value = number;\n  } catch (e) {\n    if (request !== tellenRequest) return;\n    tellen.value = null;\n    tellenError.value = e instanceof Error ? e.message : \"Tellen mislukt.\";\n  } finally {\n    if (request === tellenRequest) tellenLoading.value = false;\n  }\n}\n\nfunction validate(): boolean {\n  for (const key of Object.keys(fieldErrors)) delete fieldErrors[key];\n  submitError.value = \"\";\n\n  if (dateInput.value && !dateInput.value.validate()) {\n    dateInput.value.focus();\n    return false;\n  }\n\n  if (!customerId.value) fieldErrors.customer = \"Kies een klant.\";\n  if (!validYear.value) fieldErrors.year = \"Vul een geldig boekjaar in.\";\n  if (parseAmount(amount.value) === null) fieldErrors.amount = \"Vul een te factureren bedrag in.\";\n  if (textLines.value.length === 0) fieldErrors.text = \"Vul minstens één tekstregel in.\";\n\n  if (Object.keys(fieldErrors).length > 0) {\n    submitError.value = \"Controleer de gemarkeerde velden.\";\n    return false;\n  }\n  return true;\n}\n\nfunction hasAltAddress(): boolean {\n  return [altName.value, altStreet.value, altHouseNo.value, altZip.value, altCity.value].some((value) => value.trim() !== \"\");\n}\n\nasync function submit(): Promise<void> {\n  if (!validate()) return;\n  saving.value = true;\n  submitError.value = \"\";\n  try {\n    const payload = {\n      customerId: customerId.value as number,\n      fiscalYear: fiscalYear.value,\n      date: invoiceDate.value,\n      amount: amountNum.value.toString(),\n      margin: marginNum.value.toString(),\n      vatRate: vatNum.value.toString(),\n      textLines: textLines.value,\n      invoiceType: invoiceType.value,\n      ...(altAddressEnabled.value && hasAltAddress()\n        ? {\n            altAddress: {\n              recipient: altName.value.trim(),\n              street: altStreet.value.trim(),\n              houseNumber: altHouseNo.value.trim(),\n              zip: altZip.value.trim(),\n              city: altCity.value.trim(),\n            },\n          }\n        : {}),\n    };\n    const id = editId.value\n      ? (await api.updateInvoice({ id: editId.value, ...payload })).id\n      : (await api.createInvoice(payload)).id;\n    // Baseline gelijktrekken zodat de leave-confirm niet meer triggert bij de navigatie.\n    baseline.value = formSnapshot();\n    void router.push({ name: \"fakturen-detail\", params: { id: String(id) } });\n  } catch (e) {\n    submitError.value = e instanceof Error ? e.message : (isEdit.value ? \"Opslaan mislukt.\" : \"Verwerken mislukt.\");\n  } finally {\n    saving.value = false;\n  }\n}\n\nfunction goBack(): void {\n  if (editId.value) void router.push({ name: \"fakturen-detail\", params: { id: String(editId.value) } });\n  else void router.push({ name: \"fakturen\" });\n}\n\nfunction requestLeave(): void {\n  if (isDirty.value) leaveConfirmOpen.value = true;\n  else goBack();\n}\n\nfunction onGlobalKeydown(event: KeyboardEvent): void {\n  if (event.key !== \"Escape\" || leaveConfirmOpen.value) return;\n  event.preventDefault();\n  requestLeave();\n}\n\nfunction onBeforeUnload(event: BeforeUnloadEvent): void {\n  if (!isDirty.value) return;\n  event.preventDefault();\n  event.returnValue = \"\";\n}\n\n// Bewerk-modus: laad de faktuur en vul alle velden vooraf in. Een reeds verzonden\n// (of ontbrekende) faktuur blokkeert het formulier met een melding.\nasync function loadForEdit(id: number): Promise<void> {\n  const detail = await api.getInvoice({ id });\n  if (!detail) {\n    editBlocked.value = true;\n    loadError.value = `Factuur #${id} niet gevonden.`;\n    return;\n  }\n  if (detail.sent) {\n    editBlocked.value = true;\n    loadError.value = `Factuur ${detail.number} is al verzonden en kan niet meer worden bewerkt.`;\n    return;\n  }\n  originalInvoice.value = detail;\n  customerId.value = detail.customerId;\n  invoiceDate.value = detail.date.slice(0, 10);\n  fiscalYearInput.value = String(detail.fiscalYear);\n  amount.value = detail.amount.toString();\n  amountTouched.value = true;   // voorkom dat de tellen-prefill de geladen waarde overschrijft\n  yearTouched.value = true;\n  vatRate.value = detail.vatRate.toString();\n  textBlock.value = detail.textLines.join(\"\\n\");\n  invoiceType.value = detail.invoiceType;\n  if (detail.altAddressRaw) {\n    altAddressEnabled.value = true;\n    altName.value = detail.altAddressRaw.recipient;\n    altStreet.value = detail.altAddressRaw.street;\n    altHouseNo.value = detail.altAddressRaw.houseNumber;\n    altZip.value = detail.altAddressRaw.zip;\n    altCity.value = detail.altAddressRaw.city;\n  }\n}\n\nonMounted(async () => {\n  window.addEventListener(\"keydown\", onGlobalKeydown);\n  window.addEventListener(\"beforeunload\", onBeforeUnload);\n  try {\n    const [customerRows, settings] = await Promise.all([api.listCustomers(), api.getSettings()]);\n    customers.value = customerRows;\n    vatRate.value = String(settings.defaultVatRate);\n    invoiceTexts.value = settings.invoiceTexts ?? [];\n    if (editId.value) {\n      await loadForEdit(editId.value);\n    } else {\n      void nextTick(() => customerCombo.value?.focus());\n    }\n  } catch {\n    loadError.value = \"Kon klanten of instellingen niet laden.\";\n  }\n  // Baseline na alle prefills, zodat isDirty pas op echte wijzigingen reageert.\n  baseline.value = formSnapshot();\n});\n\nonBeforeUnmount(() => {\n  window.removeEventListener(\"keydown\", onGlobalKeydown);\n  window.removeEventListener(\"beforeunload\", onBeforeUnload);\n});\n</script>\n\n<style scoped>\n.wz__cols {\n  display: grid;\n  grid-template-columns: minmax(0, 1fr) 320px;\n  gap: 18px;\n  align-items: start;\n}\n.wz__form {\n  display: grid;\n  gap: 16px;\n}\n.wz__panel {\n  padding: 16px 18px;\n  overflow: visible;   /* combobox-dropdown mag buiten de kaart uitsteken (viel anders erachter) */\n}\n.wz__phead {\n  display: flex;\n  align-items: baseline;\n  justify-content: space-between;\n}\n.wz__textpicker {\n  display: flex;\n  align-items: end;\n  gap: 8px;\n  margin-bottom: 12px;\n}\n.wz__textpicker > :first-child {\n  flex: 1;\n  min-width: 0;\n}\n.wz__ptitle {\n  margin: 0 0 12px;\n  font-size: 15px;\n  font-weight: 700;\n}\n.wz__count {\n  font-size: 12px;\n}\n.wz__grid {\n  display: grid;\n  grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));\n  gap: 14px;\n}\n.wz__base {\n  margin: 0 0 10px;\n  font-size: 13px;\n  color: var(--hh-fg-muted);\n}\n.wz__base strong {\n  color: var(--hh-fg);\n  font-variant-numeric: tabular-nums;\n}\n.wz__textarea {\n  width: 100%;\n  resize: vertical;\n  font-family: var(--hh-font);\n  line-height: 1.5;\n}\n.wz__radios {\n  display: grid;\n  gap: 10px;\n  margin-bottom: 14px;\n}\n.wz__radio {\n  display: flex;\n  gap: 10px;\n  align-items: flex-start;\n  font-size: 13.5px;\n  cursor: pointer;\n}\n.wz__radio input {\n  margin-top: 3px;\n}\n.wz__alttoggle {\n  display: flex;\n  align-items: center;\n  gap: 8px;\n  font-size: 13.5px;\n  margin-bottom: 10px;\n  cursor: pointer;\n}\n.wz__alt {\n  display: grid;\n  gap: 4px;\n  padding-top: 4px;\n}\n.wz__altrow {\n  display: grid;\n  grid-template-columns: 1fr 1fr;\n  gap: 12px;\n}\n.wz__altstatus {\n  margin: 2px 0 0;\n  font-size: 12px;\n  color: var(--hh-fg-subtle);\n}\n.wz__altstatus--err {\n  color: var(--hh-danger);\n}\n.wz__aside {\n  position: sticky;\n  top: 88px;\n}\n.wz__summary {\n  padding: 16px 18px;\n}\n.wz__dl {\n  margin: 0 0 12px;\n  display: grid;\n  gap: 7px;\n}\n.wz__dl div {\n  display: flex;\n  justify-content: space-between;\n  gap: 12px;\n  font-size: 13px;\n}\n.wz__dl dt {\n  color: var(--hh-fg-muted);\n}\n.wz__dl dd {\n  margin: 0;\n  font-variant-numeric: tabular-nums;\n}\n.wz__strong dt,\n.wz__strong dd {\n  font-weight: 700;\n  color: var(--hh-fg);\n}\n.wz__neg {\n  color: var(--hh-danger);\n}\n.wz__afterhead {\n  margin: 4px 0 8px;\n  padding-top: 10px;\n  border-top: 1px solid var(--hh-line);\n  font-size: 12px;\n  font-weight: 700;\n  text-transform: uppercase;\n  letter-spacing: 0.03em;\n  color: var(--hh-fg-subtle);\n}\n.wz__mono {\n  font-family: var(--hh-mono);\n  font-weight: 700;\n}\n.wz__submiterror {\n  margin-bottom: 10px;\n}\n.wz__texterror {\n  margin: 8px 0 0;\n}\n.wz__submit {\n  width: 100%;\n}\n@media (max-width: 860px) {\n  .wz__cols {\n    grid-template-columns: 1fr;\n  }\n  .wz__aside {\n    position: static;\n  }\n}\n</style>\n","import { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, createVNode as _createVNode, withCtx as _withCtx, vModelText as _vModelText, normalizeClass as _normalizeClass, withDirectives as _withDirectives, createTextVNode as _createTextVNode, renderList as _renderList, Fragment as _Fragment, vModelRadio as _vModelRadio, vModelCheckbox as _vModelCheckbox, createBlock as _createBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"hh-page__bar\" }\nconst _hoisted_2 = { class: \"hh-page__title\" }\nconst _hoisted_3 = { class: \"hh-page__sub\" }\nconst _hoisted_4 = {\n  key: 0,\n  class: \"hh-formerror\"\n}\nconst _hoisted_5 = {\n  key: 1,\n  class: \"wz__cols\"\n}\nconst _hoisted_6 = { class: \"wz__form\" }\nconst _hoisted_7 = { class: \"hh-card wz__panel\" }\nconst _hoisted_8 = { class: \"wz__grid\" }\nconst _hoisted_9 = { class: \"hh-card wz__panel\" }\nconst _hoisted_10 = {\n  key: 0,\n  class: \"wz__base\"\n}\nconst _hoisted_11 = { class: \"hh-card wz__panel\" }\nconst _hoisted_12 = { class: \"wz__phead\" }\nconst _hoisted_13 = { class: \"hh-muted wz__count\" }\nconst _hoisted_14 = {\n  key: 0,\n  class: \"wz__textpicker\"\n}\nconst _hoisted_15 = [\"disabled\"]\nconst _hoisted_16 = {\n  key: 1,\n  class: \"hh-formerror wz__texterror\"\n}\nconst _hoisted_17 = { class: \"hh-card wz__panel\" }\nconst _hoisted_18 = { class: \"wz__radios\" }\nconst _hoisted_19 = [\"value\"]\nconst _hoisted_20 = { class: \"hh-muted\" }\nconst _hoisted_21 = { class: \"wz__alttoggle\" }\nconst _hoisted_22 = {\n  key: 0,\n  class: \"wz__alt\"\n}\nconst _hoisted_23 = { class: \"wz__altrow\" }\nconst _hoisted_24 = { class: \"wz__altrow\" }\nconst _hoisted_25 = { class: \"wz__aside\" }\nconst _hoisted_26 = { class: \"hh-card wz__summary\" }\nconst _hoisted_27 = {\n  key: 0,\n  class: \"hh-muted\"\n}\nconst _hoisted_28 = {\n  key: 1,\n  class: \"hh-muted\"\n}\nconst _hoisted_29 = { class: \"wz__dl\" }\nconst _hoisted_30 = { class: \"wz__mono\" }\nconst _hoisted_31 = { class: \"wz__dl\" }\nconst _hoisted_32 = { class: \"wz__strong\" }\nconst _hoisted_33 = {\n  key: 3,\n  class: \"hh-formerror\"\n}\nconst _hoisted_34 = {\n  key: 4,\n  class: \"hh-formerror wz__submiterror\"\n}\nconst _hoisted_35 = [\"disabled\"]\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return (_openBlock(), _createElementBlock(\"section\", null, [\n    _createElementVNode(\"div\", _hoisted_1, [\n      _createElementVNode(\"div\", null, [\n        _createElementVNode(\"h1\", _hoisted_2, _toDisplayString($setup.pageTitle), 1 /* TEXT */),\n        _createElementVNode(\"p\", _hoisted_3, _toDisplayString($setup.pageSub), 1 /* TEXT */)\n      ]),\n      _createElementVNode(\"button\", {\n        class: \"hh-btn\",\n        type: \"button\",\n        onClick: $setup.requestLeave\n      }, _toDisplayString($setup.editBlocked ? \"Terug\" : \"Annuleren\"), 1 /* TEXT */)\n    ]),\n    ($setup.loadError)\n      ? (_openBlock(), _createElementBlock(\"p\", _hoisted_4, _toDisplayString($setup.loadError), 1 /* TEXT */))\n      : _createCommentVNode(\"v-if\", true),\n    (!$setup.editBlocked)\n      ? (_openBlock(), _createElementBlock(\"div\", _hoisted_5, [\n          _createElementVNode(\"div\", _hoisted_6, [\n            _createCommentVNode(\" 1. Klant en jaar \"),\n            _createElementVNode(\"section\", _hoisted_7, [\n              _cache[17] || (_cache[17] = _createElementVNode(\"h2\", { class: \"wz__ptitle\" }, \"1 · Klant en jaar\", -1 /* CACHED */)),\n              _createElementVNode(\"div\", _hoisted_8, [\n                _createVNode($setup[\"FormField\"], {\n                  label: \"Klant\",\n                  \"for-id\": \"wz-customer\",\n                  required: \"\",\n                  error: $setup.fieldErrors.customer\n                }, {\n                  default: _withCtx(() => [\n                    _createVNode($setup[\"Combobox\"], {\n                      ref: \"customerCombo\",\n                      modelValue: $setup.customerId,\n                      \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => (($setup.customerId) = $event)),\n                      options: $setup.customerOptions,\n                      error: Boolean($setup.fieldErrors.customer),\n                      placeholder: \"Nummer of naam…\"\n                    }, null, 8 /* PROPS */, [\"modelValue\", \"options\", \"error\"])\n                  ]),\n                  _: 1 /* STABLE */\n                }, 8 /* PROPS */, [\"error\"]),\n                _createVNode($setup[\"FormField\"], {\n                  label: \"Factuurdatum\",\n                  \"for-id\": \"wz-date\",\n                  required: \"\"\n                }, {\n                  default: _withCtx(() => [\n                    _createVNode($setup[\"DateInput\"], {\n                      id: \"wz-date\",\n                      ref: \"dateInput\",\n                      modelValue: $setup.invoiceDate,\n                      \"onUpdate:modelValue\": [\n                        _cache[1] || (_cache[1] = $event => (($setup.invoiceDate) = $event)),\n                        $setup.onDateChange\n                      ],\n                      disabled: $setup.saving\n                    }, null, 8 /* PROPS */, [\"modelValue\", \"disabled\"])\n                  ]),\n                  _: 1 /* STABLE */\n                }),\n                _createVNode($setup[\"FormField\"], {\n                  label: \"Boekjaar\",\n                  \"for-id\": \"wz-year\",\n                  required: \"\",\n                  error: $setup.fieldErrors.year\n                }, {\n                  default: _withCtx(() => [\n                    _withDirectives(_createElementVNode(\"input\", {\n                      id: \"wz-year\",\n                      \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => (($setup.fiscalYearInput) = $event)),\n                      class: _normalizeClass([\"hh-input hh-input--num\", { 'hh-input--error': $setup.fieldErrors.year }]),\n                      inputmode: \"numeric\",\n                      onInput: _cache[3] || (_cache[3] = $event => ($setup.yearTouched = true)),\n                      onBlur: $setup.onYearBlur\n                    }, null, 34 /* CLASS, NEED_HYDRATION */), [\n                      [_vModelText, $setup.fiscalYearInput]\n                    ])\n                  ]),\n                  _: 1 /* STABLE */\n                }, 8 /* PROPS */, [\"error\"])\n              ])\n            ]),\n            _createCommentVNode(\" 2. Te factureren \"),\n            _createElementVNode(\"section\", _hoisted_9, [\n              _cache[19] || (_cache[19] = _createElementVNode(\"h2\", { class: \"wz__ptitle\" }, \"2 · Te factureren\", -1 /* CACHED */)),\n              ($setup.tellen)\n                ? (_openBlock(), _createElementBlock(\"p\", _hoisted_10, [\n                    _cache[18] || (_cache[18] = _createTextVNode(\"Nog te declareren: \", -1 /* CACHED */)),\n                    _createElementVNode(\"strong\", null, _toDisplayString($setup.formatEuro($setup.tellen.toDeclare)), 1 /* TEXT */)\n                  ]))\n                : _createCommentVNode(\"v-if\", true),\n              _createVNode($setup[\"FormField\"], {\n                label: \"Te factureren (€, excl. btw)\",\n                \"for-id\": \"wz-amount\",\n                required: \"\",\n                error: $setup.fieldErrors.amount,\n                hint: $setup.upliftText\n              }, {\n                default: _withCtx(() => [\n                  _withDirectives(_createElementVNode(\"input\", {\n                    id: \"wz-amount\",\n                    \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => (($setup.amount) = $event)),\n                    class: _normalizeClass([\"hh-input hh-input--num\", { 'hh-input--error': $setup.fieldErrors.amount }]),\n                    inputmode: \"decimal\",\n                    placeholder: \"0,00\",\n                    onInput: _cache[5] || (_cache[5] = $event => ($setup.amountTouched = true))\n                  }, null, 34 /* CLASS, NEED_HYDRATION */), [\n                    [\n                      _vModelText,\n                      $setup.amount,\n                      void 0,\n                      { trim: true }\n                    ]\n                  ])\n                ]),\n                _: 1 /* STABLE */\n              }, 8 /* PROPS */, [\"error\", \"hint\"])\n            ]),\n            _createCommentVNode(\" 3. Tekstregels \"),\n            _createElementVNode(\"section\", _hoisted_11, [\n              _createElementVNode(\"div\", _hoisted_12, [\n                _cache[20] || (_cache[20] = _createElementVNode(\"h2\", { class: \"wz__ptitle\" }, \"3 · Tekstregels\", -1 /* CACHED */)),\n                _createElementVNode(\"span\", _hoisted_13, _toDisplayString($setup.usedTextLines) + \"/\" + _toDisplayString($setup.MAX_TEXT_LINES) + \" regels\", 1 /* TEXT */)\n              ]),\n              ($setup.invoiceTexts.length)\n                ? (_openBlock(), _createElementBlock(\"div\", _hoisted_14, [\n                    _createVNode($setup[\"FormField\"], {\n                      label: \"Vaste omschrijving\",\n                      \"for-id\": \"wz-text-choice\"\n                    }, {\n                      default: _withCtx(() => [\n                        _createVNode($setup[\"Combobox\"], {\n                          id: \"wz-text-choice\",\n                          modelValue: $setup.selectedInvoiceText,\n                          \"onUpdate:modelValue\": _cache[6] || (_cache[6] = $event => (($setup.selectedInvoiceText) = $event)),\n                          options: $setup.invoiceTextOptions,\n                          placeholder: \"Zoek een omschrijving…\",\n                          disabled: $setup.saving\n                        }, null, 8 /* PROPS */, [\"modelValue\", \"options\", \"disabled\"])\n                      ]),\n                      _: 1 /* STABLE */\n                    }),\n                    _createElementVNode(\"button\", {\n                      class: \"hh-btn\",\n                      type: \"button\",\n                      disabled: $setup.saving || $setup.selectedInvoiceText === null,\n                      onClick: $setup.appendInvoiceText\n                    }, \"Toevoegen\", 8 /* PROPS */, _hoisted_15)\n                  ]))\n                : _createCommentVNode(\"v-if\", true),\n              _withDirectives(_createElementVNode(\"textarea\", {\n                \"onUpdate:modelValue\": _cache[7] || (_cache[7] = $event => (($setup.textBlock) = $event)),\n                class: _normalizeClass([\"hh-input wz__textarea\", { 'hh-input--error': $setup.fieldErrors.text }]),\n                rows: \"6\",\n                placeholder: \"Honorarium voor verrichte werkzaamheden inzake…\"\n              }, null, 2 /* CLASS */), [\n                [_vModelText, $setup.textBlock]\n              ]),\n              ($setup.fieldErrors.text)\n                ? (_openBlock(), _createElementBlock(\"p\", _hoisted_16, _toDisplayString($setup.fieldErrors.text), 1 /* TEXT */))\n                : _createCommentVNode(\"v-if\", true)\n            ]),\n            _createCommentVNode(\" 4. Type en adressering \"),\n            _createElementVNode(\"section\", _hoisted_17, [\n              _cache[23] || (_cache[23] = _createElementVNode(\"h2\", { class: \"wz__ptitle\" }, \"4 · Soort factuur\", -1 /* CACHED */)),\n              _createElementVNode(\"div\", _hoisted_18, [\n                (_openBlock(), _createElementBlock(_Fragment, null, _renderList($setup.TYPE_OPTIONS, (opt) => {\n                  return _createElementVNode(\"label\", {\n                    key: opt.value,\n                    class: \"wz__radio\"\n                  }, [\n                    _withDirectives(_createElementVNode(\"input\", {\n                      \"onUpdate:modelValue\": _cache[8] || (_cache[8] = $event => (($setup.invoiceType) = $event)),\n                      type: \"radio\",\n                      name: \"invoiceType\",\n                      value: opt.value\n                    }, null, 8 /* PROPS */, _hoisted_19), [\n                      [_vModelRadio, $setup.invoiceType]\n                    ]),\n                    _createElementVNode(\"span\", null, [\n                      _createElementVNode(\"strong\", null, _toDisplayString(opt.label), 1 /* TEXT */),\n                      _cache[21] || (_cache[21] = _createElementVNode(\"br\", null, null, -1 /* CACHED */)),\n                      _createElementVNode(\"span\", _hoisted_20, _toDisplayString(opt.hint), 1 /* TEXT */)\n                    ])\n                  ])\n                }), 64 /* STABLE_FRAGMENT */))\n              ]),\n              _createElementVNode(\"label\", _hoisted_21, [\n                _withDirectives(_createElementVNode(\"input\", {\n                  \"onUpdate:modelValue\": _cache[9] || (_cache[9] = $event => (($setup.altAddressEnabled) = $event)),\n                  type: \"checkbox\"\n                }, null, 512 /* NEED_PATCH */), [\n                  [_vModelCheckbox, $setup.altAddressEnabled]\n                ]),\n                _cache[22] || (_cache[22] = _createTextVNode(\" Afwijkend adres (factureren aan derde) \", -1 /* CACHED */))\n              ]),\n              ($setup.altAddressEnabled)\n                ? (_openBlock(), _createElementBlock(\"div\", _hoisted_22, [\n                    _createVNode($setup[\"FormField\"], {\n                      label: \"Naam / t.a.v.\",\n                      \"for-id\": \"wz-alt-name\"\n                    }, {\n                      default: _withCtx(() => [\n                        _withDirectives(_createElementVNode(\"input\", {\n                          id: \"wz-alt-name\",\n                          \"onUpdate:modelValue\": _cache[10] || (_cache[10] = $event => (($setup.altName) = $event)),\n                          class: \"hh-input\",\n                          placeholder: \"Bedrijfs- of persoonsnaam\"\n                        }, null, 512 /* NEED_PATCH */), [\n                          [\n                            _vModelText,\n                            $setup.altName,\n                            void 0,\n                            { trim: true }\n                          ]\n                        ])\n                      ]),\n                      _: 1 /* STABLE */\n                    }),\n                    _createElementVNode(\"div\", _hoisted_23, [\n                      _createVNode($setup[\"FormField\"], {\n                        label: \"Postcode\",\n                        \"for-id\": \"wz-alt-zip\"\n                      }, {\n                        default: _withCtx(() => [\n                          _withDirectives(_createElementVNode(\"input\", {\n                            id: \"wz-alt-zip\",\n                            \"onUpdate:modelValue\": _cache[11] || (_cache[11] = $event => (($setup.altZip) = $event)),\n                            class: \"hh-input\",\n                            placeholder: \"1234 AB\",\n                            autocomplete: \"off\",\n                            onBlur: $setup.lookupAlt\n                          }, null, 544 /* NEED_HYDRATION, NEED_PATCH */), [\n                            [\n                              _vModelText,\n                              $setup.altZip,\n                              void 0,\n                              { trim: true }\n                            ]\n                          ])\n                        ]),\n                        _: 1 /* STABLE */\n                      }),\n                      _createVNode($setup[\"FormField\"], {\n                        label: \"Huisnummer\",\n                        \"for-id\": \"wz-alt-houseno\"\n                      }, {\n                        default: _withCtx(() => [\n                          _withDirectives(_createElementVNode(\"input\", {\n                            id: \"wz-alt-houseno\",\n                            \"onUpdate:modelValue\": _cache[12] || (_cache[12] = $event => (($setup.altHouseNo) = $event)),\n                            class: \"hh-input\",\n                            placeholder: \"12\",\n                            autocomplete: \"off\",\n                            onBlur: $setup.lookupAlt\n                          }, null, 544 /* NEED_HYDRATION, NEED_PATCH */), [\n                            [\n                              _vModelText,\n                              $setup.altHouseNo,\n                              void 0,\n                              { trim: true }\n                            ]\n                          ])\n                        ]),\n                        _: 1 /* STABLE */\n                      })\n                    ]),\n                    _createElementVNode(\"div\", _hoisted_24, [\n                      _createVNode($setup[\"FormField\"], {\n                        label: \"Straat\",\n                        \"for-id\": \"wz-alt-street\"\n                      }, {\n                        default: _withCtx(() => [\n                          _withDirectives(_createElementVNode(\"input\", {\n                            id: \"wz-alt-street\",\n                            \"onUpdate:modelValue\": _cache[13] || (_cache[13] = $event => (($setup.altStreet) = $event)),\n                            class: \"hh-input\",\n                            placeholder: \"Wordt opgehaald via de postcode\"\n                          }, null, 512 /* NEED_PATCH */), [\n                            [\n                              _vModelText,\n                              $setup.altStreet,\n                              void 0,\n                              { trim: true }\n                            ]\n                          ])\n                        ]),\n                        _: 1 /* STABLE */\n                      }),\n                      _createVNode($setup[\"FormField\"], {\n                        label: \"Plaats\",\n                        \"for-id\": \"wz-alt-city\"\n                      }, {\n                        default: _withCtx(() => [\n                          _withDirectives(_createElementVNode(\"input\", {\n                            id: \"wz-alt-city\",\n                            \"onUpdate:modelValue\": _cache[14] || (_cache[14] = $event => (($setup.altCity) = $event)),\n                            class: \"hh-input\",\n                            placeholder: \"Wordt opgehaald via de postcode\"\n                          }, null, 512 /* NEED_PATCH */), [\n                            [\n                              _vModelText,\n                              $setup.altCity,\n                              void 0,\n                              { trim: true }\n                            ]\n                          ])\n                        ]),\n                        _: 1 /* STABLE */\n                      })\n                    ]),\n                    ($setup.altLookupText)\n                      ? (_openBlock(), _createElementBlock(\"p\", {\n                          key: 0,\n                          class: _normalizeClass([\"wz__altstatus\", { 'wz__altstatus--err': $setup.altLookupState === 'notfound' || $setup.altLookupState === 'error' }])\n                        }, _toDisplayString($setup.altLookupText), 3 /* TEXT, CLASS */))\n                      : _createCommentVNode(\"v-if\", true)\n                  ]))\n                : _createCommentVNode(\"v-if\", true)\n            ])\n          ]),\n          _createCommentVNode(\" Samenvatting + verwerken \"),\n          _createElementVNode(\"aside\", _hoisted_25, [\n            _createElementVNode(\"div\", _hoisted_26, [\n              _cache[32] || (_cache[32] = _createElementVNode(\"h2\", { class: \"wz__ptitle\" }, \"Samenvatting\", -1 /* CACHED */)),\n              (!$setup.customerId || !$setup.validYear)\n                ? (_openBlock(), _createElementBlock(\"p\", _hoisted_27, \"Kies eerst een klant en boekjaar.\"))\n                : ($setup.tellenLoading)\n                  ? (_openBlock(), _createElementBlock(\"p\", _hoisted_28, \"Tellen…\"))\n                  : ($setup.tellen)\n                    ? (_openBlock(), _createElementBlock(_Fragment, { key: 2 }, [\n                        _createElementVNode(\"dl\", _hoisted_29, [\n                          _createElementVNode(\"div\", null, [\n                            _createElementVNode(\"dt\", null, _toDisplayString($setup.isEdit ? \"Nummer\" : \"Volgend nummer\"), 1 /* TEXT */),\n                            _createElementVNode(\"dd\", _hoisted_30, _toDisplayString($setup.displayNumber || \"…\"), 1 /* TEXT */)\n                          ]),\n                          _createElementVNode(\"div\", null, [\n                            _cache[24] || (_cache[24] = _createElementVNode(\"dt\", null, \"Kosten (uren + verschotten)\", -1 /* CACHED */)),\n                            _createElementVNode(\"dd\", null, _toDisplayString($setup.formatEuro($setup.tellen.totalCosts)), 1 /* TEXT */)\n                          ]),\n                          _createElementVNode(\"div\", null, [\n                            _cache[25] || (_cache[25] = _createElementVNode(\"dt\", null, \"Al gedeclareerd\", -1 /* CACHED */)),\n                            _createElementVNode(\"dd\", null, _toDisplayString($setup.formatEuro($setup.tellen.declared)), 1 /* TEXT */)\n                          ]),\n                          _createElementVNode(\"div\", null, [\n                            _cache[26] || (_cache[26] = _createElementVNode(\"dt\", null, \"Nog te declareren\", -1 /* CACHED */)),\n                            _createElementVNode(\"dd\", {\n                              class: _normalizeClass({ 'wz__neg': $setup.isNegative($setup.tellen.toDeclare) })\n                            }, _toDisplayString($setup.formatEuro($setup.tellen.toDeclare)), 3 /* TEXT, CLASS */)\n                          ])\n                        ]),\n                        _cache[31] || (_cache[31] = _createElementVNode(\"div\", { class: \"wz__afterhead\" }, \"Na deze factuur\", -1 /* CACHED */)),\n                        _createElementVNode(\"dl\", _hoisted_31, [\n                          _createElementVNode(\"div\", null, [\n                            _cache[27] || (_cache[27] = _createElementVNode(\"dt\", null, \"Bedrag excl. btw\", -1 /* CACHED */)),\n                            _createElementVNode(\"dd\", null, _toDisplayString($setup.formatEuro($setup.amountNum)), 1 /* TEXT */)\n                          ]),\n                          _createElementVNode(\"div\", null, [\n                            _createElementVNode(\"dt\", null, \"Btw (\" + _toDisplayString($setup.vatNum) + \"%)\", 1 /* TEXT */),\n                            _createElementVNode(\"dd\", null, _toDisplayString($setup.formatEuro($setup.vat.vat)), 1 /* TEXT */)\n                          ]),\n                          _createElementVNode(\"div\", _hoisted_32, [\n                            _cache[28] || (_cache[28] = _createElementVNode(\"dt\", null, \"Incl. btw\", -1 /* CACHED */)),\n                            _createElementVNode(\"dd\", null, _toDisplayString($setup.formatEuro($setup.vat.inclVat)), 1 /* TEXT */)\n                          ]),\n                          _createElementVNode(\"div\", null, [\n                            _cache[29] || (_cache[29] = _createElementVNode(\"dt\", null, \"Marge\", -1 /* CACHED */)),\n                            _createElementVNode(\"dd\", null, _toDisplayString($setup.formatEuro($setup.marginNum)), 1 /* TEXT */)\n                          ]),\n                          _createElementVNode(\"div\", null, [\n                            _cache[30] || (_cache[30] = _createElementVNode(\"dt\", null, \"Nog te declareren daarna\", -1 /* CACHED */)),\n                            _createElementVNode(\"dd\", {\n                              class: _normalizeClass({ 'wz__neg': $setup.isNegative($setup.newToDeclare) })\n                            }, _toDisplayString($setup.formatEuro($setup.newToDeclare)), 3 /* TEXT, CLASS */)\n                          ])\n                        ])\n                      ], 64 /* STABLE_FRAGMENT */))\n                    : _createCommentVNode(\"v-if\", true),\n              ($setup.tellenError)\n                ? (_openBlock(), _createElementBlock(\"p\", _hoisted_33, _toDisplayString($setup.tellenError), 1 /* TEXT */))\n                : _createCommentVNode(\"v-if\", true),\n              ($setup.submitError)\n                ? (_openBlock(), _createElementBlock(\"p\", _hoisted_34, _toDisplayString($setup.submitError), 1 /* TEXT */))\n                : _createCommentVNode(\"v-if\", true),\n              _createElementVNode(\"button\", {\n                class: \"hh-btn hh-btn--primary wz__submit\",\n                type: \"button\",\n                disabled: $setup.saving,\n                onClick: $setup.submit\n              }, _toDisplayString($setup.saving ? ($setup.isEdit ? \"Opslaan…\" : \"Verwerken…\") : ($setup.isEdit ? \"Wijzigingen opslaan\" : \"Verwerk deze factuur\")), 9 /* TEXT, PROPS */, _hoisted_35)\n            ])\n          ])\n        ]))\n      : _createCommentVNode(\"v-if\", true),\n    _createCommentVNode(\" Esc / Annuleren met niet-opgeslagen invoer. \"),\n    ($setup.leaveConfirmOpen)\n      ? (_openBlock(), _createBlock($setup[\"AppDialog\"], {\n          key: 2,\n          title: \"Factuur niet opgeslagen\",\n          onClose: _cache[16] || (_cache[16] = $event => ($setup.leaveConfirmOpen = false))\n        }, {\n          footer: _withCtx(() => [\n            _createElementVNode(\"button\", {\n              class: \"hh-btn\",\n              type: \"button\",\n              \"data-autofocus\": \"\",\n              onClick: _cache[15] || (_cache[15] = $event => ($setup.leaveConfirmOpen = false))\n            }, \"Blijf hier\"),\n            _createElementVNode(\"button\", {\n              class: \"hh-btn hh-btn--danger\",\n              type: \"button\",\n              onClick: $setup.goBack\n            }, \"Terug naar overzicht\")\n          ]),\n          default: _withCtx(() => [\n            _cache[33] || (_cache[33] = _createElementVNode(\"p\", null, \"Je hebt gegevens ingevuld die nog niet zijn verwerkt. Weet je zeker dat je terug wilt naar het overzicht?\", -1 /* CACHED */))\n          ]),\n          _: 1 /* STABLE */,\n          __: [33]\n        }))\n      : _createCommentVNode(\"v-if\", true)\n  ]))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/InvoiceWizardView.vue?type=script\";import \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/InvoiceWizardView.vue?type=style&index=0\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/InvoiceWizardView.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/InvoiceWizardView.vue\";script.__scopeId = \"data-v-9134e0b8\";export default script;","export function invoiceActivityText(action: \"created\" | \"updated\" | \"sent\" | \"send_failed\"): string {\n  return {\n    created: \"Aangemaakt\",\n    updated: \"Gewijzigd\",\n    sent: \"E-mail in verzendwachtrij geplaatst\",\n    send_failed: \"Verzenden mislukt\",\n  }[action];\n}\n","// Start een client-side download van base64-gecodeerde bytes (bv. een PDF die\n// de RPC-laag als base64-string levert).\n\nexport interface DownloadBase64Options {\n  base64: string;\n  filename: string;\n  mimeType?: string;\n}\n\n/** Decodeert base64 naar een Blob en start de browser-download. */\nexport function downloadBase64(options: DownloadBase64Options): void {\n  const { base64, filename, mimeType = \"application/octet-stream\" } = options;\n  const binary = atob(base64);\n  const bytes = new Uint8Array(binary.length);\n  for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n\n  const blob = new Blob([bytes], { type: mimeType });\n  const url = URL.createObjectURL(blob);\n  const anchor = document.createElement(\"a\");\n  anchor.href = url;\n  anchor.download = filename;\n  document.body.appendChild(anchor);\n  anchor.click();\n  anchor.remove();\n  URL.revokeObjectURL(url);\n}\n","<template>\n  <AppDialog title=\"Factuur mailen\" wide @close=\"emit('close')\">\n    <p class=\"mail__notice\">De factuur wordt als PDF-bijlage naar de klant gemaild. Daarna is de factuur gemarkeerd als verzonden en niet meer te bewerken.</p>\n\n    <div v-if=\"loading\" class=\"hh-empty\">Laden…</div>\n    <template v-else>\n      <FormField label=\"Aan (klant)\" for-id=\"mail-to\">\n        <input id=\"mail-to\" v-model.trim=\"form.to\" type=\"email\" class=\"hh-input\" data-autofocus placeholder=\"klant@voorbeeld.nl\" />\n      </FormField>\n      <FormField v-if=\"bccChoices.length\" label=\"Bcc (kopie)\" hint=\"Aangevinkte adressen krijgen blind een kopie. Beheer de lijst bij Instellingen.\">\n        <div class=\"mail__bcc\">\n          <label v-for=\"choice in bccChoices\" :key=\"choice.email\" class=\"mail__bccrow\">\n            <input v-model=\"choice.checked\" type=\"checkbox\" />\n            <span>{{ choice.email }}</span>\n          </label>\n        </div>\n      </FormField>\n      <FormField label=\"Onderwerp\" for-id=\"mail-subject\">\n        <input id=\"mail-subject\" v-model=\"form.subject\" class=\"hh-input\" />\n      </FormField>\n      <FormField label=\"Bericht\" for-id=\"mail-body\">\n        <textarea id=\"mail-body\" v-model=\"form.body\" class=\"hh-input mail__body\" rows=\"10\"></textarea>\n      </FormField>\n    </template>\n\n    <template #footer>\n      <button class=\"hh-btn\" type=\"button\" @click=\"emit('close')\">Annuleren</button>\n      <button class=\"hh-btn hh-btn--primary\" type=\"button\" :disabled=\"loading || sending\" @click=\"send\">\n        {{ sending ? \"Verzenden…\" : \"Verzenden\" }}\n      </button>\n    </template>\n  </AppDialog>\n</template>\n\n<script setup lang=\"ts\">\n// Mailconcept voor een factuur: haalt de standaardtekst op (getInvoiceMailDraft),\n// laat 'm overschrijven, en verstuurt de factuur echt (PDF als bijlage) via\n// sendInvoiceMail. Daarna wordt de factuur als verzonden gemarkeerd.\nimport { onMounted, reactive, ref } from \"vue\";\nimport { useApi } from \"../lib/api\";\nimport { useToast } from \"../lib/toast\";\nimport AppDialog from \"./AppDialog.vue\";\nimport FormField from \"./FormField.vue\";\n\nconst api = useApi();\nconst showToast = useToast();\n\nconst props = defineProps<{ invoiceId: number }>();\nconst emit = defineEmits<{ close: []; sent: [] }>();\n\nconst loading = ref(true);\nconst sending = ref(false);\nconst form = reactive({ to: \"\", subject: \"\", body: \"\" });\n// Bcc-adressen uit de instellingen: standaard aangevinkt, per verzending uit te\n// vinken. De server beperkt de selectie tot de geconfigureerde adressen.\nconst bccChoices = reactive<Array<{ email: string; checked: boolean }>>([]);\n\nonMounted(async () => {\n  try {\n    const draft = await api.getInvoiceMailDraft({ id: props.invoiceId });\n    form.to = draft.to;\n    form.subject = draft.subject;\n    form.body = draft.body;\n    bccChoices.splice(0, bccChoices.length, ...draft.bcc.map((email) => ({ email, checked: true })));\n  } catch (e) {\n    showToast(e instanceof Error ? e.message : \"Kon het mailconcept niet laden.\");\n  } finally {\n    loading.value = false;\n  }\n});\n\nasync function send(): Promise<void> {\n  sending.value = true;\n  try {\n    await api.sendInvoiceMail({\n      id: props.invoiceId,\n      to: form.to,\n      bcc: bccChoices.filter((choice) => choice.checked).map((choice) => choice.email),\n      subject: form.subject,\n      body: form.body,\n    });\n    showToast(`Factuur verzonden naar ${form.to}.`);\n    emit(\"sent\");\n  } catch (e) {\n    showToast(e instanceof Error ? e.message : \"Versturen mislukt.\");\n  } finally {\n    sending.value = false;\n  }\n}\n</script>\n\n<style scoped>\n.mail__notice {\n  margin: 0 0 12px;\n  padding: 8px 10px;\n  border-radius: var(--hh-radius);\n  background: var(--hh-surface-2);\n  border: 1px solid var(--hh-line);\n  font-size: 12.5px;\n  color: var(--hh-fg-muted);\n}\n.mail__body {\n  min-height: 200px;\n  font-family: inherit;\n}\n.mail__bcc {\n  display: grid;\n  gap: 6px;\n}\n.mail__bccrow {\n  display: flex;\n  align-items: center;\n  gap: 8px;\n  font-size: 13.5px;\n  cursor: pointer;\n}\n</style>\n","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, vModelText as _vModelText, withDirectives as _withDirectives, withCtx as _withCtx, createVNode as _createVNode, renderList as _renderList, Fragment as _Fragment, vModelCheckbox as _vModelCheckbox, toDisplayString as _toDisplayString, createBlock as _createBlock } from \"vue\"\n\nconst _hoisted_1 = {\n  key: 0,\n  class: \"hh-empty\"\n}\nconst _hoisted_2 = { class: \"mail__bcc\" }\nconst _hoisted_3 = [\"onUpdate:modelValue\"]\nconst _hoisted_4 = [\"disabled\"]\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return (_openBlock(), _createBlock($setup[\"AppDialog\"], {\n    title: \"Factuur mailen\",\n    wide: \"\",\n    onClose: _cache[4] || (_cache[4] = $event => ($setup.emit('close')))\n  }, {\n    footer: _withCtx(() => [\n      _createElementVNode(\"button\", {\n        class: \"hh-btn\",\n        type: \"button\",\n        onClick: _cache[3] || (_cache[3] = $event => ($setup.emit('close')))\n      }, \"Annuleren\"),\n      _createElementVNode(\"button\", {\n        class: \"hh-btn hh-btn--primary\",\n        type: \"button\",\n        disabled: $setup.loading || $setup.sending,\n        onClick: $setup.send\n      }, _toDisplayString($setup.sending ? \"Verzenden…\" : \"Verzenden\"), 9 /* TEXT, PROPS */, _hoisted_4)\n    ]),\n    default: _withCtx(() => [\n      _cache[5] || (_cache[5] = _createElementVNode(\"p\", { class: \"mail__notice\" }, \"De factuur wordt als PDF-bijlage naar de klant gemaild. Daarna is de factuur gemarkeerd als verzonden en niet meer te bewerken.\", -1 /* CACHED */)),\n      ($setup.loading)\n        ? (_openBlock(), _createElementBlock(\"div\", _hoisted_1, \"Laden…\"))\n        : (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n            _createVNode($setup[\"FormField\"], {\n              label: \"Aan (klant)\",\n              \"for-id\": \"mail-to\"\n            }, {\n              default: _withCtx(() => [\n                _withDirectives(_createElementVNode(\"input\", {\n                  id: \"mail-to\",\n                  \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => (($setup.form.to) = $event)),\n                  type: \"email\",\n                  class: \"hh-input\",\n                  \"data-autofocus\": \"\",\n                  placeholder: \"klant@voorbeeld.nl\"\n                }, null, 512 /* NEED_PATCH */), [\n                  [\n                    _vModelText,\n                    $setup.form.to,\n                    void 0,\n                    { trim: true }\n                  ]\n                ])\n              ]),\n              _: 1 /* STABLE */\n            }),\n            ($setup.bccChoices.length)\n              ? (_openBlock(), _createBlock($setup[\"FormField\"], {\n                  key: 0,\n                  label: \"Bcc (kopie)\",\n                  hint: \"Aangevinkte adressen krijgen blind een kopie. Beheer de lijst bij Instellingen.\"\n                }, {\n                  default: _withCtx(() => [\n                    _createElementVNode(\"div\", _hoisted_2, [\n                      (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.bccChoices, (choice) => {\n                        return (_openBlock(), _createElementBlock(\"label\", {\n                          key: choice.email,\n                          class: \"mail__bccrow\"\n                        }, [\n                          _withDirectives(_createElementVNode(\"input\", {\n                            \"onUpdate:modelValue\": $event => ((choice.checked) = $event),\n                            type: \"checkbox\"\n                          }, null, 8 /* PROPS */, _hoisted_3), [\n                            [_vModelCheckbox, choice.checked]\n                          ]),\n                          _createElementVNode(\"span\", null, _toDisplayString(choice.email), 1 /* TEXT */)\n                        ]))\n                      }), 128 /* KEYED_FRAGMENT */))\n                    ])\n                  ]),\n                  _: 1 /* STABLE */\n                }))\n              : _createCommentVNode(\"v-if\", true),\n            _createVNode($setup[\"FormField\"], {\n              label: \"Onderwerp\",\n              \"for-id\": \"mail-subject\"\n            }, {\n              default: _withCtx(() => [\n                _withDirectives(_createElementVNode(\"input\", {\n                  id: \"mail-subject\",\n                  \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => (($setup.form.subject) = $event)),\n                  class: \"hh-input\"\n                }, null, 512 /* NEED_PATCH */), [\n                  [_vModelText, $setup.form.subject]\n                ])\n              ]),\n              _: 1 /* STABLE */\n            }),\n            _createVNode($setup[\"FormField\"], {\n              label: \"Bericht\",\n              \"for-id\": \"mail-body\"\n            }, {\n              default: _withCtx(() => [\n                _withDirectives(_createElementVNode(\"textarea\", {\n                  id: \"mail-body\",\n                  \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => (($setup.form.body) = $event)),\n                  class: \"hh-input mail__body\",\n                  rows: \"10\"\n                }, null, 512 /* NEED_PATCH */), [\n                  [_vModelText, $setup.form.body]\n                ])\n              ]),\n              _: 1 /* STABLE */\n            })\n          ], 64 /* STABLE_FRAGMENT */))\n    ]),\n    _: 1 /* STABLE */,\n    __: [5]\n  }))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/InvoiceMailDialog.vue?type=script\";import \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/InvoiceMailDialog.vue?type=style&index=0\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/InvoiceMailDialog.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/InvoiceMailDialog.vue\";script.__scopeId = \"data-v-de98e266\";export default script;","<script setup lang=\"ts\">\nimport { onBeforeUnmount, shallowRef, useTemplateRef, watch } from \"vue\";\n\nconst props = defineProps<{ html: string; fit?: boolean; highlight?: string[]; editTargets?: { selector: string; field: string; label: string }[] }>();\nconst emit = defineEmits<{ ready: [value: boolean]; edit: [field: string] }>();\nconst frame = useTemplateRef<HTMLIFrameElement>(\"frame\");\nconst container = useTemplateRef<HTMLDivElement>(\"container\");\nconst height = shallowRef(1123);\nconst scale = shallowRef(1);\nlet observer: ResizeObserver | null = null;\nlet removeResize: (() => void) | null = null;\n\nwatch(() => props.html, () => {\n  observer?.disconnect();\n  height.value = 1123;\n  emit(\"ready\", false);\n}, { flush: \"sync\" });\n\n/** Marks the template sections (data-section) that the editor is currently changing. */\nfunction applyHighlight(): void {\n  const document = frame.value?.contentDocument;\n  if (!document?.querySelector(\".invoice\")) return;\n  if (!document.getElementById(\"hh-highlight-style\")) {\n    const css = document.createElement(\"style\");\n    css.id = \"hh-highlight-style\";\n    css.textContent = \"@media screen { [data-section] { transition: outline-color 0.2s, background-color 0.2s; outline: 2px dashed transparent; outline-offset: 4px; border-radius: 2px; }\"\n      + \" .hh-highlight { outline-color: #2f8f5b; background-color: rgba(47, 143, 91, 0.08); }\"\n      + \" .hh-highlight:empty { min-height: 1.5em; } }\";\n    document.head.append(css);\n  }\n  for (const element of document.querySelectorAll(\"[data-section]\"))\n    element.classList.toggle(\"hh-highlight\", props.highlight?.includes(element.getAttribute(\"data-section\") ?? \"\") ?? false);\n}\nwatch(() => props.highlight, applyHighlight);\n\nfunction onLoad(): void {\n  observer?.disconnect();\n  removeResize?.();\n  const document = frame.value?.contentDocument;\n  if (!document?.querySelector(\".invoice\")) return;\n\n  // Observe the document body rather than the iframe viewport: long invoices\n  // must remain fully visible, including after images or fonts finish loading.\n  const resize = () => {\n    height.value = Math.ceil(document.body.getBoundingClientRect().height);\n    // Scale the complete sheet to the available width and to the container's max-height, so every\n    // change stays visible without scrolling, while retaining its actual print geometry.\n    const parent = container.value?.parentElement;\n    if (props.fit && container.value && parent && frame.value) {\n      const maxHeight = parseFloat(getComputedStyle(container.value).maxHeight);\n      const byHeight = Number.isFinite(maxHeight) ? (maxHeight - 2) / height.value : 1;\n      scale.value = Math.min(1, (parent.clientWidth - 2) / frame.value.offsetWidth, byHeight);\n    } else {\n      scale.value = 1;\n    }\n  };\n  observer = new ResizeObserver(resize);\n  observer.observe(document.body);\n  if (props.fit && container.value?.parentElement) observer.observe(container.value.parentElement);\n  window.addEventListener(\"resize\", resize);\n  removeResize = () => { window.removeEventListener(\"resize\", resize); };\n  resize();\n  applyHighlight();\n  // Only the style editor supplies targets; viewing and printing invoices remain passive.\n  if (props.editTargets) {\n    const css = document.createElement(\"style\");\n    css.textContent = \"@media screen { .hh-edit-target { cursor: pointer; } .hh-edit-target:hover, .hh-edit-target:focus-visible { outline: 2px dashed #2f8f5b; outline-offset: 4px; } }\";\n    document.head.append(css);\n    for (const target of props.editTargets) {\n      for (const element of document.querySelectorAll<HTMLElement>(target.selector)) {\n        element.classList.add(\"hh-edit-target\");\n        element.tabIndex = 0;\n        element.setAttribute(\"role\", \"button\");\n        element.setAttribute(\"aria-label\", target.label);\n        element.onclick = () => emit(\"edit\", target.field);\n        element.onkeydown = (event) => {\n          if (event.key !== \"Enter\" && event.key !== \" \") return;\n          event.preventDefault();\n          emit(\"edit\", target.field);\n        };\n      }\n    }\n  }\n  emit(\"ready\", true);\n}\n\n/** Print the invoice document itself so application chrome and frame clipping cannot enter the output. */\nfunction print(): void {\n  frame.value?.contentWindow?.focus();\n  frame.value?.contentWindow?.print();\n}\n\n/** The rendered invoice document, for the designer that measures and live-patches its blocks. */\nfunction getDocument(): Document | null {\n  return frame.value?.contentDocument ?? null;\n}\n\ndefineExpose({ print, getDocument, scale });\nonBeforeUnmount(() => { observer?.disconnect(); removeResize?.(); });\n</script>\n\n<template>\n  <div\n    ref=\"container\"\n    class=\"invoice-preview\"\n    :class=\"{ 'invoice-preview--fit': fit }\"\n    :style=\"fit && frame ? { width: `${frame.offsetWidth * scale + 2}px` } : undefined\"\n  >\n    <div class=\"invoice-preview__sheet\" :style=\"fit ? { height: `${height * scale}px` } : undefined\">\n      <!-- Scripts stay disabled; same-origin access is needed only for sizing and printing. -->\n      <iframe\n        ref=\"frame\"\n        class=\"invoice-preview__frame\"\n        title=\"Factuurvoorbeeld\"\n        sandbox=\"allow-same-origin allow-modals\"\n        :srcdoc=\"html\"\n        :style=\"{ height: `${height}px`, transform: fit ? `scale(${scale})` : undefined }\"\n        @load=\"onLoad\"\n      />\n      <slot :scale=\"scale\" />\n    </div>\n  </div>\n</template>\n\n<style scoped>\n.invoice-preview {\n  max-width: 210mm;\n  margin: 0 auto;\n  overflow-x: auto;\n  border: 1px solid var(--hh-line);\n  border-radius: var(--hh-radius-lg);\n  background: #fff;\n  box-shadow: var(--hh-shadow);\n}\n.invoice-preview__frame {\n  display: block;\n  width: 210mm;\n  border: 0;\n  transform-origin: top left;\n}\n.invoice-preview__sheet { position: relative; }\n.invoice-preview--fit { overflow: hidden; }\n</style>\n","import { createCommentVNode as _createCommentVNode, normalizeStyle as _normalizeStyle, createElementVNode as _createElementVNode, renderSlot as _renderSlot, normalizeClass as _normalizeClass, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = [\"srcdoc\"]\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return (_openBlock(), _createElementBlock(\"div\", {\n    ref: \"container\",\n    class: _normalizeClass([\"invoice-preview\", { 'invoice-preview--fit': $props.fit }]),\n    style: _normalizeStyle($props.fit && $setup.frame ? { width: `${$setup.frame.offsetWidth * $setup.scale + 2}px` } : undefined)\n  }, [\n    _createElementVNode(\"div\", {\n      class: \"invoice-preview__sheet\",\n      style: _normalizeStyle($props.fit ? { height: `${$setup.height * $setup.scale}px` } : undefined)\n    }, [\n      _createCommentVNode(\" Scripts stay disabled; same-origin access is needed only for sizing and printing. \"),\n      _createElementVNode(\"iframe\", {\n        ref: \"frame\",\n        class: \"invoice-preview__frame\",\n        title: \"Factuurvoorbeeld\",\n        sandbox: \"allow-same-origin allow-modals\",\n        srcdoc: $props.html,\n        style: _normalizeStyle({ height: `${$setup.height}px`, transform: $props.fit ? `scale(${$setup.scale})` : undefined }),\n        onLoad: $setup.onLoad\n      }, null, 44 /* STYLE, PROPS, NEED_HYDRATION */, _hoisted_1),\n      _renderSlot(_ctx.$slots, \"default\", { scale: $setup.scale }, undefined, true)\n    ], 4 /* STYLE */)\n  ], 6 /* CLASS, STYLE */))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/InvoicePreview.vue?type=script\";import \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/InvoicePreview.vue?type=style&index=0\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/InvoicePreview.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/InvoicePreview.vue\";script.__scopeId = \"data-v-09916bc6\";export default script;","<script setup lang=\"ts\">\nimport { computed, shallowRef, useTemplateRef, watch } from \"vue\";\nimport { Money } from \"@webhare/std\";\nimport { RouterLink, useRoute, useRouter } from \"vue-router\";\nimport { invoiceActivityText } from \"../lib/invoiceActivity\";\nimport { useApi } from \"../lib/api\";\nimport { formatDate, formatEuro } from \"../lib/format\";\nimport { downloadBase64 } from \"../lib/download\";\nimport { useToast } from \"../lib/toast\";\nimport { useEscapeBack } from \"../lib/useEscapeBack\";\nimport InvoiceMailDialog from \"../components/InvoiceMailDialog.vue\";\nimport InvoicePreview from \"../components/InvoicePreview.vue\";\nimport AppDialog from \"../components/AppDialog.vue\";\n\nconst api = useApi();\nconst showToast = useToast();\n\ntype Invoice = NonNullable<Awaited<ReturnType<typeof api.getInvoice>>>;\nconst route = useRoute();\nconst router = useRouter();\nconst invoiceId = computed(() => Number(route.params.id));\n\nconst loading = shallowRef(true);\nconst invoice = shallowRef<Invoice | null>(null);\nconst invoiceHtml = shallowRef(\"\");\nconst previewReady = shallowRef(false);\nconst preview = useTemplateRef<InstanceType<typeof InvoicePreview>>(\"preview\");\nconst loadError = shallowRef(\"\");\nlet loadRequest = 0;\n\nasync function load(): Promise<void> {\n  // Discard late replies when the route changes while a document is rendering.\n  const request = ++loadRequest;\n  const id = invoiceId.value;\n  loading.value = true;\n  invoice.value = null;\n  invoiceHtml.value = \"\";\n  previewReady.value = false;\n  loadError.value = \"\";\n  try {\n    const detail = await api.getInvoice({ id });\n    if (request !== loadRequest) return;\n    invoice.value = detail;\n    if (detail) {\n      const html = await api.getInvoiceHtml({ id });\n      if (request !== loadRequest) return;\n      invoiceHtml.value = html;\n    }\n  } catch (e) {\n    if (request === loadRequest) {\n      loadError.value = e instanceof Error ? e.message : \"Factuurweergave laden mislukt.\";\n    }\n  } finally {\n    if (request === loadRequest) loading.value = false;\n  }\n}\n\nfunction edit(): void {\n  void router.push({ name: \"fakturen-bewerken\", params: { id: String(invoiceId.value) } });\n}\n\nfunction print(): void {\n  if (previewReady.value) preview.value?.print();\n}\n\n// ── Download als PDF (server-side gegenereerd) ──────────────────────────────\nconst pdfBusy = shallowRef(false);\n\nasync function downloadPdf(): Promise<void> {\n  if (!invoice.value) return;\n  pdfBusy.value = true;\n  try {\n    const { filename, base64 } = await api.getInvoicePdf({ id: invoiceId.value });\n    downloadBase64({ base64, filename, mimeType: \"application/pdf\" });\n  } catch (e) {\n    showToast(e instanceof Error ? e.message : \"PDF genereren mislukt.\");\n  } finally {\n    pdfBusy.value = false;\n  }\n}\n\n// ── Mailen ──────────────────────────────────────────────────────────────────\nconst mailOpen = shallowRef(false);\nconst deleteOpen = shallowRef(false);\nconst deleting = shallowRef(false);\nconst deleteError = shallowRef(\"\");\nconst canDelete = computed(() => invoice.value !== null && !invoice.value.sent && !invoice.value.paid && Money.check(invoice.value.paidAmount, \"==\", \"0\"));\n\nfunction openDelete(): void {\n  deleteError.value = \"\";\n  deleteOpen.value = true;\n}\n\nasync function confirmDelete(): Promise<void> {\n  if (!invoice.value || deleting.value) return;\n  const id = invoice.value.id;\n  deleting.value = true;\n  deleteError.value = \"\";\n  try {\n    await api.deleteInvoice({ id });\n    showToast(\"Factuur verwijderd.\");\n    deleteOpen.value = false;\n    void router.push({ name: \"fakturen\" });\n  } catch (e) {\n    deleteError.value = e instanceof Error ? e.message : \"Verwijderen mislukt.\";\n  } finally {\n    deleting.value = false;\n  }\n}\n\n// Na mailen is de faktuur gemarkeerd als verzonden: herladen zodat de Bewerken-\n// knop verdwijnt en de verzonden-badge verschijnt.\nfunction onMailSent(): void {\n  mailOpen.value = false;\n  void load();\n}\n\nuseEscapeBack({ name: \"fakturen\" });\n\nwatch(invoiceId, () => { deleteOpen.value = false; void load(); }, { immediate: true });\n</script>\n\n<template>\n  <section>\n    <div class=\"no-print\">\n      <RouterLink class=\"detail__back\" :to=\"{ name: 'fakturen' }\">&larr; Facturen</RouterLink>\n\n      <div v-if=\"loading\" class=\"hh-empty\">Laden…</div>\n      <p v-else-if=\"!invoice && !loadError\" class=\"hh-formerror\">Factuur niet gevonden.</p>\n    </div>\n\n    <p v-if=\"loadError\" class=\"hh-formerror\" role=\"alert\">{{ loadError }}</p>\n\n    <template v-if=\"invoice\">\n      <div class=\"hh-page__bar no-print\">\n        <div>\n          <h1 class=\"hh-page__title\">Factuur <span class=\"detail__mono\">{{ invoice.number }}</span></h1>\n          <p class=\"hh-page__sub\">\n            {{ invoice.customerTitle }} ·\n            <span :class=\"invoice.paid ? 'hh-badge' : 'hh-badge hh-badge--warn'\">\n              {{ invoice.paid ? `betaald op ${formatDate(invoice.paidDate)}` : `openstaand ${formatEuro(invoice.openAmount)}` }}\n            </span>\n            <template v-if=\"invoice.sent\"> · <span class=\"hh-badge\">verzonden op {{ formatDate(invoice.sentDate) }}</span></template>\n          </p>\n        </div>\n        <div class=\"detail__actions\">\n          <button v-if=\"!invoice.sent\" class=\"hh-btn\" type=\"button\" @click=\"edit\">Bewerken</button>\n          <button class=\"hh-btn\" type=\"button\" @click=\"mailOpen = true\">Mailen</button>\n          <button class=\"hh-btn\" type=\"button\" :disabled=\"pdfBusy\" @click=\"downloadPdf\">\n            {{ pdfBusy ? \"PDF…\" : \"Download PDF\" }}\n          </button>\n          <button class=\"hh-btn hh-btn--primary\" type=\"button\" :disabled=\"!previewReady\" @click=\"print\">Printen</button>\n          <button v-if=\"canDelete\" class=\"hh-btn hh-btn--danger\" type=\"button\" :disabled=\"deleting\" @click=\"openDelete\">Verwijderen</button>\n        </div>\n      </div>\n\n      <section class=\"hh-card detail__history no-print\" aria-label=\"Activiteitenlog\">\n        <h2>Activiteiten</h2>\n        <p v-if=\"!invoice.activityLog.length\" class=\"hh-muted\">Voor deze factuur zijn nog geen activiteiten vastgelegd.</p>\n        <ol v-else>\n          <li v-for=\"event in invoice.activityLog\" :key=\"event.id\">\n            <strong>{{ invoiceActivityText(event.action) }}</strong>\n            <span>{{ event.actorName || \"Onbekende gebruiker\" }} · {{ new Date(event.at).toLocaleString(\"nl-NL\") }}</span>\n            <p v-if=\"event.details\">{{ event.details }}</p>\n          </li>\n        </ol>\n      </section>\n\n      <!-- Print preview uses the same document template as the downloaded PDF. -->\n      <InvoicePreview v-if=\"invoiceHtml\" ref=\"preview\" :html=\"invoiceHtml\" @ready=\"previewReady = $event\" />\n    </template>\n\n    <!-- Sending the invoice also marks it as sent. -->\n    <InvoiceMailDialog v-if=\"mailOpen\" :invoice-id=\"invoiceId\" @close=\"mailOpen = false\" @sent=\"onMailSent\" />\n    <AppDialog v-if=\"deleteOpen && invoice\" title=\"Factuur verwijderen\" @close=\"!deleting && (deleteOpen = false)\">\n      <p>Weet je zeker dat je factuur {{ invoice.number }} van {{ invoice.customerTitle }} wilt verwijderen?</p>\n      <p v-if=\"deleteError\" class=\"hh-formerror\" role=\"alert\">{{ deleteError }}</p>\n      <template #footer>\n        <button class=\"hh-btn\" type=\"button\" data-autofocus :disabled=\"deleting\" @click=\"deleteOpen = false\">Annuleren</button>\n        <button class=\"hh-btn hh-btn--danger\" type=\"button\" :disabled=\"deleting\" @click=\"confirmDelete\">\n          {{ deleting ? \"Verwijderen…\" : \"Verwijderen\" }}\n        </button>\n      </template>\n    </AppDialog>\n  </section>\n</template>\n\n<style scoped>\n.detail__history { padding: 16px 18px; margin-bottom: 18px; }\n.detail__history h2 { margin: 0 0 12px; font-size: 16px; }\n.detail__history ol { list-style: none; padding: 0; margin: 0; display: grid; gap: 12px; }\n.detail__history li { display: grid; gap: 3px; font-size: 14px; }\n.detail__history span { color: var(--hh-fg-muted); }\n.detail__history p { margin: 0; }\n\n.detail__back {\n  display: inline-block;\n  margin-bottom: 12px;\n  color: var(--hh-fg-muted);\n  text-decoration: none;\n  font-size: 13px;\n}\n.detail__back:hover {\n  color: var(--hh-accent);\n}\n.detail__mono {\n  font-family: var(--hh-mono);\n}\n.detail__actions {\n  display: flex;\n  gap: 8px;\n  flex-wrap: wrap;\n}\n\n.detail__back,\n.detail__actions button {\n  cursor: pointer;\n}\n</style>\n","import { createTextVNode as _createTextVNode, withCtx as _withCtx, createVNode as _createVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, normalizeClass as _normalizeClass, Fragment as _Fragment, renderList as _renderList, createBlock as _createBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"no-print\" }\nconst _hoisted_2 = {\n  key: 0,\n  class: \"hh-empty\"\n}\nconst _hoisted_3 = {\n  key: 1,\n  class: \"hh-formerror\"\n}\nconst _hoisted_4 = {\n  key: 0,\n  class: \"hh-formerror\",\n  role: \"alert\"\n}\nconst _hoisted_5 = { class: \"hh-page__bar no-print\" }\nconst _hoisted_6 = { class: \"hh-page__title\" }\nconst _hoisted_7 = { class: \"detail__mono\" }\nconst _hoisted_8 = { class: \"hh-page__sub\" }\nconst _hoisted_9 = { class: \"hh-badge\" }\nconst _hoisted_10 = { class: \"detail__actions\" }\nconst _hoisted_11 = [\"disabled\"]\nconst _hoisted_12 = [\"disabled\"]\nconst _hoisted_13 = [\"disabled\"]\nconst _hoisted_14 = {\n  class: \"hh-card detail__history no-print\",\n  \"aria-label\": \"Activiteitenlog\"\n}\nconst _hoisted_15 = {\n  key: 0,\n  class: \"hh-muted\"\n}\nconst _hoisted_16 = { key: 1 }\nconst _hoisted_17 = { key: 0 }\nconst _hoisted_18 = {\n  key: 0,\n  class: \"hh-formerror\",\n  role: \"alert\"\n}\nconst _hoisted_19 = [\"disabled\"]\nconst _hoisted_20 = [\"disabled\"]\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return (_openBlock(), _createElementBlock(\"section\", null, [\n    _createElementVNode(\"div\", _hoisted_1, [\n      _createVNode($setup[\"RouterLink\"], {\n        class: \"detail__back\",\n        to: { name: 'fakturen' }\n      }, {\n        default: _withCtx(() => _cache[5] || (_cache[5] = [\n          _createTextVNode(\"← Facturen\", -1 /* CACHED */)\n        ])),\n        _: 1 /* STABLE */,\n        __: [5]\n      }),\n      ($setup.loading)\n        ? (_openBlock(), _createElementBlock(\"div\", _hoisted_2, \"Laden…\"))\n        : (!$setup.invoice && !$setup.loadError)\n          ? (_openBlock(), _createElementBlock(\"p\", _hoisted_3, \"Factuur niet gevonden.\"))\n          : _createCommentVNode(\"v-if\", true)\n    ]),\n    ($setup.loadError)\n      ? (_openBlock(), _createElementBlock(\"p\", _hoisted_4, _toDisplayString($setup.loadError), 1 /* TEXT */))\n      : _createCommentVNode(\"v-if\", true),\n    ($setup.invoice)\n      ? (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n          _createElementVNode(\"div\", _hoisted_5, [\n            _createElementVNode(\"div\", null, [\n              _createElementVNode(\"h1\", _hoisted_6, [\n                _cache[6] || (_cache[6] = _createTextVNode(\"Factuur \", -1 /* CACHED */)),\n                _createElementVNode(\"span\", _hoisted_7, _toDisplayString($setup.invoice.number), 1 /* TEXT */)\n              ]),\n              _createElementVNode(\"p\", _hoisted_8, [\n                _createTextVNode(_toDisplayString($setup.invoice.customerTitle) + \" · \", 1 /* TEXT */),\n                _createElementVNode(\"span\", {\n                  class: _normalizeClass($setup.invoice.paid ? 'hh-badge' : 'hh-badge hh-badge--warn')\n                }, _toDisplayString($setup.invoice.paid ? `betaald op ${$setup.formatDate($setup.invoice.paidDate)}` : `openstaand ${$setup.formatEuro($setup.invoice.openAmount)}`), 3 /* TEXT, CLASS */),\n                ($setup.invoice.sent)\n                  ? (_openBlock(), _createElementBlock(_Fragment, { key: 0 }, [\n                      _cache[7] || (_cache[7] = _createTextVNode(\" · \", -1 /* CACHED */)),\n                      _createElementVNode(\"span\", _hoisted_9, \"verzonden op \" + _toDisplayString($setup.formatDate($setup.invoice.sentDate)), 1 /* TEXT */)\n                    ], 64 /* STABLE_FRAGMENT */))\n                  : _createCommentVNode(\"v-if\", true)\n              ])\n            ]),\n            _createElementVNode(\"div\", _hoisted_10, [\n              (!$setup.invoice.sent)\n                ? (_openBlock(), _createElementBlock(\"button\", {\n                    key: 0,\n                    class: \"hh-btn\",\n                    type: \"button\",\n                    onClick: $setup.edit\n                  }, \"Bewerken\"))\n                : _createCommentVNode(\"v-if\", true),\n              _createElementVNode(\"button\", {\n                class: \"hh-btn\",\n                type: \"button\",\n                onClick: _cache[0] || (_cache[0] = $event => ($setup.mailOpen = true))\n              }, \"Mailen\"),\n              _createElementVNode(\"button\", {\n                class: \"hh-btn\",\n                type: \"button\",\n                disabled: $setup.pdfBusy,\n                onClick: $setup.downloadPdf\n              }, _toDisplayString($setup.pdfBusy ? \"PDF…\" : \"Download PDF\"), 9 /* TEXT, PROPS */, _hoisted_11),\n              _createElementVNode(\"button\", {\n                class: \"hh-btn hh-btn--primary\",\n                type: \"button\",\n                disabled: !$setup.previewReady,\n                onClick: $setup.print\n              }, \"Printen\", 8 /* PROPS */, _hoisted_12),\n              ($setup.canDelete)\n                ? (_openBlock(), _createElementBlock(\"button\", {\n                    key: 1,\n                    class: \"hh-btn hh-btn--danger\",\n                    type: \"button\",\n                    disabled: $setup.deleting,\n                    onClick: $setup.openDelete\n                  }, \"Verwijderen\", 8 /* PROPS */, _hoisted_13))\n                : _createCommentVNode(\"v-if\", true)\n            ])\n          ]),\n          _createElementVNode(\"section\", _hoisted_14, [\n            _cache[8] || (_cache[8] = _createElementVNode(\"h2\", null, \"Activiteiten\", -1 /* CACHED */)),\n            (!$setup.invoice.activityLog.length)\n              ? (_openBlock(), _createElementBlock(\"p\", _hoisted_15, \"Voor deze factuur zijn nog geen activiteiten vastgelegd.\"))\n              : (_openBlock(), _createElementBlock(\"ol\", _hoisted_16, [\n                  (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.invoice.activityLog, (event) => {\n                    return (_openBlock(), _createElementBlock(\"li\", {\n                      key: event.id\n                    }, [\n                      _createElementVNode(\"strong\", null, _toDisplayString($setup.invoiceActivityText(event.action)), 1 /* TEXT */),\n                      _createElementVNode(\"span\", null, _toDisplayString(event.actorName || \"Onbekende gebruiker\") + \" · \" + _toDisplayString(new Date(event.at).toLocaleString(\"nl-NL\")), 1 /* TEXT */),\n                      (event.details)\n                        ? (_openBlock(), _createElementBlock(\"p\", _hoisted_17, _toDisplayString(event.details), 1 /* TEXT */))\n                        : _createCommentVNode(\"v-if\", true)\n                    ]))\n                  }), 128 /* KEYED_FRAGMENT */))\n                ]))\n          ]),\n          _createCommentVNode(\" Print preview uses the same document template as the downloaded PDF. \"),\n          ($setup.invoiceHtml)\n            ? (_openBlock(), _createBlock($setup[\"InvoicePreview\"], {\n                key: 0,\n                ref: \"preview\",\n                html: $setup.invoiceHtml,\n                onReady: _cache[1] || (_cache[1] = $event => ($setup.previewReady = $event))\n              }, null, 8 /* PROPS */, [\"html\"]))\n            : _createCommentVNode(\"v-if\", true)\n        ], 64 /* STABLE_FRAGMENT */))\n      : _createCommentVNode(\"v-if\", true),\n    _createCommentVNode(\" Sending the invoice also marks it as sent. \"),\n    ($setup.mailOpen)\n      ? (_openBlock(), _createBlock($setup[\"InvoiceMailDialog\"], {\n          key: 2,\n          \"invoice-id\": $setup.invoiceId,\n          onClose: _cache[2] || (_cache[2] = $event => ($setup.mailOpen = false)),\n          onSent: $setup.onMailSent\n        }, null, 8 /* PROPS */, [\"invoice-id\"]))\n      : _createCommentVNode(\"v-if\", true),\n    ($setup.deleteOpen && $setup.invoice)\n      ? (_openBlock(), _createBlock($setup[\"AppDialog\"], {\n          key: 3,\n          title: \"Factuur verwijderen\",\n          onClose: _cache[4] || (_cache[4] = $event => (!$setup.deleting && ($setup.deleteOpen = false)))\n        }, {\n          footer: _withCtx(() => [\n            _createElementVNode(\"button\", {\n              class: \"hh-btn\",\n              type: \"button\",\n              \"data-autofocus\": \"\",\n              disabled: $setup.deleting,\n              onClick: _cache[3] || (_cache[3] = $event => ($setup.deleteOpen = false))\n            }, \"Annuleren\", 8 /* PROPS */, _hoisted_19),\n            _createElementVNode(\"button\", {\n              class: \"hh-btn hh-btn--danger\",\n              type: \"button\",\n              disabled: $setup.deleting,\n              onClick: $setup.confirmDelete\n            }, _toDisplayString($setup.deleting ? \"Verwijderen…\" : \"Verwijderen\"), 9 /* TEXT, PROPS */, _hoisted_20)\n          ]),\n          default: _withCtx(() => [\n            _createElementVNode(\"p\", null, \"Weet je zeker dat je factuur \" + _toDisplayString($setup.invoice.number) + \" van \" + _toDisplayString($setup.invoice.customerTitle) + \" wilt verwijderen?\", 1 /* TEXT */),\n            ($setup.deleteError)\n              ? (_openBlock(), _createElementBlock(\"p\", _hoisted_18, _toDisplayString($setup.deleteError), 1 /* TEXT */))\n              : _createCommentVNode(\"v-if\", true)\n          ]),\n          _: 1 /* STABLE */\n        }))\n      : _createCommentVNode(\"v-if\", true)\n  ]))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/InvoiceDetailView.vue?type=script\";import \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/InvoiceDetailView.vue?type=style&index=0\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/InvoiceDetailView.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/InvoiceDetailView.vue\";script.__scopeId = \"data-v-0d7969ba\";export default script;","// Overzicht fakturen/uren (DOS-scherm FU): per klant en fiscaal jaar de fakturen,\n// uren en verschotten met de Tellen-samenvatting. buildStatement levert de data\n// voor het scherm, renderStatementPages de platte 80-koloms uitdraai zoals het\n// DOS-origineel die naar de printer stuurde (zie docs/todo-tests.md).\n\nimport { Money } from \"@webhare/std\";\nimport { computeTellen, type TellenResult } from \"../../../../js/internal/domain\";\n\nconst ZERO = new Money(\"0\");\n\nexport interface StatementInvoice { id: number; date: string; number: string; fiscalYear: number; amount: Money; margin: Money; openAmount: Money }\nexport interface StatementEntry { id: number; date: string; fiscalYear: number; employeeName: string; activity: string; description: string; hours: Money; rate: Money; amount: Money }\nexport interface StatementExpense { id: number; date: string; fiscalYear: number; kind: string; description: string; amount: Money }\n\nexport interface StatementYear extends TellenResult {\n  year: number;\n  invoices: StatementInvoice[];\n  entries: StatementEntry[];\n  expenses: StatementExpense[];\n  hoursRowsAmount: Money;\n  openTotal: Money;\n}\n\nexport function buildStatement(input: { invoices: StatementInvoice[]; entries: StatementEntry[]; expenses: StatementExpense[]; years: number[] }): StatementYear[] {\n  return [...new Set(input.years)].sort((a, b) => a - b).map((year) => {\n    const pick = <T extends { fiscalYear: number; date: string }>(rows: T[]) => rows.filter((r) => r.fiscalYear === year).sort((a, b) => a.date.localeCompare(b.date));\n    const invoices = pick(input.invoices);\n    const entries = pick(input.entries);\n    const expenses = pick(input.expenses);\n    return {\n      year, invoices, entries, expenses,\n      ...computeTellen({ entries, expenses, invoices }),\n      hoursRowsAmount: entries.reduce((sum, e) => Money.add(sum, e.amount), ZERO),\n      openTotal: invoices.reduce((sum, i) => Money.add(sum, i.openAmount), ZERO),\n    };\n  });\n}\n\n// ── Platte uitdraai ─────────────────────────────────────────────────────────\n\nexport const PAGE_WIDTH = 80;\nexport const PAGE_LINES = 64;\nconst MONTHS = [\"jan\", \"feb\", \"mrt\", \"apr\", \"mei\", \"jun\", \"jul\", \"aug\", \"sep\", \"okt\", \"nov\", \"dec\"];\nconst two = (n: number) => String(n).padStart(2, \"0\");\n// Left columns always keep one blank before the next column.\nconst L = (s: string, w: number) => s.slice(0, w - 1).padEnd(w);\nconst R = (s: string, w: number) => s.slice(0, w).padStart(w);\nconst dosDate = (iso: string) => { const d = new Date(iso); return `${d.getDate()}-${two(d.getMonth() + 1)}-${two(d.getFullYear() % 100)}`; };\nconst fixed = (v: Money) => Money.roundToMultiple(v, \"0.01\", \"half-toward-infinity\").toNumber().toFixed(2);\n// The DOS original printed \"open\" in Dutch notation, unlike every other column.\nconst dutch = (v: Money) => Money.roundToMultiple(v, \"0.01\", \"half-toward-infinity\").toNumber().toLocaleString(\"nl-NL\", { minimumFractionDigits: 2, maximumFractionDigits: 2 });\nconst none = (what: string) => `er zijn geen ${what} aanwezig die aan de opgegeven criteria voldoen`;\n\n// One column spec per section, shared by header, rows and totals so they cannot drift apart.\ntype Column = { label: string; width: number; right?: boolean; rule?: number };\n// Every section ends at column 79: one \"=\" of the full-width rule sticks out past the last value.\nconst line = (cols: Column[], cells: string[]) => cols.map((c, i) => (c.right ? R : L)(cells[i] ?? \"\", c.width)).join(\"\").trimEnd();\nconst underline = (cols: Column[]) => line(cols, cols.map((c) => (c.rule ? \"=\".repeat(c.rule) : \"\")));\nconst date = (iso: string) => R(dosDate(iso), 8);\n\nconst INVOICE_COLS: Column[] = [{ label: \"datum\", width: 10 }, { label: \"faktuurnummer\", width: 16 }, { label: \"declaratie\", width: 19, right: true, rule: 10 }, { label: \"marge\", width: 16, right: true, rule: 10 }, { label: \"open\", width: 18, right: true, rule: 10 }];\nconst HOURS_COLS: Column[] = [{ label: \"datum\", width: 10 }, { label: \"werknemer\", width: 16 }, { label: \"werkzaamheden\", width: 30 }, { label: \"uren\", width: 9, right: true, rule: 7 }, { label: \"bedrag\", width: 14, right: true, rule: 9 }];\nconst EXPENSE_COLS: Column[] = [{ label: \"datum\", width: 10 }, { label: \"soort\", width: 16 }, { label: \"omschrijving\", width: 38 }, { label: \"bedrag\", width: 15, right: true, rule: 9 }];\n\nfunction yearBody(y: StatementYear): string[] {\n  const out: string[] = [];\n  const header = (cols: Column[]) => [line(cols, cols.map((c) => c.label)), \"=\".repeat(PAGE_WIDTH)];\n\n  out.push(...header(INVOICE_COLS));\n  if (!y.invoices.length) out.push(none(\"fakturen\"));\n  for (const i of y.invoices) out.push(line(INVOICE_COLS, [date(i.date), i.number, fixed(i.amount), fixed(i.margin), dutch(i.openAmount)]));\n  if (y.invoices.length) out.push(underline(INVOICE_COLS), line(INVOICE_COLS, [\"\", \"\", fixed(y.declared), fixed(y.margin), dutch(y.openTotal)]));\n\n  out.push(\"\", ...header(HOURS_COLS));\n  if (!y.entries.length) out.push(none(\"uren\"));\n  for (const e of y.entries) out.push(line(HOURS_COLS, [date(e.date), e.employeeName, e.activity, fixed(e.hours), fixed(e.amount)]));\n  if (y.entries.length) out.push(underline(HOURS_COLS), line(HOURS_COLS, [\"\", \"\", \"\", fixed(y.totalHours), fixed(y.hoursRowsAmount)]));\n\n  out.push(\"\", ...header(EXPENSE_COLS));\n  if (!y.expenses.length) out.push(none(\"verschotten\"));\n  for (const x of y.expenses) out.push(line(EXPENSE_COLS, [date(x.date), x.kind, x.description, fixed(x.amount)]));\n  if (y.expenses.length) out.push(underline(EXPENSE_COLS), line(EXPENSE_COLS, [\"\", \"\", \"\", fixed(y.expensesAmount)]));\n\n  const sum = (label: string, v: Money) => `${\" \".repeat(24)}${L(label, 18)}:${R(fixed(v), 12)}`;\n  out.push(\"\", sum(\"Totale kosten\", y.totalCosts), sum(\"Marge\", y.margin), sum(\"Gedeclareerd\", y.declared), sum(\"Nog te declareren\", y.toDeclare));\n  return out;\n}\n\n/** Platte tekstpagina's (max. 80 kolommen, PAGE_LINES regels); ieder fiscaal jaar begint op een nieuwe pagina. */\nexport function renderStatementPages(input: { company: string; customer: { number: string; name: string }; printedAt: Date; years: StatementYear[] }): string[] {\n  const p = input.printedAt;\n  const stamp = `${p.getDate()} ${MONTHS[p.getMonth()]} ${p.getFullYear()}  ${two(p.getHours())}:${two(p.getMinutes())}`;\n  const header = (year: number, page: number) => {\n    const right = `Pagina : ${page}`;\n    const mid = Math.max(stamp.length + 2, Math.floor((PAGE_WIDTH - input.company.length) / 2));\n    const top = `${stamp.padEnd(mid)}${input.company}`;\n    const klant = `Klant ${input.customer.number} : ${input.customer.name}`;\n    const jaar = `Fiscaal jaar ${year}`;\n    return [\n      `${top.slice(0, PAGE_WIDTH - right.length - 1).padEnd(PAGE_WIDTH - right.length)}${right}`,\n      \"Overzicht fakturen/uren\",\n      `${klant.slice(0, PAGE_WIDTH - jaar.length - 1).padEnd(PAGE_WIDTH - jaar.length)}${jaar}`,\n      \"-\".repeat(PAGE_WIDTH),\n      \"\",\n    ];\n  };\n\n  const pages: string[] = [];\n  for (const y of input.years) {\n    const body = yearBody(y);\n    const room = PAGE_LINES - 5;\n    // shortcut: splits blindly every `room` lines, also between a total and its rows.\n    for (let i = 0; i < body.length; i += room) pages.push([...header(y.year, pages.length + 1), ...body.slice(i, i + room)].join(\"\\n\"));\n  }\n  return pages;\n}\n\n/** Print platte pagina's in Courier via een verborgen iframe (geen opmaak, zoals de DOS-uitdraai). */\nexport function printTextPages(pages: string[]): void {\n  const frame = document.createElement(\"iframe\");\n  frame.style.cssText = \"position:fixed;width:0;height:0;border:0;visibility:hidden\";\n  document.body.append(frame);\n  const doc = frame.contentDocument!;\n  const escape = (s: string) => s.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\");\n  doc.open();\n  doc.write(`<!doctype html><html><head><meta charset=\"utf-8\"><title>Overzicht fakturen/uren</title><style>\n    /* Zero page margin keeps the browser from printing its own date/title header and URL footer. */\n    @page { size: A4; margin: 0; }\n    body { margin: 0; }\n    pre { font: 10pt/1.22 \"Courier New\", Courier, monospace; margin: 0; padding: 12mm 15mm; break-after: page; }\n    pre:last-child { break-after: auto; }\n  </style></head><body>${pages.map((p) => `<pre>${escape(p)}</pre>`).join(\"\")}</body></html>`);\n  doc.close();\n  frame.contentWindow!.addEventListener(\"afterprint\", () => frame.remove());\n  frame.contentWindow!.focus();\n  frame.contentWindow!.print();\n}\n\n// ── URL-staat ───────────────────────────────────────────────────────────────\n\nexport interface StatementQueryState { customerId: number; years: number[] }\n\nexport function parseStatementQuery(query: Record<string, string | undefined>): StatementQueryState {\n  const customerId = Number(query.klant);\n  const years = (query.jaren ?? \"\").split(\",\").map(Number).filter((y) => Number.isInteger(y) && y > 1900);\n  return { customerId: Number.isInteger(customerId) && customerId > 0 ? customerId : 0, years: [...new Set(years)].sort((a, b) => a - b) };\n}\n\nexport function statementToQuery(state: StatementQueryState): Record<string, string> {\n  const query: Record<string, string> = {};\n  if (state.customerId) query.klant = String(state.customerId);\n  if (state.years.length) query.jaren = [...state.years].sort((a, b) => a - b).join(\",\");\n  return query;\n}\n","<template>\n  <section class=\"st\">\n    <div class=\"hh-page__bar\">\n      <div>\n        <h1 class=\"hh-page__title\">Overzicht fakturen/uren</h1>\n        <p class=\"hh-page__sub\">Kies een klant en een of meer boekjaren. <kbd>p</kbd> print de uitdraai, <kbd>Esc</kbd> gaat terug naar Facturen.</p>\n      </div>\n      <div class=\"st__actions\">\n        <RouterLink class=\"hh-btn\" :to=\"{ name: 'fakturen' }\">Terug</RouterLink>\n        <button class=\"hh-btn hh-btn--primary\" type=\"button\" :disabled=\"!statement.length || loading\" @click=\"print\">Uitdraai printen</button>\n      </div>\n    </div>\n\n    <div class=\"hh-card st__filters\">\n      <label class=\"st__f\">Klant\n        <Combobox\n          ref=\"customerCombo\"\n          :model-value=\"customerId || null\"\n          :options=\"customerOptions\"\n          aria-label=\"Klant\"\n          placeholder=\"Nummer of naam…\"\n          @update:model-value=\"customerId = $event ?? 0\"\n          @commit=\"focusFirstYear\"\n        />\n      </label>\n      <fieldset v-if=\"customerId\" class=\"st__years\">\n        <legend>Boekjaren</legend>\n        <span v-if=\"!loading && availableYears.length === 0\" class=\"hh-muted\">Geen boekingen voor deze klant.</span>\n        <button\n          v-for=\"y in availableYears\"\n          :key=\"y\"\n          type=\"button\"\n          class=\"st__chip\"\n          data-year-chip\n          :aria-pressed=\"years.includes(y)\"\n          @click=\"toggleYear(y)\"\n        >{{ y }}</button>\n        <button v-if=\"availableYears.length > 1\" type=\"button\" class=\"st__chip st__chip--all\" @click=\"selectAll\">Alle</button>\n      </fieldset>\n    </div>\n\n    <p v-if=\"error\" class=\"hh-formerror\">{{ error }}</p>\n    <div v-if=\"!customerId\" class=\"hh-card hh-empty\">Kies een klant om het overzicht te maken.</div>\n    <div v-else-if=\"loading\" class=\"hh-card hh-empty\">Laden…</div>\n    <div v-else-if=\"customerId && availableYears.length && !years.length\" class=\"hh-card hh-empty\">Kies minstens één boekjaar.</div>\n\n    <template v-else-if=\"statement.length\">\n      <div v-if=\"statement.length > 1\" class=\"hh-card\">\n        <table class=\"hh-table\">\n          <thead>\n            <tr>\n              <th>Boekjaar</th>\n              <th class=\"hh-table__num\">Uren</th>\n              <th class=\"hh-table__num\">Totale kosten</th>\n              <th class=\"hh-table__num\">Marge</th>\n              <th class=\"hh-table__num\">Gedeclareerd</th>\n              <th class=\"hh-table__num\">Nog te declareren</th>\n              <th class=\"hh-table__num\">Open</th>\n            </tr>\n          </thead>\n          <tbody>\n            <tr v-for=\"y in statement\" :key=\"y.year\" class=\"is-clickable\" @click=\"scrollToYear(y.year)\">\n              <td>{{ y.year }}</td>\n              <td class=\"hh-table__num\">{{ formatHours(y.totalHours) }}</td>\n              <td class=\"hh-table__num\">{{ formatEuro(y.totalCosts) }}</td>\n              <td class=\"hh-table__num\">{{ formatEuro(y.margin) }}</td>\n              <td class=\"hh-table__num\">{{ formatEuro(y.declared) }}</td>\n              <td class=\"hh-table__num\" :class=\"{ 'st__neg': isNegative(y.toDeclare) }\">{{ formatEuro(y.toDeclare) }}</td>\n              <td class=\"hh-table__num\">{{ formatEuro(y.openTotal) }}</td>\n            </tr>\n          </tbody>\n          <tfoot>\n            <tr class=\"st__total\">\n              <td>Totaal</td>\n              <td class=\"hh-table__num\">{{ formatHours(sumOf(\"totalHours\")) }}</td>\n              <td class=\"hh-table__num\">{{ formatEuro(sumOf(\"totalCosts\")) }}</td>\n              <td class=\"hh-table__num\">{{ formatEuro(sumOf(\"margin\")) }}</td>\n              <td class=\"hh-table__num\">{{ formatEuro(sumOf(\"declared\")) }}</td>\n              <td class=\"hh-table__num\">{{ formatEuro(sumOf(\"toDeclare\")) }}</td>\n              <td class=\"hh-table__num\">{{ formatEuro(sumOf(\"openTotal\")) }}</td>\n            </tr>\n          </tfoot>\n        </table>\n      </div>\n\n      <article v-for=\"y in statement\" :id=\"`boekjaar-${y.year}`\" :key=\"y.year\" class=\"hh-card st__year\">\n        <header class=\"st__yhead\">\n          <h2 class=\"st__ytitle\">Boekjaar {{ y.year }}</h2>\n          <span class=\"hh-muted\">{{ formatHours(y.totalHours) }} uur · open {{ formatEuro(y.openTotal) }}</span>\n        </header>\n\n        <dl class=\"st__kpis\">\n          <div class=\"hh-kpi\"><dt class=\"hh-kpi__meta\">Totale kosten</dt><dd class=\"hh-kpi__value st__kv\">{{ formatEuro(y.totalCosts) }}</dd></div>\n          <div class=\"hh-kpi\"><dt class=\"hh-kpi__meta\">Marge</dt><dd class=\"hh-kpi__value st__kv\">{{ formatEuro(y.margin) }}</dd></div>\n          <div class=\"hh-kpi\"><dt class=\"hh-kpi__meta\">Gedeclareerd</dt><dd class=\"hh-kpi__value st__kv\">{{ formatEuro(y.declared) }}</dd></div>\n          <div class=\"hh-kpi\">\n            <dt class=\"hh-kpi__meta\">Nog te declareren</dt>\n            <dd class=\"hh-kpi__value st__kv\" :class=\"{ 'hh-kpi__value--warn': isNegative(y.toDeclare) }\">{{ formatEuro(y.toDeclare) }}</dd>\n            <dd v-if=\"isNegative(y.toDeclare)\" class=\"hh-kpi__meta\">vooruit gefactureerd</dd>\n          </div>\n        </dl>\n\n        <h3 class=\"st__h\">Fakturen</h3>\n        <p v-if=\"!y.invoices.length\" class=\"hh-muted st__none\">Geen fakturen in dit boekjaar.</p>\n        <table v-else class=\"hh-table st__table\">\n          <thead><tr><th>Datum</th><th>Nummer</th><th class=\"hh-table__num\">Declaratie</th><th class=\"hh-table__num\">Marge</th><th class=\"hh-table__num\">Open</th></tr></thead>\n          <tbody>\n            <tr v-for=\"i in y.invoices\" :key=\"i.id\" class=\"is-clickable\" @click=\"openInvoice(i.id)\">\n              <td>{{ formatDate(i.date) }}</td>\n              <td class=\"hh-table__code\">{{ i.number }}</td>\n              <td class=\"hh-table__num\">{{ formatEuro(i.amount) }}</td>\n              <td class=\"hh-table__num\">{{ formatEuro(i.margin) }}</td>\n              <td class=\"hh-table__num\">{{ formatEuro(i.openAmount) }}</td>\n            </tr>\n          </tbody>\n          <tfoot><tr class=\"st__total\"><td colspan=\"2\">Totaal</td><td class=\"hh-table__num\">{{ formatEuro(y.declared) }}</td><td class=\"hh-table__num\">{{ formatEuro(y.margin) }}</td><td class=\"hh-table__num\">{{ formatEuro(y.openTotal) }}</td></tr></tfoot>\n        </table>\n\n        <h3 class=\"st__h\">Uren</h3>\n        <p v-if=\"!y.entries.length\" class=\"hh-muted st__none\">Geen uren in dit boekjaar.</p>\n        <table v-else class=\"hh-table st__table\">\n          <thead><tr><th>Datum</th><th>Werknemer</th><th>Werkzaamheid</th><th>Omschrijving</th><th class=\"hh-table__num\">Uren</th><th class=\"hh-table__num\">Bedrag</th></tr></thead>\n          <tbody>\n            <tr v-for=\"e in y.entries\" :key=\"e.id\">\n              <td>{{ formatDate(e.date) }}</td>\n              <td>{{ e.employeeName }}</td>\n              <td>{{ e.activity }}</td>\n              <td class=\"hh-muted\">{{ e.description }}</td>\n              <td class=\"hh-table__num\">{{ formatHours(e.hours) }}</td>\n              <td class=\"hh-table__num\">{{ formatEuro(e.amount) }}</td>\n            </tr>\n          </tbody>\n          <tfoot><tr class=\"st__total\"><td colspan=\"4\">Totaal</td><td class=\"hh-table__num\">{{ formatHours(y.totalHours) }}</td><td class=\"hh-table__num\">{{ formatEuro(y.hoursRowsAmount) }}</td></tr></tfoot>\n        </table>\n\n        <h3 class=\"st__h\">Verschotten</h3>\n        <p v-if=\"!y.expenses.length\" class=\"hh-muted st__none\">Geen verschotten in dit boekjaar.</p>\n        <table v-else class=\"hh-table st__table\">\n          <thead><tr><th>Datum</th><th>Soort</th><th>Omschrijving</th><th class=\"hh-table__num\">Bedrag</th></tr></thead>\n          <tbody>\n            <tr v-for=\"x in y.expenses\" :key=\"x.id\">\n              <td>{{ formatDate(x.date) }}</td>\n              <td>{{ x.kind }}</td>\n              <td>{{ x.description }}</td>\n              <td class=\"hh-table__num\">{{ formatEuro(x.amount) }}</td>\n            </tr>\n          </tbody>\n          <tfoot><tr class=\"st__total\"><td colspan=\"3\">Totaal</td><td class=\"hh-table__num\">{{ formatEuro(y.expensesAmount) }}</td></tr></tfoot>\n        </table>\n      </article>\n    </template>\n  </section>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, watch } from \"vue\";\nimport { RouterLink, useRoute, useRouter } from \"vue-router\";\nimport { Money } from \"@webhare/std\";\nimport Combobox, { type ComboOption } from \"../components/Combobox.vue\";\nimport { useApi } from \"../lib/api\";\nimport { formatDate, formatEuro, formatHours } from \"../lib/format\";\nimport { useEscapeBack } from \"../lib/useEscapeBack\";\nimport { queryRecord, sameQuery } from \"../lib/routeQuery\";\nimport { buildStatement, parseStatementQuery, printTextPages, renderStatementPages, statementToQuery, type StatementEntry, type StatementExpense, type StatementInvoice, type StatementYear } from \"../lib/customerStatement\";\n\nconst api = useApi();\ntype Customer = Awaited<ReturnType<typeof api.listCustomers>>[number];\n\nconst route = useRoute();\nconst router = useRouter();\nuseEscapeBack({ name: \"fakturen\" });\n\nconst restored = parseStatementQuery(queryRecord(route.query));\nconst customerId = ref(restored.customerId);\nconst years = ref<number[]>(restored.years);\nlet keepRestoredYears = restored.years.length > 0;\n\nconst customers = ref<Customer[]>([]);\nconst activities = new Map<number, { name: string; isFree: boolean }>();\nlet expenseKinds: string[] = [];\nlet companyName = \"\";\n\nconst invoices = ref<StatementInvoice[]>([]);\nconst entries = ref<StatementEntry[]>([]);\nconst expenses = ref<StatementExpense[]>([]);\nconst loading = ref(false);\nconst error = ref(\"\");\nconst customerCombo = ref<{ focus: () => void } | null>(null);\n\nconst customerOptions = computed<ComboOption[]>(() => customers.value.map((c) => ({ id: c.id, label: customerName(c), sub: c.number })));\nconst customer = computed(() => customers.value.find((c) => c.id === customerId.value) ?? null);\n\nconst availableYears = computed(() => [...new Set([...invoices.value, ...entries.value, ...expenses.value].map((r) => r.fiscalYear))].sort((a, b) => b - a));\nconst statement = computed<StatementYear[]>(() => buildStatement({ invoices: invoices.value, entries: entries.value, expenses: expenses.value, years: years.value }));\n\n// A free activity (the X codes) carries its text on the entry, not on the activity.\nfunction activityLabel(e: { activityId: number; activityCode: string; description: string }): string {\n  const activity = activities.get(e.activityId);\n  return `${e.activityCode} ${activity?.isFree ? e.description : activity?.name ?? \"\"}`.trim();\n}\n\nfunction customerName(c: Customer): string {\n  return c.company || c.contactName || `Klant ${c.number}`;\n}\n\nfunction isNegative(value: Money): boolean {\n  return Money.check(value, \"<\", \"0\");\n}\n\nfunction sumOf(key: \"totalHours\" | \"totalCosts\" | \"margin\" | \"declared\" | \"toDeclare\" | \"openTotal\"): Money {\n  return statement.value.reduce((sum, y) => Money.add(sum, y[key]), new Money(\"0\"));\n}\n\nwatch([customerId, years], () => {\n  const next = statementToQuery({ customerId: customerId.value, years: years.value });\n  if (!sameQuery(next, queryRecord(route.query))) void router.replace({ query: next });\n});\n\nwatch(customerId, () => void loadCustomer());\n\nasync function loadCustomer(): Promise<void> {\n  const id = customerId.value;\n  invoices.value = [];\n  entries.value = [];\n  expenses.value = [];\n  if (!id) {\n    years.value = [];\n    return;\n  }\n  loading.value = true;\n  error.value = \"\";\n  try {\n    const [invoiceRows, entryRows, expenseRows] = await Promise.all([\n      api.listInvoices({ customerId: id }),\n      api.listTimeEntries({ customerId: id }),\n      api.listExpenses({ customerId: id }),\n    ]);\n    if (id !== customerId.value) return; // a later customer choice won\n    invoices.value = invoiceRows;\n    entries.value = entryRows.map((e) => ({ ...e, activity: activityLabel(e) }));\n    expenses.value = expenseRows.map((x) => ({ ...x, kind: `${x.kind} ${(expenseKinds[x.kind] ?? \"\").trim()}`.trim() }));\n    if (!keepRestoredYears) years.value = availableYears.value.slice(0, 1);\n    keepRestoredYears = false;\n  } catch {\n    error.value = \"Kon de gegevens van deze klant niet laden.\";\n  } finally {\n    if (id === customerId.value) loading.value = false;\n  }\n}\n\nfunction toggleYear(year: number): void {\n  years.value = years.value.includes(year) ? years.value.filter((y) => y !== year) : [...years.value, year].sort((a, b) => a - b);\n}\n\nfunction selectAll(): void {\n  years.value = [...availableYears.value].sort((a, b) => a - b);\n}\n\nfunction focusFirstYear(): void {\n  void nextTick(() => document.querySelector<HTMLElement>(\"[data-year-chip]\")?.focus());\n}\n\nfunction scrollToYear(year: number): void {\n  document.getElementById(`boekjaar-${year}`)?.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\n}\n\nfunction openInvoice(id: number): void {\n  void router.push({ name: \"fakturen-detail\", params: { id: String(id) } });\n}\n\nfunction print(): void {\n  if (!customer.value || !statement.value.length) return;\n  printTextPages(renderStatementPages({\n    company: companyName,\n    customer: { number: customer.value.number, name: customerName(customer.value) },\n    printedAt: new Date(),\n    years: statement.value,\n  }));\n}\n\nfunction onKeydown(event: KeyboardEvent): void {\n  const el = document.activeElement as HTMLElement | null;\n  const typing = el && (el.tagName === \"INPUT\" || el.tagName === \"TEXTAREA\" || el.tagName === \"SELECT\" || el.isContentEditable);\n  if (event.key !== \"p\" || typing || event.metaKey || event.ctrlKey || event.altKey || document.querySelector(\".dialog-backdrop\")) return;\n  event.preventDefault();\n  print();\n}\n\nonMounted(async () => {\n  window.addEventListener(\"keydown\", onKeydown);\n  try {\n    const [customerRows, activityRows, settings, company] = await Promise.all([\n      api.listCustomers({ includeArchived: true }),\n      api.listActivities({ includeArchived: true }),\n      api.getSettings(),\n      api.getCompanyInfo(),\n    ]);\n    customers.value = customerRows;\n    for (const a of activityRows) activities.set(a.id, { name: a.description, isFree: a.isFree });\n    expenseKinds = settings.expenseKinds ?? [];\n    companyName = company.name;\n  } catch {\n    error.value = \"Kon de klanten niet laden.\";\n  }\n  if (customerId.value) await loadCustomer();\n  else void nextTick(() => customerCombo.value?.focus());\n});\n\nonBeforeUnmount(() => window.removeEventListener(\"keydown\", onKeydown));\n</script>\n\n<style scoped>\n.st__actions {\n  display: flex;\n  gap: 8px;\n}\n.st__filters {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: flex-end;\n  gap: 24px;\n  padding: 16px;\n  margin-bottom: 16px;\n  overflow: visible;\n}\n.st__f {\n  display: flex;\n  flex-direction: column;\n  gap: 4px;\n  min-width: 280px;\n  font-size: 13px;\n  color: var(--hh-fg-subtle);\n}\n.st__years {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  gap: 6px;\n  margin: 0;\n  padding: 0;\n  border: 0;\n}\n.st__years legend {\n  padding: 0;\n  margin-bottom: 4px;\n  font-size: 13px;\n  color: var(--hh-fg-subtle);\n}\n.st__chip {\n  padding: 6px 12px;\n  border: 1px solid var(--hh-line);\n  border-radius: 999px;\n  background: var(--hh-surface);\n  color: var(--hh-fg);\n  font: inherit;\n  font-variant-numeric: tabular-nums;\n  cursor: pointer;\n}\n.st__chip:hover {\n  border-color: var(--hh-accent);\n}\n.st__chip[aria-pressed=\"true\"] {\n  border-color: var(--hh-accent);\n  background: var(--hh-accent);\n  color: var(--hh-accent-fg);\n}\n.st__chip--all {\n  border-style: dashed;\n}\n.st__year {\n  padding: 20px;\n  margin-top: 16px;\n}\n.st__yhead {\n  display: flex;\n  align-items: baseline;\n  justify-content: space-between;\n  gap: 12px;\n}\n.st__ytitle {\n  margin: 0;\n  font-size: 20px;\n}\n.st__kpis {\n  display: grid;\n  grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));\n  gap: 16px;\n  margin: 16px 0 8px;\n}\n.st__kpis dd {\n  margin: 0;\n}\n.st__kv {\n  font-size: 22px;\n}\n.st__h {\n  margin: 20px 0 6px;\n  font-size: 14px;\n  text-transform: uppercase;\n  letter-spacing: 0.04em;\n  color: var(--hh-fg-subtle);\n}\n.st__none {\n  margin: 0;\n}\n.st__total td {\n  font-weight: 700;\n  padding: 10px 12px;\n  border-top: 1px solid var(--hh-line);\n}\n.st__neg {\n  color: var(--hh-warn);\n}\n</style>\n","import { createElementVNode as _createElementVNode, createTextVNode as _createTextVNode, withCtx as _withCtx, createVNode as _createVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, renderList as _renderList, Fragment as _Fragment, toDisplayString as _toDisplayString, normalizeClass as _normalizeClass } from \"vue\"\n\nconst _hoisted_1 = { class: \"st\" }\nconst _hoisted_2 = { class: \"hh-page__bar\" }\nconst _hoisted_3 = { class: \"st__actions\" }\nconst _hoisted_4 = [\"disabled\"]\nconst _hoisted_5 = { class: \"hh-card st__filters\" }\nconst _hoisted_6 = { class: \"st__f\" }\nconst _hoisted_7 = {\n  key: 0,\n  class: \"st__years\"\n}\nconst _hoisted_8 = {\n  key: 0,\n  class: \"hh-muted\"\n}\nconst _hoisted_9 = [\"aria-pressed\", \"onClick\"]\nconst _hoisted_10 = {\n  key: 0,\n  class: \"hh-formerror\"\n}\nconst _hoisted_11 = {\n  key: 1,\n  class: \"hh-card hh-empty\"\n}\nconst _hoisted_12 = {\n  key: 2,\n  class: \"hh-card hh-empty\"\n}\nconst _hoisted_13 = {\n  key: 3,\n  class: \"hh-card hh-empty\"\n}\nconst _hoisted_14 = {\n  key: 0,\n  class: \"hh-card\"\n}\nconst _hoisted_15 = { class: \"hh-table\" }\nconst _hoisted_16 = [\"onClick\"]\nconst _hoisted_17 = { class: \"hh-table__num\" }\nconst _hoisted_18 = { class: \"hh-table__num\" }\nconst _hoisted_19 = { class: \"hh-table__num\" }\nconst _hoisted_20 = { class: \"hh-table__num\" }\nconst _hoisted_21 = { class: \"hh-table__num\" }\nconst _hoisted_22 = { class: \"st__total\" }\nconst _hoisted_23 = { class: \"hh-table__num\" }\nconst _hoisted_24 = { class: \"hh-table__num\" }\nconst _hoisted_25 = { class: \"hh-table__num\" }\nconst _hoisted_26 = { class: \"hh-table__num\" }\nconst _hoisted_27 = { class: \"hh-table__num\" }\nconst _hoisted_28 = { class: \"hh-table__num\" }\nconst _hoisted_29 = [\"id\"]\nconst _hoisted_30 = { class: \"st__yhead\" }\nconst _hoisted_31 = { class: \"st__ytitle\" }\nconst _hoisted_32 = { class: \"hh-muted\" }\nconst _hoisted_33 = { class: \"st__kpis\" }\nconst _hoisted_34 = { class: \"hh-kpi\" }\nconst _hoisted_35 = { class: \"hh-kpi__value st__kv\" }\nconst _hoisted_36 = { class: \"hh-kpi\" }\nconst _hoisted_37 = { class: \"hh-kpi__value st__kv\" }\nconst _hoisted_38 = { class: \"hh-kpi\" }\nconst _hoisted_39 = { class: \"hh-kpi__value st__kv\" }\nconst _hoisted_40 = { class: \"hh-kpi\" }\nconst _hoisted_41 = {\n  key: 0,\n  class: \"hh-kpi__meta\"\n}\nconst _hoisted_42 = {\n  key: 0,\n  class: \"hh-muted st__none\"\n}\nconst _hoisted_43 = {\n  key: 1,\n  class: \"hh-table st__table\"\n}\nconst _hoisted_44 = [\"onClick\"]\nconst _hoisted_45 = { class: \"hh-table__code\" }\nconst _hoisted_46 = { class: \"hh-table__num\" }\nconst _hoisted_47 = { class: \"hh-table__num\" }\nconst _hoisted_48 = { class: \"hh-table__num\" }\nconst _hoisted_49 = { class: \"st__total\" }\nconst _hoisted_50 = { class: \"hh-table__num\" }\nconst _hoisted_51 = { class: \"hh-table__num\" }\nconst _hoisted_52 = { class: \"hh-table__num\" }\nconst _hoisted_53 = {\n  key: 2,\n  class: \"hh-muted st__none\"\n}\nconst _hoisted_54 = {\n  key: 3,\n  class: \"hh-table st__table\"\n}\nconst _hoisted_55 = { class: \"hh-muted\" }\nconst _hoisted_56 = { class: \"hh-table__num\" }\nconst _hoisted_57 = { class: \"hh-table__num\" }\nconst _hoisted_58 = { class: \"st__total\" }\nconst _hoisted_59 = { class: \"hh-table__num\" }\nconst _hoisted_60 = { class: \"hh-table__num\" }\nconst _hoisted_61 = {\n  key: 4,\n  class: \"hh-muted st__none\"\n}\nconst _hoisted_62 = {\n  key: 5,\n  class: \"hh-table st__table\"\n}\nconst _hoisted_63 = { class: \"hh-table__num\" }\nconst _hoisted_64 = { class: \"st__total\" }\nconst _hoisted_65 = { class: \"hh-table__num\" }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return (_openBlock(), _createElementBlock(\"section\", _hoisted_1, [\n    _createElementVNode(\"div\", _hoisted_2, [\n      _cache[2] || (_cache[2] = _createElementVNode(\"div\", null, [\n        _createElementVNode(\"h1\", { class: \"hh-page__title\" }, \"Overzicht fakturen/uren\"),\n        _createElementVNode(\"p\", { class: \"hh-page__sub\" }, [\n          _createTextVNode(\"Kies een klant en een of meer boekjaren. \"),\n          _createElementVNode(\"kbd\", null, \"p\"),\n          _createTextVNode(\" print de uitdraai, \"),\n          _createElementVNode(\"kbd\", null, \"Esc\"),\n          _createTextVNode(\" gaat terug naar Facturen.\")\n        ])\n      ], -1 /* CACHED */)),\n      _createElementVNode(\"div\", _hoisted_3, [\n        _createVNode($setup[\"RouterLink\"], {\n          class: \"hh-btn\",\n          to: { name: 'fakturen' }\n        }, {\n          default: _withCtx(() => _cache[1] || (_cache[1] = [\n            _createTextVNode(\"Terug\", -1 /* CACHED */)\n          ])),\n          _: 1 /* STABLE */,\n          __: [1]\n        }),\n        _createElementVNode(\"button\", {\n          class: \"hh-btn hh-btn--primary\",\n          type: \"button\",\n          disabled: !$setup.statement.length || $setup.loading,\n          onClick: $setup.print\n        }, \"Uitdraai printen\", 8 /* PROPS */, _hoisted_4)\n      ])\n    ]),\n    _createElementVNode(\"div\", _hoisted_5, [\n      _createElementVNode(\"label\", _hoisted_6, [\n        _cache[3] || (_cache[3] = _createTextVNode(\"Klant \", -1 /* CACHED */)),\n        _createVNode($setup[\"Combobox\"], {\n          ref: \"customerCombo\",\n          \"model-value\": $setup.customerId || null,\n          options: $setup.customerOptions,\n          \"aria-label\": \"Klant\",\n          placeholder: \"Nummer of naam…\",\n          \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => ($setup.customerId = $event ?? 0)),\n          onCommit: $setup.focusFirstYear\n        }, null, 8 /* PROPS */, [\"model-value\", \"options\"])\n      ]),\n      ($setup.customerId)\n        ? (_openBlock(), _createElementBlock(\"fieldset\", _hoisted_7, [\n            _cache[4] || (_cache[4] = _createElementVNode(\"legend\", null, \"Boekjaren\", -1 /* CACHED */)),\n            (!$setup.loading && $setup.availableYears.length === 0)\n              ? (_openBlock(), _createElementBlock(\"span\", _hoisted_8, \"Geen boekingen voor deze klant.\"))\n              : _createCommentVNode(\"v-if\", true),\n            (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.availableYears, (y) => {\n              return (_openBlock(), _createElementBlock(\"button\", {\n                key: y,\n                type: \"button\",\n                class: \"st__chip\",\n                \"data-year-chip\": \"\",\n                \"aria-pressed\": $setup.years.includes(y),\n                onClick: $event => ($setup.toggleYear(y))\n              }, _toDisplayString(y), 9 /* TEXT, PROPS */, _hoisted_9))\n            }), 128 /* KEYED_FRAGMENT */)),\n            ($setup.availableYears.length > 1)\n              ? (_openBlock(), _createElementBlock(\"button\", {\n                  key: 1,\n                  type: \"button\",\n                  class: \"st__chip st__chip--all\",\n                  onClick: $setup.selectAll\n                }, \"Alle\"))\n              : _createCommentVNode(\"v-if\", true)\n          ]))\n        : _createCommentVNode(\"v-if\", true)\n    ]),\n    ($setup.error)\n      ? (_openBlock(), _createElementBlock(\"p\", _hoisted_10, _toDisplayString($setup.error), 1 /* TEXT */))\n      : _createCommentVNode(\"v-if\", true),\n    (!$setup.customerId)\n      ? (_openBlock(), _createElementBlock(\"div\", _hoisted_11, \"Kies een klant om het overzicht te maken.\"))\n      : ($setup.loading)\n        ? (_openBlock(), _createElementBlock(\"div\", _hoisted_12, \"Laden…\"))\n        : ($setup.customerId && $setup.availableYears.length && !$setup.years.length)\n          ? (_openBlock(), _createElementBlock(\"div\", _hoisted_13, \"Kies minstens één boekjaar.\"))\n          : ($setup.statement.length)\n            ? (_openBlock(), _createElementBlock(_Fragment, { key: 4 }, [\n                ($setup.statement.length > 1)\n                  ? (_openBlock(), _createElementBlock(\"div\", _hoisted_14, [\n                      _createElementVNode(\"table\", _hoisted_15, [\n                        _cache[6] || (_cache[6] = _createElementVNode(\"thead\", null, [\n                          _createElementVNode(\"tr\", null, [\n                            _createElementVNode(\"th\", null, \"Boekjaar\"),\n                            _createElementVNode(\"th\", { class: \"hh-table__num\" }, \"Uren\"),\n                            _createElementVNode(\"th\", { class: \"hh-table__num\" }, \"Totale kosten\"),\n                            _createElementVNode(\"th\", { class: \"hh-table__num\" }, \"Marge\"),\n                            _createElementVNode(\"th\", { class: \"hh-table__num\" }, \"Gedeclareerd\"),\n                            _createElementVNode(\"th\", { class: \"hh-table__num\" }, \"Nog te declareren\"),\n                            _createElementVNode(\"th\", { class: \"hh-table__num\" }, \"Open\")\n                          ])\n                        ], -1 /* CACHED */)),\n                        _createElementVNode(\"tbody\", null, [\n                          (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.statement, (y) => {\n                            return (_openBlock(), _createElementBlock(\"tr\", {\n                              key: y.year,\n                              class: \"is-clickable\",\n                              onClick: $event => ($setup.scrollToYear(y.year))\n                            }, [\n                              _createElementVNode(\"td\", null, _toDisplayString(y.year), 1 /* TEXT */),\n                              _createElementVNode(\"td\", _hoisted_17, _toDisplayString($setup.formatHours(y.totalHours)), 1 /* TEXT */),\n                              _createElementVNode(\"td\", _hoisted_18, _toDisplayString($setup.formatEuro(y.totalCosts)), 1 /* TEXT */),\n                              _createElementVNode(\"td\", _hoisted_19, _toDisplayString($setup.formatEuro(y.margin)), 1 /* TEXT */),\n                              _createElementVNode(\"td\", _hoisted_20, _toDisplayString($setup.formatEuro(y.declared)), 1 /* TEXT */),\n                              _createElementVNode(\"td\", {\n                                class: _normalizeClass([\"hh-table__num\", { 'st__neg': $setup.isNegative(y.toDeclare) }])\n                              }, _toDisplayString($setup.formatEuro(y.toDeclare)), 3 /* TEXT, CLASS */),\n                              _createElementVNode(\"td\", _hoisted_21, _toDisplayString($setup.formatEuro(y.openTotal)), 1 /* TEXT */)\n                            ], 8 /* PROPS */, _hoisted_16))\n                          }), 128 /* KEYED_FRAGMENT */))\n                        ]),\n                        _createElementVNode(\"tfoot\", null, [\n                          _createElementVNode(\"tr\", _hoisted_22, [\n                            _cache[5] || (_cache[5] = _createElementVNode(\"td\", null, \"Totaal\", -1 /* CACHED */)),\n                            _createElementVNode(\"td\", _hoisted_23, _toDisplayString($setup.formatHours($setup.sumOf(\"totalHours\"))), 1 /* TEXT */),\n                            _createElementVNode(\"td\", _hoisted_24, _toDisplayString($setup.formatEuro($setup.sumOf(\"totalCosts\"))), 1 /* TEXT */),\n                            _createElementVNode(\"td\", _hoisted_25, _toDisplayString($setup.formatEuro($setup.sumOf(\"margin\"))), 1 /* TEXT */),\n                            _createElementVNode(\"td\", _hoisted_26, _toDisplayString($setup.formatEuro($setup.sumOf(\"declared\"))), 1 /* TEXT */),\n                            _createElementVNode(\"td\", _hoisted_27, _toDisplayString($setup.formatEuro($setup.sumOf(\"toDeclare\"))), 1 /* TEXT */),\n                            _createElementVNode(\"td\", _hoisted_28, _toDisplayString($setup.formatEuro($setup.sumOf(\"openTotal\"))), 1 /* TEXT */)\n                          ])\n                        ])\n                      ])\n                    ]))\n                  : _createCommentVNode(\"v-if\", true),\n                (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.statement, (y) => {\n                  return (_openBlock(), _createElementBlock(\"article\", {\n                    id: `boekjaar-${y.year}`,\n                    key: y.year,\n                    class: \"hh-card st__year\"\n                  }, [\n                    _createElementVNode(\"header\", _hoisted_30, [\n                      _createElementVNode(\"h2\", _hoisted_31, \"Boekjaar \" + _toDisplayString(y.year), 1 /* TEXT */),\n                      _createElementVNode(\"span\", _hoisted_32, _toDisplayString($setup.formatHours(y.totalHours)) + \" uur · open \" + _toDisplayString($setup.formatEuro(y.openTotal)), 1 /* TEXT */)\n                    ]),\n                    _createElementVNode(\"dl\", _hoisted_33, [\n                      _createElementVNode(\"div\", _hoisted_34, [\n                        _cache[7] || (_cache[7] = _createElementVNode(\"dt\", { class: \"hh-kpi__meta\" }, \"Totale kosten\", -1 /* CACHED */)),\n                        _createElementVNode(\"dd\", _hoisted_35, _toDisplayString($setup.formatEuro(y.totalCosts)), 1 /* TEXT */)\n                      ]),\n                      _createElementVNode(\"div\", _hoisted_36, [\n                        _cache[8] || (_cache[8] = _createElementVNode(\"dt\", { class: \"hh-kpi__meta\" }, \"Marge\", -1 /* CACHED */)),\n                        _createElementVNode(\"dd\", _hoisted_37, _toDisplayString($setup.formatEuro(y.margin)), 1 /* TEXT */)\n                      ]),\n                      _createElementVNode(\"div\", _hoisted_38, [\n                        _cache[9] || (_cache[9] = _createElementVNode(\"dt\", { class: \"hh-kpi__meta\" }, \"Gedeclareerd\", -1 /* CACHED */)),\n                        _createElementVNode(\"dd\", _hoisted_39, _toDisplayString($setup.formatEuro(y.declared)), 1 /* TEXT */)\n                      ]),\n                      _createElementVNode(\"div\", _hoisted_40, [\n                        _cache[10] || (_cache[10] = _createElementVNode(\"dt\", { class: \"hh-kpi__meta\" }, \"Nog te declareren\", -1 /* CACHED */)),\n                        _createElementVNode(\"dd\", {\n                          class: _normalizeClass([\"hh-kpi__value st__kv\", { 'hh-kpi__value--warn': $setup.isNegative(y.toDeclare) }])\n                        }, _toDisplayString($setup.formatEuro(y.toDeclare)), 3 /* TEXT, CLASS */),\n                        ($setup.isNegative(y.toDeclare))\n                          ? (_openBlock(), _createElementBlock(\"dd\", _hoisted_41, \"vooruit gefactureerd\"))\n                          : _createCommentVNode(\"v-if\", true)\n                      ])\n                    ]),\n                    _cache[17] || (_cache[17] = _createElementVNode(\"h3\", { class: \"st__h\" }, \"Fakturen\", -1 /* CACHED */)),\n                    (!y.invoices.length)\n                      ? (_openBlock(), _createElementBlock(\"p\", _hoisted_42, \"Geen fakturen in dit boekjaar.\"))\n                      : (_openBlock(), _createElementBlock(\"table\", _hoisted_43, [\n                          _cache[12] || (_cache[12] = _createElementVNode(\"thead\", null, [\n                            _createElementVNode(\"tr\", null, [\n                              _createElementVNode(\"th\", null, \"Datum\"),\n                              _createElementVNode(\"th\", null, \"Nummer\"),\n                              _createElementVNode(\"th\", { class: \"hh-table__num\" }, \"Declaratie\"),\n                              _createElementVNode(\"th\", { class: \"hh-table__num\" }, \"Marge\"),\n                              _createElementVNode(\"th\", { class: \"hh-table__num\" }, \"Open\")\n                            ])\n                          ], -1 /* CACHED */)),\n                          _createElementVNode(\"tbody\", null, [\n                            (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(y.invoices, (i) => {\n                              return (_openBlock(), _createElementBlock(\"tr\", {\n                                key: i.id,\n                                class: \"is-clickable\",\n                                onClick: $event => ($setup.openInvoice(i.id))\n                              }, [\n                                _createElementVNode(\"td\", null, _toDisplayString($setup.formatDate(i.date)), 1 /* TEXT */),\n                                _createElementVNode(\"td\", _hoisted_45, _toDisplayString(i.number), 1 /* TEXT */),\n                                _createElementVNode(\"td\", _hoisted_46, _toDisplayString($setup.formatEuro(i.amount)), 1 /* TEXT */),\n                                _createElementVNode(\"td\", _hoisted_47, _toDisplayString($setup.formatEuro(i.margin)), 1 /* TEXT */),\n                                _createElementVNode(\"td\", _hoisted_48, _toDisplayString($setup.formatEuro(i.openAmount)), 1 /* TEXT */)\n                              ], 8 /* PROPS */, _hoisted_44))\n                            }), 128 /* KEYED_FRAGMENT */))\n                          ]),\n                          _createElementVNode(\"tfoot\", null, [\n                            _createElementVNode(\"tr\", _hoisted_49, [\n                              _cache[11] || (_cache[11] = _createElementVNode(\"td\", { colspan: \"2\" }, \"Totaal\", -1 /* CACHED */)),\n                              _createElementVNode(\"td\", _hoisted_50, _toDisplayString($setup.formatEuro(y.declared)), 1 /* TEXT */),\n                              _createElementVNode(\"td\", _hoisted_51, _toDisplayString($setup.formatEuro(y.margin)), 1 /* TEXT */),\n                              _createElementVNode(\"td\", _hoisted_52, _toDisplayString($setup.formatEuro(y.openTotal)), 1 /* TEXT */)\n                            ])\n                          ])\n                        ])),\n                    _cache[18] || (_cache[18] = _createElementVNode(\"h3\", { class: \"st__h\" }, \"Uren\", -1 /* CACHED */)),\n                    (!y.entries.length)\n                      ? (_openBlock(), _createElementBlock(\"p\", _hoisted_53, \"Geen uren in dit boekjaar.\"))\n                      : (_openBlock(), _createElementBlock(\"table\", _hoisted_54, [\n                          _cache[14] || (_cache[14] = _createElementVNode(\"thead\", null, [\n                            _createElementVNode(\"tr\", null, [\n                              _createElementVNode(\"th\", null, \"Datum\"),\n                              _createElementVNode(\"th\", null, \"Werknemer\"),\n                              _createElementVNode(\"th\", null, \"Werkzaamheid\"),\n                              _createElementVNode(\"th\", null, \"Omschrijving\"),\n                              _createElementVNode(\"th\", { class: \"hh-table__num\" }, \"Uren\"),\n                              _createElementVNode(\"th\", { class: \"hh-table__num\" }, \"Bedrag\")\n                            ])\n                          ], -1 /* CACHED */)),\n                          _createElementVNode(\"tbody\", null, [\n                            (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(y.entries, (e) => {\n                              return (_openBlock(), _createElementBlock(\"tr\", {\n                                key: e.id\n                              }, [\n                                _createElementVNode(\"td\", null, _toDisplayString($setup.formatDate(e.date)), 1 /* TEXT */),\n                                _createElementVNode(\"td\", null, _toDisplayString(e.employeeName), 1 /* TEXT */),\n                                _createElementVNode(\"td\", null, _toDisplayString(e.activity), 1 /* TEXT */),\n                                _createElementVNode(\"td\", _hoisted_55, _toDisplayString(e.description), 1 /* TEXT */),\n                                _createElementVNode(\"td\", _hoisted_56, _toDisplayString($setup.formatHours(e.hours)), 1 /* TEXT */),\n                                _createElementVNode(\"td\", _hoisted_57, _toDisplayString($setup.formatEuro(e.amount)), 1 /* TEXT */)\n                              ]))\n                            }), 128 /* KEYED_FRAGMENT */))\n                          ]),\n                          _createElementVNode(\"tfoot\", null, [\n                            _createElementVNode(\"tr\", _hoisted_58, [\n                              _cache[13] || (_cache[13] = _createElementVNode(\"td\", { colspan: \"4\" }, \"Totaal\", -1 /* CACHED */)),\n                              _createElementVNode(\"td\", _hoisted_59, _toDisplayString($setup.formatHours(y.totalHours)), 1 /* TEXT */),\n                              _createElementVNode(\"td\", _hoisted_60, _toDisplayString($setup.formatEuro(y.hoursRowsAmount)), 1 /* TEXT */)\n                            ])\n                          ])\n                        ])),\n                    _cache[19] || (_cache[19] = _createElementVNode(\"h3\", { class: \"st__h\" }, \"Verschotten\", -1 /* CACHED */)),\n                    (!y.expenses.length)\n                      ? (_openBlock(), _createElementBlock(\"p\", _hoisted_61, \"Geen verschotten in dit boekjaar.\"))\n                      : (_openBlock(), _createElementBlock(\"table\", _hoisted_62, [\n                          _cache[16] || (_cache[16] = _createElementVNode(\"thead\", null, [\n                            _createElementVNode(\"tr\", null, [\n                              _createElementVNode(\"th\", null, \"Datum\"),\n                              _createElementVNode(\"th\", null, \"Soort\"),\n                              _createElementVNode(\"th\", null, \"Omschrijving\"),\n                              _createElementVNode(\"th\", { class: \"hh-table__num\" }, \"Bedrag\")\n                            ])\n                          ], -1 /* CACHED */)),\n                          _createElementVNode(\"tbody\", null, [\n                            (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(y.expenses, (x) => {\n                              return (_openBlock(), _createElementBlock(\"tr\", {\n                                key: x.id\n                              }, [\n                                _createElementVNode(\"td\", null, _toDisplayString($setup.formatDate(x.date)), 1 /* TEXT */),\n                                _createElementVNode(\"td\", null, _toDisplayString(x.kind), 1 /* TEXT */),\n                                _createElementVNode(\"td\", null, _toDisplayString(x.description), 1 /* TEXT */),\n                                _createElementVNode(\"td\", _hoisted_63, _toDisplayString($setup.formatEuro(x.amount)), 1 /* TEXT */)\n                              ]))\n                            }), 128 /* KEYED_FRAGMENT */))\n                          ]),\n                          _createElementVNode(\"tfoot\", null, [\n                            _createElementVNode(\"tr\", _hoisted_64, [\n                              _cache[15] || (_cache[15] = _createElementVNode(\"td\", { colspan: \"3\" }, \"Totaal\", -1 /* CACHED */)),\n                              _createElementVNode(\"td\", _hoisted_65, _toDisplayString($setup.formatEuro(y.expensesAmount)), 1 /* TEXT */)\n                            ])\n                          ])\n                        ]))\n                  ], 8 /* PROPS */, _hoisted_29))\n                }), 128 /* KEYED_FRAGMENT */))\n              ], 64 /* STABLE_FRAGMENT */))\n            : _createCommentVNode(\"v-if\", true)\n  ]))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/CustomerStatementView.vue?type=script\";import \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/CustomerStatementView.vue?type=style&index=0\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/CustomerStatementView.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/CustomerStatementView.vue\";script.__scopeId = \"data-v-9eb89b33\";export default script;","<template>\n  <AppDialog title=\"Betalingsherinnering mailen\" wide @close=\"emit('close')\">\n    <p class=\"mail__notice\">De herinnering wordt als PDF-bijlage naar de klant gemaild.</p>\n\n    <div v-if=\"loading\" class=\"hh-empty\">Laden…</div>\n    <template v-else>\n      <FormField label=\"Aan (klant)\" for-id=\"rmail-to\">\n        <input id=\"rmail-to\" v-model.trim=\"form.to\" type=\"email\" class=\"hh-input\" data-autofocus placeholder=\"klant@voorbeeld.nl\" />\n      </FormField>\n      <FormField v-if=\"bccChoices.length\" label=\"Bcc (kopie)\" hint=\"Aangevinkte adressen krijgen blind een kopie. Beheer de lijst bij Instellingen.\">\n        <div class=\"mail__bcc\">\n          <label v-for=\"choice in bccChoices\" :key=\"choice.email\" class=\"mail__bccrow\">\n            <input v-model=\"choice.checked\" type=\"checkbox\" />\n            <span>{{ choice.email }}</span>\n          </label>\n        </div>\n      </FormField>\n      <FormField label=\"Onderwerp\" for-id=\"rmail-subject\">\n        <input id=\"rmail-subject\" v-model=\"form.subject\" class=\"hh-input\" />\n      </FormField>\n      <FormField label=\"Bericht\" for-id=\"rmail-body\">\n        <textarea id=\"rmail-body\" v-model=\"form.body\" class=\"hh-input mail__body\" rows=\"10\"></textarea>\n      </FormField>\n    </template>\n\n    <template #footer>\n      <button class=\"hh-btn\" type=\"button\" @click=\"emit('close')\">Annuleren</button>\n      <button class=\"hh-btn hh-btn--primary\" type=\"button\" :disabled=\"loading || sending\" @click=\"send\">\n        {{ sending ? \"Verzenden…\" : \"Verzenden\" }}\n      </button>\n    </template>\n  </AppDialog>\n</template>\n\n<script setup lang=\"ts\">\n// Mailconcept voor een betalingsherinnering: haalt de standaardtekst op\n// (getReminderMailDraft), laat 'm overschrijven, en verstuurt de herinnering echt\n// (PDF als bijlage) via sendReminderMail. Daarna is de herinnering als verzonden\n// gemarkeerd (informatief). Spiegelt InvoiceMailDialog.\nimport { onMounted, reactive, ref } from \"vue\";\nimport { useApi } from \"../lib/api\";\nimport { useToast } from \"../lib/toast\";\nimport AppDialog from \"./AppDialog.vue\";\nimport FormField from \"./FormField.vue\";\n\nconst api = useApi();\nconst showToast = useToast();\n\nconst props = defineProps<{ reminderId: number }>();\nconst emit = defineEmits<{ close: []; sent: [] }>();\n\nconst loading = ref(true);\nconst sending = ref(false);\nconst form = reactive({ to: \"\", subject: \"\", body: \"\" });\nconst bccChoices = reactive<Array<{ email: string; checked: boolean }>>([]);\n\nonMounted(async () => {\n  try {\n    const draft = await api.getReminderMailDraft({ id: props.reminderId });\n    form.to = draft.to;\n    form.subject = draft.subject;\n    form.body = draft.body;\n    bccChoices.splice(0, bccChoices.length, ...draft.bcc.map((email) => ({ email, checked: true })));\n  } catch (e) {\n    showToast(e instanceof Error ? e.message : \"Kon het mailconcept niet laden.\");\n  } finally {\n    loading.value = false;\n  }\n});\n\nasync function send(): Promise<void> {\n  sending.value = true;\n  try {\n    await api.sendReminderMail({\n      id: props.reminderId,\n      to: form.to,\n      bcc: bccChoices.filter((choice) => choice.checked).map((choice) => choice.email),\n      subject: form.subject,\n      body: form.body,\n    });\n    showToast(`Betalingsherinnering verzonden naar ${form.to}.`);\n    emit(\"sent\");\n  } catch (e) {\n    showToast(e instanceof Error ? e.message : \"Versturen mislukt.\");\n  } finally {\n    sending.value = false;\n  }\n}\n</script>\n\n<style scoped>\n.mail__notice {\n  margin: 0 0 12px;\n  padding: 8px 10px;\n  border-radius: var(--hh-radius);\n  background: var(--hh-surface-2);\n  border: 1px solid var(--hh-line);\n  font-size: 12.5px;\n  color: var(--hh-fg-muted);\n}\n.mail__body {\n  min-height: 200px;\n  font-family: inherit;\n}\n.mail__bcc {\n  display: grid;\n  gap: 6px;\n}\n.mail__bccrow {\n  display: flex;\n  align-items: center;\n  gap: 8px;\n  font-size: 13.5px;\n  cursor: pointer;\n}\n</style>\n","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, vModelText as _vModelText, withDirectives as _withDirectives, withCtx as _withCtx, createVNode as _createVNode, renderList as _renderList, Fragment as _Fragment, vModelCheckbox as _vModelCheckbox, toDisplayString as _toDisplayString, createBlock as _createBlock } from \"vue\"\n\nconst _hoisted_1 = {\n  key: 0,\n  class: \"hh-empty\"\n}\nconst _hoisted_2 = { class: \"mail__bcc\" }\nconst _hoisted_3 = [\"onUpdate:modelValue\"]\nconst _hoisted_4 = [\"disabled\"]\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return (_openBlock(), _createBlock($setup[\"AppDialog\"], {\n    title: \"Betalingsherinnering mailen\",\n    wide: \"\",\n    onClose: _cache[4] || (_cache[4] = $event => ($setup.emit('close')))\n  }, {\n    footer: _withCtx(() => [\n      _createElementVNode(\"button\", {\n        class: \"hh-btn\",\n        type: \"button\",\n        onClick: _cache[3] || (_cache[3] = $event => ($setup.emit('close')))\n      }, \"Annuleren\"),\n      _createElementVNode(\"button\", {\n        class: \"hh-btn hh-btn--primary\",\n        type: \"button\",\n        disabled: $setup.loading || $setup.sending,\n        onClick: $setup.send\n      }, _toDisplayString($setup.sending ? \"Verzenden…\" : \"Verzenden\"), 9 /* TEXT, PROPS */, _hoisted_4)\n    ]),\n    default: _withCtx(() => [\n      _cache[5] || (_cache[5] = _createElementVNode(\"p\", { class: \"mail__notice\" }, \"De herinnering wordt als PDF-bijlage naar de klant gemaild.\", -1 /* CACHED */)),\n      ($setup.loading)\n        ? (_openBlock(), _createElementBlock(\"div\", _hoisted_1, \"Laden…\"))\n        : (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n            _createVNode($setup[\"FormField\"], {\n              label: \"Aan (klant)\",\n              \"for-id\": \"rmail-to\"\n            }, {\n              default: _withCtx(() => [\n                _withDirectives(_createElementVNode(\"input\", {\n                  id: \"rmail-to\",\n                  \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => (($setup.form.to) = $event)),\n                  type: \"email\",\n                  class: \"hh-input\",\n                  \"data-autofocus\": \"\",\n                  placeholder: \"klant@voorbeeld.nl\"\n                }, null, 512 /* NEED_PATCH */), [\n                  [\n                    _vModelText,\n                    $setup.form.to,\n                    void 0,\n                    { trim: true }\n                  ]\n                ])\n              ]),\n              _: 1 /* STABLE */\n            }),\n            ($setup.bccChoices.length)\n              ? (_openBlock(), _createBlock($setup[\"FormField\"], {\n                  key: 0,\n                  label: \"Bcc (kopie)\",\n                  hint: \"Aangevinkte adressen krijgen blind een kopie. Beheer de lijst bij Instellingen.\"\n                }, {\n                  default: _withCtx(() => [\n                    _createElementVNode(\"div\", _hoisted_2, [\n                      (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.bccChoices, (choice) => {\n                        return (_openBlock(), _createElementBlock(\"label\", {\n                          key: choice.email,\n                          class: \"mail__bccrow\"\n                        }, [\n                          _withDirectives(_createElementVNode(\"input\", {\n                            \"onUpdate:modelValue\": $event => ((choice.checked) = $event),\n                            type: \"checkbox\"\n                          }, null, 8 /* PROPS */, _hoisted_3), [\n                            [_vModelCheckbox, choice.checked]\n                          ]),\n                          _createElementVNode(\"span\", null, _toDisplayString(choice.email), 1 /* TEXT */)\n                        ]))\n                      }), 128 /* KEYED_FRAGMENT */))\n                    ])\n                  ]),\n                  _: 1 /* STABLE */\n                }))\n              : _createCommentVNode(\"v-if\", true),\n            _createVNode($setup[\"FormField\"], {\n              label: \"Onderwerp\",\n              \"for-id\": \"rmail-subject\"\n            }, {\n              default: _withCtx(() => [\n                _withDirectives(_createElementVNode(\"input\", {\n                  id: \"rmail-subject\",\n                  \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => (($setup.form.subject) = $event)),\n                  class: \"hh-input\"\n                }, null, 512 /* NEED_PATCH */), [\n                  [_vModelText, $setup.form.subject]\n                ])\n              ]),\n              _: 1 /* STABLE */\n            }),\n            _createVNode($setup[\"FormField\"], {\n              label: \"Bericht\",\n              \"for-id\": \"rmail-body\"\n            }, {\n              default: _withCtx(() => [\n                _withDirectives(_createElementVNode(\"textarea\", {\n                  id: \"rmail-body\",\n                  \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => (($setup.form.body) = $event)),\n                  class: \"hh-input mail__body\",\n                  rows: \"10\"\n                }, null, 512 /* NEED_PATCH */), [\n                  [_vModelText, $setup.form.body]\n                ])\n              ]),\n              _: 1 /* STABLE */\n            })\n          ], 64 /* STABLE_FRAGMENT */))\n    ]),\n    _: 1 /* STABLE */,\n    __: [5]\n  }))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/ReminderMailDialog.vue?type=script\";import \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/ReminderMailDialog.vue?type=style&index=0\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/ReminderMailDialog.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/ReminderMailDialog.vue\";script.__scopeId = \"data-v-5337bf5c\";export default script;","<template>\n  <section>\n    <div class=\"no-print\">\n      <RouterLink class=\"detail__back\" :to=\"backTarget\">&larr; Klant</RouterLink>\n\n      <div v-if=\"loading\" class=\"hh-empty\">Laden…</div>\n      <p v-else-if=\"!reminder\" class=\"hh-formerror\">Betalingsherinnering niet gevonden.</p>\n    </div>\n\n    <template v-if=\"reminder\">\n      <div class=\"hh-page__bar no-print\">\n        <div>\n          <h1 class=\"hh-page__title\">Betalingsherinnering <span class=\"detail__mono\">{{ reminder.number }}</span></h1>\n          <p class=\"hh-page__sub\">\n            {{ reminder.customerTitle }} · {{ reminder.invoiceCount }} faktu(u)r(en) · {{ formatEuro(reminder.totalOpen) }} openstaand\n            <template v-if=\"reminder.sent\"> · <span class=\"hh-badge\">verzonden op {{ formatDate(reminder.sentDate) }}</span></template>\n          </p>\n        </div>\n        <div class=\"detail__actions\">\n          <button class=\"hh-btn\" type=\"button\" @click=\"editOpen = true\">Bewerken</button>\n          <button class=\"hh-btn\" type=\"button\" @click=\"mailOpen = true\">Mailen</button>\n          <button class=\"hh-btn\" type=\"button\" :disabled=\"pdfBusy\" @click=\"downloadPdf\">\n            {{ pdfBusy ? \"PDF…\" : \"Download PDF\" }}\n          </button>\n          <button class=\"hh-btn hh-btn--primary\" type=\"button\" @click=\"print\">Printen</button>\n          <button class=\"hh-btn hh-btn--danger\" type=\"button\" @click=\"deleteOpen = true\">Verwijderen</button>\n        </div>\n      </div>\n\n      <!-- Printweergave / preview (zelfde huisstijl als de factuur) -->\n      <article class=\"invoice-print\">\n        <header class=\"ip__head\">\n          <img v-if=\"company?.logoUrl\" class=\"ip__logo\" :src=\"company.logoUrl\" :alt=\"company.name\" />\n          <div v-if=\"company\" class=\"ip__company\">\n            <div class=\"ip__company-name\">{{ company.name }}</div>\n            <div v-for=\"(line, i) in company.addressLines\" :key=\"i\">{{ line }}</div>\n            <div class=\"ip__company-block\">\n              <div v-if=\"company.email\">{{ company.email }}</div>\n              <div v-if=\"company.phone\">{{ company.phone }}</div>\n            </div>\n            <div class=\"ip__company-block\">\n              <div v-if=\"company.kvk\">KVK: {{ company.kvk }}</div>\n              <div v-if=\"company.vat\">Btw: {{ company.vat }}</div>\n              <div v-if=\"company.iban\">Bank: {{ company.iban }}</div>\n            </div>\n          </div>\n        </header>\n\n        <div class=\"ip__customer\">\n          <div v-for=\"(line, i) in addressLines\" :key=\"i\">{{ line }}</div>\n        </div>\n\n        <div class=\"ip__titlebar\">\n          <h2 class=\"ip__title\">Betalingsherinnering <span class=\"ip__title-nr\">{{ reminder.number }}</span></h2>\n          <table class=\"ip__meta\">\n            <tbody>\n              <tr><td class=\"ip__meta-label\">Datum:</td><td class=\"ip__meta-val\">{{ formatDate(reminder.date) }}</td></tr>\n            </tbody>\n          </table>\n        </div>\n\n        <div class=\"ip__intro\">\n          <div v-for=\"(line, i) in reminder.textLines\" :key=\"i\">{{ line || \" \" }}</div>\n        </div>\n\n        <table class=\"ip__lines\">\n          <thead>\n            <tr>\n              <th>Factuurnummer</th>\n              <th>Factuurdatum</th>\n              <th>Vervaldatum</th>\n              <th class=\"ip__num\">Openstaand (incl. btw)</th>\n            </tr>\n          </thead>\n          <tbody>\n            <tr v-for=\"line in reminder.invoices\" :key=\"line.id\">\n              <td class=\"ip__mono\">{{ line.number }}</td>\n              <td>{{ formatDate(line.date) }}</td>\n              <td>{{ formatDate(line.dueDate) }}</td>\n              <td class=\"ip__num\">{{ formatEuro(line.openAmount) }}</td>\n            </tr>\n            <tr class=\"ip__total\">\n              <td colspan=\"3\">Totaal openstaand</td>\n              <td class=\"ip__num\">{{ formatEuro(reminder.totalOpen) }}</td>\n            </tr>\n          </tbody>\n        </table>\n\n        <footer class=\"ip__foot\">\n          <p class=\"ip__foot-pay\">{{ paymentText }}</p>\n          <p class=\"ip__foot-terms\">Heeft u de betaling inmiddels verricht, dan kunt u deze herinnering als niet verzonden beschouwen.</p>\n        </footer>\n      </article>\n    </template>\n\n    <ReminderFormDialog\n      v-if=\"editOpen && reminder\"\n      :customer-id=\"reminder.customerId\"\n      :reminder-id=\"reminder.id\"\n      @close=\"editOpen = false\"\n      @saved=\"onEdited\"\n    />\n    <ReminderMailDialog v-if=\"mailOpen && reminder\" :reminder-id=\"reminder.id\" @close=\"mailOpen = false\" @sent=\"onMailSent\" />\n\n    <AppDialog v-if=\"deleteOpen\" title=\"Betalingsherinnering verwijderen\" @close=\"deleteOpen = false\">\n      <p>Weet je zeker dat je deze betalingsherinnering wilt verwijderen? De onderliggende facturen blijven bestaan.</p>\n      <template #footer>\n        <button class=\"hh-btn\" type=\"button\" @click=\"deleteOpen = false\">Annuleren</button>\n        <button class=\"hh-btn hh-btn--danger\" type=\"button\" data-autofocus :disabled=\"deleting\" @click=\"confirmDelete\">\n          {{ deleting ? \"Verwijderen…\" : \"Verwijderen\" }}\n        </button>\n      </template>\n    </AppDialog>\n  </section>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, onMounted, ref, watch } from \"vue\";\nimport { RouterLink, useRoute, useRouter, type RouteLocationRaw } from \"vue-router\";\nimport { useApi } from \"../lib/api\";\nimport { formatDate, formatEuro } from \"../lib/format\";\nimport { downloadBase64 } from \"../lib/download\";\nimport { useToast } from \"../lib/toast\";\nimport AppDialog from \"../components/AppDialog.vue\";\nimport ReminderFormDialog from \"../components/ReminderFormDialog.vue\";\nimport ReminderMailDialog from \"../components/ReminderMailDialog.vue\";\n\nconst api = useApi();\nconst showToast = useToast();\n\ntype Reminder = NonNullable<Awaited<ReturnType<typeof api.getReminder>>>;\ntype CustomerDetail = NonNullable<Awaited<ReturnType<typeof api.getCustomer>>>;\ntype CompanyInfo = Awaited<ReturnType<typeof api.getCompanyInfo>>;\n\nconst route = useRoute();\nconst router = useRouter();\nconst reminderId = computed(() => Number(route.params.id));\n\nconst loading = ref(true);\nconst reminder = ref<Reminder | null>(null);\nconst customer = ref<CustomerDetail | null>(null);\nconst company = ref<CompanyInfo | null>(null);\n\nconst backTarget = computed<RouteLocationRaw>(() =>\n  reminder.value\n    ? { name: \"klanten-detail\", params: { id: String(reminder.value.customerId) }, query: { tab: \"herinneringen\" } }\n    : { name: \"klanten\" });\n\nconst addressLines = computed<string[]>(() => {\n  const r = reminder.value;\n  if (!r) return [];\n  const c = customer.value;\n  if (!c) return [r.customerTitle];\n  const lines: string[] = [];\n  const name = c.company || c.contactName || r.customerTitle;\n  if (name) lines.push(name);\n  if (c.company && c.contactName) lines.push(`t.a.v. ${[c.contactTitle, c.contactName].filter(Boolean).join(\" \")}`);\n  if (c.address) lines.push(c.address);\n  const cityLine = [c.postalCode, c.city].filter(Boolean).join(\"  \");\n  if (cityLine) lines.push(cityLine);\n  return lines;\n});\n\n// Vervaldatum = herinneringsdatum + 14 dagen (UTC, spiegelt de PDF-kant).\nconst dueDate = computed<string>(() => {\n  if (!reminder.value) return \"\";\n  const date = new Date(reminder.value.date);\n  date.setUTCDate(date.getUTCDate() + 14);\n  return formatDate(date.toISOString());\n});\n\nconst paymentText = computed<string>(() => {\n  if (!reminder.value || !company.value) return \"\";\n  return `Wij verzoeken u vriendelijk het openstaande totaal van ${formatEuro(reminder.value.totalOpen)} vóór ${dueDate.value} `\n    + `te voldoen${company.value.iban ? ` op ${company.value.iban}` : \"\"} onder vermelding van herinneringsnummer ${reminder.value.number}.`;\n});\n\nasync function load(): Promise<void> {\n  loading.value = true;\n  try {\n    const [detail, companyInfo] = await Promise.all([api.getReminder({ id: reminderId.value }), api.getCompanyInfo()]);\n    reminder.value = detail;\n    company.value = companyInfo;\n    customer.value = detail ? await api.getCustomer({ id: detail.customerId }) : null;\n  } finally {\n    loading.value = false;\n  }\n}\n\nconst editOpen = ref(false);\nconst mailOpen = ref(false);\nconst deleteOpen = ref(false);\nconst deleting = ref(false);\nconst pdfBusy = ref(false);\n\nfunction onEdited(): void {\n  editOpen.value = false;\n  void load();\n}\n\nfunction onMailSent(): void {\n  mailOpen.value = false;\n  void load();\n}\n\nasync function confirmDelete(): Promise<void> {\n  if (!reminder.value) return;\n  deleting.value = true;\n  try {\n    const target = backTarget.value;\n    await api.deleteReminder({ id: reminder.value.id });\n    showToast(\"Betalingsherinnering verwijderd.\");\n    void router.push(target);\n  } catch (e) {\n    showToast(e instanceof Error ? e.message : \"Verwijderen mislukt.\");\n  } finally {\n    deleting.value = false;\n  }\n}\n\nfunction print(): void {\n  window.print();\n}\n\nasync function downloadPdf(): Promise<void> {\n  if (!reminder.value) return;\n  pdfBusy.value = true;\n  try {\n    const { filename, base64 } = await api.getReminderPdf({ id: reminderId.value });\n    downloadBase64({ base64, filename, mimeType: \"application/pdf\" });\n  } catch (e) {\n    showToast(e instanceof Error ? e.message : \"PDF genereren mislukt.\");\n  } finally {\n    pdfBusy.value = false;\n  }\n}\n\n// Escape terug naar de klant (dynamische bestemming, want customerId is pas na\n// laden bekend). Genegeerd bij een open dialoog of tijdens typen in een veld.\nfunction onKeydown(event: KeyboardEvent): void {\n  if (event.key !== \"Escape\") return;\n  if (document.querySelector(\".dialog-backdrop\")) return;\n  const el = document.activeElement as HTMLElement | null;\n  if (el && (el.tagName === \"INPUT\" || el.tagName === \"TEXTAREA\" || el.tagName === \"SELECT\" || el.isContentEditable)) return;\n  event.preventDefault();\n  void router.push(backTarget.value);\n}\n\nwatch(reminderId, () => { void load(); });\nonMounted(() => {\n  void load();\n  window.addEventListener(\"keydown\", onKeydown);\n});\nonBeforeUnmount(() => window.removeEventListener(\"keydown\", onKeydown));\n</script>\n\n<style scoped>\n.detail__back {\n  display: inline-block;\n  margin-bottom: 12px;\n  color: var(--hh-fg-muted);\n  text-decoration: none;\n  font-size: 13px;\n}\n.detail__back:hover {\n  color: var(--hh-accent);\n}\n.detail__mono {\n  font-family: var(--hh-mono);\n}\n.detail__actions {\n  display: flex;\n  gap: 8px;\n  flex-wrap: wrap;\n}\n\n.invoice-print {\n  max-width: 760px;\n  margin: 0 auto;\n  padding: 48px 52px;\n  border: 1px solid var(--hh-line);\n  border-radius: var(--hh-radius-lg);\n  background: #fff;\n  box-shadow: var(--hh-shadow);\n  color: #1a1d21;\n}\n\n/* Kop: logo links, bedrijfsgegevens rechts */\n.ip__head {\n  display: flex;\n  justify-content: space-between;\n  align-items: flex-start;\n  gap: 32px;\n  margin-bottom: 40px;\n}\n.ip__logo {\n  width: 150px;\n  height: auto;\n  display: block;\n}\n.ip__company {\n  text-align: right;\n  font-size: 12px;\n  line-height: 1.55;\n  color: #444a52;\n}\n.ip__company-name {\n  font-size: 14px;\n  font-weight: 700;\n  color: #1f4e79;\n  margin-bottom: 2px;\n}\n.ip__company-block {\n  margin-top: 10px;\n}\n\n/* Klantadres */\n.ip__customer {\n  margin-bottom: 44px;\n  font-size: 13px;\n  line-height: 1.55;\n}\n\n/* Titelbalk */\n.ip__titlebar {\n  display: flex;\n  justify-content: space-between;\n  align-items: flex-end;\n  gap: 24px;\n  margin-bottom: 22px;\n}\n.ip__title {\n  margin: 0;\n  font-size: 28px;\n  font-weight: 700;\n  letter-spacing: -0.01em;\n  color: #1f4e79;\n}\n.ip__title-nr {\n  color: #9aa2ab;\n  font-weight: 600;\n  font-family: var(--hh-mono);\n}\n.ip__meta {\n  border-collapse: collapse;\n  font-size: 12.5px;\n}\n.ip__meta-label {\n  padding: 1px 16px 1px 0;\n  color: #6b7178;\n  text-align: left;\n}\n.ip__meta-val {\n  padding: 1px 0;\n  text-align: right;\n  font-variant-numeric: tabular-nums;\n}\n\n/* Toelichtingstekst */\n.ip__intro {\n  margin-bottom: 22px;\n  font-size: 13px;\n  line-height: 1.6;\n  color: #444a52;\n}\n\n/* Regels */\n.ip__lines {\n  width: 100%;\n  border-collapse: collapse;\n}\n.ip__lines thead th {\n  font-size: 11px;\n  text-transform: uppercase;\n  letter-spacing: 0.05em;\n  color: #6b7178;\n  text-align: left;\n  padding: 0 0 8px;\n  border-bottom: 1.5px solid #cfd4da;\n}\n.ip__lines tbody td {\n  padding: 12px 0;\n  vertical-align: top;\n  border-bottom: 1px solid #e6e9ed;\n  font-variant-numeric: tabular-nums;\n}\n.ip__mono {\n  font-family: var(--hh-mono);\n}\n.ip__num {\n  text-align: right;\n  white-space: nowrap;\n}\n.ip__total td {\n  border-top: 2px solid #1f4e79;\n  border-bottom: 0;\n  font-weight: 700;\n  font-size: 15px;\n  padding-top: 12px;\n}\n\n/* Voet */\n.ip__foot {\n  margin-top: 44px;\n  padding-top: 16px;\n  border-top: 1px solid #e6e9ed;\n  font-size: 11.5px;\n  color: #6b7178;\n  line-height: 1.6;\n}\n.ip__foot-pay {\n  margin: 0 0 10px;\n  color: #1a1d21;\n}\n.ip__foot-terms {\n  margin: 0;\n}\n</style>\n","import { createTextVNode as _createTextVNode, withCtx as _withCtx, createVNode as _createVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, Fragment as _Fragment, renderList as _renderList, createBlock as _createBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"no-print\" }\nconst _hoisted_2 = {\n  key: 0,\n  class: \"hh-empty\"\n}\nconst _hoisted_3 = {\n  key: 1,\n  class: \"hh-formerror\"\n}\nconst _hoisted_4 = { class: \"hh-page__bar no-print\" }\nconst _hoisted_5 = { class: \"hh-page__title\" }\nconst _hoisted_6 = { class: \"detail__mono\" }\nconst _hoisted_7 = { class: \"hh-page__sub\" }\nconst _hoisted_8 = { class: \"hh-badge\" }\nconst _hoisted_9 = { class: \"detail__actions\" }\nconst _hoisted_10 = [\"disabled\"]\nconst _hoisted_11 = { class: \"invoice-print\" }\nconst _hoisted_12 = { class: \"ip__head\" }\nconst _hoisted_13 = [\"src\", \"alt\"]\nconst _hoisted_14 = {\n  key: 1,\n  class: \"ip__company\"\n}\nconst _hoisted_15 = { class: \"ip__company-name\" }\nconst _hoisted_16 = { class: \"ip__company-block\" }\nconst _hoisted_17 = { key: 0 }\nconst _hoisted_18 = { key: 1 }\nconst _hoisted_19 = { class: \"ip__company-block\" }\nconst _hoisted_20 = { key: 0 }\nconst _hoisted_21 = { key: 1 }\nconst _hoisted_22 = { key: 2 }\nconst _hoisted_23 = { class: \"ip__customer\" }\nconst _hoisted_24 = { class: \"ip__titlebar\" }\nconst _hoisted_25 = { class: \"ip__title\" }\nconst _hoisted_26 = { class: \"ip__title-nr\" }\nconst _hoisted_27 = { class: \"ip__meta\" }\nconst _hoisted_28 = { class: \"ip__meta-val\" }\nconst _hoisted_29 = { class: \"ip__intro\" }\nconst _hoisted_30 = { class: \"ip__lines\" }\nconst _hoisted_31 = { class: \"ip__mono\" }\nconst _hoisted_32 = { class: \"ip__num\" }\nconst _hoisted_33 = { class: \"ip__total\" }\nconst _hoisted_34 = { class: \"ip__num\" }\nconst _hoisted_35 = { class: \"ip__foot\" }\nconst _hoisted_36 = { class: \"ip__foot-pay\" }\nconst _hoisted_37 = [\"disabled\"]\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return (_openBlock(), _createElementBlock(\"section\", null, [\n    _createElementVNode(\"div\", _hoisted_1, [\n      _createVNode($setup[\"RouterLink\"], {\n        class: \"detail__back\",\n        to: $setup.backTarget\n      }, {\n        default: _withCtx(() => _cache[7] || (_cache[7] = [\n          _createTextVNode(\"← Klant\", -1 /* CACHED */)\n        ])),\n        _: 1 /* STABLE */,\n        __: [7]\n      }, 8 /* PROPS */, [\"to\"]),\n      ($setup.loading)\n        ? (_openBlock(), _createElementBlock(\"div\", _hoisted_2, \"Laden…\"))\n        : (!$setup.reminder)\n          ? (_openBlock(), _createElementBlock(\"p\", _hoisted_3, \"Betalingsherinnering niet gevonden.\"))\n          : _createCommentVNode(\"v-if\", true)\n    ]),\n    ($setup.reminder)\n      ? (_openBlock(), _createElementBlock(_Fragment, { key: 0 }, [\n          _createElementVNode(\"div\", _hoisted_4, [\n            _createElementVNode(\"div\", null, [\n              _createElementVNode(\"h1\", _hoisted_5, [\n                _cache[8] || (_cache[8] = _createTextVNode(\"Betalingsherinnering \", -1 /* CACHED */)),\n                _createElementVNode(\"span\", _hoisted_6, _toDisplayString($setup.reminder.number), 1 /* TEXT */)\n              ]),\n              _createElementVNode(\"p\", _hoisted_7, [\n                _createTextVNode(_toDisplayString($setup.reminder.customerTitle) + \" · \" + _toDisplayString($setup.reminder.invoiceCount) + \" faktu(u)r(en) · \" + _toDisplayString($setup.formatEuro($setup.reminder.totalOpen)) + \" openstaand \", 1 /* TEXT */),\n                ($setup.reminder.sent)\n                  ? (_openBlock(), _createElementBlock(_Fragment, { key: 0 }, [\n                      _cache[9] || (_cache[9] = _createTextVNode(\" · \", -1 /* CACHED */)),\n                      _createElementVNode(\"span\", _hoisted_8, \"verzonden op \" + _toDisplayString($setup.formatDate($setup.reminder.sentDate)), 1 /* TEXT */)\n                    ], 64 /* STABLE_FRAGMENT */))\n                  : _createCommentVNode(\"v-if\", true)\n              ])\n            ]),\n            _createElementVNode(\"div\", _hoisted_9, [\n              _createElementVNode(\"button\", {\n                class: \"hh-btn\",\n                type: \"button\",\n                onClick: _cache[0] || (_cache[0] = $event => ($setup.editOpen = true))\n              }, \"Bewerken\"),\n              _createElementVNode(\"button\", {\n                class: \"hh-btn\",\n                type: \"button\",\n                onClick: _cache[1] || (_cache[1] = $event => ($setup.mailOpen = true))\n              }, \"Mailen\"),\n              _createElementVNode(\"button\", {\n                class: \"hh-btn\",\n                type: \"button\",\n                disabled: $setup.pdfBusy,\n                onClick: $setup.downloadPdf\n              }, _toDisplayString($setup.pdfBusy ? \"PDF…\" : \"Download PDF\"), 9 /* TEXT, PROPS */, _hoisted_10),\n              _createElementVNode(\"button\", {\n                class: \"hh-btn hh-btn--primary\",\n                type: \"button\",\n                onClick: $setup.print\n              }, \"Printen\"),\n              _createElementVNode(\"button\", {\n                class: \"hh-btn hh-btn--danger\",\n                type: \"button\",\n                onClick: _cache[2] || (_cache[2] = $event => ($setup.deleteOpen = true))\n              }, \"Verwijderen\")\n            ])\n          ]),\n          _createCommentVNode(\" Printweergave / preview (zelfde huisstijl als de factuur) \"),\n          _createElementVNode(\"article\", _hoisted_11, [\n            _createElementVNode(\"header\", _hoisted_12, [\n              ($setup.company?.logoUrl)\n                ? (_openBlock(), _createElementBlock(\"img\", {\n                    key: 0,\n                    class: \"ip__logo\",\n                    src: $setup.company.logoUrl,\n                    alt: $setup.company.name\n                  }, null, 8 /* PROPS */, _hoisted_13))\n                : _createCommentVNode(\"v-if\", true),\n              ($setup.company)\n                ? (_openBlock(), _createElementBlock(\"div\", _hoisted_14, [\n                    _createElementVNode(\"div\", _hoisted_15, _toDisplayString($setup.company.name), 1 /* TEXT */),\n                    (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.company.addressLines, (line, i) => {\n                      return (_openBlock(), _createElementBlock(\"div\", { key: i }, _toDisplayString(line), 1 /* TEXT */))\n                    }), 128 /* KEYED_FRAGMENT */)),\n                    _createElementVNode(\"div\", _hoisted_16, [\n                      ($setup.company.email)\n                        ? (_openBlock(), _createElementBlock(\"div\", _hoisted_17, _toDisplayString($setup.company.email), 1 /* TEXT */))\n                        : _createCommentVNode(\"v-if\", true),\n                      ($setup.company.phone)\n                        ? (_openBlock(), _createElementBlock(\"div\", _hoisted_18, _toDisplayString($setup.company.phone), 1 /* TEXT */))\n                        : _createCommentVNode(\"v-if\", true)\n                    ]),\n                    _createElementVNode(\"div\", _hoisted_19, [\n                      ($setup.company.kvk)\n                        ? (_openBlock(), _createElementBlock(\"div\", _hoisted_20, \"KVK: \" + _toDisplayString($setup.company.kvk), 1 /* TEXT */))\n                        : _createCommentVNode(\"v-if\", true),\n                      ($setup.company.vat)\n                        ? (_openBlock(), _createElementBlock(\"div\", _hoisted_21, \"Btw: \" + _toDisplayString($setup.company.vat), 1 /* TEXT */))\n                        : _createCommentVNode(\"v-if\", true),\n                      ($setup.company.iban)\n                        ? (_openBlock(), _createElementBlock(\"div\", _hoisted_22, \"Bank: \" + _toDisplayString($setup.company.iban), 1 /* TEXT */))\n                        : _createCommentVNode(\"v-if\", true)\n                    ])\n                  ]))\n                : _createCommentVNode(\"v-if\", true)\n            ]),\n            _createElementVNode(\"div\", _hoisted_23, [\n              (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.addressLines, (line, i) => {\n                return (_openBlock(), _createElementBlock(\"div\", { key: i }, _toDisplayString(line), 1 /* TEXT */))\n              }), 128 /* KEYED_FRAGMENT */))\n            ]),\n            _createElementVNode(\"div\", _hoisted_24, [\n              _createElementVNode(\"h2\", _hoisted_25, [\n                _cache[10] || (_cache[10] = _createTextVNode(\"Betalingsherinnering \", -1 /* CACHED */)),\n                _createElementVNode(\"span\", _hoisted_26, _toDisplayString($setup.reminder.number), 1 /* TEXT */)\n              ]),\n              _createElementVNode(\"table\", _hoisted_27, [\n                _createElementVNode(\"tbody\", null, [\n                  _createElementVNode(\"tr\", null, [\n                    _cache[11] || (_cache[11] = _createElementVNode(\"td\", { class: \"ip__meta-label\" }, \"Datum:\", -1 /* CACHED */)),\n                    _createElementVNode(\"td\", _hoisted_28, _toDisplayString($setup.formatDate($setup.reminder.date)), 1 /* TEXT */)\n                  ])\n                ])\n              ])\n            ]),\n            _createElementVNode(\"div\", _hoisted_29, [\n              (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.reminder.textLines, (line, i) => {\n                return (_openBlock(), _createElementBlock(\"div\", { key: i }, _toDisplayString(line || \" \"), 1 /* TEXT */))\n              }), 128 /* KEYED_FRAGMENT */))\n            ]),\n            _createElementVNode(\"table\", _hoisted_30, [\n              _cache[13] || (_cache[13] = _createElementVNode(\"thead\", null, [\n                _createElementVNode(\"tr\", null, [\n                  _createElementVNode(\"th\", null, \"Factuurnummer\"),\n                  _createElementVNode(\"th\", null, \"Factuurdatum\"),\n                  _createElementVNode(\"th\", null, \"Vervaldatum\"),\n                  _createElementVNode(\"th\", { class: \"ip__num\" }, \"Openstaand (incl. btw)\")\n                ])\n              ], -1 /* CACHED */)),\n              _createElementVNode(\"tbody\", null, [\n                (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.reminder.invoices, (line) => {\n                  return (_openBlock(), _createElementBlock(\"tr\", {\n                    key: line.id\n                  }, [\n                    _createElementVNode(\"td\", _hoisted_31, _toDisplayString(line.number), 1 /* TEXT */),\n                    _createElementVNode(\"td\", null, _toDisplayString($setup.formatDate(line.date)), 1 /* TEXT */),\n                    _createElementVNode(\"td\", null, _toDisplayString($setup.formatDate(line.dueDate)), 1 /* TEXT */),\n                    _createElementVNode(\"td\", _hoisted_32, _toDisplayString($setup.formatEuro(line.openAmount)), 1 /* TEXT */)\n                  ]))\n                }), 128 /* KEYED_FRAGMENT */)),\n                _createElementVNode(\"tr\", _hoisted_33, [\n                  _cache[12] || (_cache[12] = _createElementVNode(\"td\", { colspan: \"3\" }, \"Totaal openstaand\", -1 /* CACHED */)),\n                  _createElementVNode(\"td\", _hoisted_34, _toDisplayString($setup.formatEuro($setup.reminder.totalOpen)), 1 /* TEXT */)\n                ])\n              ])\n            ]),\n            _createElementVNode(\"footer\", _hoisted_35, [\n              _createElementVNode(\"p\", _hoisted_36, _toDisplayString($setup.paymentText), 1 /* TEXT */),\n              _cache[14] || (_cache[14] = _createElementVNode(\"p\", { class: \"ip__foot-terms\" }, \"Heeft u de betaling inmiddels verricht, dan kunt u deze herinnering als niet verzonden beschouwen.\", -1 /* CACHED */))\n            ])\n          ])\n        ], 64 /* STABLE_FRAGMENT */))\n      : _createCommentVNode(\"v-if\", true),\n    ($setup.editOpen && $setup.reminder)\n      ? (_openBlock(), _createBlock($setup[\"ReminderFormDialog\"], {\n          key: 1,\n          \"customer-id\": $setup.reminder.customerId,\n          \"reminder-id\": $setup.reminder.id,\n          onClose: _cache[3] || (_cache[3] = $event => ($setup.editOpen = false)),\n          onSaved: $setup.onEdited\n        }, null, 8 /* PROPS */, [\"customer-id\", \"reminder-id\"]))\n      : _createCommentVNode(\"v-if\", true),\n    ($setup.mailOpen && $setup.reminder)\n      ? (_openBlock(), _createBlock($setup[\"ReminderMailDialog\"], {\n          key: 2,\n          \"reminder-id\": $setup.reminder.id,\n          onClose: _cache[4] || (_cache[4] = $event => ($setup.mailOpen = false)),\n          onSent: $setup.onMailSent\n        }, null, 8 /* PROPS */, [\"reminder-id\"]))\n      : _createCommentVNode(\"v-if\", true),\n    ($setup.deleteOpen)\n      ? (_openBlock(), _createBlock($setup[\"AppDialog\"], {\n          key: 3,\n          title: \"Betalingsherinnering verwijderen\",\n          onClose: _cache[6] || (_cache[6] = $event => ($setup.deleteOpen = false))\n        }, {\n          footer: _withCtx(() => [\n            _createElementVNode(\"button\", {\n              class: \"hh-btn\",\n              type: \"button\",\n              onClick: _cache[5] || (_cache[5] = $event => ($setup.deleteOpen = false))\n            }, \"Annuleren\"),\n            _createElementVNode(\"button\", {\n              class: \"hh-btn hh-btn--danger\",\n              type: \"button\",\n              \"data-autofocus\": \"\",\n              disabled: $setup.deleting,\n              onClick: $setup.confirmDelete\n            }, _toDisplayString($setup.deleting ? \"Verwijderen…\" : \"Verwijderen\"), 9 /* TEXT, PROPS */, _hoisted_37)\n          ]),\n          default: _withCtx(() => [\n            _cache[15] || (_cache[15] = _createElementVNode(\"p\", null, \"Weet je zeker dat je deze betalingsherinnering wilt verwijderen? De onderliggende facturen blijven bestaan.\", -1 /* CACHED */))\n          ]),\n          _: 1 /* STABLE */,\n          __: [15]\n        }))\n      : _createCommentVNode(\"v-if\", true)\n  ]))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/ReminderDetailView.vue?type=script\";import \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/ReminderDetailView.vue?type=style&index=0\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/ReminderDetailView.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/ReminderDetailView.vue\";script.__scopeId = \"data-v-53798e61\";export default script;","/** Keep persisted expense-kind indices intact when hiding removed kinds. */\nexport function expenseKindOptions(kinds: string[]): Array<{ value: number; label: string }> {\n  return kinds.map((label, value) => ({ value, label: label.trim() })).filter((kind) => kind.label !== \"\");\n}\n\n/** Never initialize a new expense with a removed or unnamed kind. */\nexport function defaultExpenseKind(kinds: string[]): number | null {\n  return expenseKindOptions(kinds)[0]?.value ?? null;\n}\n","export interface ExpensesState {\n  customerId: number;\n  year: string;\n  kind: string;\n}\n\n/** Keep category zero distinct from all categories; reject partial numeric values. */\nexport function parseExpensesState(query: Record<string, string | undefined>): ExpensesState {\n  const integer = (value: string | undefined) => value !== undefined && /^\\d+$/.test(value) && Number.isSafeInteger(Number(value));\n  return {\n    customerId: integer(query.klant) ? Number(query.klant) : 0,\n    year: query.jaar && /^[1-9]\\d{3}$/.test(query.jaar) ? query.jaar : \"all\",\n    kind: integer(query.soort) ? String(Number(query.soort)) : \"all\",\n  };\n}\n\n/** Omit unfiltered values from the route query. */\nexport function expensesStateToQuery(state: ExpensesState): Record<string, string> {\n  const query: Record<string, string> = {};\n  if (state.customerId) query.klant = String(state.customerId);\n  if (state.year !== \"all\") query.jaar = state.year;\n  if (state.kind !== \"all\") query.soort = state.kind;\n  return query;\n}\n","<template>\n  <section>\n    <div class=\"hh-page__bar\">\n      <div>\n        <h1 class=\"hh-page__title\">Verschotten</h1>\n        <p class=\"hh-page__sub\">Doorbelaste onkosten en voorschotten per klant.</p>\n      </div>\n      <RouterLink class=\"hh-btn hh-btn--primary\" :to=\"{ name: 'verschotten-invoeren' }\">+ Verschotten invoeren</RouterLink>\n    </div>\n\n    <div class=\"hh-card ex__filters\">\n      <label class=\"ex__f\">Klant\n        <Combobox :model-value=\"filterCustomer\" :options=\"customerOptions\" aria-label=\"Klant\" placeholder=\"Nummer of naam…\" @update:model-value=\"filterCustomer = $event ?? 0\" />\n      </label>\n      <label class=\"ex__f\">Jaar\n        <select v-model=\"filterYear\" class=\"hh-select\">\n          <option value=\"all\">Alle jaren</option>\n          <option v-if=\"filterYear !== 'all' && !years.includes(Number(filterYear))\" :value=\"filterYear\">{{ filterYear }}</option>\n          <option v-for=\"year in years\" :key=\"year\" :value=\"String(year)\">{{ year }}</option>\n        </select>\n      </label>\n      <label class=\"ex__f\">Soort\n        <select v-model=\"filterKind\" class=\"hh-select\">\n          <option value=\"all\">Alle soorten</option>\n          <option v-for=\"opt in kindOptions\" :key=\"opt.value\" :value=\"String(opt.value)\">{{ opt.label }}</option>\n        </select>\n      </label>\n    </div>\n\n    <p v-if=\"error\" class=\"hh-formerror\">{{ error }}</p>\n\n    <div class=\"hh-card\">\n      <div v-if=\"loading\" class=\"hh-empty\">Laden…</div>\n      <p v-else-if=\"visibleExpenses.length === 0\" class=\"hh-empty\">Geen verschotten voor deze selectie.</p>\n      <table v-else class=\"hh-table\">\n        <thead>\n          <tr>\n            <th style=\"width: 100px\">Datum</th>\n            <th style=\"width: 85px\">Boekjaar</th>\n            <th>Klant</th>\n            <th style=\"width: 130px\">Soort</th>\n            <th>Omschrijving</th>\n            <th class=\"hh-table__num\" style=\"width: 110px\">Bedrag</th>\n            <th style=\"width: 90px\"></th>\n          </tr>\n        </thead>\n        <tbody>\n          <tr v-for=\"expense in visibleExpenses\" :key=\"expense.id\">\n            <td>{{ formatDate(expense.date) }}</td>\n            <td class=\"hh-table__code\">{{ expense.fiscalYear }}</td>\n            <td>{{ expense.customerTitle }}</td>\n            <td class=\"hh-muted\">{{ kindLabel(expense.kind) }}</td>\n            <td>{{ expense.description || emptyMark }}<span v-if=\"expense.transferPartnerId\" class=\"ex__transfer\">{{ expenseTransferLabel(expense) }}</span></td>\n            <td class=\"hh-table__num\">{{ formatEuro(expense.amount) }}</td>\n            <td><button class=\"hh-btn hh-btn--small hh-btn--danger\" type=\"button\" @click=\"askDelete(expense)\">Verwijder</button></td>\n          </tr>\n        </tbody>\n        <tfoot>\n          <tr class=\"ex__total\">\n            <td colspan=\"5\">Totaal ({{ visibleExpenses.length }} verschotten)</td>\n            <td class=\"hh-table__num\">{{ formatEuro(totalAmount) }}</td>\n            <td></td>\n          </tr>\n        </tfoot>\n      </table>\n    </div>\n\n    <AppDialog v-if=\"deleteTarget\" :title=\"deleteTarget.transferPartnerId ? 'Journaalboeking verwijderen' : 'Verschot verwijderen'\" @close=\"closeDelete\">\n      <p v-if=\"deleteTarget.transferPartnerId\">Deze journaalboeking wordt in beide boekjaren ({{ deleteTarget.fiscalYear }} en {{ deleteTarget.transferYear }}) verwijderd. Wil je doorgaan?</p>\n      <p v-else>Weet je zeker dat je dit verschot wilt verwijderen?</p>\n      <p class=\"ex__delinfo\">\n        {{ formatDate(deleteTarget.date) }} · {{ deleteTarget.customerTitle }} · Boekjaar {{ deleteTarget.fiscalYear }} · {{ formatEuro(deleteTarget.amount) }}\n        <span v-if=\"deleteTarget.description\"><br />{{ deleteTarget.description }}</span>\n      </p>\n      <p v-if=\"deleteError\" class=\"hh-formerror\">{{ deleteError }}</p>\n      <template #footer>\n        <button class=\"hh-btn\" type=\"button\" data-autofocus :disabled=\"deleting\" @click=\"closeDelete\">Annuleren</button>\n        <button class=\"hh-btn hh-btn--danger\" type=\"button\" :disabled=\"deleting\" @click=\"confirmDelete\">{{ deleting ? \"Verwijderen…\" : \"Verwijderen\" }}</button>\n      </template>\n    </AppDialog>\n  </section>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, onMounted, ref, watch } from \"vue\";\nimport { RouterLink, useRoute, useRouter } from \"vue-router\";\nimport { Money } from \"@webhare/std\";\nimport Combobox, { type ComboOption } from \"../components/Combobox.vue\";\nimport { expenseKindOptions } from \"../lib/expenseKinds\";\nimport { expenseTransferLabel } from \"../lib/expenseTransfer\";\nimport { useApi } from \"../lib/api\";\nimport { formatDate, formatEuro } from \"../lib/format\";\nimport { expensesStateToQuery, parseExpensesState } from \"../lib/expensesState\";\nimport { queryRecord, sameQuery } from \"../lib/routeQuery\";\nimport AppDialog from \"../components/AppDialog.vue\";\n\nconst api = useApi();\n\ntype Expense = Awaited<ReturnType<typeof api.listExpenses>>[number];\ntype Customer = Awaited<ReturnType<typeof api.listCustomers>>[number];\n\n// Lege-cel-markering zonder letterlijke em-dash-byte in de bron (no-emdash-hook +\n// Write-tool-normalisatie omzeilen): rendert als een streepje, staat als ASCII.\nconst emptyMark = String.fromCharCode(8212);\n\nconst expenses = ref<Expense[]>([]);\nconst customers = ref<Customer[]>([]);\nconst customerOptions = computed<ComboOption[]>(() => [\n  { id: 0, label: \"Alle klanten\" },\n  ...customers.value.map((customer) => ({ id: customer.id, label: customer.company || customer.contactName || `Klant ${customer.number}`, sub: customer.number })),\n]);\nconst expenseKinds = ref<string[]>([]);\nconst loading = ref(true);\nconst error = ref(\"\");\n\nconst route = useRoute();\nconst router = useRouter();\nconst restored = parseExpensesState(queryRecord(route.query));\nconst filterCustomer = ref(restored.customerId);\nconst filterYear = ref(restored.year);\nconst filterKind = ref(restored.kind);\n\nwatch([filterCustomer, filterYear, filterKind], () => {\n  const next = expensesStateToQuery({ customerId: filterCustomer.value, year: filterYear.value, kind: filterKind.value });\n  if (!sameQuery(next, queryRecord(route.query))) void router.replace({ query: next });\n});\n\nconst years = computed<number[]>(() => [...new Set(expenses.value.map((e) => e.fiscalYear))].sort((a, b) => b - a));\n\nconst kindOptions = computed(() => expenseKindOptions(expenseKinds.value));\n\nconst visibleExpenses = computed<Expense[]>(() => expenses.value.filter((expense) => {\n  if (filterCustomer.value && expense.customerId !== filterCustomer.value) return false;\n  if (filterYear.value !== \"all\" && expense.fiscalYear !== Number(filterYear.value)) return false;\n  if (filterKind.value !== \"all\" && expense.kind !== Number(filterKind.value)) return false;\n  return true;\n}));\n\nconst totalAmount = computed(() => visibleExpenses.value.reduce((sum, e) => Money.add(sum, e.amount), new Money(\"0\")));\n\nfunction kindLabel(kind: number): string {\n  return (expenseKinds.value[kind] ?? \"\").trim() || (kind === 0 ? emptyMark : `Soort ${kind}`);\n}\n\nasync function load(): Promise<void> {\n  loading.value = true;\n  error.value = \"\";\n  try {\n    const [expenseRows, customerRows, settings] = await Promise.all([\n      api.listExpenses(),\n      api.listCustomers(),\n      api.getSettings(),\n    ]);\n    expenses.value = expenseRows;\n    customers.value = customerRows;\n    expenseKinds.value = settings.expenseKinds ?? [];\n  } catch {\n    error.value = \"Kon de verschotten niet laden.\";\n  } finally {\n    loading.value = false;\n  }\n}\n\n// ── Verwijderen ─────────────────────────────────────────────────────────────\nconst deleteTarget = ref<Expense | null>(null);\nconst deleting = ref(false);\nconst deleteError = ref(\"\");\n\nfunction askDelete(expense: Expense): void {\n  deleteTarget.value = expense;\n  deleteError.value = \"\";\n}\n\nfunction closeDelete(): void {\n  if (!deleting.value) deleteTarget.value = null;\n}\n\nasync function confirmDelete(): Promise<void> {\n  if (!deleteTarget.value || deleting.value) return;\n  deleting.value = true;\n  deleteError.value = \"\";\n  try {\n    const deleted = await api.deleteExpense({ id: deleteTarget.value.id });\n    expenses.value = expenses.value.filter(expense => !deleted.includes(expense.id));\n    deleteTarget.value = null;\n  } catch (e) {\n    deleteError.value = e instanceof Error ? e.message : \"Verwijderen mislukt.\";\n  } finally {\n    deleting.value = false;\n  }\n}\n\nonMounted(() => { void load(); });\n</script>\n\n<style scoped>\n.combo { min-width: 240px; }\n.ex__filters {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 14px;\n  padding: 14px 18px;\n  margin-bottom: 14px;\n}\n.ex__f {\n  display: flex;\n  flex-direction: column;\n  gap: 4px;\n  font-size: 12.5px;\n  font-weight: 600;\n  color: var(--hh-fg-muted);\n}\n.ex__f .hh-select {\n  min-width: 160px;\n}\n.ex__total td {\n  font-weight: 700;\n  border-top: 2px solid var(--hh-line-strong);\n}\n.ex__delinfo {\n  margin: 4px 0 0;\n  padding: 10px 12px;\n  border-radius: var(--hh-radius);\n  background: var(--hh-surface-2);\n  font-size: 13px;\n  color: var(--hh-fg-muted);\n}\n.ex__transfer {\n  display: block;\n  margin-top: 3px;\n  font-size: 12px;\n  color: var(--hh-fg-muted);\n}\n</style>\n","import { createElementVNode as _createElementVNode, createTextVNode as _createTextVNode, withCtx as _withCtx, createVNode as _createVNode, toDisplayString as _toDisplayString, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, renderList as _renderList, Fragment as _Fragment, vModelSelect as _vModelSelect, withDirectives as _withDirectives, createBlock as _createBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"hh-page__bar\" }\nconst _hoisted_2 = { class: \"hh-card ex__filters\" }\nconst _hoisted_3 = { class: \"ex__f\" }\nconst _hoisted_4 = { class: \"ex__f\" }\nconst _hoisted_5 = [\"value\"]\nconst _hoisted_6 = [\"value\"]\nconst _hoisted_7 = { class: \"ex__f\" }\nconst _hoisted_8 = [\"value\"]\nconst _hoisted_9 = {\n  key: 0,\n  class: \"hh-formerror\"\n}\nconst _hoisted_10 = { class: \"hh-card\" }\nconst _hoisted_11 = {\n  key: 0,\n  class: \"hh-empty\"\n}\nconst _hoisted_12 = {\n  key: 1,\n  class: \"hh-empty\"\n}\nconst _hoisted_13 = {\n  key: 2,\n  class: \"hh-table\"\n}\nconst _hoisted_14 = { class: \"hh-table__code\" }\nconst _hoisted_15 = { class: \"hh-muted\" }\nconst _hoisted_16 = {\n  key: 0,\n  class: \"ex__transfer\"\n}\nconst _hoisted_17 = { class: \"hh-table__num\" }\nconst _hoisted_18 = [\"onClick\"]\nconst _hoisted_19 = { class: \"ex__total\" }\nconst _hoisted_20 = { colspan: \"5\" }\nconst _hoisted_21 = { class: \"hh-table__num\" }\nconst _hoisted_22 = { key: 0 }\nconst _hoisted_23 = { key: 1 }\nconst _hoisted_24 = { class: \"ex__delinfo\" }\nconst _hoisted_25 = { key: 0 }\nconst _hoisted_26 = {\n  key: 2,\n  class: \"hh-formerror\"\n}\nconst _hoisted_27 = [\"disabled\"]\nconst _hoisted_28 = [\"disabled\"]\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return (_openBlock(), _createElementBlock(\"section\", null, [\n    _createElementVNode(\"div\", _hoisted_1, [\n      _cache[4] || (_cache[4] = _createElementVNode(\"div\", null, [\n        _createElementVNode(\"h1\", { class: \"hh-page__title\" }, \"Verschotten\"),\n        _createElementVNode(\"p\", { class: \"hh-page__sub\" }, \"Doorbelaste onkosten en voorschotten per klant.\")\n      ], -1 /* CACHED */)),\n      _createVNode($setup[\"RouterLink\"], {\n        class: \"hh-btn hh-btn--primary\",\n        to: { name: 'verschotten-invoeren' }\n      }, {\n        default: _withCtx(() => _cache[3] || (_cache[3] = [\n          _createTextVNode(\"+ Verschotten invoeren\", -1 /* CACHED */)\n        ])),\n        _: 1 /* STABLE */,\n        __: [3]\n      })\n    ]),\n    _createElementVNode(\"div\", _hoisted_2, [\n      _createElementVNode(\"label\", _hoisted_3, [\n        _cache[5] || (_cache[5] = _createTextVNode(\"Klant \", -1 /* CACHED */)),\n        _createVNode($setup[\"Combobox\"], {\n          \"model-value\": $setup.filterCustomer,\n          options: $setup.customerOptions,\n          \"aria-label\": \"Klant\",\n          placeholder: \"Nummer of naam…\",\n          \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => ($setup.filterCustomer = $event ?? 0))\n        }, null, 8 /* PROPS */, [\"model-value\", \"options\"])\n      ]),\n      _createElementVNode(\"label\", _hoisted_4, [\n        _cache[7] || (_cache[7] = _createTextVNode(\"Jaar \", -1 /* CACHED */)),\n        _withDirectives(_createElementVNode(\"select\", {\n          \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => (($setup.filterYear) = $event)),\n          class: \"hh-select\"\n        }, [\n          _cache[6] || (_cache[6] = _createElementVNode(\"option\", { value: \"all\" }, \"Alle jaren\", -1 /* CACHED */)),\n          ($setup.filterYear !== 'all' && !$setup.years.includes(Number($setup.filterYear)))\n            ? (_openBlock(), _createElementBlock(\"option\", {\n                key: 0,\n                value: $setup.filterYear\n              }, _toDisplayString($setup.filterYear), 9 /* TEXT, PROPS */, _hoisted_5))\n            : _createCommentVNode(\"v-if\", true),\n          (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.years, (year) => {\n            return (_openBlock(), _createElementBlock(\"option\", {\n              key: year,\n              value: String(year)\n            }, _toDisplayString(year), 9 /* TEXT, PROPS */, _hoisted_6))\n          }), 128 /* KEYED_FRAGMENT */))\n        ], 512 /* NEED_PATCH */), [\n          [_vModelSelect, $setup.filterYear]\n        ])\n      ]),\n      _createElementVNode(\"label\", _hoisted_7, [\n        _cache[9] || (_cache[9] = _createTextVNode(\"Soort \", -1 /* CACHED */)),\n        _withDirectives(_createElementVNode(\"select\", {\n          \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => (($setup.filterKind) = $event)),\n          class: \"hh-select\"\n        }, [\n          _cache[8] || (_cache[8] = _createElementVNode(\"option\", { value: \"all\" }, \"Alle soorten\", -1 /* CACHED */)),\n          (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.kindOptions, (opt) => {\n            return (_openBlock(), _createElementBlock(\"option\", {\n              key: opt.value,\n              value: String(opt.value)\n            }, _toDisplayString(opt.label), 9 /* TEXT, PROPS */, _hoisted_8))\n          }), 128 /* KEYED_FRAGMENT */))\n        ], 512 /* NEED_PATCH */), [\n          [_vModelSelect, $setup.filterKind]\n        ])\n      ])\n    ]),\n    ($setup.error)\n      ? (_openBlock(), _createElementBlock(\"p\", _hoisted_9, _toDisplayString($setup.error), 1 /* TEXT */))\n      : _createCommentVNode(\"v-if\", true),\n    _createElementVNode(\"div\", _hoisted_10, [\n      ($setup.loading)\n        ? (_openBlock(), _createElementBlock(\"div\", _hoisted_11, \"Laden…\"))\n        : ($setup.visibleExpenses.length === 0)\n          ? (_openBlock(), _createElementBlock(\"p\", _hoisted_12, \"Geen verschotten voor deze selectie.\"))\n          : (_openBlock(), _createElementBlock(\"table\", _hoisted_13, [\n              _cache[11] || (_cache[11] = _createElementVNode(\"thead\", null, [\n                _createElementVNode(\"tr\", null, [\n                  _createElementVNode(\"th\", { style: {\"width\":\"100px\"} }, \"Datum\"),\n                  _createElementVNode(\"th\", { style: {\"width\":\"85px\"} }, \"Boekjaar\"),\n                  _createElementVNode(\"th\", null, \"Klant\"),\n                  _createElementVNode(\"th\", { style: {\"width\":\"130px\"} }, \"Soort\"),\n                  _createElementVNode(\"th\", null, \"Omschrijving\"),\n                  _createElementVNode(\"th\", {\n                    class: \"hh-table__num\",\n                    style: {\"width\":\"110px\"}\n                  }, \"Bedrag\"),\n                  _createElementVNode(\"th\", { style: {\"width\":\"90px\"} })\n                ])\n              ], -1 /* CACHED */)),\n              _createElementVNode(\"tbody\", null, [\n                (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.visibleExpenses, (expense) => {\n                  return (_openBlock(), _createElementBlock(\"tr\", {\n                    key: expense.id\n                  }, [\n                    _createElementVNode(\"td\", null, _toDisplayString($setup.formatDate(expense.date)), 1 /* TEXT */),\n                    _createElementVNode(\"td\", _hoisted_14, _toDisplayString(expense.fiscalYear), 1 /* TEXT */),\n                    _createElementVNode(\"td\", null, _toDisplayString(expense.customerTitle), 1 /* TEXT */),\n                    _createElementVNode(\"td\", _hoisted_15, _toDisplayString($setup.kindLabel(expense.kind)), 1 /* TEXT */),\n                    _createElementVNode(\"td\", null, [\n                      _createTextVNode(_toDisplayString(expense.description || $setup.emptyMark), 1 /* TEXT */),\n                      (expense.transferPartnerId)\n                        ? (_openBlock(), _createElementBlock(\"span\", _hoisted_16, _toDisplayString($setup.expenseTransferLabel(expense)), 1 /* TEXT */))\n                        : _createCommentVNode(\"v-if\", true)\n                    ]),\n                    _createElementVNode(\"td\", _hoisted_17, _toDisplayString($setup.formatEuro(expense.amount)), 1 /* TEXT */),\n                    _createElementVNode(\"td\", null, [\n                      _createElementVNode(\"button\", {\n                        class: \"hh-btn hh-btn--small hh-btn--danger\",\n                        type: \"button\",\n                        onClick: $event => ($setup.askDelete(expense))\n                      }, \"Verwijder\", 8 /* PROPS */, _hoisted_18)\n                    ])\n                  ]))\n                }), 128 /* KEYED_FRAGMENT */))\n              ]),\n              _createElementVNode(\"tfoot\", null, [\n                _createElementVNode(\"tr\", _hoisted_19, [\n                  _createElementVNode(\"td\", _hoisted_20, \"Totaal (\" + _toDisplayString($setup.visibleExpenses.length) + \" verschotten)\", 1 /* TEXT */),\n                  _createElementVNode(\"td\", _hoisted_21, _toDisplayString($setup.formatEuro($setup.totalAmount)), 1 /* TEXT */),\n                  _cache[10] || (_cache[10] = _createElementVNode(\"td\", null, null, -1 /* CACHED */))\n                ])\n              ])\n            ]))\n    ]),\n    ($setup.deleteTarget)\n      ? (_openBlock(), _createBlock($setup[\"AppDialog\"], {\n          key: 1,\n          title: $setup.deleteTarget.transferPartnerId ? 'Journaalboeking verwijderen' : 'Verschot verwijderen',\n          onClose: $setup.closeDelete\n        }, {\n          footer: _withCtx(() => [\n            _createElementVNode(\"button\", {\n              class: \"hh-btn\",\n              type: \"button\",\n              \"data-autofocus\": \"\",\n              disabled: $setup.deleting,\n              onClick: $setup.closeDelete\n            }, \"Annuleren\", 8 /* PROPS */, _hoisted_27),\n            _createElementVNode(\"button\", {\n              class: \"hh-btn hh-btn--danger\",\n              type: \"button\",\n              disabled: $setup.deleting,\n              onClick: $setup.confirmDelete\n            }, _toDisplayString($setup.deleting ? \"Verwijderen…\" : \"Verwijderen\"), 9 /* TEXT, PROPS */, _hoisted_28)\n          ]),\n          default: _withCtx(() => [\n            ($setup.deleteTarget.transferPartnerId)\n              ? (_openBlock(), _createElementBlock(\"p\", _hoisted_22, \"Deze journaalboeking wordt in beide boekjaren (\" + _toDisplayString($setup.deleteTarget.fiscalYear) + \" en \" + _toDisplayString($setup.deleteTarget.transferYear) + \") verwijderd. Wil je doorgaan?\", 1 /* TEXT */))\n              : (_openBlock(), _createElementBlock(\"p\", _hoisted_23, \"Weet je zeker dat je dit verschot wilt verwijderen?\")),\n            _createElementVNode(\"p\", _hoisted_24, [\n              _createTextVNode(_toDisplayString($setup.formatDate($setup.deleteTarget.date)) + \" · \" + _toDisplayString($setup.deleteTarget.customerTitle) + \" · Boekjaar \" + _toDisplayString($setup.deleteTarget.fiscalYear) + \" · \" + _toDisplayString($setup.formatEuro($setup.deleteTarget.amount)) + \" \", 1 /* TEXT */),\n              ($setup.deleteTarget.description)\n                ? (_openBlock(), _createElementBlock(\"span\", _hoisted_25, [\n                    _cache[12] || (_cache[12] = _createElementVNode(\"br\", null, null, -1 /* CACHED */)),\n                    _createTextVNode(_toDisplayString($setup.deleteTarget.description), 1 /* TEXT */)\n                  ]))\n                : _createCommentVNode(\"v-if\", true)\n            ]),\n            ($setup.deleteError)\n              ? (_openBlock(), _createElementBlock(\"p\", _hoisted_26, _toDisplayString($setup.deleteError), 1 /* TEXT */))\n              : _createCommentVNode(\"v-if\", true)\n          ]),\n          _: 1 /* STABLE */\n        }, 8 /* PROPS */, [\"title\"]))\n      : _createCommentVNode(\"v-if\", true)\n  ]))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/ExpensesView.vue?type=script\";import \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/ExpensesView.vue?type=style&index=0\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/ExpensesView.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/ExpensesView.vue\";script.__scopeId = \"data-v-68e7ad6f\";export default script;","<template>\n  <section class=\"ee\">\n    <div class=\"hh-page__bar\">\n      <div>\n        <h1 class=\"hh-page__title\">Verschotten invoeren</h1>\n        <p class=\"hh-page__sub\">Enter springt naar het volgende veld; op de laatste kolom begint een nieuwe regel. <kbd>Esc</kbd> wist de invoer of gaat terug.</p>\n      </div>\n    </div>\n\n    <p v-if=\"loadError\" class=\"hh-formerror\">{{ loadError }}</p>\n    <p v-if=\"!loadError && kindOptions.length === 0\" class=\"hh-formerror\">Voeg eerst een verschotsoort toe bij Instellingen.</p>\n    <p v-if=\"notice\" class=\"ee__notice\">{{ notice }}</p>\n    <RouterLink v-if=\"notice\" class=\"ee__booked\" :to=\"{ name: 'verschotten' }\">Bekijk geboekte verschotten</RouterLink>\n\n    <!-- Kop: datum / boekjaar -->\n    <div class=\"hh-card ee__head\">\n      <div class=\"ee__hlabel\">\n        <label for=\"ee-date\">Datum</label>\n        <DateInput id=\"ee-date\" ref=\"dateInput\" v-model=\"date\" :disabled=\"saving\" />\n      </div>\n      <p class=\"ee__datehint\">Het boekjaar kies je per regel, los van deze datum.</p>\n    </div>\n\n    <!-- Regels -->\n    <div class=\"hh-card ee__gridwrap\">\n      <table class=\"eg\">\n        <thead>\n          <tr>\n            <th style=\"width: 28%\">Klant</th>\n            <th style=\"width: 18%\">Soort</th>\n            <th style=\"width: 90px\">Boekjaar</th>\n            <th>Omschrijving</th>\n            <th style=\"width: 120px\">Bedrag (€)</th>\n            <th style=\"width: 34px\"></th>\n          </tr>\n        </thead>\n        <tbody>\n          <template v-for=\"(row, index) in rows\" :key=\"row.key\">\n          <tr :class=\"{ 'eg__row--error': rowErrors[index] }\">\n            <td>\n              <Combobox\n                v-model=\"row.customerId\"\n                :options=\"customerOptions\"\n                :data-row=\"index\"\n                :data-col=\"0\"\n                :error=\"Boolean(rowErrors[index]?.customer)\"\n                :disabled=\"saving\"\n                :aria-label=\"`Klant regel ${index + 1}`\"\n                placeholder=\"Nummer of naam…\"\n                @commit=\"advance(index, 0)\"\n              />\n            </td>\n            <td>\n              <select\n                v-model.number=\"row.kind\"\n                class=\"hh-select\"\n                :class=\"{ 'hh-input--error': rowErrors[index]?.kind }\"\n                :aria-invalid=\"Boolean(rowErrors[index]?.kind)\"\n                :aria-label=\"`Soort regel ${index + 1}`\"\n                :disabled=\"saving\"\n                :data-row=\"index\"\n                :data-col=\"1\"\n                @keydown.enter.prevent=\"advance(index, 1)\"\n              >\n                <option :value=\"null\" disabled>Kies een soort</option>\n                <option v-for=\"opt in kindOptions\" :key=\"opt.value\" :value=\"opt.value\">{{ opt.label }}</option>\n              </select>\n            </td>\n            <td>\n              <input v-model=\"row.year\" class=\"hh-input hh-input--mono eg__year\" inputmode=\"numeric\" maxlength=\"4\"\n                :class=\"{ 'hh-input--error': rowErrors[index]?.year }\" :aria-invalid=\"Boolean(rowErrors[index]?.year)\"\n                :aria-label=\"`Boekjaar regel ${index + 1}`\" :disabled=\"saving\" :data-row=\"index\" :data-col=\"2\"\n                @focus=\"selectYear\" @click=\"selectYear\" @blur=\"normalizeYear(row)\" @keydown.enter.prevent=\"advance(index, 2)\" />\n            </td>\n            <td>\n              <input\n                v-model=\"row.description\"\n                class=\"hh-input\"\n                :data-row=\"index\"\n                :data-col=\"3\"\n                :aria-label=\"`Omschrijving regel ${index + 1}`\"\n                :disabled=\"saving\"\n                placeholder=\"Optioneel\"\n                @keydown.enter.prevent=\"advance(index, 3)\"\n              />\n            </td>\n            <td>\n              <input\n                v-model=\"row.amount\"\n                class=\"hh-input hh-input--num\"\n                :class=\"{ 'hh-input--error': rowErrors[index]?.amount }\"\n                :data-row=\"index\"\n                :data-col=\"4\"\n                :aria-label=\"`Bedrag regel ${index + 1}`\"\n                :aria-invalid=\"Boolean(rowErrors[index]?.amount)\"\n                :disabled=\"saving\"\n                inputmode=\"decimal\"\n                placeholder=\"0,00\"\n                @input=\"onAmountInput(row)\"\n                @keydown.enter.prevent=\"advance(index, 4)\"\n              />\n            </td>\n            <td>\n              <button class=\"eg__del\" type=\"button\" tabindex=\"-1\" title=\"Regel verwijderen\" :disabled=\"saving || rows.length === 1\" @click=\"removeRow(index)\">×</button>\n            </td>\n          </tr>\n          <tr v-if=\"isNegative(row)\" class=\"eg__journal\">\n            <td colspan=\"6\">\n              <div class=\"ee__journal\">\n                <label class=\"ee__check\">\n                  <input v-model=\"row.transfer\" type=\"checkbox\" :disabled=\"saving\" :data-row=\"index\" :data-col=\"5\"\n                    :aria-label=\"`Journaalboeking regel ${index + 1}`\" @change=\"enableTransfer(index)\" @keydown.enter.prevent=\"advance(index, 5)\" />\n                  Journaalboeking\n                </label>\n                <template v-if=\"row.transfer\">\n                  <label class=\"ee__target\">Naar boekjaar\n                    <input v-model=\"row.targetYear\" class=\"hh-input hh-input--mono eg__year\" inputmode=\"numeric\" maxlength=\"4\"\n                      :class=\"{ 'hh-input--error': rowErrors[index]?.targetYear }\" :aria-invalid=\"Boolean(rowErrors[index]?.targetYear)\"\n                      :aria-label=\"`Doelboekjaar regel ${index + 1}`\" :disabled=\"saving\" :data-row=\"index\" :data-col=\"6\"\n                      @focus=\"selectYear\" @click=\"selectYear\" @blur=\"normalizeTargetYear(row)\" @keydown.enter.prevent=\"advance(index, 6)\" />\n                  </label>\n                  <span v-if=\"transferTarget(row)\" class=\"ee__journaltext\">{{ formatEuro(Money.multiply(parseAmount(row.amount)!, \"-1\")) }} wordt ook geboekt in {{ transferTarget(row) }}.</span>\n                  <span v-else class=\"hh-formerror ee__journaltext\">Kies een geldig, ander boekjaar (1900 t/m 2100).</span>\n                </template>\n              </div>\n            </td>\n          </tr>\n          </template>\n        </tbody>\n        <tfoot>\n          <tr>\n            <td colspan=\"4\" class=\"eg__foot\">Invoer ({{ filledRows.length }} regel(s))</td>\n            <td class=\"hh-table__num eg__foot\">{{ formatEuro(totalAmount) }}</td>\n            <td></td>\n          </tr>\n        </tfoot>\n      </table>\n      <div v-if=\"yearTotals.length\" class=\"ee__totals\" aria-live=\"polite\">\n        <span v-for=\"total in yearTotals\" :key=\"total.year\">Boekjaar {{ total.year }}: <strong>{{ formatEuro(total.amount) }}</strong></span>\n      </div>\n    </div>\n\n    <div class=\"ee__actions\">\n      <button class=\"hh-btn\" type=\"button\" :disabled=\"saving\" @click=\"addRowFromButton\">+ Regel</button>\n      <button class=\"hh-btn hh-btn--primary\" type=\"button\" :disabled=\"saving\" @click=\"onVerwerkClick\">\n        {{ saving ? \"Verwerken…\" : \"Verwerk verschotten\" }}\n      </button>\n      <button class=\"hh-btn hh-btn--danger\" type=\"button\" :disabled=\"saving\" @click=\"clearConfirmOpen = true\">Alle invoer wissen</button>\n    </div>\n\n    <p v-if=\"submitError\" class=\"hh-formerror ee__submiterror\">{{ submitError }}</p>\n\n    <!-- Esc: wissen of terug. -->\n    <AppDialog v-if=\"escDialogOpen\" title=\"Verschotten invoeren\" @close=\"escDialogOpen = false\">\n      <p>Wat wil je met de ingevoerde verschotten doen?</p>\n      <template #footer>\n        <button class=\"hh-btn hh-btn--danger\" type=\"button\" @click=\"clearAll\">Wissen alle invoer</button>\n        <button class=\"hh-btn\" type=\"button\" data-autofocus @click=\"escDialogOpen = false\">Terug naar invoer</button>\n      </template>\n    </AppDialog>\n\n    <!-- Bevestiging bij het wissen van alle invoer. -->\n    <AppDialog v-if=\"clearConfirmOpen\" title=\"Alle invoer wissen?\" @close=\"clearConfirmOpen = false\">\n      <p>Weet je zeker dat je alle ingevoerde regels wilt wissen?</p>\n      <template #footer>\n        <button class=\"hh-btn\" type=\"button\" data-autofocus @click=\"clearConfirmOpen = false\">Annuleren</button>\n        <button class=\"hh-btn hh-btn--danger\" type=\"button\" @click=\"clearAll\">Wissen</button>\n      </template>\n    </AppDialog>\n\n    <!-- Bevestiging bij verwerken (tegen per ongeluk submitten). -->\n    <AppDialog v-if=\"verwerkDialogOpen\" title=\"Verschotten verwerken?\" @close=\"verwerkDialogOpen = false\">\n      <p>Weet je zeker dat je {{ filledRows.length }} verschot(ten) wilt verwerken?</p>\n      <p v-if=\"transferCount\">{{ transferCount }} journaalboeking(en) maken elk ook een positieve tegenboeking in het gekozen doelboekjaar.</p>\n      <p v-for=\"total in yearTotals\" :key=\"total.year\">Boekjaar {{ total.year }}: <strong>{{ formatEuro(total.amount) }}</strong></p>\n      <template #footer>\n        <label class=\"ee__remember\">\n          <input type=\"checkbox\" v-model=\"rememberChoice\" />\n          Onthoud mijn keuze\n        </label>\n        <button class=\"hh-btn\" type=\"button\" @click=\"verwerkDialogOpen = false\">Terug</button>\n        <button class=\"hh-btn hh-btn--primary\" type=\"button\" data-autofocus @click=\"verwerkConfirmed\">Verwerken</button>\n      </template>\n    </AppDialog>\n  </section>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, nextTick, onBeforeUnmount, onMounted, reactive, ref } from \"vue\";\nimport { Money } from \"@webhare/std\";\nimport { defaultExpenseKind, expenseKindOptions } from \"../lib/expenseKinds\";\nimport { useOrganizationDirty } from \"../lib/organization\";\nimport { useApi } from \"../lib/api\";\nimport { formatEuro } from \"../lib/format\";\nimport { expandFiscalYear, fiscalYearOf, todayISODate } from \"../lib/dates\";\nimport { parseAmount } from \"../lib/invoicing\";\nimport { isPreferenceSet, setPreference } from \"../lib/preferences\";\nimport Combobox, { type ComboOption } from \"../components/Combobox.vue\";\nimport AppDialog from \"../components/AppDialog.vue\";\nimport DateInput from \"../components/DateInput.vue\";\n\nconst api = useApi();\n\ntype Customer = Awaited<ReturnType<typeof api.listCustomers>>[number];\n\ninterface GridRow {\n  key: number;\n  customerId: number | null;\n  year: string;\n  kind: number | null;\n  description: string;\n  amount: string;\n  transfer: boolean;\n  targetYear: string;\n}\ninterface RowError {\n  customer?: boolean;\n  amount?: boolean;\n  kind?: boolean;\n  year?: boolean;\n  targetYear?: boolean;\n}\n\nconst customers = ref<Customer[]>([]);\nconst expenseKinds = ref<string[]>([]);\nconst loadError = ref(\"\");\nconst notice = ref(\"\");\nconst userEmail = ref(\"\");\n\nconst date = ref(todayISODate());\nconst dateInput = ref<InstanceType<typeof DateInput> | null>(null);\n\nlet nextKey = 1;\nfunction blankRow(): GridRow {\n  return { key: nextKey++, customerId: null, year: String(fiscalYearOf(date.value) || new Date().getFullYear()), kind: defaultExpenseKind(expenseKinds.value), description: \"\", amount: \"\", transfer: false, targetYear: \"\" };\n}\nconst rows = reactive<GridRow[]>([blankRow()]);\nconst rowErrors = reactive<Record<number, RowError | undefined>>({});\n\nconst saving = ref(false);\nconst submitError = ref(\"\");\nconst escDialogOpen = ref(false);\nconst verwerkDialogOpen = ref(false);\nconst clearConfirmOpen = ref(false);\nconst rememberChoice = ref(false);\n\nconst customerOptions = computed<ComboOption[]>(() => customers.value.map((c) => ({\n  id: c.id,\n  label: c.company || c.contactName || `Klant ${c.number}`,\n  sub: c.number,\n})));\n\nconst kindOptions = computed(() => expenseKindOptions(expenseKinds.value));\n\nconst filledRows = computed(() => rows.filter(isFilled));\nuseOrganizationDirty(() => filledRows.value.length > 0);\nconst totalAmount = computed(() => filledRows.value.reduce((sum, row) => Money.add(sum, parseAmount(row.amount) ?? \"0\"), new Money(\"0\")));\nconst transferCount = computed(() => filledRows.value.filter(row => row.transfer).length);\nconst yearTotals = computed(() => {\n  const totals = new Map<number, Money>();\n  for (const row of filledRows.value) {\n    const amount = parseAmount(row.amount);\n    const year = expandFiscalYear(row.year);\n    if (!amount || !year) continue;\n    totals.set(year, Money.add(totals.get(year) ?? \"0\", amount));\n    const target = row.transfer ? transferTarget(row) : 0;\n    if (target) totals.set(target, Money.subtract(totals.get(target) ?? \"0\", amount));\n  }\n  return [...totals].sort(([a], [b]) => a - b).map(([year, amount]) => ({ year, amount }));\n});\n\nfunction isFilled(row: GridRow): boolean {\n  return row.customerId !== null || row.amount.trim() !== \"\" || row.description.trim() !== \"\";\n}\n\nfunction addRow(source?: GridRow): GridRow {\n  const row = blankRow();\n  if (source) {\n    row.year = source.year;\n    row.kind = source.kind;\n  }\n  rows.push(row);\n  return row;\n}\n\nfunction addRowFromButton(): void {\n  addRow(rows[rows.length - 1]);\n  focusCell(rows.length - 1, 0);\n}\n\nfunction removeRow(index: number): void {\n  if (rows.length === 1) return;\n  rows.splice(index, 1);\n  // Row errors use indices, so structural changes invalidate all of them.\n  for (const key of Object.keys(rowErrors)) delete rowErrors[Number(key)];\n}\n\nfunction selectYear(event: Event): void {\n  if (event.target instanceof HTMLInputElement) event.target.select();\n}\n\nfunction normalizeYear(row: GridRow): void {\n  const year = expandFiscalYear(row.year);\n  if (year) row.year = String(year);\n}\n\nfunction normalizeTargetYear(row: GridRow): void {\n  const year = expandFiscalYear(row.targetYear);\n  if (year) row.targetYear = String(year);\n}\n\nfunction isNegative(row: GridRow): boolean {\n  const amount = parseAmount(row.amount);\n  return amount !== null && Money.check(amount, \"<\", \"0\");\n}\n\nfunction onAmountInput(row: GridRow): void {\n  // A hidden transfer option must never create a counterpart for a positive correction.\n  if (!isNegative(row)) row.transfer = false;\n}\n\nfunction transferTarget(row: GridRow): number {\n  const year = expandFiscalYear(row.targetYear);\n  return isNegative(row) && year !== expandFiscalYear(row.year) ? year : 0;\n}\n\nfunction enableTransfer(index: number): void {\n  const row = rows[index];\n  if (!row.transfer) return;\n  const source = expandFiscalYear(row.year);\n  if (!row.targetYear && source < 2100) row.targetYear = String(source + 1);\n  focusCell(index, 6);\n}\n\nfunction focusCell(row: number, col: number): void {\n  void nextTick(() => {\n    const el = document.querySelector<HTMLElement>(`.eg [data-row=\"${row}\"][data-col=\"${col}\"]`);\n    el?.focus();\n    if (el instanceof HTMLInputElement) el.select();\n  });\n}\n\nfunction advance(row: number, col: number): void {\n  const lastColumn = isNegative(rows[row]) ? rows[row].transfer ? 6 : 5 : 4;\n  if (col < lastColumn) {\n    focusCell(row, col + 1);\n    return;\n  }\n  if (row === rows.length - 1) addRow(rows[row]);\n  focusCell(row + 1, 0);\n}\n\nfunction validate(): boolean {\n  for (const key of Object.keys(rowErrors)) delete rowErrors[Number(key)];\n  submitError.value = \"\";\n\n  if (dateInput.value && !dateInput.value.validate()) {\n    dateInput.value.focus();\n    return false;\n  }\n\n  if (!fiscalYearOf(date.value)) {\n    submitError.value = \"Vul een geldige datum in.\";\n    return false;\n  }\n\n  if (filledRows.value.length === 0) {\n    submitError.value = \"Voer minimaal één regel in.\";\n    return false;\n  }\n\n  let firstBad: number | null = null;\n  let firstBadCol = 0;\n  const errorColumns: Record<keyof RowError, number> = { customer: 0, kind: 1, year: 2, amount: 4, targetYear: 6 };\n  rows.forEach((row, index) => {\n    if (!isFilled(row)) return;\n    const error: RowError = {};\n    if (row.customerId === null) error.customer = true;\n    if (!kindOptions.value.some((kind) => kind.value === row.kind)) error.kind = true;\n    if (!expandFiscalYear(row.year)) error.year = true;\n    if (parseAmount(row.amount) === null) error.amount = true;\n    if (row.transfer && !transferTarget(row)) error.targetYear = true;\n    if (Object.keys(error).length > 0) {\n      rowErrors[index] = error;\n      if (firstBad === null) {\n        firstBad = index;\n        firstBadCol = Math.min(...(Object.keys(error) as (keyof RowError)[]).map(field => errorColumns[field]));\n      }\n    }\n  });\n\n  if (firstBad !== null) {\n    submitError.value = \"Sommige regels zijn onvolledig. Controleer de gemarkeerde velden.\";\n    focusCell(firstBad, firstBadCol);\n    return false;\n  }\n  return true;\n}\n\nfunction onVerwerkClick(): void {\n  if (saving.value) return;\n  if (!validate()) return;\n  if (userEmail.value && isPreferenceSet(userEmail.value, \"skipExpenseVerwerkConfirm\")) {\n    void doVerwerk();\n  } else {\n    rememberChoice.value = false;   // schone start per keer dat de dialoog opent\n    verwerkDialogOpen.value = true;\n  }\n}\n\nfunction verwerkConfirmed(): void {\n  // Aangevinkt \"Onthoud mijn keuze\" -> voortaan direct verwerken zonder dialoog.\n  if (rememberChoice.value && userEmail.value) setPreference(userEmail.value, \"skipExpenseVerwerkConfirm\");\n  verwerkDialogOpen.value = false;\n  void doVerwerk();\n}\n\nasync function doVerwerk(): Promise<void> {\n  if (saving.value || !validate()) return;\n  saving.value = true;\n  submitError.value = \"\";\n  let done = 0;\n  const bookedKeys = new Set<number>();\n  // Freeze payloads before awaiting RPCs; no later edit may change the batch halfway through.\n  const pending = filledRows.value.map(row => ({ key: row.key, payload: {\n    customerId: row.customerId as number,\n    fiscalYear: expandFiscalYear(row.year),\n    date: date.value,\n    kind: row.kind as number,\n    description: row.description.trim(),\n    amount: String(parseAmount(row.amount)),\n    transferToYear: row.transfer ? transferTarget(row) : undefined,\n  } }));\n  try {\n    for (const row of pending) {\n      await api.createExpense(row.payload);\n      bookedKeys.add(row.key);\n      done += row.payload.transferToYear !== undefined ? 2 : 1;\n    }\n    notice.value = `${done} verschot(ten) geboekt.`;\n    resetRows();\n  } catch (e) {\n    // Successfully booked rows must not be submitted again after another row fails.\n    if (bookedKeys.size) rows.splice(0, rows.length, ...rows.filter(row => !bookedKeys.has(row.key)));\n    for (const key of Object.keys(rowErrors)) delete rowErrors[Number(key)];\n    const base = e instanceof Error ? e.message : \"Verwerken mislukt.\";\n    submitError.value = done > 0 ? `${base} (${done} al geboekt)` : base;\n  } finally {\n    saving.value = false;\n  }\n}\n\nfunction resetRows(): void {\n  rows.splice(0, rows.length, blankRow());\n  for (const key of Object.keys(rowErrors)) delete rowErrors[Number(key)];\n}\n\nfunction clearAll(): void {\n  resetRows();\n  escDialogOpen.value = false;\n  clearConfirmOpen.value = false;\n  submitError.value = \"\";\n  notice.value = \"\";\n}\n\nfunction onGlobalKeydown(event: KeyboardEvent): void {\n  if (saving.value) return;\n  const dialogOpen = escDialogOpen.value || verwerkDialogOpen.value || clearConfirmOpen.value;\n  if (event.key === \"Escape\" && !dialogOpen) {\n    event.preventDefault();\n    escDialogOpen.value = true;\n  }\n}\n\nasync function load(): Promise<void> {\n  try {\n    const [me, customerRows, settings] = await Promise.all([api.me(), api.listCustomers(), api.getSettings()]);\n    userEmail.value = me.email;\n    customers.value = customerRows;\n    expenseKinds.value = settings.expenseKinds ?? [];\n    for (const row of rows) if (row.kind === null) row.kind = defaultExpenseKind(expenseKinds.value);\n  } catch {\n    loadError.value = \"Kon klanten of instellingen niet laden.\";\n  }\n}\n\nonMounted(() => {\n  void load();\n  window.addEventListener(\"keydown\", onGlobalKeydown);\n});\nonBeforeUnmount(() => window.removeEventListener(\"keydown\", onGlobalKeydown));\n</script>\n\n<style scoped>\n.ee__notice {\n  margin: 0 0 12px;\n  padding: 9px 12px;\n  border: 1px solid rgba(37, 122, 62, 0.5);\n  border-radius: var(--hh-radius);\n  background: var(--hh-accent-soft);\n  color: var(--hh-accent-strong);\n  font-size: 13px;\n}\n.ee__head {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 16px;\n  padding: 14px 18px;\n  margin-bottom: 14px;\n}\n.ee__hlabel {\n  width: 170px;\n  display: flex;\n  flex-direction: column;\n  gap: 4px;\n  font-size: 12.5px;\n  font-weight: 600;\n  color: var(--hh-fg-muted);\n}\n.ee__hlabel .hh-input {\n  min-width: 150px;\n}\n.ee__datehint {\n  margin: 0;\n  align-self: center;\n  color: var(--hh-fg-muted);\n  font-size: 13px;\n}\n.ee__booked {\n  display: inline-block;\n  margin-bottom: 14px;\n  color: var(--hh-accent-strong);\n}\n.ee__gridwrap {\n  padding: 4px;\n  overflow: auto;\n}\n.eg {\n  width: 100%;\n  min-width: 720px;\n  border-collapse: collapse;\n}\n.eg thead th {\n  padding: 8px 8px;\n  text-align: left;\n  font-size: 11.5px;\n  font-weight: 600;\n  letter-spacing: 0.03em;\n  text-transform: uppercase;\n  color: var(--hh-fg-muted);\n}\n.eg tbody td {\n  padding: 4px 6px;\n  vertical-align: top;\n}\n.eg__year { width: 78px; }\n.ee__journal {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  gap: 12px;\n  padding: 6px 8px 10px;\n  font-size: 13px;\n}\n.ee__check,\n.ee__target {\n  display: inline-flex;\n  align-items: center;\n  gap: 6px;\n}\n.ee__check { cursor: pointer; }\n.ee__journaltext { margin: 0; }\n.ee__totals {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 8px 20px;\n  padding: 10px 8px;\n  border-top: 1px solid var(--hh-line);\n  font-size: 13px;\n  color: var(--hh-fg-muted);\n}\n.eg__row--error td {\n  background: var(--hh-danger-soft);\n}\n.eg__del {\n  width: 26px;\n  height: 34px;\n  border: 0;\n  background: transparent;\n  color: var(--hh-fg-subtle);\n  font-size: 18px;\n  cursor: pointer;\n}\n.eg__del:hover:not(:disabled) {\n  color: var(--hh-danger);\n}\n.eg__del:disabled {\n  opacity: 0.3;\n  cursor: default;\n}\n.eg__foot {\n  padding: 10px 8px;\n  font-weight: 600;\n  border-top: 1px solid var(--hh-line-strong);\n}\n.ee__actions {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 8px;\n  margin-top: 14px;\n}\n.ee__submiterror {\n  margin-top: 12px;\n}\n.ee__remember {\n  margin-right: auto;\n  display: flex;\n  align-items: center;\n  gap: 6px;\n  font-size: 13px;\n  color: var(--hh-fg-muted);\n  cursor: pointer;\n}\n.ee__remember input {\n  cursor: pointer;\n}\nkbd {\n  font-family: var(--hh-mono);\n  font-size: 11px;\n  padding: 1px 5px;\n  border: 1px solid var(--hh-line-strong);\n  border-radius: 4px;\n  background: var(--hh-surface-2);\n  color: var(--hh-fg-muted);\n}\n</style>\n","import { createElementVNode as _createElementVNode, createTextVNode as _createTextVNode, toDisplayString as _toDisplayString, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, resolveComponent as _resolveComponent, withCtx as _withCtx, createBlock as _createBlock, createVNode as _createVNode, renderList as _renderList, Fragment as _Fragment, vModelSelect as _vModelSelect, withModifiers as _withModifiers, withKeys as _withKeys, normalizeClass as _normalizeClass, withDirectives as _withDirectives, vModelText as _vModelText, vModelCheckbox as _vModelCheckbox } from \"vue\"\n\nconst _hoisted_1 = { class: \"ee\" }\nconst _hoisted_2 = {\n  key: 0,\n  class: \"hh-formerror\"\n}\nconst _hoisted_3 = {\n  key: 1,\n  class: \"hh-formerror\"\n}\nconst _hoisted_4 = {\n  key: 2,\n  class: \"ee__notice\"\n}\nconst _hoisted_5 = { class: \"hh-card ee__head\" }\nconst _hoisted_6 = { class: \"ee__hlabel\" }\nconst _hoisted_7 = { class: \"hh-card ee__gridwrap\" }\nconst _hoisted_8 = { class: \"eg\" }\nconst _hoisted_9 = [\"onUpdate:modelValue\", \"aria-invalid\", \"aria-label\", \"disabled\", \"data-row\", \"onKeydown\"]\nconst _hoisted_10 = [\"value\"]\nconst _hoisted_11 = [\"onUpdate:modelValue\", \"aria-invalid\", \"aria-label\", \"disabled\", \"data-row\", \"onBlur\", \"onKeydown\"]\nconst _hoisted_12 = [\"onUpdate:modelValue\", \"data-row\", \"aria-label\", \"disabled\", \"onKeydown\"]\nconst _hoisted_13 = [\"onUpdate:modelValue\", \"data-row\", \"aria-label\", \"aria-invalid\", \"disabled\", \"onInput\", \"onKeydown\"]\nconst _hoisted_14 = [\"disabled\", \"onClick\"]\nconst _hoisted_15 = {\n  key: 0,\n  class: \"eg__journal\"\n}\nconst _hoisted_16 = { colspan: \"6\" }\nconst _hoisted_17 = { class: \"ee__journal\" }\nconst _hoisted_18 = { class: \"ee__check\" }\nconst _hoisted_19 = [\"onUpdate:modelValue\", \"disabled\", \"data-row\", \"aria-label\", \"onChange\", \"onKeydown\"]\nconst _hoisted_20 = { class: \"ee__target\" }\nconst _hoisted_21 = [\"onUpdate:modelValue\", \"aria-invalid\", \"aria-label\", \"disabled\", \"data-row\", \"onBlur\", \"onKeydown\"]\nconst _hoisted_22 = {\n  key: 0,\n  class: \"ee__journaltext\"\n}\nconst _hoisted_23 = {\n  key: 1,\n  class: \"hh-formerror ee__journaltext\"\n}\nconst _hoisted_24 = {\n  colspan: \"4\",\n  class: \"eg__foot\"\n}\nconst _hoisted_25 = { class: \"hh-table__num eg__foot\" }\nconst _hoisted_26 = {\n  key: 0,\n  class: \"ee__totals\",\n  \"aria-live\": \"polite\"\n}\nconst _hoisted_27 = { class: \"ee__actions\" }\nconst _hoisted_28 = [\"disabled\"]\nconst _hoisted_29 = [\"disabled\"]\nconst _hoisted_30 = [\"disabled\"]\nconst _hoisted_31 = {\n  key: 4,\n  class: \"hh-formerror ee__submiterror\"\n}\nconst _hoisted_32 = { key: 0 }\nconst _hoisted_33 = { class: \"ee__remember\" }\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  const _component_RouterLink = _resolveComponent(\"RouterLink\")\n\n  return (_openBlock(), _createElementBlock(\"section\", _hoisted_1, [\n    _cache[20] || (_cache[20] = _createElementVNode(\"div\", { class: \"hh-page__bar\" }, [\n      _createElementVNode(\"div\", null, [\n        _createElementVNode(\"h1\", { class: \"hh-page__title\" }, \"Verschotten invoeren\"),\n        _createElementVNode(\"p\", { class: \"hh-page__sub\" }, [\n          _createTextVNode(\"Enter springt naar het volgende veld; op de laatste kolom begint een nieuwe regel. \"),\n          _createElementVNode(\"kbd\", null, \"Esc\"),\n          _createTextVNode(\" wist de invoer of gaat terug.\")\n        ])\n      ])\n    ], -1 /* CACHED */)),\n    ($setup.loadError)\n      ? (_openBlock(), _createElementBlock(\"p\", _hoisted_2, _toDisplayString($setup.loadError), 1 /* TEXT */))\n      : _createCommentVNode(\"v-if\", true),\n    (!$setup.loadError && $setup.kindOptions.length === 0)\n      ? (_openBlock(), _createElementBlock(\"p\", _hoisted_3, \"Voeg eerst een verschotsoort toe bij Instellingen.\"))\n      : _createCommentVNode(\"v-if\", true),\n    ($setup.notice)\n      ? (_openBlock(), _createElementBlock(\"p\", _hoisted_4, _toDisplayString($setup.notice), 1 /* TEXT */))\n      : _createCommentVNode(\"v-if\", true),\n    ($setup.notice)\n      ? (_openBlock(), _createBlock(_component_RouterLink, {\n          key: 3,\n          class: \"ee__booked\",\n          to: { name: 'verschotten' }\n        }, {\n          default: _withCtx(() => _cache[9] || (_cache[9] = [\n            _createTextVNode(\"Bekijk geboekte verschotten\", -1 /* CACHED */)\n          ])),\n          _: 1 /* STABLE */,\n          __: [9]\n        }))\n      : _createCommentVNode(\"v-if\", true),\n    _createCommentVNode(\" Kop: datum / boekjaar \"),\n    _createElementVNode(\"div\", _hoisted_5, [\n      _createElementVNode(\"div\", _hoisted_6, [\n        _cache[10] || (_cache[10] = _createElementVNode(\"label\", { for: \"ee-date\" }, \"Datum\", -1 /* CACHED */)),\n        _createVNode($setup[\"DateInput\"], {\n          id: \"ee-date\",\n          ref: \"dateInput\",\n          modelValue: $setup.date,\n          \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => (($setup.date) = $event)),\n          disabled: $setup.saving\n        }, null, 8 /* PROPS */, [\"modelValue\", \"disabled\"])\n      ]),\n      _cache[11] || (_cache[11] = _createElementVNode(\"p\", { class: \"ee__datehint\" }, \"Het boekjaar kies je per regel, los van deze datum.\", -1 /* CACHED */))\n    ]),\n    _createCommentVNode(\" Regels \"),\n    _createElementVNode(\"div\", _hoisted_7, [\n      _createElementVNode(\"table\", _hoisted_8, [\n        _cache[16] || (_cache[16] = _createElementVNode(\"thead\", null, [\n          _createElementVNode(\"tr\", null, [\n            _createElementVNode(\"th\", { style: {\"width\":\"28%\"} }, \"Klant\"),\n            _createElementVNode(\"th\", { style: {\"width\":\"18%\"} }, \"Soort\"),\n            _createElementVNode(\"th\", { style: {\"width\":\"90px\"} }, \"Boekjaar\"),\n            _createElementVNode(\"th\", null, \"Omschrijving\"),\n            _createElementVNode(\"th\", { style: {\"width\":\"120px\"} }, \"Bedrag (€)\"),\n            _createElementVNode(\"th\", { style: {\"width\":\"34px\"} })\n          ])\n        ], -1 /* CACHED */)),\n        _createElementVNode(\"tbody\", null, [\n          (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.rows, (row, index) => {\n            return (_openBlock(), _createElementBlock(_Fragment, {\n              key: row.key\n            }, [\n              _createElementVNode(\"tr\", {\n                class: _normalizeClass({ 'eg__row--error': $setup.rowErrors[index] })\n              }, [\n                _createElementVNode(\"td\", null, [\n                  _createVNode($setup[\"Combobox\"], {\n                    modelValue: row.customerId,\n                    \"onUpdate:modelValue\": $event => ((row.customerId) = $event),\n                    options: $setup.customerOptions,\n                    \"data-row\": index,\n                    \"data-col\": 0,\n                    error: Boolean($setup.rowErrors[index]?.customer),\n                    disabled: $setup.saving,\n                    \"aria-label\": `Klant regel ${index + 1}`,\n                    placeholder: \"Nummer of naam…\",\n                    onCommit: $event => ($setup.advance(index, 0))\n                  }, null, 8 /* PROPS */, [\"modelValue\", \"onUpdate:modelValue\", \"options\", \"data-row\", \"error\", \"disabled\", \"aria-label\", \"onCommit\"])\n                ]),\n                _createElementVNode(\"td\", null, [\n                  _withDirectives(_createElementVNode(\"select\", {\n                    \"onUpdate:modelValue\": $event => ((row.kind) = $event),\n                    class: _normalizeClass([\"hh-select\", { 'hh-input--error': $setup.rowErrors[index]?.kind }]),\n                    \"aria-invalid\": Boolean($setup.rowErrors[index]?.kind),\n                    \"aria-label\": `Soort regel ${index + 1}`,\n                    disabled: $setup.saving,\n                    \"data-row\": index,\n                    \"data-col\": 1,\n                    onKeydown: _withKeys(_withModifiers($event => ($setup.advance(index, 1)), [\"prevent\"]), [\"enter\"])\n                  }, [\n                    _cache[12] || (_cache[12] = _createElementVNode(\"option\", {\n                      value: null,\n                      disabled: \"\"\n                    }, \"Kies een soort\", -1 /* CACHED */)),\n                    (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.kindOptions, (opt) => {\n                      return (_openBlock(), _createElementBlock(\"option\", {\n                        key: opt.value,\n                        value: opt.value\n                      }, _toDisplayString(opt.label), 9 /* TEXT, PROPS */, _hoisted_10))\n                    }), 128 /* KEYED_FRAGMENT */))\n                  ], 42 /* CLASS, PROPS, NEED_HYDRATION */, _hoisted_9), [\n                    [\n                      _vModelSelect,\n                      row.kind,\n                      void 0,\n                      { number: true }\n                    ]\n                  ])\n                ]),\n                _createElementVNode(\"td\", null, [\n                  _withDirectives(_createElementVNode(\"input\", {\n                    \"onUpdate:modelValue\": $event => ((row.year) = $event),\n                    class: _normalizeClass([\"hh-input hh-input--mono eg__year\", { 'hh-input--error': $setup.rowErrors[index]?.year }]),\n                    inputmode: \"numeric\",\n                    maxlength: \"4\",\n                    \"aria-invalid\": Boolean($setup.rowErrors[index]?.year),\n                    \"aria-label\": `Boekjaar regel ${index + 1}`,\n                    disabled: $setup.saving,\n                    \"data-row\": index,\n                    \"data-col\": 2,\n                    onFocus: $setup.selectYear,\n                    onClick: $setup.selectYear,\n                    onBlur: $event => ($setup.normalizeYear(row)),\n                    onKeydown: _withKeys(_withModifiers($event => ($setup.advance(index, 2)), [\"prevent\"]), [\"enter\"])\n                  }, null, 42 /* CLASS, PROPS, NEED_HYDRATION */, _hoisted_11), [\n                    [_vModelText, row.year]\n                  ])\n                ]),\n                _createElementVNode(\"td\", null, [\n                  _withDirectives(_createElementVNode(\"input\", {\n                    \"onUpdate:modelValue\": $event => ((row.description) = $event),\n                    class: \"hh-input\",\n                    \"data-row\": index,\n                    \"data-col\": 3,\n                    \"aria-label\": `Omschrijving regel ${index + 1}`,\n                    disabled: $setup.saving,\n                    placeholder: \"Optioneel\",\n                    onKeydown: _withKeys(_withModifiers($event => ($setup.advance(index, 3)), [\"prevent\"]), [\"enter\"])\n                  }, null, 40 /* PROPS, NEED_HYDRATION */, _hoisted_12), [\n                    [_vModelText, row.description]\n                  ])\n                ]),\n                _createElementVNode(\"td\", null, [\n                  _withDirectives(_createElementVNode(\"input\", {\n                    \"onUpdate:modelValue\": $event => ((row.amount) = $event),\n                    class: _normalizeClass([\"hh-input hh-input--num\", { 'hh-input--error': $setup.rowErrors[index]?.amount }]),\n                    \"data-row\": index,\n                    \"data-col\": 4,\n                    \"aria-label\": `Bedrag regel ${index + 1}`,\n                    \"aria-invalid\": Boolean($setup.rowErrors[index]?.amount),\n                    disabled: $setup.saving,\n                    inputmode: \"decimal\",\n                    placeholder: \"0,00\",\n                    onInput: $event => ($setup.onAmountInput(row)),\n                    onKeydown: _withKeys(_withModifiers($event => ($setup.advance(index, 4)), [\"prevent\"]), [\"enter\"])\n                  }, null, 42 /* CLASS, PROPS, NEED_HYDRATION */, _hoisted_13), [\n                    [_vModelText, row.amount]\n                  ])\n                ]),\n                _createElementVNode(\"td\", null, [\n                  _createElementVNode(\"button\", {\n                    class: \"eg__del\",\n                    type: \"button\",\n                    tabindex: \"-1\",\n                    title: \"Regel verwijderen\",\n                    disabled: $setup.saving || $setup.rows.length === 1,\n                    onClick: $event => ($setup.removeRow(index))\n                  }, \"×\", 8 /* PROPS */, _hoisted_14)\n                ])\n              ], 2 /* CLASS */),\n              ($setup.isNegative(row))\n                ? (_openBlock(), _createElementBlock(\"tr\", _hoisted_15, [\n                    _createElementVNode(\"td\", _hoisted_16, [\n                      _createElementVNode(\"div\", _hoisted_17, [\n                        _createElementVNode(\"label\", _hoisted_18, [\n                          _withDirectives(_createElementVNode(\"input\", {\n                            \"onUpdate:modelValue\": $event => ((row.transfer) = $event),\n                            type: \"checkbox\",\n                            disabled: $setup.saving,\n                            \"data-row\": index,\n                            \"data-col\": 5,\n                            \"aria-label\": `Journaalboeking regel ${index + 1}`,\n                            onChange: $event => ($setup.enableTransfer(index)),\n                            onKeydown: _withKeys(_withModifiers($event => ($setup.advance(index, 5)), [\"prevent\"]), [\"enter\"])\n                          }, null, 40 /* PROPS, NEED_HYDRATION */, _hoisted_19), [\n                            [_vModelCheckbox, row.transfer]\n                          ]),\n                          _cache[13] || (_cache[13] = _createTextVNode(\" Journaalboeking \", -1 /* CACHED */))\n                        ]),\n                        (row.transfer)\n                          ? (_openBlock(), _createElementBlock(_Fragment, { key: 0 }, [\n                              _createElementVNode(\"label\", _hoisted_20, [\n                                _cache[14] || (_cache[14] = _createTextVNode(\"Naar boekjaar \", -1 /* CACHED */)),\n                                _withDirectives(_createElementVNode(\"input\", {\n                                  \"onUpdate:modelValue\": $event => ((row.targetYear) = $event),\n                                  class: _normalizeClass([\"hh-input hh-input--mono eg__year\", { 'hh-input--error': $setup.rowErrors[index]?.targetYear }]),\n                                  inputmode: \"numeric\",\n                                  maxlength: \"4\",\n                                  \"aria-invalid\": Boolean($setup.rowErrors[index]?.targetYear),\n                                  \"aria-label\": `Doelboekjaar regel ${index + 1}`,\n                                  disabled: $setup.saving,\n                                  \"data-row\": index,\n                                  \"data-col\": 6,\n                                  onFocus: $setup.selectYear,\n                                  onClick: $setup.selectYear,\n                                  onBlur: $event => ($setup.normalizeTargetYear(row)),\n                                  onKeydown: _withKeys(_withModifiers($event => ($setup.advance(index, 6)), [\"prevent\"]), [\"enter\"])\n                                }, null, 42 /* CLASS, PROPS, NEED_HYDRATION */, _hoisted_21), [\n                                  [_vModelText, row.targetYear]\n                                ])\n                              ]),\n                              ($setup.transferTarget(row))\n                                ? (_openBlock(), _createElementBlock(\"span\", _hoisted_22, _toDisplayString($setup.formatEuro($setup.Money.multiply($setup.parseAmount(row.amount)!, \"-1\"))) + \" wordt ook geboekt in \" + _toDisplayString($setup.transferTarget(row)) + \".\", 1 /* TEXT */))\n                                : (_openBlock(), _createElementBlock(\"span\", _hoisted_23, \"Kies een geldig, ander boekjaar (1900 t/m 2100).\"))\n                            ], 64 /* STABLE_FRAGMENT */))\n                          : _createCommentVNode(\"v-if\", true)\n                      ])\n                    ])\n                  ]))\n                : _createCommentVNode(\"v-if\", true)\n            ], 64 /* STABLE_FRAGMENT */))\n          }), 128 /* KEYED_FRAGMENT */))\n        ]),\n        _createElementVNode(\"tfoot\", null, [\n          _createElementVNode(\"tr\", null, [\n            _createElementVNode(\"td\", _hoisted_24, \"Invoer (\" + _toDisplayString($setup.filledRows.length) + \" regel(s))\", 1 /* TEXT */),\n            _createElementVNode(\"td\", _hoisted_25, _toDisplayString($setup.formatEuro($setup.totalAmount)), 1 /* TEXT */),\n            _cache[15] || (_cache[15] = _createElementVNode(\"td\", null, null, -1 /* CACHED */))\n          ])\n        ])\n      ]),\n      ($setup.yearTotals.length)\n        ? (_openBlock(), _createElementBlock(\"div\", _hoisted_26, [\n            (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.yearTotals, (total) => {\n              return (_openBlock(), _createElementBlock(\"span\", {\n                key: total.year\n              }, [\n                _createTextVNode(\"Boekjaar \" + _toDisplayString(total.year) + \": \", 1 /* TEXT */),\n                _createElementVNode(\"strong\", null, _toDisplayString($setup.formatEuro(total.amount)), 1 /* TEXT */)\n              ]))\n            }), 128 /* KEYED_FRAGMENT */))\n          ]))\n        : _createCommentVNode(\"v-if\", true)\n    ]),\n    _createElementVNode(\"div\", _hoisted_27, [\n      _createElementVNode(\"button\", {\n        class: \"hh-btn\",\n        type: \"button\",\n        disabled: $setup.saving,\n        onClick: $setup.addRowFromButton\n      }, \"+ Regel\", 8 /* PROPS */, _hoisted_28),\n      _createElementVNode(\"button\", {\n        class: \"hh-btn hh-btn--primary\",\n        type: \"button\",\n        disabled: $setup.saving,\n        onClick: $setup.onVerwerkClick\n      }, _toDisplayString($setup.saving ? \"Verwerken…\" : \"Verwerk verschotten\"), 9 /* TEXT, PROPS */, _hoisted_29),\n      _createElementVNode(\"button\", {\n        class: \"hh-btn hh-btn--danger\",\n        type: \"button\",\n        disabled: $setup.saving,\n        onClick: _cache[1] || (_cache[1] = $event => ($setup.clearConfirmOpen = true))\n      }, \"Alle invoer wissen\", 8 /* PROPS */, _hoisted_30)\n    ]),\n    ($setup.submitError)\n      ? (_openBlock(), _createElementBlock(\"p\", _hoisted_31, _toDisplayString($setup.submitError), 1 /* TEXT */))\n      : _createCommentVNode(\"v-if\", true),\n    _createCommentVNode(\" Esc: wissen of terug. \"),\n    ($setup.escDialogOpen)\n      ? (_openBlock(), _createBlock($setup[\"AppDialog\"], {\n          key: 5,\n          title: \"Verschotten invoeren\",\n          onClose: _cache[3] || (_cache[3] = $event => ($setup.escDialogOpen = false))\n        }, {\n          footer: _withCtx(() => [\n            _createElementVNode(\"button\", {\n              class: \"hh-btn hh-btn--danger\",\n              type: \"button\",\n              onClick: $setup.clearAll\n            }, \"Wissen alle invoer\"),\n            _createElementVNode(\"button\", {\n              class: \"hh-btn\",\n              type: \"button\",\n              \"data-autofocus\": \"\",\n              onClick: _cache[2] || (_cache[2] = $event => ($setup.escDialogOpen = false))\n            }, \"Terug naar invoer\")\n          ]),\n          default: _withCtx(() => [\n            _cache[17] || (_cache[17] = _createElementVNode(\"p\", null, \"Wat wil je met de ingevoerde verschotten doen?\", -1 /* CACHED */))\n          ]),\n          _: 1 /* STABLE */,\n          __: [17]\n        }))\n      : _createCommentVNode(\"v-if\", true),\n    _createCommentVNode(\" Bevestiging bij het wissen van alle invoer. \"),\n    ($setup.clearConfirmOpen)\n      ? (_openBlock(), _createBlock($setup[\"AppDialog\"], {\n          key: 6,\n          title: \"Alle invoer wissen?\",\n          onClose: _cache[5] || (_cache[5] = $event => ($setup.clearConfirmOpen = false))\n        }, {\n          footer: _withCtx(() => [\n            _createElementVNode(\"button\", {\n              class: \"hh-btn\",\n              type: \"button\",\n              \"data-autofocus\": \"\",\n              onClick: _cache[4] || (_cache[4] = $event => ($setup.clearConfirmOpen = false))\n            }, \"Annuleren\"),\n            _createElementVNode(\"button\", {\n              class: \"hh-btn hh-btn--danger\",\n              type: \"button\",\n              onClick: $setup.clearAll\n            }, \"Wissen\")\n          ]),\n          default: _withCtx(() => [\n            _cache[18] || (_cache[18] = _createElementVNode(\"p\", null, \"Weet je zeker dat je alle ingevoerde regels wilt wissen?\", -1 /* CACHED */))\n          ]),\n          _: 1 /* STABLE */,\n          __: [18]\n        }))\n      : _createCommentVNode(\"v-if\", true),\n    _createCommentVNode(\" Bevestiging bij verwerken (tegen per ongeluk submitten). \"),\n    ($setup.verwerkDialogOpen)\n      ? (_openBlock(), _createBlock($setup[\"AppDialog\"], {\n          key: 7,\n          title: \"Verschotten verwerken?\",\n          onClose: _cache[8] || (_cache[8] = $event => ($setup.verwerkDialogOpen = false))\n        }, {\n          footer: _withCtx(() => [\n            _createElementVNode(\"label\", _hoisted_33, [\n              _withDirectives(_createElementVNode(\"input\", {\n                type: \"checkbox\",\n                \"onUpdate:modelValue\": _cache[6] || (_cache[6] = $event => (($setup.rememberChoice) = $event))\n              }, null, 512 /* NEED_PATCH */), [\n                [_vModelCheckbox, $setup.rememberChoice]\n              ]),\n              _cache[19] || (_cache[19] = _createTextVNode(\" Onthoud mijn keuze \", -1 /* CACHED */))\n            ]),\n            _createElementVNode(\"button\", {\n              class: \"hh-btn\",\n              type: \"button\",\n              onClick: _cache[7] || (_cache[7] = $event => ($setup.verwerkDialogOpen = false))\n            }, \"Terug\"),\n            _createElementVNode(\"button\", {\n              class: \"hh-btn hh-btn--primary\",\n              type: \"button\",\n              \"data-autofocus\": \"\",\n              onClick: $setup.verwerkConfirmed\n            }, \"Verwerken\")\n          ]),\n          default: _withCtx(() => [\n            _createElementVNode(\"p\", null, \"Weet je zeker dat je \" + _toDisplayString($setup.filledRows.length) + \" verschot(ten) wilt verwerken?\", 1 /* TEXT */),\n            ($setup.transferCount)\n              ? (_openBlock(), _createElementBlock(\"p\", _hoisted_32, _toDisplayString($setup.transferCount) + \" journaalboeking(en) maken elk ook een positieve tegenboeking in het gekozen doelboekjaar.\", 1 /* TEXT */))\n              : _createCommentVNode(\"v-if\", true),\n            (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.yearTotals, (total) => {\n              return (_openBlock(), _createElementBlock(\"p\", {\n                key: total.year\n              }, [\n                _createTextVNode(\"Boekjaar \" + _toDisplayString(total.year) + \": \", 1 /* TEXT */),\n                _createElementVNode(\"strong\", null, _toDisplayString($setup.formatEuro(total.amount)), 1 /* TEXT */)\n              ]))\n            }), 128 /* KEYED_FRAGMENT */))\n          ]),\n          _: 1 /* STABLE */\n        }))\n      : _createCommentVNode(\"v-if\", true)\n  ]))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/ExpenseEntryView.vue?type=script\";import \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/ExpenseEntryView.vue?type=style&index=0\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/ExpenseEntryView.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/ExpenseEntryView.vue\";script.__scopeId = \"data-v-6aecc8f7\";export default script;","<script setup lang=\"ts\">\nimport { onMounted, ref } from \"vue\";\nimport { useApi } from \"../lib/api\";\nimport { showToast } from \"../lib/toast\";\nimport AppDialog from \"./AppDialog.vue\";\nimport FormField from \"./FormField.vue\";\n\nconst api = useApi();\n\ntype Kind = { id: number; name: string };\nconst kinds = ref<Kind[]>([]);\nconst loading = ref(true);\nconst error = ref(\"\");\nconst editing = ref<Kind | null>(null);\nconst dialogOpen = ref(false);\nconst kindName = ref(\"\");\nconst fieldError = ref(\"\");\nconst dialogError = ref(\"\");\nconst busy = ref(false);\nconst deleting = ref<Kind | null>(null);\n\nasync function load(): Promise<void> {\n  error.value = \"\";\n  try {\n    kinds.value = await api.listExpenseKinds();\n  } catch (cause) {\n    error.value = cause instanceof Error ? cause.message : \"Verschotsoorten laden mislukt.\";\n  } finally {\n    loading.value = false;\n  }\n}\n\nfunction edit(kind: Kind | null): void {\n  editing.value = kind;\n  kindName.value = kind?.name ?? \"\";\n  fieldError.value = \"\";\n  dialogError.value = \"\";\n  dialogOpen.value = true;\n}\n\nasync function save(): Promise<void> {\n  fieldError.value = kindName.value.trim() ? \"\" : \"Vul een naam in.\";\n  if (fieldError.value) {\n    document.getElementById(\"kind-name\")?.focus();\n    return;\n  }\n  busy.value = true;\n  dialogError.value = \"\";\n  try {\n    if (editing.value) await api.updateExpenseKind({ id: editing.value.id, name: kindName.value.trim() });\n    else await api.createExpenseKind({ name: kindName.value.trim() });\n    await load();\n    dialogOpen.value = false;\n    showToast(\"Verschotsoort opgeslagen.\");\n  } catch (cause) {\n    dialogError.value = cause instanceof Error ? cause.message : \"Opslaan mislukt.\";\n  } finally {\n    busy.value = false;\n  }\n}\n\nfunction confirmDelete(kind: Kind): void {\n  deleting.value = kind;\n  dialogError.value = \"\";\n}\n\nasync function remove(): Promise<void> {\n  if (!deleting.value) return;\n  busy.value = true;\n  dialogError.value = \"\";\n  try {\n    await api.deleteExpenseKind({ id: deleting.value.id });\n    await load();\n    deleting.value = null;\n    showToast(\"Verschotsoort verwijderd.\");\n  } catch (cause) {\n    // Keep the confirmation open when existing expenses still use this kind.\n    dialogError.value = cause instanceof Error ? cause.message : \"Verwijderen mislukt.\";\n  } finally {\n    busy.value = false;\n  }\n}\n\nonMounted(() => { void load(); });\n</script>\n\n<template>\n  <section class=\"hh-card kinds\" aria-label=\"Verschotsoorten\">\n    <p class=\"hh-muted\">Voeg soorten toe en pas bestaande soorten aan. Een soort die in gebruik is, kun je niet verwijderen. Wijzigingen worden direct opgeslagen.</p>\n    <p v-if=\"error\" class=\"hh-formerror\" role=\"alert\">{{ error }}</p>\n    <p v-if=\"loading\" class=\"hh-muted\">Laden…</p>\n    <p v-else-if=\"!kinds.length\" class=\"hh-muted\">Nog geen verschotsoorten.</p>\n    <ul v-else class=\"kinds__list\">\n      <li v-for=\"kind in kinds\" :key=\"kind.id\">\n        <span>{{ kind.name }}</span>\n        <button type=\"button\" class=\"hh-btn\" :aria-label=\"`Verschotsoort ${kind.name} bewerken`\" @click=\"edit(kind)\">Bewerken</button>\n        <button type=\"button\" class=\"hh-btn hh-btn--danger\" :aria-label=\"`Verschotsoort ${kind.name} verwijderen`\" @click=\"confirmDelete(kind)\">Verwijderen</button>\n      </li>\n    </ul>\n    <button type=\"button\" class=\"hh-btn\" :disabled=\"loading\" @click=\"edit(null)\">+ Soort toevoegen</button>\n\n    <AppDialog v-if=\"dialogOpen\" :title=\"editing ? 'Verschotsoort bewerken' : 'Verschotsoort toevoegen'\" @close=\"!busy && (dialogOpen = false)\">\n      <form id=\"kind-form\" @submit.prevent=\"save\">\n        <FormField label=\"Naam\" for-id=\"kind-name\" required :error=\"fieldError\">\n          <input id=\"kind-name\" v-model=\"kindName\" class=\"hh-input\" :class=\"{ 'hh-input--error': fieldError }\" data-autofocus />\n        </FormField>\n        <p v-if=\"dialogError\" class=\"hh-formerror\" role=\"alert\">{{ dialogError }}</p>\n      </form>\n      <template #footer>\n        <button type=\"button\" class=\"hh-btn\" :disabled=\"busy\" @click=\"dialogOpen = false\">Annuleren</button>\n        <button type=\"submit\" form=\"kind-form\" class=\"hh-btn hh-btn--primary\" :disabled=\"busy\">{{ busy ? \"Opslaan…\" : \"Opslaan\" }}</button>\n      </template>\n    </AppDialog>\n    <AppDialog v-if=\"deleting\" title=\"Verschotsoort verwijderen\" @close=\"!busy && (deleting = null)\">\n      <p>Weet je zeker dat je \"{{ deleting.name }}\" wilt verwijderen?</p>\n      <p v-if=\"dialogError\" class=\"hh-formerror\" role=\"alert\">{{ dialogError }}</p>\n      <template #footer>\n        <button type=\"button\" class=\"hh-btn\" :disabled=\"busy\" @click=\"deleting = null\">Annuleren</button>\n        <button type=\"button\" class=\"hh-btn hh-btn--danger\" :disabled=\"busy\" @click=\"remove\">{{ busy ? \"Verwijderen…\" : \"Verwijderen\" }}</button>\n      </template>\n    </AppDialog>\n  </section>\n</template>\n\n<style scoped>\n.kinds { padding: 16px 18px; }\n.kinds p { margin: 0 0 14px; font-size: 14px; }\n.kinds__list { list-style: none; margin: 0 0 14px; padding: 0; display: grid; gap: 8px; }\n.kinds__list li { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; }\n.kinds__list span { flex: 1; min-width: 100px; }\n</style>\n","import { createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, renderList as _renderList, Fragment as _Fragment, vModelText as _vModelText, normalizeClass as _normalizeClass, withDirectives as _withDirectives, withCtx as _withCtx, createVNode as _createVNode, withModifiers as _withModifiers, createBlock as _createBlock } from \"vue\"\n\nconst _hoisted_1 = {\n  class: \"hh-card kinds\",\n  \"aria-label\": \"Verschotsoorten\"\n}\nconst _hoisted_2 = {\n  key: 0,\n  class: \"hh-formerror\",\n  role: \"alert\"\n}\nconst _hoisted_3 = {\n  key: 1,\n  class: \"hh-muted\"\n}\nconst _hoisted_4 = {\n  key: 2,\n  class: \"hh-muted\"\n}\nconst _hoisted_5 = {\n  key: 3,\n  class: \"kinds__list\"\n}\nconst _hoisted_6 = [\"aria-label\", \"onClick\"]\nconst _hoisted_7 = [\"aria-label\", \"onClick\"]\nconst _hoisted_8 = [\"disabled\"]\nconst _hoisted_9 = {\n  key: 0,\n  class: \"hh-formerror\",\n  role: \"alert\"\n}\nconst _hoisted_10 = [\"disabled\"]\nconst _hoisted_11 = [\"disabled\"]\nconst _hoisted_12 = {\n  key: 0,\n  class: \"hh-formerror\",\n  role: \"alert\"\n}\nconst _hoisted_13 = [\"disabled\"]\nconst _hoisted_14 = [\"disabled\"]\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return (_openBlock(), _createElementBlock(\"section\", _hoisted_1, [\n    _cache[6] || (_cache[6] = _createElementVNode(\"p\", { class: \"hh-muted\" }, \"Voeg soorten toe en pas bestaande soorten aan. Een soort die in gebruik is, kun je niet verwijderen. Wijzigingen worden direct opgeslagen.\", -1 /* CACHED */)),\n    ($setup.error)\n      ? (_openBlock(), _createElementBlock(\"p\", _hoisted_2, _toDisplayString($setup.error), 1 /* TEXT */))\n      : _createCommentVNode(\"v-if\", true),\n    ($setup.loading)\n      ? (_openBlock(), _createElementBlock(\"p\", _hoisted_3, \"Laden…\"))\n      : (!$setup.kinds.length)\n        ? (_openBlock(), _createElementBlock(\"p\", _hoisted_4, \"Nog geen verschotsoorten.\"))\n        : (_openBlock(), _createElementBlock(\"ul\", _hoisted_5, [\n            (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.kinds, (kind) => {\n              return (_openBlock(), _createElementBlock(\"li\", {\n                key: kind.id\n              }, [\n                _createElementVNode(\"span\", null, _toDisplayString(kind.name), 1 /* TEXT */),\n                _createElementVNode(\"button\", {\n                  type: \"button\",\n                  class: \"hh-btn\",\n                  \"aria-label\": `Verschotsoort ${kind.name} bewerken`,\n                  onClick: $event => ($setup.edit(kind))\n                }, \"Bewerken\", 8 /* PROPS */, _hoisted_6),\n                _createElementVNode(\"button\", {\n                  type: \"button\",\n                  class: \"hh-btn hh-btn--danger\",\n                  \"aria-label\": `Verschotsoort ${kind.name} verwijderen`,\n                  onClick: $event => ($setup.confirmDelete(kind))\n                }, \"Verwijderen\", 8 /* PROPS */, _hoisted_7)\n              ]))\n            }), 128 /* KEYED_FRAGMENT */))\n          ])),\n    _createElementVNode(\"button\", {\n      type: \"button\",\n      class: \"hh-btn\",\n      disabled: $setup.loading,\n      onClick: _cache[0] || (_cache[0] = $event => ($setup.edit(null)))\n    }, \"+ Soort toevoegen\", 8 /* PROPS */, _hoisted_8),\n    ($setup.dialogOpen)\n      ? (_openBlock(), _createBlock($setup[\"AppDialog\"], {\n          key: 4,\n          title: $setup.editing ? 'Verschotsoort bewerken' : 'Verschotsoort toevoegen',\n          onClose: _cache[3] || (_cache[3] = $event => (!$setup.busy && ($setup.dialogOpen = false)))\n        }, {\n          footer: _withCtx(() => [\n            _createElementVNode(\"button\", {\n              type: \"button\",\n              class: \"hh-btn\",\n              disabled: $setup.busy,\n              onClick: _cache[2] || (_cache[2] = $event => ($setup.dialogOpen = false))\n            }, \"Annuleren\", 8 /* PROPS */, _hoisted_10),\n            _createElementVNode(\"button\", {\n              type: \"submit\",\n              form: \"kind-form\",\n              class: \"hh-btn hh-btn--primary\",\n              disabled: $setup.busy\n            }, _toDisplayString($setup.busy ? \"Opslaan…\" : \"Opslaan\"), 9 /* TEXT, PROPS */, _hoisted_11)\n          ]),\n          default: _withCtx(() => [\n            _createElementVNode(\"form\", {\n              id: \"kind-form\",\n              onSubmit: _withModifiers($setup.save, [\"prevent\"])\n            }, [\n              _createVNode($setup[\"FormField\"], {\n                label: \"Naam\",\n                \"for-id\": \"kind-name\",\n                required: \"\",\n                error: $setup.fieldError\n              }, {\n                default: _withCtx(() => [\n                  _withDirectives(_createElementVNode(\"input\", {\n                    id: \"kind-name\",\n                    \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => (($setup.kindName) = $event)),\n                    class: _normalizeClass([\"hh-input\", { 'hh-input--error': $setup.fieldError }]),\n                    \"data-autofocus\": \"\"\n                  }, null, 2 /* CLASS */), [\n                    [_vModelText, $setup.kindName]\n                  ])\n                ]),\n                _: 1 /* STABLE */\n              }, 8 /* PROPS */, [\"error\"]),\n              ($setup.dialogError)\n                ? (_openBlock(), _createElementBlock(\"p\", _hoisted_9, _toDisplayString($setup.dialogError), 1 /* TEXT */))\n                : _createCommentVNode(\"v-if\", true)\n            ], 32 /* NEED_HYDRATION */)\n          ]),\n          _: 1 /* STABLE */\n        }, 8 /* PROPS */, [\"title\"]))\n      : _createCommentVNode(\"v-if\", true),\n    ($setup.deleting)\n      ? (_openBlock(), _createBlock($setup[\"AppDialog\"], {\n          key: 5,\n          title: \"Verschotsoort verwijderen\",\n          onClose: _cache[5] || (_cache[5] = $event => (!$setup.busy && ($setup.deleting = null)))\n        }, {\n          footer: _withCtx(() => [\n            _createElementVNode(\"button\", {\n              type: \"button\",\n              class: \"hh-btn\",\n              disabled: $setup.busy,\n              onClick: _cache[4] || (_cache[4] = $event => ($setup.deleting = null))\n            }, \"Annuleren\", 8 /* PROPS */, _hoisted_13),\n            _createElementVNode(\"button\", {\n              type: \"button\",\n              class: \"hh-btn hh-btn--danger\",\n              disabled: $setup.busy,\n              onClick: $setup.remove\n            }, _toDisplayString($setup.busy ? \"Verwijderen…\" : \"Verwijderen\"), 9 /* TEXT, PROPS */, _hoisted_14)\n          ]),\n          default: _withCtx(() => [\n            _createElementVNode(\"p\", null, \"Weet je zeker dat je \\\"\" + _toDisplayString($setup.deleting.name) + \"\\\" wilt verwijderen?\", 1 /* TEXT */),\n            ($setup.dialogError)\n              ? (_openBlock(), _createElementBlock(\"p\", _hoisted_12, _toDisplayString($setup.dialogError), 1 /* TEXT */))\n              : _createCommentVNode(\"v-if\", true)\n          ]),\n          _: 1 /* STABLE */\n        }))\n      : _createCommentVNode(\"v-if\", true)\n  ]))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/ExpenseKindSettings.vue?type=script\";import \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/ExpenseKindSettings.vue?type=style&index=0\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/ExpenseKindSettings.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/ExpenseKindSettings.vue\";script.__scopeId = \"data-v-21dd2d70\";export default script;","// Pure geometry of the advanced invoice layout, shared by the document renderer and the designer.\n// Coordinates are millimetres inside the printable area (A4 minus the @page margins of invoice.witty).\n\nexport const INVOICE_BLOCK_IDS = [\"logo\", \"company\", \"customer\", \"title\", \"dates\", \"body\", \"payment\", \"footertext\"] as const;\nexport type InvoiceBlockId = typeof INVOICE_BLOCK_IDS[number];\nexport type InvoiceBlockAlign = \"left\" | \"center\" | \"right\";\n\nexport interface InvoiceBlock {\n  x: number;\n  y: number;\n  width: number;\n  fontSize: number;\n  align: InvoiceBlockAlign;\n}\n\nexport type InvoiceBlocks = Record<InvoiceBlockId, InvoiceBlock>;\n\n/** Usable area in mm; the height keeps a few mm in reserve so a full sheet never spills onto a second page. */\nexport const INVOICE_AREA = { width: 182, height: 265 } as const;\n/** Offset of the usable area on the A4 sheet (the @page margins). */\nexport const INVOICE_AREA_OFFSET = { left: 14, top: 12 } as const;\nexport const INVOICE_BLOCK_LIMITS = { minWidth: 20, minFontSize: 8, maxFontSize: 24 } as const;\n\nexport const INVOICE_BLOCK_LABELS: Record<InvoiceBlockId, string> = {\n  logo: \"Logo\",\n  company: \"Bedrijfsgegevens\",\n  customer: \"Klantadres\",\n  title: \"Titel\",\n  dates: \"Datums\",\n  body: \"Regels en totalen\",\n  payment: \"Betaalblok\",\n  footertext: \"Voettekst\",\n};\n\n// Matches the standard layout with default options, so switching to the designer does not move anything.\nexport const DEFAULT_INVOICE_BLOCKS: InvoiceBlocks = {\n  logo: { x: 0, y: 0, width: 40, fontSize: 12, align: \"left\" },\n  company: { x: 122, y: 0, width: 60, fontSize: 12, align: \"right\" },\n  customer: { x: 0, y: 49, width: 91, fontSize: 12, align: \"left\" },\n  title: { x: 0, y: 81, width: 182, fontSize: 12, align: \"left\" },\n  dates: { x: 94, y: 96, width: 88, fontSize: 12, align: \"left\" },\n  body: { x: 0, y: 115, width: 182, fontSize: 12, align: \"left\" },\n  payment: { x: 0, y: 188, width: 182, fontSize: 12, align: \"left\" },\n  footertext: { x: 0, y: 200, width: 182, fontSize: 12, align: \"left\" },\n};\n\n/** Completes stored (possibly partial or older) block data with the defaults. */\nexport function resolveInvoiceBlocks(blocks: Partial<InvoiceBlocks> | null | undefined): InvoiceBlocks {\n  return Object.fromEntries(INVOICE_BLOCK_IDS.map((id) => [id, { ...DEFAULT_INVOICE_BLOCKS[id], ...blocks?.[id] }])) as InvoiceBlocks;\n}\n\n/**\n * Blocks that start at or below the body's top and share horizontal space with it flow along when the\n * body grows; all other blocks keep their fixed place on the first page.\n */\nexport function isFlowingBlock(blocks: InvoiceBlocks, id: InvoiceBlockId): boolean {\n  if (id === \"body\") return false;\n  const block = blocks[id], body = blocks.body;\n  return block.y >= body.y && block.x < body.x + body.width && body.x < block.x + block.width;\n}\n\nexport interface InvoiceBlockPlacement {\n  id: InvoiceBlockId;\n  css: string;\n  // Witty can only branch on booleans, so each placement says which block content it embeds.\n  show: Record<InvoiceBlockId, boolean>;\n}\n\nexport interface AdvancedInvoiceGeometry {\n  topHeight: number;\n  bodyStyle: string;\n  top: InvoiceBlockPlacement[];\n  bottom: InvoiceBlockPlacement[];\n  paymentFooter: InvoiceBlockPlacement[];\n  beforeFooterStyle: string;\n  paymentTextStyle: string;\n  footerTextStyle: string;\n}\n\nfunction placement(id: InvoiceBlockId, block: InvoiceBlock, position: string): InvoiceBlockPlacement {\n  return {\n    id,\n    css: `${position};width:${block.width}mm;font-size:${block.fontSize}px;text-align:${block.align}`,\n    show: Object.fromEntries(INVOICE_BLOCK_IDS.map((other) => [other, other === id])) as Record<InvoiceBlockId, boolean>,\n  };\n}\n\n/**\n * Splits the blocks into a fixed top region, the growing body and a bottom region that follows the body.\n * The body reserves at least the space up to the first flowing block, so a short invoice puts the bottom\n * region exactly at its designed place, while a long one pushes it down by its real content height only.\n */\nexport function advancedInvoiceGeometry(blocks: InvoiceBlocks, options: { paymentQr?: boolean } = {}): AdvancedInvoiceGeometry {\n  const others = INVOICE_BLOCK_IDS.filter((id) => id !== \"body\");\n  const flowing = others.filter((id) => isFlowingBlock(blocks, id));\n  const bottomTop = flowing.length ? Math.min(...flowing.map((id) => blocks[id].y)) : blocks.body.y;\n  const body = blocks.body;\n  const payment = blocks.payment, footer = blocks.footertext;\n  // Share one flow box so the QR and growing terms cannot collide with another positioned footer block.\n  const groupPayment = options.paymentQr && flowing.includes(\"payment\") && flowing.includes(\"footertext\")\n    && footer.y >= payment.y && footer.x < payment.x + payment.width && payment.x < footer.x + footer.width;\n  return {\n    topHeight: body.y,\n    // The padding sits inside the reserved height (border-box), so it only shows once the body pushes the bottom region down.\n    bodyStyle: `margin-left:${body.x}mm;width:${body.width}mm;min-height:${Math.max(0, bottomTop - body.y)}mm;`\n      + `padding-bottom:${flowing.length ? 6 : 0}mm;font-size:${body.fontSize}px;text-align:${body.align}`,\n    top: others.filter((id) => !flowing.includes(id)).map((id) => placement(id, blocks[id], `left:${blocks[id].x}mm;top:${blocks[id].y}mm`)),\n    bottom: flowing.filter((id) => !groupPayment || (id !== \"payment\" && id !== \"footertext\"))\n      .map((id) => placement(id, blocks[id], `margin-left:${blocks[id].x}mm;margin-top:${blocks[id].y - bottomTop}mm`)),\n    paymentFooter: groupPayment ? [placement(\"payment\", payment, `margin-left:${payment.x}mm`)] : [],\n    beforeFooterStyle: groupPayment ? `min-height:${Math.max(0, payment.y - bottomTop)}mm` : \"\",\n    paymentTextStyle: groupPayment ? `min-height:${Math.max(0, footer.y - payment.y)}mm` : \"\",\n    footerTextStyle: groupPayment ? `font-size:${footer.fontSize}px;text-align:${footer.align}` : \"\",\n  };\n}\n\n/** Rounds to whole millimetres and keeps a block inside the bounds that the server accepts. */\nexport function clampInvoiceBlock(block: InvoiceBlock, options: { heightMm?: number } = {}): InvoiceBlock {\n  const width = Math.round(Math.min(INVOICE_AREA.width, Math.max(INVOICE_BLOCK_LIMITS.minWidth, block.width)));\n  const maxY = Math.min(INVOICE_AREA.height - 5, INVOICE_AREA.height - Math.ceil(options.heightMm ?? 0));\n  return {\n    x: Math.round(Math.min(INVOICE_AREA.width - width, Math.max(0, block.x))),\n    y: Math.round(Math.min(Math.max(0, maxY), Math.max(0, block.y))),\n    width,\n    fontSize: Math.round(Math.min(INVOICE_BLOCK_LIMITS.maxFontSize, Math.max(INVOICE_BLOCK_LIMITS.minFontSize, block.fontSize))),\n    align: block.align,\n  };\n}\n","import {\n  clampInvoiceBlock,\n  INVOICE_AREA,\n  INVOICE_BLOCK_IDS,\n  resolveInvoiceBlocks,\n  type InvoiceBlock,\n  type InvoiceBlockAlign,\n  type InvoiceBlockId,\n  type InvoiceBlocks,\n} from \"../../../../js/internal/invoice-layout\";\n\n/** CSS pixels per millimetre. */\nexport const PX_PER_MM = 96 / 25.4;\nexport const GRID_MM = 5;\nconst SNAP_DISTANCE_MM = 2;\n\n/** A block's box in mm, relative to the printable area. */\nexport interface BlockRect {\n  x: number;\n  y: number;\n  width: number;\n  height: number;\n}\n\nfunction contentOrigin(document: Document): { left: number; top: number } {\n  const body = document.body.getBoundingClientRect();\n  const style = getComputedStyle(document.body);\n  return { left: body.left + parseFloat(style.paddingLeft), top: body.top + parseFloat(style.paddingTop) };\n}\n\nfunction unionRect(rects: DOMRect[], origin: { left: number; top: number }): BlockRect {\n  const left = Math.min(...rects.map((rect) => rect.left)), top = Math.min(...rects.map((rect) => rect.top));\n  const right = Math.max(...rects.map((rect) => rect.right)), bottom = Math.max(...rects.map((rect) => rect.bottom));\n  return { x: (left - origin.left) / PX_PER_MM, y: (top - origin.top) / PX_PER_MM, width: (right - left) / PX_PER_MM, height: (bottom - top) / PX_PER_MM };\n}\n\nfunction alignOf(element: Element): InvoiceBlockAlign {\n  const align = getComputedStyle(element).textAlign;\n  return align === \"right\" || align === \"end\" ? \"right\" : align === \"center\" ? \"center\" : \"left\";\n}\n\n/**\n * Derives free positions from a rendered standard or letterhead document, so choosing the designer keeps\n * the current look. Blocks that are not visible keep their defaults.\n */\nexport function blocksFromDocument(document: Document | null | undefined, fontSize: number): InvoiceBlocks {\n  const blocks = resolveInvoiceBlocks(null);\n  for (const id of INVOICE_BLOCK_IDS) blocks[id] = clampInvoiceBlock({ ...blocks[id], fontSize });\n  if (!document?.querySelector(\".invoice\") || document.querySelector(\".adv-top\")) return blocks;\n  const origin = contentOrigin(document);\n  for (const id of INVOICE_BLOCK_IDS) {\n    const visible = [...document.querySelectorAll(`[data-block=\"${id}\"]`)].filter((element) => element.getBoundingClientRect().width > 0);\n    // An empty date column still spans its grid cell; prefer elements with text, but keep an empty footer text or a logo.\n    const filled = visible.filter((element) => element.textContent?.trim());\n    const elements = filled.length ? filled : visible.slice(0, 1);\n    if (!elements.length) continue;\n    const rect = unionRect(elements.map((element) => element.getBoundingClientRect()), origin);\n    blocks[id] = clampInvoiceBlock({ x: rect.x, y: rect.y, width: rect.width, fontSize, align: alignOf(elements[0]) });\n  }\n  return blocks;\n}\n\n/** The positioned wrapper of a block in an advanced document. */\nexport function advancedBlockElement(document: Document, id: InvoiceBlockId): HTMLElement | null {\n  return document.querySelector<HTMLElement>(id === \"body\" ? \".adv-bodyblock\" : `.adv-block[data-block=\"${id}\"]`);\n}\n\n/**\n * Shows unsaved changes directly in the rendered document until the server render catches up: the\n * difference with the rendered blocks becomes a translation, sizes are applied as they are.\n */\nexport function patchAdvancedDocument(document: Document, input: { blocks: InvoiceBlocks; rendered: InvoiceBlocks }): void {\n  for (const id of INVOICE_BLOCK_IDS) {\n    const element = advancedBlockElement(document, id);\n    if (!element) continue;\n    const block = input.blocks[id], rendered = input.rendered[id];\n    const dx = block.x - rendered.x, dy = block.y - rendered.y;\n    element.style.transform = dx || dy ? `translate(${dx}mm, ${dy}mm)` : \"\";\n    element.style.width = `${block.width}mm`;\n    element.style.fontSize = `${block.fontSize}px`;\n    element.style.textAlign = block.align;\n  }\n}\n\n/** Measures the visible blocks of an advanced document; the body is measured by its content, not its reserved space. */\nexport function measureAdvancedDocument(document: Document): Partial<Record<InvoiceBlockId, BlockRect>> {\n  if (!document.querySelector(\".adv-top\")) return {};\n  const origin = contentOrigin(document);\n  const rects: Partial<Record<InvoiceBlockId, BlockRect>> = {};\n  for (const id of INVOICE_BLOCK_IDS) {\n    const element = advancedBlockElement(document, id);\n    if (!element || !element.childElementCount) continue;\n    rects[id] = unionRect(id === \"body\" ? [...element.children].map((child) => child.getBoundingClientRect()) : [element.getBoundingClientRect()], origin);\n  }\n  return rects;\n}\n\ninterface SnapTarget {\n  value: number;\n  guide: number;\n}\n\n/** Snaps to the nearest alignment target within reach, otherwise to the grid. */\nexport function snapValue(value: number, targets: SnapTarget[]): { value: number; guide: number | null } {\n  let best: SnapTarget | null = null;\n  for (const target of targets)\n    if (Math.abs(target.value - value) <= SNAP_DISTANCE_MM && (!best || Math.abs(target.value - value) < Math.abs(best.value - value))) best = target;\n  return best ? { value: best.value, guide: best.guide } : { value: Math.round(value / GRID_MM) * GRID_MM, guide: null };\n}\n\n/** Horizontal targets for a block of the given width: page margins, page centre and the edges of the other blocks. */\nexport function horizontalTargets(input: { width: number; others: BlockRect[] }): SnapTarget[] {\n  const { width } = input;\n  const targets: SnapTarget[] = [\n    { value: 0, guide: 0 },\n    { value: INVOICE_AREA.width - width, guide: INVOICE_AREA.width },\n    { value: INVOICE_AREA.width / 2 - width / 2, guide: INVOICE_AREA.width / 2 },\n  ];\n  for (const other of input.others) {\n    targets.push({ value: other.x, guide: other.x });\n    targets.push({ value: other.x + other.width - width, guide: other.x + other.width });\n    targets.push({ value: other.x + other.width, guide: other.x + other.width });\n    targets.push({ value: other.x + other.width / 2 - width / 2, guide: other.x + other.width / 2 });\n  }\n  return targets;\n}\n\n/** Vertical targets for a block of the given height: page margins and the edges of the other blocks. */\nexport function verticalTargets(input: { height: number; others: BlockRect[] }): SnapTarget[] {\n  const { height } = input;\n  const targets: SnapTarget[] = [{ value: 0, guide: 0 }, { value: INVOICE_AREA.height - height, guide: INVOICE_AREA.height }];\n  for (const other of input.others) {\n    targets.push({ value: other.y, guide: other.y });\n    targets.push({ value: other.y + other.height - height, guide: other.y + other.height });\n    targets.push({ value: other.y + other.height, guide: other.y + other.height });\n  }\n  return targets;\n}\n\n/** Applies a change and keeps the block inside the printable area. */\nexport function changeBlock(block: InvoiceBlock, change: Partial<InvoiceBlock>, heightMm?: number): InvoiceBlock {\n  return clampInvoiceBlock({ ...block, ...change }, { heightMm });\n}\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport type { InvoiceStyle } from \"../../../../js/internal/services/invoice-style\";\n\ntype SenderField = InvoiceStyle[\"companyFields\"][number];\nconst props = defineProps<{ modelValue: SenderField[] }>();\nconst emit = defineEmits<{ \"update:modelValue\": [value: SenderField[]] }>();\nconst labels: Record<SenderField, string> = {\n  name: \"Bedrijfsnaam\", address: \"Adres\", email: \"E-mailadres\", phone: \"Telefoonnummer\",\n  kvk: \"KVK-nummer\", vat: \"Btw-nummer\", iban: \"IBAN\",\n};\nconst fields = computed(() => [\n  ...props.modelValue,\n  ...(Object.keys(labels) as SenderField[]).filter((field) => !props.modelValue.includes(field)),\n]);\n\nfunction toggle(field: SenderField): void {\n  emit(\"update:modelValue\", props.modelValue.includes(field)\n    ? props.modelValue.filter((value) => value !== field) : [...props.modelValue, field]);\n}\n\nfunction move(input: { field: SenderField; direction: number }): void {\n  const index = props.modelValue.indexOf(input.field);\n  const target = index + input.direction;\n  if (index < 0 || target < 0 || target >= props.modelValue.length) return;\n  const value = [...props.modelValue];\n  [value[index], value[target]] = [value[target], value[index]];\n  emit(\"update:modelValue\", value);\n}\n</script>\n\n<template>\n  <ul class=\"sender-fields\" aria-label=\"Zichtbare afzendergegevens en volgorde\">\n    <li v-for=\"field in fields\" :key=\"field\" class=\"sender-fields__row\">\n      <label class=\"sender-fields__label\">\n        <input type=\"checkbox\" :checked=\"modelValue.includes(field)\" @change=\"toggle(field)\" />\n        {{ labels[field] }}\n      </label>\n      <div v-if=\"modelValue.includes(field)\" class=\"sender-fields__order\">\n        <button class=\"hh-btn hh-btn--small\" type=\"button\" :aria-label=\"`${labels[field]} omhoog`\" :disabled=\"modelValue.indexOf(field) === 0\" @click=\"move({ field, direction: -1 })\">↑</button>\n        <button class=\"hh-btn hh-btn--small\" type=\"button\" :aria-label=\"`${labels[field]} omlaag`\" :disabled=\"modelValue.indexOf(field) === modelValue.length - 1\" @click=\"move({ field, direction: 1 })\">↓</button>\n      </div>\n    </li>\n  </ul>\n</template>\n\n<style scoped>\n.sender-fields { margin: 0; padding: 0; list-style: none; }\n.sender-fields__row { display: flex; justify-content: space-between; align-items: center; gap: 8px; min-height: 44px; border-top: 1px solid var(--hh-line); }\n.sender-fields__label { display: flex; align-items: center; gap: 8px; font-size: 14px; cursor: pointer; }\n.sender-fields__label input { cursor: pointer; }\n.sender-fields__order { display: flex; gap: 4px; }\n</style>\n","import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, createCommentVNode as _createCommentVNode } from \"vue\"\n\nconst _hoisted_1 = {\n  class: \"sender-fields\",\n  \"aria-label\": \"Zichtbare afzendergegevens en volgorde\"\n}\nconst _hoisted_2 = { class: \"sender-fields__label\" }\nconst _hoisted_3 = [\"checked\", \"onChange\"]\nconst _hoisted_4 = {\n  key: 0,\n  class: \"sender-fields__order\"\n}\nconst _hoisted_5 = [\"aria-label\", \"disabled\", \"onClick\"]\nconst _hoisted_6 = [\"aria-label\", \"disabled\", \"onClick\"]\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return (_openBlock(), _createElementBlock(\"ul\", _hoisted_1, [\n    (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.fields, (field) => {\n      return (_openBlock(), _createElementBlock(\"li\", {\n        key: field,\n        class: \"sender-fields__row\"\n      }, [\n        _createElementVNode(\"label\", _hoisted_2, [\n          _createElementVNode(\"input\", {\n            type: \"checkbox\",\n            checked: $props.modelValue.includes(field),\n            onChange: $event => ($setup.toggle(field))\n          }, null, 40 /* PROPS, NEED_HYDRATION */, _hoisted_3),\n          _createTextVNode(\" \" + _toDisplayString($setup.labels[field]), 1 /* TEXT */)\n        ]),\n        ($props.modelValue.includes(field))\n          ? (_openBlock(), _createElementBlock(\"div\", _hoisted_4, [\n              _createElementVNode(\"button\", {\n                class: \"hh-btn hh-btn--small\",\n                type: \"button\",\n                \"aria-label\": `${$setup.labels[field]} omhoog`,\n                disabled: $props.modelValue.indexOf(field) === 0,\n                onClick: $event => ($setup.move({ field, direction: -1 }))\n              }, \"↑\", 8 /* PROPS */, _hoisted_5),\n              _createElementVNode(\"button\", {\n                class: \"hh-btn hh-btn--small\",\n                type: \"button\",\n                \"aria-label\": `${$setup.labels[field]} omlaag`,\n                disabled: $props.modelValue.indexOf(field) === $props.modelValue.length - 1,\n                onClick: $event => ($setup.move({ field, direction: 1 }))\n              }, \"↓\", 8 /* PROPS */, _hoisted_6)\n            ]))\n          : _createCommentVNode(\"v-if\", true)\n      ]))\n    }), 128 /* KEYED_FRAGMENT */))\n  ]))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/InvoiceStyleSenderFields.vue?type=script\";import \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/InvoiceStyleSenderFields.vue?type=style&index=0\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/InvoiceStyleSenderFields.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/InvoiceStyleSenderFields.vue\";script.__scopeId = \"data-v-a2524b90\";export default script;","<script setup lang=\"ts\">\nimport { computed, nextTick, ref, shallowRef, useTemplateRef, watch } from \"vue\";\nimport {\n  INVOICE_AREA,\n  INVOICE_AREA_OFFSET,\n  INVOICE_BLOCK_IDS,\n  INVOICE_BLOCK_LABELS,\n  type InvoiceBlock,\n  type InvoiceBlockAlign,\n  type InvoiceBlockId,\n  type InvoiceBlocks,\n} from \"../../../../js/internal/invoice-layout\";\nimport {\n  changeBlock,\n  horizontalTargets,\n  measureAdvancedDocument,\n  patchAdvancedDocument,\n  PX_PER_MM,\n  snapValue,\n  verticalTargets,\n  type BlockRect,\n} from \"../lib/invoiceDesigner\";\nimport InvoicePreview from \"./InvoicePreview.vue\";\n\nconst props = defineProps<{ html: string; rendered: InvoiceBlocks; disabled?: boolean }>();\nconst blocks = defineModel<InvoiceBlocks>(\"blocks\", { required: true });\n\nconst preview = useTemplateRef<InstanceType<typeof InvoicePreview>>(\"preview\");\nconst rects = shallowRef<Partial<Record<InvoiceBlockId, BlockRect>>>({});\nconst selected = ref<InvoiceBlockId | null>(null);\nconst guides = ref<{ x: number[]; y: number[] }>({ x: [], y: [] });\nconst ready = ref(false);\nconst aligns: { value: InvoiceBlockAlign; label: string }[] = [\n  { value: \"left\", label: \"Links\" },\n  { value: \"center\", label: \"Midden\" },\n  { value: \"right\", label: \"Rechts\" },\n];\n\nconst visibleIds = computed(() => INVOICE_BLOCK_IDS.filter((id) => rects.value[id]));\nconst selectedBlock = computed(() => selected.value ? blocks.value[selected.value] : null);\n\n/** Applies unsaved positions to the rendered document and measures the result for the overlay. */\nfunction sync(): void {\n  const document = preview.value?.getDocument();\n  if (!ready.value || !document) return;\n  patchAdvancedDocument(document, { blocks: blocks.value, rendered: props.rendered });\n  rects.value = measureAdvancedDocument(document);\n}\n\nfunction onReady(value: boolean): void {\n  ready.value = value;\n  if (value) sync();\n}\n\nwatch(blocks, () => { void nextTick(sync); }, { deep: true });\n\nfunction px(mm: number, scale: number): string {\n  return `${mm * PX_PER_MM * scale}px`;\n}\n\nfunction boxStyle(id: InvoiceBlockId, scale: number): Record<string, string> {\n  const rect = rects.value[id]!;\n  return {\n    left: px(INVOICE_AREA_OFFSET.left + rect.x, scale),\n    top: px(INVOICE_AREA_OFFSET.top + rect.y, scale),\n    width: px(rect.width, scale),\n    height: px(Math.max(rect.height, 4), scale),\n  };\n}\n\nfunction describe(id: InvoiceBlockId): string {\n  const block = blocks.value[id];\n  const size = id === \"logo\" ? \"\" : `, letter ${block.fontSize} pixels`;\n  return `${INVOICE_BLOCK_LABELS[id]}: ${block.x} mm van links, ${block.y} mm van boven, ${block.width} mm breed${size}`;\n}\n\nfunction update(id: InvoiceBlockId, change: Partial<InvoiceBlock>): void {\n  if (props.disabled) return;\n  const previous = blocks.value[id];\n  const updated = changeBlock(previous, change, rects.value[id]?.height);\n  if (id === \"payment\" && rects.value.payment && !rects.value.footertext) {\n    const footer = blocks.value.footertext;\n    // Keep the hidden terms in the same group after re-rendering, within both stored blocks' bounds.\n    const movedFooter = changeBlock(footer, { x: footer.x + updated.x - previous.x, y: footer.y + updated.y - previous.y });\n    updated.x = previous.x + movedFooter.x - footer.x;\n    updated.y = previous.y + movedFooter.y - footer.y;\n    blocks.value.footertext = movedFooter;\n  }\n  blocks.value[id] = updated;\n}\n\nfunction others(id: InvoiceBlockId): BlockRect[] {\n  return INVOICE_BLOCK_IDS.filter((other) => other !== id && rects.value[other]).map((other) => rects.value[other]!);\n}\n\ninterface Drag {\n  id: InvoiceBlockId;\n  mode: \"move\" | \"resize\";\n  startX: number;\n  startY: number;\n  origin: InvoiceBlock;\n  moved: boolean;\n}\nlet drag: Drag | null = null;\n\nfunction onPointerDown(event: PointerEvent, id: InvoiceBlockId, mode: Drag[\"mode\"]): void {\n  if (props.disabled || event.button !== 0) return;\n  event.preventDefault();\n  event.stopPropagation();\n  selected.value = id;\n  const box = (event.currentTarget as HTMLElement).closest<HTMLElement>(\".designer__block\");\n  box?.focus({ preventScroll: true });\n  box?.setPointerCapture(event.pointerId);\n  drag = { id, mode, startX: event.clientX, startY: event.clientY, origin: { ...blocks.value[id] }, moved: false };\n}\n\nfunction onPointerMove(event: PointerEvent): void {\n  if (!drag) return;\n  if (!drag.moved && Math.hypot(event.clientX - drag.startX, event.clientY - drag.startY) < 3) return;\n  drag.moved = true;\n  const perMm = PX_PER_MM * (preview.value?.scale ?? 1);\n  const dx = (event.clientX - drag.startX) / perMm, dy = (event.clientY - drag.startY) / perMm;\n  const rest = others(drag.id);\n  if (drag.mode === \"resize\") {\n    const right = snapValue(drag.origin.x + drag.origin.width + dx, horizontalTargets({ width: 0, others: rest }));\n    guides.value = { x: right.guide === null ? [] : [right.guide], y: [] };\n    update(drag.id, { width: right.value - drag.origin.x });\n    return;\n  }\n  const height = rects.value[drag.id]?.height ?? 0;\n  const x = snapValue(drag.origin.x + dx, horizontalTargets({ width: drag.origin.width, others: rest }));\n  const y = snapValue(drag.origin.y + dy, verticalTargets({ height, others: rest }));\n  guides.value = { x: x.guide === null ? [] : [x.guide], y: y.guide === null ? [] : [y.guide] };\n  update(drag.id, { x: x.value, y: y.value });\n}\n\nfunction onPointerUp(): void {\n  drag = null;\n  guides.value = { x: [], y: [] };\n}\n\nfunction changeFont(id: InvoiceBlockId, delta: number): void {\n  if (id !== \"logo\") update(id, { fontSize: blocks.value[id].fontSize + delta });\n}\n\ndefineExpose({ sync });\n</script>\n\n<template>\n  <div class=\"designer\">\n    <div class=\"designer__toolbar\" role=\"toolbar\" aria-label=\"Geselecteerd onderdeel\">\n      <template v-if=\"selected && selectedBlock\">\n        <strong class=\"designer__name\">{{ INVOICE_BLOCK_LABELS[selected] }}</strong>\n        <span class=\"designer__readout\">{{ selectedBlock.x }} × {{ selectedBlock.y }} mm, {{ selectedBlock.width }} mm breed</span>\n        <span v-if=\"selected !== 'logo'\" class=\"designer__group\">\n          <button class=\"hh-btn hh-btn--small\" type=\"button\" aria-label=\"Letter kleiner\" :disabled=\"disabled || selectedBlock.fontSize <= 8\" @click=\"changeFont(selected, -1)\">A−</button>\n          <span class=\"designer__readout\" aria-live=\"polite\">{{ selectedBlock.fontSize }} px</span>\n          <button class=\"hh-btn hh-btn--small\" type=\"button\" aria-label=\"Letter groter\" :disabled=\"disabled || selectedBlock.fontSize >= 24\" @click=\"changeFont(selected, 1)\">A+</button>\n        </span>\n        <span v-if=\"selected !== 'logo'\" class=\"designer__group\" role=\"group\" aria-label=\"Uitlijning\">\n          <button\n            v-for=\"align in aligns\"\n            :key=\"align.value\"\n            class=\"hh-btn hh-btn--small\"\n            :class=\"{ 'designer__align--active': selectedBlock.align === align.value }\"\n            type=\"button\"\n            :aria-pressed=\"selectedBlock.align === align.value\"\n            :disabled=\"disabled\"\n            @click=\"update(selected, { align: align.value })\"\n          >\n            {{ align.label }}\n          </button>\n        </span>\n      </template>\n      <span v-else class=\"hh-muted\">Klik op een onderdeel om het aan te passen.</span>\n    </div>\n    <p id=\"designer-help\" class=\"designer__hint\">\n      Sleep onderdelen om ze te verplaatsen en gebruik de greep rechts om de breedte aan te passen.\n    </p>\n    <div class=\"designer__canvas\">\n      <InvoicePreview ref=\"preview\" :html=\"html\" fit @ready=\"onReady\">\n        <template #default=\"{ scale }\">\n          <div class=\"designer__overlay\" @pointerdown.self=\"selected = null\">\n            <div\n              class=\"designer__area\"\n              aria-hidden=\"true\"\n              :style=\"{ left: px(INVOICE_AREA_OFFSET.left, scale), top: px(INVOICE_AREA_OFFSET.top, scale), width: px(INVOICE_AREA.width, scale), height: px(INVOICE_AREA.height, scale) }\"\n            >\n              <span v-for=\"x in guides.x\" :key=\"`x${x}`\" class=\"designer__guide designer__guide--x\" :style=\"{ left: px(x, scale) }\" />\n              <span v-for=\"y in guides.y\" :key=\"`y${y}`\" class=\"designer__guide designer__guide--y\" :style=\"{ top: px(y, scale) }\" />\n            </div>\n            <button\n              v-for=\"id in visibleIds\"\n              :key=\"id\"\n              class=\"designer__block\"\n              :class=\"{ 'designer__block--selected': selected === id }\"\n              :style=\"boxStyle(id, scale)\"\n              type=\"button\"\n              :disabled=\"disabled\"\n              :aria-pressed=\"selected === id\"\n              :aria-label=\"describe(id)\"\n              aria-describedby=\"designer-help\"\n              @click=\"selected = id\"\n              @pointerdown=\"onPointerDown($event, id, 'move')\"\n              @pointermove=\"onPointerMove\"\n              @pointerup=\"onPointerUp\"\n              @pointercancel=\"onPointerUp\"\n            >\n              <span class=\"designer__label\">{{ INVOICE_BLOCK_LABELS[id] }}</span>\n              <span\n                v-if=\"selected === id\"\n                class=\"designer__handle\"\n                aria-hidden=\"true\"\n                title=\"Breedte aanpassen\"\n                @pointerdown=\"onPointerDown($event, id, 'resize')\"\n              />\n            </button>\n          </div>\n        </template>\n      </InvoicePreview>\n    </div>\n  </div>\n</template>\n\n<style scoped>\n.designer { min-width: 0; }\n.designer__toolbar {\n  position: sticky;\n  top: var(--hh-header-height, 64px);\n  z-index: 3;\n  background: var(--hh-surface);\n  display: flex;\n  align-items: center;\n  flex-wrap: wrap;\n  gap: 10px 16px;\n  min-height: 44px;\n  margin-bottom: 6px;\n  font-size: 14px;\n}\n.designer__group { display: inline-flex; align-items: center; gap: 6px; }\n.designer__readout { color: var(--hh-fg-muted); font-variant-numeric: tabular-nums; }\n.designer__align--active { border-color: var(--hh-accent); background: var(--hh-accent-soft); }\n.designer__hint { margin: 0 0 12px; color: var(--hh-fg-muted); font-size: 14px; line-height: 1.5; }\n.designer__canvas { min-width: 0; }\n.designer__overlay { position: absolute; inset: 0; touch-action: none; }\n.designer__area {\n  position: absolute;\n  outline: 1px dashed var(--hh-line-strong);\n  pointer-events: none;\n}\n.designer__guide { position: absolute; background: #d23f7a; }\n.designer__guide--x { top: 0; bottom: 0; width: 1px; }\n.designer__guide--y { left: 0; right: 0; height: 1px; }\n.designer__block {\n  position: absolute;\n  padding: 0;\n  border: 0;\n  border-radius: 2px;\n  background: transparent;\n  outline: 1px dashed transparent;\n  cursor: move;\n  touch-action: none;\n}\n.designer__block:hover { outline-color: var(--hh-accent); background: rgba(37, 122, 62, 0.04); }\n.designer__block:focus-visible { outline: 2px solid var(--hh-accent); outline-offset: 2px; }\n.designer__block--selected { z-index: 1; outline: 2px solid var(--hh-accent); background: rgba(37, 122, 62, 0.06); }\n.designer__label {\n  position: absolute;\n  left: -2px;\n  bottom: 100%;\n  padding: 1px 6px;\n  border-radius: 4px 4px 0 0;\n  background: var(--hh-accent);\n  color: var(--hh-accent-fg);\n  font-size: 11px;\n  white-space: nowrap;\n  opacity: 0;\n  pointer-events: none;\n}\n.designer__block:hover .designer__label,\n.designer__block:focus-visible .designer__label,\n.designer__block--selected .designer__label { opacity: 1; }\n.designer__handle {\n  position: absolute;\n  top: 50%;\n  right: -6px;\n  width: 10px;\n  height: 22px;\n  margin-top: -11px;\n  border: 2px solid var(--hh-accent);\n  border-radius: 4px;\n  background: var(--hh-surface);\n  cursor: ew-resize;\n}\n</style>\n","import { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, renderList as _renderList, Fragment as _Fragment, normalizeClass as _normalizeClass, normalizeStyle as _normalizeStyle, withModifiers as _withModifiers, withCtx as _withCtx, createVNode as _createVNode } from \"vue\"\n\nconst _hoisted_1 = { class: \"designer\" }\nconst _hoisted_2 = {\n  class: \"designer__toolbar\",\n  role: \"toolbar\",\n  \"aria-label\": \"Geselecteerd onderdeel\"\n}\nconst _hoisted_3 = { class: \"designer__name\" }\nconst _hoisted_4 = { class: \"designer__readout\" }\nconst _hoisted_5 = {\n  key: 0,\n  class: \"designer__group\"\n}\nconst _hoisted_6 = [\"disabled\"]\nconst _hoisted_7 = {\n  class: \"designer__readout\",\n  \"aria-live\": \"polite\"\n}\nconst _hoisted_8 = [\"disabled\"]\nconst _hoisted_9 = {\n  key: 1,\n  class: \"designer__group\",\n  role: \"group\",\n  \"aria-label\": \"Uitlijning\"\n}\nconst _hoisted_10 = [\"aria-pressed\", \"disabled\", \"onClick\"]\nconst _hoisted_11 = {\n  key: 1,\n  class: \"hh-muted\"\n}\nconst _hoisted_12 = { class: \"designer__canvas\" }\nconst _hoisted_13 = [\"disabled\", \"aria-pressed\", \"aria-label\", \"onClick\", \"onPointerdown\"]\nconst _hoisted_14 = { class: \"designer__label\" }\nconst _hoisted_15 = [\"onPointerdown\"]\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n    _createElementVNode(\"div\", _hoisted_2, [\n      ($setup.selected && $setup.selectedBlock)\n        ? (_openBlock(), _createElementBlock(_Fragment, { key: 0 }, [\n            _createElementVNode(\"strong\", _hoisted_3, _toDisplayString($setup.INVOICE_BLOCK_LABELS[$setup.selected]), 1 /* TEXT */),\n            _createElementVNode(\"span\", _hoisted_4, _toDisplayString($setup.selectedBlock.x) + \" × \" + _toDisplayString($setup.selectedBlock.y) + \" mm, \" + _toDisplayString($setup.selectedBlock.width) + \" mm breed\", 1 /* TEXT */),\n            ($setup.selected !== 'logo')\n              ? (_openBlock(), _createElementBlock(\"span\", _hoisted_5, [\n                  _createElementVNode(\"button\", {\n                    class: \"hh-btn hh-btn--small\",\n                    type: \"button\",\n                    \"aria-label\": \"Letter kleiner\",\n                    disabled: $props.disabled || $setup.selectedBlock.fontSize <= 8,\n                    onClick: _cache[0] || (_cache[0] = $event => ($setup.changeFont($setup.selected, -1)))\n                  }, \"A−\", 8 /* PROPS */, _hoisted_6),\n                  _createElementVNode(\"span\", _hoisted_7, _toDisplayString($setup.selectedBlock.fontSize) + \" px\", 1 /* TEXT */),\n                  _createElementVNode(\"button\", {\n                    class: \"hh-btn hh-btn--small\",\n                    type: \"button\",\n                    \"aria-label\": \"Letter groter\",\n                    disabled: $props.disabled || $setup.selectedBlock.fontSize >= 24,\n                    onClick: _cache[1] || (_cache[1] = $event => ($setup.changeFont($setup.selected, 1)))\n                  }, \"A+\", 8 /* PROPS */, _hoisted_8)\n                ]))\n              : _createCommentVNode(\"v-if\", true),\n            ($setup.selected !== 'logo')\n              ? (_openBlock(), _createElementBlock(\"span\", _hoisted_9, [\n                  (_openBlock(), _createElementBlock(_Fragment, null, _renderList($setup.aligns, (align) => {\n                    return _createElementVNode(\"button\", {\n                      key: align.value,\n                      class: _normalizeClass([\"hh-btn hh-btn--small\", { 'designer__align--active': $setup.selectedBlock.align === align.value }]),\n                      type: \"button\",\n                      \"aria-pressed\": $setup.selectedBlock.align === align.value,\n                      disabled: $props.disabled,\n                      onClick: $event => ($setup.update($setup.selected, { align: align.value }))\n                    }, _toDisplayString(align.label), 11 /* TEXT, CLASS, PROPS */, _hoisted_10)\n                  }), 64 /* STABLE_FRAGMENT */))\n                ]))\n              : _createCommentVNode(\"v-if\", true)\n          ], 64 /* STABLE_FRAGMENT */))\n        : (_openBlock(), _createElementBlock(\"span\", _hoisted_11, \"Klik op een onderdeel om het aan te passen.\"))\n    ]),\n    _cache[3] || (_cache[3] = _createElementVNode(\"p\", {\n      id: \"designer-help\",\n      class: \"designer__hint\"\n    }, \" Sleep onderdelen om ze te verplaatsen en gebruik de greep rechts om de breedte aan te passen. \", -1 /* CACHED */)),\n    _createElementVNode(\"div\", _hoisted_12, [\n      _createVNode($setup[\"InvoicePreview\"], {\n        ref: \"preview\",\n        html: $props.html,\n        fit: \"\",\n        onReady: $setup.onReady\n      }, {\n        default: _withCtx(({ scale }) => [\n          _createElementVNode(\"div\", {\n            class: \"designer__overlay\",\n            onPointerdown: _cache[2] || (_cache[2] = _withModifiers($event => ($setup.selected = null), [\"self\"]))\n          }, [\n            _createElementVNode(\"div\", {\n              class: \"designer__area\",\n              \"aria-hidden\": \"true\",\n              style: _normalizeStyle({ left: $setup.px($setup.INVOICE_AREA_OFFSET.left, scale), top: $setup.px($setup.INVOICE_AREA_OFFSET.top, scale), width: $setup.px($setup.INVOICE_AREA.width, scale), height: $setup.px($setup.INVOICE_AREA.height, scale) })\n            }, [\n              (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.guides.x, (x) => {\n                return (_openBlock(), _createElementBlock(\"span\", {\n                  key: `x${x}`,\n                  class: \"designer__guide designer__guide--x\",\n                  style: _normalizeStyle({ left: $setup.px(x, scale) })\n                }, null, 4 /* STYLE */))\n              }), 128 /* KEYED_FRAGMENT */)),\n              (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.guides.y, (y) => {\n                return (_openBlock(), _createElementBlock(\"span\", {\n                  key: `y${y}`,\n                  class: \"designer__guide designer__guide--y\",\n                  style: _normalizeStyle({ top: $setup.px(y, scale) })\n                }, null, 4 /* STYLE */))\n              }), 128 /* KEYED_FRAGMENT */))\n            ], 4 /* STYLE */),\n            (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.visibleIds, (id) => {\n              return (_openBlock(), _createElementBlock(\"button\", {\n                key: id,\n                class: _normalizeClass([\"designer__block\", { 'designer__block--selected': $setup.selected === id }]),\n                style: _normalizeStyle($setup.boxStyle(id, scale)),\n                type: \"button\",\n                disabled: $props.disabled,\n                \"aria-pressed\": $setup.selected === id,\n                \"aria-label\": $setup.describe(id),\n                \"aria-describedby\": \"designer-help\",\n                onClick: $event => ($setup.selected = id),\n                onPointerdown: $event => ($setup.onPointerDown($event, id, 'move')),\n                onPointermove: $setup.onPointerMove,\n                onPointerup: $setup.onPointerUp,\n                onPointercancel: $setup.onPointerUp\n              }, [\n                _createElementVNode(\"span\", _hoisted_14, _toDisplayString($setup.INVOICE_BLOCK_LABELS[id]), 1 /* TEXT */),\n                ($setup.selected === id)\n                  ? (_openBlock(), _createElementBlock(\"span\", {\n                      key: 0,\n                      class: \"designer__handle\",\n                      \"aria-hidden\": \"true\",\n                      title: \"Breedte aanpassen\",\n                      onPointerdown: $event => ($setup.onPointerDown($event, id, 'resize'))\n                    }, null, 40 /* PROPS, NEED_HYDRATION */, _hoisted_15))\n                  : _createCommentVNode(\"v-if\", true)\n              ], 46 /* CLASS, STYLE, PROPS, NEED_HYDRATION */, _hoisted_13))\n            }), 128 /* KEYED_FRAGMENT */))\n          ], 32 /* NEED_HYDRATION */)\n        ]),\n        _: 1 /* STABLE */\n      }, 8 /* PROPS */, [\"html\"])\n    ])\n  ]))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/InvoiceDesigner.vue?type=script\";import \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/InvoiceDesigner.vue?type=style&index=0\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/InvoiceDesigner.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/InvoiceDesigner.vue\";script.__scopeId = \"data-v-e1baa293\";export default script;","<script setup lang=\"ts\">\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, watch } from \"vue\";\nimport type { InvoiceStyle } from \"../../../../js/internal/services/invoice-style\";\nimport { DEFAULT_INVOICE_BLOCKS, resolveInvoiceBlocks, type InvoiceBlocks } from \"../../../../js/internal/invoice-layout\";\nimport { blocksFromDocument } from \"../lib/invoiceDesigner\";\nimport { useOrganizationDirty } from \"../lib/organization\";\nimport { useApi } from \"../lib/api\";\nimport FormField from \"./FormField.vue\";\nimport InvoicePreview from \"./InvoicePreview.vue\";\nimport InvoiceStyleSenderFields from \"./InvoiceStyleSenderFields.vue\";\nimport InvoiceDesigner from \"./InvoiceDesigner.vue\";\nimport AppDialog from \"./AppDialog.vue\";\n\nconst api = useApi();\n\nconst style = ref<InvoiceStyle | null>(null);\nconst savedStyle = ref(\"\");\nuseOrganizationDirty(() => savedStyle.value !== \"\" && JSON.stringify(style.value) !== savedStyle.value);\nconst loading = ref(true);\nconst saving = ref(false);\nconst uploading = ref(false);\nconst logoInput = ref<HTMLInputElement | null>(null);\nconst error = ref(\"\");\nconst logoError = ref(\"\");\nconst notice = ref(\"\");\nconst previewHtml = ref(\"\");\nconst previewError = ref(\"\");\nconst previewLoading = ref(false);\n// Blocks of the style that produced previewHtml; the designer shows the difference until the next render.\nconst renderedBlocks = ref<InvoiceBlocks>(resolveInvoiceBlocks(null));\nconst standardPreview = ref<InstanceType<typeof InvoicePreview> | null>(null);\nconst confirmReset = ref(false);\nconst confirmAdvanced = ref(false);\nconst colors = [\n  { value: \"#1f4e79\", label: \"Blauw\" },\n  { value: \"#257a3e\", label: \"Groen\" },\n  { value: \"#704583\", label: \"Paars\" },\n  { value: \"#943f36\", label: \"Rood\" },\n  { value: \"#30343b\", label: \"Antraciet\" },\n];\ntype Group = \"layout\" | \"logo\" | \"typography\" | \"sender\" | \"meta\" | \"footer\";\n// Template sections (data-section in invoice.witty) that each editor group changes.\nconst groupSections: Record<Group, string[]> = {\n  layout: [\"company\", \"logo\"],\n  logo: [\"logo\"],\n  typography: [],\n  sender: [\"customer\", \"company\"],\n  meta: [\"meta\"],\n  footer: [\"footertext\"],\n};\nconst openGroup = ref<Group | null>(null);\nconst highlight = computed(() => openGroup.value ? groupSections[openGroup.value] : []);\n\nfunction onToggle(group: Group, event: Event): void {\n  if ((event.target as HTMLDetailsElement).open) openGroup.value = group;\n  else if (openGroup.value === group) openGroup.value = null;\n}\n\nconst formElement = ref<HTMLFormElement | null>(null);\nconst previewSlot = ref<HTMLDivElement | null>(null);\nconst actionsElement = ref<HTMLDivElement | null>(null);\nconst previewMaxHeight = ref<string | undefined>();\nconst previewEditTargets = [\n  { selector: \"[data-block=title]\", field: \"#invoice-style-title-scale\", label: \"Titelgrootte aanpassen\" },\n  { selector: \"[data-section=logo]\", field: \"#invoice-style-logo-size\", label: \"Logo aanpassen\" },\n  { selector: \"[data-section=customer]\", field: \"#invoice-style-customer\", label: \"Klantadres uitlijnen\" },\n  { selector: \"[data-section=company]\", field: \".sender-fields input\", label: \"Afzendergegevens aanpassen\" },\n  { selector: \".meta\", field: \"#invoice-style-invoice-date\", label: \"Factuurgegevens uitlijnen\" },\n  { selector: \"[data-block=body]\", field: \"#invoice-style-font-size\", label: \"Tekstgrootte aanpassen\" },\n  { selector: \"[data-section=footertext]\", field: \"#invoice-style-footer\", label: \"Voettekst aanpassen\" },\n];\n\nasync function editPreviewField(selector: string): Promise<void> {\n  const field = formElement.value?.querySelector<HTMLElement>(selector);\n  const group = field?.closest(\"details\");\n  if (!field || !group) return;\n  group.open = true;\n  await nextTick();\n  field.focus({ preventScroll: true });\n  field.scrollIntoView({ block: \"nearest\" });\n  (field.closest<HTMLElement>(\".field, .sender-fields\") ?? field).animate(\n    [{ backgroundColor: \"rgba(47, 143, 91, 0.22)\" }, { backgroundColor: \"transparent\" }],\n    { duration: 1400, easing: \"ease-out\" },\n  );\n}\n\n/** Keeps the scrollable preview above the sticky action bar, also before the page scrolls. */\nfunction measurePreviewSpace(): void {\n  const form = formElement.value, slot = previewSlot.value, actions = actionsElement.value;\n  const column = slot?.parentElement;\n  if (!form || !slot || !column || !actions) return;\n  // The preview column is sticky, so derive its unscrolled position from the (static) form beside it.\n  const top = form.getBoundingClientRect().top + window.scrollY + slot.getBoundingClientRect().top - column.getBoundingClientRect().top;\n  previewMaxHeight.value = `${Math.max(360, window.innerHeight - top - actions.offsetHeight - 24)}px`;\n}\n\nlet previewTimer: ReturnType<typeof setTimeout> | undefined;\nlet previewRevision = 0;\nlet uploadRevision = 0;\n\nasync function load(): Promise<void> {\n  loading.value = true;\n  error.value = \"\";\n  try {\n    const loaded = await api.getInvoiceStyle();\n    // Complete partial block data up front, so normalising it never shows up as an unsaved change.\n    if (loaded.advanced || loaded.layout === \"advanced\") loaded.advanced = { blocks: resolveInvoiceBlocks(loaded.advanced?.blocks) };\n    style.value = loaded;\n    savedStyle.value = JSON.stringify(style.value);\n  } catch (e) {\n    error.value = e instanceof Error ? e.message : \"Kon de factuurhuisstijl niet laden.\";\n  } finally {\n    loading.value = false;\n  }\n}\n\nasync function preview(options: { value: InvoiceStyle; revision: number }): Promise<void> {\n  try {\n    const html = await api.previewInvoiceStyle({ style: options.value });\n    if (options.revision === previewRevision) {\n      renderedBlocks.value = resolveInvoiceBlocks(options.value.advanced?.blocks);\n      previewHtml.value = html;\n    }\n  } catch (e) {\n    if (options.revision === previewRevision) {\n      previewError.value = e instanceof Error ? e.message : \"Kon het voorbeeld niet laden.\";\n    }\n  } finally {\n    if (options.revision === previewRevision) previewLoading.value = false;\n  }\n}\n\nwatch(previewHtml, () => { void nextTick(measurePreviewSpace); });\n\nwatch(style, (value) => {\n  notice.value = \"\";\n  clearTimeout(previewTimer);\n  // Invalidate running requests immediately so an older response cannot replace the current design.\n  const revision = ++previewRevision;\n  if (!value) return;\n  previewLoading.value = true;\n  previewError.value = \"\";\n  const snapshot = JSON.parse(JSON.stringify(value)) as InvoiceStyle;\n  previewTimer = setTimeout(() => { void preview({ value: snapshot, revision }); }, 300);\n}, { deep: true });\n\n// The first switch to the designer starts from the positions the current layout shows, so nothing moves.\nwatch(() => style.value?.layout, (layout) => {\n  if (layout === \"advanced\" && style.value && !style.value.advanced)\n    style.value.advanced = { blocks: blocksFromDocument(standardPreview.value?.getDocument(), style.value.fontSize) };\n}, { flush: \"sync\" });\n\nfunction resetBlocks(): void {\n  confirmReset.value = false;\n  if (style.value) style.value.advanced = { blocks: structuredClone(DEFAULT_INVOICE_BLOCKS) };\n}\n\nfunction openAdvanced(): void {\n  if (!style.value) return;\n  confirmAdvanced.value = false;\n  style.value.layout = \"advanced\";\n}\n\nfunction setLogo(value: string | null): void {\n  ++uploadRevision;\n  uploading.value = false;\n  logoError.value = \"\";\n  if (style.value) style.value.logoDataUrl = value;\n}\n\nasync function uploadLogo(event: Event): Promise<void> {\n  const input = event.target as HTMLInputElement;\n  const file = input.files?.[0];\n  input.value = \"\";\n  if (!file) return;\n  const revision = ++uploadRevision;\n  uploading.value = false;\n  logoError.value = \"\";\n  notice.value = \"\";\n  if (![\"image/png\", \"image/jpeg\"].includes(file.type)) {\n    logoError.value = \"Kies een PNG- of JPG-afbeelding.\";\n    return;\n  }\n  if (file.size > 512 * 1024) {\n    logoError.value = \"Het logo mag maximaal 512 kB groot zijn. Kies een kleiner bestand.\";\n    return;\n  }\n  uploading.value = true;\n  try {\n    const dataUrl = await new Promise<string>((resolve, reject) => {\n      const reader = new FileReader();\n      reader.onload = () => typeof reader.result === \"string\" ? resolve(reader.result) : reject(new Error(\"Het logo kon niet worden gelezen.\"));\n      reader.onerror = () => { reject(new Error(\"Het logo kon niet worden gelezen.\")); };\n      reader.readAsDataURL(file);\n    });\n    const image = new Image();\n    image.src = dataUrl;\n    await image.decode();\n    if (image.naturalWidth > 10000 || image.naturalHeight > 10000) {\n      if (revision === uploadRevision) logoError.value = \"Het logo mag maximaal 10.000 pixels breed en hoog zijn. Kies een kleinere afbeelding.\";\n      return;\n    }\n    if (revision === uploadRevision && style.value) style.value.logoDataUrl = dataUrl;\n  } catch {\n    if (revision === uploadRevision) logoError.value = \"Deze afbeelding kan niet worden geopend. Kies een geldige PNG of JPG.\";\n  } finally {\n    if (revision === uploadRevision) uploading.value = false;\n  }\n}\n\nasync function save(): Promise<void> {\n  if (!style.value || uploading.value || saving.value) return;\n  saving.value = true;\n  error.value = \"\";\n  notice.value = \"\";\n  const snapshot = JSON.stringify(style.value);\n  try {\n    await api.updateInvoiceStyle({ style: JSON.parse(snapshot) as InvoiceStyle });\n    savedStyle.value = snapshot;\n    notice.value = \"Factuurhuisstijl opgeslagen.\";\n  } catch (e) {\n    error.value = e instanceof Error ? e.message : \"Opslaan mislukt. Probeer het opnieuw.\";\n  } finally {\n    saving.value = false;\n  }\n}\n\nfunction cancel(): void {\n  if (saving.value || !savedStyle.value) return;\n  ++uploadRevision;\n  uploading.value = false;\n  logoError.value = \"\";\n  error.value = \"\";\n  style.value = JSON.parse(savedStyle.value) as InvoiceStyle;\n}\n\nonMounted(() => {\n  void load();\n  window.addEventListener(\"resize\", measurePreviewSpace);\n});\nonBeforeUnmount(() => {\n  window.removeEventListener(\"resize\", measurePreviewSpace);\n  clearTimeout(previewTimer);\n  ++previewRevision;\n  ++uploadRevision;\n});\n</script>\n\n<template>\n  <section class=\"hh-card invoice-style\" aria-label=\"Factuurhuisstijl\" :aria-busy=\"loading\">\n    <p class=\"invoice-style__hint\">\n      Deze huisstijl geldt voor iedereen in deze administratie. Ook bestaande facturen krijgen deze opmaak bij opnieuw openen of downloaden.\n    </p>\n    <p v-if=\"loading\" class=\"hh-muted\" role=\"status\">Factuurhuisstijl laden...</p>\n    <div v-else-if=\"!style\">\n      <p class=\"hh-formerror\" role=\"alert\">{{ error }}</p>\n      <button class=\"hh-btn\" type=\"button\" @click=\"load\">Opnieuw proberen</button>\n    </div>\n    <form v-else-if=\"style.layout === 'advanced'\" id=\"invoice-style-form\" class=\"invoice-style__designer\" @submit.prevent=\"save\">\n      <fieldset class=\"invoice-style__fields\" :disabled=\"saving\">\n        <legend class=\"invoice-style__legend\">Geavanceerde factuuropmaak</legend>\n        <button class=\"hh-btn hh-btn--small invoice-style__back\" type=\"button\" @click=\"style.layout = 'standard'\">Terug naar eenvoudige opmaak</button>\n        <div class=\"invoice-style__bar\">\n          <FormField label=\"Titelgrootte\" for-id=\"invoice-style-title-scale\" hint=\"Factuur en factuurnummer, ten opzichte van de tekstgrootte van het titelblok.\">\n            <select id=\"invoice-style-title-scale\" v-model.number=\"style.titleScale\" class=\"hh-select\">\n              <option v-for=\"scale in [1, 1.25, 1.5, 1.75, 2, 2.5, 3]\" :key=\"scale\" :value=\"scale\">{{ scale * 100 }}%</option>\n            </select>\n          </FormField>\n          <FormField label=\"Lettertype\" for-id=\"invoice-style-font\">\n            <select id=\"invoice-style-font\" v-model=\"style.font\" class=\"hh-select\">\n              <option value=\"sans\">Modern (Arial)</option>\n              <option value=\"serif\">Klassiek (Georgia)</option>\n            </select>\n          </FormField>\n          <FormField label=\"Huisstijlkleur\" for-id=\"invoice-style-color\">\n            <div class=\"invoice-style__colors\">\n              <button\n                v-for=\"color in colors\"\n                :key=\"color.value\"\n                type=\"button\"\n                class=\"invoice-style__swatch\"\n                :class=\"{ 'invoice-style__swatch--selected': style.accentColor.toLowerCase() === color.value }\"\n                :style=\"{ backgroundColor: color.value }\"\n                :aria-label=\"color.label\"\n                :aria-pressed=\"style.accentColor.toLowerCase() === color.value\"\n                @click=\"style.accentColor = color.value\"\n              />\n              <input id=\"invoice-style-color\" v-model=\"style.accentColor\" class=\"invoice-style__color-picker\" type=\"color\" aria-label=\"Eigen huisstijlkleur kiezen\" />\n            </div>\n          </FormField>\n          <FormField label=\"Logo\" for-id=\"invoice-style-logo-picker\" :error=\"logoError\">\n            <div class=\"invoice-style__logo-actions\">\n              <input id=\"invoice-style-logo\" ref=\"logoInput\" hidden type=\"file\" accept=\"image/png,image/jpeg\" aria-label=\"Logo kiezen\" @change=\"uploadLogo\" />\n              <button id=\"invoice-style-logo-picker\" class=\"hh-btn hh-btn--small\" type=\"button\" @click=\"logoInput?.click()\">Logo kiezen</button>\n              <button v-if=\"style.logoDataUrl !== ''\" class=\"hh-btn hh-btn--small\" type=\"button\" @click=\"setLogo('')\">Geen logo</button>\n              <span v-if=\"uploading\" class=\"hh-muted\" role=\"status\">Logo controleren...</span>\n            </div>\n          </FormField>\n          <button class=\"hh-btn hh-btn--small invoice-style__reset\" type=\"button\" @click=\"confirmReset = true\">Standaardindeling herstellen</button>\n        </div>\n        <p v-if=\"previewError\" class=\"hh-formerror\" role=\"alert\">{{ previewError }}</p>\n        <InvoiceDesigner\n          v-if=\"previewHtml && style.advanced\"\n          v-model:blocks=\"style.advanced.blocks\"\n          :html=\"previewHtml\"\n          :rendered=\"renderedBlocks\"\n          :disabled=\"saving\"\n        />\n        <div v-else class=\"invoice-style__placeholder\" aria-hidden=\"true\" />\n      </fieldset>\n    </form>\n    <div v-else class=\"invoice-style__layout\">\n      <form id=\"invoice-style-form\" ref=\"formElement\" class=\"invoice-style__form\" @submit.prevent=\"save\">\n        <fieldset class=\"invoice-style__fields\" :disabled=\"saving\">\n          <legend class=\"invoice-style__legend\">Factuuropmaak aanpassen</legend>\n          <details class=\"invoice-style__group\" name=\"invoice-style-group\" @toggle=\"onToggle('layout', $event)\">\n            <summary class=\"invoice-style__summary\">Indeling</summary>\n            <div class=\"invoice-style__group-content\">\n              <div class=\"invoice-style__layouts\" role=\"radiogroup\" aria-label=\"Indeling\">\n                <label class=\"invoice-style__layout-option\">\n                  <input v-model=\"style.layout\" type=\"radio\" name=\"invoice-style-layout\" value=\"standard\" />\n                  <span>\n                    <strong>Standaard</strong>\n                    <span class=\"invoice-style__layout-desc\">Bedrijfsgegevens bovenaan of in de voet, naar keuze.</span>\n                  </span>\n                </label>\n                <label class=\"invoice-style__layout-option\">\n                  <input v-model=\"style.layout\" type=\"radio\" name=\"invoice-style-layout\" value=\"letterhead\" />\n                  <span>\n                    <strong>Briefpapier</strong>\n                    <span class=\"invoice-style__layout-desc\">Adresregel onder het logo; KVK, BTW, bank en e-mail onderaan de pagina.</span>\n                  </span>\n                </label>\n              </div>\n              <button class=\"hh-btn invoice-style__advanced\" type=\"button\" aria-haspopup=\"dialog\" @click=\"confirmAdvanced = true\">Geavanceerde editor openen</button>\n            </div>\n          </details>\n          <details class=\"invoice-style__group\" name=\"invoice-style-group\" @toggle=\"onToggle('logo', $event)\">\n            <summary class=\"invoice-style__summary\">Logo</summary>\n            <div class=\"invoice-style__group-content\">\n              <FormField label=\"Logo\" for-id=\"invoice-style-logo-picker\" hint=\"PNG of JPG, maximaal 512 kB en 10.000 pixels breed en hoog.\" :error=\"logoError\">\n                <div class=\"invoice-style__logo\">\n                  <img v-if=\"style.logoDataUrl\" class=\"invoice-style__logo-image\" :src=\"style.logoDataUrl\" alt=\"Eigen factuurlogo\" />\n                  <span class=\"hh-muted\">{{ style.logoDataUrl ? \"Eigen logo\" : style.logoDataUrl === null ? \"Oorspronkelijk logo\" : \"Geen logo\" }}</span>\n                </div>\n                <input\n                  id=\"invoice-style-logo\"\n                  ref=\"logoInput\"\n                  hidden\n                  type=\"file\"\n                  accept=\"image/png,image/jpeg\"\n                  aria-label=\"Logo kiezen\"\n                  :aria-invalid=\"Boolean(logoError)\"\n                  @change=\"uploadLogo\"\n                />\n                <button id=\"invoice-style-logo-picker\" class=\"hh-btn\" type=\"button\" :aria-invalid=\"Boolean(logoError)\" @click=\"logoInput?.click()\">Logo kiezen</button>\n                <p v-if=\"uploading\" class=\"invoice-style__hint\" role=\"status\">Logo controleren...</p>\n                <div class=\"invoice-style__logo-actions\">\n                  <button v-if=\"style.logoDataUrl !== ''\" class=\"hh-btn hh-btn--small\" type=\"button\" @click=\"setLogo('')\">Geen logo</button>\n                  <button v-if=\"style.logoDataUrl !== null\" class=\"hh-btn hh-btn--small\" type=\"button\" @click=\"setLogo(null)\">Oorspronkelijk logo</button>\n                </div>\n              </FormField>\n              <div class=\"invoice-style__grid\">\n                <FormField label=\"Positie logo\" for-id=\"invoice-style-logo-position\">\n                  <select id=\"invoice-style-logo-position\" v-model=\"style.logoPosition\" class=\"hh-select\" :disabled=\"style.logoDataUrl === ''\">\n                    <option value=\"left\">Links</option>\n                    <option value=\"right\">Rechts</option>\n                  </select>\n                </FormField>\n                <FormField label=\"Grootte logo\" for-id=\"invoice-style-logo-size\">\n                  <select id=\"invoice-style-logo-size\" v-model=\"style.logoSize\" class=\"hh-select\" :disabled=\"style.logoDataUrl === ''\">\n                    <option value=\"small\">Klein</option>\n                    <option value=\"medium\">Middel</option>\n                    <option value=\"large\">Groot</option>\n                  </select>\n                </FormField>\n              </div>\n            </div>\n          </details>\n          <details class=\"invoice-style__group\" name=\"invoice-style-group\" @toggle=\"onToggle('typography', $event)\">\n            <summary class=\"invoice-style__summary\">Typografie en kleur</summary>\n            <div class=\"invoice-style__group-content\">\n              <FormField label=\"Huisstijlkleur\" for-id=\"invoice-style-color\">\n                <div class=\"invoice-style__colors\">\n                  <button\n                    v-for=\"color in colors\"\n                    :key=\"color.value\"\n                    type=\"button\"\n                    class=\"invoice-style__swatch\"\n                    :class=\"{ 'invoice-style__swatch--selected': style.accentColor.toLowerCase() === color.value }\"\n                    :style=\"{ backgroundColor: color.value }\"\n                    :aria-label=\"color.label\"\n                    :aria-pressed=\"style.accentColor.toLowerCase() === color.value\"\n                    @click=\"style.accentColor = color.value\"\n                  />\n                  <input id=\"invoice-style-color\" v-model=\"style.accentColor\" class=\"invoice-style__color-picker\" type=\"color\" aria-label=\"Eigen huisstijlkleur kiezen\" />\n                  <span class=\"invoice-style__color-value\">{{ style.accentColor }}</span>\n                </div>\n              </FormField>\n              <FormField label=\"Lettertype\" for-id=\"invoice-style-font\">\n                <select id=\"invoice-style-font\" v-model=\"style.font\" class=\"hh-select\">\n                  <option value=\"sans\">Modern (Arial)</option>\n                  <option value=\"serif\">Klassiek (Georgia)</option>\n                </select>\n              </FormField>\n              <FormField label=\"Tekstgrootte\" for-id=\"invoice-style-font-size\">\n                <select id=\"invoice-style-font-size\" v-model.number=\"style.fontSize\" class=\"hh-select\">\n                  <option v-for=\"size in [10, 11, 12, 13, 14, 15, 16]\" :key=\"size\" :value=\"size\">{{ size }} px</option>\n                </select>\n              </FormField>\n              <FormField label=\"Titelgrootte\" for-id=\"invoice-style-title-scale\" hint=\"Factuur en factuurnummer, ten opzichte van de tekstgrootte. De oorspronkelijke grootte is 250%.\">\n                <select id=\"invoice-style-title-scale\" v-model.number=\"style.titleScale\" class=\"hh-select\">\n                  <option v-for=\"scale in [1, 1.25, 1.5, 1.75, 2, 2.5, 3]\" :key=\"scale\" :value=\"scale\">{{ scale * 100 }}%</option>\n                </select>\n              </FormField>\n            </div>\n          </details>\n          <details class=\"invoice-style__group\" name=\"invoice-style-group\" @toggle=\"onToggle('sender', $event)\">\n            <summary class=\"invoice-style__summary\">Adres en afzender</summary>\n            <div class=\"invoice-style__group-content\">\n              <div class=\"invoice-style__grid\">\n                <FormField label=\"Klantadres\" for-id=\"invoice-style-customer\">\n                  <select id=\"invoice-style-customer\" v-model=\"style.customerPosition\" class=\"hh-select\">\n                    <option value=\"left\">Links</option>\n                    <option value=\"right\">Rechts</option>\n                  </select>\n                </FormField>\n                <FormField v-if=\"style.layout === 'standard'\" label=\"Bedrijfsgegevens\" for-id=\"invoice-style-company\">\n                  <select id=\"invoice-style-company\" v-model=\"style.companyPosition\" class=\"hh-select\">\n                    <option value=\"header\">Bovenaan</option>\n                    <option value=\"footer\">In de voet</option>\n                  </select>\n                </FormField>\n              </div>\n              <p class=\"invoice-style__hint\">\n                Kies welke afzendergegevens zichtbaar zijn en pas de volgorde aan met de pijlen.\n                <template v-if=\"style.layout === 'letterhead'\">Naam, adres en telefoon staan onder het logo, de overige gegevens onderaan.</template>\n              </p>\n              <InvoiceStyleSenderFields v-model=\"style.companyFields\" />\n            </div>\n          </details>\n          <details class=\"invoice-style__group\" name=\"invoice-style-group\" @toggle=\"onToggle('meta', $event)\">\n            <summary class=\"invoice-style__summary\">Factuurgegevens</summary>\n            <div class=\"invoice-style__group-content\">\n              <p class=\"invoice-style__hint\">Het factuurnummer staat in de titel. Verdeel de datums over de twee kolommen daaronder.</p>\n              <FormField label=\"Factuurdatum\" for-id=\"invoice-style-invoice-date\">\n                <select id=\"invoice-style-invoice-date\" v-model=\"style.invoiceDatePosition\" class=\"hh-select\">\n                  <option value=\"left\">Linkerkolom</option>\n                  <option value=\"right\">Rechterkolom</option>\n                </select>\n              </FormField>\n              <FormField label=\"Vervaldatum\" for-id=\"invoice-style-due-date\">\n                <select id=\"invoice-style-due-date\" v-model=\"style.dueDatePosition\" class=\"hh-select\">\n                  <option value=\"left\">Linkerkolom</option>\n                  <option value=\"right\">Rechterkolom</option>\n                </select>\n              </FormField>\n            </div>\n          </details>\n          <details class=\"invoice-style__group\" name=\"invoice-style-group\" @toggle=\"onToggle('footer', $event)\">\n            <summary class=\"invoice-style__summary\">Voettekst</summary>\n            <div class=\"invoice-style__group-content\">\n              <FormField label=\"Voettekst\" for-id=\"invoice-style-footer\" hint=\"Bijvoorbeeld een bedankje of verwijzing naar je voorwaarden.\">\n                <textarea id=\"invoice-style-footer\" v-model=\"style.footerText\" class=\"hh-input\" rows=\"3\" maxlength=\"1000\" />\n              </FormField>\n            </div>\n          </details>\n        </fieldset>\n      </form>\n      <div class=\"invoice-style__preview\" :aria-busy=\"previewLoading\" :style=\"{ '--preview-max-height': previewMaxHeight }\">\n        <div class=\"invoice-style__preview-heading\">\n          <h3 class=\"invoice-style__legend\">Voorbeeld</h3>\n          <span v-if=\"previewLoading\" class=\"hh-muted\" role=\"status\">Bijwerken...</span>\n        </div>\n        <p class=\"invoice-style__hint\">Klik op een onderdeel om de bijbehorende instelling te openen. Wijzigingen worden pas bewaard na opslaan.</p>\n        <p v-if=\"previewError\" class=\"hh-formerror\" role=\"alert\">{{ previewError }}</p>\n        <div ref=\"previewSlot\" class=\"invoice-style__preview-scroll\" role=\"region\" aria-label=\"Factuurvoorbeeld\" tabindex=\"0\">\n          <InvoicePreview v-if=\"previewHtml\" ref=\"standardPreview\" :html=\"previewHtml\" :highlight=\"highlight\" :edit-targets=\"previewEditTargets\" fit @edit=\"editPreviewField\" />\n          <div v-else-if=\"previewLoading\" class=\"invoice-style__placeholder\" aria-hidden=\"true\" />\n        </div>\n      </div>\n    </div>\n    <AppDialog v-if=\"confirmAdvanced\" title=\"Geavanceerde factuuropmaak\" @close=\"confirmAdvanced = false\">\n      <p>Je kunt alle onderdelen vrij verplaatsen en de grootte aanpassen. Hierdoor kunnen teksten overlappen of buiten de pagina vallen. Controleer na wijzigingen altijd het voorbeeld en de PDF.</p>\n      <template #footer>\n        <button class=\"hh-btn\" type=\"button\" data-autofocus @click=\"confirmAdvanced = false\">Terug</button>\n        <button class=\"hh-btn hh-btn--primary\" type=\"button\" @click=\"openAdvanced\">Geavanceerde editor openen</button>\n      </template>\n    </AppDialog>\n    <AppDialog v-if=\"confirmReset\" title=\"Standaardindeling herstellen\" @close=\"confirmReset = false\">\n      <p>Alle onderdelen gaan terug naar hun standaardplek en lettergrootte. Je kunt dit nog ongedaan maken met Annuleren, zolang je niet opslaat.</p>\n      <template #footer>\n        <button class=\"hh-btn\" type=\"button\" data-autofocus @click=\"confirmReset = false\">Terug</button>\n        <button class=\"hh-btn hh-btn--primary\" type=\"button\" @click=\"resetBlocks\">Herstellen</button>\n      </template>\n    </AppDialog>\n    <div v-if=\"style && !loading\" ref=\"actionsElement\" class=\"invoice-style__actions\">\n      <div class=\"invoice-style__status\">\n        <p v-if=\"error\" class=\"hh-formerror\" role=\"alert\">{{ error }}</p>\n        <p v-if=\"notice\" class=\"invoice-style__notice\" role=\"status\">{{ notice }}</p>\n      </div>\n      <button class=\"hh-btn\" type=\"button\" :disabled=\"saving\" @click=\"cancel\">Annuleren</button>\n      <button class=\"hh-btn hh-btn--primary\" form=\"invoice-style-form\" type=\"submit\" :disabled=\"saving || uploading\">\n        {{ saving ? \"Opslaan...\" : \"Opslaan\" }}\n      </button>\n    </div>\n  </section>\n</template>\n\n<style scoped>\n.invoice-style {\n  min-width: 0;\n  margin-bottom: 18px;\n  padding: 14px;\n  overflow: clip;\n}\n.invoice-style__hint {\n  margin: 0 0 18px;\n  color: var(--hh-fg-muted);\n  font-size: 14px;\n  line-height: 1.5;\n}\n.invoice-style__layout {\n  display: grid;\n  grid-template-columns: minmax(0, 1fr);\n  gap: 24px;\n}\n.invoice-style__form,\n.invoice-style__preview {\n  min-width: 0;\n}\n.invoice-style__fields {\n  min-width: 0;\n  margin: 0;\n  padding: 0;\n  border: 0;\n}\n.invoice-style__legend {\n  margin: 0 0 14px;\n  padding: 0;\n  font-size: 15px;\n  font-weight: 700;\n}\n.invoice-style__grid {\n  display: grid;\n  grid-template-columns: minmax(0, 1fr);\n}\n.invoice-style__group { border-bottom: 1px solid var(--hh-line); }\n.invoice-style__summary { padding: 16px 0; font-weight: 700; cursor: pointer; }\n.invoice-style__group-content { padding-bottom: 12px; }\n.invoice-style__layouts { display: grid; gap: 8px; }\n.invoice-style__layout-option {\n  display: flex;\n  align-items: flex-start;\n  gap: 10px;\n  padding: 10px 12px;\n  border: 1px solid var(--hh-line);\n  border-radius: var(--hh-radius);\n  font-size: 14px;\n  cursor: pointer;\n}\n.invoice-style__layout-option:has(input:checked) { border-color: var(--hh-accent); background: var(--hh-surface-2); }\n.invoice-style__layout-option input { margin-top: 3px; cursor: pointer; }\n.invoice-style__layout-desc { display: block; color: var(--hh-fg-muted); }\n.invoice-style__advanced { margin-top: 16px; }\n.invoice-style__designer { min-width: 0; max-width: 900px; margin: 0 auto; }\n.invoice-style__back { margin-bottom: 16px; }\n.invoice-style__bar { display: flex; flex-wrap: wrap; align-items: flex-end; gap: 0 18px; }\n.invoice-style__bar :deep(.field) { margin-bottom: 12px; }\n.invoice-style__reset { margin: 0 0 14px auto; }\n.invoice-style__actions {\n  position: sticky;\n  bottom: 0;\n  z-index: 2;\n  display: flex;\n  justify-content: flex-end;\n  align-items: center;\n  flex-wrap: wrap;\n  gap: 10px;\n  margin-top: 20px;\n  padding: 14px 0 0;\n  border-top: 1px solid var(--hh-line);\n  background: var(--hh-surface);\n}\n.invoice-style__status { flex: 1; min-width: 120px; }\n.invoice-style__status p { margin: 0; }\n.invoice-style__logo {\n  display: flex;\n  align-items: center;\n  flex-wrap: wrap;\n  gap: 12px;\n  min-height: 72px;\n  margin-bottom: 8px;\n  padding: 8px 12px;\n  border: 1px solid var(--hh-line);\n  border-radius: var(--hh-radius);\n  background: var(--hh-surface-2);\n  font-size: 14px;\n}\n.invoice-style__logo-image {\n  max-width: 100%;\n  max-height: 72px;\n  object-fit: contain;\n}\n.invoice-style__logo-actions,\n.invoice-style__colors {\n  display: flex;\n  align-items: center;\n  flex-wrap: wrap;\n  gap: 8px;\n}\n.invoice-style__logo-actions {\n  margin-top: 8px;\n}\n.invoice-style__swatch {\n  width: 28px;\n  height: 28px;\n  padding: 0;\n  border: 2px solid var(--hh-surface);\n  border-radius: 50%;\n  box-shadow: 0 0 0 1px var(--hh-line-strong);\n}\n.invoice-style__swatch--selected {\n  box-shadow: 0 0 0 2px var(--hh-fg);\n}\n.invoice-style__color-picker {\n  width: 38px;\n  height: 30px;\n  padding: 2px;\n  border: 1px solid var(--hh-line-strong);\n  border-radius: var(--hh-radius);\n  background: var(--hh-surface);\n}\n.invoice-style__color-value {\n  color: var(--hh-fg-muted);\n  font-family: var(--hh-mono);\n  font-size: 14px;\n}\n.invoice-style__notice {\n  color: var(--hh-accent-strong);\n  font-size: 14px;\n}\n.invoice-style__preview-heading {\n  display: flex;\n  justify-content: space-between;\n  gap: 12px;\n  font-size: 14px;\n}\n.invoice-style__placeholder {\n  min-height: 480px;\n  border: 1px solid var(--hh-line);\n  border-radius: var(--hh-radius);\n  background: var(--hh-surface-2);\n}\n.invoice-style .hh-select,\n.invoice-style__color-picker,\n.invoice-style__swatch {\n  cursor: pointer;\n}\n.invoice-style__swatch:focus-visible,\n.invoice-style__color-picker:focus-visible {\n  outline: 2px solid var(--hh-accent);\n  outline-offset: 3px;\n}\n.invoice-style__swatch:disabled,\n.invoice-style__color-picker:disabled {\n  opacity: 0.55;\n  cursor: not-allowed;\n}\n.invoice-style__swatch:active {\n  transform: translateY(1px);\n}\n.invoice-style :deep(.field__label),\n.invoice-style :deep(.field__hint),\n.invoice-style :deep(.field__error) {\n  font-size: 14px;\n}\n@media (hover: hover) {\n  .invoice-style__swatch:hover {\n    outline: 2px solid var(--hh-line-strong);\n    outline-offset: 2px;\n  }\n}\n@media (min-width: 901px) {\n  .invoice-style__layout {\n    grid-template-columns: minmax(280px, 350px) minmax(0, 1fr);\n  }\n  .invoice-style__preview { position: sticky; top: calc(var(--hh-header-height, 64px) + 16px); align-self: start; }\n  .invoice-style__preview-scroll { max-height: var(--preview-max-height, none); overflow: auto; }\n}\n@media (min-width: 421px) {\n  .invoice-style {\n    padding: 18px;\n  }\n  .invoice-style__grid {\n    grid-template-columns: repeat(2, minmax(0, 1fr));\n    gap: 12px;\n  }\n}\n</style>\n","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString, renderList as _renderList, Fragment as _Fragment, vModelSelect as _vModelSelect, withDirectives as _withDirectives, withCtx as _withCtx, createVNode as _createVNode, normalizeClass as _normalizeClass, normalizeStyle as _normalizeStyle, vModelText as _vModelText, createBlock as _createBlock, withModifiers as _withModifiers, vModelRadio as _vModelRadio, createTextVNode as _createTextVNode } from \"vue\"\n\nconst _hoisted_1 = [\"aria-busy\"]\nconst _hoisted_2 = {\n  key: 0,\n  class: \"hh-muted\",\n  role: \"status\"\n}\nconst _hoisted_3 = { key: 1 }\nconst _hoisted_4 = {\n  class: \"hh-formerror\",\n  role: \"alert\"\n}\nconst _hoisted_5 = [\"disabled\"]\nconst _hoisted_6 = { class: \"invoice-style__bar\" }\nconst _hoisted_7 = [\"value\"]\nconst _hoisted_8 = { class: \"invoice-style__colors\" }\nconst _hoisted_9 = [\"aria-label\", \"aria-pressed\", \"onClick\"]\nconst _hoisted_10 = { class: \"invoice-style__logo-actions\" }\nconst _hoisted_11 = {\n  key: 1,\n  class: \"hh-muted\",\n  role: \"status\"\n}\nconst _hoisted_12 = {\n  key: 0,\n  class: \"hh-formerror\",\n  role: \"alert\"\n}\nconst _hoisted_13 = {\n  key: 2,\n  class: \"invoice-style__placeholder\",\n  \"aria-hidden\": \"true\"\n}\nconst _hoisted_14 = {\n  key: 3,\n  class: \"invoice-style__layout\"\n}\nconst _hoisted_15 = [\"disabled\"]\nconst _hoisted_16 = { class: \"invoice-style__group-content\" }\nconst _hoisted_17 = {\n  class: \"invoice-style__layouts\",\n  role: \"radiogroup\",\n  \"aria-label\": \"Indeling\"\n}\nconst _hoisted_18 = { class: \"invoice-style__layout-option\" }\nconst _hoisted_19 = { class: \"invoice-style__layout-option\" }\nconst _hoisted_20 = { class: \"invoice-style__group-content\" }\nconst _hoisted_21 = { class: \"invoice-style__logo\" }\nconst _hoisted_22 = [\"src\"]\nconst _hoisted_23 = { class: \"hh-muted\" }\nconst _hoisted_24 = [\"aria-invalid\"]\nconst _hoisted_25 = [\"aria-invalid\"]\nconst _hoisted_26 = {\n  key: 0,\n  class: \"invoice-style__hint\",\n  role: \"status\"\n}\nconst _hoisted_27 = { class: \"invoice-style__logo-actions\" }\nconst _hoisted_28 = { class: \"invoice-style__grid\" }\nconst _hoisted_29 = [\"disabled\"]\nconst _hoisted_30 = [\"disabled\"]\nconst _hoisted_31 = { class: \"invoice-style__group-content\" }\nconst _hoisted_32 = { class: \"invoice-style__colors\" }\nconst _hoisted_33 = [\"aria-label\", \"aria-pressed\", \"onClick\"]\nconst _hoisted_34 = { class: \"invoice-style__color-value\" }\nconst _hoisted_35 = [\"value\"]\nconst _hoisted_36 = [\"value\"]\nconst _hoisted_37 = { class: \"invoice-style__group-content\" }\nconst _hoisted_38 = { class: \"invoice-style__grid\" }\nconst _hoisted_39 = { class: \"invoice-style__hint\" }\nconst _hoisted_40 = { class: \"invoice-style__group-content\" }\nconst _hoisted_41 = { class: \"invoice-style__group-content\" }\nconst _hoisted_42 = [\"aria-busy\"]\nconst _hoisted_43 = { class: \"invoice-style__preview-heading\" }\nconst _hoisted_44 = {\n  key: 0,\n  class: \"hh-muted\",\n  role: \"status\"\n}\nconst _hoisted_45 = {\n  key: 0,\n  class: \"hh-formerror\",\n  role: \"alert\"\n}\nconst _hoisted_46 = {\n  ref: \"previewSlot\",\n  class: \"invoice-style__preview-scroll\",\n  role: \"region\",\n  \"aria-label\": \"Factuurvoorbeeld\",\n  tabindex: \"0\"\n}\nconst _hoisted_47 = {\n  key: 1,\n  class: \"invoice-style__placeholder\",\n  \"aria-hidden\": \"true\"\n}\nconst _hoisted_48 = {\n  key: 6,\n  ref: \"actionsElement\",\n  class: \"invoice-style__actions\"\n}\nconst _hoisted_49 = { class: \"invoice-style__status\" }\nconst _hoisted_50 = {\n  key: 0,\n  class: \"hh-formerror\",\n  role: \"alert\"\n}\nconst _hoisted_51 = {\n  key: 1,\n  class: \"invoice-style__notice\",\n  role: \"status\"\n}\nconst _hoisted_52 = [\"disabled\"]\nconst _hoisted_53 = [\"disabled\"]\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return (_openBlock(), _createElementBlock(\"section\", {\n    class: \"hh-card invoice-style\",\n    \"aria-label\": \"Factuurhuisstijl\",\n    \"aria-busy\": $setup.loading\n  }, [\n    _cache[60] || (_cache[60] = _createElementVNode(\"p\", { class: \"invoice-style__hint\" }, \" Deze huisstijl geldt voor iedereen in deze administratie. Ook bestaande facturen krijgen deze opmaak bij opnieuw openen of downloaden. \", -1 /* CACHED */)),\n    ($setup.loading)\n      ? (_openBlock(), _createElementBlock(\"p\", _hoisted_2, \"Factuurhuisstijl laden...\"))\n      : (!$setup.style)\n        ? (_openBlock(), _createElementBlock(\"div\", _hoisted_3, [\n            _createElementVNode(\"p\", _hoisted_4, _toDisplayString($setup.error), 1 /* TEXT */),\n            _createElementVNode(\"button\", {\n              class: \"hh-btn\",\n              type: \"button\",\n              onClick: $setup.load\n            }, \"Opnieuw proberen\")\n          ]))\n        : ($setup.style.layout === 'advanced')\n          ? (_openBlock(), _createElementBlock(\"form\", {\n              key: 2,\n              id: \"invoice-style-form\",\n              class: \"invoice-style__designer\",\n              onSubmit: _withModifiers($setup.save, [\"prevent\"])\n            }, [\n              _createElementVNode(\"fieldset\", {\n                class: \"invoice-style__fields\",\n                disabled: $setup.saving\n              }, [\n                _cache[37] || (_cache[37] = _createElementVNode(\"legend\", { class: \"invoice-style__legend\" }, \"Geavanceerde factuuropmaak\", -1 /* CACHED */)),\n                _createElementVNode(\"button\", {\n                  class: \"hh-btn hh-btn--small invoice-style__back\",\n                  type: \"button\",\n                  onClick: _cache[0] || (_cache[0] = $event => ($setup.style.layout = 'standard'))\n                }, \"Terug naar eenvoudige opmaak\"),\n                _createElementVNode(\"div\", _hoisted_6, [\n                  _createVNode($setup[\"FormField\"], {\n                    label: \"Titelgrootte\",\n                    \"for-id\": \"invoice-style-title-scale\",\n                    hint: \"Factuur en factuurnummer, ten opzichte van de tekstgrootte van het titelblok.\"\n                  }, {\n                    default: _withCtx(() => [\n                      _withDirectives(_createElementVNode(\"select\", {\n                        id: \"invoice-style-title-scale\",\n                        \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => (($setup.style.titleScale) = $event)),\n                        class: \"hh-select\"\n                      }, [\n                        (_openBlock(), _createElementBlock(_Fragment, null, _renderList([1, 1.25, 1.5, 1.75, 2, 2.5, 3], (scale) => {\n                          return _createElementVNode(\"option\", {\n                            key: scale,\n                            value: scale\n                          }, _toDisplayString(scale * 100) + \"%\", 9 /* TEXT, PROPS */, _hoisted_7)\n                        }), 64 /* STABLE_FRAGMENT */))\n                      ], 512 /* NEED_PATCH */), [\n                        [\n                          _vModelSelect,\n                          $setup.style.titleScale,\n                          void 0,\n                          { number: true }\n                        ]\n                      ])\n                    ]),\n                    _: 1 /* STABLE */\n                  }),\n                  _createVNode($setup[\"FormField\"], {\n                    label: \"Lettertype\",\n                    \"for-id\": \"invoice-style-font\"\n                  }, {\n                    default: _withCtx(() => [\n                      _withDirectives(_createElementVNode(\"select\", {\n                        id: \"invoice-style-font\",\n                        \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => (($setup.style.font) = $event)),\n                        class: \"hh-select\"\n                      }, _cache[36] || (_cache[36] = [\n                        _createElementVNode(\"option\", { value: \"sans\" }, \"Modern (Arial)\", -1 /* CACHED */),\n                        _createElementVNode(\"option\", { value: \"serif\" }, \"Klassiek (Georgia)\", -1 /* CACHED */)\n                      ]), 512 /* NEED_PATCH */), [\n                        [_vModelSelect, $setup.style.font]\n                      ])\n                    ]),\n                    _: 1 /* STABLE */\n                  }),\n                  _createVNode($setup[\"FormField\"], {\n                    label: \"Huisstijlkleur\",\n                    \"for-id\": \"invoice-style-color\"\n                  }, {\n                    default: _withCtx(() => [\n                      _createElementVNode(\"div\", _hoisted_8, [\n                        (_openBlock(), _createElementBlock(_Fragment, null, _renderList($setup.colors, (color) => {\n                          return _createElementVNode(\"button\", {\n                            key: color.value,\n                            type: \"button\",\n                            class: _normalizeClass([\"invoice-style__swatch\", { 'invoice-style__swatch--selected': $setup.style.accentColor.toLowerCase() === color.value }]),\n                            style: _normalizeStyle({ backgroundColor: color.value }),\n                            \"aria-label\": color.label,\n                            \"aria-pressed\": $setup.style.accentColor.toLowerCase() === color.value,\n                            onClick: $event => ($setup.style.accentColor = color.value)\n                          }, null, 14 /* CLASS, STYLE, PROPS */, _hoisted_9)\n                        }), 64 /* STABLE_FRAGMENT */)),\n                        _withDirectives(_createElementVNode(\"input\", {\n                          id: \"invoice-style-color\",\n                          \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => (($setup.style.accentColor) = $event)),\n                          class: \"invoice-style__color-picker\",\n                          type: \"color\",\n                          \"aria-label\": \"Eigen huisstijlkleur kiezen\"\n                        }, null, 512 /* NEED_PATCH */), [\n                          [_vModelText, $setup.style.accentColor]\n                        ])\n                      ])\n                    ]),\n                    _: 1 /* STABLE */\n                  }),\n                  _createVNode($setup[\"FormField\"], {\n                    label: \"Logo\",\n                    \"for-id\": \"invoice-style-logo-picker\",\n                    error: $setup.logoError\n                  }, {\n                    default: _withCtx(() => [\n                      _createElementVNode(\"div\", _hoisted_10, [\n                        _createElementVNode(\"input\", {\n                          id: \"invoice-style-logo\",\n                          ref: \"logoInput\",\n                          hidden: \"\",\n                          type: \"file\",\n                          accept: \"image/png,image/jpeg\",\n                          \"aria-label\": \"Logo kiezen\",\n                          onChange: $setup.uploadLogo\n                        }, null, 544 /* NEED_HYDRATION, NEED_PATCH */),\n                        _createElementVNode(\"button\", {\n                          id: \"invoice-style-logo-picker\",\n                          class: \"hh-btn hh-btn--small\",\n                          type: \"button\",\n                          onClick: _cache[4] || (_cache[4] = $event => ($setup.logoInput?.click()))\n                        }, \"Logo kiezen\"),\n                        ($setup.style.logoDataUrl !== '')\n                          ? (_openBlock(), _createElementBlock(\"button\", {\n                              key: 0,\n                              class: \"hh-btn hh-btn--small\",\n                              type: \"button\",\n                              onClick: _cache[5] || (_cache[5] = $event => ($setup.setLogo('')))\n                            }, \"Geen logo\"))\n                          : _createCommentVNode(\"v-if\", true),\n                        ($setup.uploading)\n                          ? (_openBlock(), _createElementBlock(\"span\", _hoisted_11, \"Logo controleren...\"))\n                          : _createCommentVNode(\"v-if\", true)\n                      ])\n                    ]),\n                    _: 1 /* STABLE */\n                  }, 8 /* PROPS */, [\"error\"]),\n                  _createElementVNode(\"button\", {\n                    class: \"hh-btn hh-btn--small invoice-style__reset\",\n                    type: \"button\",\n                    onClick: _cache[6] || (_cache[6] = $event => ($setup.confirmReset = true))\n                  }, \"Standaardindeling herstellen\")\n                ]),\n                ($setup.previewError)\n                  ? (_openBlock(), _createElementBlock(\"p\", _hoisted_12, _toDisplayString($setup.previewError), 1 /* TEXT */))\n                  : _createCommentVNode(\"v-if\", true),\n                ($setup.previewHtml && $setup.style.advanced)\n                  ? (_openBlock(), _createBlock($setup[\"InvoiceDesigner\"], {\n                      key: 1,\n                      blocks: $setup.style.advanced.blocks,\n                      \"onUpdate:blocks\": _cache[7] || (_cache[7] = $event => (($setup.style.advanced.blocks) = $event)),\n                      html: $setup.previewHtml,\n                      rendered: $setup.renderedBlocks,\n                      disabled: $setup.saving\n                    }, null, 8 /* PROPS */, [\"blocks\", \"html\", \"rendered\", \"disabled\"]))\n                  : (_openBlock(), _createElementBlock(\"div\", _hoisted_13))\n              ], 8 /* PROPS */, _hoisted_5)\n            ], 32 /* NEED_HYDRATION */))\n          : (_openBlock(), _createElementBlock(\"div\", _hoisted_14, [\n              _createElementVNode(\"form\", {\n                id: \"invoice-style-form\",\n                ref: \"formElement\",\n                class: \"invoice-style__form\",\n                onSubmit: _withModifiers($setup.save, [\"prevent\"])\n              }, [\n                _createElementVNode(\"fieldset\", {\n                  class: \"invoice-style__fields\",\n                  disabled: $setup.saving\n                }, [\n                  _cache[55] || (_cache[55] = _createElementVNode(\"legend\", { class: \"invoice-style__legend\" }, \"Factuuropmaak aanpassen\", -1 /* CACHED */)),\n                  _createElementVNode(\"details\", {\n                    class: \"invoice-style__group\",\n                    name: \"invoice-style-group\",\n                    onToggle: _cache[11] || (_cache[11] = $event => ($setup.onToggle('layout', $event)))\n                  }, [\n                    _cache[40] || (_cache[40] = _createElementVNode(\"summary\", { class: \"invoice-style__summary\" }, \"Indeling\", -1 /* CACHED */)),\n                    _createElementVNode(\"div\", _hoisted_16, [\n                      _createElementVNode(\"div\", _hoisted_17, [\n                        _createElementVNode(\"label\", _hoisted_18, [\n                          _withDirectives(_createElementVNode(\"input\", {\n                            \"onUpdate:modelValue\": _cache[8] || (_cache[8] = $event => (($setup.style.layout) = $event)),\n                            type: \"radio\",\n                            name: \"invoice-style-layout\",\n                            value: \"standard\"\n                          }, null, 512 /* NEED_PATCH */), [\n                            [_vModelRadio, $setup.style.layout]\n                          ]),\n                          _cache[38] || (_cache[38] = _createElementVNode(\"span\", null, [\n                            _createElementVNode(\"strong\", null, \"Standaard\"),\n                            _createElementVNode(\"span\", { class: \"invoice-style__layout-desc\" }, \"Bedrijfsgegevens bovenaan of in de voet, naar keuze.\")\n                          ], -1 /* CACHED */))\n                        ]),\n                        _createElementVNode(\"label\", _hoisted_19, [\n                          _withDirectives(_createElementVNode(\"input\", {\n                            \"onUpdate:modelValue\": _cache[9] || (_cache[9] = $event => (($setup.style.layout) = $event)),\n                            type: \"radio\",\n                            name: \"invoice-style-layout\",\n                            value: \"letterhead\"\n                          }, null, 512 /* NEED_PATCH */), [\n                            [_vModelRadio, $setup.style.layout]\n                          ]),\n                          _cache[39] || (_cache[39] = _createElementVNode(\"span\", null, [\n                            _createElementVNode(\"strong\", null, \"Briefpapier\"),\n                            _createElementVNode(\"span\", { class: \"invoice-style__layout-desc\" }, \"Adresregel onder het logo; KVK, BTW, bank en e-mail onderaan de pagina.\")\n                          ], -1 /* CACHED */))\n                        ])\n                      ]),\n                      _createElementVNode(\"button\", {\n                        class: \"hh-btn invoice-style__advanced\",\n                        type: \"button\",\n                        \"aria-haspopup\": \"dialog\",\n                        onClick: _cache[10] || (_cache[10] = $event => ($setup.confirmAdvanced = true))\n                      }, \"Geavanceerde editor openen\")\n                    ])\n                  ], 32 /* NEED_HYDRATION */),\n                  _createElementVNode(\"details\", {\n                    class: \"invoice-style__group\",\n                    name: \"invoice-style-group\",\n                    onToggle: _cache[17] || (_cache[17] = $event => ($setup.onToggle('logo', $event)))\n                  }, [\n                    _cache[43] || (_cache[43] = _createElementVNode(\"summary\", { class: \"invoice-style__summary\" }, \"Logo\", -1 /* CACHED */)),\n                    _createElementVNode(\"div\", _hoisted_20, [\n                      _createVNode($setup[\"FormField\"], {\n                        label: \"Logo\",\n                        \"for-id\": \"invoice-style-logo-picker\",\n                        hint: \"PNG of JPG, maximaal 512 kB en 10.000 pixels breed en hoog.\",\n                        error: $setup.logoError\n                      }, {\n                        default: _withCtx(() => [\n                          _createElementVNode(\"div\", _hoisted_21, [\n                            ($setup.style.logoDataUrl)\n                              ? (_openBlock(), _createElementBlock(\"img\", {\n                                  key: 0,\n                                  class: \"invoice-style__logo-image\",\n                                  src: $setup.style.logoDataUrl,\n                                  alt: \"Eigen factuurlogo\"\n                                }, null, 8 /* PROPS */, _hoisted_22))\n                              : _createCommentVNode(\"v-if\", true),\n                            _createElementVNode(\"span\", _hoisted_23, _toDisplayString($setup.style.logoDataUrl ? \"Eigen logo\" : $setup.style.logoDataUrl === null ? \"Oorspronkelijk logo\" : \"Geen logo\"), 1 /* TEXT */)\n                          ]),\n                          _createElementVNode(\"input\", {\n                            id: \"invoice-style-logo\",\n                            ref: \"logoInput\",\n                            hidden: \"\",\n                            type: \"file\",\n                            accept: \"image/png,image/jpeg\",\n                            \"aria-label\": \"Logo kiezen\",\n                            \"aria-invalid\": Boolean($setup.logoError),\n                            onChange: $setup.uploadLogo\n                          }, null, 40 /* PROPS, NEED_HYDRATION */, _hoisted_24),\n                          _createElementVNode(\"button\", {\n                            id: \"invoice-style-logo-picker\",\n                            class: \"hh-btn\",\n                            type: \"button\",\n                            \"aria-invalid\": Boolean($setup.logoError),\n                            onClick: _cache[12] || (_cache[12] = $event => ($setup.logoInput?.click()))\n                          }, \"Logo kiezen\", 8 /* PROPS */, _hoisted_25),\n                          ($setup.uploading)\n                            ? (_openBlock(), _createElementBlock(\"p\", _hoisted_26, \"Logo controleren...\"))\n                            : _createCommentVNode(\"v-if\", true),\n                          _createElementVNode(\"div\", _hoisted_27, [\n                            ($setup.style.logoDataUrl !== '')\n                              ? (_openBlock(), _createElementBlock(\"button\", {\n                                  key: 0,\n                                  class: \"hh-btn hh-btn--small\",\n                                  type: \"button\",\n                                  onClick: _cache[13] || (_cache[13] = $event => ($setup.setLogo('')))\n                                }, \"Geen logo\"))\n                              : _createCommentVNode(\"v-if\", true),\n                            ($setup.style.logoDataUrl !== null)\n                              ? (_openBlock(), _createElementBlock(\"button\", {\n                                  key: 1,\n                                  class: \"hh-btn hh-btn--small\",\n                                  type: \"button\",\n                                  onClick: _cache[14] || (_cache[14] = $event => ($setup.setLogo(null)))\n                                }, \"Oorspronkelijk logo\"))\n                              : _createCommentVNode(\"v-if\", true)\n                          ])\n                        ]),\n                        _: 1 /* STABLE */\n                      }, 8 /* PROPS */, [\"error\"]),\n                      _createElementVNode(\"div\", _hoisted_28, [\n                        _createVNode($setup[\"FormField\"], {\n                          label: \"Positie logo\",\n                          \"for-id\": \"invoice-style-logo-position\"\n                        }, {\n                          default: _withCtx(() => [\n                            _withDirectives(_createElementVNode(\"select\", {\n                              id: \"invoice-style-logo-position\",\n                              \"onUpdate:modelValue\": _cache[15] || (_cache[15] = $event => (($setup.style.logoPosition) = $event)),\n                              class: \"hh-select\",\n                              disabled: $setup.style.logoDataUrl === ''\n                            }, _cache[41] || (_cache[41] = [\n                              _createElementVNode(\"option\", { value: \"left\" }, \"Links\", -1 /* CACHED */),\n                              _createElementVNode(\"option\", { value: \"right\" }, \"Rechts\", -1 /* CACHED */)\n                            ]), 8 /* PROPS */, _hoisted_29), [\n                              [_vModelSelect, $setup.style.logoPosition]\n                            ])\n                          ]),\n                          _: 1 /* STABLE */\n                        }),\n                        _createVNode($setup[\"FormField\"], {\n                          label: \"Grootte logo\",\n                          \"for-id\": \"invoice-style-logo-size\"\n                        }, {\n                          default: _withCtx(() => [\n                            _withDirectives(_createElementVNode(\"select\", {\n                              id: \"invoice-style-logo-size\",\n                              \"onUpdate:modelValue\": _cache[16] || (_cache[16] = $event => (($setup.style.logoSize) = $event)),\n                              class: \"hh-select\",\n                              disabled: $setup.style.logoDataUrl === ''\n                            }, _cache[42] || (_cache[42] = [\n                              _createElementVNode(\"option\", { value: \"small\" }, \"Klein\", -1 /* CACHED */),\n                              _createElementVNode(\"option\", { value: \"medium\" }, \"Middel\", -1 /* CACHED */),\n                              _createElementVNode(\"option\", { value: \"large\" }, \"Groot\", -1 /* CACHED */)\n                            ]), 8 /* PROPS */, _hoisted_30), [\n                              [_vModelSelect, $setup.style.logoSize]\n                            ])\n                          ]),\n                          _: 1 /* STABLE */\n                        })\n                      ])\n                    ])\n                  ], 32 /* NEED_HYDRATION */),\n                  _createElementVNode(\"details\", {\n                    class: \"invoice-style__group\",\n                    name: \"invoice-style-group\",\n                    onToggle: _cache[22] || (_cache[22] = $event => ($setup.onToggle('typography', $event)))\n                  }, [\n                    _cache[45] || (_cache[45] = _createElementVNode(\"summary\", { class: \"invoice-style__summary\" }, \"Typografie en kleur\", -1 /* CACHED */)),\n                    _createElementVNode(\"div\", _hoisted_31, [\n                      _createVNode($setup[\"FormField\"], {\n                        label: \"Huisstijlkleur\",\n                        \"for-id\": \"invoice-style-color\"\n                      }, {\n                        default: _withCtx(() => [\n                          _createElementVNode(\"div\", _hoisted_32, [\n                            (_openBlock(), _createElementBlock(_Fragment, null, _renderList($setup.colors, (color) => {\n                              return _createElementVNode(\"button\", {\n                                key: color.value,\n                                type: \"button\",\n                                class: _normalizeClass([\"invoice-style__swatch\", { 'invoice-style__swatch--selected': $setup.style.accentColor.toLowerCase() === color.value }]),\n                                style: _normalizeStyle({ backgroundColor: color.value }),\n                                \"aria-label\": color.label,\n                                \"aria-pressed\": $setup.style.accentColor.toLowerCase() === color.value,\n                                onClick: $event => ($setup.style.accentColor = color.value)\n                              }, null, 14 /* CLASS, STYLE, PROPS */, _hoisted_33)\n                            }), 64 /* STABLE_FRAGMENT */)),\n                            _withDirectives(_createElementVNode(\"input\", {\n                              id: \"invoice-style-color\",\n                              \"onUpdate:modelValue\": _cache[18] || (_cache[18] = $event => (($setup.style.accentColor) = $event)),\n                              class: \"invoice-style__color-picker\",\n                              type: \"color\",\n                              \"aria-label\": \"Eigen huisstijlkleur kiezen\"\n                            }, null, 512 /* NEED_PATCH */), [\n                              [_vModelText, $setup.style.accentColor]\n                            ]),\n                            _createElementVNode(\"span\", _hoisted_34, _toDisplayString($setup.style.accentColor), 1 /* TEXT */)\n                          ])\n                        ]),\n                        _: 1 /* STABLE */\n                      }),\n                      _createVNode($setup[\"FormField\"], {\n                        label: \"Lettertype\",\n                        \"for-id\": \"invoice-style-font\"\n                      }, {\n                        default: _withCtx(() => [\n                          _withDirectives(_createElementVNode(\"select\", {\n                            id: \"invoice-style-font\",\n                            \"onUpdate:modelValue\": _cache[19] || (_cache[19] = $event => (($setup.style.font) = $event)),\n                            class: \"hh-select\"\n                          }, _cache[44] || (_cache[44] = [\n                            _createElementVNode(\"option\", { value: \"sans\" }, \"Modern (Arial)\", -1 /* CACHED */),\n                            _createElementVNode(\"option\", { value: \"serif\" }, \"Klassiek (Georgia)\", -1 /* CACHED */)\n                          ]), 512 /* NEED_PATCH */), [\n                            [_vModelSelect, $setup.style.font]\n                          ])\n                        ]),\n                        _: 1 /* STABLE */\n                      }),\n                      _createVNode($setup[\"FormField\"], {\n                        label: \"Tekstgrootte\",\n                        \"for-id\": \"invoice-style-font-size\"\n                      }, {\n                        default: _withCtx(() => [\n                          _withDirectives(_createElementVNode(\"select\", {\n                            id: \"invoice-style-font-size\",\n                            \"onUpdate:modelValue\": _cache[20] || (_cache[20] = $event => (($setup.style.fontSize) = $event)),\n                            class: \"hh-select\"\n                          }, [\n                            (_openBlock(), _createElementBlock(_Fragment, null, _renderList([10, 11, 12, 13, 14, 15, 16], (size) => {\n                              return _createElementVNode(\"option\", {\n                                key: size,\n                                value: size\n                              }, _toDisplayString(size) + \" px\", 9 /* TEXT, PROPS */, _hoisted_35)\n                            }), 64 /* STABLE_FRAGMENT */))\n                          ], 512 /* NEED_PATCH */), [\n                            [\n                              _vModelSelect,\n                              $setup.style.fontSize,\n                              void 0,\n                              { number: true }\n                            ]\n                          ])\n                        ]),\n                        _: 1 /* STABLE */\n                      }),\n                      _createVNode($setup[\"FormField\"], {\n                        label: \"Titelgrootte\",\n                        \"for-id\": \"invoice-style-title-scale\",\n                        hint: \"Factuur en factuurnummer, ten opzichte van de tekstgrootte. De oorspronkelijke grootte is 250%.\"\n                      }, {\n                        default: _withCtx(() => [\n                          _withDirectives(_createElementVNode(\"select\", {\n                            id: \"invoice-style-title-scale\",\n                            \"onUpdate:modelValue\": _cache[21] || (_cache[21] = $event => (($setup.style.titleScale) = $event)),\n                            class: \"hh-select\"\n                          }, [\n                            (_openBlock(), _createElementBlock(_Fragment, null, _renderList([1, 1.25, 1.5, 1.75, 2, 2.5, 3], (scale) => {\n                              return _createElementVNode(\"option\", {\n                                key: scale,\n                                value: scale\n                              }, _toDisplayString(scale * 100) + \"%\", 9 /* TEXT, PROPS */, _hoisted_36)\n                            }), 64 /* STABLE_FRAGMENT */))\n                          ], 512 /* NEED_PATCH */), [\n                            [\n                              _vModelSelect,\n                              $setup.style.titleScale,\n                              void 0,\n                              { number: true }\n                            ]\n                          ])\n                        ]),\n                        _: 1 /* STABLE */\n                      })\n                    ])\n                  ], 32 /* NEED_HYDRATION */),\n                  _createElementVNode(\"details\", {\n                    class: \"invoice-style__group\",\n                    name: \"invoice-style-group\",\n                    onToggle: _cache[26] || (_cache[26] = $event => ($setup.onToggle('sender', $event)))\n                  }, [\n                    _cache[49] || (_cache[49] = _createElementVNode(\"summary\", { class: \"invoice-style__summary\" }, \"Adres en afzender\", -1 /* CACHED */)),\n                    _createElementVNode(\"div\", _hoisted_37, [\n                      _createElementVNode(\"div\", _hoisted_38, [\n                        _createVNode($setup[\"FormField\"], {\n                          label: \"Klantadres\",\n                          \"for-id\": \"invoice-style-customer\"\n                        }, {\n                          default: _withCtx(() => [\n                            _withDirectives(_createElementVNode(\"select\", {\n                              id: \"invoice-style-customer\",\n                              \"onUpdate:modelValue\": _cache[23] || (_cache[23] = $event => (($setup.style.customerPosition) = $event)),\n                              class: \"hh-select\"\n                            }, _cache[46] || (_cache[46] = [\n                              _createElementVNode(\"option\", { value: \"left\" }, \"Links\", -1 /* CACHED */),\n                              _createElementVNode(\"option\", { value: \"right\" }, \"Rechts\", -1 /* CACHED */)\n                            ]), 512 /* NEED_PATCH */), [\n                              [_vModelSelect, $setup.style.customerPosition]\n                            ])\n                          ]),\n                          _: 1 /* STABLE */\n                        }),\n                        ($setup.style.layout === 'standard')\n                          ? (_openBlock(), _createBlock($setup[\"FormField\"], {\n                              key: 0,\n                              label: \"Bedrijfsgegevens\",\n                              \"for-id\": \"invoice-style-company\"\n                            }, {\n                              default: _withCtx(() => [\n                                _withDirectives(_createElementVNode(\"select\", {\n                                  id: \"invoice-style-company\",\n                                  \"onUpdate:modelValue\": _cache[24] || (_cache[24] = $event => (($setup.style.companyPosition) = $event)),\n                                  class: \"hh-select\"\n                                }, _cache[47] || (_cache[47] = [\n                                  _createElementVNode(\"option\", { value: \"header\" }, \"Bovenaan\", -1 /* CACHED */),\n                                  _createElementVNode(\"option\", { value: \"footer\" }, \"In de voet\", -1 /* CACHED */)\n                                ]), 512 /* NEED_PATCH */), [\n                                  [_vModelSelect, $setup.style.companyPosition]\n                                ])\n                              ]),\n                              _: 1 /* STABLE */\n                            }))\n                          : _createCommentVNode(\"v-if\", true)\n                      ]),\n                      _createElementVNode(\"p\", _hoisted_39, [\n                        _cache[48] || (_cache[48] = _createTextVNode(\" Kies welke afzendergegevens zichtbaar zijn en pas de volgorde aan met de pijlen. \", -1 /* CACHED */)),\n                        ($setup.style.layout === 'letterhead')\n                          ? (_openBlock(), _createElementBlock(_Fragment, { key: 0 }, [\n                              _createTextVNode(\"Naam, adres en telefoon staan onder het logo, de overige gegevens onderaan.\")\n                            ], 64 /* STABLE_FRAGMENT */))\n                          : _createCommentVNode(\"v-if\", true)\n                      ]),\n                      _createVNode($setup[\"InvoiceStyleSenderFields\"], {\n                        modelValue: $setup.style.companyFields,\n                        \"onUpdate:modelValue\": _cache[25] || (_cache[25] = $event => (($setup.style.companyFields) = $event))\n                      }, null, 8 /* PROPS */, [\"modelValue\"])\n                    ])\n                  ], 32 /* NEED_HYDRATION */),\n                  _createElementVNode(\"details\", {\n                    class: \"invoice-style__group\",\n                    name: \"invoice-style-group\",\n                    onToggle: _cache[29] || (_cache[29] = $event => ($setup.onToggle('meta', $event)))\n                  }, [\n                    _cache[53] || (_cache[53] = _createElementVNode(\"summary\", { class: \"invoice-style__summary\" }, \"Factuurgegevens\", -1 /* CACHED */)),\n                    _createElementVNode(\"div\", _hoisted_40, [\n                      _cache[52] || (_cache[52] = _createElementVNode(\"p\", { class: \"invoice-style__hint\" }, \"Het factuurnummer staat in de titel. Verdeel de datums over de twee kolommen daaronder.\", -1 /* CACHED */)),\n                      _createVNode($setup[\"FormField\"], {\n                        label: \"Factuurdatum\",\n                        \"for-id\": \"invoice-style-invoice-date\"\n                      }, {\n                        default: _withCtx(() => [\n                          _withDirectives(_createElementVNode(\"select\", {\n                            id: \"invoice-style-invoice-date\",\n                            \"onUpdate:modelValue\": _cache[27] || (_cache[27] = $event => (($setup.style.invoiceDatePosition) = $event)),\n                            class: \"hh-select\"\n                          }, _cache[50] || (_cache[50] = [\n                            _createElementVNode(\"option\", { value: \"left\" }, \"Linkerkolom\", -1 /* CACHED */),\n                            _createElementVNode(\"option\", { value: \"right\" }, \"Rechterkolom\", -1 /* CACHED */)\n                          ]), 512 /* NEED_PATCH */), [\n                            [_vModelSelect, $setup.style.invoiceDatePosition]\n                          ])\n                        ]),\n                        _: 1 /* STABLE */\n                      }),\n                      _createVNode($setup[\"FormField\"], {\n                        label: \"Vervaldatum\",\n                        \"for-id\": \"invoice-style-due-date\"\n                      }, {\n                        default: _withCtx(() => [\n                          _withDirectives(_createElementVNode(\"select\", {\n                            id: \"invoice-style-due-date\",\n                            \"onUpdate:modelValue\": _cache[28] || (_cache[28] = $event => (($setup.style.dueDatePosition) = $event)),\n                            class: \"hh-select\"\n                          }, _cache[51] || (_cache[51] = [\n                            _createElementVNode(\"option\", { value: \"left\" }, \"Linkerkolom\", -1 /* CACHED */),\n                            _createElementVNode(\"option\", { value: \"right\" }, \"Rechterkolom\", -1 /* CACHED */)\n                          ]), 512 /* NEED_PATCH */), [\n                            [_vModelSelect, $setup.style.dueDatePosition]\n                          ])\n                        ]),\n                        _: 1 /* STABLE */\n                      })\n                    ])\n                  ], 32 /* NEED_HYDRATION */),\n                  _createElementVNode(\"details\", {\n                    class: \"invoice-style__group\",\n                    name: \"invoice-style-group\",\n                    onToggle: _cache[31] || (_cache[31] = $event => ($setup.onToggle('footer', $event)))\n                  }, [\n                    _cache[54] || (_cache[54] = _createElementVNode(\"summary\", { class: \"invoice-style__summary\" }, \"Voettekst\", -1 /* CACHED */)),\n                    _createElementVNode(\"div\", _hoisted_41, [\n                      _createVNode($setup[\"FormField\"], {\n                        label: \"Voettekst\",\n                        \"for-id\": \"invoice-style-footer\",\n                        hint: \"Bijvoorbeeld een bedankje of verwijzing naar je voorwaarden.\"\n                      }, {\n                        default: _withCtx(() => [\n                          _withDirectives(_createElementVNode(\"textarea\", {\n                            id: \"invoice-style-footer\",\n                            \"onUpdate:modelValue\": _cache[30] || (_cache[30] = $event => (($setup.style.footerText) = $event)),\n                            class: \"hh-input\",\n                            rows: \"3\",\n                            maxlength: \"1000\"\n                          }, null, 512 /* NEED_PATCH */), [\n                            [_vModelText, $setup.style.footerText]\n                          ])\n                        ]),\n                        _: 1 /* STABLE */\n                      })\n                    ])\n                  ], 32 /* NEED_HYDRATION */)\n                ], 8 /* PROPS */, _hoisted_15)\n              ], 544 /* NEED_HYDRATION, NEED_PATCH */),\n              _createElementVNode(\"div\", {\n                class: \"invoice-style__preview\",\n                \"aria-busy\": $setup.previewLoading,\n                style: _normalizeStyle({ '--preview-max-height': $setup.previewMaxHeight })\n              }, [\n                _createElementVNode(\"div\", _hoisted_43, [\n                  _cache[56] || (_cache[56] = _createElementVNode(\"h3\", { class: \"invoice-style__legend\" }, \"Voorbeeld\", -1 /* CACHED */)),\n                  ($setup.previewLoading)\n                    ? (_openBlock(), _createElementBlock(\"span\", _hoisted_44, \"Bijwerken...\"))\n                    : _createCommentVNode(\"v-if\", true)\n                ]),\n                _cache[57] || (_cache[57] = _createElementVNode(\"p\", { class: \"invoice-style__hint\" }, \"Klik op een onderdeel om de bijbehorende instelling te openen. Wijzigingen worden pas bewaard na opslaan.\", -1 /* CACHED */)),\n                ($setup.previewError)\n                  ? (_openBlock(), _createElementBlock(\"p\", _hoisted_45, _toDisplayString($setup.previewError), 1 /* TEXT */))\n                  : _createCommentVNode(\"v-if\", true),\n                _createElementVNode(\"div\", _hoisted_46, [\n                  ($setup.previewHtml)\n                    ? (_openBlock(), _createBlock($setup[\"InvoicePreview\"], {\n                        key: 0,\n                        ref: \"standardPreview\",\n                        html: $setup.previewHtml,\n                        highlight: $setup.highlight,\n                        \"edit-targets\": $setup.previewEditTargets,\n                        fit: \"\",\n                        onEdit: $setup.editPreviewField\n                      }, null, 8 /* PROPS */, [\"html\", \"highlight\"]))\n                    : ($setup.previewLoading)\n                      ? (_openBlock(), _createElementBlock(\"div\", _hoisted_47))\n                      : _createCommentVNode(\"v-if\", true)\n                ], 512 /* NEED_PATCH */)\n              ], 12 /* STYLE, PROPS */, _hoisted_42)\n            ])),\n    ($setup.confirmAdvanced)\n      ? (_openBlock(), _createBlock($setup[\"AppDialog\"], {\n          key: 4,\n          title: \"Geavanceerde factuuropmaak\",\n          onClose: _cache[33] || (_cache[33] = $event => ($setup.confirmAdvanced = false))\n        }, {\n          footer: _withCtx(() => [\n            _createElementVNode(\"button\", {\n              class: \"hh-btn\",\n              type: \"button\",\n              \"data-autofocus\": \"\",\n              onClick: _cache[32] || (_cache[32] = $event => ($setup.confirmAdvanced = false))\n            }, \"Terug\"),\n            _createElementVNode(\"button\", {\n              class: \"hh-btn hh-btn--primary\",\n              type: \"button\",\n              onClick: $setup.openAdvanced\n            }, \"Geavanceerde editor openen\")\n          ]),\n          default: _withCtx(() => [\n            _cache[58] || (_cache[58] = _createElementVNode(\"p\", null, \"Je kunt alle onderdelen vrij verplaatsen en de grootte aanpassen. Hierdoor kunnen teksten overlappen of buiten de pagina vallen. Controleer na wijzigingen altijd het voorbeeld en de PDF.\", -1 /* CACHED */))\n          ]),\n          _: 1 /* STABLE */,\n          __: [58]\n        }))\n      : _createCommentVNode(\"v-if\", true),\n    ($setup.confirmReset)\n      ? (_openBlock(), _createBlock($setup[\"AppDialog\"], {\n          key: 5,\n          title: \"Standaardindeling herstellen\",\n          onClose: _cache[35] || (_cache[35] = $event => ($setup.confirmReset = false))\n        }, {\n          footer: _withCtx(() => [\n            _createElementVNode(\"button\", {\n              class: \"hh-btn\",\n              type: \"button\",\n              \"data-autofocus\": \"\",\n              onClick: _cache[34] || (_cache[34] = $event => ($setup.confirmReset = false))\n            }, \"Terug\"),\n            _createElementVNode(\"button\", {\n              class: \"hh-btn hh-btn--primary\",\n              type: \"button\",\n              onClick: $setup.resetBlocks\n            }, \"Herstellen\")\n          ]),\n          default: _withCtx(() => [\n            _cache[59] || (_cache[59] = _createElementVNode(\"p\", null, \"Alle onderdelen gaan terug naar hun standaardplek en lettergrootte. Je kunt dit nog ongedaan maken met Annuleren, zolang je niet opslaat.\", -1 /* CACHED */))\n          ]),\n          _: 1 /* STABLE */,\n          __: [59]\n        }))\n      : _createCommentVNode(\"v-if\", true),\n    ($setup.style && !$setup.loading)\n      ? (_openBlock(), _createElementBlock(\"div\", _hoisted_48, [\n          _createElementVNode(\"div\", _hoisted_49, [\n            ($setup.error)\n              ? (_openBlock(), _createElementBlock(\"p\", _hoisted_50, _toDisplayString($setup.error), 1 /* TEXT */))\n              : _createCommentVNode(\"v-if\", true),\n            ($setup.notice)\n              ? (_openBlock(), _createElementBlock(\"p\", _hoisted_51, _toDisplayString($setup.notice), 1 /* TEXT */))\n              : _createCommentVNode(\"v-if\", true)\n          ]),\n          _createElementVNode(\"button\", {\n            class: \"hh-btn\",\n            type: \"button\",\n            disabled: $setup.saving,\n            onClick: $setup.cancel\n          }, \"Annuleren\", 8 /* PROPS */, _hoisted_52),\n          _createElementVNode(\"button\", {\n            class: \"hh-btn hh-btn--primary\",\n            form: \"invoice-style-form\",\n            type: \"submit\",\n            disabled: $setup.saving || $setup.uploading\n          }, _toDisplayString($setup.saving ? \"Opslaan...\" : \"Opslaan\"), 9 /* TEXT, PROPS */, _hoisted_53)\n        ], 512 /* NEED_PATCH */))\n      : _createCommentVNode(\"v-if\", true)\n  ], 8 /* PROPS */, _hoisted_1))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/InvoiceStyleSettings.vue?type=script\";import \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/InvoiceStyleSettings.vue?type=style&index=0\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/InvoiceStyleSettings.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/components/InvoiceStyleSettings.vue\";script.__scopeId = \"data-v-363fce8d\";export default script;","<template>\n  <section>\n    <div class=\"hh-page__bar\">\n      <div>\n        <h1 class=\"hh-page__title\">{{ title }}</h1>\n      </div>\n    </div>\n\n    <InvoiceStyleSettings v-if=\"section === 'huisstijl'\" />\n    <ExpenseKindSettings v-else-if=\"section === 'verschotten'\" />\n\n    <template v-else>\n      <p v-if=\"notice\" class=\"st__notice\" role=\"status\">{{ notice }}</p>\n      <p v-if=\"error\" class=\"hh-formerror\" role=\"alert\">{{ error }}</p>\n      <div v-if=\"loading\" class=\"hh-empty\" role=\"status\">Laden…</div>\n\n      <template v-else-if=\"loaded\">\n        <section v-if=\"section === 'uren'\" class=\"hh-card st__panel st__general\">\n          <h2 class=\"st__ptitle\">Groepsomschrijvingen</h2>\n          <p class=\"hh-muted st__hint\">Het eerste teken van een werkzaamheidcode bepaalt de groep (0 t/m 9).</p>\n          <div class=\"st__slots\">\n            <label v-for=\"i in 10\" :key=\"`group-${i - 1}`\" class=\"st__slot\">\n              <span class=\"st__idx\">{{ i - 1 }}</span>\n              <input v-model=\"groups[i - 1]\" class=\"hh-input\" :placeholder=\"`Groep ${i - 1}`\" />\n            </label>\n          </div>\n        </section>\n\n        <section v-if=\"section === 'bedrijf'\" class=\"hh-card st__panel st__general\">\n          <h2 class=\"st__ptitle\">Bedrijfsgegevens</h2>\n          <div class=\"st__generalgrid\">\n            <FormField label=\"Bedrijfsnaam\" for-id=\"st-company\">\n              <input id=\"st-company\" maxlength=\"250\" v-model.trim=\"companyName\" class=\"hh-input\" placeholder=\"Bijv. Happy Hours BV\" />\n            </FormField>\n            <FormField label=\"Adres\" for-id=\"st-address\" :error=\"fieldErrors.companyAddress\" hint=\"Maximaal 6 adresregels.\">\n              <textarea id=\"st-address\" v-model=\"companyAddress\" class=\"hh-input\" rows=\"3\" :class=\"{ 'hh-input--error': fieldErrors.companyAddress }\" :aria-invalid=\"Boolean(fieldErrors.companyAddress)\" />\n            </FormField>\n            <FormField label=\"Telefoon\" for-id=\"st-phone\">\n              <input id=\"st-phone\" maxlength=\"250\" v-model.trim=\"companyPhone\" type=\"tel\" class=\"hh-input\" />\n            </FormField>\n            <FormField label=\"Contactmailadres / Reply-To\" for-id=\"st-email\" :error=\"fieldErrors.companyEmail\" hint=\"Dit adres wordt gebruikt voor contact en antwoorden. Verzenden namens dit adres werkt pas nadat platformbeheer de afzender en mailroute heeft toegestaan.\">\n              <input id=\"st-email\" maxlength=\"254\" v-model.trim=\"companyEmail\" type=\"email\" class=\"hh-input\" :class=\"{ 'hh-input--error': fieldErrors.companyEmail }\" :aria-invalid=\"Boolean(fieldErrors.companyEmail)\" />\n            </FormField>\n            <FormField label=\"KVK-nummer\" for-id=\"st-kvk\">\n              <input id=\"st-kvk\" maxlength=\"250\" v-model.trim=\"companyKvk\" class=\"hh-input\" />\n            </FormField>\n            <FormField label=\"Btw-nummer\" for-id=\"st-company-vat\">\n              <input id=\"st-company-vat\" maxlength=\"250\" v-model.trim=\"companyVat\" class=\"hh-input\" />\n            </FormField>\n            <FormField label=\"IBAN\" for-id=\"st-iban\">\n              <input id=\"st-iban\" maxlength=\"250\" v-model.trim=\"companyIban\" class=\"hh-input\" />\n            </FormField>\n            <FormField label=\"Mailondertekening\" for-id=\"st-signature\" hint=\"Volledige ondertekening, inclusief eventuele groet.\">\n              <textarea id=\"st-signature\" maxlength=\"2000\" v-model=\"companyMailSignature\" class=\"hh-input\" rows=\"4\" />\n            </FormField>\n          </div>\n        </section>\n\n        <template v-if=\"section === 'facturen'\">\n          <section class=\"hh-card st__panel st__general\">\n            <h2 class=\"st__ptitle\">Vaste factuuromschrijvingen</h2>\n            <div class=\"st__bcc\">\n              <div v-for=\"(_, i) in invoiceTexts\" :key=\"i\" class=\"st__bccrow\">\n                <input v-model=\"invoiceTexts[i]\" class=\"hh-input\" :aria-label=\"`Factuuromschrijving ${i + 1}`\" maxlength=\"250\" :aria-invalid=\"Boolean(fieldErrors.invoiceTexts)\" />\n                <button class=\"hh-btn hh-btn--danger\" type=\"button\" @click=\"invoiceTexts.splice(i, 1)\">Verwijderen</button>\n              </div>\n              <p v-if=\"invoiceTexts.length === 0\" class=\"hh-muted st__bccempty\">Nog geen vaste omschrijvingen ingesteld.</p>\n              <p v-if=\"fieldErrors.invoiceTexts\" class=\"hh-formerror\" role=\"alert\">{{ fieldErrors.invoiceTexts }}</p>\n              <button class=\"hh-btn st__bccadd\" type=\"button\" :disabled=\"invoiceTexts.length >= 100\" @click=\"invoiceTexts.push('')\">+ Omschrijving toevoegen</button>\n            </div>\n          </section>\n\n          <section class=\"hh-card st__panel st__general\">\n            <h2 class=\"st__ptitle\">Btw</h2>\n            <div class=\"st__generalgrid\">\n              <FormField label=\"Standaard btw (%)\" for-id=\"st-vat\" :error=\"fieldErrors.vat\">\n                <input id=\"st-vat\" v-model.trim=\"vatRate\" class=\"hh-input hh-input--num st__vat\" inputmode=\"decimal\" :class=\"{ 'hh-input--error': fieldErrors.vat }\" />\n              </FormField>\n            </div>\n          </section>\n\n          <section class=\"hh-card st__panel st__general\">\n            <h2 class=\"st__ptitle\">Bcc-adressen facturen</h2>\n            <p class=\"hh-muted st__hint\">\n              Elke verzonden factuur gaat blind ook naar deze adressen (bijvoorbeeld Snelstart).\n              Bij het aanmaken van een factuur kun je per adres kiezen of het meegaat.\n            </p>\n            <div class=\"st__bcc\">\n              <div v-for=\"(_, i) in bccEmails\" :key=\"i\" class=\"st__bccrow\">\n                <input\n                  v-model.trim=\"bccEmails[i]\"\n                  type=\"email\"\n                  class=\"hh-input\"\n                  placeholder=\"bijv. administratie@voorbeeld.nl\"\n                />\n                <button class=\"hh-btn hh-btn--danger\" type=\"button\" @click=\"removeBcc(i)\">Verwijderen</button>\n              </div>\n              <p v-if=\"bccEmails.length === 0\" class=\"hh-muted st__bccempty\">Nog geen Bcc-adressen ingesteld.</p>\n              <button class=\"hh-btn st__bccadd\" type=\"button\" @click=\"addBcc\">+ Bcc-adres toevoegen</button>\n            </div>\n          </section>\n        </template>\n\n        <div class=\"st__actions\">\n          <button class=\"hh-btn hh-btn--primary\" type=\"button\" :disabled=\"saving\" @click=\"save\">\n            {{ saving ? \"Opslaan…\" : \"Instellingen opslaan\" }}\n          </button>\n        </div>\n      </template>\n    </template>\n  </section>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, reactive, ref, watch } from \"vue\";\nimport { useOrganizationDirty } from \"../lib/organization\";\nimport { useApi } from \"../lib/api\";\nimport { isValidEmail } from \"@webhare/std\";\nimport { parseAmount } from \"../lib/invoicing\";\nimport ExpenseKindSettings from \"../components/ExpenseKindSettings.vue\";\nimport FormField from \"../components/FormField.vue\";\nimport InvoiceStyleSettings from \"../components/InvoiceStyleSettings.vue\";\n\nconst api = useApi();\n\nconst props = defineProps<{ section: \"bedrijf\" | \"huisstijl\" | \"facturen\" | \"uren\" | \"verschotten\" }>();\nconst title = computed(() => ({\n  bedrijf: \"Bedrijf\",\n  huisstijl: \"Factuurhuisstijl\",\n  facturen: \"Factuurinstellingen\",\n  uren: \"Ureninstellingen\",\n  verschotten: \"Verschotsoorten\",\n})[props.section]);\nconst generalSettings = computed(() => [\"bedrijf\", \"facturen\", \"uren\"].includes(props.section));\nconst loading = ref(false);\nconst loaded = ref(false);\nconst saving = ref(false);\nconst notice = ref(\"\");\nconst error = ref(\"\");\nlet sectionVersion = 0;\n\nconst groups = reactive<string[]>(Array.from({ length: 10 }, () => \"\"));\nconst vatRate = ref(\"21\");\nconst companyName = ref(\"\");\nconst companyAddress = ref(\"\");\nconst companyPhone = ref(\"\");\nconst companyEmail = ref(\"\");\nconst companyKvk = ref(\"\");\nconst companyVat = ref(\"\");\nconst companyIban = ref(\"\");\nconst companyMailSignature = ref(\"\");\nconst bccEmails = reactive<string[]>([]);\nconst invoiceTexts = reactive<string[]>([]);\nconst fieldErrors = reactive<Record<string, string>>({});\n\nlet savedSnapshot = \"\";\nfunction settingsSnapshot(): string {\n  return JSON.stringify([groups, vatRate.value, bccEmails, invoiceTexts, companyName.value, companyAddress.value, companyPhone.value, companyEmail.value, companyKvk.value, companyVat.value, companyIban.value, companyMailSignature.value]);\n}\nuseOrganizationDirty(() => loaded.value && savedSnapshot !== settingsSnapshot());\n\nfunction fillSlots({ target, source }: { target: string[]; source: string[] }): void {\n  for (let i = 0; i < 10; i++) target[i] = source[i] ?? \"\";\n}\n\nfunction addBcc(): void {\n  bccEmails.push(\"\");\n}\n\nfunction removeBcc(index: number): void {\n  bccEmails.splice(index, 1);\n}\n\nasync function load(): Promise<void> {\n  const version = ++sectionVersion;\n  loading.value = generalSettings.value;\n  loaded.value = false;\n  saving.value = false;\n  notice.value = \"\";\n  error.value = \"\";\n  for (const key of Object.keys(fieldErrors)) delete fieldErrors[key];\n  if (!generalSettings.value) return;\n  try {\n    const settings = await api.getSettings();\n    // The router reuses this view; ignore requests from a previously selected section.\n    if (version !== sectionVersion) return;\n    fillSlots({ target: groups, source: settings.activityGroups ?? [] });\n    vatRate.value = String(settings.defaultVatRate);\n    companyName.value = settings.companyName;\n    companyAddress.value = settings.companyAddressLines.join(\"\\n\");\n    companyPhone.value = settings.companyPhone;\n    companyEmail.value = settings.companyEmail;\n    companyKvk.value = settings.companyKvk;\n    companyVat.value = settings.companyVat;\n    companyIban.value = settings.companyIban;\n    companyMailSignature.value = settings.companyMailSignature;\n    bccEmails.splice(0, bccEmails.length, ...settings.bccEmails);\n    invoiceTexts.splice(0, invoiceTexts.length, ...settings.invoiceTexts ?? []);\n    savedSnapshot = settingsSnapshot();\n    loaded.value = true;\n  } catch {\n    if (version === sectionVersion) error.value = \"Kon de instellingen niet laden.\";\n  } finally {\n    if (version === sectionVersion) loading.value = false;\n  }\n}\n\nasync function save(): Promise<void> {\n  if (!generalSettings.value || !loaded.value || loading.value || saving.value) return;\n  const version = sectionVersion;\n  for (const key of Object.keys(fieldErrors)) delete fieldErrors[key];\n  notice.value = \"\";\n  if (props.section === \"facturen\" && vatRate.value.trim() && parseAmount(vatRate.value) === null) {\n    fieldErrors.vat = \"Ongeldig percentage.\";\n    return;\n  }\n  if (props.section === \"facturen\" && (invoiceTexts.length > 100 || invoiceTexts.some(text => text.trim().length > 250 || /[\\r\\n]/.test(text)))) {\n    fieldErrors.invoiceTexts = \"Gebruik maximaal 100 omschrijvingen van elk maximaal 250 tekens op één regel.\";\n    return;\n  }\n  const addressLines = companyAddress.value.split(/\\r?\\n/).map((line) => line.trim()).filter((line) => line !== \"\");\n  if (props.section === \"bedrijf\") {\n    if (addressLines.length > 6 || addressLines.some((line) => line.length > 250))\n      fieldErrors.companyAddress = \"Gebruik maximaal 6 adresregels van elk maximaal 250 tekens.\";\n    if (companyEmail.value.trim() && !isValidEmail(companyEmail.value.trim()))\n      fieldErrors.companyEmail = \"Vul een geldig e-mailadres in.\";\n    if (Object.keys(fieldErrors).length) {\n      globalThis.document?.getElementById(fieldErrors.companyAddress ? \"st-address\" : \"st-email\")?.focus();\n      return;\n    }\n  }\n  saving.value = true;\n  error.value = \"\";\n  const snapshot = settingsSnapshot();\n  try {\n    await api.updateSettings(props.section === \"bedrijf\" ? {\n      companyName: companyName.value.trim(),\n      companyAddressLines: addressLines,\n      companyPhone: companyPhone.value.trim(),\n      companyEmail: companyEmail.value.trim(),\n      companyKvk: companyKvk.value.trim(),\n      companyVat: companyVat.value.trim(),\n      companyIban: companyIban.value.trim(),\n      companyMailSignature: companyMailSignature.value.trim(),\n    }\n      : props.section === \"uren\" ? { activityGroups: groups.map((g) => g.trim()) }\n      : {\n        defaultVatRate: String(parseAmount(vatRate.value) ?? 0),\n        bccEmails: bccEmails.map((email) => email.trim()).filter((email) => email !== \"\"),\n        invoiceTexts: invoiceTexts.map(text => text.trim()).filter(Boolean),\n      });\n    if (version === sectionVersion) {\n      savedSnapshot = snapshot;\n      notice.value = \"Instellingen opgeslagen.\";\n    }\n  } catch (e) {\n    if (version === sectionVersion) error.value = e instanceof Error ? e.message : \"Opslaan mislukt.\";\n  } finally {\n    if (version === sectionVersion) saving.value = false;\n  }\n}\n\nwatch(() => props.section, () => { void load(); }, { immediate: true });\nonBeforeUnmount(() => { sectionVersion++; });\n</script>\n\n<style scoped>\n.st__notice {\n  margin: 0 0 12px;\n  padding: 9px 12px;\n  border: 1px solid rgba(37, 122, 62, 0.5);\n  border-radius: var(--hh-radius);\n  background: var(--hh-accent-soft);\n  color: var(--hh-accent-strong);\n  font-size: 13px;\n}\n.st__panel {\n  padding: 16px 18px;\n}\n.st__ptitle {\n  margin: 0 0 4px;\n  font-size: 15px;\n  font-weight: 700;\n}\n.st__hint {\n  margin: 0 0 14px;\n  font-size: 12.5px;\n}\n.st__slots {\n  display: grid;\n  gap: 8px;\n}\n.st__slot {\n  display: flex;\n  align-items: center;\n  gap: 10px;\n}\n.st__idx {\n  width: 22px;\n  flex: none;\n  text-align: center;\n  font-family: var(--hh-mono);\n  font-size: 12px;\n  font-weight: 700;\n  color: var(--hh-fg-subtle);\n}\n.st__general {\n  margin-bottom: 18px;\n}\n.st__generalgrid {\n  display: grid;\n  grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));\n  gap: 14px;\n}\n.st__actions {\n  display: flex;\n  gap: 8px;\n}\n.st__vat {\n  width: 100px;\n  max-width: 100%;\n}\n.st__bcc {\n  display: grid;\n  gap: 8px;\n}\n.st__bccrow {\n  display: flex;\n  align-items: center;\n  gap: 8px;\n}\n.st__bccrow .hh-input {\n  flex: 1;\n}\n.st__bccempty {\n  margin: 0;\n  font-size: 12.5px;\n}\n.st__bccadd {\n  justify-self: start;\n}\n</style>\n","import { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, createElementBlock as _createElementBlock, renderList as _renderList, Fragment as _Fragment, vModelText as _vModelText, withDirectives as _withDirectives, withCtx as _withCtx, createVNode as _createVNode, normalizeClass as _normalizeClass } from \"vue\"\n\nconst _hoisted_1 = { class: \"hh-page__bar\" }\nconst _hoisted_2 = { class: \"hh-page__title\" }\nconst _hoisted_3 = {\n  key: 0,\n  class: \"st__notice\",\n  role: \"status\"\n}\nconst _hoisted_4 = {\n  key: 1,\n  class: \"hh-formerror\",\n  role: \"alert\"\n}\nconst _hoisted_5 = {\n  key: 2,\n  class: \"hh-empty\",\n  role: \"status\"\n}\nconst _hoisted_6 = {\n  key: 0,\n  class: \"hh-card st__panel st__general\"\n}\nconst _hoisted_7 = { class: \"st__slots\" }\nconst _hoisted_8 = { class: \"st__idx\" }\nconst _hoisted_9 = [\"onUpdate:modelValue\", \"placeholder\"]\nconst _hoisted_10 = {\n  key: 1,\n  class: \"hh-card st__panel st__general\"\n}\nconst _hoisted_11 = { class: \"st__generalgrid\" }\nconst _hoisted_12 = [\"aria-invalid\"]\nconst _hoisted_13 = [\"aria-invalid\"]\nconst _hoisted_14 = { class: \"hh-card st__panel st__general\" }\nconst _hoisted_15 = { class: \"st__bcc\" }\nconst _hoisted_16 = [\"onUpdate:modelValue\", \"aria-label\", \"aria-invalid\"]\nconst _hoisted_17 = [\"onClick\"]\nconst _hoisted_18 = {\n  key: 0,\n  class: \"hh-muted st__bccempty\"\n}\nconst _hoisted_19 = {\n  key: 1,\n  class: \"hh-formerror\",\n  role: \"alert\"\n}\nconst _hoisted_20 = [\"disabled\"]\nconst _hoisted_21 = { class: \"hh-card st__panel st__general\" }\nconst _hoisted_22 = { class: \"st__generalgrid\" }\nconst _hoisted_23 = { class: \"hh-card st__panel st__general\" }\nconst _hoisted_24 = { class: \"st__bcc\" }\nconst _hoisted_25 = [\"onUpdate:modelValue\"]\nconst _hoisted_26 = [\"onClick\"]\nconst _hoisted_27 = {\n  key: 0,\n  class: \"hh-muted st__bccempty\"\n}\nconst _hoisted_28 = { class: \"st__actions\" }\nconst _hoisted_29 = [\"disabled\"]\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return (_openBlock(), _createElementBlock(\"section\", null, [\n    _createElementVNode(\"div\", _hoisted_1, [\n      _createElementVNode(\"div\", null, [\n        _createElementVNode(\"h1\", _hoisted_2, _toDisplayString($setup.title), 1 /* TEXT */)\n      ])\n    ]),\n    ($props.section === 'huisstijl')\n      ? (_openBlock(), _createBlock($setup[\"InvoiceStyleSettings\"], { key: 0 }))\n      : ($props.section === 'verschotten')\n        ? (_openBlock(), _createBlock($setup[\"ExpenseKindSettings\"], { key: 1 }))\n        : (_openBlock(), _createElementBlock(_Fragment, { key: 2 }, [\n            ($setup.notice)\n              ? (_openBlock(), _createElementBlock(\"p\", _hoisted_3, _toDisplayString($setup.notice), 1 /* TEXT */))\n              : _createCommentVNode(\"v-if\", true),\n            ($setup.error)\n              ? (_openBlock(), _createElementBlock(\"p\", _hoisted_4, _toDisplayString($setup.error), 1 /* TEXT */))\n              : _createCommentVNode(\"v-if\", true),\n            ($setup.loading)\n              ? (_openBlock(), _createElementBlock(\"div\", _hoisted_5, \"Laden…\"))\n              : ($setup.loaded)\n                ? (_openBlock(), _createElementBlock(_Fragment, { key: 3 }, [\n                    ($props.section === 'uren')\n                      ? (_openBlock(), _createElementBlock(\"section\", _hoisted_6, [\n                          _cache[10] || (_cache[10] = _createElementVNode(\"h2\", { class: \"st__ptitle\" }, \"Groepsomschrijvingen\", -1 /* CACHED */)),\n                          _cache[11] || (_cache[11] = _createElementVNode(\"p\", { class: \"hh-muted st__hint\" }, \"Het eerste teken van een werkzaamheidcode bepaalt de groep (0 t/m 9).\", -1 /* CACHED */)),\n                          _createElementVNode(\"div\", _hoisted_7, [\n                            (_openBlock(), _createElementBlock(_Fragment, null, _renderList(10, (i) => {\n                              return _createElementVNode(\"label\", {\n                                key: `group-${i - 1}`,\n                                class: \"st__slot\"\n                              }, [\n                                _createElementVNode(\"span\", _hoisted_8, _toDisplayString(i - 1), 1 /* TEXT */),\n                                _withDirectives(_createElementVNode(\"input\", {\n                                  \"onUpdate:modelValue\": $event => (($setup.groups[i - 1]) = $event),\n                                  class: \"hh-input\",\n                                  placeholder: `Groep ${i - 1}`\n                                }, null, 8 /* PROPS */, _hoisted_9), [\n                                  [_vModelText, $setup.groups[i - 1]]\n                                ])\n                              ])\n                            }), 64 /* STABLE_FRAGMENT */))\n                          ])\n                        ]))\n                      : _createCommentVNode(\"v-if\", true),\n                    ($props.section === 'bedrijf')\n                      ? (_openBlock(), _createElementBlock(\"section\", _hoisted_10, [\n                          _cache[12] || (_cache[12] = _createElementVNode(\"h2\", { class: \"st__ptitle\" }, \"Bedrijfsgegevens\", -1 /* CACHED */)),\n                          _createElementVNode(\"div\", _hoisted_11, [\n                            _createVNode($setup[\"FormField\"], {\n                              label: \"Bedrijfsnaam\",\n                              \"for-id\": \"st-company\"\n                            }, {\n                              default: _withCtx(() => [\n                                _withDirectives(_createElementVNode(\"input\", {\n                                  id: \"st-company\",\n                                  maxlength: \"250\",\n                                  \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => (($setup.companyName) = $event)),\n                                  class: \"hh-input\",\n                                  placeholder: \"Bijv. Happy Hours BV\"\n                                }, null, 512 /* NEED_PATCH */), [\n                                  [\n                                    _vModelText,\n                                    $setup.companyName,\n                                    void 0,\n                                    { trim: true }\n                                  ]\n                                ])\n                              ]),\n                              _: 1 /* STABLE */\n                            }),\n                            _createVNode($setup[\"FormField\"], {\n                              label: \"Adres\",\n                              \"for-id\": \"st-address\",\n                              error: $setup.fieldErrors.companyAddress,\n                              hint: \"Maximaal 6 adresregels.\"\n                            }, {\n                              default: _withCtx(() => [\n                                _withDirectives(_createElementVNode(\"textarea\", {\n                                  id: \"st-address\",\n                                  \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => (($setup.companyAddress) = $event)),\n                                  class: _normalizeClass([\"hh-input\", { 'hh-input--error': $setup.fieldErrors.companyAddress }]),\n                                  rows: \"3\",\n                                  \"aria-invalid\": Boolean($setup.fieldErrors.companyAddress)\n                                }, null, 10 /* CLASS, PROPS */, _hoisted_12), [\n                                  [_vModelText, $setup.companyAddress]\n                                ])\n                              ]),\n                              _: 1 /* STABLE */\n                            }, 8 /* PROPS */, [\"error\"]),\n                            _createVNode($setup[\"FormField\"], {\n                              label: \"Telefoon\",\n                              \"for-id\": \"st-phone\"\n                            }, {\n                              default: _withCtx(() => [\n                                _withDirectives(_createElementVNode(\"input\", {\n                                  id: \"st-phone\",\n                                  maxlength: \"250\",\n                                  \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => (($setup.companyPhone) = $event)),\n                                  type: \"tel\",\n                                  class: \"hh-input\"\n                                }, null, 512 /* NEED_PATCH */), [\n                                  [\n                                    _vModelText,\n                                    $setup.companyPhone,\n                                    void 0,\n                                    { trim: true }\n                                  ]\n                                ])\n                              ]),\n                              _: 1 /* STABLE */\n                            }),\n                            _createVNode($setup[\"FormField\"], {\n                              label: \"Contactmailadres / Reply-To\",\n                              \"for-id\": \"st-email\",\n                              error: $setup.fieldErrors.companyEmail,\n                              hint: \"Dit adres wordt gebruikt voor contact en antwoorden. Verzenden namens dit adres werkt pas nadat platformbeheer de afzender en mailroute heeft toegestaan.\"\n                            }, {\n                              default: _withCtx(() => [\n                                _withDirectives(_createElementVNode(\"input\", {\n                                  id: \"st-email\",\n                                  maxlength: \"254\",\n                                  \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => (($setup.companyEmail) = $event)),\n                                  type: \"email\",\n                                  class: _normalizeClass([\"hh-input\", { 'hh-input--error': $setup.fieldErrors.companyEmail }]),\n                                  \"aria-invalid\": Boolean($setup.fieldErrors.companyEmail)\n                                }, null, 10 /* CLASS, PROPS */, _hoisted_13), [\n                                  [\n                                    _vModelText,\n                                    $setup.companyEmail,\n                                    void 0,\n                                    { trim: true }\n                                  ]\n                                ])\n                              ]),\n                              _: 1 /* STABLE */\n                            }, 8 /* PROPS */, [\"error\"]),\n                            _createVNode($setup[\"FormField\"], {\n                              label: \"KVK-nummer\",\n                              \"for-id\": \"st-kvk\"\n                            }, {\n                              default: _withCtx(() => [\n                                _withDirectives(_createElementVNode(\"input\", {\n                                  id: \"st-kvk\",\n                                  maxlength: \"250\",\n                                  \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => (($setup.companyKvk) = $event)),\n                                  class: \"hh-input\"\n                                }, null, 512 /* NEED_PATCH */), [\n                                  [\n                                    _vModelText,\n                                    $setup.companyKvk,\n                                    void 0,\n                                    { trim: true }\n                                  ]\n                                ])\n                              ]),\n                              _: 1 /* STABLE */\n                            }),\n                            _createVNode($setup[\"FormField\"], {\n                              label: \"Btw-nummer\",\n                              \"for-id\": \"st-company-vat\"\n                            }, {\n                              default: _withCtx(() => [\n                                _withDirectives(_createElementVNode(\"input\", {\n                                  id: \"st-company-vat\",\n                                  maxlength: \"250\",\n                                  \"onUpdate:modelValue\": _cache[5] || (_cache[5] = $event => (($setup.companyVat) = $event)),\n                                  class: \"hh-input\"\n                                }, null, 512 /* NEED_PATCH */), [\n                                  [\n                                    _vModelText,\n                                    $setup.companyVat,\n                                    void 0,\n                                    { trim: true }\n                                  ]\n                                ])\n                              ]),\n                              _: 1 /* STABLE */\n                            }),\n                            _createVNode($setup[\"FormField\"], {\n                              label: \"IBAN\",\n                              \"for-id\": \"st-iban\"\n                            }, {\n                              default: _withCtx(() => [\n                                _withDirectives(_createElementVNode(\"input\", {\n                                  id: \"st-iban\",\n                                  maxlength: \"250\",\n                                  \"onUpdate:modelValue\": _cache[6] || (_cache[6] = $event => (($setup.companyIban) = $event)),\n                                  class: \"hh-input\"\n                                }, null, 512 /* NEED_PATCH */), [\n                                  [\n                                    _vModelText,\n                                    $setup.companyIban,\n                                    void 0,\n                                    { trim: true }\n                                  ]\n                                ])\n                              ]),\n                              _: 1 /* STABLE */\n                            }),\n                            _createVNode($setup[\"FormField\"], {\n                              label: \"Mailondertekening\",\n                              \"for-id\": \"st-signature\",\n                              hint: \"Volledige ondertekening, inclusief eventuele groet.\"\n                            }, {\n                              default: _withCtx(() => [\n                                _withDirectives(_createElementVNode(\"textarea\", {\n                                  id: \"st-signature\",\n                                  maxlength: \"2000\",\n                                  \"onUpdate:modelValue\": _cache[7] || (_cache[7] = $event => (($setup.companyMailSignature) = $event)),\n                                  class: \"hh-input\",\n                                  rows: \"4\"\n                                }, null, 512 /* NEED_PATCH */), [\n                                  [_vModelText, $setup.companyMailSignature]\n                                ])\n                              ]),\n                              _: 1 /* STABLE */\n                            })\n                          ])\n                        ]))\n                      : _createCommentVNode(\"v-if\", true),\n                    ($props.section === 'facturen')\n                      ? (_openBlock(), _createElementBlock(_Fragment, { key: 2 }, [\n                          _createElementVNode(\"section\", _hoisted_14, [\n                            _cache[13] || (_cache[13] = _createElementVNode(\"h2\", { class: \"st__ptitle\" }, \"Vaste factuuromschrijvingen\", -1 /* CACHED */)),\n                            _createElementVNode(\"div\", _hoisted_15, [\n                              (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.invoiceTexts, (_, i) => {\n                                return (_openBlock(), _createElementBlock(\"div\", {\n                                  key: i,\n                                  class: \"st__bccrow\"\n                                }, [\n                                  _withDirectives(_createElementVNode(\"input\", {\n                                    \"onUpdate:modelValue\": $event => (($setup.invoiceTexts[i]) = $event),\n                                    class: \"hh-input\",\n                                    \"aria-label\": `Factuuromschrijving ${i + 1}`,\n                                    maxlength: \"250\",\n                                    \"aria-invalid\": Boolean($setup.fieldErrors.invoiceTexts)\n                                  }, null, 8 /* PROPS */, _hoisted_16), [\n                                    [_vModelText, $setup.invoiceTexts[i]]\n                                  ]),\n                                  _createElementVNode(\"button\", {\n                                    class: \"hh-btn hh-btn--danger\",\n                                    type: \"button\",\n                                    onClick: $event => ($setup.invoiceTexts.splice(i, 1))\n                                  }, \"Verwijderen\", 8 /* PROPS */, _hoisted_17)\n                                ]))\n                              }), 128 /* KEYED_FRAGMENT */)),\n                              ($setup.invoiceTexts.length === 0)\n                                ? (_openBlock(), _createElementBlock(\"p\", _hoisted_18, \"Nog geen vaste omschrijvingen ingesteld.\"))\n                                : _createCommentVNode(\"v-if\", true),\n                              ($setup.fieldErrors.invoiceTexts)\n                                ? (_openBlock(), _createElementBlock(\"p\", _hoisted_19, _toDisplayString($setup.fieldErrors.invoiceTexts), 1 /* TEXT */))\n                                : _createCommentVNode(\"v-if\", true),\n                              _createElementVNode(\"button\", {\n                                class: \"hh-btn st__bccadd\",\n                                type: \"button\",\n                                disabled: $setup.invoiceTexts.length >= 100,\n                                onClick: _cache[8] || (_cache[8] = $event => ($setup.invoiceTexts.push('')))\n                              }, \"+ Omschrijving toevoegen\", 8 /* PROPS */, _hoisted_20)\n                            ])\n                          ]),\n                          _createElementVNode(\"section\", _hoisted_21, [\n                            _cache[14] || (_cache[14] = _createElementVNode(\"h2\", { class: \"st__ptitle\" }, \"Btw\", -1 /* CACHED */)),\n                            _createElementVNode(\"div\", _hoisted_22, [\n                              _createVNode($setup[\"FormField\"], {\n                                label: \"Standaard btw (%)\",\n                                \"for-id\": \"st-vat\",\n                                error: $setup.fieldErrors.vat\n                              }, {\n                                default: _withCtx(() => [\n                                  _withDirectives(_createElementVNode(\"input\", {\n                                    id: \"st-vat\",\n                                    \"onUpdate:modelValue\": _cache[9] || (_cache[9] = $event => (($setup.vatRate) = $event)),\n                                    class: _normalizeClass([\"hh-input hh-input--num st__vat\", { 'hh-input--error': $setup.fieldErrors.vat }]),\n                                    inputmode: \"decimal\"\n                                  }, null, 2 /* CLASS */), [\n                                    [\n                                      _vModelText,\n                                      $setup.vatRate,\n                                      void 0,\n                                      { trim: true }\n                                    ]\n                                  ])\n                                ]),\n                                _: 1 /* STABLE */\n                              }, 8 /* PROPS */, [\"error\"])\n                            ])\n                          ]),\n                          _createElementVNode(\"section\", _hoisted_23, [\n                            _cache[15] || (_cache[15] = _createElementVNode(\"h2\", { class: \"st__ptitle\" }, \"Bcc-adressen facturen\", -1 /* CACHED */)),\n                            _cache[16] || (_cache[16] = _createElementVNode(\"p\", { class: \"hh-muted st__hint\" }, \" Elke verzonden factuur gaat blind ook naar deze adressen (bijvoorbeeld Snelstart). Bij het aanmaken van een factuur kun je per adres kiezen of het meegaat. \", -1 /* CACHED */)),\n                            _createElementVNode(\"div\", _hoisted_24, [\n                              (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.bccEmails, (_, i) => {\n                                return (_openBlock(), _createElementBlock(\"div\", {\n                                  key: i,\n                                  class: \"st__bccrow\"\n                                }, [\n                                  _withDirectives(_createElementVNode(\"input\", {\n                                    \"onUpdate:modelValue\": $event => (($setup.bccEmails[i]) = $event),\n                                    type: \"email\",\n                                    class: \"hh-input\",\n                                    placeholder: \"bijv. administratie@voorbeeld.nl\"\n                                  }, null, 8 /* PROPS */, _hoisted_25), [\n                                    [\n                                      _vModelText,\n                                      $setup.bccEmails[i],\n                                      void 0,\n                                      { trim: true }\n                                    ]\n                                  ]),\n                                  _createElementVNode(\"button\", {\n                                    class: \"hh-btn hh-btn--danger\",\n                                    type: \"button\",\n                                    onClick: $event => ($setup.removeBcc(i))\n                                  }, \"Verwijderen\", 8 /* PROPS */, _hoisted_26)\n                                ]))\n                              }), 128 /* KEYED_FRAGMENT */)),\n                              ($setup.bccEmails.length === 0)\n                                ? (_openBlock(), _createElementBlock(\"p\", _hoisted_27, \"Nog geen Bcc-adressen ingesteld.\"))\n                                : _createCommentVNode(\"v-if\", true),\n                              _createElementVNode(\"button\", {\n                                class: \"hh-btn st__bccadd\",\n                                type: \"button\",\n                                onClick: $setup.addBcc\n                              }, \"+ Bcc-adres toevoegen\")\n                            ])\n                          ])\n                        ], 64 /* STABLE_FRAGMENT */))\n                      : _createCommentVNode(\"v-if\", true),\n                    _createElementVNode(\"div\", _hoisted_28, [\n                      _createElementVNode(\"button\", {\n                        class: \"hh-btn hh-btn--primary\",\n                        type: \"button\",\n                        disabled: $setup.saving,\n                        onClick: $setup.save\n                      }, _toDisplayString($setup.saving ? \"Opslaan…\" : \"Instellingen opslaan\"), 9 /* TEXT, PROPS */, _hoisted_29)\n                    ])\n                  ], 64 /* STABLE_FRAGMENT */))\n                : _createCommentVNode(\"v-if\", true)\n          ], 64 /* STABLE_FRAGMENT */))\n  ]))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/SettingsView.vue?type=script\";import \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/SettingsView.vue?type=style&index=0\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/SettingsView.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/SettingsView.vue\";script.__scopeId = \"data-v-47b33103\";export default script;","<template>\n  <section>\n    <div class=\"hh-page__bar\">\n      <div>\n        <h1 class=\"hh-page__title\">Profiel</h1>\n        <p class=\"hh-page__sub\">Je eigen gegevens en de keuzes die dit apparaat voor je onthoudt.</p>\n      </div>\n    </div>\n\n    <div v-if=\"loading\" class=\"hh-empty\">Laden…</div>\n\n    <template v-else>\n      <p v-if=\"notice\" class=\"pf__notice\">{{ notice }}</p>\n      <p v-if=\"loadError\" class=\"hh-formerror\">{{ loadError }}</p>\n\n      <section class=\"hh-card pf__panel\">\n        <h2 class=\"pf__ptitle\">Mijn gegevens</h2>\n        <p class=\"hh-muted pf__hint\">Naam en e-mailadres van je eigen account.</p>\n        <div class=\"pf__grid\">\n          <FormField label=\"Voornaam\" for-id=\"pf-firstname\" :required=\"true\" :error=\"fieldErrors.firstName\">\n            <input\n              id=\"pf-firstname\"\n              v-model.trim=\"firstName\"\n              class=\"hh-input\"\n              :class=\"{ 'hh-input--error': fieldErrors.firstName }\"\n              autocomplete=\"given-name\"\n              @input=\"clearFieldError('firstName')\"\n            />\n          </FormField>\n          <FormField label=\"Achternaam\" for-id=\"pf-lastname\">\n            <input\n              id=\"pf-lastname\"\n              v-model.trim=\"lastName\"\n              class=\"hh-input\"\n              autocomplete=\"family-name\"\n            />\n          </FormField>\n          <FormField label=\"E-mailadres\" for-id=\"pf-email\" :required=\"true\" :error=\"fieldErrors.email\">\n            <input\n              id=\"pf-email\"\n              v-model.trim=\"email\"\n              class=\"hh-input\"\n              type=\"email\"\n              inputmode=\"email\"\n              autocomplete=\"email\"\n              :class=\"{ 'hh-input--error': fieldErrors.email }\"\n              @input=\"clearFieldError('email')\"\n            />\n          </FormField>\n        </div>\n\n        <p v-if=\"saveError\" class=\"hh-formerror pf__saveerror\">{{ saveError }}</p>\n\n        <div class=\"pf__actions\">\n          <button class=\"hh-btn hh-btn--primary\" type=\"button\" :disabled=\"saving\" @click=\"save\">\n            {{ saving ? \"Opslaan…\" : \"Gegevens opslaan\" }}\n          </button>\n        </div>\n      </section>\n\n      <section class=\"hh-card pf__panel\">\n        <h2 class=\"pf__ptitle\">Onthouden keuzes</h2>\n        <p class=\"hh-muted pf__hint\">\n          Keuzes die je hebt laten onthouden, zoals \"Onthoud mijn keuze\" bij het verwerken van uren. Zet ze hier terug.\n        </p>\n        <ul class=\"pf__prefs\">\n          <li v-for=\"pref in preferences\" :key=\"pref.key\" class=\"pf__pref\">\n            <div class=\"pf__prefinfo\">\n              <span class=\"pf__preflabel\">{{ pref.label }}</span>\n              <span class=\"pf__prefdesc hh-muted\">{{ pref.description }}</span>\n            </div>\n            <div class=\"pf__prefright\">\n              <span class=\"pf__badge\" :class=\"prefStates[pref.key] ? 'pf__badge--on' : 'pf__badge--off'\">\n                {{ prefStates[pref.key] ? \"Aan\" : \"Uit\" }}\n              </span>\n              <button\n                class=\"hh-btn\"\n                type=\"button\"\n                :disabled=\"!prefStates[pref.key]\"\n                @click=\"reset(pref.key)\"\n              >\n                Terugzetten\n              </button>\n            </div>\n          </li>\n        </ul>\n      </section>\n    </template>\n  </section>\n</template>\n\n<script setup lang=\"ts\">\nimport { onMounted, reactive, ref } from \"vue\";\nimport { useApi } from \"../lib/api\";\nimport { showToast } from \"../lib/toast\";\nimport { isPreferenceSet, preferences, resetPreference } from \"../lib/preferences\";\nimport FormField from \"../components/FormField.vue\";\n\nconst api = useApi();\n\nconst loading = ref(true);\nconst saving = ref(false);\nconst loadError = ref(\"\");\nconst saveError = ref(\"\");\nconst notice = ref(\"\");\n\nconst firstName = ref(\"\");\nconst lastName = ref(\"\");\nconst email = ref(\"\");\nconst fieldErrors = reactive<Record<string, string>>({});\n\n// E-mail waaronder dit account is ingelogd: sleutel voor de onthouden voorkeuren.\n// Blijft de geladen waarde (verandert niet mee met het bewerkbare e-mailveld).\nconst accountEmail = ref(\"\");\nconst prefStates = reactive<Record<string, boolean>>({});\n\nconst EMAIL_RE = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\nfunction clearFieldError(field: string): void {\n  delete fieldErrors[field];\n}\n\nfunction refreshPrefStates(): void {\n  for (const pref of preferences) {\n    prefStates[pref.key] = isPreferenceSet(accountEmail.value, pref.key);\n  }\n}\n\nasync function load(): Promise<void> {\n  loading.value = true;\n  loadError.value = \"\";\n  try {\n    const profile = await api.getProfile();\n    firstName.value = profile.firstName;\n    lastName.value = profile.lastName;\n    email.value = profile.email;\n    accountEmail.value = profile.email;\n    refreshPrefStates();\n  } catch {\n    loadError.value = \"Kon je profiel niet laden.\";\n  } finally {\n    loading.value = false;\n  }\n}\n\nfunction validate(): boolean {\n  for (const key of Object.keys(fieldErrors)) delete fieldErrors[key];\n  if (!firstName.value.trim()) fieldErrors.firstName = \"Vul je voornaam in.\";\n  if (!email.value.trim()) {\n    fieldErrors.email = \"Vul je e-mailadres in.\";\n  } else if (!EMAIL_RE.test(email.value.trim())) {\n    fieldErrors.email = \"Vul een geldig e-mailadres in.\";\n  }\n  const firstBad = [\"firstName\", \"email\"].find((field) => fieldErrors[field]);\n  if (firstBad) {\n    const id = firstBad === \"firstName\" ? \"pf-firstname\" : \"pf-email\";\n    document.getElementById(id)?.focus();\n    return false;\n  }\n  return true;\n}\n\nasync function save(): Promise<void> {\n  notice.value = \"\";\n  saveError.value = \"\";\n  if (!validate()) return;\n  saving.value = true;\n  try {\n    await api.updateProfile({\n      firstName: firstName.value.trim(),\n      lastName: lastName.value.trim(),\n      email: email.value.trim(),\n    });\n    notice.value = \"Je gegevens zijn opgeslagen.\";\n  } catch (e) {\n    saveError.value = e instanceof Error ? e.message : \"Opslaan mislukt.\";\n  } finally {\n    saving.value = false;\n  }\n}\n\nfunction reset(key: string): void {\n  resetPreference(accountEmail.value, key);\n  refreshPrefStates();\n  showToast(\"Voorkeur teruggezet.\");\n}\n\nonMounted(() => { void load(); });\n</script>\n\n<style scoped>\n.pf__notice {\n  margin: 0 0 12px;\n  padding: 9px 12px;\n  border: 1px solid rgba(37, 122, 62, 0.5);\n  border-radius: var(--hh-radius);\n  background: var(--hh-accent-soft);\n  color: var(--hh-accent-strong);\n  font-size: 13px;\n}\n.pf__panel {\n  padding: 16px 18px;\n  margin-bottom: 18px;\n}\n.pf__ptitle {\n  margin: 0 0 4px;\n  font-size: 15px;\n  font-weight: 700;\n}\n.pf__hint {\n  margin: 0 0 14px;\n  font-size: 12.5px;\n}\n.pf__grid {\n  display: grid;\n  grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));\n  gap: 14px;\n}\n.pf__saveerror {\n  margin: 10px 0 0;\n}\n.pf__actions {\n  display: flex;\n  gap: 8px;\n  margin-top: 12px;\n}\n.pf__prefs {\n  list-style: none;\n  margin: 0;\n  padding: 0;\n  display: grid;\n  gap: 10px;\n}\n.pf__pref {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: 16px;\n  padding: 12px 14px;\n  border: 1px solid var(--hh-line);\n  border-radius: var(--hh-radius);\n  background: var(--hh-surface);\n}\n.pf__prefinfo {\n  display: flex;\n  flex-direction: column;\n  gap: 2px;\n}\n.pf__preflabel {\n  font-size: 13.5px;\n  font-weight: 600;\n}\n.pf__prefdesc {\n  font-size: 12.5px;\n}\n.pf__prefright {\n  display: flex;\n  align-items: center;\n  gap: 10px;\n  flex: none;\n}\n.pf__badge {\n  font-size: 11px;\n  font-weight: 700;\n  text-transform: uppercase;\n  letter-spacing: 0.04em;\n  padding: 2px 8px;\n  border-radius: 999px;\n}\n.pf__badge--on {\n  background: var(--hh-accent-soft);\n  color: var(--hh-accent-strong);\n}\n.pf__badge--off {\n  background: var(--hh-line);\n  color: var(--hh-fg-subtle);\n}\n</style>\n","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString, vModelText as _vModelText, normalizeClass as _normalizeClass, withDirectives as _withDirectives, withCtx as _withCtx, createVNode as _createVNode, renderList as _renderList, Fragment as _Fragment } from \"vue\"\n\nconst _hoisted_1 = {\n  key: 0,\n  class: \"hh-empty\"\n}\nconst _hoisted_2 = {\n  key: 0,\n  class: \"pf__notice\"\n}\nconst _hoisted_3 = {\n  key: 1,\n  class: \"hh-formerror\"\n}\nconst _hoisted_4 = { class: \"hh-card pf__panel\" }\nconst _hoisted_5 = { class: \"pf__grid\" }\nconst _hoisted_6 = {\n  key: 0,\n  class: \"hh-formerror pf__saveerror\"\n}\nconst _hoisted_7 = { class: \"pf__actions\" }\nconst _hoisted_8 = [\"disabled\"]\nconst _hoisted_9 = { class: \"hh-card pf__panel\" }\nconst _hoisted_10 = { class: \"pf__prefs\" }\nconst _hoisted_11 = { class: \"pf__prefinfo\" }\nconst _hoisted_12 = { class: \"pf__preflabel\" }\nconst _hoisted_13 = { class: \"pf__prefdesc hh-muted\" }\nconst _hoisted_14 = { class: \"pf__prefright\" }\nconst _hoisted_15 = [\"disabled\", \"onClick\"]\n\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n  return (_openBlock(), _createElementBlock(\"section\", null, [\n    _cache[9] || (_cache[9] = _createElementVNode(\"div\", { class: \"hh-page__bar\" }, [\n      _createElementVNode(\"div\", null, [\n        _createElementVNode(\"h1\", { class: \"hh-page__title\" }, \"Profiel\"),\n        _createElementVNode(\"p\", { class: \"hh-page__sub\" }, \"Je eigen gegevens en de keuzes die dit apparaat voor je onthoudt.\")\n      ])\n    ], -1 /* CACHED */)),\n    ($setup.loading)\n      ? (_openBlock(), _createElementBlock(\"div\", _hoisted_1, \"Laden…\"))\n      : (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n          ($setup.notice)\n            ? (_openBlock(), _createElementBlock(\"p\", _hoisted_2, _toDisplayString($setup.notice), 1 /* TEXT */))\n            : _createCommentVNode(\"v-if\", true),\n          ($setup.loadError)\n            ? (_openBlock(), _createElementBlock(\"p\", _hoisted_3, _toDisplayString($setup.loadError), 1 /* TEXT */))\n            : _createCommentVNode(\"v-if\", true),\n          _createElementVNode(\"section\", _hoisted_4, [\n            _cache[5] || (_cache[5] = _createElementVNode(\"h2\", { class: \"pf__ptitle\" }, \"Mijn gegevens\", -1 /* CACHED */)),\n            _cache[6] || (_cache[6] = _createElementVNode(\"p\", { class: \"hh-muted pf__hint\" }, \"Naam en e-mailadres van je eigen account.\", -1 /* CACHED */)),\n            _createElementVNode(\"div\", _hoisted_5, [\n              _createVNode($setup[\"FormField\"], {\n                label: \"Voornaam\",\n                \"for-id\": \"pf-firstname\",\n                required: true,\n                error: $setup.fieldErrors.firstName\n              }, {\n                default: _withCtx(() => [\n                  _withDirectives(_createElementVNode(\"input\", {\n                    id: \"pf-firstname\",\n                    \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => (($setup.firstName) = $event)),\n                    class: _normalizeClass([\"hh-input\", { 'hh-input--error': $setup.fieldErrors.firstName }]),\n                    autocomplete: \"given-name\",\n                    onInput: _cache[1] || (_cache[1] = $event => ($setup.clearFieldError('firstName')))\n                  }, null, 34 /* CLASS, NEED_HYDRATION */), [\n                    [\n                      _vModelText,\n                      $setup.firstName,\n                      void 0,\n                      { trim: true }\n                    ]\n                  ])\n                ]),\n                _: 1 /* STABLE */\n              }, 8 /* PROPS */, [\"error\"]),\n              _createVNode($setup[\"FormField\"], {\n                label: \"Achternaam\",\n                \"for-id\": \"pf-lastname\"\n              }, {\n                default: _withCtx(() => [\n                  _withDirectives(_createElementVNode(\"input\", {\n                    id: \"pf-lastname\",\n                    \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => (($setup.lastName) = $event)),\n                    class: \"hh-input\",\n                    autocomplete: \"family-name\"\n                  }, null, 512 /* NEED_PATCH */), [\n                    [\n                      _vModelText,\n                      $setup.lastName,\n                      void 0,\n                      { trim: true }\n                    ]\n                  ])\n                ]),\n                _: 1 /* STABLE */\n              }),\n              _createVNode($setup[\"FormField\"], {\n                label: \"E-mailadres\",\n                \"for-id\": \"pf-email\",\n                required: true,\n                error: $setup.fieldErrors.email\n              }, {\n                default: _withCtx(() => [\n                  _withDirectives(_createElementVNode(\"input\", {\n                    id: \"pf-email\",\n                    \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => (($setup.email) = $event)),\n                    class: _normalizeClass([\"hh-input\", { 'hh-input--error': $setup.fieldErrors.email }]),\n                    type: \"email\",\n                    inputmode: \"email\",\n                    autocomplete: \"email\",\n                    onInput: _cache[4] || (_cache[4] = $event => ($setup.clearFieldError('email')))\n                  }, null, 34 /* CLASS, NEED_HYDRATION */), [\n                    [\n                      _vModelText,\n                      $setup.email,\n                      void 0,\n                      { trim: true }\n                    ]\n                  ])\n                ]),\n                _: 1 /* STABLE */\n              }, 8 /* PROPS */, [\"error\"])\n            ]),\n            ($setup.saveError)\n              ? (_openBlock(), _createElementBlock(\"p\", _hoisted_6, _toDisplayString($setup.saveError), 1 /* TEXT */))\n              : _createCommentVNode(\"v-if\", true),\n            _createElementVNode(\"div\", _hoisted_7, [\n              _createElementVNode(\"button\", {\n                class: \"hh-btn hh-btn--primary\",\n                type: \"button\",\n                disabled: $setup.saving,\n                onClick: $setup.save\n              }, _toDisplayString($setup.saving ? \"Opslaan…\" : \"Gegevens opslaan\"), 9 /* TEXT, PROPS */, _hoisted_8)\n            ])\n          ]),\n          _createElementVNode(\"section\", _hoisted_9, [\n            _cache[7] || (_cache[7] = _createElementVNode(\"h2\", { class: \"pf__ptitle\" }, \"Onthouden keuzes\", -1 /* CACHED */)),\n            _cache[8] || (_cache[8] = _createElementVNode(\"p\", { class: \"hh-muted pf__hint\" }, \" Keuzes die je hebt laten onthouden, zoals \\\"Onthoud mijn keuze\\\" bij het verwerken van uren. Zet ze hier terug. \", -1 /* CACHED */)),\n            _createElementVNode(\"ul\", _hoisted_10, [\n              (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($setup.preferences, (pref) => {\n                return (_openBlock(), _createElementBlock(\"li\", {\n                  key: pref.key,\n                  class: \"pf__pref\"\n                }, [\n                  _createElementVNode(\"div\", _hoisted_11, [\n                    _createElementVNode(\"span\", _hoisted_12, _toDisplayString(pref.label), 1 /* TEXT */),\n                    _createElementVNode(\"span\", _hoisted_13, _toDisplayString(pref.description), 1 /* TEXT */)\n                  ]),\n                  _createElementVNode(\"div\", _hoisted_14, [\n                    _createElementVNode(\"span\", {\n                      class: _normalizeClass([\"pf__badge\", $setup.prefStates[pref.key] ? 'pf__badge--on' : 'pf__badge--off'])\n                    }, _toDisplayString($setup.prefStates[pref.key] ? \"Aan\" : \"Uit\"), 3 /* TEXT, CLASS */),\n                    _createElementVNode(\"button\", {\n                      class: \"hh-btn\",\n                      type: \"button\",\n                      disabled: !$setup.prefStates[pref.key],\n                      onClick: $event => ($setup.reset(pref.key))\n                    }, \" Terugzetten \", 8 /* PROPS */, _hoisted_15)\n                  ])\n                ]))\n              }), 128 /* KEYED_FRAGMENT */))\n            ])\n          ])\n        ], 64 /* STABLE_FRAGMENT */))\n  ]))\n}","import script from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/ProfileView.vue?type=script\";import \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/ProfileView.vue?type=style&index=0\";import { render } from \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/ProfileView.vue?type=template\"; script.render = render;script.__file = \"../opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/views/ProfileView.vue\";script.__scopeId = \"data-v-4d26f72b\";export default script;","// Hash-based router. WebHare's Publisher serveert de webdesign onder één vast\n// site-root; alle in-app navigatie leeft in de URL-hash zodat WebHare nooit een\n// in-app pad ziet (en daar 404 op geeft).\n\nimport { customerListPosition, clearCustomerListPosition } from \"./customerNavigation\";\nimport { queryRecord, sameQuery } from \"./routeQuery\";\nimport { createRouter, createWebHashHistory, type RouteRecordRaw } from \"vue-router\";\n\nimport { refreshAccount } from \"./api\";\nimport { organizationSession, organizationDestination, organizationSlug, organizationTag, setOrganization, mayLeaveOrganization } from \"./organization\";\nimport { dismissToast } from \"./toast\";\nimport OrganizationChoiceView from \"../views/OrganizationChoiceView.vue\";\nimport OrganizationUsersView from \"../views/OrganizationUsersView.vue\";\nimport InvitationView from \"../views/InvitationView.vue\";\nimport LoginForm from \"../components/LoginForm.vue\";\n\nimport DashboardView from \"../views/DashboardView.vue\";\nimport CustomersView from \"../views/CustomersView.vue\";\nimport CustomerReportsView from \"../views/CustomerReportsView.vue\";\nimport CustomerDetailView from \"../views/CustomerDetailView.vue\";\nimport EmployeesView from \"../views/EmployeesView.vue\";\nimport EmployeeDetailView from \"../views/EmployeeDetailView.vue\";\nimport ActivitiesView from \"../views/ActivitiesView.vue\";\nimport ActivityDetailView from \"../views/ActivityDetailView.vue\";\nimport HoursEntryView from \"../views/HoursEntryView.vue\";\nimport HoursOverviewView from \"../views/HoursOverviewView.vue\";\nimport HoursWeekView from \"../views/HoursWeekView.vue\";\nimport InvoicesView from \"../views/InvoicesView.vue\";\nimport InvoiceWizardView from \"../views/InvoiceWizardView.vue\";\nimport InvoiceDetailView from \"../views/InvoiceDetailView.vue\";\nimport CustomerStatementView from \"../views/CustomerStatementView.vue\";\nimport ReminderDetailView from \"../views/ReminderDetailView.vue\";\nimport ExpensesView from \"../views/ExpensesView.vue\";\nimport ExpenseEntryView from \"../views/ExpenseEntryView.vue\";\nimport SettingsView from \"../views/SettingsView.vue\";\nimport ProfileView from \"../views/ProfileView.vue\";\n\n// Alle schermen draaien op echte views (fases 6-10 afgerond).\nconst routes: RouteRecordRaw[] = [\n  { path: \"/\", name: \"home\", component: DashboardView },\n\n  { path: \"/uren\", name: \"uren-invoeren\", component: HoursEntryView, meta: { title: \"Urenmutaties · Invoeren\" } },\n  { path: \"/uren/overzicht\", name: \"uren-overzicht\", component: HoursOverviewView, meta: { title: \"Urenmutaties · Overzicht\" } },\n  { path: \"/uren/week\", name: \"uren-week\", component: HoursWeekView, meta: { title: \"Urenmutaties · Weekoverzicht\" } },\n\n  { path: \"/fakturen\", name: \"fakturen\", component: InvoicesView, meta: { title: \"Facturen · Overzicht\" } },\n  { path: \"/fakturen/overzicht\", name: \"fakturen-overzicht\", component: CustomerStatementView, meta: { title: \"Facturen · Overzicht fakturen/uren\" } },\n  { path: \"/fakturen/nieuw\", name: \"fakturen-nieuw\", component: InvoiceWizardView, meta: { title: \"Facturen · Nieuwe factuur\" } },\n  { path: \"/fakturen/:id(\\\\d+)/bewerken\", name: \"fakturen-bewerken\", component: InvoiceWizardView, meta: { title: \"Facturen · Bewerken\" } },\n  { path: \"/fakturen/:id(\\\\d+)\", name: \"fakturen-detail\", component: InvoiceDetailView, meta: { title: \"Facturen · Detail\" } },\n\n  { path: \"/herinneringen/:id(\\\\d+)\", name: \"herinneringen-detail\", component: ReminderDetailView, meta: { title: \"Facturen · Betalingsherinnering\" } },\n\n  { path: \"/klanten\", name: \"klanten\", component: CustomersView, meta: { title: \"Klanten · Overzicht\" } },\n  { path: \"/klanten/declaraties\", name: \"klanten-declaraties\", component: CustomerReportsView, props: { mode: \"declarations\" }, meta: { title: \"Klanten · Declaratieoverzicht\" } },\n  { path: \"/klanten/budgetten\", name: \"klanten-budgetten\", component: CustomerReportsView, props: { mode: \"budgets\" }, meta: { title: \"Klanten · Budgetoverzicht\" } },\n  { path: \"/klanten/nieuw\", name: \"klanten-nieuw\", component: CustomersView, meta: { title: \"Klanten · Nieuwe klant\" } },\n  { path: \"/klanten/:id(\\\\d+)\", name: \"klanten-detail\", component: CustomerDetailView, meta: { title: \"Klanten · Detail\" } },\n\n  { path: \"/werknemers\", name: \"werknemers\", component: EmployeesView, meta: { title: \"Werknemers\" } },\n  { path: \"/werknemers/:id(\\\\d+)\", name: \"werknemers-detail\", component: EmployeeDetailView, meta: { title: \"Werknemers · Detail\" } },\n  { path: \"/werkzaamheden\", name: \"werkzaamheden\", component: ActivitiesView, meta: { title: \"Werkzaamheden\" } },\n  { path: \"/werkzaamheden/:id(\\\\d+)\", name: \"werkzaamheden-detail\", component: ActivityDetailView, meta: { title: \"Werkzaamheden · Detail\" } },\n\n  { path: \"/verschotten\", name: \"verschotten\", component: ExpensesView, meta: { title: \"Verschotten · Overzicht\" } },\n  { path: \"/verschotten/invoeren\", name: \"verschotten-invoeren\", component: ExpenseEntryView, meta: { title: \"Verschotten · Invoeren\" } },\n\n  { path: \"/systeem/profiel\", name: \"profiel\", component: ProfileView, meta: { title: \"Instellingen · Profiel\" } },\n  // Preserve existing bookmarks while each settings section gets its own screen.\n  { path: \"/systeem/instellingen\", name: \"instellingen\", redirect: { name: \"instellingen-bedrijf\" } },\n  { path: \"/systeem/instellingen/bedrijf\", name: \"instellingen-bedrijf\", component: SettingsView, props: { section: \"bedrijf\" }, meta: { title: \"Instellingen · Bedrijf\" } },\n  { path: \"/systeem/instellingen/huisstijl\", name: \"instellingen-huisstijl\", component: SettingsView, props: { section: \"huisstijl\" }, meta: { title: \"Instellingen · Huisstijl\" } },\n  { path: \"/systeem/instellingen/facturen\", name: \"instellingen-facturen\", component: SettingsView, props: { section: \"facturen\" }, meta: { title: \"Instellingen · Facturen\" } },\n  { path: \"/systeem/instellingen/uren\", name: \"instellingen-uren\", component: SettingsView, props: { section: \"uren\" }, meta: { title: \"Instellingen · Uren\" } },\n  { path: \"/systeem/instellingen/verschotten\", name: \"instellingen-verschotten\", component: SettingsView, props: { section: \"verschotten\" }, meta: { title: \"Instellingen · Verschotten\" } },\n  { path: \"/systeem/instellingen/gebruikers\", name: \"instellingen-gebruikers\", component: OrganizationUsersView, meta: { title: \"Instellingen · Gebruikers\" } },\n\n  { path: \"/:pathMatch(.*)*\", redirect: \"/\" },\n];\n\nexport const router = createRouter({\n  history: createWebHashHistory(),\n  routes: [\n    { path: \"/uitnodiging/:organization/:token\", name: \"uitnodiging\", component: InvitationView, meta: { public: true, title: \"Uitnodiging\" } },\n    { path: \"/wachtwoord-instellen\", name: \"wachtwoord-instellen\", component: LoginForm, props: to => ({ initialEmail: typeof to.query.email === \"string\" ? to.query.email : \"\", initialReset: true }), meta: { public: true, title: \"Wachtwoord instellen\" } },\n    { path: \"/organisaties\", name: \"organisaties\", component: OrganizationChoiceView },\n    ...routes.filter(route => route.name === \"profiel\"),\n    ...routes.filter(route => route.name !== \"profiel\" && !route.path.includes(\"pathMatch\")).map(route => ({ ...route, path: `/o/:organization${route.path}` })),\n    ...routes.filter(route => route.name !== \"profiel\" && !route.path.includes(\"pathMatch\")).map(route => ({ path: route.path, component: OrganizationChoiceView })),\n    { path: \"/o/:organization/:pathMatch(.*)*\", redirect: to => ({ name: \"home\", params: { organization: to.params.organization } }) },\n    { path: \"/:pathMatch(.*)*\", redirect: \"/\" },\n  ],\n  scrollBehavior(to) {\n    // The customer list restores its viewport after its asynchronous rows render.\n    // A router scroll would race that restoration and return the list to the top.\n    if (to.name === \"klanten\" && customerListPosition && sameQuery(queryRecord(to.query), customerListPosition.query)) return false;\n    return { top: 0 };\n  },\n});\n\nrouter.beforeEach(async to => {\n  const loggedIn = document.documentElement.classList.contains(\"wh-wrdauth--isloggedin\");\n  if (to.meta.public) return loggedIn && to.name === \"wachtwoord-instellen\" ? { path: \"/\" } : true;\n  if (!loggedIn) return true;\n  if (!organizationSession.account) {\n    try { await refreshAccount(); } catch { return to.name === \"organisaties\" ? true : { name: \"organisaties\" }; }\n  }\n  const slug = typeof to.params.organization === \"string\" ? to.params.organization : null;\n  const tag = slug ? organizationTag(slug) : null;\n  const previous = organizationSession.organization?.tag ?? null;\n  if (tag !== previous && previous && !await mayLeaveOrganization()) return false;\n  if (tag) {\n    const organization = organizationSession.account?.organizations.find(item => item.tag === tag);\n    if (!organization) {\n      organizationSession.error = \"Je hebt geen toegang tot deze administratie. Kies een beschikbare administratie.\";\n      return { name: \"organisaties\" };\n    }\n    // Old links carry the full tag; redirect them to the short key before anything renders.\n    if (slug !== organizationSlug(tag)) return { name: to.name!, params: { ...to.params, organization: organizationSlug(tag) }, query: to.query, hash: to.hash };\n    if (String(to.name).startsWith(\"instellingen\") && organization.role !== \"admin\") return { name: \"home\", params: { organization: slug } };\n    try { localStorage.setItem(`happy:lastOrganization:${organizationSession.account!.guid}`, tag); } catch { /* best effort */ }\n  } else if (to.name !== \"organisaties\" && to.name !== \"profiel\") {\n    let preferred = \"\";\n    try { preferred = localStorage.getItem(`happy:lastOrganization:${organizationSession.account?.guid}`) ?? \"\"; } catch { /* best effort */ }\n    return { path: organizationDestination({ path: to.path, preferred }), query: to.path === \"/\" || organizationSession.account?.organizations.length === 1 ? to.query : {} };\n  } else if (to.name === \"organisaties\") {\n    if (!organizationSession.error && organizationSession.account?.organizations.length === 1)\n      return { name: \"home\", params: { organization: organizationSlug(organizationSession.account.organizations[0].tag) } };\n  }\n  return true;\n});\n\nrouter.afterEach((to, _from, failure) => {\n  if (failure || to.meta.public || !organizationSession.account) return;\n  const previous = organizationSession.organization?.tag ?? null;\n  // Publish the new scope only after route params commit, before Vue renders its subtree.\n  if (typeof to.params.organization === \"string\") {\n    setOrganization(organizationTag(to.params.organization));\n    organizationSession.error = \"\";\n  } else if (to.name === \"organisaties\") setOrganization(null);\n  if (previous !== (organizationSession.organization?.tag ?? null)) {\n    clearCustomerListPosition();\n    dismissToast();\n  }\n});\n","import \"@webhare/dompack/reset.css\";\nimport \"./frontend.scss\";\n\nimport { createApp } from \"vue\";\nimport { onDomReady, setupWRDAuth } from \"./lib/runtime\";\nimport App from \"./App.vue\";\nimport { router } from \"./lib/router\";\n\n// Eenmalige declaratie van het backend-naar-frontend datacontract (module-breed\n// zichtbaar via declaration merging, zodat webdesign.ts's setFrontendData ook\n// typecheckt).\ndeclare module \"@webhare/frontend\" {\n  interface FrontendDataTypes {\n    \"happy:app\": { siteRoot: string };\n  }\n}\n\nonDomReady(async () => {\n  const app = createApp(App);\n  app.use(router);\n  // Wacht tot vue-router de eerste route heeft geresolved zodat <router-view>\n  // een view rendert vóór mount; anders scant setupWRDAuth() een lege #app.\n  await router.isReady();\n  app.mount(\"#app\");\n\n  // Na mount: dompack.register() doet een one-shot scan, dus de LoginForm moet\n  // al in de DOM staan als setupWRDAuth() draait (dat is zo: App rendert 'm via\n  // v-else voor uitgelogde gebruikers). onLogin vermijdt een volledige reload\n  // App revalidates the existing hash after login, preserving organization deep links.\n  setupWRDAuth({\n    // App owns boot and navigation after the reactive login status changes.\n    onLogin: () => {},\n  });\n});\n","import \"@webhare/frontend/src/init\";import \"/opt/wh/whtree/modules/publisher/js/internal/polyfills/all\";\nimport \"/opt/whdata/installedmodules/happy.20261103T165817.935Z/webdesigns/happy/frontend/frontend\";const aps = globalThis.whAssetPacks ||= {}; aps[\"happy:happy\"]=\"2026-11-03T18:06:27.333Z\";"],"mappings":"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K,GAAG,OAAOf,EAAI,KACnB,IAAK,GAAG,OAAOA,EAAI,KACnB,IAAK,GAAG,OAAOA,EAAI,IACpB,CACA,OAAOA,EAAI,IACZ,EACA,IAAK2F,GAAG,CACP,OAAQ,CACP,OAAQ,CAAC,IAAK,GAAG,EACjB,YAAa,CAAC,KAAM,IAAI,EACxB,KAAM,CAAC,gBAAiB,aAAa,CACtC,EACA,aAAc,MACf,CAAC,EACD,QAASA,GAAG,CACX,OAAQ,CACP,OAAQ,CACP,IACA,IACA,IACA,GACD,EACA,YAAa,CACZ,KACA,KACA,KACA,IACD,EACA,KAAM,CACL,cACA,cACA,cACA,aACD,CACD,EACA,aAAc,OACd,iBAAmB7F,GAAMA,EAAI,CAC9B,CAAC,EACD,MAAO6F,GAAG,CACT,OAAQ,CACP,OAAQ,CACP,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,GACD,EACA,YAAa,CACZ,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACD,EACA,KAAM,CACL,UACA,WACA,QACA,QACA,MACA,OACA,OACA,SACA,YACA,UACA,WACA,UACD,CACD,EACA,aAAc,MACf,CAAC,EACD,IAAKA,GAAG,CACP,OAAQ,CACP,OAAQ,CACP,IACA,IACA,IACA,IACA,IACA,IACA,GACD,EACA,MAAO,CACN,KACA,KACA,KACA,KACA,KACA,KACA,IACD,EACA,YAAa,CACZ,MACA,MACA,MACA,MACA,MACA,MACA,KACD,EACA,KAAM,CACL,SACA,SACA,UACA,YACA,WACA,SACA,UACD,CACD,EACA,aAAc,MACf,CAAC,EACD,UAAWA,GAAG,CACb,OAAQ,CACP,OAAQ,CACP,GAAI,IACJ,GAAI,IACJ,SAAU,KACV,KAAM,IACN,QAAS,UACT,UAAW,YACX,QAAS,UACT,MAAO,OACR,EACA,YAAa,CACZ,GAAI,KACJ,GAAI,KACJ,SAAU,WACV,KAAM,OACN,QAAS,UACT,UAAW,YACX,QAAS,UACT,MAAO,OACR,EACA,KAAM,CACL,GAAI,OACJ,GAAI,OACJ,SAAU,WACV,KAAM,OACN,QAAS,UACT,UAAW,YACX,QAAS,UACT,MAAO,OACR,CACD,EACA,aAAc,OACd,iBAAkB,CACjB,OAAQ,CACP,GAAI,IACJ,GAAI,IACJ,SAAU,KACV,KAAM,IACN,QAAS,iBACT,UAAW,mBACX,QAAS,iBACT,MAAO,UACR,EACA,YAAa,CACZ,GAAI,KACJ,GAAI,KACJ,SAAU,WACV,KAAM,OACN,QAAS,iBACT,UAAW,mBACX,QAAS,iBACT,MAAO,UACR,EACA,KAAM,CACL,GAAI,OACJ,GAAI,OACJ,SAAU,WACV,KAAM,OACN,QAAS,iBACT,UAAW,mBACX,QAAS,iBACT,MAAO,UACR,CACD,EACA,uBAAwB,MACzB,CAAC,CACF,EAAGU,GAAK,CACP,cAAeN,GAAG,CACjB,aAAc,wBACd,aAAc,OACd,cAAgBjG,GAAM,SAASA,EAAG,EAAE,CACrC,CAAC,EACD,IAAK8F,GAAG,CACP,cAAe,CACd,OAAQ,UACR,YAAa,6DACb,KAAM,4DACP,EACA,kBAAmB,OACnB,cAAe,CAAE,IAAK,CAAC,MAAO,SAAS,CAAE,EACzC,kBAAmB,KACpB,CAAC,EACD,QAASA,GAAG,CACX,cAAe,CACd,OAAQ,WACR,YAAa,YACb,KAAM,gCACP,EACA,kBAAmB,OACnB,cAAe,CAAE,IAAK,CACrB,KACA,KACA,KACA,IACD,CAAE,EACF,kBAAmB,MACnB,cAAgB9F,GAAMA,EAAI,CAC3B,CAAC,EACD,MAAO8F,GAAG,CACT,cAAe,CACd,OAAQ,eACR,YAAa,sDACb,KAAM,2FACP,EACA,kBAAmB,OACnB,cAAe,CACd,OAAQ,CACP,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACD,EACA,IAAK,CACJ,OACA,MACA,QACA,OACA,QACA,QACA,QACA,OACA,MACA,MACA,MACA,KACD,CACD,EACA,kBAAmB,KACpB,CAAC,EACD,IAAKA,GAAG,CACP,cAAe,CACd,OAAQ,YACR,MAAO,2BACP,YAAa,kCACb,KAAM,8DACP,EACA,kBAAmB,OACnB,cAAe,CACd,OAAQ,CACP,MACA,MA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KAAM,gBACN,IAAK,CAAC,qBAAsB,aAAa,CAC1C,EACA,CACC,KAAM,uBACN,IAAK,CAAC,qBAAsB,aAAa,CAC1C,EACA,CACC,KAAM,sBACN,IAAK,CAAC,qBAAsB,aAAa,CAC1C,EACA,CACC,KAAM,sBACN,IAAKD,EACN,EACA,CACC,KAAM,uBACN,IAAKA,EACN,EACA,CACC,KAAM,wBACN,IAAKA,EACN,EACA,CACC,KAAM,yBACN,IAAKA,EACN,EACA,CACC,KAAM,wBACN,IAAKA,EACN,EACA,CACC,KAAM,yBACN,IAAKA,EACN,EACA,CACC,KAAM,QACN,IAAK,CACJ,aACA,cACA,aACD,CACD,EACA,CACC,KAAM,UACN,IAAK,CACJ,aACA,cACA,aACD,CACD,EACA,CACC,KAAM,UACN,IAAK,CACJ,aACA,cACA,aACD,CACD,EACA,CACC,KAAM,QACN,IAAK,CACJ,qBACA,cACA,aACD,CACD,EACA,CACC,KAAM,OACN,IAAK,CACJ,qBACA,cACA,cACA,WACD,CACD,EACA,CACC,KAAM,iBACN,IAAK,CAAC,YAAY,CACnB,EACA,CACC,KAAM,iBACN,IAAK,CAAC,YAAY,CACnB,EACA,CACC,KAAM,kBACN,IAAK,CAAC,WAAY,aAAa,CAChC,EACA,CACC,KAAM,iBACN,IAAK,CAAC,WAAY,aAAa,CAChC,EACA,CACC,KAAM,eACN,IAAK,CAAC,MAAM,CACb,EACA,CACC,KAAM,sBACN,IAAK,CACJ,cACA,cACA,aACD,CACD,EACA,CACC,KAAM,eACN,IAAK,CACJ,cACA,aACA,aACD,CACD,EACA,CACC,KAAM,eACN,IAAK,CAAC,MAAM,CACb,EACA,CACC,KAAM,gBACN,IAAK,CAAC,MAAM,CACb,EACA,CACC,KAAM,aACN,IAAK,CACJ,qBACA,cACA,eACA,aACD,CACD,EACA,CACC,KAAM,cACN,IAAK,CAAC,cAAe,aAAa,CACnC,EACA,CACC,KAAM,aACN,IAAK,CAAC,YAAY,CACnB,EACA,CACC,KAAM,SACN,IAAK,CAAC,WAAY,aAAa,CAChC,EACA,CACC,KAAM,UACN,IAAK,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","names":["settingschangedcallbacks","globalDebugFlags","localDebugFlags","debugFlagsOverridesCB","DebugFlagsProxyHandler","debugFlagsOverridesCB","localDebugFlags","globalDebugFlags","target","p","record","keys","key","newValue","toModify","runSettingsCallbacks","value","debugFlags","formatForConsoleLogs","cb","settingschangedcallbacks","dtapStage","isLive","backendBase","dtapstage","dtapStage","islive","isLive","initEnv","setDtapStage","setBackendBase","dtapStage","isLive","backendBase","dtapstage","islive","getBrowserDebugFlags","varname","flags","urldebugvar","debugcookie","debugcookievalue","flag","sessionDebug","qR","node_or_selector","selector","matches","qSA","isElement","node","isHTMLElement","parseLanguageTag","languageTag","match","getLang","node","tag","getWHType","obj","isCrossRealm","value","isMoney","isTemporalInstant","isTemporalPlainDateTime","isTemporalPlainDate","isTemporalPlainTime","isTemporalZonedDateTime","isDate","isBlob","isFile","stdTypeOf","value","t","isMoney","isBlob","isFile","isDate","isTemporalInstant","isTemporalPlainTime","isTemporalPlainDate","isTemporalPlainDateTime","isTemporalZonedDateTime","stripUnneededDecimals","num","decimals","isneg","toText","amount","decimalpoint","mindecimals","isnegative","astext","splitValue","money","split","sign","joinPrice","parts","adjustDecimals","requiredecimals","toadd","multiplier","idx","__add","lhs","rhs","requiredecimals","adjustDecimals","add","amount1","amount2","joinPrice","splitValue","subtract","amount","tosubtract","__multiply","multiply","cmp","diff","getPercentageOfAmount","perc","result","normalize","__roundIntegerToMultiple","value","roundunit","mode","roundToMultiple","unit","split_value","splitValue","split_unit","requiredecimals","adjustDecimals","result","joinPrice","min","amount","amounts","val","cmp","max","getNonNegativePowerOf10","exp","retval","running_exp","divide","divisor","lhs","rhs","mul10exp","mulfactor","test","lhs","relation","rhs","compareresult","cmp","stripUnneededDecimals","num","decimals","isneg","splitValue","money","split","sign","toText","amount","decimalpoint","mindecimals","thousandpoint","isnegative","astext","beforepoint","afterpoint","Money","_Money","value","intvalue","param","isMoney","left","right","sum","item","add","subtract","roundto","mode","roundToMultiple","lhs","rhs","cmp","relation","test","multiply","percentage","getPercentageOfAmount","numerator","divisor","divide","amounts","min","max","format","escapeRegExp","text","options","mask","isHTMLUnrepresentableChar","curch","encodeEntities","str","html","s","char","encodeString","str","encoding","encodeEntities","stringify","arg","options","usereplacer","key","value","origvalue","type","stdTypeOf","lhs","rhs","result","encodeEntities","parseTyped","input","Money","isValidEmail","email","omit","value","keys","elt","ret","key","val","unlock","LocalMutex","defer","LocalLock","mutex","config","siteroot","dtapStage","whconfigel","parsedConfig","omit","initEnv","flag","getBrowserDebugFlags","debugFlags","frontendConfig","getLang","prop","getFrontendData","dataObject","allowMissing","retval","resolve","reject","_resolve","_reject","items","callbackfn","retval","idx","item","key","list","IteratorPrototype","ArrayIteratorPrototype","OriginalIteratorPrototype","callback","it","value","next_value","real_value","max_count","values","limit","remaining","index","mapper","mapped","reducer","initial_value","acc","count","string","final","first","iterables","others","it_array","e","finished","partition1","partition2","i","max","min","isObject","t","GetIteratorFlattenable","obj","method","iterator","Iterator","WrappedIterator","#iterator","args","returnMethod","Iterator_from","submitForm","action","values","method","form","item","input","navigateTo","navigation","debugFlags","CustomEvent","dispatchCustomEvent","node","event","params","prop","evt","CustomEvent","defaultaction","stop","event","addDocEventListener","node","type","listener","options","locallocks","modallocked","uiwatcher","installedanticancelhandler","currentbusymodaldialog","currentbusymodaluserdialog","busymodalcontent","mylockmgr","getLockmgr","getParentLockManager","LockManager","anyModalLocks","l","scheduleCheckUIFree","checkUIFree","toggleBusyModal","lockmgr","isDialogElement","el","checkCancelEvent","evt","show","dispatchCustomEvent","dialog","toembed","lock","pos","debugFlags","BusyLock","options","lockmgr","getLockmgr","locallocks","modallocked","toggleBusyModal","debugFlags","lockpos","scheduleCheckUIFree","flagUIBusy","options","BusyLock","getParentLockManager","debugFlags","locallocks","l","lockmgr","getLockmgr","locallockmgr","LockManager","lock","mylockmgr","isDomReady","onDomReady","callback","components","map","isNodeCompletelyInDom","node","processRegistration","item","reg","domready","list","applyRegistration","startnode","isDomReady","items","e","register","selector","handler","options","newreg","components","isDomReady","onDomReady","registerMissed","applyRegistration","startnode","item","getCookie","key","value","escapeRegExp","parseUserAgent","ua","UA","platform","name","version","device","browser","parseUserAgent","getBrowser","config","forwardPublisherNavigation","event","isHTMLElement","navaction","desturl","origin","configureForCMS","e","makeMap","str","map","key","val","EMPTY_OBJ","EMPTY_ARR","NOOP","NO","isOn","isModelListener","extend","remove","arr","el","i","hasOwnProperty","hasOwn","isArray","isMap","toTypeString","isSet","isDate","isFunction","val","isString","isSymbol","isObject","isPromise","objectToString","toTypeString","value","toRawType","isPlainObject","isIntegerKey","key","isReservedProp","makeMap","cacheStringFunction","fn","cache","str","camelizeRE","camelize","_","c","hyphenateRE","hyphenate","capitalize","toHandlerKey","hasChanged","value","oldValue","invokeArrayFns","fns","arg","i","def","obj","key","writable","looseToNumber","val","n","toNumber","isString","_globalThis","getGlobalThis","normalizeStyle","value","isArray","res","i","item","normalized","isString","parseStringStyle","key","isObject","listDelimiterRE","propertyDelimiterRE","styleCommentRE","cssText","ret","tmp","normalizeClass","value","res","isString","isArray","i","normalized","isObject","name","normalizeProps","props","klass","style","normalizeStyle","specialBooleanAttrs","isSpecialBooleanAttr","makeMap","isBooleanAttr","includeBooleanAttr","value","looseCompareArrays","a","b","equal","i","looseEqual","aValidType","isDate","bValidType","isSymbol","isArray","isObject","aKeysCount","bKeysCount","key","aHasKey","bHasKey","looseIndexOf","arr","val","item","isRef","toDisplayString","isString","objectToString","isFunction","replacer","_key","isMap","entries","val2","stringifySymbol","isSet","v","isPlainObject","_a","warn","msg","args","activeEffectScope","EffectScope","detached","i","l","fn","currentEffectScope","fromParent","last","getCurrentScope","activeEffectScope","onScopeDispose","fn","failSilently","activeSub","pausedQueueEffects","ReactiveEffect","fn","activeEffectScope","batch","cleanupEffect","prepareDeps","prevEffect","activeSub","prevShouldTrack","shouldTrack","cleanupDeps","link","removeSub","isDirty","batchDepth","batchedSub","batchedComputed","sub","isComputed","startBatch","endBatch","next","error","err","head","tail","prev","removeDep","refreshComputed","computed","globalVersion","dep","prevSub","value","hasChanged","soft","nextSub","l","prevDep","nextDep","shouldTrack","trackStack","pauseTracking","resetTracking","last","trackStack","shouldTrack","cleanupEffect","e","cleanup","prevSub","activeSub","globalVersion","Link","sub","dep","Dep","computed","debugInfo","shouldTrack","link","addSub","next","startBatch","endBatch","l","currentTail","targetMap","ITERATE_KEY","MAP_KEY_ITERATE_KEY","ARRAY_ITERATE_KEY","track","target","type","key","depsMap","trigger","newValue","oldValue","oldTarget","run","targetIsArray","isArray","isArrayIndex","isIntegerKey","newLength","key2","isSymbol","isMap","getDepFromReactive","object","depMap","reactiveReadArray","array","raw","toRaw","isShallow","toReactive","shallowReadArray","arr","arrayInstrumentations","iterator","args","x","value","fn","thisArg","apply","v","searchProxy","separator","noTracking","reduce","comparer","self","method","wrapValue","iter","result","arrayProto","wrappedRetFn","needsWrap","methodFn","result2","wrappedFn","item","index","acc","res","isProxy","pauseTracking","resetTracking","isNonTrackableKeys","makeMap","builtInSymbols","hasOwnProperty","obj","BaseReactiveHandler","_isReadonly","_isShallow","receiver","isReadonly2","isShallow2","shallowReadonlyMap","readonlyMap","shallowReactiveMap","reactiveMap","isRef","isObject","readonly","reactive","MutableReactiveHandler","isOldValueReadonly","isReadonly","hadKey","hasOwn","hasChanged","ReadonlyReactiveHandler","mutableHandlers","readonlyHandlers","shallowReactiveHandlers","shallowReadonlyHandlers","toShallow","getProto","createIterableMethod","rawTarget","targetIsMap","isPair","isKeyOnly","innerIterator","wrap","toReadonly","done","createReadonlyMethod","createInstrumentations","shallow","instrumentations","rawKey","has","callback","observed","extend","get","hadItems","createInstrumentationGetter","mutableCollectionHandlers","shallowCollectionHandlers","readonlyCollectionHandlers","shallowReadonlyCollectionHandlers","reactiveMap","shallowReactiveMap","readonlyMap","shallowReadonlyMap","targetTypeMap","rawType","getTargetType","value","toRawType","reactive","target","isReadonly","createReactiveObject","mutableHandlers","mutableCollectionHandlers","shallowReactive","shallowReactiveHandlers","shallowCollectionHandlers","readonly","readonlyHandlers","readonlyCollectionHandlers","shallowReadonly","shallowReadonlyHandlers","shallowReadonlyCollectionHandlers","isReadonly2","baseHandlers","collectionHandlers","proxyMap","isObject","targetType","existingProxy","proxy","isReactive","isShallow","isProxy","toRaw","observed","raw","markRaw","hasOwn","def","toReactive","toReadonly","isRef","r","ref","createRef","shallowRef","rawValue","shallow","RefImpl","isShallow2","Dep","newValue","oldValue","useDirectValue","hasChanged","unref","ref2","isRef","toValue","source","isFunction","shallowUnwrapHandlers","target","key","receiver","value","oldValue","proxyRefs","objectWithRefs","isReactive","CustomRefImpl","factory","dep","Dep","get","set","newVal","customRef","ObjectRefImpl","_object","_key","_defaultValue","val","newVal","getDepFromReactive","toRaw","GetterRefImpl","_getter","toRef","source","key","defaultValue","isRef","isFunction","isObject","propertyToRef","ref","ComputedRefImpl","fn","setter","isSSR","Dep","globalVersion","activeSub","batch","link","refreshComputed","newValue","computed","getterOrOptions","debugOptions","getter","INITIAL_WATCHER_VALUE","cleanupMap","activeWatcher","onWatcherCleanup","cleanupFn","failSilently","owner","activeWatcher","cleanups","cleanupMap","watch","source","cb","options","EMPTY_OBJ","immediate","deep","once","scheduler","augmentJob","call","warnInvalidSource","s","warn","reactiveGetter","source2","isShallow","traverse","effect","getter","cleanup","boundCleanup","forceTrigger","isMultiSource","isRef","isReactive","isArray","isFunction","pauseTracking","resetTracking","currentEffect","NOOP","baseGetter","depth","scope","getCurrentScope","watchHandle","remove","_cb","args","oldValue","INITIAL_WATCHER_VALUE","job","immediateFirstRun","newValue","v","i","hasChanged","currentWatcher","ReactiveEffect","fn","cleanup2","value","seen","isObject","isSet","isMap","isPlainObject","key","callWithErrorHandling","fn","instance","type","args","err","handleError","callWithAsyncErrorHandling","isFunction","res","isPromise","isArray","values","throwInDev","contextVNode","errorHandler","throwUnhandledErrorInProduction","EMPTY_OBJ","cur","exposedInstance","errorInfo","errorCapturedHooks","i","pauseTracking","resetTracking","logError","throwInProd","queue","flushIndex","pendingPostFlushCbs","activePostFlushCbs","postFlushIndex","resolvedPromise","currentFlushPromise","nextTick","fn","p","currentFlushPromise","resolvedPromise","findInsertionIndex","id","start","flushIndex","end","queue","middle","middleJob","middleJobId","getId","queueJob","job","jobId","lastJob","queueFlush","flushJobs","queuePostFlushCb","cb","isArray","pendingPostFlushCbs","activePostFlushCbs","postFlushIndex","flushPreFlushCbs","instance","seen","i","flushPostFlushCbs","deduped","a","b","check","NOOP","callWithErrorHandling","currentRenderingInstance","currentScopeId","setCurrentRenderingInstance","instance","prev","withCtx","fn","ctx","currentRenderingInstance","isNonScopedSlot","renderFnWithContext","args","setBlockTracking","prevInstance","setCurrentRenderingInstance","res","withDirectives","vnode","directives","currentRenderingInstance","instance","getComponentPublicInstance","bindings","i","dir","value","arg","modifiers","EMPTY_OBJ","isFunction","traverse","invokeDirectiveHook","prevVNode","name","oldBindings","binding","hook","pauseTracking","callWithAsyncErrorHandling","resetTracking","TeleportEndKey","isTeleport","type","isTeleportDisabled","props","isTeleportDeferred","isTargetSVG","target","isTargetMathML","resolveTarget","select","targetSelector","isString","TeleportImpl","n1","n2","container","anchor","parentComponent","parentSuspense","namespace","slotScopeIds","optimized","internals","mountChildren","patchChildren","patchBlockChildren","insert","querySelector","createText","createComment","disabled","shapeFlag","children","dynamicChildren","placeholder","mainAnchor","mount","container2","anchor2","mountToTarget","targetAnchor","prepareAnchor","updateCssVars","queuePostRenderEffect","wasDisabled","currentContainer","currentAnchor","traverseStaticChildren","moveTeleport","nextTarget","unmount","hostRemove","doRemove","targetStart","shouldRemove","child","hydrateTeleport","parentAnchor","move","moveType","el","isReorder","node","nextSibling","parentNode","hydrateChildren","targetNode","Teleport","isDisabled","ctx","leaveCbKey","enterCbKey","useTransitionState","state","onMounted","onBeforeUnmount","TransitionHookValidator","BaseTransitionPropsValidators","recursiveGetSubtree","subTree","BaseTransitionImpl","slots","getCurrentInstance","getTransitionRawChildren","findNonCommentChild","rawProps","toRaw","mode","emptyPlaceholder","innerChild","getInnerChild$1","enterHooks","resolveTransitionHooks","hooks","Comment","setTransitionHooks","oldInnerChild","isSameVNodeType","leavingHooks","earlyRemove","delayedLeave","leavingVNodesCache","getLeavingNodesForType","hasFound","c","BaseTransition","leavingVNodes","postClone","appear","persisted","onBeforeEnter","onEnter","onAfterEnter","onEnterCancelled","onBeforeLeave","onLeave","onAfterLeave","onLeaveCancelled","onBeforeAppear","onAppear","onAfterAppear","onAppearCancelled","key","callHook","args","callAsyncHook","done","isArray","hook2","leavingVNode","afterHook","cancelHook","called","cancelled","remove","key2","vnode2","hooks2","isKeepAlive","cloneVNode","keepComment","parentKey","ret","keyedFragmentCount","Fragment","defineComponent","options","extraOptions","extend","useId","markAsyncBoundary","useTemplateRef","key","i","getCurrentInstance","r","shallowRef","refs","EMPTY_OBJ","desc","val","setRef","rawRef","oldRawRef","parentSuspense","vnode","isUnmount","isArray","isAsyncWrapper","refValue","getComponentPublicInstance","value","owner","ref","oldRef","setupState","rawSetupState","toRaw","canSetSetupRef","hasOwn","isString","isRef","isFunction","callWithErrorHandling","_isString","_isRef","doSet","existing","remove","queuePostRenderEffect","requestIdleCallback","getGlobalThis","cb","cancelIdleCallback","id","isAsyncWrapper","i","isKeepAlive","vnode","onActivated","hook","target","registerKeepAliveHook","onDeactivated","type","currentInstance","wrappedHook","current","injectHook","isKeepAlive","injectToKeepAliveRoot","keepAliveRoot","injected","onUnmounted","remove","injectHook","type","hook","target","currentInstance","prepend","hooks","wrappedHook","args","pauseTracking","reset","setCurrentInstance","res","callWithAsyncErrorHandling","resetTracking","createHook","lifecycle","isInSSRComponentSetup","onBeforeMount","onMounted","onBeforeUpdate","onUpdated","onBeforeUnmount","onUnmounted","onServerPrefetch","onRenderTriggered","onRenderTracked","onErrorCaptured","COMPONENTS","resolveComponent","name","maybeSelfReference","resolveAsset","COMPONENTS","NULL_DYNAMIC_COMPONENT","resolveDynamicComponent","component","isString","resolveAsset","type","name","warnMissing","maybeSelfReference","instance","currentRenderingInstance","currentInstance","Component","COMPONENTS","selfName","getComponentName","camelize","capitalize","res","resolve","registry","renderList","source","renderItem","cache","index","ret","cached","sourceIsArray","isArray","isString","sourceIsReactiveArray","isReactive","needsWrap","isReadonlySource","isShallow","isReadonly","shallowReadArray","i","l","toReadonly","toReactive","isObject","item","keys","key","createSlots","slots","dynamicSlots","slot","j","args","renderSlot","props","fallback","noSlotted","isAsyncWrapper","openBlock","createBlock","Fragment","createVNode","validSlotContent","ensureValidVNode","slotKey","rendered","isSymbol","vnodes","child","isVNode","Comment","getPublicInstance","i","isStatefulComponent","getComponentPublicInstance","publicPropertiesMap","extend","resolveMergedOptions","queueJob","nextTick","instanceWatch","hasSetupBinding","state","key","EMPTY_OBJ","hasOwn","PublicInstanceProxyHandlers","instance","ctx","setupState","data","props","accessCache","type","appContext","normalizedProps","n","shouldCacheAccess","publicGetter","publicPropertiesMap","cssModule","globalProperties","track","value","propsOptions","target","descriptor","useSlots","getContext","getContext","calledFunctionName","i","getCurrentInstance","createSetupContext","normalizePropsOrEmits","props","isArray","normalized","p","mergeDefaults","raw","defaults","key","opt","isFunction","mergeModels","a","b","extend","shouldCacheAccess","applyOptions","instance","options","resolveMergedOptions","publicThis","ctx","callHook","dataOptions","computedOptions","methods","watchOptions","provideOptions","injectOptions","created","beforeMount","mounted","beforeUpdate","updated","activated","deactivated","beforeDestroy","beforeUnmount","destroyed","unmounted","render","renderTracked","renderTriggered","errorCaptured","serverPrefetch","expose","inheritAttrs","components","directives","filters","resolveInjections","key","methodHandler","isFunction","data","isObject","reactive","opt","get","NOOP","set","c","computed","v","createWatcher","provides","provide","registerLifecycleHook","register","hook","isArray","_hook","onBeforeMount","onMounted","onBeforeUpdate","onUpdated","onActivated","onDeactivated","onErrorCaptured","onRenderTracked","onRenderTriggered","onBeforeUnmount","onUnmounted","onServerPrefetch","exposed","val","markAsyncBoundary","checkDuplicateProperties","normalizeInject","injected","inject","isRef","type","callWithAsyncErrorHandling","h","raw","getter","createPathGetter","isString","handler","watch","r","base","mixins","extendsOptions","globalMixins","cache","optionMergeStrategies","cached","resolved","m","mergeOptions","to","from","strats","asMixin","strat","internalOptionMergeStrats","mergeDataFn","mergeEmitsOrPropsOptions","mergeObjectOptions","mergeAsArray","mergeWatchOptions","mergeInject","extend","res","i","normalizePropsOrEmits","merged","createAppContext","NO","uid$1","createAppAPI","hydrate","rootComponent","rootProps","context","installedPlugins","pluginCleanupFns","isMounted","app","version","plugin","mixin","name","component","directive","rootContainer","isHydrate","namespace","vnode","createVNode","getComponentPublicInstance","cleanupFn","value","fn","lastApp","currentApp","currentInstance","parentProvides","defaultValue","treatDefaultAsFactory","getCurrentInstance","internalObjectProto","createInternalObject","isInternalObject","obj","initProps","instance","rawProps","isStateful","isSSR","props","attrs","setFullProps","key","shallowReactive","updateProps","instance","rawProps","rawPrevProps","optimized","props","attrs","patchFlag","rawCurrentProps","toRaw","options","hasAttrsChanged","propsToUpdate","i","key","isEmitListener","value","hasOwn","camelizedKey","camelize","resolvePropValue","setFullProps","kebabKey","hyphenate","trigger","needCastKeys","rawCastValues","isReservedProp","camelKey","castValues","EMPTY_OBJ","isAbsent","opt","hasDefault","defaultValue","isFunction","propsDefaults","reset","setCurrentInstance","mixinPropsCache","normalizePropsOptions","comp","appContext","asMixin","cache","cached","raw","normalized","hasExtends","extendProps","raw2","keys","extend","isObject","EMPTY_ARR","isArray","normalizedKey","validatePropName","prop","propType","shouldCast","shouldCastTrue","index","type","typeName","res","isInternalKey","key","normalizeSlotValue","value","isArray","normalizeVNode","normalizeSlot","rawSlot","ctx","normalized","withCtx","args","normalizeObjectSlots","rawSlots","slots","instance","isFunction","normalizeVNodeSlots","children","assignSlots","optimized","initSlots","createInternalObject","cacheIndexes","def","type","updateSlots","vnode","needDeletionCheck","deletionComparisonTarget","EMPTY_OBJ","initFeatureFlags","needWarn","queuePostRenderEffect","queueEffectWithSuspense","createRenderer","options","baseCreateRenderer","baseCreateRenderer","options","createHydrationFns","initFeatureFlags","target","getGlobalThis","hostInsert","hostRemove","hostPatchProp","hostCreateElement","hostCreateText","hostCreateComment","hostSetText","hostSetElementText","hostParentNode","hostNextSibling","hostSetScopeId","NOOP","hostInsertStaticContent","patch","n1","n2","container","anchor","parentComponent","parentSuspense","namespace","slotScopeIds","optimized","isSameVNodeType","getNextHostNode","unmount","type","ref","shapeFlag","Text","processText","Comment","processCommentNode","Static","mountStaticNode","Fragment","processFragment","processElement","processComponent","internals","setRef","el","patchStaticNode","removeStaticNode","moveStaticNode","nextSibling","next","mountElement","patchElement","vnode","vnodeHook","props","transition","dirs","mountChildren","resolveChildrenNamespace","invokeDirectiveHook","setScopeId","key","isReservedProp","invokeVNodeHook","needCallTransitionHooks","needTransition","queuePostRenderEffect","scopeId","i","subTree","isSuspense","parentVNode","children","start","child","cloneIfMounted","normalizeVNode","patchFlag","dynamicChildren","oldProps","EMPTY_OBJ","newProps","toggleRecurse","patchBlockChildren","patchChildren","patchProps","propsToUpdate","prev","oldChildren","newChildren","fallbackContainer","oldVNode","newVNode","fragmentStartAnchor","fragmentEndAnchor","fragmentSlotScopeIds","traverseStaticChildren","mountComponent","updateComponent","initialVNode","instance","createComponentInstance","isKeepAlive","setupComponent","setupRenderEffect","placeholder","createVNode","shouldUpdateComponent","updateComponentPreRender","componentUpdateFn","bu","u","parent","nonHydratedAsyncRoot","locateNonHydratedAsyncRoot","originNext","invokeArrayFns","nextTree","renderComponentRoot","prevTree","updateHOCHostEl","bm","m","root","isAsyncWrapperVNode","isAsyncWrapper","hydrateNode","hydrateSubTree","scopedInitialVNode","effect","ReactiveEffect","update","job","queueJob","nextVNode","prevProps","updateProps","updateSlots","pauseTracking","flushPreFlushCbs","resetTracking","c1","prevShapeFlag","c2","patchKeyedChildren","patchUnkeyedChildren","unmountChildren","EMPTY_ARR","oldLength","newLength","commonLength","nextChild","parentAnchor","l2","e1","e2","nextPos","s1","s2","keyToNewIndexMap","j","patched","toBePatched","moved","maxNewIndexSoFar","newIndexToOldIndexMap","prevChild","newIndex","increasingNewIndexSequence","getSequence","nextIndex","anchorVNode","move","moveType","leave","delayLeave","afterLeave","remove2","performLeave","doRemove","cacheIndex","shouldInvokeDirs","shouldInvokeVnodeHook","unmountComponent","remove","removeFragment","performRemove","cur","end","bum","scope","um","a","slotCacheKeys","invalidateMount","isArray","v","teleportEnd","TeleportEndKey","isFlushing","render","flushPostFlushCbs","hydrate","createAppAPI","currentNamespace","allowed","shallow","ch1","ch2","arr","p","result","c","len","arrI","subComponent","hooks","ssrContextKey","useSSRContext","ctx","inject","watchSyncEffect","effect","options","doWatch","watch","source","cb","EMPTY_OBJ","immediate","deep","flush","once","baseWatchOptions","extend","runsImmediately","ssrCleanup","isInSSRComponentSetup","ctx","useSSRContext","watchStopHandle","NOOP","instance","currentInstance","fn","type","args","callWithAsyncErrorHandling","isPre","job","queuePostRenderEffect","isFirstRun","queueJob","watchHandle","instanceWatch","value","publicThis","getter","isString","createPathGetter","isFunction","reset","setCurrentInstance","res","path","segments","cur","i","useModel","props","name","getCurrentInstance","camelizedName","camelize","hyphenatedName","hyphenate","modifiers","getModelModifiers","customRef","track","trigger","localValue","prevSetValue","prevEmittedValue","propValue","hasChanged","emittedValue","rawProps","i2","modelName","emit","event","rawArgs","isModelListener","a","looseToNumber","handlerName","handler","toHandlerKey","onceHandler","normalizeEmitsOptions","comp","appContext","asMixin","cache","cached","raw","normalized","hasExtends","extendEmits","raw2","normalizedFromExtend","isObject","isArray","key","isEmitListener","isOn","hasOwn","renderComponentRoot","instance","Component","vnode","proxy","withProxy","propsOptions","slots","attrs","emit","render","renderCache","props","data","setupState","ctx","inheritAttrs","prev","setCurrentRenderingInstance","result","fallthroughAttrs","proxyToUse","thisProxy","normalizeVNode","render2","getFunctionalFallthrough","err","blockStack","handleError","createVNode","Comment","root","setRoot","keys","shapeFlag","isModelListener","filterModelListeners","cloneVNode","setTransitionHooks","getFunctionalFallthrough","attrs","res","key","isOn","filterModelListeners","props","isModelListener","shouldUpdateComponent","prevVNode","nextVNode","optimized","prevProps","prevChildren","component","nextProps","nextChildren","patchFlag","emits","hasPropsChanged","dynamicProps","i","key","isEmitListener","emitsOptions","nextKeys","updateHOCHostEl","vnode","parent","el","root","isSuspense","type","queueEffectWithSuspense","fn","suspense","isArray","queuePostFlushCb","Fragment","Text","Comment","Static","blockStack","currentBlock","openBlock","disableTracking","closeBlock","isBlockTreeEnabled","setBlockTracking","value","inVOnce","setupBlock","vnode","EMPTY_ARR","createElementBlock","type","props","children","patchFlag","dynamicProps","shapeFlag","createBaseVNode","createBlock","createVNode","isVNode","isSameVNodeType","n1","n2","normalizeKey","key","normalizeRef","ref","ref_key","ref_for","isString","isRef","isFunction","currentRenderingInstance","createBaseVNode","type","props","children","patchFlag","dynamicProps","shapeFlag","Fragment","isBlockNode","needFullChildrenNormalization","vnode","currentScopeId","normalizeChildren","isBlockTreeEnabled","currentBlock","createVNode","_createVNode","NULL_DYNAMIC_COMPONENT","Comment","isVNode","cloned","cloneVNode","isClassComponent","guardReactiveProps","klass","style","normalizeClass","isObject","isProxy","isArray","extend","normalizeStyle","isSuspense","isTeleport","isInternalObject","extraProps","mergeRef","cloneTransition","transition","mergedProps","mergeProps","setTransitionHooks","createTextVNode","text","flag","createVNode","Text","createStaticVNode","content","numberOfNodes","vnode","Static","createCommentVNode","asBlock","openBlock","createBlock","Comment","normalizeVNode","child","isArray","Fragment","isVNode","cloneIfMounted","cloneVNode","normalizeChildren","children","type","shapeFlag","slot","slotFlag","isInternalObject","currentRenderingInstance","isFunction","mergeProps","args","ret","i","toMerge","key","normalizeClass","normalizeStyle","isOn","existing","incoming","invokeVNodeHook","hook","instance","prevVNode","callWithAsyncErrorHandling","emptyAppContext","createAppContext","uid","createComponentInstance","parent","suspense","appContext","EffectScope","normalizePropsOptions","normalizeEmitsOptions","EMPTY_OBJ","emit","currentInstance","getCurrentInstance","internalSetCurrentInstance","setInSSRSetupState","g","getGlobalThis","registerGlobalSetter","setter","setters","v","set","isInSSRComponentSetup","setCurrentInstance","prev","unsetCurrentInstance","isStatefulComponent","instance","isInSSRComponentSetup","setupComponent","isSSR","optimized","setInSSRSetupState","props","children","isStateful","initProps","initSlots","setupResult","setupStatefulComponent","_a","Component","PublicInstanceProxyHandlers","setup","pauseTracking","setupContext","createSetupContext","reset","setCurrentInstance","callWithErrorHandling","isAsyncSetup","isPromise","resetTracking","isAsyncWrapper","markAsyncBoundary","unsetCurrentInstance","resolvedResult","handleSetupResult","e","handleError","finishComponentSetup","isFunction","isObject","proxyRefs","compile","installWithProxy","finishComponentSetup","instance","isSSR","skipOptions","Component","compile","template","resolveMergedOptions","isCustomElement","compilerOptions","delimiters","componentCompilerOptions","finalCompilerOptions","extend","NOOP","installWithProxy","reset","setCurrentInstance","pauseTracking","applyOptions","resetTracking","attrsProxyHandlers","target","key","track","createSetupContext","instance","expose","exposed","attrsProxyHandlers","getComponentPublicInstance","proxyRefs","markRaw","target","key","publicPropertiesMap","getComponentName","Component","includeInferred","isFunction","isClassComponent","value","isFunction","computed","getterOrOptions","debugOptions","isInSSRComponentSetup","h","type","propsOrChildren","children","l","isObject","isArray","isVNode","createVNode","version","policy","tt","val","unsafeToTrustedHTML","svgNS","mathmlNS","doc","templateContainer","nodeOps","child","parent","anchor","tag","namespace","is","props","el","text","node","selector","id","content","start","end","before","template","wrapper","TRANSITION","ANIMATION","vtcKey","DOMTransitionPropsValidators","TransitionPropsValidators","extend","BaseTransitionPropsValidators","decorate$1","t","Transition","slots","h","BaseTransition","resolveTransitionProps","callHook","hook","args","isArray","h2","hasExplicitCallback","rawProps","baseProps","key","name","type","duration","enterFromClass","enterActiveClass","enterToClass","appearFromClass","appearActiveClass","appearToClass","leaveFromClass","leaveActiveClass","leaveToClass","durations","normalizeDuration","enterDuration","leaveDuration","onBeforeEnter","onEnter","onEnterCancelled","onLeave","onLeaveCancelled","onBeforeAppear","onAppear","onAppearCancelled","finishEnter","isAppear","done","isCancelled","removeTransitionClass","finishLeave","makeEnterHook","resolve","nextFrame","addTransitionClass","whenTransitionEnds","forceReflow","isObject","NumberOf","n","toNumber","cls","c","_vtc","cb","endId","expectedType","explicitTimeout","resolveIfNotStale","timeout","propCount","getTransitionInfo","endEvent","ended","onEnd","e","styles","getStyleProperties","transitionDelays","transitionDurations","transitionTimeout","getTimeout","animationDelays","animationDurations","animationTimeout","hasTransform","delays","d","i","toMs","s","patchClass","value","isSVG","transitionClasses","vShowOriginalDisplay","vShowHidden","vShow","transition","setDisplay","oldValue","CSS_VAR_TEXT","displayRE","patchStyle","el","prev","next","style","isCssString","isString","hasControlledDisplay","prevStyle","key","setStyle","cssVarText","CSS_VAR_TEXT","vShowOriginalDisplay","vShowHidden","importantRE","setStyle","style","name","val","isArray","v","prefixed","autoPrefix","hyphenate","prefixes","prefixCache","rawName","cached","camelize","capitalize","i","xlinkNS","patchAttr","el","key","value","isSVG","instance","isBoolean","isSpecialBooleanAttr","includeBooleanAttr","isSymbol","patchDOMProp","parentComponent","attrName","unsafeToTrustedHTML","tag","oldValue","newValue","needRemove","type","addEventListener","event","handler","options","removeEventListener","veiKey","patchEvent","prevValue","nextValue","invokers","existingInvoker","parseName","invoker","createInvoker","optionsModifierRE","m","cachedNow","p","getNow","initialValue","e","callWithAsyncErrorHandling","patchStopImmediatePropagation","patchStopImmediatePropagation","e","value","isArray","originalStop","fn","e2","isNativeOn","key","patchProp","el","prevValue","nextValue","namespace","parentComponent","isSVG","patchClass","patchStyle","isOn","isModelListener","patchEvent","shouldSetAsProp","patchDOMProp","patchAttr","isString","camelize","isFunction","tag","getModelAssigner","vnode","fn","isArray","value","invokeArrayFns","onCompositionStart","e","onCompositionEnd","target","assignKey","vModelText","el","lazy","trim","number","castToNumber","addEventListener","domValue","looseToNumber","oldValue","elValue","newValue","vModelCheckbox","_","modelValue","elementValue","getValue","checked","assign","index","looseIndexOf","found","filtered","isSet","cloned","getCheckboxValue","setChecked","binding","looseEqual","vModelRadio","vModelSelect","isSetModel","selectedVal","o","nextTick","setSelected","_binding","isMultiple","isArrayValue","i","l","option","optionValue","optionType","v","key","systemModifiers","modifierGuards","e","modifiers","m","withModifiers","fn","cache","cacheKey","event","args","i","guard","keyNames","withKeys","eventKey","hyphenate","k","rendererOptions","extend","patchProp","nodeOps","renderer","ensureRenderer","renderer","createRenderer","rendererOptions","createApp","args","app","ensureRenderer","mount","containerOrSelector","container","normalizeContainer","component","isFunction","proxy","resolveRootNamespace","resolveRootNamespace","container","normalizeContainer","container","isString","UNKNOWN_FUNCTION","parse","stackString","lines","stack","line","parseResult","parseChrome","parseWinjs","parseGecko","parseNode","parseJSC","chromeRe","chromeEvalRe","parts","isNative","isEval","submatch","winjsRe","geckoRe","geckoEvalRe","javaScriptCoreRe","nodeRe","parseTrace","e","parse","i","formatTrace","trace","prependStackTrace","error","stacklines","tracelines","isAbsolute","url","getBaseURL","backendBase","ControlledCall","client","method","stack","options","callurl","fetchoptions","fetchpromise","requestStack","response","exception","retryafter","resolve","jsonresponse","parseTyped","logitem","omit","err","prependStackTrace","RPCClient","debugFlags","error","params","stringify","parseTrace","ServiceProxy","target","prop","receiver","newoptions","rpc","args","service","servicematch","rpcclient","PublicCookieSuffix","authOptions","getCookieName","getFrontendData","getAuthLocalData","c","parseTyped","getCookie","PublicCookieSuffix","submitLoginForm","node","event","_stack","stop","username","password","site","returnto","persistentlogin","login","lock","__using","flagUIBusy","loginresult","refreshLoginStatus","navigateTo","failLogin","_","_error","_hasError","__callDispose","loggedIn","isLoggedIn","setupWRDAuth","options","register","addDocEventListener","evt","handleLogoutClick","doLogout","logout","onDomReady","message","response","form","evtdetail","dispatchCustomEvent","loginfield","qR","getLoginTweaks","tweaks","getLang","urlvars","login","username","password","options","cookieName","getCookieName","result","rpc","getBrowser","getAuthLocalData","doLogout","logout","navigateTo","postRenderChecks","log","logtext","onDomReady","isBrowser","isRouteComponent","component","isESModule","obj","assign","applyToParams","fn","params","newParams","key","value","isArray","noop","HASH_RE","AMPERSAND_RE","SLASH_RE","EQUAL_RE","IM_RE","PLUS_RE","ENC_BRACKET_OPEN_RE","ENC_BRACKET_CLOSE_RE","ENC_CARET_RE","ENC_BACKTICK_RE","ENC_CURLY_OPEN_RE","ENC_PIPE_RE","ENC_CURLY_CLOSE_RE","ENC_SPACE_RE","commonEncode","text","encodeHash","encodeQueryValue","encodeQueryKey","encodePath","encodeParam","decode","TRAILING_SLASH_RE","removeTrailingSlash","path","parseURL","parseQuery","location","currentLocation","query","searchString","hash","hashPos","searchPos","resolveRelativePath","stringifyURL","stringifyQuery","stripBase","pathname","base","isSameRouteLocation","a","b","aLastIndex","bLastIndex","isSameRouteRecord","isSameRouteLocationParams","key","isSameRouteLocationParamsValue","isArray","isEquivalentArray","value","i","to","from","fromSegments","toSegments","lastToSegment","position","toPosition","segment","START_LOCATION_NORMALIZED","NavigationType","NavigationDirection","normalizeBase","base","isBrowser","baseEl","removeTrailingSlash","BEFORE_HASH_RE","createHref","location","getElementPosition","el","offset","docRect","elRect","computeScrollPosition","scrollToPosition","position","scrollToOptions","positionEl","isIdSelector","getScrollKey","path","delta","scrollPositions","saveScrollPosition","key","scrollPosition","getSavedScrollPosition","scroll","createBaseLocation","createCurrentLocation","pathname","search","hash","hashPos","slicePos","pathFromHash","stripBase","useHistoryListeners","historyState","currentLocation","replace","listeners","teardowns","pauseState","popStateHandler","state","to","from","fromState","listener","NavigationType","NavigationDirection","pauseListeners","listen","callback","teardown","index","beforeUnloadListener","history","assign","destroy","buildState","back","current","forward","replaced","computeScroll","useHistoryStateNavigation","changeLocation","hashIndex","url","err","data","push","currentState","createWebHistory","historyNavigation","historyListeners","go","triggerListeners","routerHistory","createWebHashHistory","base","createWebHistory","isRouteLocation","route","isRouteName","name","NavigationFailureSymbol","NavigationFailureType","createRouterError","type","params","assign","NavigationFailureSymbol","isNavigationFailure","error","BASE_PARAM_PATTERN","BASE_PATH_PARSER_OPTIONS","REGEX_CHARS_RE","tokensToParser","segments","extraOptions","options","assign","score","pattern","keys","segment","segmentScores","tokenIndex","token","subSegmentScore","value","repeatable","optional","regexp","re","err","subPattern","i","parse","path","match","params","key","stringify","avoidDuplicatedSlash","param","isArray","text","compareScoreArray","a","b","diff","comparePathParserScore","aScore","bScore","comp","isLastScoreNegative","last","ROOT_TOKEN","VALID_PARAM_RE","tokenizePath","crash","message","state","buffer","previousState","tokens","finalizeSegment","char","customRe","consumeBuffer","addCharToBuffer","createRouteRecordMatcher","record","parent","parser","matcher","createRouterMatcher","routes","globalOptions","matchers","matcherMap","mergeOptions","getRecordMatcher","name","addRoute","originalRecord","isRootAdd","mainNormalizedRecord","normalizeRouteRecord","normalizedRecords","aliases","alias","originalMatcher","normalizedRecord","parentPath","connectingSlash","isAliasRecord","removeRoute","isMatchable","insertMatcher","children","noop","matcherRef","isRouteName","index","getRoutes","findInsertionIndex","resolve","location","currentLocation","createRouterError","paramsFromLocation","k","m","matched","parentMatcher","mergeMetaFields","route","clearRoutes","newParams","normalized","normalizeRecordProps","propsObject","props","meta","defaults","partialOptions","findInsertionIndex","matcher","matchers","lower","upper","mid","comparePathParserScore","insertionAncestor","getInsertionAncestor","ancestor","isMatchable","record","parseQuery","search","query","searchParams","i","searchParam","PLUS_RE","eqPos","key","decode","value","currentValue","isArray","stringifyQuery","encodeQueryKey","v","encodeQueryValue","normalizeQuery","normalizedQuery","matchedRouteKey","viewDepthKey","routerKey","routeLocationKey","routerViewLocationKey","useCallbacks","handlers","add","handler","reset","guardToPromiseFn","guard","to","from","record","name","runWithContext","fn","enterCallbackArray","resolve","reject","next","valid","createRouterError","isRouteLocation","guardReturn","guardCall","err","extractComponentsGuards","matched","guardType","to","from","runWithContext","fn","guards","record","name","rawComponent","isRouteComponent","guard","guardToPromiseFn","componentPromise","resolved","resolvedComponent","isESModule","useLink","props","router","inject","routerKey","currentRoute","routeLocationKey","hasPrevious","previousTo","route","computed","to","unref","activeRecordIndex","matched","length","routeMatched","currentMatched","index","isSameRouteRecord","parentRecordPath","getOriginalPath","isActive","includesParams","isExactActive","isSameRouteLocationParams","navigate","e","guardEvent","p","noop","preferSingleVNode","vnodes","RouterLinkImpl","defineComponent","slots","link","reactive","options","elClass","getLinkClass","children","h","RouterLink","target","outer","inner","key","innerValue","outerValue","isArray","value","i","record","propClass","globalClass","defaultClass","RouterViewImpl","attrs","injectedRoute","routerViewLocationKey","routeToDisplay","injectedDepth","viewDepthKey","depth","initialDepth","matchedRoute","matchedRouteRef","provide","matchedRouteKey","viewRef","ref","watch","instance","name","oldInstance","from","oldName","callback","currentName","ViewComponent","normalizeSlot","routePropsOption","routeProps","component","assign","vnode","slot","data","slotContent","RouterView","createRouter","options","matcher","createRouterMatcher","parseQuery$1","parseQuery","stringifyQuery$1","stringifyQuery","routerHistory","beforeGuards","useCallbacks","beforeResolveGuards","afterGuards","currentRoute","shallowRef","START_LOCATION_NORMALIZED","pendingLocation","isBrowser","normalizeParams","applyToParams","paramValue","encodeParams","encodeParam","decodeParams","decode","addRoute","parentOrRoute","route","parent","record","isRouteName","removeRoute","name","recordMatcher","getRoutes","routeMatcher","hasRoute","resolve","rawLocation","currentLocation","assign","locationNormalized","parseURL","matchedRoute","href","matcherLocation","targetParams","key","hash","fullPath","stringifyURL","encodeHash","normalizeQuery","locationAsObject","to","checkCanceledNavigation","from","createRouterError","push","pushWithRedirect","replace","handleRedirectRecord","lastMatched","redirect","newTargetLocation","redirectedFrom","targetLocation","data","force","shouldRedirect","toLocation","failure","isSameRouteLocation","handleScroll","navigate","error","isNavigationFailure","markAsReady","triggerError","finalizeNavigation","triggerAfterEach","checkCanceledNavigationAndReject","runWithContext","fn","app","installedApps","guards","leavingRecords","updatingRecords","enteringRecords","extractChangingRecords","extractComponentsGuards","guard","guardToPromiseFn","canceledNavigationCheck","runGuardQueue","isArray","beforeEnter","err","isPush","isFirstNavigation","state","removeHistoryListener","setupListeners","_from","info","router","noop","saveScrollPosition","getScrollKey","computeScrollPosition","NavigationType","readyHandlers","errorListeners","ready","list","handler","isReady","reject","scrollBehavior","scrollPosition","getSavedScrollPosition","nextTick","position","scrollToPosition","go","delta","started","RouterLink","RouterView","unref","reactiveRoute","routerKey","routeLocationKey","shallowReactive","routerViewLocationKey","unmountApp","promise","len","i","recordFrom","isSameRouteRecord","recordTo","useRouter","inject","useRoute","_name","LOGGED_IN_CLASS","useWrdAuthState","isLoggedIn","ref","observer","read","onMounted","onBeforeUnmount","readonly","organizationSession","reactive","resolveLeave","dirtyForms","clearOrganizationSession","resolveOrganizationLeave","setAccount","account","selected","org","setOrganization","tag","organization","ORGANIZATION_PREFIX","organizationSlug","organizationTag","slug","organizationDestination","path","preferred","organizations","preferenceScope","useOrganizationDirty","isDirty","onBeforeUnmount","leave","mayLeaveOrganization","dirty","generation","resolve","queryRecord","query","rec","key","value","sameQuery","a","b","aKeys","bKeys","customerListPosition","rememberCustomerListPosition","position","restoreCustomerListPosition","options","sameQuery","activeIndex","clearCustomerListPosition","message","ref","timer","showToast","text","durationMs","dismissToast","toastMessage","readonly","useToast","generation","organizationSession","disposed","onBeforeUnmount","rpcErrorMessage","message","client","rpc","refreshAccount","generation","organizationSession","account","setAccount","useApi","tag","disposed","onBeforeUnmount","target","property","receiver","method","args","identity","current","write","result","error","rpcErrorMessage","setOrganization","recoveryGeneration","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createElementBlock","createBaseVNode","toDisplayString","createCommentVNode","Fragment","renderList","organization","createBlock","withCtx","OrganizationChoiceView_default","render","preferences","preferenceStorageKey","key","email","isPreferenceSet","scopedPreferenceStorageKey","setPreference","resetPreference","scopedPreferenceStorageKey","key","scope","preferenceScope","account","organizationSession","migrationKey","legacyKey","preferences","preference","previous","preferenceStorageKey","destination","isLoginEmail","value","normalized","parsePastedCode","text","length","props","__props","emit","__emit","cells","ref","inputs","rootEl","setRef","el","i","watch","value","digits","parsePastedCode","_","commit","focusCell","__expose","c","onInput","event","target","digit","onKeydown","onFocus","onPaste","pasted","firstEmpty","_hoisted_1","_hoisted_2","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createElementBlock","normalizeClass","Fragment","renderList","cell","i","el","$event","CodeInput_default","render","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createElementBlock","createTextVNode","toDisplayString","createCommentVNode","renderSlot","FormField_default","render","props","__props","emit","__emit","api","rpc","step","ref","email","code","password","repeat","error","fieldErrors","busy","passwordAction","computed","cooldown","emailInput","codeInput","passwordInput","repeatInput","resendAfter","timer","requestCode","isLoginEmail","result","err","rpcErrorMessage","nextTick","setPassword","onMounted","onBeforeUnmount","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createElementBlock","createBaseVNode","toDisplayString","createCommentVNode","withModifiers","createVNode","withCtx","withDirectives","$event","normalizeClass","vModelText","createTextVNode","PasswordResetForm_default","render","MIN_LOGIN_BUSY_MS","LOGIN_SAFETY_MS","EMAIL_KEY","props","__props","errorMessage","ref","successMessage","resettingPassword","loginEmailInput","loggingIn","loginForm","authApi","rpc","router","useRouter","developmentLogins","loginSubmittedAt","failTimer","safetyTimer","readStoredEmail","email","watch","value","password","loadDevelopmentLogins","initialEmail","accounts","loginAs","account","nextTick","openPasswordReset","closePasswordReset","result","clearTimers","onLoginSubmit","onLoginFailed","evt","message","wait","onMounted","onBeforeUnmount","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createElementBlock","createStaticVNode","withDirectives","createBaseVNode","toDisplayString","createCommentVNode","$event","vModelText","vShow","Fragment","renderList","account","createBlock","LoginForm_default","render","feedbackScriptAttributes","feedbackPageUrl","context","route","organization","key","path","segment","url","mountFeedbackWidget","readContext","scope","update","api","nextScope","pageUrl","script","attribute","value","route","useRoute","siteRoot","getFrontendData","controller","onMounted","mountFeedbackWidget","organizationSession","organizationSlug","watch","onBeforeUnmount","render","_ctx","_cache","$props","$setup","$data","$options","FeedbackWidget_default","render","menus","settingsMenus","mnemonicParts","label","mnemonic","index","placeSidebarPopup","anchor","popupHeight","viewportHeight","minTop","tooltip","top","props","__props","emit","__emit","router","useRouter","route","useRoute","bar","ref","backButton","settingsOpen","menus","computed","organizationSession","menu","settingsMenus","openIndex","tooltipIndex","focusedTop","subFocus","popupTop","popupLeft","compact","toggleLabel","topRefs","itemRefs","popupRefs","icons","setTopRef","el","i","setItemRef","j","setPopupRef","positionPopup","anchor","popupHeight","position","placeSidebarPopup","isSingle","parts","p","mnemonicParts","menuDestination","to","organizationSlug","isItemActive","item","name","isSettingsPage","watch","closeMenu","activeMenuIndex","index","openOrActivate","activateItem","openMenuAt","focusTop","focusFirst","__expose","backToMain","nextTick","focusItem","returnFocus","top","onTopClick","onTopHover","onTopFocus","onMenuLeave","onOverlayEscape","event","onKeydown","count","inSub","direction","n","idx","runShortcut","action","onGlobalKeydown","mainIndex","onGlobalPointerDown","onMounted","onBeforeUnmount","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createElementBlock","normalizeClass","createBaseVNode","withKeys","withModifiers","$event","createCommentVNode","Fragment","renderList","menu","i","el","createTextVNode","toDisplayString","normalizeStyle","item","j","MenuBar_default","render","props","__props","emit","__emit","route","useRoute","root","ref","menu","sidebarButton","profileButton","organizationButton","popup","account","computed","organizationSession","organizationName","initials","part","toggleLabel","togglePopup","value","closePopup","options","previous","nextTick","onPopupKeydown","event","items","index","next","onPointerDown","onFocusOut","openShortcuts","openAbout","onLogout","clearOrganizationSession","logout","watch","onMounted","onBeforeUnmount","__expose","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createElementBlock","$event","createBaseVNode","createCommentVNode","createVNode","withCtx","toDisplayString","Fragment","renderList","organization","createBlock","createTextVNode","AppHeader_default","render","emit","__emit","timer","finished","finish","onKey","onMounted","onBeforeUnmount","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createElementBlock","createStaticVNode","BootSplash_default","render","emit","__emit","panel","ref","previouslyFocused","focusables","el","onBackdrop","onKeydown","event","items","first","last","active","onMounted","target","onBeforeUnmount","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createBlock","Teleport","createBaseVNode","withModifiers","normalizeClass","createElementBlock","renderSlot","toDisplayString","createCommentVNode","AppDialog_default","render","__emit","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createBlock","$event","withCtx","createBaseVNode","createElementBlock","Fragment","renderList","group","toDisplayString","row","i","k","ki","ShortcutsOverlay_default","render","emit","__emit","year","_hoisted_1","_hoisted_2","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createBlock","$event","withCtx","createBaseVNode","createTextVNode","toDisplayString","AboutDialog_default","render","_hoisted_1","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createBlock","Transition","withCtx","createElementBlock","args","createBaseVNode","toDisplayString","withModifiers","createCommentVNode","Toast_default","render","BOOT_KEY","IDLE_MS","isLoggedIn","useWrdAuthState","route","useRoute","router","useRouter","showBoot","ref","shortcutsOpen","aboutOpen","idle","idleTimer","appBar","appHeader","sidebar","main","headerHeight","accountEmail","organizationSession","sidebarCollapsed","isPreferenceSet","mobileOpen","mobileQuery","isMobile","onAccount","account","toggleSidebar","closeMobileSidebar","openMobileSidebar","setPreference","resetPreference","nextTick","onViewportChange","watch","element","_previous","onCleanup","updateHeight","observer","open","previousOverflow","booted","maybeBoot","onBootDone","clearOrganizationSession","refreshAccount","clearCustomerListPosition","dismissToast","resetIdle","isTyping","el","onGlobalKeydown","event","ACTIVITY_EVENTS","onMounted","name","onBeforeUnmount","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createElementBlock","Fragment","createBlock","createCommentVNode","normalizeStyle","createBaseVNode","withModifiers","$event","createVNode","createTextVNode","withCtx","App_default","render","api","useApi","toast","useToast","members","ref","invitations","loading","loaded","busy","loadError","actionError","dialog","selectedMember","selectedInvitation","form","reactive","fieldErrors","emailInput","nameInput","disposed","loadVersion","useOrganizationDirty","onBeforeUnmount","roleLabel","role","expiresLabel","value","load","version","nextMembers","nextInvitations","err","closeDialog","openInvite","openRole","member","confirmMemberRemoval","confirmInvitationRemoval","invitation","mutate","action","message","submitInvitation","isLoginEmail","input","resendInvitation","submitRole","removeAccess","memberId","id","onMounted","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_29","_hoisted_30","_hoisted_31","_hoisted_32","_hoisted_33","_hoisted_34","_hoisted_35","_hoisted_36","_hoisted_37","_hoisted_38","_hoisted_39","_hoisted_40","_hoisted_41","_hoisted_42","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createElementBlock","createBaseVNode","toDisplayString","createCommentVNode","Fragment","renderList","index","member","$event","invitation","createBlock","withCtx","withModifiers","createVNode","withDirectives","normalizeClass","vModelText","vModelSelect","createTextVNode","OrganizationUsersView_default","render","api","rpc","route","useRoute","invitation","ref","loading","busy","error","differentAccount","computed","current","disposed","requestVersion","onBeforeUnmount","invitationInput","load","version","result","accept","err","rpcErrorMessage","signOut","logout","watch","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createElementBlock","createBaseVNode","Fragment","createTextVNode","toDisplayString","createCommentVNode","InvitationView_default","render","WIDGETS","WIDGET_TYPES","isWidgetType","value","DEFAULT_TYPES","defaultLayout","type","QUICK_ACTIONS","parseQuickActions","raw","action","nextId","layout","type","prefix","max","widget","n","addWidget","WIDGETS","removeWidget","id","moveWidget","direction","index","target","next","setSize","size","setQuickActionEnabled","action","enabled","actions","parseQuickActions","item","setTypeEnabled","present","reorderWidget","fromId","toId","from","to","moved","serializeLayout","parseLayout","raw","seen","result","record","isWidgetType","SAVE_DELAY_MS","useDashboardLayout","api","useApi","onBeforeUnmount","saveTimer","layout","ref","loading","load","raw","defaultLayout","parseLayout","persist","serializeLayout","apply","next","add","type","addWidget","setType","enabled","setTypeEnabled","remove","id","removeWidget","move","direction","moveWidget","resize","size","setSize","reorder","fromId","toId","reorderWidget","reset","setQuickAction","selection","setQuickActionEnabled","__emit","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createElementBlock","normalizeClass","createBaseVNode","createCommentVNode","toDisplayString","$event","renderSlot","WidgetShell_default","render","ZERO","Money","CENT","isValidTimeEntryHours","hours","Money","vatAmount","amountExcl","vatRate","Money","CENT","amountInclVat","computeTellen","input","totalHours","ZERO","hoursAmount","entry","expensesAmount","expense","declared","margin","invoice","totalCosts","toDeclare","suggestMargin","declareAmount","diff","employeeReportName","input","euro","number0","hours","CENT","Money","toDisplayNumber","value","money","formatEuro","formatNumber","formatHours","formatDate","date","formatActivityGroup","group","labels","index","label","entryDescription","entry","_hoisted_1","_hoisted_2","_hoisted_3","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createElementBlock","createBaseVNode","toDisplayString","HoursWeekWidget_default","render","_hoisted_1","_hoisted_2","_hoisted_3","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createElementBlock","createBaseVNode","toDisplayString","OutstandingWidget_default","render","_hoisted_1","_hoisted_2","_hoisted_3","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createElementBlock","createBaseVNode","toDisplayString","RevenueYtdWidget_default","render","_hoisted_1","_hoisted_2","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createElementBlock","createBaseVNode","toDisplayString","WipWidget_default","render","_hoisted_1","_hoisted_2","_hoisted_3","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createElementBlock","createBaseVNode","toDisplayString","VatQuarterWidget_default","render","_hoisted_1","_hoisted_2","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createElementBlock","createBaseVNode","toDisplayString","CustomersWidget_default","render","props","__props","emptyMark","hasData","computed","_hoisted_1","_hoisted_2","_hoisted_3","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createElementBlock","createBaseVNode","toDisplayString","DsoWidget_default","render","router","useRouter","open","customerId","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createElementBlock","Fragment","renderList","row","createBaseVNode","$event","createTextVNode","toDisplayString","ToDeclareWidget_default","render","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createElementBlock","Fragment","renderList","entry","createBaseVNode","createTextVNode","toDisplayString","RecentEntriesWidget_default","render","props","__props","MONTHS","LETTERS","max","computed","month","height","value","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createElementBlock","createBaseVNode","Fragment","renderList","month","normalizeStyle","toDisplayString","RevenueChartWidget_default","render","props","__props","max","computed","bucket","width","value","fillClass","index","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createElementBlock","Fragment","createBaseVNode","renderList","bucket","index","createTextVNode","toDisplayString","normalizeClass","normalizeStyle","AgingWidget_default","render","props","__props","rows","computed","max","row","width","value","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createElementBlock","Fragment","renderList","row","createBaseVNode","toDisplayString","normalizeStyle","DebtorsWidget_default","render","props","__props","rows","computed","max","row","width","value","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createElementBlock","Fragment","renderList","row","createBaseVNode","toDisplayString","normalizeStyle","HoursEmployeeWidget_default","render","props","__props","rows","computed","fillClass","pct","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createElementBlock","Fragment","renderList","row","createBaseVNode","toDisplayString","normalizeClass","normalizeStyle","BudgetWidget_default","render","props","__props","emit","__emit","selected","computed","parseQuickActions","visibleActions","QUICK_ACTIONS","action","onToggle","event","_hoisted_1","_hoisted_2","_hoisted_3","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createElementBlock","withModifiers","Fragment","renderList","action","createBaseVNode","$event","toDisplayString","createBlock","withCtx","createTextVNode","QuickActionsWidget_default","render","props","__props","emit","__emit","COMPONENTS","HoursWeekWidget_default","OutstandingWidget_default","RevenueYtdWidget_default","WipWidget_default","VatQuarterWidget_default","CustomersWidget_default","DsoWidget_default","ToDeclareWidget_default","RecentEntriesWidget_default","RevenueChartWidget_default","AgingWidget_default","DebtorsWidget_default","HoursEmployeeWidget_default","BudgetWidget_default","QuickActionsWidget_default","draggedId","ref","dragOverId","onDragStart","id","event","onDragOver","onDragLeave","onDrop","onDragEnd","_hoisted_1","_hoisted_2","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createElementBlock","Fragment","renderList","widget","index","normalizeClass","$event","createVNode","withCtx","createBlock","resolveDynamicComponent","DashboardGrid_default","render","emit","__emit","onToggle","type","event","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createBlock","$event","withCtx","createBaseVNode","createElementBlock","Fragment","renderList","type","toDisplayString","WidgetManager_default","render","api","useApi","layout","loadLayout","setType","remove","move","resize","reorder","setQuickAction","useDashboardLayout","name","ref","data","loading","error","editing","managerOpen","usedTypes","computed","widget","onResize","id","item","onMounted","me","dashboard","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createElementBlock","createBaseVNode","toDisplayString","$event","createCommentVNode","normalizeClass","Fragment","createTextVNode","createBlock","DashboardView_default","render","useListKeyboard","options","activeIndex","ref","inSearch","isTyping","el","dialogOpen","scrollActiveIntoView","reset","onKeydown","event","count","navAllowed","onMounted","onBeforeUnmount","usePagedRows","fetchPage","rows","shallowRef","page","loading","loadingMore","error","moreError","trigger","totalCount","computed","hasMore","generation","disposed","pending","observer","loadMore","current","offset","response","cause","message","reload","ensureLoaded","index","observe","watch","onMounted","changes","change","onBeforeUnmount","parseCustomerListState","query","customerListStateToQuery","state","splitCustomerAddress","address","match","isoWeek","date","d","dayNum","firstThursday","firstDayNum","todayISODate","now","yyyy","mm","dd","fiscalYearOf","isoDate","expandFiscalYear","input","raw","year","api","useApi","props","__props","emit","__emit","isEdit","computed","saving","ref","formError","fieldErrors","reactive","form","houseNumber","splitCustomerAddress","lookupText","lookupRequest","pendingLookup","lookupAddress","resolveAddress","zip","number","originalAddress","originalCity","request","result","selectMinYear","event","normalizeMinYear","raw","year","expandFiscalYear","validate","key","submit","payload","id","e","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createBlock","$event","withCtx","createBaseVNode","toDisplayString","withModifiers","createElementBlock","createCommentVNode","createVNode","withDirectives","normalizeClass","vModelText","CustomerFormDialog_default","render","emit","__emit","frame","useTemplateRef","trigger","onBeforeUnmount","print","target","_hoisted_1","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createElementBlock","Fragment","createCommentVNode","createBaseVNode","PrintDocument_default","render","props","__props","emit","__emit","html","computed","rows","customer","encodeString","search","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createBlock","$event","CustomerPrintDialog_default","render","api","useApi","route","useRoute","router","useRouter","restored","parseCustomerListState","queryRecord","query","ref","includeArchived","searchInput","disposed","rows","totalCount","loading","loadingMore","error","moreError","hasMore","loadMoreTrigger","revealMore","reload","ensureLoaded","usePagedRows","offset","watch","next","customerListStateToQuery","sameQuery","resetKeyboard","value","state","formOpen","printRows","shallowRef","printSelection","printLoading","printError","printBusy","computed","activeIndex","useListKeyboard","openNew","index","openDetail","nextTick","loadMore","print","selected","current","customers","cause","id","rememberCustomerListPosition","closeForm","onCreated","onMounted","saved","customerListPosition","row","position","restoreCustomerListPosition","onBeforeUnmount","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createElementBlock","createBaseVNode","toDisplayString","createTextVNode","withDirectives","$event","vModelText","vModelCheckbox","args","createCommentVNode","Fragment","renderList","row","index","normalizeClass","createBlock","CustomersView_default","render","queryFields","parseCustomerReportState","query","customer","value","year","expandFiscalYear","customerReportStateToQuery","state","field","key","useEscapeBack","target","router","useRouter","blocked","el","onKeydown","event","onMounted","onBeforeUnmount","props","__props","totals","computed","key","sum","row","Money","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createElementBlock","createBaseVNode","toDisplayString","Fragment","renderList","row","index","createTextVNode","createCommentVNode","normalizeClass","CustomerBalanceTable_default","render","props","__props","api","useApi","route","useRoute","router","useRouter","useEscapeBack","selection","shallowRef","parseCustomerReportState","queryRecord","form","reactive","fieldErrors","result","useTemplateRef","printSource","printRows","printHtml","printLoading","printError","disposed","apiSelection","state","title","computed","rows","page","totalCount","loading","loadingMore","error","moreError","hasMore","loadMoreTrigger","revealMore","reload","usePagedRows","offset","watch","summary","years","toDeclare","fields","query","customerReportStateToQuery","sameQuery","key","normalizeYear","field","expandFiscalYear","apply","value","from","to","first","loadMore","index","nextTick","print","printTitle","printSummary","selected","mode","current","data","table","encodeString","cause","onKeydown","event","target","onMounted","onBeforeUnmount","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createElementBlock","createBaseVNode","toDisplayString","withModifiers","Fragment","renderList","field","createVNode","withCtx","withDirectives","$event","normalizeClass","vModelText","vModelCheckbox","createTextVNode","createCommentVNode","args","createBlock","CustomerReportsView_default","render","expenseTransferLabel","expense","Money","ZERO","Money","buildProductionStatement","input","byGroup","entry","group","current","labelFor","groups","a","b","hoursTotal","sum","g","hoursAmountTotal","expensesTotal","e","groupLabels","index","parseCustomerDetailState","query","value","customerDetailStateToQuery","state","defaultProductionYear","isClient","isWorker","toString","isObject","val","noop","isIOS","getIsIOS","_window","_window2","_window3","isClient","toArray","value","cacheStringFunction","fn","cache","str","hyphenateRE","hyphenate","camelizeRE","camelize","_","c","watchImmediate","source","cb","options","watch","defaultWindow","isClient","defaultDocument","defaultNavigator","defaultLocation","unrefElement","elRef","_$el","plain","toValue","useEventListener","args","register","el","event","listener","options","firstParamTargets","computed","test","toArray","e","watchImmediate","_firstParamTargets$va","_firstParamTargets$va2","unref","raw_targets","raw_events","raw_listeners","raw_options","_","onCleanup","optionsClone","isObject","cleanups","fn","_iOSWorkaround","onClickOutside","target","handler","window","ignore","capture","detectIframe","controls","noop","isIOS","listenerOptions","shouldListen","shouldIgnore","hasMultipleRoots","vm","checkMultipleRoots","children","child","isProcessingClick","cleanup","activeEl","stop","useSwipe","target","options","threshold","onSwipe","onSwipeEnd","onSwipeStart","passive","coordsStart","reactive","coordsEnd","diffX","computed","diffY","max","abs","isThresholdExceeded","isSwiping","shallowRef","direction","getTouchEventCoords","e","updateCoordsStart","x","y","updateCoordsEnd","listenerOptions","onTouchEnd","stops","useEventListener","s","useTemplateRefsList","refs","ref","el","onBeforeUpdate","DEFAULT_UNITS","min","max","round","floor","createCoords","v","oppositeSideMap","clamp","start","value","end","evaluate","param","getSide","placement","getAlignment","getOppositeAxis","axis","getAxisLength","getSideAxis","firstChar","getAlignmentAxis","getAlignmentSides","rects","rtl","alignment","alignmentAxis","length","mainAlignmentSide","getOppositePlacement","getExpandedPlacements","oppositePlacement","getOppositeAlignmentPlacement","lrPlacement","rlPlacement","tbPlacement","btPlacement","getSideList","side","isStart","getOppositeAxisPlacements","flipAlignment","direction","list","expandPaddingObject","padding","_padding$top","_padding$right","_padding$bottom","_padding$left","getPaddingObject","rectToClientRect","rect","x","y","width","height","computeCoordsFromPlacement","_ref","placement","rtl","reference","floating","sideAxis","getSideAxis","alignmentAxis","getAlignmentAxis","alignLength","getAxisLength","side","getSide","isVertical","commonX","commonY","commonAlign","coords","alignment","getAlignment","detectOverflow","state","options","_await$platform$isEle","x","y","platform","rects","elements","strategy","boundary","rootBoundary","elementContext","altBoundary","padding","evaluate","paddingObject","getPaddingObject","element","clippingClientRect","rectToClientRect","rect","offsetParent","offsetScale","elementClientRect","MAX_RESET_COUNT","computePosition","config","middleware","platformWithDetectOverflow","statefulPlacement","resetCount","middlewareData","i","currentMiddleware","name","fn","nextX","nextY","data","reset","arrow","axis","length","arrowDimensions","isYAxis","minProp","maxProp","clientProp","endDiff","startDiff","arrowOffsetParent","clientSize","centerToReference","largestPossiblePadding","minPadding","min","maxPadding","max","center","offset","clamp","shouldAddOffset","alignmentOffset","flip","options","state","_middlewareData$arrow","_middlewareData$flip","placement","middlewareData","rects","initialPlacement","platform","elements","checkMainAxis","checkCrossAxis","specifiedFallbackPlacements","fallbackStrategy","fallbackAxisSideDirection","flipAlignment","detectOverflowOptions","evaluate","side","getSide","initialSideAxis","getSideAxis","isBasePlacement","rtl","fallbackPlacements","getOppositePlacement","getExpandedPlacements","hasFallbackAxisSideDirection","getOppositeAxisPlacements","placements","overflow","overflows","overflowsData","sides","getAlignmentSides","_middlewareData$flip2","_overflowsData$filter","nextIndex","nextPlacement","d","resetPlacement","a","b","_overflowsData$filter2","currentSideAxis","acc","originSides","convertValueToCoords","state","options","placement","platform","elements","rtl","side","getSide","alignment","getAlignment","isVertical","getSideAxis","mainAxisMulti","crossAxisMulti","rawValue","evaluate","mainAxis","crossAxis","alignmentAxis","offset","_middlewareData$offse","_middlewareData$arrow","x","y","middlewareData","diffCoords","shift","checkMainAxis","checkCrossAxis","limiter","_ref","detectOverflowOptions","coords","overflow","getOppositeAxis","mainAxisCoord","crossAxisCoord","clampCoord","axis","coord","clamp","limitedCoords","hasWindow","getNodeName","node","isNode","getWindow","_node$ownerDocument","getDocumentElement","_ref","value","isElement","isHTMLElement","isShadowRoot","isOverflowElement","element","overflow","overflowX","overflowY","display","getComputedStyle","isTableElement","isTopLayer","willChangeRe","containRe","isNotNone","isWebKitValue","isContainingBlock","elementOrCss","css","isWebKit","getContainingBlock","currentNode","getParentNode","isLastTraversableNode","getNodeScroll","result","getNearestOverflowAncestor","parentNode","getOverflowAncestors","list","traverseIframes","_node$ownerDocument2","scrollableAncestor","isBody","win","frameElement","getFrameElement","getCssDimensions","element","css","getComputedStyle","width","height","hasOffset","isHTMLElement","offsetWidth","offsetHeight","shouldFallback","round","unwrapElement","isElement","getScale","domElement","createCoords","rect","$","x","y","noOffsets","getVisualOffsets","win","getWindow","isWebKit","shouldAddVisualOffsets","isFixed","floatingOffsetParent","getBoundingClientRect","includeScale","isFixedStrategy","offsetParent","clientRect","scale","visualOffsets","offsetWin","currentWin","currentIFrame","getFrameElement","iframeScale","iframeRect","left","top","rectToClientRect","getWindowScrollBarX","leftScroll","getNodeScroll","getDocumentElement","getHTMLOffset","documentElement","scroll","htmlRect","convertOffsetParentRelativeRectToViewportRelativeRect","_ref","elements","strategy","topLayer","isTopLayer","offsets","isOffsetParentAnElement","getNodeName","isOverflowElement","offsetRect","htmlOffset","getClientRects","getDocumentRect","html","body","max","SCROLLBAR_MAX","getViewportRect","rootBoundary","isLayoutViewport","visualViewport","layoutRelativeClientCoords","doc","bodyStyles","bodyMarginInline","reservedWidth","gutter","getInnerBoundingClientRect","getClientRectFromClippingAncestor","clippingAncestor","getClippingElementAncestors","cache","cachedResult","result","getOverflowAncestors","el","lastKeptComputedStyle","elementIsFixed","currentNode","getParentNode","isLastTraversableNode","computedStyle","currentNodeIsContaining","isContainingBlock","lastPosition","ancestor","getClippingRect","boundary","clippingAncestors","firstRect","right","bottom","i","min","getDimensions","getRectRelativeToOffsetParent","isStaticPositioned","getTrueOffsetParent","polyfill","rawOffsetParent","getOffsetParent","svgOffsetParent","isTableElement","getContainingBlock","getElementRects","data","getOffsetParentFn","getDimensionsFn","floatingDimensions","isRTL","platform","rectsAreEqual","a","b","observeMove","onMove","ancestorResize","io","timeoutId","root","cleanup","_io","refresh","skip","threshold","elementRectForRootMargin","insetTop","floor","insetRight","insetBottom","insetLeft","options","isFirstUpdate","handleObserve","entries","ratio","handleResize","autoUpdate","reference","floating","update","ancestorScroll","elementResize","layoutShift","animationFrame","referenceEl","ancestors","cleanupIo","reobserveFrame","resizeObserver","firstEntry","_resizeObserver","frameId","prevRefRect","frameLoop","nextRefRect","_resizeObserver2","offset","shift","flip","arrow","computePosition","reference","floating","options","cache","mergedOptions","platformWithCache","platform","isComponentPublicInstance","target","unwrapElement","element","isNode","getNodeName","toValue","source","unref","arrow","options","args","getDPR","roundByDPR","value","dpr","useFloating","reference","floating","whileElementsMountedOption","openOption","computed","_toValue","middlewareOption","placementOption","_toValue2","strategyOption","_toValue3","transformOption","_toValue4","referenceElement","floatingElement","x","ref","y","strategy","placement","middlewareData","shallowRef","isPositioned","floatingStyles","initialStyles","xVal","yVal","whileElementsMountedCleanup","update","open","computePosition","position","cleanup","attach","reset","watch","getCurrentScope","onScopeDispose","shallowReadonly","maxTime","minTime","millisecondsInWeek","millisecondsInDay","millisecondsInMinute","millisecondsInHour","millisecondsInSecond","secondsInHour","secondsInDay","secondsInHour","secondsInWeek","secondsInYear","secondsInMonth","secondsInQuarter","constructFromSymbol","constructFrom","date","value","constructFromSymbol","toDate","argument","context","constructFrom","addDays","date","amount","options","_date","toDate","constructFrom","addMonths","date","amount","options","_date","toDate","constructFrom","dayOfMonth","endOfDesiredMonth","daysInMonth","add","date","duration","options","years","months","weeks","days","hours","minutes","seconds","_date","toDate","dateWithMonths","addMonths","dateWithDays","addDays","minutesToAdd","msToAdd","constructFrom","defaultOptions","getDefaultOptions","startOfWeek","date","options","defaultOptions","getDefaultOptions","weekStartsOn","_date","toDate","day","diff","startOfISOWeek","date","options","startOfWeek","getISOWeekYear","date","options","_date","toDate","year","fourthOfJanuaryOfNextYear","constructFrom","startOfNextYear","startOfISOWeek","fourthOfJanuaryOfThisYear","startOfThisYear","getTimezoneOffsetInMilliseconds","date","_date","toDate","utcDate","normalizeDates","context","dates","normalize","constructFrom","date","startOfDay","date","options","_date","toDate","differenceInCalendarDays","laterDate","earlierDate","options","laterDate_","earlierDate_","normalizeDates","laterStartOfDay","startOfDay","earlierStartOfDay","laterTimestamp","getTimezoneOffsetInMilliseconds","earlierTimestamp","millisecondsInDay","startOfISOWeekYear","date","options","year","getISOWeekYear","fourthOfJanuary","constructFrom","startOfISOWeek","addQuarters","date","amount","options","addMonths","addYears","date","amount","options","addMonths","compareAsc","dateLeft","dateRight","diff","toDate","isDate","value","isValid","date","isDate","toDate","getQuarter","date","options","_date","toDate","differenceInCalendarYears","laterDate","earlierDate","options","laterDate_","earlierDate_","normalizeDates","getRoundingMethod","method","number","result","differenceInYears","laterDate","earlierDate","options","laterDate_","earlierDate_","normalizeDates","sign","compareAsc","diff","differenceInCalendarYears","partial","result","normalizeInterval","context","interval","start","end","normalizeDates","eachDayOfInterval","interval","options","start","end","normalizeInterval","reversed","endTime","date","step","dates","constructFrom","startOfQuarter","date","options","_date","toDate","currentMonth","month","eachQuarterOfInterval","interval","options","start","end","normalizeInterval","reversed","endTime","startOfQuarter","date","step","dates","constructFrom","addQuarters","startOfMonth","date","options","_date","toDate","endOfYear","date","options","_date","toDate","year","startOfYear","date","options","date_","toDate","endOfWeek","date","options","defaultOptions","getDefaultOptions","weekStartsOn","_date","toDate","day","diff","endOfQuarter","date","options","_date","toDate","currentMonth","month","formatDistanceLocale","formatDistance","token","count","options","result","tokenValue","buildFormatLongFn","args","options","width","dateFormats","timeFormats","dateTimeFormats","formatLong","buildFormatLongFn","formatRelativeLocale","formatRelative","token","_date","_baseDate","_options","buildLocalizeFn","args","value","options","context","valuesArray","defaultWidth","width","index","eraValues","quarterValues","monthValues","dayValues","dayPeriodValues","formattingDayPeriodValues","ordinalNumber","dirtyNumber","_options","number","rem100","localize","buildLocalizeFn","quarter","buildMatchFn","args","string","options","width","matchPattern","matchResult","matchedString","parsePatterns","key","findIndex","pattern","findKey","value","rest","object","predicate","array","buildMatchPatternFn","args","string","options","matchResult","matchedString","parseResult","value","rest","matchOrdinalNumberPattern","parseOrdinalNumberPattern","matchEraPatterns","parseEraPatterns","matchQuarterPatterns","parseQuarterPatterns","matchMonthPatterns","parseMonthPatterns","matchDayPatterns","parseDayPatterns","matchDayPeriodPatterns","parseDayPeriodPatterns","match","buildMatchPatternFn","value","buildMatchFn","index","enUS","formatDistance","formatLong","formatRelative","localize","match","getDayOfYear","date","options","_date","toDate","differenceInCalendarDays","startOfYear","getISOWeek","date","options","_date","toDate","diff","startOfISOWeek","startOfISOWeekYear","millisecondsInWeek","getWeekYear","date","options","_date","toDate","year","defaultOptions","getDefaultOptions","firstWeekContainsDate","firstWeekOfNextYear","constructFrom","startOfNextYear","startOfWeek","firstWeekOfThisYear","startOfThisYear","startOfWeekYear","date","options","defaultOptions","getDefaultOptions","firstWeekContainsDate","year","getWeekYear","firstWeek","constructFrom","startOfWeek","getWeek","date","options","_date","toDate","diff","startOfWeek","startOfWeekYear","millisecondsInWeek","addLeadingZeros","number","targetLength","sign","output","lightFormatters","date","token","signedYear","year","addLeadingZeros","month","dayPeriodEnumValue","numberOfDigits","milliseconds","fractionalSeconds","dayPeriodEnum","formatters","date","token","localize","era","signedYear","year","lightFormatters","options","signedWeekYear","getWeekYear","weekYear","twoDigitYear","addLeadingZeros","isoWeekYear","getISOWeekYear","quarter","month","week","getWeek","isoWeek","getISOWeek","dayOfYear","getDayOfYear","dayOfWeek","localDayOfWeek","isoDayOfWeek","dayPeriodEnumValue","hours","_localize","timezoneOffset","formatTimezoneWithOptionalMinutes","formatTimezone","formatTimezoneShort","timestamp","offset","delimiter","sign","absOffset","minutes","dateLongFormatter","pattern","formatLong","timeLongFormatter","dateTimeLongFormatter","matchResult","datePattern","timePattern","dateTimeFormat","longFormatters","dayOfYearTokenRE","weekYearTokenRE","throwTokens","isProtectedDayOfYearToken","token","isProtectedWeekYearToken","warnOrThrowProtectedError","format","input","_message","message","subject","formattingTokensRegExp","longFormattingTokensRegExp","escapedStringRegExp","doubleQuoteRegExp","unescapedLatinCharacterRegExp","format","date","formatStr","options","defaultOptions","getDefaultOptions","locale","enUS","firstWeekContainsDate","weekStartsOn","originalDate","toDate","isValid","parts","longFormattingTokensRegExp","substring","firstCharacter","longFormatter","longFormatters","formattingTokensRegExp","cleanEscapedString","formatters","unescapedLatinCharacterRegExp","formatterOptions","part","token","isProtectedWeekYearToken","isProtectedDayOfYearToken","warnOrThrowProtectedError","formatter","input","matched","escapedStringRegExp","doubleQuoteRegExp","getDay","date","options","toDate","getDaysInMonth","date","options","_date","toDate","year","monthIndex","lastDayOfMonth","constructFrom","getDefaultOptions","getHours","date","options","toDate","getISODay","date","options","day","toDate","getMinutes","date","options","toDate","getMonth","date","options","toDate","getSeconds","date","toDate","getYear","date","options","toDate","isAfter","date","dateToCompare","toDate","isBefore","date","dateToCompare","toDate","isEqual","leftDate","rightDate","toDate","transpose","date","constructor","date_","isConstructor","constructFrom","TIMEZONE_UNIT_PRIORITY","Setter","_utcDate","_options","ValueSetter","value","validateValue","setValue","priority","subPriority","date","options","flags","DateTimezoneSetter","context","reference","constructFrom","transpose","Parser","dateString","token","match","options","result","ValueSetter","_utcDate","_value","_options","EraParser","Parser","dateString","token","match","date","flags","value","numericPatterns","timezonePatterns","mapValue","parseFnResult","mapFn","parseNumericPattern","pattern","dateString","matchResult","parseTimezonePattern","sign","hours","minutes","seconds","millisecondsInHour","millisecondsInMinute","millisecondsInSecond","parseAnyDigitsSigned","numericPatterns","parseNDigits","parseNDigitsSigned","dayPeriodEnumToHours","dayPeriod","normalizeTwoDigitYear","twoDigitYear","currentYear","isCommonEra","absCurrentYear","result","rangeEnd","rangeEndCentury","isPreviousCentury","isLeapYearIndex","year","YearParser","Parser","dateString","token","match","valueCallback","year","mapValue","parseNDigits","_date","value","date","flags","currentYear","normalizedTwoDigitYear","normalizeTwoDigitYear","LocalWeekYearParser","Parser","dateString","token","match","valueCallback","year","mapValue","parseNDigits","_date","value","date","flags","options","currentYear","getWeekYear","normalizedTwoDigitYear","normalizeTwoDigitYear","startOfWeek","ISOWeekYearParser","Parser","dateString","token","parseNDigitsSigned","date","_flags","value","firstWeekOfYear","constructFrom","startOfISOWeek","ExtendedYearParser","Parser","dateString","token","parseNDigitsSigned","date","_flags","value","QuarterParser","Parser","dateString","token","match","parseNDigits","_date","value","date","_flags","StandAloneQuarterParser","Parser","dateString","token","match","parseNDigits","_date","value","date","_flags","MonthParser","Parser","dateString","token","match","valueCallback","value","mapValue","parseNumericPattern","numericPatterns","parseNDigits","_date","date","_flags","StandAloneMonthParser","Parser","dateString","token","match","valueCallback","value","mapValue","parseNumericPattern","numericPatterns","parseNDigits","_date","date","_flags","setWeek","date","week","options","date_","toDate","diff","getWeek","LocalWeekParser","Parser","dateString","token","match","parseNumericPattern","numericPatterns","parseNDigits","_date","value","date","_flags","options","startOfWeek","setWeek","setISOWeek","date","week","options","_date","toDate","diff","getISOWeek","ISOWeekParser","Parser","dateString","token","match","parseNumericPattern","numericPatterns","parseNDigits","_date","value","date","_flags","startOfISOWeek","setISOWeek","DAYS_IN_MONTH","DAYS_IN_MONTH_LEAP_YEAR","DateParser","Parser","dateString","token","match","parseNumericPattern","numericPatterns","parseNDigits","date","value","year","isLeapYear","isLeapYearIndex","month","_flags","DayOfYearParser","Parser","dateString","token","match","parseNumericPattern","numericPatterns","parseNDigits","date","value","year","isLeapYearIndex","_flags","setDay","date","day","options","defaultOptions","getDefaultOptions","weekStartsOn","date_","toDate","currentDay","dayIndex","delta","diff","addDays","DayParser","Parser","dateString","token","match","_date","value","date","_flags","options","setDay","LocalDayParser","Parser","dateString","token","match","options","valueCallback","value","wholeWeekDays","mapValue","parseNDigits","_date","date","_flags","setDay","StandAloneLocalDayParser","Parser","dateString","token","match","options","valueCallback","value","wholeWeekDays","mapValue","parseNDigits","_date","date","_flags","setDay","setISODay","date","day","options","date_","toDate","currentDay","getISODay","diff","addDays","ISODayParser","Parser","dateString","token","match","valueCallback","value","parseNDigits","mapValue","_date","date","_flags","setISODay","AMPMParser","Parser","dateString","token","match","date","_flags","value","dayPeriodEnumToHours","AMPMMidnightParser","Parser","dateString","token","match","date","_flags","value","dayPeriodEnumToHours","DayPeriodParser","Parser","dateString","token","match","date","_flags","value","dayPeriodEnumToHours","Hour1to12Parser","Parser","dateString","token","match","parseNumericPattern","numericPatterns","parseNDigits","_date","value","date","_flags","isPM","Hour0to23Parser","Parser","dateString","token","match","parseNumericPattern","numericPatterns","parseNDigits","_date","value","date","_flags","Hour0To11Parser","Parser","dateString","token","match","parseNumericPattern","numericPatterns","parseNDigits","_date","value","date","_flags","Hour1To24Parser","Parser","dateString","token","match","parseNumericPattern","numericPatterns","parseNDigits","_date","value","date","_flags","hours","MinuteParser","Parser","dateString","token","match","parseNumericPattern","numericPatterns","parseNDigits","_date","value","date","_flags","SecondParser","Parser","dateString","token","match","parseNumericPattern","numericPatterns","parseNDigits","_date","value","date","_flags","FractionOfSecondParser","Parser","dateString","token","valueCallback","value","mapValue","parseNDigits","date","_flags","ISOTimezoneWithZParser","Parser","dateString","token","parseTimezonePattern","timezonePatterns","date","flags","value","constructFrom","getTimezoneOffsetInMilliseconds","ISOTimezoneParser","Parser","dateString","token","parseTimezonePattern","timezonePatterns","date","flags","value","constructFrom","getTimezoneOffsetInMilliseconds","TimestampSecondsParser","Parser","dateString","parseAnyDigitsSigned","date","_flags","value","constructFrom","TimestampMillisecondsParser","Parser","dateString","parseAnyDigitsSigned","date","_flags","value","constructFrom","parsers","EraParser","YearParser","LocalWeekYearParser","ISOWeekYearParser","ExtendedYearParser","QuarterParser","StandAloneQuarterParser","MonthParser","StandAloneMonthParser","LocalWeekParser","ISOWeekParser","DateParser","DayOfYearParser","DayParser","LocalDayParser","StandAloneLocalDayParser","ISODayParser","AMPMParser","AMPMMidnightParser","DayPeriodParser","Hour1to12Parser","Hour0to23Parser","Hour0To11Parser","Hour1To24Parser","MinuteParser","SecondParser","FractionOfSecondParser","ISOTimezoneWithZParser","ISOTimezoneParser","TimestampSecondsParser","TimestampMillisecondsParser","formattingTokensRegExp","longFormattingTokensRegExp","escapedStringRegExp","doubleQuoteRegExp","notWhitespaceRegExp","unescapedLatinCharacterRegExp","parse","dateStr","formatStr","referenceDate","options","invalidDate","constructFrom","defaultOptions","getDefaultOptions","locale","enUS","firstWeekContainsDate","weekStartsOn","toDate","subFnOptions","setters","DateTimezoneSetter","tokens","substring","firstCharacter","longFormatters","longFormatter","usedTokens","token","isProtectedWeekYearToken","warnOrThrowProtectedError","isProtectedDayOfYearToken","parser","parsers","incompatibleTokens","incompatibleToken","usedToken","parseResult","cleanEscapedString","uniquePrioritySetters","setter","a","b","priority","index","array","setterArray","date","flags","result","input","isSameQuarter","laterDate","earlierDate","options","dateLeft_","dateRight_","normalizeDates","startOfQuarter","subDays","date","amount","options","addDays","parseISO","argument","options","invalidDate","constructFrom","additionalDigits","dateStrings","splitDateString","date","parseYearResult","parseYear","parseDate","timestamp","time","offset","parseTime","parseTimezone","tmpDate","result","toDate","patterns","dateRegex","timeRegex","timezoneRegex","dateString","array","timeString","token","regex","captures","year","century","isWeekDate","dayOfYear","parseDateUnit","month","day","week","dayOfWeek","validateWeekDate","dayOfISOWeekYear","validateDate","validateDayOfYearDate","value","hours","parseTimeUnit","minutes","seconds","validateTime","millisecondsInHour","millisecondsInMinute","timezoneString","sign","validateTimezone","isoWeekYear","fourthOfJanuaryDay","diff","daysInMonths","isLeapYearIndex","_year","_hours","roundToNearestMinutes","date","options","nearestTo","constructFrom","date_","toDate","fractionalSeconds","fractionalMilliseconds","minutes","method","roundedMinutes","getRoundingMethod","setMonth","date","month","options","_date","toDate","year","day","midMonth","constructFrom","daysInMonth","getDaysInMonth","set","date","values","options","_date","toDate","constructFrom","setMonth","setMilliseconds","date","milliseconds","options","_date","toDate","setSeconds","date","seconds","options","_date","toDate","setYear","date","year","options","date_","toDate","constructFrom","subMonths","date","amount","options","addMonths","sub","date","duration","options","years","months","weeks","days","hours","minutes","seconds","withoutMonths","subMonths","withoutDays","subDays","minutesToSub","msToSub","constructFrom","subYears","date","amount","options","addYears","tzName","timeZone","date","format","offsetFormatCache","offsetCache","tzOffset","timeZone","date","offsetStr","calcOffset","captures","offsetRe","cacheStr","values","hours","minutes","seconds","TZDateMini","_TZDateMini","args","tzOffset","adjustToSystemTZ","tz","timeZone","offset","_time","syncToInternal","date","re","method","utcMethod","syncFromInternal","constructorArgs","expectedInternalTime","constructorArgsToInternalTime","offsetWithSeconds","prevHour","systemOffset","prevHourSystemOffset","systemDSTChange","systemOffsetForDiff","systemHour","expectedHour","testDate","testOffsetDiff","testOffsetWithSeconds","offsetDiff","systemDate","systemSecondsOffset","secondsOffset","postOffsetWithSeconds","postOffset","postOffsetDiff","offsetChanged","postDiff","targetDSTShift","postOffsetCandidate","normalizedTargetDSTGap","targetInternalTime","newOffsetWithSeconds","newOffset","offsetChange","drift","time","internal","TZDate","_TZDate","TZDateMini","tz","args","sign","hours","minutes","day","date","month","year","time","tzName","locales","options","offset","timeZone","Ke","h","qe","Je","Ye","Xe","Ze","Qe","$e","et","e","t","n","Wt","i","Ut","ref","o","reactive","s","c","l","getMonth","getYear","u","d","computed","p","provide","readonly","tt","nt","rt","it","at","Q","ot","ct","lt","e","t","n","i","o","$","s","ref","c","reactive","nt","l","computed","u","p","d","nextTick","r","rt","provide","readonly","inject","$e","ut","dt","watch","b","a","Q","m","h","g","v","y","onMounted","onUnmounted","ft","ht","Wt","f","_","Gt","x","qt","R","B","getHours","getMinutes","getSeconds","C","getMonth","getYear","w","T","setYear","z","E","D","set","O","k","A","j","M","N","ee","P","F","I","te","it","parse","V","ne","re","H","U","pt","mt","S","getDay","eachDayOfInterval","differenceInCalendarDays","L","W","addMonths","subMonths","isBefore","isAfter","isEqual","ie","isValid","gt","_t","vt","bt","yt","xt","St","Ct","wt","Tt","Et","Dt","Ot","kt","At","jt","Mt","Nt","Pt","Ft","It","Lt","Rt","zt","Bt","Vt","Ht","Ut","TZDate","ot","startOfWeek","format","startOfMonth","endOfWeek","subDays","addDays","Kt","setMonth","Jt","Yt","Xt","Zt","isDate","Qt","$t","en","tn","nn","rn","an","on","sn","cn","defineComponent","useTemplateRef","G","ae","oe","K","q","J","se","ce","le","ue","openBlock","createElementBlock","unref","renderSlot","createCommentVNode","createBaseVNode","normalizeClass","createBlock","Ke","withModifiers","createVNode","qe","ln","roundToNearestMinutes","un","dn","fn","pn","mn","Fragment","normalizeStyle","createTextVNode","toDisplayString","hn","gn","_n","vn","yn","bn","xn","useTemplateRefsList","onBeforeUpdate","unrefElement","renderList","withDirectives","vShow","Sn","Cn","wn","Tn","En","Dn","withCtx","Je","withKeys","Ye","Transition","createSlots","On","endOfYear","startOfYear","addYears","subYears","differenceInYears","kn","An","fe","pe","de","jn","useSlots","mergeProps","Mn","Nn","normalizeProps","Pn","Fn","In","Ln","Rn","zn","Bn","Vn","me","Y","add","sub","ke","he","ge","_e","ye","xe","Ce","X","Ee","Oe","Ae","je","Me","Ze","Qe","resolveDynamicComponent","Xe","Hn","Un","Wn","Gn","Kn","qn","setSeconds","setMilliseconds","Jn","Yn","guardReactiveProps","Xn","Zn","Qn","$n","er","tr","nr","tt","ve","be","rr","ir","ar","or","sr","cr","lr","ur","useSwipe","Fe","Se","we","Te","De","getWeek","getISOWeek","Ne","Pe","Ie","dr","Ge","Le","ze","Be","Ve","Ue","We","et","fr","pr","mr","mergeDefaults","hr","isSameQuarter","getQuarter","eachQuarterOfInterval","startOfQuarter","endOfQuarter","gr","_r","vr","yr","br","xr","Sr","Cr","wr","Tr","Er","Dr","Or","kr","at","toValue","Ar","Teleport","jr","Mr","toRef","useFloating","flip","shift","arrow","offset","autoUpdate","Z","He","Re","onClickOutside","Nr","formatDistanceLocale","formatDistance","token","count","options","result","tokenValue","dateFormats","timeFormats","dateTimeFormats","formatLong","buildFormatLongFn","formatRelativeLocale","formatRelative","token","_date","_baseDate","_options","eraValues","quarterValues","monthValues","dayValues","dayPeriodValues","ordinalNumber","dirtyNumber","_options","localize","buildLocalizeFn","quarter","matchOrdinalNumberPattern","parseOrdinalNumberPattern","matchEraPatterns","parseEraPatterns","matchQuarterPatterns","parseQuarterPatterns","matchMonthPatterns","parseMonthPatterns","matchDayPatterns","parseDayPatterns","matchDayPeriodPatterns","parseDayPeriodPatterns","match","buildMatchPatternFn","value","buildMatchFn","index","nl","formatDistance","formatLong","formatRelative","localize","match","props","__props","emit","__emit","picker","ref","input","draft","error","maskTail","computed","watch","value","parsed","parseISO","isValid","format","parseInput","match","parse","validate","focus","onInput","event","field","cursor","iso","parts","digits","before","position","normalizeInput","onSelected","nextTick","onKeydown","isMenuOpen","valid","onClosed","menu","__expose","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createElementBlock","normalizeClass","createVNode","value","withCtx","isMenuOpen","onFocus","onBlur","toggleMenu","createBaseVNode","mergeProps","$event","toDisplayString","createTextVNode","createCommentVNode","withModifiers","DateInput_default","render","api","useApi","props","__props","emit","__emit","isEdit","computed","loading","ref","saving","dateInput","useTemplateRef","error","rows","reactive","form","todayIso","defaultText","fieldErrors","onMounted","invoices","selected","reminder","line","candidates","invoice","Money","e","nextTick","submit","key","invoiceIds","row","textLines","id","showToast","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createBlock","$event","withCtx","createBaseVNode","toDisplayString","createElementBlock","Fragment","createCommentVNode","createVNode","renderList","row","withDirectives","vModelCheckbox","vModelText","ReminderFormDialog_default","render","api","useApi","showToast","useToast","TABS","route","useRoute","router","useRouter","customerListTarget","customerListPosition","customerId","computed","loading","ref","customer","archiveOpen","archiveSaving","archiveError","entries","invoices","expenses","reminders","remindersLoading","remindersLoaded","reminderCreateOpen","groupLabels","expenseKinds","managedYears","yearManagementOpen","yearManagementError","saldi","reactive","restored","parseCustomerDetailState","queryRecord","activeTab","displayName","years","set","entry","invoice","expense","budget","a","b","produktieYear","boekingenYear","defaultProductionYear","watch","next","customerDetailStateToQuery","sameQuery","production","buildProductionStatement","e","filteredInvoices","filterYear","filteredEntries","filteredExpenses","rows","year","row","budgetFor","kindLabel","kind","load","key","id","detail","entryRows","invoiceRows","expenseRows","settings","loadSaldi","loadReminders","tab","tellen","closed","openArchive","closeArchive","setCustomerArchived","archived","current","error","editOpen","onEdited","budgetOpen","budgetEditing","budgetSaving","budgetError","budgetForm","budgetFieldErrors","openBudget","submitBudget","closeYearTarget","closing","closeYearError","checklist","openCloseYear","item","confirmCloseYear","reopenYear","fiscalYear","openInvoice","openReminder","onReminderCreated","useEscapeBack","onMounted","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_29","_hoisted_30","_hoisted_31","_hoisted_32","_hoisted_33","_hoisted_34","_hoisted_35","_hoisted_36","_hoisted_37","_hoisted_38","_hoisted_39","_hoisted_40","_hoisted_41","_hoisted_42","_hoisted_43","_hoisted_44","_hoisted_45","_hoisted_46","_hoisted_47","_hoisted_48","_hoisted_49","_hoisted_50","_hoisted_51","_hoisted_52","_hoisted_53","_hoisted_54","_hoisted_55","_hoisted_56","_hoisted_57","_hoisted_58","_hoisted_59","_hoisted_60","_hoisted_61","_hoisted_62","_hoisted_63","_hoisted_64","_hoisted_65","_hoisted_66","_hoisted_67","_hoisted_68","_hoisted_69","_hoisted_70","_hoisted_71","_hoisted_72","_hoisted_73","_hoisted_74","_hoisted_75","_hoisted_76","_hoisted_77","_hoisted_78","_hoisted_79","_hoisted_80","_hoisted_81","_hoisted_82","_hoisted_83","_hoisted_84","_hoisted_85","_hoisted_86","_hoisted_87","_hoisted_88","_hoisted_89","_hoisted_90","_hoisted_91","_hoisted_92","_hoisted_93","_hoisted_94","_hoisted_95","_hoisted_96","_hoisted_97","_hoisted_98","_hoisted_99","_hoisted_100","_hoisted_101","_hoisted_102","_hoisted_103","_hoisted_104","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createElementBlock","createVNode","withCtx","createTextVNode","Fragment","createBaseVNode","toDisplayString","createCommentVNode","$event","normalizeClass","renderList","tab","budget","year","withDirectives","vModelSelect","group","invoice","entry","expense","reminder","createBlock","withModifiers","vModelText","item","index","vModelCheckbox","CustomerDetailView_default","render","parseArchiveListState","query","archiveListStateToQuery","state","api","useApi","props","__props","emit","__emit","saving","ref","formError","fieldErrors","reactive","hourlyRate","Money","form","savedSnapshot","useOrganizationDirty","validate","key","submit","payload","id","error","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createElementBlock","withModifiers","toDisplayString","createCommentVNode","createBaseVNode","createVNode","withCtx","withDirectives","$event","normalizeClass","vModelText","EmployeeForm_default","render","api","useApi","route","useRoute","router","useRouter","rows","ref","loading","error","includeArchived","parseArchiveListState","queryRecord","watch","value","next","archiveListStateToQuery","sameQuery","formOpen","formSaving","activeIndex","useListKeyboard","openNew","index","openDetail","load","row","closeForm","onCreated","onMounted","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createElementBlock","createBaseVNode","createTextVNode","withDirectives","$event","vModelCheckbox","toDisplayString","createCommentVNode","Fragment","renderList","row","index","normalizeClass","withKeys","withModifiers","createBlock","withCtx","createVNode","EmployeesView_default","render","api","useApi","showToast","useToast","route","useRoute","employeeId","computed","employee","ref","loading","error","editOpen","editButton","archiveOpen","archiveSaving","archiveError","employeeListTarget","useEscapeBack","load","id","detail","failure","openEdit","nextTick","input","closeEdit","onEdited","openArchive","closeArchive","setEmployeeArchived","archived","current","watch","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","render","_ctx","_cache","$props","$setup","$data","$options","_component_RouterLink","resolveComponent","openBlock","createElementBlock","createVNode","withCtx","createTextVNode","toDisplayString","Fragment","createBaseVNode","createCommentVNode","normalizeClass","$event","createBlock","EmployeeDetailView_default","render","api","useApi","props","__props","emit","__emit","saving","ref","formError","fieldErrors","reactive","form","savedSnapshot","useOrganizationDirty","groupHint","computed","formatActivityGroup","validate","key","submit","payload","id","error","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createElementBlock","withModifiers","toDisplayString","createCommentVNode","createBaseVNode","createVNode","withCtx","withDirectives","$event","normalizeClass","vModelText","vModelCheckbox","createTextVNode","ActivityForm_default","render","api","useApi","route","useRoute","router","useRouter","rows","ref","groupLabels","loading","error","includeArchived","parseArchiveListState","queryRecord","watch","value","next","archiveListStateToQuery","sameQuery","formOpen","formSaving","activeIndex","useListKeyboard","openNew","index","openDetail","load","activities","settings","row","closeForm","onCreated","onMounted","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createElementBlock","createBaseVNode","createTextVNode","withDirectives","$event","vModelCheckbox","toDisplayString","createCommentVNode","Fragment","renderList","row","index","normalizeClass","withKeys","withModifiers","createBlock","withCtx","createVNode","ActivitiesView_default","render","api","useApi","showToast","useToast","route","useRoute","activityId","computed","activity","ref","groupLabels","loading","error","editOpen","editButton","archiveOpen","archiveSaving","archiveError","activityListTarget","useEscapeBack","load","id","detail","settings","failure","openEdit","nextTick","input","closeEdit","onEdited","openArchive","closeArchive","setActivityArchived","archived","current","watch","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","render","_ctx","_cache","$props","$setup","$data","$options","_component_RouterLink","resolveComponent","openBlock","createElementBlock","createVNode","withCtx","createTextVNode","toDisplayString","Fragment","createBaseVNode","createCommentVNode","normalizeClass","$event","createBlock","ActivityDetailView_default","render","HOURS_INPUT_ERROR","isHoursDraft","value","parseHoursInput","hours","Money","isValidTimeEntryHours","props","__props","emit","__emit","input","ref","list","listPosition","listId","useId","query","searchTerm","open","highlight","selectedLabel","computed","o","filtered","term","watch","label","nextTick","scrollHighlightedOption","isOpen","_wasOpen","onCleanup","updateListPosition","onAnchorScroll","observer","rect","margin","gap","below","above","placeBelow","width","event","menu","option","onInput","openDropdown","toggleDropdown","onFocus","onBlur","choose","onKeydown","__expose","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createElementBlock","normalizeClass","createBaseVNode","mergeProps","withModifiers","createCommentVNode","createBlock","Teleport","normalizeStyle","Fragment","renderList","option","index","$event","toDisplayString","Combobox_default","render","LAST_COL","api","useApi","employees","ref","customers","activities","loadError","notice","userEmail","employeeId","employeeCombo","employeeOptions","computed","employee","date","todayISODate","dateInput","week","d","isoWeek","defaultYear","fiscalYearOf","nextKey","blankRow","rows","reactive","useOrganizationDirty","row","rowErrors","saving","submitError","escDialogOpen","verwerkDialogOpen","clearConfirmOpen","rememberChoice","customerOptions","c","activityOptions","a","ZERO","Money","employeeRate","e","filledRows","isFilled","totalHours","sum","parseHours","totalAmount","value","parseHoursInput","isFree","activityId","lastColumn","onActivityChange","index","clearRowError","onActivityTab","nextTick","advance","rowAmount","formatEuro","readLastEmployee","email","raw","scopedPreferenceStorageKey","id","writeLastEmployee","addRow","prefill","addRowFromButton","last","focusCell","removeRow","key","isRowEmpty","col","targetCol","el","moveVertical","delta","target","cur","onFirstCellShiftTab","event","onHoursInput","input","isHoursDraft","onHoursBlur","hours","HOURS_INPUT_ERROR","onHoursCommit","onYearBlur","expanded","expandFiscalYear","resizeDescription","element","onDescriptionInput","onDescriptionBlur","field","error","_drop","rest","validate","colOf","firstBadRow","firstBadCol","fields","onVerwerkClick","isPreferenceSet","doVerwerk","verwerkConfirmed","setPreference","entries","created","resetRows","clearAll","onEmployeeChosen","onDateKeydown","onGlobalKeydown","dialogOpen","load","me","emps","custs","acts","stored","watch","onMounted","onBeforeUnmount","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createElementBlock","createBaseVNode","createTextVNode","toDisplayString","createCommentVNode","createVNode","$event","Fragment","renderList","row","index","normalizeClass","withKeys","withModifiers","delta","withDirectives","vModelText","createBlock","withCtx","vModelCheckbox","HoursEntryView_default","render","parseHoursOverviewState","query","id","value","hoursOverviewStateToQuery","state","api","useApi","props","__props","emit","__emit","formElement","useTemplateRef","dateInput","saving","ref","formError","fieldErrors","reactive","form","customerOptions","computed","options","c","activityOptions","a","employeeOptions","employee","rate","e","Money","parsedHours","parseHoursInput","amount","watch","date","isoWeek","close","onHoursInput","event","input","isHoursDraft","onHoursBlur","HOURS_INPUT_ERROR","onHoursCommit","validate","key","expandFiscalYear","submit","nextTick","error","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createBlock","withCtx","createBaseVNode","toDisplayString","withModifiers","createElementBlock","createCommentVNode","createVNode","$event","withDirectives","vModelText","withKeys","createTextVNode","TimeEntryFormDialog_default","render","BATCH_SIZE","api","useApi","customers","ref","customerOptions","computed","customer","employees","activities","employeeOptions","employee","employeeReportName","activityOptions","activity","entries","renderLimit","loading","error","editTarget","route","useRoute","router","useRouter","restored","parseHoursOverviewState","queryRecord","filterCustomer","filterEmployee","filterActivity","filterYear","groupBy","showCustomerColumn","showEmployeeColumn","descriptionColumnCount","overview","useTemplateRef","loadMoreTrigger","appBarHeight","appBarObserver","loadObserver","onMounted","changes","change","loadMore","appBar","updateAppBarHeight","onUnmounted","watch","next","hoursOverviewStateToQuery","sameQuery","years","e","a","b","visibleEntries","ZERO","Money","totalHours","sum","totalAmount","groups","keyed","entry","key","groupEntries","list","renderedGroups","remaining","shown","group","shownEntryCount","hasMore","focus","firstNewIndex","nextTick","loadFilters","custs","emps","acts","loadEntries","options","onEntrySaved","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_29","_hoisted_30","_hoisted_31","_hoisted_32","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createElementBlock","normalizeStyle","createBaseVNode","createTextVNode","createVNode","$event","withDirectives","toDisplayString","createCommentVNode","Fragment","renderList","year","vModelSelect","normalizeClass","group","entry","withKeys","withModifiers","createBlock","HoursOverviewView_default","render","ZERO","Money","buildWeekRows","entries","byWeek","entry","week","list","rows","byEmployee","parts","empRows","sum","e","a","b","details","weekYear","year","month","toInt","value","n","parseWeekFilters","query","defaultYear","weekFiltersToQuery","filters","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createElementBlock","createBaseVNode","Fragment","renderList","entry","toDisplayString","WeekEntriesTable_default","render","api","useApi","route","useRoute","router","useRouter","employees","ref","employeeOptions","computed","employee","employeeReportName","entries","loading","error","currentYear","restored","parseWeekFilters","queryRecord","urlHadYear","filterYear","filterEmployee","filterWeek","expandedWeek","years","weekYear","a","b","yearEntries","year","e","ZERO","Money","totalHours","sum","totalAmount","weeks","buildWeekRows","weekOptions","wk","detailMode","detailRow","toggleWeek","week","watch","currentFilters","filters","next","weekFiltersToQuery","sameQuery","load","emps","rows","onMounted","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createElementBlock","createBaseVNode","createTextVNode","withDirectives","$event","Fragment","renderList","year","toDisplayString","createCommentVNode","vModelSelect","createVNode","w","createBlock","wk","normalizeClass","withKeys","withModifiers","part","HoursWeekView_default","render","MS_PER_DAY","MONTH_NAMES","pad2","value","toIsoDate","date","daysInMonth","year","month","mondayOfIsoWeek","week","dayOfWeek","mondayOfWeek1","weeksInYear","isoWeek","resolvePeriodRange","selection","monday","sunday","isDateInRange","isoDate","range","day","DEFAULT_SORT","PERIOD_MODES","SORT_KEYS","toInt","value","n","defaultDirFor","_key","queryToState","query","fallback","customerId","period","key","dir","stateToQuery","state","compareBy","a","b","Money","sortInvoices","list","sort","factor","api","useApi","router","useRouter","route","useRoute","invoices","ref","customers","customerOptions","computed","customer","loading","error","queryRecord","query","rec","key","value","now","restored","queryToState","isoWeek","urlHadYear","filterCustomer","periodMode","selYear","selMonth","selWeek","rangeFrom","rangeUntil","sort","emptyMark","monthOptions","MONTH_NAMES","name","i","yearOptions","set","a","b","weekOptions","weeksInYear","_","range","resolvePeriodRange","filteredInvoices","invoice","isDateInRange","visibleInvoices","sortInvoices","ZERO","Money","totalAmount","sum","totalMargin","hasMargin","columns","cols","toggleSort","defaultDirFor","sortIndicator","ariaSort","currentState","sameQuery","aKeys","bKeys","watch","state","next","stateToQuery","id","DEFAULT_SORT","openForCustomer","activeIndex","useListKeyboard","goNew","index","open","statementTarget","onStatementKey","event","el","typing","onMounted","onBeforeUnmount","reminderCreateOpen","openReminder","onReminderCreated","invoiceRows","customerRows","presentYears","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_29","_hoisted_30","_hoisted_31","_hoisted_32","_hoisted_33","_hoisted_34","_hoisted_35","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createElementBlock","createBaseVNode","createTextVNode","createVNode","withCtx","$event","withDirectives","createStaticVNode","vModelSelect","Fragment","renderList","y","toDisplayString","createCommentVNode","m","w","createBlock","col","normalizeClass","normalizeStyle","invoice","index","InvoicesView_default","render","ZERO","Money","vatBreakdown","input","vatAmount","amountInclVat","suggestMargin","upliftInfo","deltaEuro","base","deltaPct","parseAmount","trimmed","MAX_TEXT_LINES","api","useApi","TYPE_OPTIONS","router","useRouter","route","useRoute","editId","computed","isEdit","originalInvoice","ref","editBlocked","pageTitle","pageSub","customers","loadError","customerCombo","customerId","invoiceDate","todayISODate","dateInput","fiscalYearInput","fiscalYearOf","yearTouched","amount","amountTouched","vatRate","textBlock","invoiceTexts","selectedInvoiceText","invoiceTextOptions","text","id","invoiceType","altAddressEnabled","altName","altZip","altHouseNo","altStreet","altCity","altLookupState","tellen","nextNumber","tellenLoading","tellenError","saving","submitError","fieldErrors","reactive","leaveConfirmOpen","customerOptions","c","fiscalYear","expandFiscalYear","validYear","ZERO","Money","amountNum","parseAmount","vatNum","vat","vatBreakdown","marginNum","suggestMargin","newToDeclare","isNegative","value","upliftText","deltaEuro","deltaPct","upliftInfo","delta","euroStr","formatEuro","pctStr","textLines","splitLines","usedTextLines","appendInvoiceText","current","next","altLookupText","displayNumber","orig","baseline","formSnapshot","isDirty","useOrganizationDirty","block","max","lines","line","onDateChange","year","onYearBlur","lookupAlt","zip","houseNumber","res","watch","loaded","loadTellen","tellenRequest","request","tellenResult","number","e","validate","key","hasAltAddress","submit","payload","goBack","requestLeave","onGlobalKeydown","event","onBeforeUnload","loadForEdit","detail","onMounted","customerRows","settings","nextTick","onBeforeUnmount","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_29","_hoisted_30","_hoisted_31","_hoisted_32","_hoisted_33","_hoisted_34","_hoisted_35","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createElementBlock","createBaseVNode","toDisplayString","createCommentVNode","createVNode","withCtx","$event","withDirectives","normalizeClass","vModelText","createTextVNode","Fragment","renderList","opt","vModelRadio","vModelCheckbox","createBlock","InvoiceWizardView_default","render","invoiceActivityText","action","downloadBase64","options","base64","filename","mimeType","binary","bytes","i","blob","url","anchor","api","useApi","showToast","useToast","props","__props","emit","__emit","loading","ref","sending","form","reactive","bccChoices","onMounted","draft","email","e","send","choice","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createBlock","$event","withCtx","createBaseVNode","toDisplayString","createElementBlock","Fragment","createVNode","withDirectives","vModelText","renderList","choice","vModelCheckbox","createCommentVNode","InvoiceMailDialog_default","render","props","__props","emit","__emit","frame","useTemplateRef","container","height","shallowRef","scale","observer","removeResize","watch","applyHighlight","document","css","element","onLoad","resize","parent","maxHeight","byHeight","target","event","print","getDocument","__expose","onBeforeUnmount","_hoisted_1","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createElementBlock","normalizeClass","normalizeStyle","createBaseVNode","createCommentVNode","renderSlot","InvoicePreview_default","render","api","useApi","showToast","useToast","route","useRoute","router","useRouter","invoiceId","computed","loading","shallowRef","invoice","invoiceHtml","previewReady","preview","useTemplateRef","loadError","loadRequest","load","request","id","detail","html","e","edit","print","pdfBusy","downloadPdf","filename","base64","downloadBase64","mailOpen","deleteOpen","deleting","deleteError","canDelete","Money","openDelete","confirmDelete","onMailSent","useEscapeBack","watch","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createElementBlock","createBaseVNode","createVNode","withCtx","createTextVNode","createCommentVNode","toDisplayString","Fragment","normalizeClass","$event","renderList","event","createBlock","InvoiceDetailView_default","render","ZERO","Money","buildStatement","input","a","b","year","pick","rows","r","invoices","entries","expenses","computeTellen","sum","e","i","PAGE_WIDTH","PAGE_LINES","MONTHS","two","L","s","w","R","dosDate","iso","d","fixed","v","dutch","none","what","line","cols","cells","c","underline","date","INVOICE_COLS","HOURS_COLS","EXPENSE_COLS","yearBody","y","out","header","x","label","renderStatementPages","p","stamp","page","right","mid","top","klant","jaar","pages","body","room","printTextPages","frame","doc","escape","parseStatementQuery","query","customerId","years","statementToQuery","state","api","useApi","route","useRoute","router","useRouter","useEscapeBack","restored","parseStatementQuery","queryRecord","customerId","ref","years","keepRestoredYears","customers","activities","expenseKinds","companyName","invoices","entries","expenses","loading","error","customerCombo","customerOptions","computed","c","customerName","customer","availableYears","r","a","b","statement","buildStatement","activityLabel","e","activity","isNegative","value","Money","sumOf","key","sum","y","watch","next","statementToQuery","sameQuery","loadCustomer","id","invoiceRows","entryRows","expenseRows","x","toggleYear","year","selectAll","focusFirstYear","nextTick","scrollToYear","openInvoice","print","printTextPages","renderStatementPages","onKeydown","event","el","typing","onMounted","customerRows","activityRows","settings","company","onBeforeUnmount","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_29","_hoisted_30","_hoisted_31","_hoisted_32","_hoisted_33","_hoisted_34","_hoisted_35","_hoisted_36","_hoisted_37","_hoisted_38","_hoisted_39","_hoisted_40","_hoisted_41","_hoisted_42","_hoisted_43","_hoisted_44","_hoisted_45","_hoisted_46","_hoisted_47","_hoisted_48","_hoisted_49","_hoisted_50","_hoisted_51","_hoisted_52","_hoisted_53","_hoisted_54","_hoisted_55","_hoisted_56","_hoisted_57","_hoisted_58","_hoisted_59","_hoisted_60","_hoisted_61","_hoisted_62","_hoisted_63","_hoisted_64","_hoisted_65","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createElementBlock","createBaseVNode","createTextVNode","createVNode","withCtx","$event","createCommentVNode","Fragment","renderList","y","toDisplayString","normalizeClass","i","e","x","CustomerStatementView_default","render","api","useApi","showToast","useToast","props","__props","emit","__emit","loading","ref","sending","form","reactive","bccChoices","onMounted","draft","email","e","send","choice","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createBlock","$event","withCtx","createBaseVNode","toDisplayString","createElementBlock","Fragment","createVNode","withDirectives","vModelText","renderList","choice","vModelCheckbox","createCommentVNode","ReminderMailDialog_default","render","api","useApi","showToast","useToast","route","useRoute","router","useRouter","reminderId","computed","loading","ref","reminder","customer","company","backTarget","addressLines","r","c","lines","name","cityLine","dueDate","date","formatDate","paymentText","formatEuro","load","detail","companyInfo","editOpen","mailOpen","deleteOpen","deleting","pdfBusy","onEdited","onMailSent","confirmDelete","target","e","print","downloadPdf","filename","base64","downloadBase64","onKeydown","event","el","watch","onMounted","onBeforeUnmount","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_29","_hoisted_30","_hoisted_31","_hoisted_32","_hoisted_33","_hoisted_34","_hoisted_35","_hoisted_36","_hoisted_37","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createElementBlock","createBaseVNode","createVNode","withCtx","createTextVNode","createCommentVNode","Fragment","toDisplayString","$event","renderList","line","i","createBlock","ReminderDetailView_default","render","expenseKindOptions","kinds","label","value","kind","defaultExpenseKind","parseExpensesState","query","integer","value","expensesStateToQuery","state","api","useApi","emptyMark","expenses","ref","customers","customerOptions","computed","customer","expenseKinds","loading","error","route","useRoute","router","useRouter","restored","parseExpensesState","queryRecord","filterCustomer","filterYear","filterKind","watch","next","expensesStateToQuery","sameQuery","years","e","a","b","kindOptions","expenseKindOptions","visibleExpenses","expense","totalAmount","sum","Money","kindLabel","kind","load","expenseRows","customerRows","settings","deleteTarget","deleting","deleteError","askDelete","closeDelete","confirmDelete","deleted","onMounted","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","_hoisted_28","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createElementBlock","createBaseVNode","createVNode","withCtx","createTextVNode","$event","withDirectives","toDisplayString","createCommentVNode","Fragment","renderList","year","vModelSelect","opt","expense","createBlock","ExpensesView_default","render","api","useApi","customers","ref","expenseKinds","loadError","notice","userEmail","date","todayISODate","dateInput","nextKey","blankRow","fiscalYearOf","defaultExpenseKind","rows","reactive","rowErrors","saving","submitError","escDialogOpen","verwerkDialogOpen","clearConfirmOpen","rememberChoice","customerOptions","computed","c","kindOptions","expenseKindOptions","filledRows","isFilled","useOrganizationDirty","totalAmount","sum","row","Money","parseAmount","transferCount","yearTotals","totals","amount","year","expandFiscalYear","target","transferTarget","a","addRow","source","addRowFromButton","focusCell","removeRow","index","key","selectYear","event","normalizeYear","normalizeTargetYear","isNegative","onAmountInput","enableTransfer","col","nextTick","el","advance","lastColumn","validate","firstBad","firstBadCol","errorColumns","error","kind","field","onVerwerkClick","isPreferenceSet","doVerwerk","verwerkConfirmed","setPreference","done","bookedKeys","pending","resetRows","e","base","clearAll","onGlobalKeydown","dialogOpen","load","me","customerRows","settings","onMounted","onBeforeUnmount","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_29","_hoisted_30","_hoisted_31","_hoisted_32","_hoisted_33","render","_ctx","_cache","$props","$setup","$data","$options","_component_RouterLink","resolveComponent","openBlock","createElementBlock","createBaseVNode","createTextVNode","toDisplayString","createCommentVNode","createBlock","withCtx","createVNode","$event","Fragment","renderList","row","index","normalizeClass","withDirectives","withKeys","withModifiers","opt","vModelSelect","vModelText","vModelCheckbox","total","ExpenseEntryView_default","render","api","useApi","kinds","ref","loading","error","editing","dialogOpen","kindName","fieldError","dialogError","busy","deleting","load","cause","edit","kind","save","showToast","confirmDelete","remove","onMounted","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createElementBlock","createBaseVNode","toDisplayString","createCommentVNode","Fragment","renderList","kind","$event","createBlock","withCtx","withModifiers","createVNode","withDirectives","normalizeClass","vModelText","ExpenseKindSettings_default","render","INVOICE_BLOCK_IDS","INVOICE_AREA","INVOICE_AREA_OFFSET","INVOICE_BLOCK_LIMITS","INVOICE_BLOCK_LABELS","DEFAULT_INVOICE_BLOCKS","resolveInvoiceBlocks","blocks","id","clampInvoiceBlock","block","options","width","INVOICE_AREA","INVOICE_BLOCK_LIMITS","maxY","PX_PER_MM","GRID_MM","SNAP_DISTANCE_MM","contentOrigin","document","body","style","unionRect","rects","origin","left","rect","top","right","bottom","alignOf","element","align","blocksFromDocument","fontSize","blocks","resolveInvoiceBlocks","id","INVOICE_BLOCK_IDS","clampInvoiceBlock","visible","filled","elements","advancedBlockElement","patchAdvancedDocument","input","block","rendered","dx","dy","measureAdvancedDocument","child","snapValue","value","targets","best","target","horizontalTargets","width","INVOICE_AREA","other","verticalTargets","height","changeBlock","change","heightMm","props","__props","emit","__emit","labels","fields","computed","field","toggle","value","move","input","index","target","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createElementBlock","Fragment","renderList","field","createBaseVNode","$event","createTextVNode","toDisplayString","createCommentVNode","InvoiceStyleSenderFields_default","render","props","__props","blocks","useModel","preview","useTemplateRef","rects","shallowRef","selected","ref","guides","ready","aligns","visibleIds","computed","INVOICE_BLOCK_IDS","id","selectedBlock","sync","document","patchAdvancedDocument","measureAdvancedDocument","onReady","value","watch","nextTick","px","mm","scale","PX_PER_MM","boxStyle","rect","INVOICE_AREA_OFFSET","describe","block","size","INVOICE_BLOCK_LABELS","update","change","previous","updated","changeBlock","footer","movedFooter","others","other","drag","onPointerDown","event","mode","box","onPointerMove","perMm","dx","dy","rest","right","snapValue","horizontalTargets","height","x","y","verticalTargets","onPointerUp","changeFont","delta","__expose","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createElementBlock","createBaseVNode","Fragment","toDisplayString","$event","createCommentVNode","renderList","align","normalizeClass","createVNode","withCtx","scale","withModifiers","normalizeStyle","x","y","id","InvoiceDesigner_default","render","api","useApi","style","ref","savedStyle","useOrganizationDirty","loading","saving","uploading","logoInput","error","logoError","notice","previewHtml","previewError","previewLoading","renderedBlocks","resolveInvoiceBlocks","standardPreview","confirmReset","confirmAdvanced","colors","groupSections","openGroup","highlight","computed","onToggle","group","event","formElement","previewSlot","actionsElement","previewMaxHeight","previewEditTargets","editPreviewField","selector","field","nextTick","measurePreviewSpace","form","slot","actions","column","top","previewTimer","previewRevision","uploadRevision","load","loaded","e","preview","options","html","watch","value","revision","snapshot","layout","blocksFromDocument","resetBlocks","DEFAULT_INVOICE_BLOCKS","openAdvanced","setLogo","uploadLogo","input","file","dataUrl","resolve","reject","reader","image","save","cancel","onMounted","onBeforeUnmount","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_29","_hoisted_30","_hoisted_31","_hoisted_32","_hoisted_33","_hoisted_34","_hoisted_35","_hoisted_36","_hoisted_37","_hoisted_38","_hoisted_39","_hoisted_40","_hoisted_41","_hoisted_42","_hoisted_43","_hoisted_44","_hoisted_45","_hoisted_46","_hoisted_47","_hoisted_48","_hoisted_49","_hoisted_50","_hoisted_51","_hoisted_52","_hoisted_53","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createElementBlock","createBaseVNode","withModifiers","$event","createVNode","withCtx","withDirectives","Fragment","renderList","scale","toDisplayString","vModelSelect","color","normalizeClass","normalizeStyle","vModelText","createCommentVNode","createBlock","vModelRadio","size","createTextVNode","InvoiceStyleSettings_default","render","api","useApi","props","__props","title","computed","generalSettings","loading","ref","loaded","saving","notice","error","sectionVersion","groups","reactive","vatRate","companyName","companyAddress","companyPhone","companyEmail","companyKvk","companyVat","companyIban","companyMailSignature","bccEmails","invoiceTexts","fieldErrors","savedSnapshot","settingsSnapshot","useOrganizationDirty","fillSlots","target","source","i","addBcc","removeBcc","index","load","version","key","settings","save","parseAmount","text","addressLines","line","isValidEmail","snapshot","g","email","e","watch","onBeforeUnmount","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_29","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createElementBlock","createBaseVNode","toDisplayString","createBlock","Fragment","createCommentVNode","renderList","i","withDirectives","$event","vModelText","createVNode","withCtx","normalizeClass","_","SettingsView_default","render","api","useApi","loading","ref","saving","loadError","saveError","notice","firstName","lastName","email","fieldErrors","reactive","accountEmail","prefStates","EMAIL_RE","clearFieldError","field","refreshPrefStates","pref","preferences","isPreferenceSet","load","profile","validate","key","firstBad","id","save","e","reset","resetPreference","showToast","onMounted","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createElementBlock","createBaseVNode","Fragment","toDisplayString","createCommentVNode","createVNode","withCtx","withDirectives","$event","normalizeClass","vModelText","renderList","pref","ProfileView_default","render","routes","DashboardView_default","HoursEntryView_default","HoursOverviewView_default","HoursWeekView_default","InvoicesView_default","CustomerStatementView_default","InvoiceWizardView_default","InvoiceDetailView_default","ReminderDetailView_default","CustomersView_default","CustomerReportsView_default","CustomerDetailView_default","EmployeesView_default","EmployeeDetailView_default","ActivitiesView_default","ActivityDetailView_default","ExpensesView_default","ExpenseEntryView_default","ProfileView_default","SettingsView_default","OrganizationUsersView_default","router","createRouter","createWebHashHistory","InvitationView_default","LoginForm_default","to","OrganizationChoiceView_default","route","customerListPosition","sameQuery","queryRecord","loggedIn","organizationSession","refreshAccount","slug","tag","organizationTag","previous","mayLeaveOrganization","organization","item","organizationSlug","preferred","organizationDestination","_from","failure","setOrganization","clearCustomerListPosition","dismissToast","onDomReady","app","createApp","App_default","router","setupWRDAuth","aps"]}