@janusui/janus-ui-library 0.0.1

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":"janusui-janus-ui-library.mjs","sources":["../../../projects/janusui/src/lib/models/color-group.ts","../../../projects/janusui/src/lib/models/screen-widget-api.ts","../../../projects/janusui/src/lib/tokens/widget-meta.token.ts","../../../projects/janusui/src/lib/services/layout-engine.ts","../../../projects/janusui/src/lib/services/widget-link.service.ts","../../../projects/janusui/src/lib/services/workspace-service.ts","../../../projects/janusui/src/lib/shared/fmt.ts","../../../projects/janusui/src/lib/widgets/screen-widget-base.ts","../../../projects/janusui/src/lib/widgets/provide-widget.ts","../../../projects/janusui/src/lib/ui/widget-chrome/widget-chrome.ts","../../../projects/janusui/src/lib/ui/widget-chrome/widget-chrome.html","../../../projects/janusui/src/lib/ui/widget-window/widget-window.ts","../../../projects/janusui/src/lib/ui/widget-window/widget-window.html","../../../projects/janusui/src/lib/screens/window-outlet/window-outlet.ts","../../../projects/janusui/src/lib/screens/window-outlet/window-outlet.html","../../../projects/janusui/src/lib/janusui.ts","../../../projects/janusui/src/public-api.ts","../../../projects/janusui/src/janusui-janus-ui-library.ts"],"sourcesContent":["/**\n * Predefined color groups for symbol linking across widgets.\n * Works like IB's color-linked groups: changing the symbol in one \"red\" widget\n * updates all other \"red\" widgets automatically.\n */\nexport type ColorGroup =\n | 'red'\n | 'green'\n | 'blue'\n | 'yellow'\n | 'orange'\n | 'purple'\n | 'cyan'\n | 'magenta'\n | 'lime'\n | 'pink';\n\n/** All available color groups for iterating in dropdowns / pickers. */\nexport const COLOR_GROUPS: ColorGroup[] = [\n 'red',\n 'green',\n 'blue',\n 'yellow',\n 'orange',\n 'purple',\n 'cyan',\n 'magenta',\n 'lime',\n 'pink',\n];\n\n/** CSS-friendly hex values for each color group. */\nexport const COLOR_GROUP_HEX: Record<ColorGroup, string> = {\n red: '#ff1744',\n green: '#00c853',\n blue: '#2979ff',\n yellow: '#ffd600',\n orange: '#ff9100',\n purple: '#d500f9',\n cyan: '#00e5ff',\n magenta: '#f50057',\n lime: '#76ff03',\n pink: '#ff80ab',\n};\n","import { InjectionToken, type Signal } from '@angular/core';\nimport type { ColorGroup } from './color-group';\n\n/**\n * Public API surface that the ScreenWidgetComponent wrapper exposes\n * to the inner content component via dependency injection.\n *\n * Inject `SCREEN_WIDGET_API` in your widget component to communicate\n * with the wrapper (e.g. read/publish linked data, change the title).\n *\n * The wrapper owns all WidgetLinkService interaction — individual\n * widgets never need to know about the linking service directly.\n *\n * @example\n * ```ts\n * private readonly api = inject(SCREEN_WIDGET_API);\n *\n * // Read the current accumulated data reactively\n * const d = this.api.data();\n *\n * // Cherry-pick fields your widget cares about\n * const sym = d?.['symbol'] as string | undefined;\n *\n * // Publish partial data to all widgets in the same color group\n * this.api.publishData({ symbol: 'AAPL' });\n *\n * // Override the titlebar text\n * api.setTitle('AAPL – Apple Inc.');\n * ```\n */\nexport interface ScreenWidgetApi {\n /** The unique widget instance ID. */\n readonly widgetId: Signal<string>;\n\n /** The parent window ID. */\n readonly windowId: Signal<string>;\n\n /** The color group this widget is linked to, or undefined if unlinked. */\n readonly colorGroup: Signal<ColorGroup | undefined>;\n\n /** The accumulated JSON data for this widget's color group (reactive). */\n readonly data: Signal<Record<string, unknown>>;\n\n /**\n * Publish partial JSON data to all widgets sharing this widget's color group.\n * Shallow-merged: keys you provide overwrite, keys you omit survive.\n * Pass `null` as a value to remove a key.\n */\n publishData(partial: Record<string, unknown>): void;\n\n /** Update the title displayed in the widget header. */\n setTitle(title: string): void;\n}\n\n/** Injection token for the ScreenWidgetApi. Provided by ScreenWidgetComponent. */\nexport const SCREEN_WIDGET_API = new InjectionToken<ScreenWidgetApi>(\n 'SCREEN_WIDGET_API',\n);\n","import { InjectionToken } from '@angular/core';\nimport type { WidgetMeta } from '../models/widget-meta';\n\n/**\n * Multi-provider token. Each widget module provides its metadata via this token.\n * WorkspaceService collects all provided values to populate the widget registry.\n */\nexport const WIDGET_META = new InjectionToken<WidgetMeta>('WIDGET_META');\n","import { Injectable } from '@angular/core';\n\nexport interface GridConfig {\n columns: number;\n cellWidth: number;\n cellHeight: number;\n gap: number;\n containerWidth: number;\n}\n\nexport interface PixelRect {\n left: number;\n top: number;\n width: number;\n height: number;\n}\n\n/**\n * Pure grid math engine. No DOM manipulation — just calculations.\n * Angular owns all rendering via templates.\n */\n@Injectable({ providedIn: 'root' })\nexport class LayoutEngine {\n private readonly TARGET_CELL_WIDTH = 90;\n readonly MIN_COLUMNS = 6;\n readonly MAX_COLUMNS = 36;\n readonly CELL_HEIGHT = 20;\n readonly GAP = 4;\n\n readonly observers = new WeakMap<HTMLElement, () => void>();\n\n /** Compute column count for a given container width. */\n computeColumns(containerWidth: number): number {\n if (containerWidth <= 0) return this.MIN_COLUMNS;\n return Math.max(\n this.MIN_COLUMNS,\n Math.min(this.MAX_COLUMNS, Math.round(containerWidth / this.TARGET_CELL_WIDTH)),\n );\n }\n\n /** Build full grid config from container width. */\n getConfig(containerWidth: number): GridConfig {\n const columns = this.computeColumns(containerWidth);\n const cellWidth = (containerWidth - this.GAP * (columns + 1)) / columns;\n return {\n columns,\n cellWidth,\n cellHeight: this.CELL_HEIGHT,\n gap: this.GAP,\n containerWidth,\n };\n }\n\n /** Convert grid units to pixel rectangle. All units share the same uniform step. */\n rectToPixel(\n cfg: GridConfig,\n col: number,\n row: number,\n w: number,\n h: number,\n ): PixelRect {\n const step = cfg.cellHeight + cfg.gap;\n return {\n left: col * step + cfg.gap,\n top: row * step + cfg.gap,\n width: Math.max(1, w * step - cfg.gap),\n height: Math.max(1, h * step - cfg.gap),\n };\n }\n\n /** Snap pixel position to nearest uniform grid cell. */\n snapToGrid(\n cfg: GridConfig,\n px: number,\n py: number,\n ): { col: number; row: number } {\n const step = cfg.cellHeight + cfg.gap;\n return {\n col: Math.max(0, Math.round((px - cfg.gap) / step)),\n row: Math.max(0, Math.round((py - cfg.gap) / step)),\n };\n }\n\n /** Snap pixel size to nearest uniform grid size. */\n snapSize(\n cfg: GridConfig,\n pw: number,\n ph: number,\n minCols: number,\n minRows: number,\n ): { w: number; h: number } {\n const step = cfg.cellHeight + cfg.gap;\n const w = Math.max(\n minCols,\n Math.round((pw + cfg.gap) / step),\n );\n const h = Math.max(\n minRows,\n Math.round((ph + cfg.gap) / step),\n );\n return { w, h };\n }\n\n /** Observe container resizes and call back with new config. */\n observe(\n container: HTMLElement,\n onResize: (cfg: GridConfig) => void,\n ): void {\n const callback = () => onResize(this.getConfig(container.clientWidth));\n const observer = new ResizeObserver(() => callback());\n observer.observe(container);\n this.observers.set(container, () => observer.disconnect());\n // Fire initial.\n callback();\n }\n\n /** Stop observing a container. */\n unobserve(container: HTMLElement): void {\n this.observers.get(container)?.();\n this.observers.delete(container);\n }\n}\n","import { Injectable, signal, WritableSignal } from '@angular/core';\nimport { COLOR_GROUPS, type ColorGroup } from '../models';\n\n/**\n * Central singleton that tracks arbitrary JSON payloads per color group.\n *\n * Widgets assigned to the same color group all see the same accumulated\n * data. Each widget publishes partial JSON — the service shallow-merges\n * it into the group state. Keys a widget doesn't touch are left intact.\n *\n * To remove a key you previously set, publish it as `null`.\n *\n * Persistence is handled by WorkspaceService via {@link getAllData} /\n * {@link setAllData}. This service does not touch localStorage directly.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class WidgetLinkService {\n private readonly state = new Map<ColorGroup, WritableSignal<Record<string, unknown>>>();\n\n constructor() {\n for (const color of COLOR_GROUPS) {\n this.state.set(color, signal<Record<string, unknown>>({}));\n }\n }\n\n // ---- readers --------------------------------------------------------------\n\n /** Get the reactive data signal for a color group. */\n getData(color: ColorGroup): WritableSignal<Record<string, unknown>> {\n return this.state.get(color)!;\n }\n\n /** Read the current data value (non-reactive snapshot). */\n getDataSnapshot(color: ColorGroup): Record<string, unknown> {\n return this.state.get(color)!();\n }\n\n // ---- writers --------------------------------------------------------------\n\n /**\n * Publish a partial JSON payload to a color group.\n *\n * Shallow-merged with the existing state:\n * - New keys are added.\n * - Existing keys the caller provides are overwritten.\n * - Keys the caller does NOT provide survive untouched.\n * - Keys with `null` or `undefined` values are removed.\n */\n publishData(color: ColorGroup, partial: Record<string, unknown>): void {\n const current = this.state.get(color)!();\n const merged: Record<string, unknown> = { ...current };\n\n for (const [key, value] of Object.entries(partial)) {\n if (value === null || value === undefined) {\n delete merged[key];\n } else {\n merged[key] = value;\n }\n }\n\n this.state.get(color)!.set(merged);\n }\n\n // ---- bulk -----------------------------------------------------------------\n\n /** Reset all color groups to empty state. */\n resetAll(): void {\n for (const [, data] of this.state) {\n data.set({});\n }\n }\n\n // ---- persistence helpers (called by WorkspaceService) ---------------------\n\n /**\n * Return a snapshot of all color group data for serialization.\n * Called by WorkspaceService during save.\n */\n getAllData(): Record<string, Record<string, unknown>> {\n const snapshot: Record<string, Record<string, unknown>> = {};\n for (const [color, sig] of this.state) {\n snapshot[color] = sig();\n }\n return snapshot;\n }\n\n /**\n * Restore color group data from a previously saved snapshot.\n * Called by WorkspaceService during load.\n */\n setAllData(data: Record<string, Record<string, unknown>>): void {\n for (const color of COLOR_GROUPS) {\n this.state.get(color)!.set(data[color] ?? {});\n }\n }\n}\n","import { Injectable, inject, signal } from '@angular/core';\nimport type { WidgetMeta, WidgetPanelState, WidgetWindowState } from '../models';\nimport { WIDGET_META } from '../tokens';\nimport { WidgetLinkService } from './widget-link.service';\n\nconst STORAGE_KEY = 'janus-workspace';\nconst HB_PREFIX = 'janus-hb-';\n/** Seconds before a window's heartbeat is considered stale. */\nconst HB_STALE_MS = 10_000;\n\ninterface WorkspaceSnapshot {\n windows: WidgetWindowState[];\n colorData: Record<string, Record<string, unknown>>;\n}\n\n/** Generates a short unique ID. */\nfunction uid(): string {\n return crypto.randomUUID();\n}\n\n/** Default bounds for a newly created window. */\nfunction defaultBounds() {\n return { x: 100, y: 100, width: 1200, height: 800 };\n}\n\n/**\n * Central singleton that owns the full workspace state:\n * an array of WidgetWindows, each containing a grid of widget panels.\n *\n * All mutations flow through this service so that persistence and\n * cross-window sync (BroadcastChannel) stay consistent.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class WorkspaceService {\n // ---- state ----------------------------------------------------------------\n\n /** All windows in the workspace. */\n readonly windows = signal<WidgetWindowState[]>([]);\n\n /** Reactive list of registered widget type strings (for dropdowns). */\n readonly widgetTypes = signal<string[]>([]);\n\n /** Reactive list of widget labels (for dropdown display). */\n readonly widgetLabels = signal<string[]>([]);\n\n /** Registry mapping widget type strings to their metadata + component class. */\n readonly widgetRegistry = new Map<string, WidgetMeta>();\n\n readonly #widgetLink = inject(WidgetLinkService);\n\n constructor() {\n const snapshot = this.#load();\n\n // Sweep orphaned heartbeat keys that don't match any existing window.\n this.#cleanupHeartbeats(snapshot.windows);\n\n // Restore color-linked data before widget windows so widgets see it on init.\n this.#widgetLink.setAllData(snapshot.colorData);\n\n // main-window must always be open — guard against stale / tampered data.\n snapshot.windows = snapshot.windows.map((w) =>\n w.id === 'main-window' ? { ...w, state: 'open' as const } : w,\n );\n\n this.windows.set(snapshot.windows);\n\n // Collect all widget metadata provided via DI (multi-provider injection token).\n const metas = inject(WIDGET_META, { optional: true });\n if (metas) {\n for (const meta of [metas].flat()) {\n this.#register(meta);\n }\n }\n\n // Cross-window sync: listen for localStorage changes from other tabs/popups.\n window.addEventListener('storage', (event: StorageEvent) => {\n if (event.key === STORAGE_KEY && event.newValue) {\n try {\n const parsed = JSON.parse(event.newValue);\n if (\n parsed &&\n typeof parsed === 'object' &&\n Array.isArray(parsed.windows)\n ) {\n this.windows.set(parsed.windows as WidgetWindowState[]);\n if (parsed.colorData) {\n this.#widgetLink.setAllData(\n parsed.colorData as Record<string, Record<string, unknown>>,\n );\n }\n }\n } catch {\n // Corrupt data — ignore.\n }\n }\n });\n\n // Detect stale popup heartbeats — only in the main window (not popups).\n // Popups have their own sessionStorage, so their checker would lack the\n // \"janus-closed-*\" flags and incorrectly process other windows.\n if (!window.opener) {\n setInterval(() => {\n const now = Date.now();\n const current = this.windows();\n let changed = false;\n const toRemove = new Set<string>();\n const staleHbIds: string[] = [];\n const updated = current.map((win) => {\n // Only process popup windows (not main-window).\n if (win.id === 'main-window') return win;\n const hbKey = HB_PREFIX + win.id;\n const hb = localStorage.getItem(hbKey);\n if (!hb || now - parseInt(hb, 10) > HB_STALE_MS) {\n staleHbIds.push(win.id);\n if (win.widgets.length === 0) {\n changed = true;\n toRemove.add(win.id);\n return win; // will be filtered out below\n }\n // If the user intentionally closed this popup (state === 'closed'),\n // leave it as-is — it appears in the reopen dropdown.\n if (win.state === 'closed') {\n return win;\n }\n // Still 'open' with a stale heartbeat — either closePopupWindow\n // hasn't run yet (rare race) or this is after a refresh. Set\n // state to 'closed' so it appears in the reopen dropdown.\n changed = true;\n return { ...win, state: 'closed' as const };\n }\n return win;\n });\n if (changed) {\n this.windows.set(\n toRemove.size > 0\n ? updated.filter((w) => !toRemove.has(w.id))\n : updated,\n );\n this.#save();\n }\n // Clean up heartbeat keys we've already processed.\n for (const id of staleHbIds) {\n localStorage.removeItem(HB_PREFIX + id);\n }\n }, 5_000);\n }\n }\n\n // ---- public API -----------------------------------------------------------\n\n /** Get metadata for a widget type. */\n getWidgetMeta(type: string): WidgetMeta | undefined {\n return this.widgetRegistry.get(type);\n }\n\n // ---- window operations ----------------------------------------------------\n\n /** Create a new empty WidgetWindow and add it to the workspace. */\n addWindow(title = 'My Window'): WidgetWindowState {\n const win: WidgetWindowState = {\n id: uid(),\n title,\n bounds: defaultBounds(),\n minimized: false,\n state: 'open',\n widgets: [],\n };\n this.windows.update((w) => [...w, win]);\n this.#save();\n return win;\n }\n\n /** Remove a window by ID. The last remaining window cannot be removed. */\n removeWindow(windowId: string): void {\n const current = this.windows();\n if (current.length <= 1) return;\n this.windows.set(current.filter((win) => win.id !== windowId));\n this.#save();\n }\n\n /** Update a window's screen bounds (position / size). */\n updateWindowBounds(\n windowId: string,\n bounds: WidgetWindowState['bounds'],\n ): void {\n this.windows.update((w) =>\n w.map((win) => (win.id === windowId ? { ...win, bounds } : win)),\n );\n this.#save();\n }\n\n /** Toggle minimized state. */\n toggleMinimize(windowId: string): void {\n this.windows.update((w) =>\n w.map((win) =>\n win.id === windowId ? { ...win, minimized: !win.minimized } : win,\n ),\n );\n this.#save();\n }\n\n /** Set a window's lifecycle state ('open' or 'closed'). */\n setWindowState(windowId: string, state: 'open' | 'closed'): void {\n // main-window can never be closed.\n if (windowId === 'main-window' && state === 'closed') return;\n this.windows.update((w) =>\n w.map((win) => (win.id === windowId ? { ...win, state } : win)),\n );\n this.#save();\n }\n\n /** Set a window's display title. Empty / blank titles default to 'My Window'. */\n setWindowTitle(windowId: string, title: string): void {\n const safe = title.trim() || 'My Window';\n this.windows.update((w) =>\n w.map((win) => (win.id === windowId ? { ...win, title: safe } : win)),\n );\n this.#save();\n }\n\n // ---- widget operations ----------------------------------------------------\n\n /**\n * Add a widget panel to a specific window.\n * Uses the widget's registered metadata for default sizing.\n */\n addWidget(\n windowId: string,\n type: string,\n ): WidgetPanelState | undefined {\n const meta = this.widgetRegistry.get(type);\n const panel: WidgetPanelState = {\n id: uid(),\n type,\n gridX: 0,\n gridY: 0,\n gridCols: meta?.defaultCols ?? 16,\n gridRows: meta?.defaultRows ?? 3,\n };\n let created: WidgetPanelState | undefined;\n\n this.windows.update((wins) =>\n wins.map((win) => {\n if (win.id !== windowId) return win;\n created = panel;\n return { ...win, widgets: [...win.widgets, panel] };\n }),\n );\n this.#save();\n return created;\n }\n\n /** Remove a widget panel by its ID. */\n removeWidget(windowId: string, widgetId: string): void {\n this.windows.update((wins) =>\n wins.map((win) => {\n if (win.id !== windowId) return win;\n return {\n ...win,\n widgets: win.widgets.filter((w) => w.id !== widgetId),\n };\n }),\n );\n this.#save();\n }\n\n /** Update a widget's grid position and/or size. */\n updateWidgetLayout(\n windowId: string,\n widgetId: string,\n patch: Partial<\n Pick<WidgetPanelState, 'gridX' | 'gridY' | 'gridCols' | 'gridRows'>\n >,\n ): void {\n this.windows.update((wins) =>\n wins.map((win) => {\n if (win.id !== windowId) return win;\n return {\n ...win,\n widgets: win.widgets.map((w) =>\n w.id === widgetId ? { ...w, ...patch } : w,\n ),\n };\n }),\n );\n this.#save();\n }\n\n /** Set the color group for a widget panel. */\n setWidgetColorGroup(\n windowId: string,\n widgetId: string,\n colorGroup: WidgetPanelState['colorGroup'],\n ): void {\n this.windows.update((wins) =>\n wins.map((win) => {\n if (win.id !== windowId) return win;\n return {\n ...win,\n widgets: win.widgets.map((w) =>\n w.id === widgetId ? { ...w, colorGroup } : w,\n ),\n };\n }),\n );\n this.#save();\n }\n\n // ---- persistence ----------------------------------------------------------\n\n /** Serialize the entire workspace to localStorage. */\n save(): void {\n this.#save();\n }\n\n /** Replace all windows with a previously saved snapshot. */\n restore(snapshot: WidgetWindowState[]): void {\n this.windows.set(snapshot);\n this.#save();\n }\n\n // ---- private helpers ------------------------------------------------------\n\n #register(meta: WidgetMeta): void {\n this.widgetRegistry.set(meta.type, meta);\n this.widgetTypes.set(Array.from(this.widgetRegistry.keys()));\n this.widgetLabels.set(\n Array.from(this.widgetRegistry.values()).map((m) => m.label),\n );\n }\n\n #save(): void {\n try {\n const snapshot: WorkspaceSnapshot = {\n windows: this.windows(),\n colorData: this.#widgetLink.getAllData(),\n };\n localStorage.setItem(STORAGE_KEY, JSON.stringify(snapshot));\n } catch {\n // localStorage unavailable — workspace still works in memory.\n }\n }\n\n /** Remove heartbeat keys that don't belong to any existing window. */\n #cleanupHeartbeats(windows: WidgetWindowState[]): void {\n const knownIds = new Set(windows.map((w) => w.id));\n for (let i = localStorage.length - 1; i >= 0; i--) {\n const key = localStorage.key(i);\n if (key?.startsWith(HB_PREFIX)) {\n const id = key.slice(HB_PREFIX.length);\n if (!knownIds.has(id)) {\n localStorage.removeItem(key);\n }\n }\n }\n }\n\n #load(): WorkspaceSnapshot {\n try {\n const raw = localStorage.getItem(STORAGE_KEY);\n if (raw) {\n const parsed = JSON.parse(raw);\n\n // Handle legacy format (plain array of windows).\n if (Array.isArray(parsed) && parsed.length > 0) {\n const windows = parsed.map(\n ({ detached: _, ...rest }: Record<string, unknown>) =>\n ({ ...rest, state: rest['state'] ?? 'open', title: rest['title'] || 'My Window' }) as unknown as WidgetWindowState,\n );\n return { windows, colorData: {} };\n }\n\n // Handle new unified format.\n if (parsed && typeof parsed === 'object' && Array.isArray(parsed.windows)) {\n // Strip legacy `detached` field, default missing `state` / `title`.\n const windows = parsed.windows.map(\n ({ detached: _, ...rest }: Record<string, unknown>) =>\n ({ ...rest, state: rest['state'] ?? 'open', title: rest['title'] || 'My Window' }) as unknown as WidgetWindowState,\n );\n return {\n windows,\n colorData: (parsed.colorData as Record<string, Record<string, unknown>>) ?? {},\n };\n }\n }\n } catch {\n // Corrupt data or localStorage unavailable — start fresh.\n }\n // Default workspace: one empty window, no color data.\n return {\n windows: [\n {\n id: 'main-window',\n title: 'Main',\n bounds: defaultBounds(),\n minimized: false,\n state: 'open' as const,\n widgets: [],\n },\n ],\n colorData: {},\n };\n }\n}\n","/**\n * Format a number to a fixed number of decimal places.\n */\nexport function fmt(value: number, decimals = 2): string {\n return value.toFixed(decimals);\n}\n","import {\n Directive,\n computed,\n inject,\n input,\n signal,\n type Signal,\n} from '@angular/core';\nimport type { WidgetMeta } from '../models/widget-meta';\nimport { COLOR_GROUPS, COLOR_GROUP_HEX, type ColorGroup } from '../models/color-group';\nimport { WorkspaceService } from '../services/workspace-service';\nimport { WidgetLinkService } from '../services/widget-link.service';\n\n/**\n * Abstract base class for all screen widgets.\n *\n * Provides the shared state and logic that every widget needs:\n * - Inputs: widgetId, windowId, meta\n * - Reactive signals: title, colorGroup, data\n * - Action methods: setTitle, publishData, onColorGroupChange, onRemove\n * - Color picker data: colors, colorHex\n *\n * Concrete widgets extend this class and use {@link WidgetChromeComponent}\n * in their template to render the common chrome (titlebar, color picker,\n * remove button) while projecting their own content into the body slot.\n *\n * All members are `protected` so inheriting widgets can access them\n * directly — no dependency injection token needed.\n */\n@Directive()\nexport abstract class ScreenWidgetBase {\n // ---- inputs ------------------------------------------------------------\n\n /** Unique widget instance ID — provided by WidgetWindow. */\n readonly widgetId = input.required<string>();\n\n /** ID of the parent window — provided by WidgetWindow. */\n readonly windowId = input.required<string>();\n\n /** Widget metadata (type, label, default sizing, etc.). */\n readonly meta = input.required<WidgetMeta>();\n\n // ---- services ----------------------------------------------------------\n\n protected readonly workspace = inject(WorkspaceService);\n protected readonly widgetLink = inject(WidgetLinkService);\n\n // ---- reactive state ----------------------------------------------------\n\n /** Overridable title — starts from meta().label, settable via setTitle(). */\n readonly title: Signal<string> = computed(\n () => this.#overriddenTitle() || this.meta().label,\n );\n\n readonly #overriddenTitle = signal<string>('');\n\n /** The color group for this widget, read from the workspace state. */\n readonly colorGroup = computed<ColorGroup | undefined>(() => {\n const win = this.workspace\n .windows()\n .find((w) => w.id === this.windowId());\n return win?.widgets.find((p) => p.id === this.widgetId())?.colorGroup;\n });\n\n /**\n * The accumulated JSON data for this widget's color group.\n * Automatically tracks the WidgetLinkService signal for whatever\n * color group is currently assigned.\n */\n readonly data = computed<Record<string, unknown>>(() => {\n const cg = this.colorGroup();\n return cg ? this.widgetLink.getData(cg)() : {};\n });\n\n // ---- color picker data -------------------------------------------------\n\n protected readonly colors = COLOR_GROUPS;\n protected readonly colorHex = COLOR_GROUP_HEX;\n\n // ---- action methods ----------------------------------------------------\n\n /** Allow the widget to override the header title at runtime. */\n setTitle(title: string): void {\n this.#overriddenTitle.set(title);\n }\n\n /**\n * Publish partial JSON data to all widgets sharing this widget's color group.\n * Shallow-merged: keys you provide overwrite, keys you omit survive.\n * Pass `null` as a value to remove a key. No-op if no color group assigned.\n *\n * @example\n * this.publishData({ symbol: 'AAPL' });\n * this.publishData({ resistance: 543.21 });\n */\n publishData(partial: Record<string, unknown>): void {\n const cg = this.colorGroup();\n if (cg) {\n this.widgetLink.publishData(cg, partial);\n this.workspace.save();\n }\n }\n\n /** Update the color group for this widget in the workspace. */\n onColorGroupChange(cg: ColorGroup | undefined): void {\n this.workspace.setWidgetColorGroup(\n this.windowId(),\n this.widgetId(),\n cg,\n );\n }\n\n /** Remove this widget from its parent window. */\n onRemove(): void {\n this.workspace.removeWidget(this.windowId(), this.widgetId());\n }\n\n /** Convenience alias for the color picker dropdown. */\n selectColor(color: ColorGroup | undefined): void {\n this.onColorGroupChange(color);\n }\n}\n","import {\n makeEnvironmentProviders,\n type EnvironmentProviders,\n} from '@angular/core';\nimport type { WidgetMeta } from '../models/widget-meta';\nimport { WIDGET_META } from '../tokens/widget-meta.token';\n\n/**\n * Register a widget via the WIDGET_META multi-provider token.\n * Call this from a root-level provider factory to make the widget\n * discoverable by WorkspaceService.\n *\n * The `component` field should point to the full widget component\n * (the one that extends {@link ScreenWidgetBase} and includes\n * the {@link WidgetChromeComponent} in its template).\n *\n * @example\n * export function provideWatchlistWidget(): EnvironmentProviders {\n * return provideWidget({\n * type: 'watchlist',\n * component: Watchlist,\n * label: 'Watchlist',\n * defaultCols: 16,\n * defaultRows: 6,\n * minCols: 8,\n * minRows: 3,\n * });\n * }\n */\nexport function provideWidget(meta: WidgetMeta): EnvironmentProviders {\n return makeEnvironmentProviders([\n { provide: WIDGET_META, useValue: meta, multi: true },\n ]);\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n input,\n output,\n} from '@angular/core';\nimport type { ColorGroup } from '../../models/color-group';\nimport { COLOR_GROUPS, COLOR_GROUP_HEX } from '../../models/color-group';\n\n/**\n * Reusable widget chrome component that renders the common titlebar:\n * color-group picker, dynamic title, and remove button.\n *\n * Uses `<ng-content>` to project the widget-specific body content.\n *\n * This component is **purely presentational** — all business logic\n * (workspace mutations, symbol linking) lives in {@link ScreenWidgetBase}\n * and is wired up by the concrete widget's template.\n */\n@Component({\n selector: 'janus-widget-chrome',\n imports: [],\n templateUrl: './widget-chrome.html',\n styleUrl: './widget-chrome.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class WidgetChromeComponent {\n /** The current title text to display in the header. */\n readonly title = input.required<string>();\n\n /** The current color group, or undefined if unlinked. */\n readonly colorGroup = input<ColorGroup | undefined>();\n\n /** Emitted when the user selects a different color group (or \"No link\"). */\n readonly colorChange = output<ColorGroup | undefined>();\n\n /** Emitted when the user clicks the remove (×) button. */\n readonly remove = output<void>();\n\n // ---- color picker data -------------------------------------------------\n\n protected readonly colors = COLOR_GROUPS;\n protected readonly colorHex = COLOR_GROUP_HEX;\n\n // ---- template helpers --------------------------------------------------\n\n protected selectColor(color: ColorGroup | undefined): void {\n this.colorChange.emit(color);\n }\n\n protected onRemove(): void {\n this.remove.emit();\n }\n}\n","<div class=\"widget-chrome\">\n <header class=\"widget-header\">\n <div class=\"widget-left\">\n <div class=\"dropdown color-picker\">\n <i\n class=\"bi bi-list color-burger dropdown-toggle\"\n [style.color]=\"colorGroup() ? colorHex[colorGroup()!] : 'var(--bs-secondary-color)'\"\n [title]=\"colorGroup() ? 'Linked to ' + colorGroup() : 'Link to color group'\"\n data-bs-toggle=\"dropdown\"\n aria-expanded=\"false\"\n role=\"button\"\n tabindex=\"0\"\n ></i>\n <div class=\"dropdown-menu\">\n <button\n class=\"dropdown-item\"\n type=\"button\"\n (click)=\"selectColor(undefined)\"\n >\n <span class=\"color-swatch color-swatch--none\"></span>\n <span class=\"color-label\">No link</span>\n </button>\n @for (c of colors; track c) {\n <button\n class=\"dropdown-item\"\n [class.active]=\"colorGroup() === c\"\n type=\"button\"\n (click)=\"selectColor(c)\"\n >\n <span\n class=\"color-swatch\"\n [style.background-color]=\"colorHex[c]\"\n ></span>\n <span class=\"color-label\">{{ c }}</span>\n </button>\n }\n </div>\n </div>\n\n <span class=\"widget-title\">{{ title() }}</span>\n </div>\n\n <div class=\"widget-controls\">\n <button\n class=\"header-btn header-btn--remove\"\n title=\"Remove widget\"\n (click)=\"onRemove()\"\n >\n &times;\n </button>\n </div>\n </header>\n\n <div class=\"widget-chrome-body\">\n <ng-content></ng-content>\n </div>\n</div>\n","import {\n AfterViewInit,\n Component,\n computed,\n ElementRef,\n inject,\n input,\n OnDestroy,\n signal,\n viewChild,\n} from '@angular/core';\nimport { NgComponentOutlet } from '@angular/common';\nimport type { WidgetPanelState } from '../../models';\nimport type { WidgetMeta } from '../../models';\nimport type { WidgetWindowState } from '../../models';\nimport type { PixelRect, GridConfig } from '../../services';\nimport { LayoutEngine } from '../../services';\nimport { WorkspaceService } from '../../services';\n\n@Component({\n selector: 'janus-widget-window',\n imports: [NgComponentOutlet],\n templateUrl: './widget-window.html',\n styleUrl: './widget-window.scss',\n})\nexport class WidgetWindow implements AfterViewInit, OnDestroy {\n readonly windowId = input.required<string>();\n\n private readonly workspace = inject(WorkspaceService);\n private readonly engine = inject(LayoutEngine);\n\n readonly bodyEl = viewChild.required<ElementRef<HTMLElement>>('windowBody');\n\n readonly availableTypes = signal<string[]>([]);\n readonly availableLabels = signal<string[]>([]);\n\n readonly cfg = signal<GridConfig>({ columns: 12, cellWidth: 90, cellHeight: 20, gap: 4, containerWidth: 0 });\n\n /** Active intervals for polling popup closure. */\n private readonly popupIntervals = new Set<ReturnType<typeof setInterval>>();\n\n /** Dynamic background grid that matches our uniform layout step. */\n protected readonly gridBgSize = computed(() => {\n const c = this.cfg();\n const step = c.cellHeight + c.gap;\n return `${step}px ${step}px`;\n });\n\n /** Offset the background so dots land at the center of gap intersections. */\n protected readonly gridBgPosition = computed(() => {\n const c = this.cfg();\n return `${c.gap / 2}px ${c.gap / 2}px`;\n });\n\n protected readonly widgets = computed<WidgetPanelState[]>(\n () => this.workspace.windows().find((w) => w.id === this.windowId())?.widgets ?? [],\n );\n\n protected readonly widgetRects = computed<Map<string, PixelRect>>(() => {\n const c = this.cfg();\n const map = new Map<string, PixelRect>();\n for (const w of this.widgets()) {\n map.set(w.id, this.engine.rectToPixel(c, w.gridX, w.gridY, w.gridCols, w.gridRows));\n }\n return map;\n });\n\n /** All popup windows (open or closed), for the window dropdown. */\n protected readonly popupWindows = computed(() =>\n this.workspace.windows().filter((w) => w.id !== 'main-window'),\n );\n\n /** Popup windows the user has intentionally closed. */\n protected readonly closedWindows = computed(() =>\n this.popupWindows().filter((w) => w.state === 'closed'),\n );\n\n /** Title of the current window (reactive). */\n protected readonly windowTitle = computed(() =>\n this.workspace.windows().find((w) => w.id === this.windowId())?.title ?? '',\n );\n\n /** Title text width estimate (14px font, ~8.4px avg char width, + 12px padding). */\n protected readonly titleWidth = computed(() =>\n Math.max(this.windowTitle().length * 8.4 + 12, 200),\n );\n\n private editingTitle = signal(false);\n\n constructor() {\n const types = this.workspace.widgetTypes;\n const labels = this.workspace.widgetLabels;\n queueMicrotask(() => {\n this.availableTypes.set(types());\n this.availableLabels.set(labels());\n });\n }\n\n ngAfterViewInit(): void {\n this.engine.observe(this.bodyEl().nativeElement, (c) => this.cfg.set(c));\n }\n\n ngOnDestroy(): void {\n this.engine.unobserve(this.bodyEl().nativeElement);\n for (const id of this.popupIntervals) {\n clearInterval(id);\n }\n this.popupIntervals.clear();\n }\n\n addWidget(type: string): void {\n this.workspace.addWidget(this.windowId(), type);\n }\n\n /** Create a new chromeless popup window containing a fresh WidgetWindow. */\n protected openNewWindow(existingId?: string): void {\n let winId: string;\n\n if (existingId) {\n // Reopening a previously closed window — set state back to 'open'.\n this.workspace.setWindowState(existingId, 'open');\n winId = existingId;\n } else {\n const win = this.workspace.addWindow();\n winId = win.id;\n }\n\n const win = this.workspace.windows().find((w) => w.id === winId);\n const bounds = win?.bounds ?? { x: 100, y: 100, width: 1200, height: 800 };\n const url = `${window.location.origin}/window/${winId}`;\n const popup = window.open(\n url,\n `janus-win-${winId}`,\n `width=${bounds.width},height=${bounds.height},left=${bounds.x},top=${bounds.y}`,\n );\n\n if (!popup) {\n // Popup blocked — remove the window since it can never be shown.\n this.workspace.removeWindow(winId);\n return;\n }\n\n // Poll for popup closure.\n const interval = setInterval(() => {\n if (popup.closed) {\n this.closePopupWindow(winId);\n clearInterval(interval);\n this.popupIntervals.delete(interval);\n }\n }, 1000);\n this.popupIntervals.add(interval);\n }\n\n /** Reopen a previously closed popup window. */\n protected reopenWindow(windowId: string): void {\n this.openNewWindow(windowId);\n }\n\n /** Permanently discard a closed window and all its widgets. */\n protected discardWindow(windowId: string): void {\n localStorage.removeItem(`janus-hb-${windowId}`);\n this.workspace.removeWindow(windowId);\n }\n\n /** Reopen all previously closed popup windows at once. */\n protected reopenAllClosed(): void {\n for (const cw of this.closedWindows()) {\n this.reopenWindow(cw.id);\n }\n }\n\n /**\n * Handle popup closure: discard empty windows, keep windows with content\n * saved in localStorage (hidden from the main workspace).\n */\n private closePopupWindow(windowId: string): void {\n const win = this.workspace.windows().find((w) => w.id === windowId);\n if (!win) return;\n\n if (win.widgets.length === 0) {\n this.workspace.removeWindow(windowId);\n } else {\n this.workspace.setWindowState(windowId, 'closed');\n }\n }\n\n // ---- title editing -------------------------------------------------------\n\n protected onTitleFocus(event: FocusEvent): void {\n this.editingTitle.set(true);\n (event.target as HTMLInputElement).select();\n }\n\n protected onTitleEnter(event: Event): void {\n (event.target as HTMLInputElement).blur();\n }\n\n protected onTitleBlur(event: FocusEvent): void {\n this.editingTitle.set(false);\n const input = event.target as HTMLInputElement;\n this.workspace.setWindowTitle(this.windowId(), input.value);\n }\n\n protected getMeta(type: string): WidgetMeta | undefined {\n return this.workspace.getWidgetMeta(type);\n }\n\n protected getRect(widgetId: string): PixelRect {\n return this.widgetRects().get(widgetId) ?? { left: 0, top: 0, width: 100, height: 100 };\n }\n\n protected onDragStart(event: MouseEvent, w: WidgetPanelState): void {\n // Only start drag from the widget's title bar, not from content or interactive children\n const target = event.target as HTMLElement | null;\n if (!target?.closest('.widget-header') || target?.closest('button, input, select, a')) {\n return;\n }\n\n event.preventDefault();\n document.body.classList.add('gs-dragging');\n\n const startX = event.clientX;\n const startY = event.clientY;\n const startCol = w.gridX;\n const startRow = w.gridY;\n const id = w.id;\n const winId = this.windowId();\n const workspace = this.workspace;\n const engine = this.engine;\n const el = document.querySelector(`[data-wid=\"${id}\"]`) as HTMLElement | null;\n\n // Compute start position from grid coords, NOT from the DOM.\n // DOM offsetLeft can be mid-transition (CSS transition: left 0.15s)\n // and would give wrong values for a new drag started during animation.\n const c0 = this.cfg();\n const startRect = engine.rectToPixel(c0, startCol, startRow, w.gridCols, w.gridRows);\n const startOffsetX = startRect.left;\n const startOffsetY = startRect.top;\n\n const onMove = (e: MouseEvent) => {\n // Track pixel-for-pixel during drag, snap only on release\n const px = startOffsetX + (e.clientX - startX);\n const py = startOffsetY + (e.clientY - startY);\n if (el) {\n el.style.left = `${px}px`;\n el.style.top = `${py}px`;\n el.style.zIndex = '1000';\n }\n };\n\n const onUp = (e: MouseEvent) => {\n document.removeEventListener('mousemove', onMove);\n document.removeEventListener('mouseup', onUp);\n document.body.classList.remove('gs-dragging');\n const c = this.cfg();\n const px = startOffsetX + (e.clientX - startX);\n const py = startOffsetY + (e.clientY - startY);\n let { col, row } = engine.snapToGrid(c, px, py);\n\n // Collision avoidance: push down past any overlapping widgets\n const others = workspace.windows().find((win) => win.id === winId)?.widgets.filter((ow) => ow.id !== id) ?? [];\n for (const ow of others) {\n const colOverlap = col < ow.gridX + ow.gridCols && col + w.gridCols > ow.gridX;\n const rowOverlap = row < ow.gridY + ow.gridRows && row + w.gridRows > ow.gridY;\n if (colOverlap && rowOverlap) {\n row = Math.max(row, ow.gridY + ow.gridRows);\n }\n }\n\n if (col !== startCol || row !== startRow) {\n workspace.updateWidgetLayout(winId, id, { gridX: col, gridY: row });\n }\n // Set inline styles to the final snapped position so there's no\n // visual gap before Angular re-renders. Angular bindings will\n // confirm the same values on the next CD cycle.\n const finalRect = engine.rectToPixel(c, col, row, w.gridCols, w.gridRows);\n if (el) {\n el.style.left = `${finalRect.left}px`;\n el.style.top = `${finalRect.top}px`;\n el.style.zIndex = '';\n }\n };\n\n document.addEventListener('mousemove', onMove);\n document.addEventListener('mouseup', onUp);\n }\n\n protected onResizeStart(event: MouseEvent, w: WidgetPanelState): void {\n event.preventDefault();\n event.stopPropagation();\n const startX = event.clientX;\n const startY = event.clientY;\n const startW = w.gridCols;\n const startH = w.gridRows;\n const id = w.id;\n const winId = this.windowId();\n const workspace = this.workspace;\n const engine = this.engine;\n const meta = workspace.getWidgetMeta(w.type) ?? { minCols: 2, minRows: 2 };\n\n const onMove = (e: MouseEvent) => {\n const c = this.cfg();\n const step = c.cellHeight + c.gap;\n const dx = e.clientX - startX;\n const dy = e.clientY - startY;\n const pw = startW * step - c.gap + dx;\n const ph = startH * step - c.gap + dy;\n const { w: nw, h: nh } = engine.snapSize(c, pw, ph, meta.minCols, meta.minRows);\n const rect = engine.rectToPixel(c, w.gridX, w.gridY, nw, nh);\n const el = document.querySelector(`[data-wid=\"${id}\"]`) as HTMLElement | null;\n if (el) {\n el.style.width = `${rect.width}px`;\n el.style.height = `${rect.height}px`;\n }\n };\n\n const onUp = (e: MouseEvent) => {\n document.removeEventListener('mousemove', onMove);\n document.removeEventListener('mouseup', onUp);\n const c = this.cfg();\n const step = c.cellHeight + c.gap;\n const dx = e.clientX - startX;\n const dy = e.clientY - startY;\n const pw = startW * step - c.gap + dx;\n const ph = startH * step - c.gap + dy;\n const { w: nw, h: nh } = engine.snapSize(c, pw, ph, meta.minCols, meta.minRows);\n workspace.updateWidgetLayout(winId, id, { gridCols: nw, gridRows: nh });\n // Set inline styles to the final snapped size so there's no visual gap\n // before Angular re-renders.\n const finalRect = engine.rectToPixel(c, w.gridX, w.gridY, nw, nh);\n const el = document.querySelector(`[data-wid=\"${id}\"]`) as HTMLElement | null;\n if (el) {\n el.style.width = `${finalRect.width}px`;\n el.style.height = `${finalRect.height}px`;\n }\n };\n\n document.addEventListener('mousemove', onMove);\n document.addEventListener('mouseup', onUp);\n }\n}\n","<div class=\"widget-window\">\n <header class=\"window-header\">\n <input\n class=\"window-title-input\"\n type=\"text\"\n [value]=\"windowTitle()\"\n [style.width.px]=\"titleWidth()\"\n (focus)=\"onTitleFocus($event)\"\n (blur)=\"onTitleBlur($event)\"\n (keydown.enter)=\"onTitleEnter($event)\"\n spellcheck=\"false\"\n />\n <div class=\"window-controls\">\n <div class=\"dropdown\">\n <i\n class=\"bi bi-display-fill window-action-icon dropdown-toggle\"\n title=\"Windows\"\n data-bs-toggle=\"dropdown\"\n aria-expanded=\"false\"\n role=\"button\"\n tabindex=\"0\"\n ></i>\n <div class=\"dropdown-menu\">\n <button class=\"dropdown-item\" type=\"button\" (click)=\"openNewWindow()\">\n <i class=\"bi bi-plus-lg me-1\"></i> New empty window\n </button>\n @if (popupWindows().length) {\n <div class=\"dropdown-divider\"></div>\n @for (pw of popupWindows(); track pw.id) {\n <div class=\"dropdown-item-row\">\n @if (pw.state === 'open') {\n <span class=\"dropdown-item dropdown-item-grow disabled-text\">\n <i class=\"bi bi-circle-fill me-1 open-indicator\"></i>\n {{ pw.title }}\n </span>\n } @else {\n <button\n class=\"dropdown-item dropdown-item-grow\"\n type=\"button\"\n (click)=\"reopenWindow(pw.id)\"\n >\n <i class=\"bi bi-arrow-clockwise me-1\"></i>\n {{ pw.title }}\n </button>\n <button\n class=\"dropdown-item-delete\"\n type=\"button\"\n title=\"Discard window permanently\"\n (click)=\"discardWindow(pw.id)\"\n >\n <i class=\"bi bi-trash3\"></i>\n </button>\n }\n </div>\n }\n @if (closedWindows().length > 1) {\n <div class=\"dropdown-divider\"></div>\n <button class=\"dropdown-item\" type=\"button\" (click)=\"reopenAllClosed()\">\n <i class=\"bi bi-arrow-repeat me-1\"></i> Reopen all closed\n </button>\n }\n }\n </div>\n </div>\n <div class=\"dropdown\">\n\n\n <i\n class=\"bi bi-grid-1x2-fill window-action-icon dropdown-toggle\"\n title=\"Add Widget\"\n data-bs-toggle=\"dropdown\"\n aria-expanded=\"false\"\n role=\"button\"\n tabindex=\"0\"\n ></i>\n <div class=\"dropdown-menu\">\n @for (type of availableTypes(); track type; let i = $index) {\n <button\n class=\"dropdown-item\"\n type=\"button\"\n (click)=\"addWidget(type)\"\n >\n {{ availableLabels()[i] }}\n </button>\n }\n </div>\n </div>\n </div>\n </header>\n\n <div #windowBody class=\"window-body\"\n [style.background-size]=\"gridBgSize()\"\n [style.background-position]=\"gridBgPosition()\">\n @for (w of widgets(); track w.id) {\n <div\n class=\"grid-item\"\n [attr.data-wid]=\"w.id\"\n [style.left.px]=\"getRect(w.id).left\"\n [style.top.px]=\"getRect(w.id).top\"\n [style.width.px]=\"getRect(w.id).width\"\n [style.height.px]=\"getRect(w.id).height\"\n >\n <!-- Drag handle: mousedown triggers native drag -->\n <div class=\"drag-handle\" (mousedown)=\"onDragStart($event, w)\">\n <div class=\"grid-item-content\">\n @if (getMeta(w.type); as meta) {\n <ng-container\n *ngComponentOutlet=\"\n meta.component;\n inputs: { widgetId: w.id, windowId: windowId(), meta: meta }\n \"\n />\n }\n </div>\n <!-- Resize handle -->\n <div class=\"resize-handle\" (mousedown)=\"onResizeStart($event, w)\"></div>\n </div>\n </div>\n } @empty {\n <div class=\"empty-state\">\n <span class=\"empty-state-text\">\n No widgets added. Click the\n <i class=\"bi bi-grid-1x2-fill empty-state-icon\"></i>\n &ldquo;Add Widget&rdquo; button to add widgets to this screen.\n </span>\n </div>\n }\n </div>\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n inject,\n OnDestroy,\n OnInit,\n} from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { WidgetWindow } from '../../ui/widget-window/widget-window';\n\nconst HB_PREFIX = 'janus-hb-';\n\n@Component({\n selector: 'app-window-outlet',\n imports: [WidgetWindow],\n templateUrl: './window-outlet.html',\n styleUrl: './window-outlet.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class WindowOutlet implements OnInit, OnDestroy {\n private readonly route = inject(ActivatedRoute);\n\n protected windowId = '';\n\n private heartbeatInterval: ReturnType<typeof setInterval> | undefined;\n\n ngOnInit(): void {\n this.windowId = this.route.snapshot.paramMap.get('windowId') ?? '';\n\n // Heartbeat: write a timestamp to localStorage every 3 seconds.\n // The main WorkspaceService detects stale heartbeats to know when\n // this popup has truly closed (vs. just being refreshed).\n const hbKey = HB_PREFIX + this.windowId;\n localStorage.setItem(hbKey, Date.now().toString());\n this.heartbeatInterval = setInterval(() => {\n localStorage.setItem(hbKey, Date.now().toString());\n }, 3000);\n }\n\n ngOnDestroy(): void {\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n }\n // Do NOT remove the heartbeat key — let it expire naturally (10 s).\n // Removing it here races with closePopupWindow which sets the\n // sessionStorage flag; the heartbeat checker could run in between\n // and incorrectly undetach the window.\n }\n}\n","@if (windowId) {\n <janus-widget-window\n class=\"full-window\"\n [windowId]=\"windowId\"\n />\n}\n","import { Component } from '@angular/core';\n\n@Component({\n selector: 'lib-janusui',\n imports: [],\n template: `\n <p>\n janusui works!\n </p>\n `,\n styles: ``,\n})\nexport class Janusui {\n\n}\n","/*\n * Public API Surface of janusui\n */\n\nexport * from './lib/models';\nexport * from './lib/tokens';\nexport * from './lib/services';\nexport * from './lib/shared';\nexport * from './lib/widgets';\nexport * from './lib/ui';\nexport * from './lib/screens';\nexport * from './lib/janusui';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["HB_PREFIX"],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,24 @@
1
+ {
2
+ "name": "@janusui/janus-ui-library",
3
+ "version": "0.0.1",
4
+ "peerDependencies": {
5
+ "@angular/common": "^21.2.0",
6
+ "@angular/core": "^21.2.0"
7
+ },
8
+ "dependencies": {
9
+ "tslib": "^2.3.0"
10
+ },
11
+ "sideEffects": false,
12
+ "module": "fesm2022/janusui-janus-ui-library.mjs",
13
+ "typings": "types/janusui-janus-ui-library.d.ts",
14
+ "exports": {
15
+ "./package.json": {
16
+ "default": "./package.json"
17
+ },
18
+ ".": {
19
+ "types": "./types/janusui-janus-ui-library.d.ts",
20
+ "default": "./fesm2022/janusui-janus-ui-library.mjs"
21
+ }
22
+ },
23
+ "type": "module"
24
+ }