@nucleus-suite-pe/core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nucleus-suite-pe-core.mjs","sources":["../../../projects/core/src/lib/config/nucleus-config.ts","../../../projects/core/src/lib/auth/nucleus-auth.ts","../../../projects/core/src/lib/auth/auth.context.ts","../../../projects/core/src/lib/auth/session-auth.service.ts","../../../projects/core/src/lib/auth/auth.interceptor.ts","../../../projects/core/src/lib/auth/user-sync.service.ts","../../../projects/core/src/lib/api/session.service.ts","../../../projects/core/src/lib/i18n/nucleus-language.ts","../../../projects/core/src/lib/theme/theme.ts","../../../projects/core/src/lib/theme/theme.service.ts","../../../projects/core/src/lib/theme/primeng-preset.ts","../../../projects/core/src/lib/theme/provide-theme.ts","../../../projects/core/src/lib/ui/nucleus-mark/nucleus-mark.ts","../../../projects/core/src/lib/ui/starfield/starfield.ts","../../../projects/core/src/lib/ui/shell/shell.copy.ts","../../../projects/core/src/lib/ui/shell/nucleus-shell.ts","../../../projects/core/src/lib/ui/shell/nucleus-shell.html","../../../projects/core/src/nucleus-suite-pe-core.ts"],"sourcesContent":["import { EnvironmentProviders, InjectionToken, makeEnvironmentProviders } from '@angular/core';\n\nexport interface NucleusConfig {\n readonly appId: string;\n readonly securityApiUrl: string;\n readonly appApiUrl: string | null;\n readonly landingUrl: string | null;\n}\n\nexport const NUCLEUS_CONFIG = new InjectionToken<NucleusConfig>('NUCLEUS_CONFIG');\n\nconst CONFIG_URL = 'config.json';\n\nexport function provideNucleus(config: NucleusConfig): EnvironmentProviders {\n return makeEnvironmentProviders([{ provide: NUCLEUS_CONFIG, useValue: normalize(config) }]);\n}\n\nexport async function loadNucleusConfig(url = CONFIG_URL): Promise<NucleusConfig> {\n const response = await fetch(url, { cache: 'no-store' });\n\n if (!response.ok) {\n throw new Error(`No se pudo cargar ${url}: HTTP ${response.status}`);\n }\n\n return normalize((await response.json()) as NucleusConfig);\n}\n\nexport function isNucleusConfigured(config: NucleusConfig): boolean {\n return config.securityApiUrl.length > 0 && config.appId.length > 0;\n}\n\nexport function ownsUrl(config: NucleusConfig, url: string): boolean {\n if (config.securityApiUrl.length > 0 && url.startsWith(config.securityApiUrl)) {\n return true;\n }\n\n return config.appApiUrl !== null && config.appApiUrl.length > 0 && url.startsWith(config.appApiUrl);\n}\n\nfunction normalize(config: NucleusConfig): NucleusConfig {\n return {\n appId: (config.appId ?? '').trim().toLowerCase(),\n securityApiUrl: trimSlash(config.securityApiUrl),\n appApiUrl: config.appApiUrl ? trimSlash(config.appApiUrl) : null,\n landingUrl: config.landingUrl ? trimSlash(config.landingUrl) : null,\n };\n}\n\nfunction trimSlash(value: string | null | undefined): string {\n return (value ?? '').trim().replace(/\\/+$/, '');\n}\n","import { Signal } from '@angular/core';\n\nexport interface NucleusIdentity {\n readonly uid: string;\n readonly provider: string;\n readonly providerUserId: string;\n readonly email: string | null;\n readonly displayName: string | null;\n readonly photoUrl: string | null;\n}\n\nexport abstract class NucleusAuth {\n abstract readonly user: Signal<NucleusIdentity | null>;\n\n abstract idToken(): Promise<string | null>;\n\n signOut?(): Promise<void>;\n\n switchAccount?(): Promise<void>;\n}\n","import { HttpContextToken } from '@angular/common/http';\n\nexport const NUCLEUS_FORCE_BEARER = new HttpContextToken<boolean>(() => false);\n\nexport const NUCLEUS_SKIP_AUTH = new HttpContextToken<boolean>(() => false);\n","import { HttpClient, HttpContext } from '@angular/common/http';\nimport { Injectable, Injector, computed, inject, signal } from '@angular/core';\nimport { firstValueFrom } from 'rxjs';\n\nimport { NUCLEUS_CONFIG, isNucleusConfigured } from '../config/nucleus-config';\nimport { NUCLEUS_FORCE_BEARER, NUCLEUS_SKIP_AUTH } from './auth.context';\nimport { NucleusAuth } from './nucleus-auth';\n\nconst SESSION_PATH = '/auth/session';\n\nconst LOGOUT_PATH = '/auth/logout';\n\nexport interface SessionTicket {\n readonly userId: string;\n readonly expiresAtUtc: string;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class NucleusSessionAuth {\n private readonly http = inject(HttpClient);\n private readonly config = inject(NUCLEUS_CONFIG);\n private readonly injector = inject(Injector);\n\n private readonly _ticket = signal<SessionTicket | null>(null);\n private readonly _failed = signal(false);\n\n private pending: Promise<boolean> | null = null;\n\n readonly ticket = this._ticket.asReadonly();\n\n readonly failed = this._failed.asReadonly();\n\n readonly established = computed(() => this._ticket() !== null);\n\n establish(force = false): Promise<boolean> {\n if (!force && this._ticket() !== null) return Promise.resolve(true);\n\n this.pending ??= this.request().finally(() => {\n this.pending = null;\n });\n\n return this.pending;\n }\n\n async clear(): Promise<void> {\n this._ticket.set(null);\n this._failed.set(false);\n\n if (!isNucleusConfigured(this.config)) return;\n\n try {\n await firstValueFrom(\n this.http.post(\n `${this.config.securityApiUrl}${LOGOUT_PATH}`,\n {},\n {\n withCredentials: true,\n context: new HttpContext().set(NUCLEUS_SKIP_AUTH, true),\n },\n ),\n );\n } catch (error) {\n console.error('[auth] no se pudo cerrar la sesión de cookie', error);\n }\n }\n\n private async request(): Promise<boolean> {\n if (!isNucleusConfigured(this.config)) return false;\n\n if (this.injector.get(NucleusAuth, null) === null) return false;\n\n try {\n const ticket = await firstValueFrom(\n this.http.post<SessionTicket>(\n `${this.config.securityApiUrl}${SESSION_PATH}`,\n {},\n {\n withCredentials: true,\n context: new HttpContext().set(NUCLEUS_FORCE_BEARER, true),\n },\n ),\n );\n\n this._ticket.set(ticket);\n this._failed.set(false);\n\n return true;\n } catch (error) {\n this._ticket.set(null);\n this._failed.set(true);\n console.error('[auth] no se pudo abrir la sesión de cookie', error);\n\n return false;\n }\n }\n}\n","import { HttpErrorResponse, HttpInterceptorFn } from '@angular/common/http';\nimport { inject } from '@angular/core';\nimport { catchError, from, switchMap, throwError } from 'rxjs';\n\nimport { NUCLEUS_CONFIG, ownsUrl } from '../config/nucleus-config';\nimport { NUCLEUS_FORCE_BEARER, NUCLEUS_SKIP_AUTH } from './auth.context';\nimport { NucleusAuth } from './nucleus-auth';\nimport { NucleusSessionAuth } from './session-auth.service';\n\nexport const nucleusAuthInterceptor: HttpInterceptorFn = (req, next) => {\n const config = inject(NUCLEUS_CONFIG);\n\n if (!ownsUrl(config, req.url) || req.context.get(NUCLEUS_SKIP_AUTH)) {\n return next(req);\n }\n\n const session = inject(NucleusSessionAuth);\n const auth = inject(NucleusAuth, { optional: true });\n\n const request = req.clone({ withCredentials: true });\n\n if (!req.context.get(NUCLEUS_FORCE_BEARER) && session.established()) {\n return next(request).pipe(\n catchError((error: unknown) => {\n if (!(error instanceof HttpErrorResponse) || error.status !== 401) {\n return throwError(() => error);\n }\n\n return from(session.establish(true)).pipe(\n switchMap((renewed) => (renewed ? next(request) : throwError(() => error))),\n );\n }),\n );\n }\n\n if (!auth) {\n return next(request);\n }\n\n return from(auth.idToken()).pipe(\n switchMap((token) =>\n next(token ? request.clone({ setHeaders: { Authorization: `Bearer ${token}` } }) : request),\n ),\n );\n};\n","import { HttpClient } from '@angular/common/http';\nimport { Injectable, inject, signal } from '@angular/core';\nimport { firstValueFrom } from 'rxjs';\n\nimport { NUCLEUS_CONFIG, isNucleusConfigured } from '../config/nucleus-config';\nimport { NucleusIdentity } from './nucleus-auth';\n\nconst AUTH_SYNC_PATH = '/auth/sync';\n\nexport interface AuthSyncRequest {\n readonly provider: string;\n readonly providerUserId: string;\n readonly email: string | null;\n readonly displayName: string | null;\n readonly photoUrl: string | null;\n}\n\nexport interface AppUser {\n readonly userId: string;\n readonly displayName: string | null;\n readonly photoUrl: string | null;\n readonly createdAt: string;\n readonly isNew: boolean;\n readonly profileCompleted: boolean;\n readonly hasCompanies: boolean;\n readonly isPlatformAdmin: boolean;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class UserSyncService {\n private readonly http = inject(HttpClient);\n private readonly config = inject(NUCLEUS_CONFIG);\n\n readonly appUser = signal<AppUser | null>(null);\n\n readonly failed = signal(false);\n\n async sync(session: NucleusIdentity, idToken: () => Promise<string | null>): Promise<void> {\n if (!isNucleusConfigured(this.config)) {\n console.info('[auth] sincronización omitida: securityApiUrl o appId vacíos en config.json');\n return;\n }\n\n const token = await idToken();\n\n if (!token) {\n this.failed.set(true);\n console.error('[auth] no hay ID token con el que autenticar la sincronización');\n return;\n }\n\n const body: AuthSyncRequest = {\n provider: session.provider,\n providerUserId: session.providerUserId,\n email: session.email,\n displayName: session.displayName,\n photoUrl: session.photoUrl,\n };\n\n try {\n const user = await firstValueFrom(\n this.http.post<AppUser>(`${this.config.securityApiUrl}${AUTH_SYNC_PATH}`, body),\n );\n\n this.appUser.set(user);\n this.failed.set(false);\n } catch (error) {\n this.failed.set(true);\n console.error('[auth] no se pudo sincronizar el usuario con el backend', error);\n }\n }\n}\n","import { HttpClient, HttpErrorResponse } from '@angular/common/http';\nimport { Injectable, computed, inject, signal } from '@angular/core';\nimport { firstValueFrom } from 'rxjs';\n\nimport { NucleusAuth } from '../auth/nucleus-auth';\nimport { NucleusSessionAuth } from '../auth/session-auth.service';\nimport { UserSyncService } from '../auth/user-sync.service';\nimport { NUCLEUS_CONFIG, isNucleusConfigured } from '../config/nucleus-config';\nimport { AccessScope, AppSummary, LauncherApp, MeResponse, MenuNode, SiteAccess } from './api.models';\n\n@Injectable({ providedIn: 'root' })\nexport class SessionService {\n private readonly http = inject(HttpClient);\n private readonly auth = inject(NucleusAuth, { optional: true });\n private readonly userSync = inject(UserSyncService);\n private readonly sessionAuth = inject(NucleusSessionAuth);\n private readonly config = inject(NUCLEUS_CONFIG);\n\n private readonly _me = signal<MeResponse | null>(null);\n private readonly _menu = signal<readonly MenuNode[]>([]);\n private readonly _access = signal<SiteAccess | null>(null);\n private readonly _scope = signal<AccessScope | null>(null);\n private readonly _apps = signal<readonly LauncherApp[]>([]);\n private readonly _loading = signal(false);\n private readonly _error = signal<string | null>(null);\n\n private inFlight = false;\n private loadedKey: string | null = null;\n\n readonly me = this._me.asReadonly();\n\n readonly menu = this._menu.asReadonly();\n\n readonly access = this._access.asReadonly();\n\n readonly scope = this._scope.asReadonly();\n\n readonly apps = this._apps.asReadonly();\n\n readonly loading = this._loading.asReadonly();\n\n readonly error = this._error.asReadonly();\n\n readonly roleName = computed(() => this._access()?.roleName ?? null);\n\n readonly siteName = computed(() => this._access()?.siteName ?? null);\n\n readonly companies = computed(() => {\n const me = this._me();\n if (!me) return [];\n return [...me.ownedCompanies, ...me.sharedCompanies];\n });\n\n async load(language: string, force = false): Promise<void> {\n if (!isNucleusConfigured(this.config)) return;\n\n const identity = this.auth?.user() ?? null;\n\n if (this.auth && !identity) return;\n\n const key = `${identity?.uid ?? 'cookie'}|${language}`;\n\n if (this.inFlight) return;\n if (!force && this.loadedKey === key) return;\n\n this.inFlight = true;\n this.loadedKey = key;\n\n this._loading.set(true);\n this._error.set(null);\n\n try {\n if (identity && this.auth) {\n await this.userSync.sync(identity, () => this.auth!.idToken());\n await this.sessionAuth.establish(force);\n }\n\n const [me, catalog] = await Promise.all([\n firstValueFrom(this.http.get<MeResponse>(`${this.config.securityApiUrl}/me`)),\n firstValueFrom(this.http.get<AppSummary[]>(`${this.config.securityApiUrl}/apps`)),\n ]);\n\n this._me.set(me);\n this._apps.set(this.buildLauncher(me, catalog));\n\n const access = [...me.ownedCompanies, ...me.sharedCompanies]\n .flatMap((company) => company.myAccess)\n .find((entry) => entry.appId.toLowerCase() === this.config.appId);\n\n if (access) {\n this._access.set(access);\n this._scope.set('site');\n this._menu.set(await this.siteMenu(access.siteId, language));\n return;\n }\n\n this._access.set(null);\n this._scope.set('account');\n this._menu.set(await this.accountMenu(language));\n } catch (error) {\n this._menu.set([]);\n this._error.set(describe(error));\n console.error('[session] no se pudo cargar la sesión del backend', error);\n } finally {\n this.inFlight = false;\n this._loading.set(false);\n }\n }\n\n reload(language: string): Promise<void> {\n return this.load(language, true);\n }\n\n private buildLauncher(me: MeResponse, catalog: readonly AppSummary[]): LauncherApp[] {\n const granted = new Set(\n [...me.ownedCompanies, ...me.sharedCompanies]\n .flatMap((company) => company.myAccess)\n .map((entry) => entry.appId.toLowerCase()),\n );\n\n return catalog\n .filter((app) => app.id.toLowerCase() !== this.config.appId)\n .map((app) => ({ ...app, hasAccess: granted.has(app.id.toLowerCase()) }))\n .sort((a, b) => a.sortOrder - b.sortOrder);\n }\n\n private siteMenu(siteId: string, language: string): Promise<MenuNode[]> {\n return firstValueFrom(\n this.http.get<MenuNode[]>(\n `${this.config.securityApiUrl}/sites/${siteId}/apps/${this.config.appId}/menu`,\n { params: { language } },\n ),\n );\n }\n\n private accountMenu(language: string): Promise<MenuNode[]> {\n return firstValueFrom(\n this.http.get<MenuNode[]>(`${this.config.securityApiUrl}/me/menu`, {\n params: { appId: this.config.appId, language },\n }),\n );\n }\n}\n\nfunction describe(error: unknown): string {\n if (error instanceof HttpErrorResponse) {\n const problem = error.error as { detail?: string; title?: string } | null;\n return problem?.detail ?? problem?.title ?? `HTTP ${error.status}`;\n }\n\n return 'Error desconocido';\n}\n","import { Injectable, effect, signal } from '@angular/core';\n\nexport type NucleusLang = 'es' | 'en';\n\nexport const NUCLEUS_LANGS: readonly NucleusLang[] = ['es', 'en'];\n\nconst STORAGE_KEY = 'nucleus_lang';\n\nfunction isLang(value: unknown): value is NucleusLang {\n return value === 'es' || value === 'en';\n}\n\nfunction readStored(): NucleusLang {\n try {\n const stored = localStorage.getItem(STORAGE_KEY);\n if (isLang(stored)) return stored;\n } catch {}\n\n return 'es';\n}\n\n@Injectable({ providedIn: 'root' })\nexport class NucleusLanguage {\n private readonly _lang = signal<NucleusLang>(readStored());\n\n readonly lang = this._lang.asReadonly();\n\n constructor() {\n effect(() => {\n const lang = this._lang();\n\n document.documentElement.lang = lang;\n\n try {\n localStorage.setItem(STORAGE_KEY, lang);\n } catch {}\n });\n }\n\n setLang(lang: NucleusLang): void {\n this._lang.set(lang);\n }\n}\n","export type ThemeId =\n | 'nucleus'\n | 'light'\n | 'dark'\n | 'bubblegum'\n | 'cool-breeze'\n | 'cool-slate'\n | 'icy-mint'\n | 'juicy-plum'\n | 'mango-paradise'\n | 'moonlight-glow'\n | 'mystical-forest'\n | 'silky-pink'\n | 'spicy-red'\n | 'sunny-day';\n\nexport type ThemePreference = ThemeId | 'system';\n\nexport interface ThemeTokens {\n readonly bg: string;\n\n readonly surface: string;\n\n readonly surfaceAlt: string;\n\n readonly text: string;\n\n readonly textMuted: string;\n\n readonly border: string;\n\n readonly accent: string;\n\n readonly onAccent: string;\n}\n\nexport interface Theme {\n readonly id: ThemeId;\n\n readonly scheme: 'light' | 'dark';\n\n readonly swatch: string;\n\n readonly starfield: boolean;\n readonly tokens: ThemeTokens;\n}\n\nexport const THEMES: readonly Theme[] = [\n {\n id: 'nucleus',\n scheme: 'dark',\n swatch: '#7c6cf5',\n starfield: true,\n tokens: {\n bg: '#050508',\n surface: '#0d0d15',\n surfaceAlt: '#16161f',\n text: '#ffffff',\n textMuted: 'rgba(255, 255, 255, 0.6)',\n border: 'rgba(255, 255, 255, 0.14)',\n accent: '#7c6cf5',\n onAccent: '#ffffff',\n },\n },\n {\n id: 'light',\n scheme: 'light',\n swatch: '#f5f5f5',\n starfield: false,\n tokens: {\n bg: '#ffffff',\n surface: '#f5f5f5',\n surfaceAlt: '#eeeeee',\n text: '#1e1e1e',\n textMuted: '#5a5a5a',\n border: '#cccedb',\n accent: '#0078d4',\n onAccent: '#ffffff',\n },\n },\n {\n id: 'dark',\n scheme: 'dark',\n swatch: '#1e1e1e',\n starfield: false,\n tokens: {\n bg: '#1e1e1e',\n surface: '#252526',\n surfaceAlt: '#2d2d30',\n text: '#f1f1f1',\n textMuted: '#a0a0a0',\n border: '#3f3f46',\n accent: '#0097fb',\n onAccent: '#ffffff',\n },\n },\n {\n id: 'bubblegum',\n scheme: 'light',\n swatch: '#f7b8d4',\n starfield: false,\n tokens: {\n bg: '#fff0f6',\n surface: '#ffe0ed',\n surfaceAlt: '#ffd0e4',\n text: '#3d1029',\n textMuted: '#8a4c6c',\n border: '#f0aac9',\n accent: '#d6337f',\n onAccent: '#ffffff',\n },\n },\n {\n id: 'cool-breeze',\n scheme: 'light',\n swatch: '#a8d5e8',\n starfield: false,\n tokens: {\n bg: '#eef7fb',\n surface: '#dcecf5',\n surfaceAlt: '#cbe2ef',\n text: '#102a38',\n textMuted: '#4a6b7d',\n border: '#a5c9db',\n accent: '#0f7ba8',\n onAccent: '#ffffff',\n },\n },\n {\n id: 'cool-slate',\n scheme: 'dark',\n swatch: '#3b4a5c',\n starfield: false,\n tokens: {\n bg: '#232b36',\n surface: '#2c3644',\n surfaceAlt: '#354152',\n text: '#e6ecf4',\n textMuted: '#9fb0c4',\n border: '#44546a',\n accent: '#5fa8e8',\n onAccent: '#0b1118',\n },\n },\n {\n id: 'icy-mint',\n scheme: 'light',\n swatch: '#c4ece5',\n starfield: false,\n tokens: {\n bg: '#f0fbf8',\n surface: '#dcf3ee',\n surfaceAlt: '#c9eae3',\n text: '#0d2f2a',\n textMuted: '#4a706a',\n border: '#a3d6cd',\n accent: '#0d8f7d',\n onAccent: '#ffffff',\n },\n },\n {\n id: 'juicy-plum',\n scheme: 'dark',\n swatch: '#6b3a7a',\n starfield: false,\n tokens: {\n bg: '#2a1633',\n surface: '#372042',\n surfaceAlt: '#452a52',\n text: '#f3e8f7',\n textMuted: '#b795c4',\n border: '#57366a',\n accent: '#c86dd7',\n onAccent: '#1a0d20',\n },\n },\n {\n id: 'mango-paradise',\n scheme: 'light',\n swatch: '#f7c48a',\n starfield: false,\n tokens: {\n bg: '#fff6ec',\n surface: '#ffe9d4',\n surfaceAlt: '#ffdcbc',\n text: '#3d2410',\n textMuted: '#8a5f38',\n border: '#f0c096',\n accent: '#e07314',\n onAccent: '#ffffff',\n },\n },\n {\n id: 'moonlight-glow',\n scheme: 'dark',\n swatch: '#1f3a5f',\n starfield: false,\n tokens: {\n bg: '#131f33',\n surface: '#1c2b45',\n surfaceAlt: '#243657',\n text: '#e3ecfa',\n textMuted: '#94a9c9',\n border: '#33496e',\n accent: '#6ea8f0',\n onAccent: '#0a1020',\n },\n },\n {\n id: 'mystical-forest',\n scheme: 'dark',\n swatch: '#1f4a2e',\n starfield: false,\n tokens: {\n bg: '#132419',\n surface: '#1b3223',\n surfaceAlt: '#24422e',\n text: '#e4f2e8',\n textMuted: '#93b7a0',\n border: '#325a41',\n accent: '#4caf70',\n onAccent: '#0a1610',\n },\n },\n {\n id: 'silky-pink',\n scheme: 'light',\n swatch: '#f3c2d6',\n starfield: false,\n tokens: {\n bg: '#fdf2f7',\n surface: '#fae3ed',\n surfaceAlt: '#f6d3e2',\n text: '#3a1626',\n textMuted: '#87566a',\n border: '#eeb4cb',\n accent: '#c14b82',\n onAccent: '#ffffff',\n },\n },\n {\n id: 'spicy-red',\n scheme: 'dark',\n swatch: '#8f1f24',\n starfield: false,\n tokens: {\n bg: '#2a1113',\n surface: '#3a181b',\n surfaceAlt: '#4a1f23',\n text: '#f8e6e7',\n textMuted: '#c79398',\n border: '#5f2a2f',\n accent: '#e8555e',\n onAccent: '#1a0809',\n },\n },\n {\n id: 'sunny-day',\n scheme: 'light',\n swatch: '#efe4b0',\n starfield: false,\n tokens: {\n bg: '#fdf9e8',\n surface: '#f7efd2',\n surfaceAlt: '#f0e5bd',\n text: '#332d10',\n textMuted: '#736a38',\n border: '#ddcf94',\n accent: '#a8860b',\n onAccent: '#ffffff',\n },\n },\n];\n\nexport const THEME_LABELS: Readonly<Record<ThemeId, string>> = {\n nucleus: 'Nucleus',\n light: 'Light',\n dark: 'Dark',\n bubblegum: 'Bubblegum',\n 'cool-breeze': 'Cool Breeze',\n 'cool-slate': 'Cool Slate',\n 'icy-mint': 'Icy Mint',\n 'juicy-plum': 'Juicy Plum',\n 'mango-paradise': 'Mango Paradise',\n 'moonlight-glow': 'Moonlight Glow',\n 'mystical-forest': 'Mystical Forest',\n 'silky-pink': 'Silky Pink',\n 'spicy-red': 'Spicy Red',\n 'sunny-day': 'Sunny Day',\n};\n\nexport const DEFAULT_THEME: ThemeId = 'nucleus';\n\nconst BY_ID = new Map(THEMES.map((theme) => [theme.id, theme]));\n\nexport function themeById(id: ThemeId): Theme {\n return BY_ID.get(id) ?? BY_ID.get(DEFAULT_THEME)!;\n}\n\nexport function isThemePreference(value: unknown): value is ThemePreference {\n return value === 'system' || (typeof value === 'string' && BY_ID.has(value as ThemeId));\n}\n","import { Injectable, computed, effect, signal } from '@angular/core';\n\nimport { DEFAULT_THEME, Theme, ThemePreference, isThemePreference, themeById } from './theme';\n\nconst STORAGE_KEY = 'nucleus_theme';\n\nfunction readStoredPreference(): ThemePreference {\n try {\n const stored = localStorage.getItem(STORAGE_KEY);\n if (isThemePreference(stored)) return stored;\n } catch {}\n return DEFAULT_THEME;\n}\n\nfunction prefersDark(): boolean {\n return globalThis.matchMedia?.('(prefers-color-scheme: dark)').matches ?? false;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class ThemeService {\n private readonly _preference = signal<ThemePreference>(readStoredPreference());\n\n private readonly systemDark = signal(prefersDark());\n\n readonly preference = this._preference.asReadonly();\n\n readonly theme = computed<Theme>(() => {\n const preference = this._preference();\n if (preference === 'system') return themeById(this.systemDark() ? 'dark' : 'light');\n return themeById(preference);\n });\n\n readonly starfield = computed(() => this.theme().starfield);\n\n constructor() {\n globalThis\n .matchMedia?.('(prefers-color-scheme: dark)')\n .addEventListener('change', (event) => this.systemDark.set(event.matches));\n\n effect(() => {\n const preference = this._preference();\n const theme = this.theme();\n\n this.applyToDom(theme);\n\n try {\n localStorage.setItem(STORAGE_KEY, preference);\n } catch {}\n });\n }\n\n setPreference(preference: ThemePreference): void {\n this._preference.set(preference);\n }\n\n private applyToDom(theme: Theme): void {\n const root = document.documentElement;\n\n for (const [name, value] of Object.entries(theme.tokens)) {\n root.style.setProperty(`--ac-${name.replace(/[A-Z]/g, (c) => `-${c.toLowerCase()}`)}`, value);\n }\n\n root.dataset['theme'] = theme.id;\n\n root.classList.toggle('ns-dark', theme.scheme === 'dark');\n\n root.style.colorScheme = theme.scheme;\n }\n}\n","import { definePreset } from '@primeuix/themes';\nimport Lara from '@primeuix/themes/lara';\n\nconst MASK = {\n background: 'rgba(0, 0, 0, 0.55)',\n color: 'var(--ac-text)',\n};\n\nconst SHADOW = '0 10px 40px rgba(0, 0, 0, 0.45)';\n\nconst PANEL = {\n background: 'var(--ac-surface)',\n borderColor: 'var(--ac-border)',\n color: 'var(--ac-text)',\n};\n\nconst schemeTokens = {\n primary: {\n color: 'var(--ac-accent)',\n contrastColor: 'var(--ac-on-accent)',\n hoverColor: 'color-mix(in srgb, var(--ac-accent) 85%, var(--ac-text))',\n activeColor: 'color-mix(in srgb, var(--ac-accent) 70%, var(--ac-text))',\n },\n highlight: {\n background: 'color-mix(in srgb, var(--ac-accent) 16%, transparent)',\n focusBackground: 'color-mix(in srgb, var(--ac-accent) 24%, transparent)',\n color: 'var(--ac-text)',\n focusColor: 'var(--ac-text)',\n },\n text: {\n color: 'var(--ac-text)',\n hoverColor: 'var(--ac-text)',\n mutedColor: 'var(--ac-text-muted)',\n hoverMutedColor: 'var(--ac-text)',\n },\n content: {\n background: 'var(--ac-surface)',\n hoverBackground: 'var(--ac-surface-alt)',\n borderColor: 'var(--ac-border)',\n color: 'var(--ac-text)',\n hoverColor: 'var(--ac-text)',\n },\n overlay: {\n select: {\n background: 'var(--ac-surface)',\n borderColor: 'var(--ac-border)',\n color: 'var(--ac-text)',\n },\n popover: {\n background: 'var(--ac-surface)',\n borderColor: 'var(--ac-border)',\n color: 'var(--ac-text)',\n },\n modal: {\n background: 'var(--ac-surface)',\n borderColor: 'var(--ac-border)',\n color: 'var(--ac-text)',\n },\n },\n formField: {\n background: 'var(--ac-bg)',\n disabledBackground: 'var(--ac-surface-alt)',\n filledBackground: 'var(--ac-surface-alt)',\n filledHoverBackground: 'var(--ac-surface-alt)',\n filledFocusBackground: 'var(--ac-surface-alt)',\n borderColor: 'var(--ac-border)',\n hoverBorderColor: 'var(--ac-accent)',\n focusBorderColor: 'var(--ac-accent)',\n color: 'var(--ac-text)',\n disabledColor: 'var(--ac-text-muted)',\n placeholderColor: 'var(--ac-text-muted)',\n floatLabelColor: 'var(--ac-text-muted)',\n floatLabelFocusColor: 'var(--ac-accent)',\n iconColor: 'var(--ac-text-muted)',\n },\n list: {\n option: {\n focusBackground: 'var(--ac-surface-alt)',\n selectedBackground: 'color-mix(in srgb, var(--ac-accent) 20%, transparent)',\n selectedFocusBackground: 'color-mix(in srgb, var(--ac-accent) 28%, transparent)',\n color: 'var(--ac-text)',\n focusColor: 'var(--ac-text)',\n selectedColor: 'var(--ac-text)',\n selectedFocusColor: 'var(--ac-text)',\n icon: {\n color: 'var(--ac-text-muted)',\n focusColor: 'var(--ac-text)',\n },\n },\n },\n navigation: {\n item: {\n focusBackground: 'var(--ac-surface-alt)',\n activeBackground: 'color-mix(in srgb, var(--ac-accent) 20%, transparent)',\n color: 'var(--ac-text)',\n focusColor: 'var(--ac-text)',\n activeColor: 'var(--ac-text)',\n icon: {\n color: 'var(--ac-text-muted)',\n focusColor: 'var(--ac-text)',\n activeColor: 'var(--ac-accent)',\n },\n },\n },\n};\n\nexport const NucleusPreset = definePreset(Lara, {\n semantic: {\n colorScheme: {\n light: { ...schemeTokens, mask: MASK },\n dark: { ...schemeTokens, mask: MASK },\n },\n },\n components: {\n drawer: { root: { ...PANEL, shadow: SHADOW } },\n popover: { root: { ...PANEL, shadow: SHADOW } },\n menu: { root: { ...PANEL, shadow: SHADOW } },\n listbox: { root: PANEL },\n },\n});\n","import { EnvironmentProviders } from '@angular/core';\nimport { providePrimeNG } from 'primeng/config';\n\nimport { NucleusPreset } from './primeng-preset';\n\nexport const NUCLEUS_DARK_SELECTOR = '.ns-dark';\n\nexport function provideNucleusTheme(): EnvironmentProviders {\n return providePrimeNG({\n theme: {\n preset: NucleusPreset,\n options: { darkModeSelector: NUCLEUS_DARK_SELECTOR },\n },\n });\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\nconst ORBIT = { rx: 78, ry: 196 } as const;\n\n@Component({\n selector: 'nucleus-mark',\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: `\n :host {\n display: block;\n }\n\n svg {\n display: block;\n }\n `,\n template: `\n <svg\n [attr.width]=\"size()\"\n [attr.height]=\"size()\"\n viewBox=\"-230 -230 460 460\"\n aria-hidden=\"true\"\n >\n @for (r of rotations; track $index) {\n <ellipse\n [attr.rx]=\"orbit.rx\"\n [attr.ry]=\"orbit.ry\"\n [attr.transform]=\"'rotate(' + r + ')'\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"18\"\n />\n }\n <circle r=\"42\" [attr.fill]=\"accent()\" />\n </svg>\n `,\n})\nexport class NucleusMark {\n readonly accent = input('#7C6CF5');\n readonly size = input(28);\n\n protected readonly orbit = ORBIT;\n protected readonly rotations = [0, 60, 120];\n}\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\n\nconst W = 1280;\nconst H = 720;\n\nconst STARS = Array.from({ length: 130 }, (_, i) => {\n const a = i * 2.399963;\n const big = i % 11 === 0;\n const sway = Math.sin(a * 1.7);\n const lift = Math.cos(a * 2.3);\n\n return {\n cx: +((Math.sin(a * 7.13) * 0.5 + 0.5) * W).toFixed(2),\n cy: +((Math.cos(a * 3.77) * 0.5 + 0.5) * H).toFixed(2),\n r: +((big ? 2.4 : 0.9) + (i % 4) * 0.5).toFixed(2),\n opacity: ((big ? 0.85 : 0.42) + (i % 5) * 0.09).toFixed(2),\n dx: `${(sway * 26).toFixed(1)}px`,\n dy: `${(lift * 18).toFixed(1)}px`,\n duration: `${(11 + (i % 9) * 1.7).toFixed(1)}s`,\n delay: `-${((i % 13) * 0.85).toFixed(2)}s`,\n };\n});\n\n@Component({\n selector: 'nucleus-starfield',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <svg\n [attr.viewBox]=\"'0 0 ' + W + ' ' + H\"\n preserveAspectRatio=\"xMidYMid slice\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <defs>\n <radialGradient id=\"ns-starfield-glow\" cx=\"50%\" cy=\"0%\" r=\"75%\">\n <stop offset=\"0%\" stop-color=\"var(--ac-accent)\" stop-opacity=\"0.18\" />\n <stop offset=\"70%\" stop-color=\"var(--ac-accent)\" stop-opacity=\"0\" />\n </radialGradient>\n </defs>\n\n <rect width=\"100%\" height=\"100%\" fill=\"url(#ns-starfield-glow)\" />\n\n @for (star of stars; track $index) {\n <circle\n [attr.cx]=\"star.cx\"\n [attr.cy]=\"star.cy\"\n [attr.r]=\"star.r\"\n [style.--o]=\"star.opacity\"\n [style.--dx]=\"star.dx\"\n [style.--dy]=\"star.dy\"\n [style.--dur]=\"star.duration\"\n [style.--delay]=\"star.delay\"\n fill=\"#ffffff\"\n />\n }\n </svg>\n `,\n styles: `\n :host {\n position: fixed;\n inset: 0;\n z-index: -1;\n display: block;\n pointer-events: none;\n background: var(--ac-bg);\n }\n\n svg {\n display: block;\n width: 100%;\n height: 100%;\n }\n\n circle {\n opacity: var(--o);\n animation: ns-drift var(--dur) ease-in-out var(--delay) infinite alternate;\n }\n\n @keyframes ns-drift {\n from {\n transform: translate(0, 0);\n opacity: var(--o);\n }\n to {\n transform: translate(var(--dx), var(--dy));\n opacity: calc(var(--o) * 0.3);\n }\n }\n\n @media (prefers-reduced-motion: reduce) {\n circle {\n animation: none;\n }\n }\n `,\n})\nexport class NucleusStarfield {\n protected readonly W = W;\n protected readonly H = H;\n protected readonly stars = STARS;\n}\n","import { NucleusLang } from '../../i18n/nucleus-language';\n\nexport interface ShellCopy {\n readonly navToggle: string;\n readonly appsLauncher: string;\n readonly appsEmpty: string;\n readonly settingsTitle: string;\n readonly settingsTheme: string;\n readonly settingsThemeHint: string;\n readonly themeSystem: string;\n readonly signOut: string;\n readonly accountManage: string;\n readonly accountSwitch: string;\n readonly accessLoading: string;\n readonly accessEmpty: string;\n readonly accountScope: string;\n readonly hintNoAccess: string;\n readonly hintComingSoon: string;\n readonly hintNotDeployed: string;\n}\n\nexport const SHELL_COPY: Readonly<Record<NucleusLang, ShellCopy>> = {\n es: {\n navToggle: 'Mostrar u ocultar el menú',\n appsLauncher: 'Aplicaciones',\n appsEmpty: 'No hay otras aplicaciones',\n settingsTitle: 'Ajustes',\n settingsTheme: 'Tema',\n settingsThemeHint: 'Elige cómo se ve la suite en este dispositivo.',\n themeSystem: 'Del sistema',\n signOut: 'Cerrar sesión',\n accountManage: 'Gestionar mi cuenta',\n accountSwitch: 'Cambiar de cuenta',\n accessLoading: 'Cargando accesos...',\n accessEmpty: 'Sin accesos asignados',\n accountScope: 'Mi cuenta',\n hintNoAccess: 'Sin acceso',\n hintComingSoon: 'Próximamente',\n hintNotDeployed: 'Sin publicar',\n },\n en: {\n navToggle: 'Show or hide the menu',\n appsLauncher: 'Applications',\n appsEmpty: 'No other applications',\n settingsTitle: 'Settings',\n settingsTheme: 'Theme',\n settingsThemeHint: 'Choose how the suite looks on this device.',\n themeSystem: 'System',\n signOut: 'Sign out',\n accountManage: 'Manage my account',\n accountSwitch: 'Switch account',\n accessLoading: 'Loading access...',\n accessEmpty: 'No access granted',\n accountScope: 'My account',\n hintNoAccess: 'No access',\n hintComingSoon: 'Coming soon',\n hintNotDeployed: 'Not deployed',\n },\n};\n","import {\n ChangeDetectionStrategy,\n Component,\n Injector,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n untracked,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { Router } from '@angular/router';\nimport { AvatarModule } from 'primeng/avatar';\nimport { ButtonModule } from 'primeng/button';\nimport { DrawerModule } from 'primeng/drawer';\nimport { ListboxModule } from 'primeng/listbox';\nimport { PopoverModule } from 'primeng/popover';\nimport { TooltipModule } from 'primeng/tooltip';\n\nimport { LauncherApp, MenuNode } from '../../api/api.models';\nimport { SessionService } from '../../api/session.service';\nimport { NucleusAuth } from '../../auth/nucleus-auth';\nimport { NucleusSessionAuth } from '../../auth/session-auth.service';\nimport { NUCLEUS_CONFIG } from '../../config/nucleus-config';\nimport { NucleusLang, NucleusLanguage } from '../../i18n/nucleus-language';\nimport { THEMES, THEME_LABELS, ThemePreference } from '../../theme/theme';\nimport { ThemeService } from '../../theme/theme.service';\nimport { NucleusMark } from '../nucleus-mark/nucleus-mark';\nimport { NucleusStarfield } from '../starfield/starfield';\nimport { SHELL_COPY } from './shell.copy';\n\nexport interface ShellNavItem {\n readonly id: string;\n readonly icon: string;\n readonly label: string;\n}\n\ninterface ThemeOption {\n readonly value: ThemePreference;\n readonly label: string;\n readonly swatch: string | null;\n}\n\ninterface ShellIdentity {\n readonly name: string;\n readonly email: string;\n readonly photoUrl: string | null;\n}\n\n@Component({\n selector: 'nucleus-shell',\n imports: [\n AvatarModule,\n ButtonModule,\n DrawerModule,\n ListboxModule,\n PopoverModule,\n TooltipModule,\n FormsModule,\n NucleusMark,\n NucleusStarfield,\n ],\n templateUrl: './nucleus-shell.html',\n styleUrl: './nucleus-shell.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class NucleusShell {\n private readonly session = inject(SessionService);\n private readonly sessionAuth = inject(NucleusSessionAuth);\n private readonly themes = inject(ThemeService);\n private readonly language = inject(NucleusLanguage);\n private readonly config = inject(NUCLEUS_CONFIG);\n private readonly injector = inject(Injector);\n private readonly router = inject(Router);\n\n readonly brand = input('SUITE');\n readonly heading = input('');\n readonly lead = input('');\n readonly navItems = input<readonly ShellNavItem[]>([]);\n readonly activeNavId = input<string | null>(null);\n readonly selectedMenuId = input<string | null>(null);\n\n readonly navSelect = output<string>();\n readonly menuSelect = output<MenuNode>();\n\n protected readonly lang = this.language.lang;\n protected readonly copy = computed(() => SHELL_COPY[this.lang()]);\n\n protected readonly starfield = this.themes.starfield;\n protected readonly themePreference = this.themes.preference;\n\n protected readonly menu = this.session.menu;\n protected readonly menuLoading = this.session.loading;\n protected readonly menuError = this.session.error;\n protected readonly launcherApps = this.session.apps;\n\n protected readonly sidebarOpen = signal(true);\n protected readonly settingsOpen = signal(false);\n\n private readonly auth = this.injector.get(NucleusAuth, null);\n\n protected readonly identity = computed<ShellIdentity | null>(() => {\n const me = this.session.me();\n\n if (me) {\n return {\n name: me.displayName ?? me.userId,\n email: me.userId,\n photoUrl: me.photoUrl,\n };\n }\n\n const user = this.auth?.user() ?? null;\n\n if (!user) return null;\n\n return {\n name: user.displayName ?? user.email ?? user.providerUserId,\n email: user.email ?? user.providerUserId,\n photoUrl: user.photoUrl,\n };\n });\n\n protected readonly initials = computed(() => initialsOf(this.identity()?.name ?? ''));\n\n protected readonly canSwitchAccount = computed(() => this.auth?.switchAccount !== undefined);\n\n protected readonly accessCaption = computed(() => {\n const role = this.session.roleName();\n const site = this.session.siteName();\n\n if (role && site) return `${role} · ${site}`;\n if (this.session.scope() === 'account') return this.copy().accountScope;\n\n return '';\n });\n\n protected readonly themeOptions = computed<ThemeOption[]>(() => [\n ...THEMES.map((theme) => ({\n value: theme.id as ThemePreference,\n label: THEME_LABELS[theme.id],\n swatch: theme.swatch,\n })),\n { value: 'system', label: this.copy().themeSystem, swatch: null },\n ]);\n\n private readonly loadSession = effect(() => {\n const language = this.lang();\n const user = this.auth?.user() ?? null;\n\n if (this.auth && !user) return;\n\n untracked(() => void this.session.load(language));\n });\n\n protected setLang(lang: NucleusLang): void {\n this.language.setLang(lang);\n }\n\n protected toggleSidebar(): void {\n this.sidebarOpen.update((open) => !open);\n }\n\n protected selectTheme(preference: ThemePreference | null): void {\n if (preference) this.themes.setPreference(preference);\n }\n\n protected selectNav(id: string): void {\n this.navSelect.emit(id);\n }\n\n protected selectMenu(node: MenuNode): void {\n this.menuSelect.emit(node);\n\n if (node.route) void this.router.navigateByUrl(node.route);\n }\n\n protected isSelected(node: MenuNode): boolean {\n return this.selectedMenuId() === node.id;\n }\n\n protected canOpen(app: LauncherApp): boolean {\n return app.hasAccess && app.status === 1 && !!app.url;\n }\n\n protected launch(app: LauncherApp): void {\n if (!this.canOpen(app)) return;\n\n window.location.href = app.url as string;\n }\n\n protected appInitials(app: LauncherApp): string {\n return initialsOf(app.name);\n }\n\n protected launchHint(app: LauncherApp): string {\n const t = this.copy();\n\n if (!app.hasAccess) return t.hintNoAccess;\n if (app.status !== 1) return t.hintComingSoon;\n if (!app.url) return t.hintNotDeployed;\n\n return '';\n }\n\n protected async switchAccount(): Promise<void> {\n await this.auth?.switchAccount?.();\n }\n\n protected async signOut(): Promise<void> {\n await this.sessionAuth.clear();\n await this.auth?.signOut?.();\n\n const landing = this.config.landingUrl;\n\n if (landing) window.location.href = landing;\n }\n}\n\nfunction initialsOf(source: string): string {\n const parts = source.trim().split(/\\s+/).filter(Boolean);\n\n if (!parts.length) return '?';\n if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase();\n\n return (parts[0][0] + parts[1][0]).toUpperCase();\n}\n","@let t = copy();\n@let me = identity();\n\n@if (starfield()) {\n <nucleus-starfield />\n}\n\n<header class=\"topbar\">\n <div class=\"side\">\n <p-button\n icon=\"pi pi-bars\"\n severity=\"secondary\"\n size=\"small\"\n [text]=\"true\"\n [rounded]=\"true\"\n [ariaLabel]=\"t.navToggle\"\n [pTooltip]=\"t.navToggle\"\n tooltipPosition=\"bottom\"\n (onClick)=\"toggleSidebar()\"\n />\n\n <div class=\"brand\">\n <nucleus-mark [size]=\"20\" />\n <div class=\"brand-name\">\n <span class=\"brand-primary\">NUCLEUS</span>\n <span class=\"brand-secondary\">{{ brand() }}</span>\n </div>\n </div>\n </div>\n\n <div class=\"side\">\n <div class=\"lang-switch\" role=\"group\" aria-label=\"Idioma / Language\">\n <button\n type=\"button\"\n class=\"lang-pill\"\n [class.is-active]=\"lang() === 'es'\"\n [attr.aria-pressed]=\"lang() === 'es'\"\n (click)=\"setLang('es')\"\n >\n ES\n </button>\n <button\n type=\"button\"\n class=\"lang-pill\"\n [class.is-active]=\"lang() === 'en'\"\n [attr.aria-pressed]=\"lang() === 'en'\"\n (click)=\"setLang('en')\"\n >\n EN\n </button>\n </div>\n\n <p-button\n icon=\"pi pi-th-large\"\n severity=\"secondary\"\n size=\"small\"\n [text]=\"true\"\n [rounded]=\"true\"\n [ariaLabel]=\"t.appsLauncher\"\n [pTooltip]=\"t.appsLauncher\"\n tooltipPosition=\"bottom\"\n (onClick)=\"launcher.toggle($event)\"\n />\n\n <p-popover #launcher>\n <div class=\"launcher\">\n <p class=\"launcher-title\">{{ t.appsLauncher }}</p>\n\n @if (!launcherApps().length) {\n <p class=\"launcher-empty\">{{ t.appsEmpty }}</p>\n }\n\n <div class=\"launcher-grid\">\n @for (app of launcherApps(); track app.id) {\n <button\n type=\"button\"\n class=\"launcher-item\"\n [class.is-disabled]=\"!canOpen(app)\"\n [disabled]=\"!canOpen(app)\"\n [pTooltip]=\"launchHint(app)\"\n tooltipPosition=\"bottom\"\n (click)=\"launch(app); launcher.hide()\"\n >\n <span class=\"launcher-icon\" [style.background]=\"app.color ?? '#64748b'\">\n @if (app.icon) {\n <i [class]=\"app.icon\" aria-hidden=\"true\"></i>\n } @else {\n <span class=\"launcher-initials\">{{ appInitials(app) }}</span>\n }\n </span>\n <span class=\"launcher-name\">{{ app.name }}</span>\n @if (launchHint(app)) {\n <span class=\"launcher-badge\">{{ launchHint(app) }}</span>\n }\n </button>\n }\n </div>\n </div>\n </p-popover>\n\n <p-button\n icon=\"pi pi-cog\"\n severity=\"secondary\"\n size=\"small\"\n [text]=\"true\"\n [rounded]=\"true\"\n [ariaLabel]=\"t.settingsTitle\"\n [pTooltip]=\"t.settingsTitle\"\n tooltipPosition=\"bottom\"\n (onClick)=\"settingsOpen.set(true)\"\n />\n\n @if (me) {\n <p-button\n severity=\"secondary\"\n size=\"small\"\n [text]=\"true\"\n [rounded]=\"true\"\n styleClass=\"avatar-trigger\"\n [ariaLabel]=\"me.name\"\n [pTooltip]=\"me.name\"\n tooltipPosition=\"bottom\"\n (onClick)=\"account.toggle($event)\"\n >\n <p-avatar\n [image]=\"me.photoUrl ?? undefined\"\n [label]=\"me.photoUrl ? undefined : initials()\"\n shape=\"circle\"\n size=\"normal\"\n />\n </p-button>\n }\n </div>\n</header>\n\n<p-popover #account>\n @if (me) {\n <div class=\"account\">\n <p class=\"account-email\">{{ me.email }}</p>\n\n <div class=\"account-head\">\n @if (me.photoUrl) {\n <img class=\"account-photo\" [src]=\"me.photoUrl\" alt=\"\" width=\"72\" height=\"72\" />\n } @else {\n <span class=\"account-photo account-initials\">{{ initials() }}</span>\n }\n <p class=\"account-hi\">{{ me.name }}</p>\n </div>\n\n <div class=\"account-actions\">\n @if (canSwitchAccount()) {\n <p-button\n [label]=\"t.accountSwitch\"\n icon=\"pi pi-users\"\n severity=\"secondary\"\n size=\"small\"\n [text]=\"true\"\n [fluid]=\"true\"\n (onClick)=\"switchAccount(); account.hide()\"\n />\n }\n <p-button\n [label]=\"t.signOut\"\n icon=\"pi pi-sign-out\"\n severity=\"secondary\"\n size=\"small\"\n [text]=\"true\"\n [fluid]=\"true\"\n (onClick)=\"signOut(); account.hide()\"\n />\n </div>\n </div>\n }\n</p-popover>\n\n<div class=\"body\">\n <aside class=\"sidebar\" [class.is-collapsed]=\"!sidebarOpen()\">\n @if (navItems().length) {\n <nav>\n @for (item of navItems(); track item.id) {\n <button\n type=\"button\"\n class=\"nav-item\"\n [class.is-active]=\"activeNavId() === item.id\"\n [attr.aria-current]=\"activeNavId() === item.id ? 'page' : null\"\n [pTooltip]=\"sidebarOpen() ? '' : item.label\"\n tooltipPosition=\"right\"\n (click)=\"selectNav(item.id)\"\n >\n <i [class]=\"item.icon\" aria-hidden=\"true\"></i>\n <span class=\"nav-label\">{{ item.label }}</span>\n </button>\n }\n </nav>\n }\n\n <nav class=\"access-menu\">\n @if (accessCaption()) {\n <p class=\"access-caption\">{{ accessCaption() }}</p>\n }\n\n @if (menuLoading()) {\n <p class=\"access-state\">{{ t.accessLoading }}</p>\n } @else if (menuError()) {\n <p class=\"access-state is-error\">{{ menuError() }}</p>\n } @else if (!menu().length) {\n <p class=\"access-state\">{{ t.accessEmpty }}</p>\n } @else {\n @for (node of menu(); track node.id) {\n <button\n type=\"button\"\n class=\"nav-item\"\n [class.is-active]=\"isSelected(node)\"\n [pTooltip]=\"sidebarOpen() ? '' : node.label\"\n tooltipPosition=\"right\"\n (click)=\"selectMenu(node)\"\n >\n <i [class]=\"node.icon ?? 'pi pi-circle'\" aria-hidden=\"true\"></i>\n <span class=\"nav-label\">{{ node.label }}</span>\n </button>\n\n @for (child of node.children; track child.id) {\n <button\n type=\"button\"\n class=\"nav-item is-child\"\n [class.is-active]=\"isSelected(child)\"\n [pTooltip]=\"sidebarOpen() ? '' : child.label\"\n tooltipPosition=\"right\"\n (click)=\"selectMenu(child)\"\n >\n <i [class]=\"child.icon ?? 'pi pi-circle'\" aria-hidden=\"true\"></i>\n <span class=\"nav-label\">{{ child.label }}</span>\n </button>\n }\n }\n }\n </nav>\n </aside>\n\n <main class=\"content\">\n @if (heading()) {\n <h1>{{ heading() }}</h1>\n }\n @if (lead()) {\n <p class=\"lead\">{{ lead() }}</p>\n }\n\n <ng-content />\n </main>\n</div>\n\n<p-drawer\n [visible]=\"settingsOpen()\"\n (visibleChange)=\"settingsOpen.set($event)\"\n position=\"right\"\n [header]=\"t.settingsTitle\"\n [style]=\"{ width: '340px' }\"\n>\n <h3 class=\"settings-heading\">{{ t.settingsTheme }}</h3>\n <p class=\"settings-hint\">{{ t.settingsThemeHint }}</p>\n\n <p-listbox\n [options]=\"themeOptions()\"\n optionValue=\"value\"\n optionLabel=\"label\"\n [ngModel]=\"themePreference()\"\n (ngModelChange)=\"selectTheme($event)\"\n [ariaLabel]=\"t.settingsTheme\"\n >\n <ng-template #item let-option>\n <span class=\"theme-option\">\n @if (option.swatch) {\n <span class=\"theme-swatch\" [style.background]=\"option.swatch\" aria-hidden=\"true\"></span>\n } @else {\n <i class=\"pi pi-desktop theme-swatch-icon\" aria-hidden=\"true\"></i>\n }\n <span>{{ option.label }}</span>\n </span>\n </ng-template>\n </p-listbox>\n</p-drawer>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["STORAGE_KEY"],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "@nucleus-suite-pe/core",
3
+ "version": "0.1.0",
4
+ "description": "Capa compartida de la suite Nucleus: sesión única, permisos, tema y marco de aplicación para Angular.",
5
+ "keywords": [
6
+ "angular",
7
+ "nucleus",
8
+ "suite",
9
+ "sdk",
10
+ "primeng"
11
+ ],
12
+ "license": "MIT",
13
+ "repository": {
14
+ "type": "git",
15
+ "url": "https://dev.azure.com/nucleus-suite/Nucleus%20Suite/_git/nucleus-suite-repo"
16
+ },
17
+ "sideEffects": false,
18
+ "publishConfig": {
19
+ "access": "public"
20
+ },
21
+ "peerDependencies": {
22
+ "@angular/common": "^21.2.0",
23
+ "@angular/core": "^21.2.0",
24
+ "rxjs": "^7.8.0",
25
+ "primeng": "^21.0.0",
26
+ "@primeuix/themes": "^3.0.0",
27
+ "@angular/router": "^21.2.0",
28
+ "@angular/forms": "^21.2.0"
29
+ },
30
+ "dependencies": {
31
+ "tslib": "^2.3.0"
32
+ },
33
+ "module": "fesm2022/nucleus-suite-pe-core.mjs",
34
+ "typings": "types/nucleus-suite-pe-core.d.ts",
35
+ "exports": {
36
+ "./package.json": {
37
+ "default": "./package.json"
38
+ },
39
+ ".": {
40
+ "types": "./types/nucleus-suite-pe-core.d.ts",
41
+ "default": "./fesm2022/nucleus-suite-pe-core.mjs"
42
+ }
43
+ },
44
+ "type": "module"
45
+ }
@@ -0,0 +1,52 @@
1
+ :root {
2
+ --ac-bg: #050508;
3
+ --ac-surface: #0d0d15;
4
+ --ac-surface-alt: #16161f;
5
+ --ac-text: #ffffff;
6
+ --ac-text-muted: rgba(255, 255, 255, 0.6);
7
+ --ac-border: rgba(255, 255, 255, 0.14);
8
+ --ac-accent: #7c6cf5;
9
+ --ac-on-accent: #ffffff;
10
+
11
+ --ac-font: 'Space Grotesk', sans-serif;
12
+ --ac-radius-pill: 999px;
13
+ --ac-radius-box: 4px;
14
+ }
15
+
16
+ html,
17
+ body {
18
+ margin: 0;
19
+ background: var(--ac-bg);
20
+ }
21
+
22
+ body {
23
+ overflow-x: hidden;
24
+ color: var(--ac-text);
25
+ font-family: var(--ac-font);
26
+ -webkit-font-smoothing: antialiased;
27
+ }
28
+
29
+ button,
30
+ input {
31
+ font-family: inherit;
32
+ }
33
+
34
+ ::selection {
35
+ background: var(--ac-accent);
36
+ color: var(--ac-on-accent);
37
+ }
38
+
39
+ :focus-visible {
40
+ outline: 2px solid var(--ac-accent);
41
+ outline-offset: 3px;
42
+ }
43
+
44
+ .p-button.avatar-trigger {
45
+ padding: 2px;
46
+ }
47
+
48
+ @media (prefers-reduced-motion: reduce) {
49
+ html {
50
+ scroll-behavior: auto;
51
+ }
52
+ }