Files
crewli/apps/app/components.d.ts
bert.hausmans 4391550140 feat(layouts): rewrite layout shells with PrimeVue Drawer + Menubar + Avatar
Layout-shell rewrite per RFC AD-3, B7-option-B. R-10 isolation invariant
honored — this single commit is revertible to roll back the layout
change without losing B1–B6 progress.

New component (PrimeVue-only, no Vuetify imports per F3 hard constraint):
- apps/app/src/layouts/components/AppShell.vue (~210 lines)
  - Desktop sidebar (Tailwind grid, lg+ breakpoint) renders nav items
    as PrimeVue Buttons + Icons. Mobile (<lg) hides sidebar; PrimeVue
    Drawer slides in on hamburger toggle.
  - Top bar (Tailwind) has hamburger + title (mobile) and an Avatar +
    Menu (PrimeVue) for the user dropdown with "Mijn Profiel" and
    "Uitloggen" actions.
  - Nav items accept the existing { title, to: { name }, icon: { icon } }
    shape from src/navigation/vertical so call-sites stay terse.

Five top-level layouts delegate to AppShell (filename preserved per
AD-3 so vite-plugin-vue-meta-layouts continues to resolve routes
unchanged):
- default.vue       — org + (super-admin) platform nav
- OrganizerLayout   — same nav as default; matches authenticated org UX
- PortalLayout      — portal-specific 2-item nav ("Mijn evenementen",
                       "Mijn Profiel")
- blank.vue         — minimal chrome-less wrapper for login etc.
- PublicLayout      — minimal wrapper for public form-fill routes;
                       uses <main> for semantic structure

F3 functional regressions (intentional — F4 sub-packages reintroduce
each item through PrimeVue):
- NavSearchBar (Vuetify-heavy combobox/overlay) — absent from top bar
- ContextSwitcher (Vuetify VBtn + VMenu) — absent
- NavbarThemeSwitcher (Vuetify IconBtn) — absent; dark mode driven by
  PrimeVue's darkModeSelector: '.dark' continues to work via the
  existing @core skin classes until F6 cleanup
- NavbarShortcuts (Vuetify-heavy) — absent
- NavBarNotifications (Vuetify-heavy) — absent
- UserProfile from @/layouts/components/ (Vuetify-heavy menu) — replaced
  with the minimal Avatar + Menu dropdown described above; rich profile
  panel returns in F4
- ImpersonationBanner — absent; super-admin impersonation UX is F4 work
- PortalLayout event-mode vs platform-mode topbar (route.meta.navMode
  driven) — absent; F4 reintroduces via AppShell prop or slot
- Suspense + AppLoadingIndicator wrapping pages — dropped; pages handle
  their own loading via PrimeVue ProgressSpinner

VApp at App.vue level still wraps everything, so Vuetify components
inside still-Vuetify pages continue to render correctly during the
parallel-mode window.

Test updates (no Vuetify in layout structure to assert against anymore):
- OrganizerLayout.spec.ts — mocks AppShell instead of the deleted
  DefaultLayoutWithVerticalNav reference; provides Pinia.
- PortalLayout.spec.ts — same mock pattern; new structural assertions
  go through AppShell stub; the new third test verifies
  PortalLayout forwards portal nav items + title to AppShell.
- PublicLayout.vue — uses <main> for semantics; PublicLayout.spec.ts
  still passes unchanged.

Auto-generated component/auto-import dts files refreshed for the new
AppShell component (committed for stable dev workflow).

Verification:
- pnpm typecheck — clean.
- pnpm test — 402 tests pass (test count unchanged after spec rewrites).
- pnpm build — succeeds in 14.05s; AppShell chunk is ~57 KB raw.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 01:12:06 +02:00

166 lines
15 KiB
TypeScript

