@ogidor/dashboard 1.0.12 → 1.0.13

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.
@@ -1 +1 @@
1
- {"version":3,"file":"ogidor-dashboard.mjs","sources":["../../src/app/custom-grid.component.ts","../../src/app/dashboard-state.service.ts","../../src/app/widget-renderer.component.ts","../../src/app/dashboard.component.ts","../../src/app/app.module.ts","../../src/public-api.ts","../../src/ogidor-dashboard.ts"],"sourcesContent":["import {\n Component, Input, Output, EventEmitter, ElementRef,\n ViewChild, OnDestroy, OnInit, NgZone, ChangeDetectorRef,\n ContentChild, TemplateRef,\n Directive, ChangeDetectionStrategy, OnChanges, SimpleChanges\n} from '@angular/core';\nimport { Widget } from './models';\n\n/**\n * Directive applied to the template that should be stamped inside each grid cell.\n * Usage:\n * <app-grid [widgets]=\"...\">\n * <ng-template gridCell let-widget=\"widget\">\n * <app-widget-renderer [widget]=\"widget\" ...></app-widget-renderer>\n * </ng-template>\n * </app-grid>\n */\n@Directive({ selector: '[gridCell]' })\nexport class GridCellDirective {\n constructor(public templateRef: TemplateRef<{ widget: Widget }>) {}\n}\n\n/* ═══════════════════════════════════════════════════════════════════════\n GRID ENGINE — pure data, zero DOM\n Handles collision detection, resolution, and compaction.\n Inspired by react-grid-layout / gridster algorithms.\n ═══════════════════════════════════════════════════════════════════════ */\n\ninterface GridRect {\n id: string;\n x: number;\n y: number;\n cols: number;\n rows: number;\n}\n\nclass GridEngine {\n\n /**\n * Check if two rects overlap.\n */\n static collides(a: GridRect, b: GridRect): boolean {\n return !(\n a.x + a.cols <= b.x ||\n b.x + b.cols <= a.x ||\n a.y + a.rows <= b.y ||\n b.y + b.rows <= a.y\n );\n }\n\n /**\n * Get ALL widgets that collide with `rect`.\n */\n static getAllCollisions(widgets: GridRect[], rect: GridRect): GridRect[] {\n return widgets.filter(w => w.id !== rect.id && GridEngine.collides(w, rect));\n }\n\n /**\n * Sort widgets top-to-bottom, left-to-right.\n */\n static sortByPosition(widgets: GridRect[]): GridRect[] {\n return [...widgets].sort((a, b) => a.y - b.y || a.x - b.x);\n }\n\n /**\n * Move a widget to (x, y) and push any colliding widgets downward.\n * Returns the full list with resolved positions.\n */\n static moveWidget(\n allWidgets: GridRect[],\n widget: GridRect,\n newX: number,\n newY: number,\n columns: number\n ): GridRect[] {\n const widgets = allWidgets.map(w => ({ ...w }));\n const moving = widgets.find(w => w.id === widget.id);\n if (!moving) return widgets;\n\n moving.x = Math.max(0, Math.min(newX, columns - moving.cols));\n moving.y = Math.max(0, newY);\n\n const sorted = GridEngine.sortByPosition(widgets);\n GridEngine.resolveCollisions(sorted, moving);\n return GridEngine.compact(sorted, columns);\n }\n\n /**\n * Resize a widget and push colliding widgets down.\n */\n static resizeWidget(\n allWidgets: GridRect[],\n widget: GridRect,\n newCols: number,\n newRows: number,\n columns: number\n ): GridRect[] {\n const widgets = allWidgets.map(w => ({ ...w }));\n const resizing = widgets.find(w => w.id === widget.id);\n if (!resizing) return widgets;\n\n resizing.cols = Math.max(1, Math.min(newCols, columns - resizing.x));\n resizing.rows = Math.max(1, newRows);\n\n const sorted = GridEngine.sortByPosition(widgets);\n GridEngine.resolveCollisions(sorted, resizing);\n return GridEngine.compact(sorted, columns);\n }\n\n /**\n * Push all widgets that collide with `movedWidget` downward, recursively.\n */\n private static resolveCollisions(widgets: GridRect[], movedWidget: GridRect): void {\n const collisions = GridEngine.getAllCollisions(widgets, movedWidget);\n for (const collider of collisions) {\n collider.y = movedWidget.y + movedWidget.rows;\n GridEngine.resolveCollisions(widgets, collider);\n }\n }\n\n /**\n * Compact the grid: move every widget as far up as possible without overlapping.\n */\n static compact(widgets: GridRect[], _columns: number): GridRect[] {\n const sorted = GridEngine.sortByPosition(widgets);\n const placed: GridRect[] = [];\n\n for (const widget of sorted) {\n widget.y = GridEngine.findCompactY(placed, widget);\n placed.push(widget);\n }\n\n return placed;\n }\n\n /**\n * Find the highest Y position a widget can occupy without overlapping any already-placed widget.\n */\n private static findCompactY(placed: GridRect[], widget: GridRect): number {\n let y = 0;\n while (true) {\n const test: GridRect = { ...widget, y };\n const collision = placed.find(p => GridEngine.collides(p, test));\n if (!collision) return y;\n y = collision.y + collision.rows;\n }\n }\n\n /**\n * Compute the total number of rows the grid needs.\n */\n static getGridHeight(widgets: GridRect[]): number {\n if (widgets.length === 0) return 0;\n return Math.max(...widgets.map(w => w.y + w.rows));\n }\n}\n\n/* ═══════════════════════════════════════════════════════════════════════\n CUSTOM GRID COMPONENT\n ═══════════════════════════════════════════════════════════════════════ */\n\n@Component({\n selector: 'app-grid',\n template: `\n <div\n #gridContainer\n class=\"grid-container\"\n [style.height.px]=\"containerHeight\"\n >\n <!-- Placeholder preview -->\n <div\n class=\"grid-placeholder\"\n *ngIf=\"placeholder\"\n [style.left.px]=\"placeholder.left\"\n [style.top.px]=\"placeholder.top\"\n [style.width.px]=\"placeholder.width\"\n [style.height.px]=\"placeholder.height\"\n ></div>\n\n <!-- Widget items -->\n <div\n *ngFor=\"let widget of widgets; trackBy: trackByFn\"\n class=\"grid-item\"\n [class.is-dragging]=\"dragging?.id === widget.id\"\n [class.is-resizing]=\"resizing?.id === widget.id\"\n [style.left.px]=\"getItemLeft(widget)\"\n [style.top.px]=\"getItemTop(widget)\"\n [style.width.px]=\"getItemWidth(widget)\"\n [style.height.px]=\"getItemHeight(widget)\"\n [style.z-index]=\"(dragging?.id === widget.id || resizing?.id === widget.id) ? 100 : 1\"\n (mousedown)=\"onDragStart($event, widget)\"\n >\n <!-- Content stamped from parent template, context carries the widget -->\n <ng-container\n *ngIf=\"cellTemplate\"\n [ngTemplateOutlet]=\"cellTemplate\"\n [ngTemplateOutletContext]=\"{ widget: widget }\"\n ></ng-container>\n\n <!-- Resize handle -->\n <div class=\"resize-handle\" (mousedown)=\"onResizeStart($event, widget)\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\">\n <path d=\"M11 1v10H1\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <path d=\"M11 5v6H5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <path d=\"M11 9v2H9\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n </div>\n </div>\n </div>\n `,\n styles: [`\n :host { display: block; width: 100%; height: 100%; }\n\n .grid-container {\n position: relative;\n width: 100%;\n min-height: 100%;\n transition: height 0.25s ease;\n }\n\n .grid-placeholder {\n position: absolute;\n background: var(--dash-placeholder-color, var(--dash-accent-color, #0a84ff));\n opacity: 0.12;\n border-radius: 24px;\n border: 2px dashed var(--dash-placeholder-color, var(--dash-accent-color, #0a84ff));\n transition: left 0.15s ease, top 0.15s ease, width 0.15s ease, height 0.15s ease;\n pointer-events: none;\n z-index: 0;\n }\n\n .grid-item {\n position: absolute;\n display: flex;\n flex-direction: column;\n transition: left 0.25s ease, top 0.25s ease, width 0.25s ease, height 0.25s ease;\n border-radius: 24px;\n overflow: hidden;\n }\n\n .grid-item.is-dragging,\n .grid-item.is-resizing {\n transition: none !important;\n opacity: 0.88;\n overflow: visible;\n }\n\n /* Resize Handle */\n .resize-handle {\n position: absolute;\n right: 4px;\n bottom: 4px;\n width: 22px;\n height: 22px;\n cursor: nwse-resize;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--dash-resize-handle-color, rgba(255,255,255,0.25));\n border-radius: 6px;\n transition: color 0.2s, background 0.2s;\n z-index: 20;\n }\n .resize-handle:hover {\n color: var(--dash-accent-color, #0a84ff);\n background: rgba(255,255,255,0.06);\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class CustomGridComponent implements OnInit, OnDestroy, OnChanges {\n @Input() widgets: Widget[] = [];\n @Input() columns: number = 12;\n @Input() gap: number = 16;\n @Input() rowHeight: number = 80;\n @Input() minItemCols: number = 1;\n @Input() minItemRows: number = 1;\n\n @Output() itemChanged = new EventEmitter<Widget>();\n @Output() layoutChanged = new EventEmitter<Widget[]>();\n\n @ViewChild('gridContainer', { static: true }) gridContainer!: ElementRef<HTMLDivElement>;\n\n /** The ng-template decorated with gridCell from the parent */\n @ContentChild(GridCellDirective, { read: TemplateRef }) cellTemplate!: TemplateRef<{ widget: Widget }>;\n\n placeholder: { left: number; top: number; width: number; height: number } | null = null;\n containerHeight = 400;\n\n dragging: {\n id: string;\n offsetX: number;\n offsetY: number;\n currentPixelX: number;\n currentPixelY: number;\n } | null = null;\n\n resizing: {\n id: string;\n startMouseX: number;\n startMouseY: number;\n startCols: number;\n startRows: number;\n currentPixelW: number;\n currentPixelH: number;\n } | null = null;\n\n private previewWidgets: GridRect[] = [];\n private boundMouseMove = this.onMouseMove.bind(this);\n private boundMouseUp = this.onMouseUp.bind(this);\n\n constructor(private zone: NgZone, private cdr: ChangeDetectorRef) {}\n\n ngOnInit() {\n this.compactAndApply();\n this.updateContainerHeight();\n this.zone.runOutsideAngular(() => {\n window.addEventListener('mousemove', this.boundMouseMove);\n window.addEventListener('mouseup', this.boundMouseUp);\n });\n }\n\n ngOnChanges(_changes: SimpleChanges) {\n this.updateContainerHeight();\n }\n\n ngOnDestroy() {\n window.removeEventListener('mousemove', this.boundMouseMove);\n window.removeEventListener('mouseup', this.boundMouseUp);\n }\n\n trackByFn(_index: number, item: Widget) { return item.id; }\n\n // ── Geometry ──\n\n private get cellWidth(): number {\n const containerW = this.gridContainer?.nativeElement?.clientWidth ?? 800;\n return (containerW - (this.columns - 1) * this.gap) / this.columns;\n }\n\n private colToPixel(col: number): number {\n return col * (this.cellWidth + this.gap);\n }\n\n private rowToPixel(row: number): number {\n return row * (this.rowHeight + this.gap);\n }\n\n private pixelToCol(px: number): number {\n return Math.round(px / (this.cellWidth + this.gap));\n }\n\n private pixelToRow(px: number): number {\n return Math.round(px / (this.rowHeight + this.gap));\n }\n\n private colsToPixelWidth(cols: number): number {\n return cols * this.cellWidth + (cols - 1) * this.gap;\n }\n\n private rowsToPixelHeight(rows: number): number {\n return rows * this.rowHeight + (rows - 1) * this.gap;\n }\n\n getItemLeft(w: Widget): number {\n return this.dragging?.id === w.id ? this.dragging.currentPixelX : this.colToPixel(w.x);\n }\n\n getItemTop(w: Widget): number {\n return this.dragging?.id === w.id ? this.dragging.currentPixelY : this.rowToPixel(w.y);\n }\n\n getItemWidth(w: Widget): number {\n return this.resizing?.id === w.id ? this.resizing.currentPixelW : this.colsToPixelWidth(w.cols);\n }\n\n getItemHeight(w: Widget): number {\n return this.resizing?.id === w.id ? this.resizing.currentPixelH : this.rowsToPixelHeight(w.rows);\n }\n\n // ── Drag ──\n\n onDragStart(event: MouseEvent, widget: Widget) {\n const target = event.target as HTMLElement;\n if (target.closest('button, input, select, textarea, a, .resize-handle')) return;\n event.preventDefault();\n event.stopPropagation();\n\n const rect = this.gridContainer.nativeElement.getBoundingClientRect();\n const itemLeft = this.colToPixel(widget.x);\n const itemTop = this.rowToPixel(widget.y);\n\n this.dragging = {\n id: widget.id,\n offsetX: event.clientX - rect.left - itemLeft,\n offsetY: event.clientY - rect.top - itemTop,\n currentPixelX: itemLeft,\n currentPixelY: itemTop,\n };\n this.previewWidgets = this.widgets.map(w => ({ id: w.id, x: w.x, y: w.y, cols: w.cols, rows: w.rows }));\n this.placeholder = {\n left: itemLeft, top: itemTop,\n width: this.colsToPixelWidth(widget.cols),\n height: this.rowsToPixelHeight(widget.rows),\n };\n this.cdr.markForCheck();\n }\n\n onResizeStart(event: MouseEvent, widget: Widget) {\n event.preventDefault();\n event.stopPropagation();\n this.resizing = {\n id: widget.id,\n startMouseX: event.clientX,\n startMouseY: event.clientY,\n startCols: widget.cols,\n startRows: widget.rows,\n currentPixelW: this.colsToPixelWidth(widget.cols),\n currentPixelH: this.rowsToPixelHeight(widget.rows),\n };\n this.previewWidgets = this.widgets.map(w => ({ id: w.id, x: w.x, y: w.y, cols: w.cols, rows: w.rows }));\n this.placeholder = {\n left: this.colToPixel(widget.x), top: this.rowToPixel(widget.y),\n width: this.colsToPixelWidth(widget.cols),\n height: this.rowsToPixelHeight(widget.rows),\n };\n this.cdr.markForCheck();\n }\n\n private onMouseMove(event: MouseEvent) {\n if (this.dragging) this.handleDragMove(event);\n else if (this.resizing) this.handleResizeMove(event);\n }\n\n private onMouseUp(_event: MouseEvent) {\n if (this.dragging) this.zone.run(() => this.finalizeDrag());\n else if (this.resizing) this.zone.run(() => this.finalizeResize());\n }\n\n private handleDragMove(event: MouseEvent) {\n if (!this.dragging) return;\n const rect = this.gridContainer.nativeElement.getBoundingClientRect();\n const widget = this.widgets.find(w => w.id === this.dragging!.id)!;\n if (!widget) return;\n\n let px = event.clientX - rect.left - this.dragging.offsetX;\n let py = event.clientY - rect.top - this.dragging.offsetY;\n px = Math.max(0, Math.min(px, rect.width - this.colsToPixelWidth(widget.cols)));\n py = Math.max(0, py);\n\n this.dragging.currentPixelX = px;\n this.dragging.currentPixelY = py;\n\n const targetCol = Math.max(0, Math.min(this.pixelToCol(px), this.columns - widget.cols));\n const targetRow = Math.max(0, this.pixelToRow(py));\n\n const resolved = GridEngine.moveWidget(\n this.previewWidgets,\n { id: widget.id, x: widget.x, y: widget.y, cols: widget.cols, rows: widget.rows },\n targetCol, targetRow, this.columns\n );\n\n this.placeholder = {\n left: this.colToPixel(targetCol), top: this.rowToPixel(targetRow),\n width: this.colsToPixelWidth(widget.cols),\n height: this.rowsToPixelHeight(widget.rows),\n };\n\n this.zone.run(() => {\n for (const rw of resolved) {\n if (rw.id === widget.id) continue;\n const w = this.widgets.find(ww => ww.id === rw.id);\n if (w) { w.x = rw.x; w.y = rw.y; }\n }\n this.updateContainerHeight();\n this.cdr.markForCheck();\n });\n }\n\n private finalizeDrag() {\n if (!this.dragging) return;\n const widget = this.widgets.find(w => w.id === this.dragging!.id)!;\n const targetCol = Math.max(0, Math.min(this.pixelToCol(this.dragging.currentPixelX), this.columns - widget.cols));\n const targetRow = Math.max(0, this.pixelToRow(this.dragging.currentPixelY));\n\n const resolved = GridEngine.moveWidget(\n this.widgets.map(w => ({ id: w.id, x: w.x, y: w.y, cols: w.cols, rows: w.rows })),\n { id: widget.id, x: widget.x, y: widget.y, cols: widget.cols, rows: widget.rows },\n targetCol, targetRow, this.columns\n );\n for (const rw of resolved) {\n const w = this.widgets.find(ww => ww.id === rw.id);\n if (w) { w.x = rw.x; w.y = rw.y; w.cols = rw.cols; w.rows = rw.rows; this.itemChanged.emit(w); }\n }\n this.dragging = null;\n this.placeholder = null;\n this.previewWidgets = [];\n this.updateContainerHeight();\n this.layoutChanged.emit(this.widgets);\n this.cdr.markForCheck();\n }\n\n private handleResizeMove(event: MouseEvent) {\n if (!this.resizing) return;\n const widget = this.widgets.find(w => w.id === this.resizing!.id)!;\n if (!widget) return;\n\n const dx = event.clientX - this.resizing.startMouseX;\n const dy = event.clientY - this.resizing.startMouseY;\n\n let newCols = Math.max(this.minItemCols, Math.round((this.colsToPixelWidth(this.resizing.startCols) + dx) / (this.cellWidth + this.gap)));\n let newRows = Math.max(this.minItemRows, Math.round((this.rowsToPixelHeight(this.resizing.startRows) + dy) / (this.rowHeight + this.gap)));\n newCols = Math.min(newCols, this.columns - widget.x);\n\n this.resizing.currentPixelW = this.colsToPixelWidth(newCols);\n this.resizing.currentPixelH = this.rowsToPixelHeight(newRows);\n\n const resolved = GridEngine.resizeWidget(\n this.previewWidgets,\n { id: widget.id, x: widget.x, y: widget.y, cols: widget.cols, rows: widget.rows },\n newCols, newRows, this.columns\n );\n\n this.placeholder = {\n left: this.colToPixel(widget.x), top: this.rowToPixel(widget.y),\n width: this.colsToPixelWidth(newCols),\n height: this.rowsToPixelHeight(newRows),\n };\n\n this.zone.run(() => {\n for (const rw of resolved) {\n if (rw.id === widget.id) continue;\n const w = this.widgets.find(ww => ww.id === rw.id);\n if (w) { w.x = rw.x; w.y = rw.y; }\n }\n this.updateContainerHeight();\n this.cdr.markForCheck();\n });\n }\n\n private finalizeResize() {\n if (!this.resizing) return;\n const widget = this.widgets.find(w => w.id === this.resizing!.id)!;\n\n let newCols = Math.max(this.minItemCols, Math.round(this.resizing.currentPixelW / (this.cellWidth + this.gap)));\n let newRows = Math.max(this.minItemRows, Math.round(this.resizing.currentPixelH / (this.rowHeight + this.gap)));\n newCols = Math.min(newCols, this.columns - widget.x);\n\n const resolved = GridEngine.resizeWidget(\n this.widgets.map(w => ({ id: w.id, x: w.x, y: w.y, cols: w.cols, rows: w.rows })),\n { id: widget.id, x: widget.x, y: widget.y, cols: widget.cols, rows: widget.rows },\n newCols, newRows, this.columns\n );\n for (const rw of resolved) {\n const w = this.widgets.find(ww => ww.id === rw.id);\n if (w) { w.x = rw.x; w.y = rw.y; w.cols = rw.cols; w.rows = rw.rows; this.itemChanged.emit(w); }\n }\n this.resizing = null;\n this.placeholder = null;\n this.previewWidgets = [];\n this.updateContainerHeight();\n this.layoutChanged.emit(this.widgets);\n this.cdr.markForCheck();\n }\n\n // ── Utilities ──\n\n private compactAndApply() {\n if (!this.widgets?.length) return;\n const compacted = GridEngine.compact(\n this.widgets.map(w => ({ id: w.id, x: w.x, y: w.y, cols: w.cols, rows: w.rows })),\n this.columns\n );\n for (const rw of compacted) {\n const w = this.widgets.find(ww => ww.id === rw.id);\n if (w) { w.x = rw.x; w.y = rw.y; }\n }\n }\n\n private updateContainerHeight() {\n if (!this.widgets?.length) { this.containerHeight = 400; return; }\n const maxRow = GridEngine.getGridHeight(\n this.widgets.map(w => ({ id: w.id, x: w.x, y: w.y, cols: w.cols, rows: w.rows }))\n );\n this.containerHeight = this.rowToPixel(maxRow) + this.rowHeight + this.gap;\n }\n}\n","import { Injectable, NgZone, OnDestroy } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { Page, Widget, DashboardConfig } from './models';\n\ntype PositionMap = Record<string, { x: number; y: number; cols: number; rows: number }>;\n\ntype SyncEvent =\n | { type: 'PAGE_ADDED'; page: Page }\n | { type: 'PAGE_REMOVED'; pageId: string }\n | { type: 'PAGE_RENAMED'; pageId: string; name: string }\n | { type: 'WIDGET_ADDED'; pageId: string; widget: Widget }\n | { type: 'WIDGET_REMOVED';pageId: string; widgetId: string }\n | { type: 'WIDGET_META'; widgetId: string; patch: Partial<Omit<Widget,'id'|'x'|'y'|'cols'|'rows'>> };\n\n@Injectable({ providedIn: 'root' })\nexport class DashboardStateService implements OnDestroy {\n /**\n * Shared key — stores page list + widget metadata (no positions).\n * Read and written by every window.\n */\n private readonly SHARED_KEY = 'ogidor_shared';\n\n /**\n * Per-window positions key — stores {pageId:widgetId → {x,y,cols,rows}}.\n * Pop-out windows get a key scoped to their pageId so they never overwrite\n * the main window or each other.\n * main window → ogidor_positions_main\n * pop-out #abc → ogidor_positions_abc\n */\n private readonly positionsKey: string;\n\n private readonly CHANNEL_NAME = 'ogidor_dashboard_sync';\n private channel = typeof BroadcastChannel !== 'undefined'\n ? new BroadcastChannel(this.CHANNEL_NAME) : null;\n\n private readonly initialPages: Page[] = [\n { id: 'page-1', name: 'Default Workspace', widgets: [] }\n ];\n\n private pagesSubject = new BehaviorSubject<Page[]>(this.initialPages);\n private activePageIdSubject = new BehaviorSubject<string>(this.initialPages[0].id);\n\n pages$ = this.pagesSubject.asObservable();\n activePageId$ = this.activePageIdSubject.asObservable();\n\n constructor(private zone: NgZone) {\n // Determine whether we are a pop-out window\n const hash = typeof window !== 'undefined'\n ? window.location.hash.replace('#', '').trim() : '';\n this.positionsKey = hash ? `ogidor_positions_${hash}` : 'ogidor_positions_main';\n\n // 1. Load the shared structural state\n const shared = localStorage.getItem(this.SHARED_KEY);\n if (shared) {\n try { this._applyShared(JSON.parse(shared), false); }\n catch (e) { console.error('[Dashboard] bad shared state', e); }\n }\n\n // 2. Overlay this window's saved positions on top\n this._restorePositions();\n\n // 3. Listen for structural changes broadcast by other windows\n if (this.channel) {\n this.channel.onmessage = (ev: MessageEvent<SyncEvent>) => {\n this.zone.run(() => this._onSyncEvent(ev.data));\n };\n }\n }\n\n ngOnDestroy() { this.channel?.close(); }\n\n // ── Page actions ──────────────────────────────────────────────\n\n getActivePage(): Page | undefined {\n return this.pagesSubject.value.find(p => p.id === this.activePageIdSubject.value);\n }\n\n setActivePage(id: string) { this.activePageIdSubject.next(id); }\n\n addPage(name: string) {\n const page: Page = { id: `page-${Date.now()}`, name, widgets: [] };\n this.pagesSubject.next([...this.pagesSubject.value, page]);\n this.activePageIdSubject.next(page.id);\n this._saveShared();\n this._broadcast({ type: 'PAGE_ADDED', page });\n }\n\n removePage(id: string) {\n const pages = this.pagesSubject.value;\n if (pages.length <= 1) return;\n const updated = pages.filter(p => p.id !== id);\n this.pagesSubject.next(updated);\n if (this.activePageIdSubject.value === id) {\n this.activePageIdSubject.next(updated[0].id);\n }\n this._saveShared();\n this._broadcast({ type: 'PAGE_REMOVED', pageId: id });\n }\n\n // ── Widget structural actions (synced to all windows) ─────────\n\n addWidget(widget: Partial<Widget> & { title: string }): Widget {\n const activePage = this.getActivePage();\n if (!activePage) throw new Error('No active page');\n const newWidget: Widget = {\n id: `widget-${Date.now()}`,\n x: 0, y: 0, cols: 4, rows: 3,\n ...widget,\n };\n activePage.widgets = [...activePage.widgets, newWidget];\n this.pagesSubject.next([...this.pagesSubject.value]);\n this._saveShared();\n this._savePositions(); // register default position locally\n this._broadcast({ type: 'WIDGET_ADDED', pageId: activePage.id, widget: newWidget });\n return newWidget;\n }\n\n updateWidget(widgetId: string, patch: Partial<Omit<Widget,'id'|'x'|'y'|'cols'|'rows'>>) {\n const pages = this.pagesSubject.value;\n for (const page of pages) {\n const w = page.widgets.find(w => w.id === widgetId);\n if (w) {\n Object.assign(w, patch);\n this.pagesSubject.next([...pages]);\n this._saveShared();\n this._broadcast({ type: 'WIDGET_META', widgetId, patch });\n return;\n }\n }\n }\n\n removeWidget(widgetId: string) {\n const activePage = this.getActivePage();\n if (!activePage) return;\n const pageId = activePage.id;\n activePage.widgets = activePage.widgets.filter(w => w.id !== widgetId);\n this.pagesSubject.next([...this.pagesSubject.value]);\n this._saveShared();\n this._savePositions();\n this._broadcast({ type: 'WIDGET_REMOVED', pageId, widgetId });\n }\n\n // ── Position actions (local to THIS window only) ──────────────\n\n /**\n * Update a widget's grid position/size.\n * Saved only for this window — never broadcast to others.\n */\n updateWidgetPosition(pageId: string, widgetId: string, x: number, y: number, cols: number, rows: number) {\n const pages = this.pagesSubject.value;\n const widget = pages.find(p => p.id === pageId)?.widgets.find(w => w.id === widgetId);\n if (widget) {\n widget.x = x; widget.y = y; widget.cols = cols; widget.rows = rows;\n this.pagesSubject.next([...pages]);\n this._savePositions(); // local only — intentionally no _saveShared / no broadcast\n }\n }\n\n // ── Serialization ─────────────────────────────────────────────\n\n serializeLayout(): string {\n return JSON.stringify({\n pages: this.pagesSubject.value,\n activePageId: this.activePageIdSubject.value,\n } as DashboardConfig);\n }\n\n loadLayout(config: any) {\n if (!config?.pages) return;\n this._applyShared(config, true);\n this._saveShared();\n this._savePositions();\n }\n\n popOutPage(pageId: string) {\n const url = `${window.location.origin}${window.location.pathname}#${pageId}`;\n window.open(url, `workspace_${pageId}`,\n 'width=1280,height=800,menubar=no,toolbar=no,location=no,status=no');\n }\n\n // ── Private helpers ───────────────────────────────────────────\n\n /**\n * Save page list + widget metadata (titles, cardColor, data) — no positions.\n */\n private _saveShared() {\n const stripped = this.pagesSubject.value.map(p => ({\n ...p,\n widgets: p.widgets.map(({ id, title, cardColor, data, cols, rows }) =>\n // Keep default cols/rows so new windows get a sensible first-open layout.\n // x/y are intentionally omitted from shared state.\n ({ id, title, cardColor, data, x: 0, y: 0, cols, rows })\n ),\n }));\n localStorage.setItem(this.SHARED_KEY, JSON.stringify({\n pages: stripped,\n activePageId: this.activePageIdSubject.value,\n }));\n }\n\n /**\n * Save this window's grid positions (x, y, cols, rows) per widget.\n */\n private _savePositions() {\n const positions: PositionMap = {};\n for (const page of this.pagesSubject.value) {\n for (const w of page.widgets) {\n positions[`${page.id}:${w.id}`] = { x: w.x, y: w.y, cols: w.cols, rows: w.rows };\n }\n }\n localStorage.setItem(this.positionsKey, JSON.stringify(positions));\n }\n\n /**\n * Overlay the positions saved for THIS window on top of the current pages.\n */\n private _restorePositions() {\n const raw = localStorage.getItem(this.positionsKey);\n if (!raw) return;\n try {\n const positions: PositionMap = JSON.parse(raw);\n const pages = this.pagesSubject.value;\n for (const page of pages) {\n for (const w of page.widgets) {\n const pos = positions[`${page.id}:${w.id}`];\n if (pos) { w.x = pos.x; w.y = pos.y; w.cols = pos.cols; w.rows = pos.rows; }\n }\n }\n this.pagesSubject.next([...pages]);\n } catch (e) {\n console.error('[Dashboard] bad positions state', e);\n }\n }\n\n /**\n * Apply a shared config object (page list + metadata) without touching\n * this window's saved positions.\n */\n private _applyShared(config: any, overwritePositions: boolean) {\n if (!config?.pages) return;\n this.pagesSubject.next(config.pages);\n if (config.activePageId) this.activePageIdSubject.next(config.activePageId);\n if (!overwritePositions) this._restorePositions();\n }\n\n /**\n * Handle a structural sync event arriving from another window.\n * Position changes are never sent so we never receive them here.\n */\n private _onSyncEvent(event: SyncEvent) {\n // Work on a shallow clone of pages so Angular detects the change\n const pages: Page[] = this.pagesSubject.value.map(p => ({\n ...p, widgets: [...p.widgets]\n }));\n\n switch (event.type) {\n\n case 'PAGE_ADDED':\n if (!pages.find(p => p.id === event.page.id)) {\n pages.push({ ...event.page, widgets: [...event.page.widgets] });\n this.pagesSubject.next(pages);\n this._saveShared();\n }\n break;\n\n case 'PAGE_REMOVED': {\n const updated = pages.filter(p => p.id !== event.pageId);\n if (updated.length !== pages.length) {\n this.pagesSubject.next(updated);\n if (this.activePageIdSubject.value === event.pageId) {\n this.activePageIdSubject.next(updated[0]?.id ?? '');\n }\n this._saveShared();\n }\n break;\n }\n\n case 'WIDGET_ADDED': {\n const page = pages.find(p => p.id === event.pageId);\n if (page && !page.widgets.find(w => w.id === event.widget.id)) {\n page.widgets = [...page.widgets, { ...event.widget }];\n this.pagesSubject.next(pages);\n this._saveShared();\n // Don't touch positions — this window will keep its own layout for\n // existing widgets; the new one starts at its default position.\n }\n break;\n }\n\n case 'WIDGET_REMOVED': {\n const page = pages.find(p => p.id === event.pageId);\n if (page) {\n page.widgets = page.widgets.filter(w => w.id !== event.widgetId);\n this.pagesSubject.next(pages);\n this._saveShared();\n this._savePositions();\n }\n break;\n }\n\n case 'WIDGET_META': {\n for (const page of pages) {\n const w = page.widgets.find(w => w.id === event.widgetId);\n if (w) {\n Object.assign(w, event.patch);\n this.pagesSubject.next(pages);\n this._saveShared();\n break;\n }\n }\n break;\n }\n }\n }\n\n private _broadcast(event: SyncEvent) {\n this.channel?.postMessage(event);\n }\n}\n","import {\n Component, Input, Output, EventEmitter, OnChanges, SimpleChanges\n} from '@angular/core';\nimport { Widget, DashboardTheme } from './models';\n\n@Component({\n selector: 'app-widget-renderer',\n template: `\n <div class=\"widget-card\" [style.background]=\"cardBg\">\n <!-- Header: drag handle + title + actions -->\n <div class=\"widget-header\">\n <div class=\"drag-handle\" title=\"Drag to move\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"currentColor\">\n <circle cx=\"4\" cy=\"3\" r=\"1.2\"/><circle cx=\"10\" cy=\"3\" r=\"1.2\"/>\n <circle cx=\"4\" cy=\"7\" r=\"1.2\"/><circle cx=\"10\" cy=\"7\" r=\"1.2\"/>\n <circle cx=\"4\" cy=\"11\" r=\"1.2\"/><circle cx=\"10\" cy=\"11\" r=\"1.2\"/>\n </svg>\n </div>\n <span class=\"widget-title\">{{ widget.title }}</span>\n <div class=\"header-actions\">\n <button class=\"btn-icon btn-edit\" (click)=\"editRequested.emit(widget)\" title=\"Edit\">\n <i class=\"la la-pen\"></i>\n </button>\n <button class=\"btn-icon btn-remove\" (click)=\"removeRequested.emit(widget.id)\" title=\"Remove\">\n <i class=\"la la-times\"></i>\n </button>\n </div>\n </div>\n\n <!-- Consumer content slot -->\n <div class=\"widget-body\">\n <ng-content></ng-content>\n </div>\n </div>\n `,\n styles: [`\n :host {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n width: 100%;\n }\n\n .widget-card {\n flex: 1;\n min-height: 0;\n width: 100%;\n display: flex;\n flex-direction: column;\n border-radius: 24px;\n overflow: hidden;\n border: 1px solid var(--dash-widget-border-color, rgba(255,255,255,0.07));\n box-sizing: border-box;\n background: var(--dash-card-bg, #2c2c2e);\n }\n\n /* ── Header ── */\n .widget-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 14px 8px;\n flex-shrink: 0;\n }\n .drag-handle {\n color: var(--dash-drag-handle-color, rgba(255,255,255,0.2));\n cursor: grab;\n display: flex;\n align-items: center;\n flex-shrink: 0;\n transition: color 0.2s;\n }\n .drag-handle:hover { color: rgba(255,255,255,0.5); }\n .widget-title {\n flex: 1;\n color: var(--dash-widget-title-color, #ffffff);\n font-size: 14px;\n font-weight: 600;\n letter-spacing: 0.2px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n .header-actions {\n display: flex;\n gap: 4px;\n align-items: center;\n opacity: 0;\n transition: opacity 0.2s;\n }\n .widget-card:hover .header-actions { opacity: 1; }\n\n .btn-icon {\n background: var(--dash-widget-btn-bg, rgba(255,255,255,0.07));\n border: none;\n color: var(--dash-widget-btn-color, rgba(255,255,255,0.5));\n cursor: pointer;\n font-size: 11px;\n width: 24px; height: 24px;\n border-radius: 50%;\n display: flex; align-items: center; justify-content: center;\n transition: all 0.2s;\n flex-shrink: 0;\n }\n .btn-edit:hover { background: rgba(10,132,255,0.22); color: var(--dash-accent-color, #0a84ff); }\n .btn-remove:hover { background: rgba(255,69,58,0.22); color: var(--dash-danger-color, #ff453a); }\n\n /* ── Body ── */\n .widget-body {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n padding: 0 14px 14px;\n overflow: hidden;\n }\n `]\n})\nexport class WidgetRendererComponent implements OnChanges {\n @Input() widget!: Widget;\n @Input() theme?: Required<DashboardTheme>;\n\n @Output() editRequested = new EventEmitter<Widget>();\n @Output() removeRequested = new EventEmitter<string>();\n\n cardBg = 'var(--dash-card-bg, #2c2c2e)';\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['widget'] || changes['theme']) {\n this.cardBg = this.widget?.cardColor ?? 'var(--dash-card-bg, #2c2c2e)';\n }\n }\n}\n","import {\n Component, OnInit, OnDestroy, AfterViewInit, Input, Output, OnChanges,\n SimpleChanges, EventEmitter, ContentChild, TemplateRef,\n ChangeDetectorRef, NgZone, Pipe, PipeTransform,\n HostListener, ViewChild, ElementRef\n} from '@angular/core';\nimport { DashboardStateService } from './dashboard-state.service';\nimport { Page, Widget, DashboardTheme } from './models';\nimport { Subscription } from 'rxjs';\nimport { GridCellDirective } from './custom-grid.component';\n\nconst DEFAULT_THEME: Required<DashboardTheme> = {\n backgroundColor: '#000000',\n panelColor: '#1c1c1e',\n widgetCardColor: '#2c2c2e',\n foreColor: '#8e8e93',\n accentColor: '#0a84ff',\n dangerColor: '#ff453a',\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif',\n tabsContainerColor: 'rgba(44,44,46,0.6)',\n tabActiveColor: '#3a3a3c',\n tabActiveTextColor: '#ffffff',\n tabHoverTextColor: '#e5e5ea',\n addWidgetButtonTextColor:'#ffffff',\n popoutTitleColor: '#ffffff',\n widgetTitleColor: '#ffffff',\n dragHandleColor: 'rgba(255,255,255,0.2)',\n widgetBorderColor: 'rgba(255,255,255,0.07)',\n widgetButtonBgColor: 'rgba(255,255,255,0.07)',\n widgetButtonColor: 'rgba(255,255,255,0.5)',\n placeholderColor: '#0a84ff',\n resizeHandleColor: 'rgba(255,255,255,0.25)',\n};\n\n@Pipe({ name: 'overflowActive' })\nexport class OverflowActivePipe implements PipeTransform {\n transform(pages: Page[], activePageId: string): boolean {\n return pages.some(p => p.id === activePageId);\n }\n}\n\n@Component({\n selector: 'app-dashboard',\n template: `\n <!-- POPPED-OUT MODE -->\n <ng-container *ngIf=\"isPoppedOut; else normalMode\">\n <div class=\"popout-wrapper\" [ngStyle]=\"wrapperStyles\">\n <header class=\"popout-header\">\n <span class=\"popout-title\">{{ activePage?.name }}</span>\n </header>\n <app-grid [widgets]=\"activePage?.widgets || []\" (itemChanged)=\"onItemChanged($event)\">\n <ng-template gridCell let-widget=\"widget\">\n <app-widget-renderer [widget]=\"widget\" [theme]=\"resolvedTheme\"\n (editRequested)=\"editWidgetRequested.emit($event)\"\n (removeRequested)=\"onRemoveWidget($event)\">\n <ng-container *ngIf=\"cellTemplate\"\n [ngTemplateOutlet]=\"cellTemplate\"\n [ngTemplateOutletContext]=\"{ widget: widget }\">\n </ng-container>\n </app-widget-renderer>\n </ng-template>\n </app-grid>\n </div>\n </ng-container>\n\n <!-- NORMAL MODE -->\n <ng-template #normalMode>\n <div class=\"dashboard-wrapper\" [ngStyle]=\"wrapperStyles\">\n <main class=\"main-content\">\n\n <header class=\"dashboard-header\">\n\n <!-- Tab bar -->\n <div class=\"tabs-track\" #tabsTrack>\n <!-- Visible tabs -->\n <div\n *ngFor=\"let page of visiblePages\"\n class=\"tab\"\n [class.active]=\"page.id === activePageId\"\n (click)=\"onSelectPage(page.id)\"\n >\n <span class=\"tab-name\">{{ page.name }}</span>\n <button class=\"tab-action tab-popout\" (click)=\"onPopOut($event, page.id)\" title=\"Open in new window\">\n <i class=\"la la-external-link-alt\"></i>\n </button>\n <button class=\"tab-action tab-close\" *ngIf=\"pages.length > 1\" (click)=\"onRemovePage($event, page.id)\" title=\"Close\">\n <i class=\"la la-times\"></i>\n </button>\n </div>\n\n <!-- Overflow button — shown only when there are hidden tabs -->\n <button\n *ngIf=\"hiddenCount > 0\"\n class=\"btn-overflow\"\n (click)=\"openTabSwitcher()\"\n title=\"Show all workspaces\"\n >\n <span>+{{ hiddenCount }}</span>\n <i class=\"la la-th-large\"></i>\n </button>\n\n <!-- Add page button -->\n <button class=\"btn-add-page\" (click)=\"onAddPage()\" title=\"New workspace\">\n <i class=\"la la-plus\"></i>\n </button>\n </div>\n\n <button class=\"btn-add-widget\" (click)=\"addWidgetRequested.emit()\" title=\"Add widget\">\n <i class=\"la la-plus\"></i>\n <span>Add Widget</span>\n </button>\n\n </header>\n\n <!-- ── Tab-switcher overlay (Chrome mobile style) ── -->\n <div class=\"tab-switcher-overlay\" *ngIf=\"tabSwitcherOpen\" (click)=\"closeTabSwitcher()\">\n <div class=\"tab-switcher-sheet\" (click)=\"$event.stopPropagation()\">\n\n <div class=\"tab-switcher-header\">\n <span class=\"tab-switcher-title\">{{ pages.length }} Workspace{{ pages.length !== 1 ? 's' : '' }}</span>\n <button class=\"tab-switcher-close-btn\" (click)=\"closeTabSwitcher()\" title=\"Close\">\n <i class=\"la la-times\"></i>\n </button>\n </div>\n\n <div class=\"tab-switcher-grid\">\n <div\n *ngFor=\"let page of pages\"\n class=\"tab-card\"\n [class.active]=\"page.id === activePageId\"\n (click)=\"onSwitcherSelect(page.id)\"\n >\n <div class=\"tab-card-icon\">\n <i class=\"la la-th-large\"></i>\n </div>\n <span class=\"tab-card-name\">{{ page.name }}</span>\n <div class=\"tab-card-actions\">\n <button class=\"tab-card-btn tab-card-popout\" (click)=\"onSwitcherPopOut($event, page.id)\" title=\"Open in new window\">\n <i class=\"la la-external-link-alt\"></i>\n </button>\n <button class=\"tab-card-btn tab-card-remove\" *ngIf=\"pages.length > 1\" (click)=\"onSwitcherRemove($event, page.id)\" title=\"Close\">\n <i class=\"la la-times\"></i>\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"tab-switcher-footer\">\n <button class=\"tab-switcher-add-btn\" (click)=\"onSwitcherAdd()\">\n <i class=\"la la-plus\"></i>\n <span>New Workspace</span>\n </button>\n </div>\n\n </div>\n </div>\n\n <div class=\"grid-container\">\n <app-grid [widgets]=\"activePage?.widgets || []\" (itemChanged)=\"onItemChanged($event)\">\n <ng-template gridCell let-widget=\"widget\">\n <app-widget-renderer [widget]=\"widget\" [theme]=\"resolvedTheme\"\n (editRequested)=\"editWidgetRequested.emit($event)\"\n (removeRequested)=\"onRemoveWidget($event)\">\n <ng-container *ngIf=\"cellTemplate\"\n [ngTemplateOutlet]=\"cellTemplate\"\n [ngTemplateOutletContext]=\"{ widget: widget }\">\n </ng-container>\n </app-widget-renderer>\n </ng-template>\n </app-grid>\n </div>\n\n </main>\n </div>\n </ng-template>\n `,\n styles: [`\n :host {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n min-height: 0;\n --dash-bg: #000000;\n --dash-panel-bg: #1c1c1e;\n --dash-card-bg: #2c2c2e;\n --dash-fore-color: #8e8e93;\n --dash-accent-color: #0a84ff;\n --dash-danger-color: #ff453a;\n --dash-font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif;\n --dash-tabs-container-color: rgba(44,44,46,0.6);\n --dash-tab-active-color: #3a3a3c;\n --dash-tab-active-text: #ffffff;\n --dash-tab-hover-text: #e5e5ea;\n --dash-add-widget-text: #ffffff;\n --dash-popout-title-color: #ffffff;\n --dash-widget-title-color: #ffffff;\n --dash-drag-handle-color: rgba(255,255,255,0.2);\n --dash-widget-border-color: rgba(255,255,255,0.07);\n --dash-widget-btn-bg: rgba(255,255,255,0.07);\n --dash-widget-btn-color: rgba(255,255,255,0.5);\n --dash-placeholder-color: #0a84ff;\n --dash-resize-handle-color: rgba(255,255,255,0.25);\n }\n\n /* ── Normal layout ── */\n .dashboard-wrapper {\n display: flex;\n flex: 1;\n min-height: 0;\n overflow: hidden;\n padding: 16px;\n box-sizing: border-box;\n background: var(--dash-bg);\n color: var(--dash-fore-color);\n font-family: var(--dash-font-family);\n }\n .main-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n border-radius: 40px;\n padding: 20px;\n background: var(--dash-panel-bg);\n border: 1px solid rgba(255,255,255,0.05);\n position: relative;\n }\n\n /* ── Pop-out layout ── */\n .popout-wrapper {\n display: flex;\n flex: 1;\n flex-direction: column;\n min-height: 0;\n overflow: hidden;\n padding: 16px;\n box-sizing: border-box;\n background: var(--dash-bg);\n color: var(--dash-fore-color);\n font-family: var(--dash-font-family);\n }\n .popout-header {\n display: flex;\n align-items: center;\n margin-bottom: 16px;\n padding: 10px 18px;\n background: var(--dash-panel-bg);\n border-radius: 20px;\n border: 1px solid rgba(255,255,255,0.06);\n flex-shrink: 0;\n }\n .popout-title { font-size: 16px; font-weight: 700; color: var(--dash-popout-title-color); }\n .popout-wrapper app-grid { flex: 1; min-height: 0; overflow: auto; }\n\n /* ── Header ── */\n .dashboard-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 20px;\n gap: 12px;\n flex-shrink: 0;\n }\n\n /* ── Tab bar ── */\n .tabs-track {\n display: flex;\n align-items: center;\n gap: 6px;\n flex: 1;\n min-width: 0;\n background: var(--dash-tabs-container-color);\n backdrop-filter: blur(10px);\n border-radius: 25px;\n padding: 6px;\n overflow: hidden;\n }\n\n /* ── Individual tab ── */\n .tab {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 8px 14px 8px 18px;\n border-radius: 20px;\n cursor: pointer;\n font-size: 14px;\n font-weight: 500;\n color: var(--dash-fore-color);\n white-space: nowrap;\n flex-shrink: 0;\n transition: background 0.2s, color 0.2s;\n }\n .tab.active { background: var(--dash-tab-active-color); color: var(--dash-tab-active-text); }\n .tab:hover:not(.active) { color: var(--dash-tab-hover-text); background: rgba(255,255,255,0.05); }\n .tab-name { white-space: nowrap; }\n .tab-action {\n background: transparent; border: none; color: var(--dash-fore-color);\n padding: 2px; font-size: 11px; cursor: pointer; opacity: 0; border-radius: 50%;\n width: 20px; height: 20px; display: flex; align-items: center; justify-content: center;\n transition: all 0.2s; flex-shrink: 0;\n }\n .tab:hover .tab-action { opacity: 1; }\n .tab-popout:hover { color: var(--dash-accent-color); background: rgba(10,132,255,0.18); }\n .tab-close:hover { color: var(--dash-danger-color); background: rgba(255,69,58,0.2); }\n\n /* ── Overflow \"+N\" button ── */\n .btn-overflow {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n background: rgba(255,255,255,0.08);\n border: 1px solid rgba(255,255,255,0.12);\n border-radius: 20px;\n padding: 7px 13px;\n cursor: pointer;\n font-size: 13px;\n font-weight: 600;\n color: var(--dash-tab-active-text);\n white-space: nowrap;\n flex-shrink: 0;\n transition: background 0.2s, border-color 0.2s;\n }\n .btn-overflow:hover { background: rgba(10,132,255,0.18); border-color: var(--dash-accent-color); color: var(--dash-accent-color); }\n\n /* ── Add page button ── */\n .btn-add-page {\n background: transparent; border: none; color: var(--dash-fore-color);\n padding: 8px 14px; cursor: pointer; border-radius: 20px;\n flex-shrink: 0;\n transition: all 0.2s;\n }\n .btn-add-page:hover { color: var(--dash-accent-color); background: rgba(10,132,255,0.1); }\n\n /* ── Tab-switcher overlay ── */\n .tab-switcher-overlay {\n position: absolute;\n inset: 0;\n z-index: 1000;\n background: rgba(0,0,0,0.55);\n backdrop-filter: blur(4px);\n display: flex;\n align-items: flex-start;\n justify-content: center;\n padding-top: 60px;\n animation: overlay-in 0.18s ease;\n }\n @keyframes overlay-in {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n\n .tab-switcher-sheet {\n background: var(--dash-panel-bg);\n border: 1px solid rgba(255,255,255,0.08);\n border-radius: 24px;\n width: min(520px, calc(100% - 32px));\n max-height: calc(100% - 80px);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n animation: sheet-in 0.22s cubic-bezier(.32,1.2,.5,1);\n }\n @keyframes sheet-in {\n from { transform: translateY(-16px) scale(0.97); opacity: 0; }\n to { transform: translateY(0) scale(1); opacity: 1; }\n }\n\n .tab-switcher-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px 12px;\n border-bottom: 1px solid rgba(255,255,255,0.06);\n flex-shrink: 0;\n }\n .tab-switcher-title {\n font-size: 15px;\n font-weight: 700;\n color: var(--dash-tab-active-text);\n }\n .tab-switcher-close-btn {\n background: rgba(255,255,255,0.07);\n border: none;\n color: var(--dash-fore-color);\n width: 28px; height: 28px;\n border-radius: 50%;\n display: flex; align-items: center; justify-content: center;\n cursor: pointer;\n font-size: 14px;\n transition: background 0.15s, color 0.15s;\n }\n .tab-switcher-close-btn:hover { background: rgba(255,69,58,0.25); color: var(--dash-danger-color); }\n\n .tab-switcher-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));\n gap: 10px;\n padding: 16px;\n overflow-y: auto;\n scrollbar-width: thin;\n scrollbar-color: rgba(255,255,255,0.15) transparent;\n }\n\n .tab-card {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n padding: 16px 12px 12px;\n border-radius: 16px;\n background: var(--dash-card-bg);\n border: 1.5px solid transparent;\n cursor: pointer;\n transition: border-color 0.15s, background 0.15s, transform 0.12s;\n position: relative;\n }\n .tab-card:hover { background: rgba(255,255,255,0.06); transform: translateY(-2px); }\n .tab-card.active {\n border-color: var(--dash-accent-color);\n background: rgba(10,132,255,0.12);\n }\n .tab-card-icon {\n width: 44px; height: 44px;\n border-radius: 12px;\n background: rgba(255,255,255,0.07);\n display: flex; align-items: center; justify-content: center;\n font-size: 20px;\n color: var(--dash-fore-color);\n }\n .tab-card.active .tab-card-icon {\n background: rgba(10,132,255,0.25);\n color: var(--dash-accent-color);\n }\n .tab-card-name {\n font-size: 13px;\n font-weight: 500;\n color: var(--dash-tab-active-text);\n text-align: center;\n word-break: break-word;\n line-height: 1.3;\n }\n .tab-card-actions {\n display: flex;\n gap: 4px;\n opacity: 0;\n transition: opacity 0.15s;\n }\n .tab-card:hover .tab-card-actions { opacity: 1; }\n .tab-card-btn {\n background: rgba(255,255,255,0.07);\n border: none;\n width: 26px; height: 26px;\n border-radius: 50%;\n display: flex; align-items: center; justify-content: center;\n cursor: pointer;\n font-size: 12px;\n color: var(--dash-fore-color);\n transition: background 0.15s, color 0.15s;\n }\n .tab-card-popout:hover { background: rgba(10,132,255,0.25); color: var(--dash-accent-color); }\n .tab-card-remove:hover { background: rgba(255,69,58,0.25); color: var(--dash-danger-color); }\n\n .tab-switcher-footer {\n padding: 12px 16px 16px;\n border-top: 1px solid rgba(255,255,255,0.06);\n flex-shrink: 0;\n }\n .tab-switcher-add-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n width: 100%;\n padding: 11px 20px;\n border-radius: 16px;\n background: rgba(10,132,255,0.15);\n border: 1.5px dashed rgba(10,132,255,0.4);\n color: var(--dash-accent-color);\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n transition: background 0.15s, border-color 0.15s;\n }\n .tab-switcher-add-btn:hover { background: rgba(10,132,255,0.25); border-color: var(--dash-accent-color); }\n\n .btn-add-widget {\n display: flex; align-items: center; gap: 6px;\n background: var(--dash-accent-color); border: none; color: var(--dash-add-widget-text);\n font-size: 14px; font-weight: 600; padding: 10px 20px; border-radius: 22px;\n cursor: pointer; white-space: nowrap; flex-shrink: 0;\n transition: opacity 0.2s, transform 0.15s;\n }\n .btn-add-widget:hover { opacity: 0.9; transform: translateY(-1px); }\n .btn-add-widget:active { transform: translateY(0); }\n\n /* ── Grid ── */\n .main-content .grid-container { flex: 1; overflow: auto; border-radius: 24px; min-height: 0; }\n app-grid { background: transparent; display: block; height: 100%; width: 100%; }\n `]\n})\nexport class DashboardComponent implements OnInit, AfterViewInit, OnDestroy, OnChanges {\n @Input() initialLayout?: string;\n @Input() theme?: DashboardTheme;\n\n @Output() addWidgetRequested = new EventEmitter<void>();\n @Output() editWidgetRequested = new EventEmitter<Widget>();\n\n @ContentChild(GridCellDirective, { read: TemplateRef })\n cellTemplate?: TemplateRef<{ widget: Widget }>;\n\n @ViewChild('tabsTrack') tabsTrackRef!: ElementRef<HTMLDivElement>;\n\n resolvedTheme: Required<DashboardTheme> = { ...DEFAULT_THEME };\n wrapperStyles: Record<string, string> = {};\n\n pages: Page[] = [];\n visiblePages: Page[] = [];\n hiddenCount = 0;\n activePageId = '';\n activePage?: Page;\n isPoppedOut = false;\n tabSwitcherOpen = false;\n\n private subs = new Subscription();\n private resizeObserver?: ResizeObserver;\n\n // Reserved space for the overflow \"+N\" button and the add \"+\" button (px)\n private readonly OVERFLOW_BTN_W = 80;\n private readonly ADD_BTN_W = 52;\n private readonly GAP = 6;\n private readonly PADDING = 12; // 6px each side\n\n constructor(\n public stateService: DashboardStateService,\n private cdr: ChangeDetectorRef,\n private zone: NgZone\n ) {}\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['theme'] || changes['initialLayout']) this.applyTheme();\n }\n\n ngOnInit() {\n this.applyTheme();\n\n if (this.initialLayout) {\n try { this.stateService.loadLayout(JSON.parse(this.initialLayout)); }\n catch (e) { console.error('[Dashboard] Failed to parse initialLayout', e); }\n }\n\n const hash = window.location.hash?.replace('#', '').trim();\n if (hash) this.isPoppedOut = true;\n\n this.subs.add(this.stateService.pages$.subscribe(pages => {\n this.pages = pages;\n this._tabWidthCache = []; // invalidate cache — page list changed\n if (this.isPoppedOut && hash) {\n if (pages.find(p => p.id === hash)) this.stateService.setActivePage(hash);\n }\n this.updateActivePage();\n this.recalcVisibleTabs();\n // Second pass after Angular has rendered the updated tab elements\n setTimeout(() => this.recalcVisibleTabs());\n }));\n this.subs.add(this.stateService.activePageId$.subscribe(id => {\n this.activePageId = id;\n this.updateActivePage();\n }));\n }\n\n ngAfterViewInit() {\n if (!this.tabsTrackRef) return;\n this.zone.runOutsideAngular(() => {\n this.resizeObserver = new ResizeObserver(() => {\n this.zone.run(() => this.recalcVisibleTabs());\n });\n this.resizeObserver.observe(this.tabsTrackRef.nativeElement);\n });\n // Initial measurement pass now that the DOM is ready\n setTimeout(() => this.recalcVisibleTabs());\n }\n\n ngOnDestroy() {\n this.subs.unsubscribe();\n this.resizeObserver?.disconnect();\n }\n\n onItemChanged(widget: Widget) {\n this.stateService.updateWidgetPosition(\n this.activePageId, widget.id, widget.x, widget.y, widget.cols, widget.rows\n );\n }\n\n onRemoveWidget(widgetId: string) { this.stateService.removeWidget(widgetId); }\n\n onSelectPage(id: string) { this.stateService.setActivePage(id); }\n\n onAddPage() {\n const name = prompt('Workspace name:', `Workspace ${this.pages.length + 1}`);\n if (name) this.stateService.addPage(name);\n }\n\n onRemovePage(event: Event, id: string) {\n event.stopPropagation();\n if (confirm('Remove this workspace?')) this.stateService.removePage(id);\n }\n\n onPopOut(event: Event, pageId: string) {\n event.stopPropagation();\n this.stateService.popOutPage(pageId);\n }\n\n serializeLayout(): string { return this.stateService.serializeLayout(); }\n\n openTabSwitcher() { this.tabSwitcherOpen = true; }\n closeTabSwitcher() { this.tabSwitcherOpen = false; }\n\n @HostListener('document:keydown.escape')\n onEscapeKey() { this.closeTabSwitcher(); }\n\n onSwitcherSelect(pageId: string) {\n this.stateService.setActivePage(pageId);\n this.closeTabSwitcher();\n }\n\n onSwitcherPopOut(event: Event, pageId: string) {\n event.stopPropagation();\n this.stateService.popOutPage(pageId);\n this.closeTabSwitcher();\n }\n\n onSwitcherRemove(event: Event, pageId: string) {\n event.stopPropagation();\n if (confirm('Remove this workspace?')) {\n this.stateService.removePage(pageId);\n if (this.pages.length <= 1) this.closeTabSwitcher();\n }\n }\n\n onSwitcherAdd() {\n const name = prompt('Workspace name:', `Workspace ${this.pages.length + 1}`);\n if (name) this.stateService.addPage(name);\n }\n\n private recalcVisibleTabs() {\n if (!this.tabsTrackRef || !this.pages.length) {\n this.visiblePages = this.pages;\n this.hiddenCount = 0;\n this.cdr.markForCheck();\n return;\n }\n\n const track = this.tabsTrackRef.nativeElement;\n const trackW = track.clientWidth;\n // Space always consumed by the add \"+\" button + padding\n const baseReserved = this.ADD_BTN_W + this.GAP + this.PADDING;\n // Space needed for the overflow \"+N\" button when shown\n const overflowSlot = this.OVERFLOW_BTN_W + this.GAP;\n\n // Measure each real tab element currently in the DOM.\n // The DOM always renders all visiblePages tabs, so we may not have all tabs\n // measured yet — fall back to the previous measured cache or a generous estimate.\n const tabEls = Array.from(track.querySelectorAll<HTMLElement>('.tab'));\n // Build a width map by index (only covers currently visible tabs)\n const measuredWidths: number[] = this.pages.map((_, i) => {\n const el = tabEls[i];\n return el ? el.getBoundingClientRect().width + this.GAP : this._tabWidthCache[i] ?? 150 + this.GAP;\n });\n // Update cache for next call\n tabEls.forEach((el, i) => {\n this._tabWidthCache[i] = el.getBoundingClientRect().width + this.GAP;\n });\n\n // How much space the tabs need in total (no overflow button)\n const totalNeeded = measuredWidths.reduce((s, w) => s + w, 0) - this.GAP; // remove trailing gap\n\n if (totalNeeded <= trackW - baseReserved) {\n // Everything fits — show all\n this.visiblePages = this.pages;\n this.hiddenCount = 0;\n } else {\n // Not everything fits — fill as many as possible while always leaving room for overflow btn\n const budget = trackW - baseReserved - overflowSlot;\n let used = 0;\n let count = 0;\n for (let i = 0; i < this.pages.length; i++) {\n used += measuredWidths[i];\n if (used - this.GAP <= budget) { // -GAP: last item has no trailing gap\n count++;\n } else {\n break;\n }\n }\n count = Math.max(1, count);\n this.visiblePages = this.pages.slice(0, count);\n this.hiddenCount = this.pages.length - count;\n }\n\n this.cdr.markForCheck();\n }\n\n // Cache of measured tab widths (including gap) indexed by page position\n private _tabWidthCache: number[] = [];\n\n private applyTheme() {\n this.resolvedTheme = { ...DEFAULT_THEME, ...(this.theme ?? {}) };\n const t = this.resolvedTheme;\n this.wrapperStyles = {\n '--dash-bg': t.backgroundColor,\n '--dash-panel-bg': t.panelColor,\n '--dash-card-bg': t.widgetCardColor,\n '--dash-fore-color': t.foreColor,\n '--dash-accent-color': t.accentColor,\n '--dash-danger-color': t.dangerColor,\n '--dash-font-family': t.fontFamily,\n '--dash-tabs-container-color': t.tabsContainerColor,\n '--dash-tab-active-color': t.tabActiveColor,\n '--dash-tab-active-text': t.tabActiveTextColor,\n '--dash-tab-hover-text': t.tabHoverTextColor,\n '--dash-add-widget-text': t.addWidgetButtonTextColor,\n '--dash-popout-title-color': t.popoutTitleColor,\n '--dash-widget-title-color': t.widgetTitleColor,\n '--dash-drag-handle-color': t.dragHandleColor,\n '--dash-widget-border-color': t.widgetBorderColor,\n '--dash-widget-btn-bg': t.widgetButtonBgColor,\n '--dash-widget-btn-color': t.widgetButtonColor,\n '--dash-placeholder-color': t.placeholderColor,\n '--dash-resize-handle-color': t.resizeHandleColor,\n };\n }\n\n private updateActivePage() {\n this.activePage = this.pages.find(p => p.id === this.activePageId);\n }\n}\n","import { NgModule } from '@angular/core';\nimport { BrowserModule } from '@angular/platform-browser';\nimport { CommonModule } from '@angular/common';\n\nimport { DashboardComponent, OverflowActivePipe } from './dashboard.component';\nimport { WidgetRendererComponent } from './widget-renderer.component';\nimport { CustomGridComponent, GridCellDirective } from './custom-grid.component';\nimport { DashboardStateService } from './dashboard-state.service';\n\n@NgModule({\n declarations: [\n DashboardComponent,\n OverflowActivePipe,\n WidgetRendererComponent,\n CustomGridComponent,\n GridCellDirective,\n ],\n imports: [\n CommonModule,\n ],\n providers: [DashboardStateService],\n exports: [\n DashboardComponent,\n OverflowActivePipe,\n WidgetRendererComponent,\n CustomGridComponent,\n GridCellDirective,\n ],\n})\nexport class DashboardModule {}\n\n/**\n * Root module for local demo / testing purposes only.\n * Library consumers import DashboardModule, not AppModule.\n */\n@NgModule({\n imports: [BrowserModule, DashboardModule],\n bootstrap: [DashboardComponent],\n})\nexport class AppModule {}\n","/*\n * Public API Surface of @ogidor/dashboard\n */\n\nexport * from './app/app.module';\nexport * from './app/dashboard.component';\nexport * from './app/widget-renderer.component';\nexport * from './app/custom-grid.component';\nexport * from './app/dashboard-state.service';\nexport * from './app/models';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i1.DashboardStateService","i3.WidgetRendererComponent","i4.CustomGridComponent","i4.GridCellDirective"],"mappings":"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"}
1
+ {"version":3,"file":"ogidor-dashboard.mjs","sources":["../../src/app/custom-grid.component.ts","../../src/app/dashboard-state.service.ts","../../src/app/widget-renderer.component.ts","../../src/app/dashboard.component.ts","../../src/app/app.module.ts","../../src/public-api.ts","../../src/ogidor-dashboard.ts"],"sourcesContent":["import {\n Component, Input, Output, EventEmitter, ElementRef,\n ViewChild, OnDestroy, OnInit, NgZone, ChangeDetectorRef,\n ContentChild, TemplateRef,\n Directive, ChangeDetectionStrategy, OnChanges, SimpleChanges\n} from '@angular/core';\nimport { Widget } from './models';\n\n/**\n * Directive applied to the template that should be stamped inside each grid cell.\n * Usage:\n * <app-grid [widgets]=\"...\">\n * <ng-template gridCell let-widget=\"widget\">\n * <app-widget-renderer [widget]=\"widget\" ...></app-widget-renderer>\n * </ng-template>\n * </app-grid>\n */\n@Directive({ selector: '[gridCell]' })\nexport class GridCellDirective {\n constructor(public templateRef: TemplateRef<{ widget: Widget }>) {}\n}\n\n/* ═══════════════════════════════════════════════════════════════════════\n GRID ENGINE — pure data, zero DOM\n Handles collision detection, resolution, and compaction.\n Inspired by react-grid-layout / gridster algorithms.\n ═══════════════════════════════════════════════════════════════════════ */\n\ninterface GridRect {\n id: string;\n x: number;\n y: number;\n cols: number;\n rows: number;\n}\n\nclass GridEngine {\n\n /**\n * Check if two rects overlap.\n */\n static collides(a: GridRect, b: GridRect): boolean {\n return !(\n a.x + a.cols <= b.x ||\n b.x + b.cols <= a.x ||\n a.y + a.rows <= b.y ||\n b.y + b.rows <= a.y\n );\n }\n\n /**\n * Get ALL widgets that collide with `rect`.\n */\n static getAllCollisions(widgets: GridRect[], rect: GridRect): GridRect[] {\n return widgets.filter(w => w.id !== rect.id && GridEngine.collides(w, rect));\n }\n\n /**\n * Sort widgets top-to-bottom, left-to-right.\n */\n static sortByPosition(widgets: GridRect[]): GridRect[] {\n return [...widgets].sort((a, b) => a.y - b.y || a.x - b.x);\n }\n\n /**\n * Move a widget to (x, y) and push any colliding widgets downward.\n * Returns the full list with resolved positions.\n */\n static moveWidget(\n allWidgets: GridRect[],\n widget: GridRect,\n newX: number,\n newY: number,\n columns: number\n ): GridRect[] {\n const widgets = allWidgets.map(w => ({ ...w }));\n const moving = widgets.find(w => w.id === widget.id);\n if (!moving) return widgets;\n\n moving.x = Math.max(0, Math.min(newX, columns - moving.cols));\n moving.y = Math.max(0, newY);\n\n const sorted = GridEngine.sortByPosition(widgets);\n GridEngine.resolveCollisions(sorted, moving);\n return GridEngine.compact(sorted, columns);\n }\n\n /**\n * Resize a widget and push colliding widgets down.\n */\n static resizeWidget(\n allWidgets: GridRect[],\n widget: GridRect,\n newCols: number,\n newRows: number,\n columns: number\n ): GridRect[] {\n const widgets = allWidgets.map(w => ({ ...w }));\n const resizing = widgets.find(w => w.id === widget.id);\n if (!resizing) return widgets;\n\n resizing.cols = Math.max(1, Math.min(newCols, columns - resizing.x));\n resizing.rows = Math.max(1, newRows);\n\n const sorted = GridEngine.sortByPosition(widgets);\n GridEngine.resolveCollisions(sorted, resizing);\n return GridEngine.compact(sorted, columns);\n }\n\n /**\n * Push all widgets that collide with `movedWidget` downward, recursively.\n */\n private static resolveCollisions(widgets: GridRect[], movedWidget: GridRect): void {\n const collisions = GridEngine.getAllCollisions(widgets, movedWidget);\n for (const collider of collisions) {\n collider.y = movedWidget.y + movedWidget.rows;\n GridEngine.resolveCollisions(widgets, collider);\n }\n }\n\n /**\n * Compact the grid: move every widget as far up as possible without overlapping.\n */\n static compact(widgets: GridRect[], _columns: number): GridRect[] {\n const sorted = GridEngine.sortByPosition(widgets);\n const placed: GridRect[] = [];\n\n for (const widget of sorted) {\n widget.y = GridEngine.findCompactY(placed, widget);\n placed.push(widget);\n }\n\n return placed;\n }\n\n /**\n * Find the highest Y position a widget can occupy without overlapping any already-placed widget.\n */\n private static findCompactY(placed: GridRect[], widget: GridRect): number {\n let y = 0;\n while (true) {\n const test: GridRect = { ...widget, y };\n const collision = placed.find(p => GridEngine.collides(p, test));\n if (!collision) return y;\n y = collision.y + collision.rows;\n }\n }\n\n /**\n * Compute the total number of rows the grid needs.\n */\n static getGridHeight(widgets: GridRect[]): number {\n if (widgets.length === 0) return 0;\n return Math.max(...widgets.map(w => w.y + w.rows));\n }\n}\n\n/* ═══════════════════════════════════════════════════════════════════════\n CUSTOM GRID COMPONENT\n ═══════════════════════════════════════════════════════════════════════ */\n\n@Component({\n selector: 'app-grid',\n template: `\n <div\n #gridContainer\n class=\"grid-container\"\n [style.height.px]=\"containerHeight\"\n >\n <!-- Placeholder preview -->\n <div\n class=\"grid-placeholder\"\n *ngIf=\"placeholder\"\n [style.left.px]=\"placeholder.left\"\n [style.top.px]=\"placeholder.top\"\n [style.width.px]=\"placeholder.width\"\n [style.height.px]=\"placeholder.height\"\n ></div>\n\n <!-- Widget items -->\n <div\n *ngFor=\"let widget of widgets; trackBy: trackByFn\"\n class=\"grid-item\"\n [class.is-dragging]=\"dragging?.id === widget.id\"\n [class.is-resizing]=\"resizing?.id === widget.id\"\n [style.left.px]=\"getItemLeft(widget)\"\n [style.top.px]=\"getItemTop(widget)\"\n [style.width.px]=\"getItemWidth(widget)\"\n [style.height.px]=\"getItemHeight(widget)\"\n [style.z-index]=\"(dragging?.id === widget.id || resizing?.id === widget.id) ? 100 : 1\"\n (mousedown)=\"onDragStart($event, widget)\"\n >\n <!-- Content stamped from parent template, context carries the widget -->\n <ng-container\n *ngIf=\"cellTemplate\"\n [ngTemplateOutlet]=\"cellTemplate\"\n [ngTemplateOutletContext]=\"{ widget: widget }\"\n ></ng-container>\n\n <!-- Resize handle -->\n <div class=\"resize-handle\" (mousedown)=\"onResizeStart($event, widget)\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\">\n <path d=\"M11 1v10H1\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <path d=\"M11 5v6H5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <path d=\"M11 9v2H9\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n </div>\n </div>\n </div>\n `,\n styles: [`\n :host { display: block; width: 100%; height: 100%; }\n\n .grid-container {\n position: relative;\n width: 100%;\n min-height: 100%;\n transition: height 0.25s ease;\n }\n\n .grid-placeholder {\n position: absolute;\n background: var(--dash-placeholder-color, var(--dash-accent-color, #0a84ff));\n opacity: 0.12;\n border-radius: 24px;\n border: 2px dashed var(--dash-placeholder-color, var(--dash-accent-color, #0a84ff));\n transition: left 0.15s ease, top 0.15s ease, width 0.15s ease, height 0.15s ease;\n pointer-events: none;\n z-index: 0;\n }\n\n .grid-item {\n position: absolute;\n display: flex;\n flex-direction: column;\n transition: left 0.25s ease, top 0.25s ease, width 0.25s ease, height 0.25s ease;\n border-radius: 24px;\n overflow: hidden;\n }\n\n .grid-item.is-dragging,\n .grid-item.is-resizing {\n transition: none !important;\n opacity: 0.88;\n overflow: visible;\n }\n\n /* Resize Handle */\n .resize-handle {\n position: absolute;\n right: 4px;\n bottom: 4px;\n width: 22px;\n height: 22px;\n cursor: nwse-resize;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--dash-resize-handle-color, rgba(255,255,255,0.25));\n border-radius: 6px;\n transition: color 0.2s, background 0.2s;\n z-index: 20;\n }\n .resize-handle:hover {\n color: var(--dash-accent-color, #0a84ff);\n background: rgba(255,255,255,0.06);\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class CustomGridComponent implements OnInit, OnDestroy, OnChanges {\n @Input() widgets: Widget[] = [];\n @Input() columns: number = 12;\n @Input() gap: number = 16;\n @Input() rowHeight: number = 80;\n @Input() minItemCols: number = 1;\n @Input() minItemRows: number = 1;\n\n @Output() itemChanged = new EventEmitter<Widget>();\n @Output() layoutChanged = new EventEmitter<Widget[]>();\n\n @ViewChild('gridContainer', { static: true }) gridContainer!: ElementRef<HTMLDivElement>;\n\n /** The ng-template decorated with gridCell from the parent */\n @ContentChild(GridCellDirective, { read: TemplateRef }) cellTemplate!: TemplateRef<{ widget: Widget }>;\n\n placeholder: { left: number; top: number; width: number; height: number } | null = null;\n containerHeight = 400;\n\n dragging: {\n id: string;\n offsetX: number;\n offsetY: number;\n currentPixelX: number;\n currentPixelY: number;\n } | null = null;\n\n resizing: {\n id: string;\n startMouseX: number;\n startMouseY: number;\n startCols: number;\n startRows: number;\n currentPixelW: number;\n currentPixelH: number;\n } | null = null;\n\n private previewWidgets: GridRect[] = [];\n private boundMouseMove = this.onMouseMove.bind(this);\n private boundMouseUp = this.onMouseUp.bind(this);\n\n constructor(private zone: NgZone, private cdr: ChangeDetectorRef) {}\n\n ngOnInit() {\n this.compactAndApply();\n this.updateContainerHeight();\n this.zone.runOutsideAngular(() => {\n window.addEventListener('mousemove', this.boundMouseMove);\n window.addEventListener('mouseup', this.boundMouseUp);\n });\n }\n\n ngOnChanges(_changes: SimpleChanges) {\n this.updateContainerHeight();\n }\n\n ngOnDestroy() {\n window.removeEventListener('mousemove', this.boundMouseMove);\n window.removeEventListener('mouseup', this.boundMouseUp);\n }\n\n trackByFn(_index: number, item: Widget) { return item.id; }\n\n // ── Geometry ──\n\n private get cellWidth(): number {\n const containerW = this.gridContainer?.nativeElement?.clientWidth ?? 800;\n return (containerW - (this.columns - 1) * this.gap) / this.columns;\n }\n\n private colToPixel(col: number): number {\n return col * (this.cellWidth + this.gap);\n }\n\n private rowToPixel(row: number): number {\n return row * (this.rowHeight + this.gap);\n }\n\n private pixelToCol(px: number): number {\n return Math.round(px / (this.cellWidth + this.gap));\n }\n\n private pixelToRow(px: number): number {\n return Math.round(px / (this.rowHeight + this.gap));\n }\n\n private colsToPixelWidth(cols: number): number {\n return cols * this.cellWidth + (cols - 1) * this.gap;\n }\n\n private rowsToPixelHeight(rows: number): number {\n return rows * this.rowHeight + (rows - 1) * this.gap;\n }\n\n getItemLeft(w: Widget): number {\n return this.dragging?.id === w.id ? this.dragging.currentPixelX : this.colToPixel(w.x);\n }\n\n getItemTop(w: Widget): number {\n return this.dragging?.id === w.id ? this.dragging.currentPixelY : this.rowToPixel(w.y);\n }\n\n getItemWidth(w: Widget): number {\n return this.resizing?.id === w.id ? this.resizing.currentPixelW : this.colsToPixelWidth(w.cols);\n }\n\n getItemHeight(w: Widget): number {\n return this.resizing?.id === w.id ? this.resizing.currentPixelH : this.rowsToPixelHeight(w.rows);\n }\n\n // ── Drag ──\n\n onDragStart(event: MouseEvent, widget: Widget) {\n const target = event.target as HTMLElement;\n if (target.closest('button, input, select, textarea, a, .resize-handle')) return;\n event.preventDefault();\n event.stopPropagation();\n\n const rect = this.gridContainer.nativeElement.getBoundingClientRect();\n const itemLeft = this.colToPixel(widget.x);\n const itemTop = this.rowToPixel(widget.y);\n\n this.dragging = {\n id: widget.id,\n offsetX: event.clientX - rect.left - itemLeft,\n offsetY: event.clientY - rect.top - itemTop,\n currentPixelX: itemLeft,\n currentPixelY: itemTop,\n };\n this.previewWidgets = this.widgets.map(w => ({ id: w.id, x: w.x, y: w.y, cols: w.cols, rows: w.rows }));\n this.placeholder = {\n left: itemLeft, top: itemTop,\n width: this.colsToPixelWidth(widget.cols),\n height: this.rowsToPixelHeight(widget.rows),\n };\n this.cdr.markForCheck();\n }\n\n onResizeStart(event: MouseEvent, widget: Widget) {\n event.preventDefault();\n event.stopPropagation();\n this.resizing = {\n id: widget.id,\n startMouseX: event.clientX,\n startMouseY: event.clientY,\n startCols: widget.cols,\n startRows: widget.rows,\n currentPixelW: this.colsToPixelWidth(widget.cols),\n currentPixelH: this.rowsToPixelHeight(widget.rows),\n };\n this.previewWidgets = this.widgets.map(w => ({ id: w.id, x: w.x, y: w.y, cols: w.cols, rows: w.rows }));\n this.placeholder = {\n left: this.colToPixel(widget.x), top: this.rowToPixel(widget.y),\n width: this.colsToPixelWidth(widget.cols),\n height: this.rowsToPixelHeight(widget.rows),\n };\n this.cdr.markForCheck();\n }\n\n private onMouseMove(event: MouseEvent) {\n if (this.dragging) this.handleDragMove(event);\n else if (this.resizing) this.handleResizeMove(event);\n }\n\n private onMouseUp(_event: MouseEvent) {\n if (this.dragging) this.zone.run(() => this.finalizeDrag());\n else if (this.resizing) this.zone.run(() => this.finalizeResize());\n }\n\n private handleDragMove(event: MouseEvent) {\n if (!this.dragging) return;\n const rect = this.gridContainer.nativeElement.getBoundingClientRect();\n const widget = this.widgets.find(w => w.id === this.dragging!.id)!;\n if (!widget) return;\n\n let px = event.clientX - rect.left - this.dragging.offsetX;\n let py = event.clientY - rect.top - this.dragging.offsetY;\n px = Math.max(0, Math.min(px, rect.width - this.colsToPixelWidth(widget.cols)));\n py = Math.max(0, py);\n\n this.dragging.currentPixelX = px;\n this.dragging.currentPixelY = py;\n\n const targetCol = Math.max(0, Math.min(this.pixelToCol(px), this.columns - widget.cols));\n const targetRow = Math.max(0, this.pixelToRow(py));\n\n const resolved = GridEngine.moveWidget(\n this.previewWidgets,\n { id: widget.id, x: widget.x, y: widget.y, cols: widget.cols, rows: widget.rows },\n targetCol, targetRow, this.columns\n );\n\n this.placeholder = {\n left: this.colToPixel(targetCol), top: this.rowToPixel(targetRow),\n width: this.colsToPixelWidth(widget.cols),\n height: this.rowsToPixelHeight(widget.rows),\n };\n\n this.zone.run(() => {\n for (const rw of resolved) {\n if (rw.id === widget.id) continue;\n const w = this.widgets.find(ww => ww.id === rw.id);\n if (w) { w.x = rw.x; w.y = rw.y; }\n }\n this.updateContainerHeight();\n this.cdr.markForCheck();\n });\n }\n\n private finalizeDrag() {\n if (!this.dragging) return;\n const widget = this.widgets.find(w => w.id === this.dragging!.id)!;\n const targetCol = Math.max(0, Math.min(this.pixelToCol(this.dragging.currentPixelX), this.columns - widget.cols));\n const targetRow = Math.max(0, this.pixelToRow(this.dragging.currentPixelY));\n\n const resolved = GridEngine.moveWidget(\n this.widgets.map(w => ({ id: w.id, x: w.x, y: w.y, cols: w.cols, rows: w.rows })),\n { id: widget.id, x: widget.x, y: widget.y, cols: widget.cols, rows: widget.rows },\n targetCol, targetRow, this.columns\n );\n for (const rw of resolved) {\n const w = this.widgets.find(ww => ww.id === rw.id);\n if (w) { w.x = rw.x; w.y = rw.y; w.cols = rw.cols; w.rows = rw.rows; this.itemChanged.emit(w); }\n }\n this.dragging = null;\n this.placeholder = null;\n this.previewWidgets = [];\n this.updateContainerHeight();\n this.layoutChanged.emit(this.widgets);\n this.cdr.markForCheck();\n }\n\n private handleResizeMove(event: MouseEvent) {\n if (!this.resizing) return;\n const widget = this.widgets.find(w => w.id === this.resizing!.id)!;\n if (!widget) return;\n\n const dx = event.clientX - this.resizing.startMouseX;\n const dy = event.clientY - this.resizing.startMouseY;\n\n let newCols = Math.max(this.minItemCols, Math.round((this.colsToPixelWidth(this.resizing.startCols) + dx) / (this.cellWidth + this.gap)));\n let newRows = Math.max(this.minItemRows, Math.round((this.rowsToPixelHeight(this.resizing.startRows) + dy) / (this.rowHeight + this.gap)));\n newCols = Math.min(newCols, this.columns - widget.x);\n\n this.resizing.currentPixelW = this.colsToPixelWidth(newCols);\n this.resizing.currentPixelH = this.rowsToPixelHeight(newRows);\n\n const resolved = GridEngine.resizeWidget(\n this.previewWidgets,\n { id: widget.id, x: widget.x, y: widget.y, cols: widget.cols, rows: widget.rows },\n newCols, newRows, this.columns\n );\n\n this.placeholder = {\n left: this.colToPixel(widget.x), top: this.rowToPixel(widget.y),\n width: this.colsToPixelWidth(newCols),\n height: this.rowsToPixelHeight(newRows),\n };\n\n this.zone.run(() => {\n for (const rw of resolved) {\n if (rw.id === widget.id) continue;\n const w = this.widgets.find(ww => ww.id === rw.id);\n if (w) { w.x = rw.x; w.y = rw.y; }\n }\n this.updateContainerHeight();\n this.cdr.markForCheck();\n });\n }\n\n private finalizeResize() {\n if (!this.resizing) return;\n const widget = this.widgets.find(w => w.id === this.resizing!.id)!;\n\n let newCols = Math.max(this.minItemCols, Math.round(this.resizing.currentPixelW / (this.cellWidth + this.gap)));\n let newRows = Math.max(this.minItemRows, Math.round(this.resizing.currentPixelH / (this.rowHeight + this.gap)));\n newCols = Math.min(newCols, this.columns - widget.x);\n\n const resolved = GridEngine.resizeWidget(\n this.widgets.map(w => ({ id: w.id, x: w.x, y: w.y, cols: w.cols, rows: w.rows })),\n { id: widget.id, x: widget.x, y: widget.y, cols: widget.cols, rows: widget.rows },\n newCols, newRows, this.columns\n );\n for (const rw of resolved) {\n const w = this.widgets.find(ww => ww.id === rw.id);\n if (w) { w.x = rw.x; w.y = rw.y; w.cols = rw.cols; w.rows = rw.rows; this.itemChanged.emit(w); }\n }\n this.resizing = null;\n this.placeholder = null;\n this.previewWidgets = [];\n this.updateContainerHeight();\n this.layoutChanged.emit(this.widgets);\n this.cdr.markForCheck();\n }\n\n // ── Utilities ──\n\n private compactAndApply() {\n if (!this.widgets?.length) return;\n const compacted = GridEngine.compact(\n this.widgets.map(w => ({ id: w.id, x: w.x, y: w.y, cols: w.cols, rows: w.rows })),\n this.columns\n );\n for (const rw of compacted) {\n const w = this.widgets.find(ww => ww.id === rw.id);\n if (w) { w.x = rw.x; w.y = rw.y; }\n }\n }\n\n private updateContainerHeight() {\n if (!this.widgets?.length) { this.containerHeight = 400; return; }\n const maxRow = GridEngine.getGridHeight(\n this.widgets.map(w => ({ id: w.id, x: w.x, y: w.y, cols: w.cols, rows: w.rows }))\n );\n this.containerHeight = this.rowToPixel(maxRow) + this.rowHeight + this.gap;\n }\n}\n","import { Injectable, NgZone, OnDestroy } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { Page, Widget, DashboardConfig } from './models';\n\ntype PositionMap = Record<string, { x: number; y: number; cols: number; rows: number }>;\n\ntype SyncEvent =\n | { type: 'PAGE_ADDED'; page: Page }\n | { type: 'PAGE_REMOVED'; pageId: string }\n | { type: 'PAGE_RENAMED'; pageId: string; name: string }\n | { type: 'WIDGET_ADDED'; pageId: string; widget: Widget }\n | { type: 'WIDGET_REMOVED';pageId: string; widgetId: string }\n | { type: 'WIDGET_META'; widgetId: string; patch: Partial<Omit<Widget,'id'|'x'|'y'|'cols'|'rows'>> };\n\n@Injectable({ providedIn: 'root' })\nexport class DashboardStateService implements OnDestroy {\n /**\n * Shared key — stores page list + widget metadata (no positions).\n * Read and written by every window.\n */\n private readonly SHARED_KEY = 'ogidor_shared';\n\n /**\n * Per-window positions key — stores {pageId:widgetId → {x,y,cols,rows}}.\n * Pop-out windows get a key scoped to their pageId so they never overwrite\n * the main window or each other.\n * main window → ogidor_positions_main\n * pop-out #abc → ogidor_positions_abc\n */\n private readonly positionsKey: string;\n\n private readonly CHANNEL_NAME = 'ogidor_dashboard_sync';\n private channel = typeof BroadcastChannel !== 'undefined'\n ? new BroadcastChannel(this.CHANNEL_NAME) : null;\n\n private readonly initialPages: Page[] = [\n { id: 'page-1', name: 'Default Workspace', widgets: [] }\n ];\n\n private pagesSubject = new BehaviorSubject<Page[]>(this.initialPages);\n private activePageIdSubject = new BehaviorSubject<string>(this.initialPages[0].id);\n\n pages$ = this.pagesSubject.asObservable();\n activePageId$ = this.activePageIdSubject.asObservable();\n\n constructor(private zone: NgZone) {\n // Determine whether we are a pop-out window\n const hash = typeof window !== 'undefined'\n ? window.location.hash.replace('#', '').trim() : '';\n this.positionsKey = hash ? `ogidor_positions_${hash}` : 'ogidor_positions_main';\n\n // 1. Load the shared structural state\n const shared = localStorage.getItem(this.SHARED_KEY);\n if (shared) {\n try { this._applyShared(JSON.parse(shared), false); }\n catch (e) { console.error('[Dashboard] bad shared state', e); }\n }\n\n // 2. Overlay this window's saved positions on top\n this._restorePositions();\n\n // 3. Listen for structural changes broadcast by other windows\n if (this.channel) {\n this.channel.onmessage = (ev: MessageEvent<SyncEvent>) => {\n this.zone.run(() => this._onSyncEvent(ev.data));\n };\n }\n }\n\n ngOnDestroy() { this.channel?.close(); }\n\n // ── Page actions ──────────────────────────────────────────────\n\n getActivePage(): Page | undefined {\n return this.pagesSubject.value.find(p => p.id === this.activePageIdSubject.value);\n }\n\n setActivePage(id: string) { this.activePageIdSubject.next(id); }\n\n addPage(name: string) {\n const page: Page = { id: `page-${Date.now()}`, name, widgets: [] };\n this.pagesSubject.next([...this.pagesSubject.value, page]);\n this.activePageIdSubject.next(page.id);\n this._saveShared();\n this._broadcast({ type: 'PAGE_ADDED', page });\n }\n\n removePage(id: string) {\n const pages = this.pagesSubject.value;\n if (pages.length <= 1) return;\n const updated = pages.filter(p => p.id !== id);\n this.pagesSubject.next(updated);\n if (this.activePageIdSubject.value === id) {\n this.activePageIdSubject.next(updated[0].id);\n }\n this._saveShared();\n this._broadcast({ type: 'PAGE_REMOVED', pageId: id });\n }\n\n // ── Widget structural actions (synced to all windows) ─────────\n\n addWidget(widget: Partial<Widget> & { title: string }): Widget {\n const activePage = this.getActivePage();\n if (!activePage) throw new Error('No active page');\n const newWidget: Widget = {\n id: `widget-${Date.now()}`,\n x: 0, y: 0, cols: 4, rows: 3,\n ...widget,\n };\n activePage.widgets = [...activePage.widgets, newWidget];\n this.pagesSubject.next([...this.pagesSubject.value]);\n this._saveShared();\n this._savePositions(); // register default position locally\n this._broadcast({ type: 'WIDGET_ADDED', pageId: activePage.id, widget: newWidget });\n return newWidget;\n }\n\n updateWidget(widgetId: string, patch: Partial<Omit<Widget,'id'|'x'|'y'|'cols'|'rows'>>) {\n const pages = this.pagesSubject.value;\n for (const page of pages) {\n const w = page.widgets.find(w => w.id === widgetId);\n if (w) {\n Object.assign(w, patch);\n this.pagesSubject.next([...pages]);\n this._saveShared();\n this._broadcast({ type: 'WIDGET_META', widgetId, patch });\n return;\n }\n }\n }\n\n removeWidget(widgetId: string) {\n const activePage = this.getActivePage();\n if (!activePage) return;\n const pageId = activePage.id;\n activePage.widgets = activePage.widgets.filter(w => w.id !== widgetId);\n this.pagesSubject.next([...this.pagesSubject.value]);\n this._saveShared();\n this._savePositions();\n this._broadcast({ type: 'WIDGET_REMOVED', pageId, widgetId });\n }\n\n // ── Position actions (local to THIS window only) ──────────────\n\n /**\n * Update a widget's grid position/size.\n * Saved only for this window — never broadcast to others.\n */\n updateWidgetPosition(pageId: string, widgetId: string, x: number, y: number, cols: number, rows: number) {\n const pages = this.pagesSubject.value;\n const widget = pages.find(p => p.id === pageId)?.widgets.find(w => w.id === widgetId);\n if (widget) {\n widget.x = x; widget.y = y; widget.cols = cols; widget.rows = rows;\n this.pagesSubject.next([...pages]);\n this._savePositions(); // local only — intentionally no _saveShared / no broadcast\n }\n }\n\n // ── Serialization ─────────────────────────────────────────────\n\n serializeLayout(): string {\n return JSON.stringify({\n pages: this.pagesSubject.value,\n activePageId: this.activePageIdSubject.value,\n } as DashboardConfig);\n }\n\n loadLayout(config: any) {\n if (!config?.pages) return;\n this._applyShared(config, true);\n this._saveShared();\n this._savePositions();\n }\n\n popOutPage(pageId: string) {\n const url = `${window.location.origin}${window.location.pathname}#${pageId}`;\n window.open(url, `workspace_${pageId}`,\n 'width=1280,height=800,menubar=no,toolbar=no,location=no,status=no');\n }\n\n // ── Private helpers ───────────────────────────────────────────\n\n /**\n * Save page list + widget metadata (titles, cardColor, data) — no positions.\n */\n private _saveShared() {\n const stripped = this.pagesSubject.value.map(p => ({\n ...p,\n widgets: p.widgets.map(({ id, title, cardColor, data, cols, rows }) =>\n // Keep default cols/rows so new windows get a sensible first-open layout.\n // x/y are intentionally omitted from shared state.\n ({ id, title, cardColor, data, x: 0, y: 0, cols, rows })\n ),\n }));\n localStorage.setItem(this.SHARED_KEY, JSON.stringify({\n pages: stripped,\n activePageId: this.activePageIdSubject.value,\n }));\n }\n\n /**\n * Save this window's grid positions (x, y, cols, rows) per widget.\n */\n private _savePositions() {\n const positions: PositionMap = {};\n for (const page of this.pagesSubject.value) {\n for (const w of page.widgets) {\n positions[`${page.id}:${w.id}`] = { x: w.x, y: w.y, cols: w.cols, rows: w.rows };\n }\n }\n localStorage.setItem(this.positionsKey, JSON.stringify(positions));\n }\n\n /**\n * Overlay the positions saved for THIS window on top of the current pages.\n */\n private _restorePositions() {\n const raw = localStorage.getItem(this.positionsKey);\n if (!raw) return;\n try {\n const positions: PositionMap = JSON.parse(raw);\n const pages = this.pagesSubject.value;\n for (const page of pages) {\n for (const w of page.widgets) {\n const pos = positions[`${page.id}:${w.id}`];\n if (pos) { w.x = pos.x; w.y = pos.y; w.cols = pos.cols; w.rows = pos.rows; }\n }\n }\n this.pagesSubject.next([...pages]);\n } catch (e) {\n console.error('[Dashboard] bad positions state', e);\n }\n }\n\n /**\n * Apply a shared config object (page list + metadata) without touching\n * this window's saved positions.\n */\n private _applyShared(config: any, overwritePositions: boolean) {\n if (!config?.pages) return;\n this.pagesSubject.next(config.pages);\n if (config.activePageId) this.activePageIdSubject.next(config.activePageId);\n if (!overwritePositions) this._restorePositions();\n }\n\n /**\n * Handle a structural sync event arriving from another window.\n * Position changes are never sent so we never receive them here.\n */\n private _onSyncEvent(event: SyncEvent) {\n // Work on a shallow clone of pages so Angular detects the change\n const pages: Page[] = this.pagesSubject.value.map(p => ({\n ...p, widgets: [...p.widgets]\n }));\n\n switch (event.type) {\n\n case 'PAGE_ADDED':\n if (!pages.find(p => p.id === event.page.id)) {\n pages.push({ ...event.page, widgets: [...event.page.widgets] });\n this.pagesSubject.next(pages);\n this._saveShared();\n }\n break;\n\n case 'PAGE_REMOVED': {\n const updated = pages.filter(p => p.id !== event.pageId);\n if (updated.length !== pages.length) {\n this.pagesSubject.next(updated);\n if (this.activePageIdSubject.value === event.pageId) {\n this.activePageIdSubject.next(updated[0]?.id ?? '');\n }\n this._saveShared();\n }\n break;\n }\n\n case 'WIDGET_ADDED': {\n const page = pages.find(p => p.id === event.pageId);\n if (page && !page.widgets.find(w => w.id === event.widget.id)) {\n page.widgets = [...page.widgets, { ...event.widget }];\n this.pagesSubject.next(pages);\n this._saveShared();\n // Don't touch positions — this window will keep its own layout for\n // existing widgets; the new one starts at its default position.\n }\n break;\n }\n\n case 'WIDGET_REMOVED': {\n const page = pages.find(p => p.id === event.pageId);\n if (page) {\n page.widgets = page.widgets.filter(w => w.id !== event.widgetId);\n this.pagesSubject.next(pages);\n this._saveShared();\n this._savePositions();\n }\n break;\n }\n\n case 'WIDGET_META': {\n for (const page of pages) {\n const w = page.widgets.find(w => w.id === event.widgetId);\n if (w) {\n Object.assign(w, event.patch);\n this.pagesSubject.next(pages);\n this._saveShared();\n break;\n }\n }\n break;\n }\n }\n }\n\n private _broadcast(event: SyncEvent) {\n this.channel?.postMessage(event);\n }\n}\n","import {\n Component, Input, Output, EventEmitter, OnChanges, SimpleChanges\n} from '@angular/core';\nimport { Widget, DashboardTheme } from './models';\n\n@Component({\n selector: 'app-widget-renderer',\n template: `\n <div class=\"widget-card\" [style.background]=\"cardBg\">\n <!-- Header: drag handle + title + actions -->\n <div class=\"widget-header\">\n <div class=\"drag-handle\" title=\"Drag to move\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"currentColor\">\n <circle cx=\"4\" cy=\"3\" r=\"1.2\"/><circle cx=\"10\" cy=\"3\" r=\"1.2\"/>\n <circle cx=\"4\" cy=\"7\" r=\"1.2\"/><circle cx=\"10\" cy=\"7\" r=\"1.2\"/>\n <circle cx=\"4\" cy=\"11\" r=\"1.2\"/><circle cx=\"10\" cy=\"11\" r=\"1.2\"/>\n </svg>\n </div>\n <span class=\"widget-title\">{{ widget.title }}</span>\n <div class=\"header-actions\">\n <button class=\"btn-icon btn-edit\" (click)=\"editRequested.emit(widget)\" title=\"Edit\">\n <i class=\"la la-pen\"></i>\n </button>\n <button class=\"btn-icon btn-remove\" (click)=\"removeRequested.emit(widget.id)\" title=\"Remove\">\n <i class=\"la la-times\"></i>\n </button>\n </div>\n </div>\n\n <!-- Consumer content slot -->\n <div class=\"widget-body\">\n <ng-content></ng-content>\n </div>\n </div>\n `,\n styles: [`\n :host {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n width: 100%;\n }\n\n .widget-card {\n flex: 1;\n min-height: 0;\n width: 100%;\n display: flex;\n flex-direction: column;\n border-radius: 24px;\n overflow: hidden;\n border: 1px solid var(--dash-widget-border-color, rgba(255,255,255,0.07));\n box-sizing: border-box;\n background: var(--dash-card-bg, #2c2c2e);\n }\n\n /* ── Header ── */\n .widget-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 14px 8px;\n flex-shrink: 0;\n }\n .drag-handle {\n color: var(--dash-drag-handle-color, rgba(255,255,255,0.2));\n cursor: grab;\n display: flex;\n align-items: center;\n flex-shrink: 0;\n transition: color 0.2s;\n }\n .drag-handle:hover { color: rgba(255,255,255,0.5); }\n .widget-title {\n flex: 1;\n color: var(--dash-widget-title-color, #ffffff);\n font-size: 14px;\n font-weight: 600;\n letter-spacing: 0.2px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n .header-actions {\n display: flex;\n gap: 4px;\n align-items: center;\n opacity: 0;\n transition: opacity 0.2s;\n }\n .widget-card:hover .header-actions { opacity: 1; }\n\n .btn-icon {\n background: var(--dash-widget-btn-bg, rgba(255,255,255,0.07));\n border: none;\n color: var(--dash-widget-btn-color, rgba(255,255,255,0.5));\n cursor: pointer;\n font-size: 11px;\n width: 24px; height: 24px;\n border-radius: 50%;\n display: flex; align-items: center; justify-content: center;\n transition: all 0.2s;\n flex-shrink: 0;\n }\n .btn-edit:hover { background: rgba(10,132,255,0.22); color: var(--dash-accent-color, #0a84ff); }\n .btn-remove:hover { background: rgba(255,69,58,0.22); color: var(--dash-danger-color, #ff453a); }\n\n /* ── Body ── */\n .widget-body {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n padding: 0 14px 14px;\n overflow: hidden;\n }\n `]\n})\nexport class WidgetRendererComponent implements OnChanges {\n @Input() widget!: Widget;\n @Input() theme?: Required<DashboardTheme>;\n\n @Output() editRequested = new EventEmitter<Widget>();\n @Output() removeRequested = new EventEmitter<string>();\n\n cardBg = 'var(--dash-card-bg, #2c2c2e)';\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['widget'] || changes['theme']) {\n this.cardBg = this.widget?.cardColor ?? 'var(--dash-card-bg, #2c2c2e)';\n }\n }\n}\n","import {\n Component, OnInit, OnDestroy, AfterViewInit, Input, Output, OnChanges,\n SimpleChanges, EventEmitter, ContentChild, TemplateRef,\n ChangeDetectorRef, NgZone, Pipe, PipeTransform,\n HostListener, ViewChild, ElementRef\n} from '@angular/core';\nimport { DashboardStateService } from './dashboard-state.service';\nimport { Page, Widget, DashboardTheme } from './models';\nimport { Subscription } from 'rxjs';\nimport { GridCellDirective } from './custom-grid.component';\n\nconst DEFAULT_THEME: Required<DashboardTheme> = {\n backgroundColor: '#000000',\n panelColor: '#1c1c1e',\n panelBorderColor: 'rgba(255,255,255,0.05)',\n widgetCardColor: '#2c2c2e',\n foreColor: '#8e8e93',\n accentColor: '#0a84ff',\n accentTintColor: 'rgba(10,132,255,0.15)',\n accentTintStrongColor: 'rgba(10,132,255,0.25)',\n dangerColor: '#ff453a',\n dangerTintColor: 'rgba(255,69,58,0.22)',\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif',\n tabsContainerColor: 'rgba(44,44,46,0.6)',\n tabActiveColor: '#3a3a3c',\n tabActiveTextColor: '#ffffff',\n tabHoverTextColor: '#e5e5ea',\n tabHoverBgColor: 'rgba(255,255,255,0.05)',\n addWidgetButtonTextColor:'#ffffff',\n overflowBtnBgColor: 'rgba(255,255,255,0.08)',\n overflowBtnBorderColor: 'rgba(255,255,255,0.12)',\n overlayBgColor: 'rgba(0,0,0,0.55)',\n sheetBorderColor: 'rgba(255,255,255,0.08)',\n scrollbarColor: 'rgba(255,255,255,0.15)',\n popoutTitleColor: '#ffffff',\n widgetTitleColor: '#ffffff',\n dragHandleColor: 'rgba(255,255,255,0.2)',\n widgetBorderColor: 'rgba(255,255,255,0.07)',\n widgetButtonBgColor: 'rgba(255,255,255,0.07)',\n widgetButtonColor: 'rgba(255,255,255,0.5)',\n placeholderColor: '#0a84ff',\n resizeHandleColor: 'rgba(255,255,255,0.25)',\n};\n\n@Pipe({ name: 'overflowActive' })\nexport class OverflowActivePipe implements PipeTransform {\n transform(pages: Page[], activePageId: string): boolean {\n return pages.some(p => p.id === activePageId);\n }\n}\n\n@Component({\n selector: 'app-dashboard',\n template: `\n <!-- POPPED-OUT MODE -->\n <ng-container *ngIf=\"isPoppedOut; else normalMode\">\n <div class=\"popout-wrapper\" [ngStyle]=\"wrapperStyles\">\n <header class=\"popout-header\">\n <span class=\"popout-title\">{{ activePage?.name }}</span>\n </header>\n <app-grid [widgets]=\"activePage?.widgets || []\" (itemChanged)=\"onItemChanged($event)\">\n <ng-template gridCell let-widget=\"widget\">\n <app-widget-renderer [widget]=\"widget\" [theme]=\"resolvedTheme\"\n (editRequested)=\"editWidgetRequested.emit($event)\"\n (removeRequested)=\"onRemoveWidget($event)\">\n <ng-container *ngIf=\"cellTemplate\"\n [ngTemplateOutlet]=\"cellTemplate\"\n [ngTemplateOutletContext]=\"{ widget: widget }\">\n </ng-container>\n </app-widget-renderer>\n </ng-template>\n </app-grid>\n </div>\n </ng-container>\n\n <!-- NORMAL MODE -->\n <ng-template #normalMode>\n <div class=\"dashboard-wrapper\" [ngStyle]=\"wrapperStyles\">\n <main class=\"main-content\">\n\n <header class=\"dashboard-header\">\n\n <!-- Tab bar -->\n <div class=\"tabs-track\" #tabsTrack>\n <!-- Visible tabs -->\n <div\n *ngFor=\"let page of visiblePages\"\n class=\"tab\"\n [class.active]=\"page.id === activePageId\"\n (click)=\"onSelectPage(page.id)\"\n >\n <span class=\"tab-name\">{{ page.name }}</span>\n <button class=\"tab-action tab-popout\" (click)=\"onPopOut($event, page.id)\" title=\"Open in new window\">\n <i class=\"la la-external-link-alt\"></i>\n </button>\n <button class=\"tab-action tab-close\" *ngIf=\"pages.length > 1\" (click)=\"onRemovePage($event, page.id)\" title=\"Close\">\n <i class=\"la la-times\"></i>\n </button>\n </div>\n\n <!-- Overflow button — shown only when there are hidden tabs -->\n <button\n *ngIf=\"hiddenCount > 0\"\n class=\"btn-overflow\"\n (click)=\"openTabSwitcher()\"\n title=\"Show all workspaces\"\n >\n <span>+{{ hiddenCount }}</span>\n <i class=\"la la-th-large\"></i>\n </button>\n\n <!-- Add page button -->\n <button class=\"btn-add-page\" (click)=\"onAddPage()\" title=\"New workspace\">\n <i class=\"la la-plus\"></i>\n </button>\n </div>\n\n <button class=\"btn-add-widget\" (click)=\"addWidgetRequested.emit()\" title=\"Add widget\">\n <i class=\"la la-plus\"></i>\n <span>Add Widget</span>\n </button>\n\n </header>\n\n <!-- ── Tab-switcher overlay (Chrome mobile style) ── -->\n <div class=\"tab-switcher-overlay\" *ngIf=\"tabSwitcherOpen\" (click)=\"closeTabSwitcher()\">\n <div class=\"tab-switcher-sheet\" (click)=\"$event.stopPropagation()\">\n\n <div class=\"tab-switcher-header\">\n <span class=\"tab-switcher-title\">{{ pages.length }} Workspace{{ pages.length !== 1 ? 's' : '' }}</span>\n <button class=\"tab-switcher-close-btn\" (click)=\"closeTabSwitcher()\" title=\"Close\">\n <i class=\"la la-times\"></i>\n </button>\n </div>\n\n <div class=\"tab-switcher-grid\">\n <div\n *ngFor=\"let page of pages\"\n class=\"tab-card\"\n [class.active]=\"page.id === activePageId\"\n (click)=\"onSwitcherSelect(page.id)\"\n >\n <div class=\"tab-card-icon\">\n <i class=\"la la-th-large\"></i>\n </div>\n <span class=\"tab-card-name\">{{ page.name }}</span>\n <div class=\"tab-card-actions\">\n <button class=\"tab-card-btn tab-card-popout\" (click)=\"onSwitcherPopOut($event, page.id)\" title=\"Open in new window\">\n <i class=\"la la-external-link-alt\"></i>\n </button>\n <button class=\"tab-card-btn tab-card-remove\" *ngIf=\"pages.length > 1\" (click)=\"onSwitcherRemove($event, page.id)\" title=\"Close\">\n <i class=\"la la-times\"></i>\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"tab-switcher-footer\">\n <button class=\"tab-switcher-add-btn\" (click)=\"onSwitcherAdd()\">\n <i class=\"la la-plus\"></i>\n <span>New Workspace</span>\n </button>\n </div>\n\n </div>\n </div>\n\n <div class=\"grid-container\">\n <app-grid [widgets]=\"activePage?.widgets || []\" (itemChanged)=\"onItemChanged($event)\">\n <ng-template gridCell let-widget=\"widget\">\n <app-widget-renderer [widget]=\"widget\" [theme]=\"resolvedTheme\"\n (editRequested)=\"editWidgetRequested.emit($event)\"\n (removeRequested)=\"onRemoveWidget($event)\">\n <ng-container *ngIf=\"cellTemplate\"\n [ngTemplateOutlet]=\"cellTemplate\"\n [ngTemplateOutletContext]=\"{ widget: widget }\">\n </ng-container>\n </app-widget-renderer>\n </ng-template>\n </app-grid>\n </div>\n\n </main>\n </div>\n </ng-template>\n `,\n styles: [`\n :host {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n min-height: 0;\n --dash-bg: #000000;\n --dash-panel-bg: #1c1c1e;\n --dash-panel-border: rgba(255,255,255,0.05);\n --dash-card-bg: #2c2c2e;\n --dash-fore-color: #8e8e93;\n --dash-accent-color: #0a84ff;\n --dash-accent-tint: rgba(10,132,255,0.15);\n --dash-accent-tint-strong: rgba(10,132,255,0.25);\n --dash-danger-color: #ff453a;\n --dash-danger-tint: rgba(255,69,58,0.22);\n --dash-font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif;\n --dash-tabs-container-color: rgba(44,44,46,0.6);\n --dash-tab-active-color: #3a3a3c;\n --dash-tab-active-text: #ffffff;\n --dash-tab-hover-text: #e5e5ea;\n --dash-tab-hover-bg: rgba(255,255,255,0.05);\n --dash-add-widget-text: #ffffff;\n --dash-overflow-btn-bg: rgba(255,255,255,0.08);\n --dash-overflow-btn-border: rgba(255,255,255,0.12);\n --dash-overlay-bg: rgba(0,0,0,0.55);\n --dash-sheet-border: rgba(255,255,255,0.08);\n --dash-scrollbar-color: rgba(255,255,255,0.15);\n --dash-popout-title-color: #ffffff;\n --dash-widget-title-color: #ffffff;\n --dash-drag-handle-color: rgba(255,255,255,0.2);\n --dash-widget-border-color: rgba(255,255,255,0.07);\n --dash-widget-btn-bg: rgba(255,255,255,0.07);\n --dash-widget-btn-color: rgba(255,255,255,0.5);\n --dash-placeholder-color: #0a84ff;\n --dash-resize-handle-color: rgba(255,255,255,0.25);\n }\n\n /* ── Normal layout ── */\n .dashboard-wrapper {\n display: flex;\n flex: 1;\n min-height: 0;\n overflow: hidden;\n padding: 16px;\n box-sizing: border-box;\n background: var(--dash-bg);\n color: var(--dash-fore-color);\n font-family: var(--dash-font-family);\n }\n .main-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n border-radius: 40px;\n padding: 20px;\n background: var(--dash-panel-bg);\n border: 1px solid var(--dash-panel-border);\n position: relative;\n }\n\n /* ── Pop-out layout ── */\n .popout-wrapper {\n display: flex;\n flex: 1;\n flex-direction: column;\n min-height: 0;\n overflow: hidden;\n padding: 16px;\n box-sizing: border-box;\n background: var(--dash-bg);\n color: var(--dash-fore-color);\n font-family: var(--dash-font-family);\n }\n .popout-header {\n display: flex;\n align-items: center;\n margin-bottom: 16px;\n padding: 10px 18px;\n background: var(--dash-panel-bg);\n border-radius: 20px;\n border: 1px solid var(--dash-panel-border);\n flex-shrink: 0;\n }\n .popout-title { font-size: 16px; font-weight: 700; color: var(--dash-popout-title-color); }\n .popout-wrapper app-grid { flex: 1; min-height: 0; overflow: auto; }\n\n /* ── Header ── */\n .dashboard-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 20px;\n gap: 12px;\n flex-shrink: 0;\n }\n\n /* ── Tab bar ── */\n .tabs-track {\n display: flex;\n align-items: center;\n gap: 6px;\n flex: 1;\n min-width: 0;\n background: var(--dash-tabs-container-color);\n backdrop-filter: blur(10px);\n border-radius: 25px;\n padding: 6px;\n overflow: hidden;\n }\n\n /* ── Individual tab ── */\n .tab {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 8px 14px 8px 18px;\n border-radius: 20px;\n cursor: pointer;\n font-size: 14px;\n font-weight: 500;\n color: var(--dash-fore-color);\n white-space: nowrap;\n flex-shrink: 0;\n transition: background 0.2s, color 0.2s;\n }\n .tab.active { background: var(--dash-tab-active-color); color: var(--dash-tab-active-text); }\n .tab:hover:not(.active) { color: var(--dash-tab-hover-text); background: var(--dash-tab-hover-bg); }\n .tab-name { white-space: nowrap; }\n .tab-action {\n background: transparent; border: none; color: var(--dash-fore-color);\n padding: 2px; font-size: 11px; cursor: pointer; opacity: 0; border-radius: 50%;\n width: 20px; height: 20px; display: flex; align-items: center; justify-content: center;\n transition: all 0.2s; flex-shrink: 0;\n }\n .tab:hover .tab-action { opacity: 1; }\n .tab-popout:hover { color: var(--dash-accent-color); background: var(--dash-accent-tint); }\n .tab-close:hover { color: var(--dash-danger-color); background: var(--dash-danger-tint); }\n\n /* ── Overflow \"+N\" button ── */\n .btn-overflow {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n background: var(--dash-overflow-btn-bg);\n border: 1px solid var(--dash-overflow-btn-border);\n border-radius: 20px;\n padding: 7px 13px;\n cursor: pointer;\n font-size: 13px;\n font-weight: 600;\n color: var(--dash-tab-active-text);\n white-space: nowrap;\n flex-shrink: 0;\n transition: background 0.2s, border-color 0.2s, color 0.2s;\n }\n .btn-overflow:hover { background: var(--dash-accent-tint); border-color: var(--dash-accent-color); color: var(--dash-accent-color); }\n\n /* ── Add page button ── */\n .btn-add-page {\n background: transparent; border: none; color: var(--dash-fore-color);\n padding: 8px 14px; cursor: pointer; border-radius: 20px;\n flex-shrink: 0;\n transition: all 0.2s;\n }\n .btn-add-page:hover { color: var(--dash-accent-color); background: var(--dash-accent-tint); }\n\n /* ── Tab-switcher overlay ── */\n .tab-switcher-overlay {\n position: absolute;\n inset: 0;\n z-index: 1000;\n background: var(--dash-overlay-bg);\n backdrop-filter: blur(4px);\n display: flex;\n align-items: flex-start;\n justify-content: center;\n padding-top: 60px;\n animation: overlay-in 0.18s ease;\n }\n @keyframes overlay-in {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n\n .tab-switcher-sheet {\n background: var(--dash-panel-bg);\n border: 1px solid var(--dash-sheet-border);\n border-radius: 24px;\n width: min(520px, calc(100% - 32px));\n max-height: calc(100% - 80px);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n animation: sheet-in 0.22s cubic-bezier(.32,1.2,.5,1);\n }\n @keyframes sheet-in {\n from { transform: translateY(-16px) scale(0.97); opacity: 0; }\n to { transform: translateY(0) scale(1); opacity: 1; }\n }\n\n .tab-switcher-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px 12px;\n border-bottom: 1px solid var(--dash-sheet-border);\n flex-shrink: 0;\n }\n .tab-switcher-title {\n font-size: 15px;\n font-weight: 700;\n color: var(--dash-tab-active-text);\n }\n .tab-switcher-close-btn {\n background: var(--dash-widget-btn-bg);\n border: none;\n color: var(--dash-fore-color);\n width: 28px; height: 28px;\n border-radius: 50%;\n display: flex; align-items: center; justify-content: center;\n cursor: pointer;\n font-size: 14px;\n transition: background 0.15s, color 0.15s;\n }\n .tab-switcher-close-btn:hover { background: var(--dash-danger-tint); color: var(--dash-danger-color); }\n\n .tab-switcher-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));\n gap: 10px;\n padding: 16px;\n overflow-y: auto;\n scrollbar-width: thin;\n scrollbar-color: var(--dash-scrollbar-color) transparent;\n }\n\n .tab-card {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n padding: 16px 12px 12px;\n border-radius: 16px;\n background: var(--dash-card-bg);\n border: 1.5px solid transparent;\n cursor: pointer;\n transition: border-color 0.15s, background 0.15s, transform 0.12s;\n position: relative;\n }\n .tab-card:hover { background: var(--dash-tab-hover-bg); transform: translateY(-2px); }\n .tab-card.active {\n border-color: var(--dash-accent-color);\n background: var(--dash-accent-tint);\n }\n .tab-card-icon {\n width: 44px; height: 44px;\n border-radius: 12px;\n background: var(--dash-widget-btn-bg);\n display: flex; align-items: center; justify-content: center;\n font-size: 20px;\n color: var(--dash-fore-color);\n }\n .tab-card.active .tab-card-icon {\n background: var(--dash-accent-tint-strong);\n color: var(--dash-accent-color);\n }\n .tab-card-name {\n font-size: 13px;\n font-weight: 500;\n color: var(--dash-tab-active-text);\n text-align: center;\n word-break: break-word;\n line-height: 1.3;\n }\n .tab-card-actions {\n display: flex;\n gap: 4px;\n opacity: 0;\n transition: opacity 0.15s;\n }\n .tab-card:hover .tab-card-actions { opacity: 1; }\n .tab-card-btn {\n background: var(--dash-widget-btn-bg);\n border: none;\n width: 26px; height: 26px;\n border-radius: 50%;\n display: flex; align-items: center; justify-content: center;\n cursor: pointer;\n font-size: 12px;\n color: var(--dash-fore-color);\n transition: background 0.15s, color 0.15s;\n }\n .tab-card-popout:hover { background: var(--dash-accent-tint-strong); color: var(--dash-accent-color); }\n .tab-card-remove:hover { background: var(--dash-danger-tint); color: var(--dash-danger-color); }\n\n .tab-switcher-footer {\n padding: 12px 16px 16px;\n border-top: 1px solid var(--dash-sheet-border);\n flex-shrink: 0;\n }\n .tab-switcher-add-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n width: 100%;\n padding: 11px 20px;\n border-radius: 16px;\n background: var(--dash-accent-tint);\n border: 1.5px dashed var(--dash-accent-tint-strong);\n color: var(--dash-accent-color);\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n transition: background 0.15s, border-color 0.15s;\n }\n .tab-switcher-add-btn:hover { background: var(--dash-accent-tint-strong); border-color: var(--dash-accent-color); }\n\n .btn-add-widget {\n display: flex; align-items: center; gap: 6px;\n background: var(--dash-accent-color); border: none; color: var(--dash-add-widget-text);\n font-size: 14px; font-weight: 600; padding: 10px 20px; border-radius: 22px;\n cursor: pointer; white-space: nowrap; flex-shrink: 0;\n transition: opacity 0.2s, transform 0.15s;\n }\n .btn-add-widget:hover { opacity: 0.9; transform: translateY(-1px); }\n .btn-add-widget:active { transform: translateY(0); }\n\n /* ── Grid ── */\n .main-content .grid-container { flex: 1; overflow: auto; border-radius: 24px; min-height: 0; }\n app-grid { background: transparent; display: block; height: 100%; width: 100%; }\n `]\n})\nexport class DashboardComponent implements OnInit, AfterViewInit, OnDestroy, OnChanges {\n @Input() initialLayout?: string;\n @Input() theme?: DashboardTheme;\n\n @Output() addWidgetRequested = new EventEmitter<void>();\n @Output() editWidgetRequested = new EventEmitter<Widget>();\n\n @ContentChild(GridCellDirective, { read: TemplateRef })\n cellTemplate?: TemplateRef<{ widget: Widget }>;\n\n @ViewChild('tabsTrack') tabsTrackRef!: ElementRef<HTMLDivElement>;\n\n resolvedTheme: Required<DashboardTheme> = { ...DEFAULT_THEME };\n wrapperStyles: Record<string, string> = {};\n\n pages: Page[] = [];\n visiblePages: Page[] = [];\n hiddenCount = 0;\n activePageId = '';\n activePage?: Page;\n isPoppedOut = false;\n tabSwitcherOpen = false;\n\n private subs = new Subscription();\n private resizeObserver?: ResizeObserver;\n\n // Reserved space for the overflow \"+N\" button and the add \"+\" button (px)\n private readonly OVERFLOW_BTN_W = 80;\n private readonly ADD_BTN_W = 52;\n private readonly GAP = 6;\n private readonly PADDING = 12; // 6px each side\n\n constructor(\n public stateService: DashboardStateService,\n private cdr: ChangeDetectorRef,\n private zone: NgZone\n ) {}\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['theme'] || changes['initialLayout']) this.applyTheme();\n }\n\n ngOnInit() {\n this.applyTheme();\n\n if (this.initialLayout) {\n try { this.stateService.loadLayout(JSON.parse(this.initialLayout)); }\n catch (e) { console.error('[Dashboard] Failed to parse initialLayout', e); }\n }\n\n const hash = window.location.hash?.replace('#', '').trim();\n if (hash) this.isPoppedOut = true;\n\n this.subs.add(this.stateService.pages$.subscribe(pages => {\n this.pages = pages;\n this._tabWidthCache = []; // invalidate cache — page list changed\n if (this.isPoppedOut && hash) {\n if (pages.find(p => p.id === hash)) this.stateService.setActivePage(hash);\n }\n this.updateActivePage();\n this.recalcVisibleTabs();\n // Second pass after Angular has rendered the updated tab elements\n setTimeout(() => this.recalcVisibleTabs());\n }));\n this.subs.add(this.stateService.activePageId$.subscribe(id => {\n this.activePageId = id;\n this.updateActivePage();\n }));\n }\n\n ngAfterViewInit() {\n if (!this.tabsTrackRef) return;\n this.zone.runOutsideAngular(() => {\n this.resizeObserver = new ResizeObserver(() => {\n this.zone.run(() => this.recalcVisibleTabs());\n });\n this.resizeObserver.observe(this.tabsTrackRef.nativeElement);\n });\n // Initial measurement pass now that the DOM is ready\n setTimeout(() => this.recalcVisibleTabs());\n }\n\n ngOnDestroy() {\n this.subs.unsubscribe();\n this.resizeObserver?.disconnect();\n }\n\n onItemChanged(widget: Widget) {\n this.stateService.updateWidgetPosition(\n this.activePageId, widget.id, widget.x, widget.y, widget.cols, widget.rows\n );\n }\n\n onRemoveWidget(widgetId: string) { this.stateService.removeWidget(widgetId); }\n\n onSelectPage(id: string) { this.stateService.setActivePage(id); }\n\n onAddPage() {\n const name = prompt('Workspace name:', `Workspace ${this.pages.length + 1}`);\n if (name) this.stateService.addPage(name);\n }\n\n onRemovePage(event: Event, id: string) {\n event.stopPropagation();\n if (confirm('Remove this workspace?')) this.stateService.removePage(id);\n }\n\n onPopOut(event: Event, pageId: string) {\n event.stopPropagation();\n this.stateService.popOutPage(pageId);\n }\n\n serializeLayout(): string { return this.stateService.serializeLayout(); }\n\n openTabSwitcher() { this.tabSwitcherOpen = true; }\n closeTabSwitcher() { this.tabSwitcherOpen = false; }\n\n @HostListener('document:keydown.escape')\n onEscapeKey() { this.closeTabSwitcher(); }\n\n onSwitcherSelect(pageId: string) {\n this.stateService.setActivePage(pageId);\n this.closeTabSwitcher();\n }\n\n onSwitcherPopOut(event: Event, pageId: string) {\n event.stopPropagation();\n this.stateService.popOutPage(pageId);\n this.closeTabSwitcher();\n }\n\n onSwitcherRemove(event: Event, pageId: string) {\n event.stopPropagation();\n if (confirm('Remove this workspace?')) {\n this.stateService.removePage(pageId);\n if (this.pages.length <= 1) this.closeTabSwitcher();\n }\n }\n\n onSwitcherAdd() {\n const name = prompt('Workspace name:', `Workspace ${this.pages.length + 1}`);\n if (name) this.stateService.addPage(name);\n }\n\n private recalcVisibleTabs() {\n if (!this.tabsTrackRef || !this.pages.length) {\n this.visiblePages = this.pages;\n this.hiddenCount = 0;\n this.cdr.markForCheck();\n return;\n }\n\n const track = this.tabsTrackRef.nativeElement;\n const trackW = track.clientWidth;\n // Space always consumed by the add \"+\" button + padding\n const baseReserved = this.ADD_BTN_W + this.GAP + this.PADDING;\n // Space needed for the overflow \"+N\" button when shown\n const overflowSlot = this.OVERFLOW_BTN_W + this.GAP;\n\n // Measure each real tab element currently in the DOM.\n // The DOM always renders all visiblePages tabs, so we may not have all tabs\n // measured yet — fall back to the previous measured cache or a generous estimate.\n const tabEls = Array.from(track.querySelectorAll<HTMLElement>('.tab'));\n // Build a width map by index (only covers currently visible tabs)\n const measuredWidths: number[] = this.pages.map((_, i) => {\n const el = tabEls[i];\n return el ? el.getBoundingClientRect().width + this.GAP : this._tabWidthCache[i] ?? 150 + this.GAP;\n });\n // Update cache for next call\n tabEls.forEach((el, i) => {\n this._tabWidthCache[i] = el.getBoundingClientRect().width + this.GAP;\n });\n\n // How much space the tabs need in total (no overflow button)\n const totalNeeded = measuredWidths.reduce((s, w) => s + w, 0) - this.GAP; // remove trailing gap\n\n if (totalNeeded <= trackW - baseReserved) {\n // Everything fits — show all\n this.visiblePages = this.pages;\n this.hiddenCount = 0;\n } else {\n // Not everything fits — fill as many as possible while always leaving room for overflow btn\n const budget = trackW - baseReserved - overflowSlot;\n let used = 0;\n let count = 0;\n for (let i = 0; i < this.pages.length; i++) {\n used += measuredWidths[i];\n if (used - this.GAP <= budget) { // -GAP: last item has no trailing gap\n count++;\n } else {\n break;\n }\n }\n count = Math.max(1, count);\n this.visiblePages = this.pages.slice(0, count);\n this.hiddenCount = this.pages.length - count;\n }\n\n this.cdr.markForCheck();\n }\n\n // Cache of measured tab widths (including gap) indexed by page position\n private _tabWidthCache: number[] = [];\n\n private applyTheme() {\n this.resolvedTheme = { ...DEFAULT_THEME, ...(this.theme ?? {}) };\n const t = this.resolvedTheme;\n this.wrapperStyles = {\n '--dash-bg': t.backgroundColor,\n '--dash-panel-bg': t.panelColor,\n '--dash-panel-border': t.panelBorderColor,\n '--dash-card-bg': t.widgetCardColor,\n '--dash-fore-color': t.foreColor,\n '--dash-accent-color': t.accentColor,\n '--dash-accent-tint': t.accentTintColor,\n '--dash-accent-tint-strong': t.accentTintStrongColor,\n '--dash-danger-color': t.dangerColor,\n '--dash-danger-tint': t.dangerTintColor,\n '--dash-font-family': t.fontFamily,\n '--dash-tabs-container-color': t.tabsContainerColor,\n '--dash-tab-active-color': t.tabActiveColor,\n '--dash-tab-active-text': t.tabActiveTextColor,\n '--dash-tab-hover-text': t.tabHoverTextColor,\n '--dash-tab-hover-bg': t.tabHoverBgColor,\n '--dash-add-widget-text': t.addWidgetButtonTextColor,\n '--dash-overflow-btn-bg': t.overflowBtnBgColor,\n '--dash-overflow-btn-border': t.overflowBtnBorderColor,\n '--dash-overlay-bg': t.overlayBgColor,\n '--dash-sheet-border': t.sheetBorderColor,\n '--dash-scrollbar-color': t.scrollbarColor,\n '--dash-popout-title-color': t.popoutTitleColor,\n '--dash-widget-title-color': t.widgetTitleColor,\n '--dash-drag-handle-color': t.dragHandleColor,\n '--dash-widget-border-color': t.widgetBorderColor,\n '--dash-widget-btn-bg': t.widgetButtonBgColor,\n '--dash-widget-btn-color': t.widgetButtonColor,\n '--dash-placeholder-color': t.placeholderColor,\n '--dash-resize-handle-color': t.resizeHandleColor,\n };\n }\n\n private updateActivePage() {\n this.activePage = this.pages.find(p => p.id === this.activePageId);\n }\n}\n","import { NgModule } from '@angular/core';\nimport { BrowserModule } from '@angular/platform-browser';\nimport { CommonModule } from '@angular/common';\n\nimport { DashboardComponent, OverflowActivePipe } from './dashboard.component';\nimport { WidgetRendererComponent } from './widget-renderer.component';\nimport { CustomGridComponent, GridCellDirective } from './custom-grid.component';\nimport { DashboardStateService } from './dashboard-state.service';\n\n@NgModule({\n declarations: [\n DashboardComponent,\n OverflowActivePipe,\n WidgetRendererComponent,\n CustomGridComponent,\n GridCellDirective,\n ],\n imports: [\n CommonModule,\n ],\n providers: [DashboardStateService],\n exports: [\n DashboardComponent,\n OverflowActivePipe,\n WidgetRendererComponent,\n CustomGridComponent,\n GridCellDirective,\n ],\n})\nexport class DashboardModule {}\n\n/**\n * Root module for local demo / testing purposes only.\n * Library consumers import DashboardModule, not AppModule.\n */\n@NgModule({\n imports: [BrowserModule, DashboardModule],\n bootstrap: [DashboardComponent],\n})\nexport class AppModule {}\n","/*\n * Public API Surface of @ogidor/dashboard\n */\n\nexport * from './app/app.module';\nexport * from './app/dashboard.component';\nexport * from './app/widget-renderer.component';\nexport * from './app/custom-grid.component';\nexport * from './app/dashboard-state.service';\nexport * from './app/models';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i1.DashboardStateService","i3.WidgetRendererComponent","i4.CustomGridComponent","i4.GridCellDirective"],"mappings":"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"}