UNPKG

studiocms

Version:

Astro Native CMS for AstroDB. Built from the ground up by the Astro community.

94 lines (93 loc) 8.71 kB
export interface UserData { id: string; name: string; email: string | null; avatar: string | null; username: string; } export interface Routes { logout: string; userProfile: string; contentManagement: string; dashboardIndex: string; } export type PermissionLevel = 'editor' | 'visitor' | 'admin' | 'owner' | 'unknown'; export interface MenuItem { name: string; svg: string; href: string; permission: PermissionLevel; cssClass: string; } export interface GetSessionResponse { isLoggedIn: boolean; user: UserData; permissionLevel: PermissionLevel; routes: Routes; } export declare const PERMISSION_HIERARCHY: Record<PermissionLevel, Set<PermissionLevel>>; export declare const KNOWN_API_ROUTES: string[]; export declare const DEFAULT_AVATAR = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAADSklEQVR4AdSWS2xMYRTHjQXRRupRKVWrJhrxSCRigTQpYUHq0VYsarwi8RgJ0rCwFJEQEQ1psZFQXWgGRZB6NdFalkSFFRutV1UJNhLj9+dcOubeud8dC2lzfvd/7vedc77TO999DB/2n/+GZgOpVCoOSegx5K/N5WJGugIsNhHusNBZqIJiQ/455tqgiDFni9QAVZthIVyBBTAWJsBKeAOL4Tw4m3MD/GebqVoBV2Ox2ArohAHog1bGZ0MfLCJ2A+pkzg1QrRpkB3X4G5p4xdhOkOknkYYSpYE5Vu2pqZ/ctUFdDXOzS5QGvlkplxyXmJ/lnAOJfgSyMh0C0AbVVJcOLkRp4JQV3GeaJmy8SQzUg6xRBxecG2CTaaffpGgli12DeVAAhaDb8CFzhXCZ2Ouokzk3YNU2ordhGXTCALyDS6AH0C10CzhbpAb4z16DHjZxVtCivWgPJCHO3BJ4i+9skRrwqrJIE1TBZCiBGmjy5qNoTg1EWSAsNlIDbLZi2AEt0A2fDPkX8BOguyFs3d/zTg1QNB+OkPUcjkMNTIfRhvzV+CfgBbGHYBR+qIU2QCG97dqpVAcjoRuOgpqYggr5GnvCuWL2ou3kjkOzWtYGKFBAdgfoPfAR1S02iw1XB0l4achXgzOJ2QaKnYt2WA1cfwtsgETNtZA2FXR/l7LYaUhx7muag5NMloI+XKahzdSKob6mRXwnGEyA7nm949dQ+D3nTmax2hN6SC0lSVcOyTTfBuhYl36/hddS8IP5zmI56y3hADW1Ye30j/g2wLQ21Ri0i0JtaE5G7g0SH8N40PsCSbegBiot7J7pv4hXw6uZViuogRkWpdvP3JzFq6E7JKNIUAP63FbwJn67KsjTSRSUA/o2XGd5Xk07/SVBDei7/zshq0Bvun6KtcIeqIUKKAM9IfNQ+RrTnGL07dBvufrtVesM5xnm2wCbZyuRer9vR+/DCFgOh0FvPX18PsP/DF9AvsY0pxjFKke5up2LqLmLuAzzbUBRJOh7vxEt57wEVKABvQgPQO+Fr6iQrzHNKWY343pNl5PfAHqWMJRpgQ0MDqVAL9RDAqphPujJmI8K+RrTnGKOMa6PlcFlfH2nBnwzHQfDwn4AAAD//6qWhy8AAAAGSURBVAMAJXQ0UKI3Vu0AAAAASUVORK5CYII="; export declare const COMPONENT_STYLES = "\n:host {\n --border: hsl(240 5% 17%);\n --background-base: hsl(0 0% 6%);\n --background-step-1: hsl(0 0% 8%);\n --background-step-2: hsl(0 0% 10%);\n --background-step-3: hsl(0 0% 14%);\n --primary-base: hsl(259 83% 73%);\n --success-base: hsl(142 71% 46%);\n --warning-base: hsl(48 96% 53%);\n --danger-base: hsl(339 97% 31%);\n --info-base: hsl(217 92% 52%);\n --light: 70;\n --threshold: 50;\n}\n\n[data-theme=\"light\"] {\n --border: hsl(263 5% 68%);\n --background-base: hsl(0 0% 97%);\n --background-step-1: hsl(0 0% 90%);\n --background-step-2: hsl(0 0% 85%);\n --background-step-3: hsl(0 0% 80%);\n --primary-base: hsl(259 85% 61%);\n --success-base: hsl(142 59% 47%);\n --warning-base: hsl(48 92% 46%);\n --danger-base: hsl(339 97% 31%);\n --info-base: hsl(217 92% 52%);\n}\n\n.menu_overlay {\n position: fixed;\n background: rgba(0,0,0,0.4);\n inset: 0;\n z-index: 500;\n display: none;\n}\n\n.menu_overlay.menuOpened {\n display: block;\n}\n\n.cornerMenu {\n position: fixed;\n right: 25px;\n bottom: 25px;\n width: 50px;\n height: 50px;\n background: var(--background-step-1);\n box-shadow: 0 3px 7px rgba(0,0,0,0.3);\n border-radius: 50%;\n z-index: 600;\n cursor: pointer;\n transition: transform 0.3s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.avatar-container {\n width: 100%;\n height: 100%;\n border-radius: 50%;\n background: var(--background-step-1);\n border: 1px solid var(--border);\n object-fit: cover;\n z-index: 700;\n transition: transform 0.3s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.avatar {\n width: 100%;\n height: 100%;\n background: var(--background-step-1);\n border: 1px solid var(--border);\n border-radius: 50%;\n object-fit: cover;\n transition: transform 0.3s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.avatar-error {\n width: 100%;\n\theight: auto;\n\tmargin: 2.5rem;\n\tborder: none;\n}\n\n.cornerMenu.menuOpened .avatar-container {\n transform: scale(1.5);\n border: 1px solid var(--border);\n}\n\n.menu {\n --switch: calc((var(--light) - var(--threshold)) * -100%);\n position: absolute;\n width: 32px;\n height: 32px;\n background: var(--background-step-2);\n box-shadow: 0 3px 7px rgba(0,0,0,0.1);\n border-radius: 50%;\n border: 1px solid var(--border);\n color: hsl(0, 0%, var(--switch));\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 8px;\n top: -5px;\n left: -5px;\n opacity: 0;\n z-index: 550;\n pointer-events: none;\n user-select: none;\n transition: all 0.4s ease-in-out;\n text-decoration: none;\n}\n\n.menu svg {\n width: 24px;\n height: 24px;\n}\n\n.cornerMenu.menuOpened .menu {\n opacity: 1;\n cursor: pointer;\n transition: transform 0.3s ease, opacity 0.3s ease, background-color 0.15s ease;\n}\n\n.cornerMenu.menuOpened .menu:hover {\n background: var(--background-step-3);\n}\n\n/* Click protection: Only enable pointer events when menu is ready */\n.cornerMenu.menu-ready .menu {\n pointer-events: all;\n box-shadow: 0 3px 7px rgba(0,0,0,0.1),\n 0 0 0 1px color-mix(in hsl, var(--primary-base) 20%, transparent);\n}\n\n.cornerMenu.menu-ready .menu:hover {\n box-shadow: 0 3px 7px rgba(0,0,0,0.2),\n 0 0 0 2px color-mix(in hsl, var(--primary-base) 40%, transparent);\n}\n\n/* Visual feedback for ignored clicks */\n.menu.click-ignored {\n animation: shake 0.3s ease-in-out;\n}\n\n@keyframes shake {\n 0%, 100% { transform: translateX(0) translateY(0); }\n 25% { transform: translateX(-2px) translateY(-1px); }\n 50% { transform: translateX(2px) translateY(1px); }\n 75% { transform: translateX(-1px) translateY(-2px); }\n}\n\n.cornerMenu.menuOpened .menu:nth-child(1) { transform: translate(-105px, 20px); transition-delay: 0s; }\n.cornerMenu.menuOpened .menu:nth-child(2) { transform: translate(-78px, -33px); transition-delay: 0.05s; }\n.cornerMenu.menuOpened .menu:nth-child(3) { transform: translate(-38px, -76px); transition-delay: 0.1s; }\n.cornerMenu.menuOpened .menu:nth-child(4) { transform: translate(18px, -99px); transition-delay: 0.15s; }\n\n.menu.logout { color: var(--danger-base); }\n.menu.profile { color: var(--primary-base); }\n.menu.dashboard { color: var(--success-base); }\n.menu.edit { color: var(--warning-base); }\n"; /** * Optimized permission verification with Set-based lookup */ export declare function verifyUserPermissionLevel(userLevel: PermissionLevel, requiredLevel: PermissionLevel): boolean; /** * Check if current path should skip rendering completely (no API calls) */ export declare function shouldSkipRendering(pathname: string): boolean; /** * Check if current path is dashboard (skip after API call) */ export declare function isDashboardRoute(pathname: string, dashboardRoute: string): boolean; export declare class UserQuickTools extends HTMLElement { private sessionData; private isMenuOpen; private menuItemsReady; private lastMenuToggleTime; private readyTimeout; private themeObserver; private cornerMenu; private menuOverlay; private isInitialized; private userInteractionListeners; protected CLICK_PROTECTION_DURATION: number; protected MENU_READY_DELAY: number; private static readonly MENU_ITEMS; constructor(); connectedCallback(): void; initOnUserInteraction(): void; private removeInteractionListeners; scheduleInitialization(): void; private initializeAsync; private scheduleRender; disconnectedCallback(): void; private render; private addMenuItems; private createMenuElement; private createLogoutElement; private submitLogoutForm; private testAvatarURL; private addUserAvatar; private setupEventListeners; private handleMenuToggle; private handleOverlayClick; private updateMenuState; private setupThemeObserver; private getSession; private capitalizeFirst; private cleanup; } export interface UserQuickToolsConfig { strategy: 'immediate' | 'idle' | 'interaction'; timeout?: number; clickProtectionDuration?: number; menuReadyDelay?: number; } export declare class ConfigurableUserQuickTools extends UserQuickTools { private config; constructor(); connectedCallback(): void; } export declare function initializeWhenReady(): void;