/* eslint-disable */
// @ts-nocheck
// Generated by unplugin-vue-components
// Read more: https://github.com/vuejs/core/pull/3399
export {}
/* prettier-ignore */
declare module 'vue' {
export interface GlobalComponents {
AccountTab: typeof import('./src/components/account-settings/AccountTab.vue')['default']
AddEditAddressDialog: typeof import('./src/components/dialogs/AddEditAddressDialog.vue')['default']
AddEditPermissionDialog: typeof import('./src/components/dialogs/AddEditPermissionDialog.vue')['default']
AddEditRoleDialog: typeof import('./src/components/dialogs/AddEditRoleDialog.vue')['default']
AddMemberAsPersonDialog: typeof import('./src/components/persons/AddMemberAsPersonDialog.vue')['default']
AddPerformanceDialog: typeof import('./src/components/timetable/AddPerformanceDialog.vue')['default']
AddPersonToCrowdListDialog: typeof import('./src/components/crowd-lists/AddPersonToCrowdListDialog.vue')['default']
AppAutocomplete: typeof import('./src/@core/components/app-form-elements/AppAutocomplete.vue')['default']
AppBarSearch: typeof import('./src/@core/components/AppBarSearch.vue')['default']
AppCardActions: typeof import('./src/@core/components/cards/AppCardActions.vue')['default']
AppCardCode: typeof import('./src/@core/components/cards/AppCardCode.vue')['default']
AppCombobox: typeof import('./src/@core/components/app-form-elements/AppCombobox.vue')['default']
AppDateTimePicker: typeof import('./src/@core/components/app-form-elements/AppDateTimePicker.vue')['default']
AppDrawerHeaderSection: typeof import('./src/@core/components/AppDrawerHeaderSection.vue')['default']
AppKpiCard: typeof import('./src/components/AppKpiCard.vue')['default']
AppLoadingIndicator: typeof import('./src/components/AppLoadingIndicator.vue')['default']
AppPricing: typeof import('./src/components/AppPricing.vue')['default']
AppSearchHeader: typeof import('./src/components/AppSearchHeader.vue')['default']
AppSelect: typeof import('./src/@core/components/app-form-elements/AppSelect.vue')['default']
AppStepper: typeof import('./src/@core/components/AppStepper.vue')['default']
AppTextarea: typeof import('./src/@core/components/app-form-elements/AppTextarea.vue')['default']
AppTextField: typeof import('./src/@core/components/app-form-elements/AppTextField.vue')['default']
AssignPersonDialog: typeof import('./src/components/shifts/AssignPersonDialog.vue')['default']
AssignShiftDialog: typeof import('./src/components/sections/AssignShiftDialog.vue')['default']
CardStatisticsHorizontal: typeof import('./src/@core/components/cards/CardStatisticsHorizontal.vue')['default']
CardStatisticsVertical: typeof import('./src/@core/components/cards/CardStatisticsVertical.vue')['default']
CardStatisticsVerticalSimple: typeof import('./src/@core/components/CardStatisticsVerticalSimple.vue')['default']
ClaimenTab: typeof import('./src/components/portal/event/ClaimenTab.vue')['default']
CompanyDialog: typeof import('./src/components/organisation/CompanyDialog.vue')['default']
ConfirmDialog: typeof import('./src/components/dialogs/ConfirmDialog.vue')['default']
ContextSwitcher: typeof import('./src/components/shared/ContextSwitcher.vue')['default']
CreateAppDialog: typeof import('./src/components/dialogs/CreateAppDialog.vue')['default']
CreateEventDialog: typeof import('./src/components/events/CreateEventDialog.vue')['default']
CreatePersonDialog: typeof import('./src/components/persons/CreatePersonDialog.vue')['default']
CreateSectionDialog: typeof import('./src/components/sections/CreateSectionDialog.vue')['default']
CreateShiftDialog: typeof import('./src/components/sections/CreateShiftDialog.vue')['default']
CreateSubEventDialog: typeof import('./src/components/events/CreateSubEventDialog.vue')['default']
CreateTimeSlotDialog: typeof import('./src/components/sections/CreateTimeSlotDialog.vue')['default']
CrowdListDetailPanel: typeof import('./src/components/crowd-lists/CrowdListDetailPanel.vue')['default']
CrowdListFormDialog: typeof import('./src/components/crowd-lists/CrowdListFormDialog.vue')['default']
CrowdTypesManager: typeof import('./src/components/organisations/CrowdTypesManager.vue')['default']
CustomCheckboxes: typeof import('./src/@core/components/app-form-elements/CustomCheckboxes.vue')['default']
CustomCheckboxesWithIcon: typeof import('./src/@core/components/app-form-elements/CustomCheckboxesWithIcon.vue')['default']
CustomCheckboxesWithImage: typeof import('./src/@core/components/app-form-elements/CustomCheckboxesWithImage.vue')['default']
CustomizerSection: typeof import('./src/@core/components/CustomizerSection.vue')['default']
CustomRadios: typeof import('./src/@core/components/app-form-elements/CustomRadios.vue')['default']
CustomRadiosWithIcon: typeof import('./src/@core/components/app-form-elements/CustomRadiosWithIcon.vue')['default']
CustomRadiosWithImage: typeof import('./src/@core/components/app-form-elements/CustomRadiosWithImage.vue')['default']
DangerZoneTab: typeof import('./src/components/organisation/settings/DangerZoneTab.vue')['default']
DeleteSubEventDialog: typeof import('./src/components/events/DeleteSubEventDialog.vue')['default']
DialogCloseBtn: typeof import('./src/@core/components/DialogCloseBtn.vue')['default']
DismissFailureDialog: typeof import('./src/components/form-failures/DismissFailureDialog.vue')['default']
DropZone: typeof import('./src/@core/components/DropZone.vue')['default']
DuplicateSubmissionHint: typeof import('./src/components/shared/public-form/DuplicateSubmissionHint.vue')['default']
EditEventDialog: typeof import('./src/components/events/EditEventDialog.vue')['default']
EditOrganisationDialog: typeof import('./src/components/organisations/EditOrganisationDialog.vue')['default']
EditPersonDialog: typeof import('./src/components/persons/EditPersonDialog.vue')['default']
EditSectionDialog: typeof import('./src/components/sections/EditSectionDialog.vue')['default']
EmailBrandingTab: typeof import('./src/components/organisation/EmailBrandingTab.vue')['default']
EmailLogTab: typeof import('./src/components/organisation/EmailLogTab.vue')['default']
EmailTemplatesTab: typeof import('./src/components/organisation/EmailTemplatesTab.vue')['default']
EmptyDayState: typeof import('./src/components/timetable/EmptyDayState.vue')['default']
EnableOneTimePasswordDialog: typeof import('./src/components/dialogs/EnableOneTimePasswordDialog.vue')['default']
ErrorHeader: typeof import('./src/components/ErrorHeader.vue')['default']
EventCard: typeof import('./src/components/portal/EventCard.vue')['default']
EventMetricCards: typeof import('./src/components/events/EventMetricCards.vue')['default']
EventTabsNav: typeof import('./src/components/events/EventTabsNav.vue')['default']
FieldAvailabilityPicker: typeof import('./src/components/shared/public-form/FieldAvailabilityPicker.vue')['default']
FieldBoolean: typeof import('./src/components/shared/public-form/FieldBoolean.vue')['default']
FieldCheckboxList: typeof import('./src/components/shared/public-form/FieldCheckboxList.vue')['default']
FieldDate: typeof import('./src/components/shared/public-form/FieldDate.vue')['default']
FieldEmail: typeof import('./src/components/shared/public-form/FieldEmail.vue')['default']
FieldHeading: typeof import('./src/components/shared/public-form/FieldHeading.vue')['default']
FieldMultiselect: typeof import('./src/components/shared/public-form/FieldMultiselect.vue')['default']
FieldNumber: typeof import('./src/components/shared/public-form/FieldNumber.vue')['default']
FieldParagraph: typeof import('./src/components/shared/public-form/FieldParagraph.vue')['default']
FieldPhone: typeof import('./src/components/shared/public-form/FieldPhone.vue')['default']
FieldRadio: typeof import('./src/components/shared/public-form/FieldRadio.vue')['default']
FieldRenderer: typeof import('./src/components/shared/public-form/FieldRenderer.vue')['default']
FieldSectionPriority: typeof import('./src/components/shared/public-form/FieldSectionPriority.vue')['default']
FieldSelect: typeof import('./src/components/shared/public-form/FieldSelect.vue')['default']
FieldTagPicker: typeof import('./src/components/shared/public-form/FieldTagPicker.vue')['default']
FieldText: typeof import('./src/components/shared/public-form/FieldText.vue')['default']
FieldTextarea: typeof import('./src/components/shared/public-form/FieldTextarea.vue')['default']
FieldUrl: typeof import('./src/components/shared/public-form/FieldUrl.vue')['default']
FormConfirmation: typeof import('./src/components/shared/public-form/FormConfirmation.vue')['default']
FormErrorState: typeof import('./src/components/shared/public-form/FormErrorState.vue')['default']
FormFailureDetail: typeof import('./src/components/form-failures/FormFailureDetail.vue')['default']
FormFailuresTable: typeof import('./src/components/form-failures/FormFailuresTable.vue')['default']
FormField: typeof import('./src/components/forms/FormField.vue')['default']
FormStepper: typeof import('./src/components/shared/public-form/FormStepper.vue')['default']
GridBg: typeof import('./src/components/timetable/GridBg.vue')['default']
I18n: typeof import('./src/@core/components/I18n.vue')['default']
Icon: typeof import('./src/components/Icon.vue')['default']
IdentityMatchBanner: typeof import('./src/components/shared/public-form/IdentityMatchBanner.vue')['default']
ImageUploadField: typeof import('./src/components/common/ImageUploadField.vue')['default']
ImpersonateDialog: typeof import('./src/components/platform/ImpersonateDialog.vue')['default']
ImpersonationBanner: typeof import('./src/components/platform/ImpersonationBanner.vue')['default']
ImportFromEventDialog: typeof import('./src/components/event/ImportFromEventDialog.vue')['default']
InformatieTab: typeof import('./src/components/portal/event/InformatieTab.vue')['default']
InfoTooltip: typeof import('./src/components/common/InfoTooltip.vue')['default']
InviteMemberDialog: typeof import('./src/components/members/InviteMemberDialog.vue')['default']
LineupMatrix: typeof import('./src/components/timetable/LineupMatrix.vue')['default']
MfaChallengeCard: typeof import('./src/components/auth/MfaChallengeCard.vue')['default']
MfaDisableDialog: typeof import('./src/components/settings/MfaDisableDialog.vue')['default']
MfaEmailSetupDialog: typeof import('./src/components/settings/MfaEmailSetupDialog.vue')['default']
MfaTotpSetupDialog: typeof import('./src/components/settings/MfaTotpSetupDialog.vue')['default']
MoreBtn: typeof import('./src/@core/components/MoreBtn.vue')['default']
Notifications: typeof import('./src/@core/components/Notifications.vue')['default']
NotificationsTab: typeof import('./src/components/account-settings/NotificationsTab.vue')['default']
OrganisationSwitcher: typeof import('./src/components/layout/OrganisationSwitcher.vue')['default']
OverzichtTab: typeof import('./src/components/portal/event/OverzichtTab.vue')['default']
PasswordRequirements: typeof import('./src/components/auth/PasswordRequirements.vue')['default']
PaymentProvidersDialog: typeof import('./src/components/dialogs/PaymentProvidersDialog.vue')['default']
PerformanceBlock: typeof import('./src/components/timetable/PerformanceBlock.vue')['default']
PerformancePopover: typeof import('./src/components/timetable/PerformancePopover.vue')['default']
PersonDetailPanel: typeof import('./src/components/persons/PersonDetailPanel.vue')['default']
PersonTagsTab: typeof import('./src/components/organisation/PersonTagsTab.vue')['default']
ProductDescriptionEditor: typeof import('./src/@core/components/ProductDescriptionEditor.vue')['default']
RegistrationFieldCard: typeof import('./src/components/event/RegistrationFieldCard.vue')['default']
RegistrationFieldFormDialog: typeof import('./src/components/event/RegistrationFieldFormDialog.vue')['default']
RegistrationFieldTemplatesTab: typeof import('./src/components/organisation/RegistrationFieldTemplatesTab.vue')['default']
ResolveFailureDialog: typeof import('./src/components/form-failures/ResolveFailureDialog.vue')['default']
RetryFailureDialog: typeof import('./src/components/form-failures/RetryFailureDialog.vue')['default']
RoosterTab: typeof import('./src/components/portal/event/RoosterTab.vue')['default']
RouterLink: typeof import('vue-router')['RouterLink']
RouterView: typeof import('vue-router')['RouterView']
ScrollToTop: typeof import('./src/@core/components/ScrollToTop.vue')['default']
SectionsShiftsPanel: typeof import('./src/components/sections/SectionsShiftsPanel.vue')['default']
SecurityTab: typeof import('./src/components/account-settings/SecurityTab.vue')['default']
SettingsCrowdTypes: typeof import('./src/components/organisation/settings/SettingsCrowdTypes.vue')['default']
SettingsEmailBranding: typeof import('./src/components/organisation/settings/SettingsEmailBranding.vue')['default']
SettingsEmailLog: typeof import('./src/components/organisation/settings/SettingsEmailLog.vue')['default']
SettingsEmailTemplates: typeof import('./src/components/organisation/settings/SettingsEmailTemplates.vue')['default']
SettingsRegistrationFields: typeof import('./src/components/organisation/settings/SettingsRegistrationFields.vue')['default']
SettingsTags: typeof import('./src/components/organisation/settings/SettingsTags.vue')['default']
ShareProjectDialog: typeof import('./src/components/dialogs/ShareProjectDialog.vue')['default']
ShiftDetailPanel: typeof import('./src/components/shifts/ShiftDetailPanel.vue')['default']
Shortcuts: typeof import('./src/@core/components/Shortcuts.vue')['default']
StageEditor: typeof import('./src/components/timetable/StageEditor.vue')['default']
StageHeaderCell: typeof import('./src/components/timetable/StageHeaderCell.vue')['default']
StageRow: typeof import('./src/components/timetable/StageRow.vue')['default']
StatusCard: typeof import('./src/components/portal/StatusCard.vue')['default']
SubmitterDetails: typeof import('./src/components/shared/public-form/SubmitterDetails.vue')['default']
TablePagination: typeof import('./src/@core/components/TablePagination.vue')['default']
TemplatePickerDialog: typeof import('./src/components/event/TemplatePickerDialog.vue')['default']
ThemeSwitcher: typeof import('./src/@core/components/ThemeSwitcher.vue')['default']
TimeAxis: typeof import('./src/components/timetable/TimeAxis.vue')['default']
TiptapEditor: typeof import('./src/@core/components/TiptapEditor.vue')['default']
TwoFactorAuthDialog: typeof import('./src/components/dialogs/TwoFactorAuthDialog.vue')['default']
UserAvatarMenu: typeof import('./src/components/portal/UserAvatarMenu.vue')['default']
UserInfoEditDialog: typeof import('./src/components/dialogs/UserInfoEditDialog.vue')['default']
Wachtrij: typeof import('./src/components/timetable/Wachtrij.vue')['default']
WachtrijCard: typeof import('./src/components/timetable/WachtrijCard.vue')['default']
}
}