@ogidor/dashboard 1.0.4 → 1.0.6
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.
- package/README.md +94 -17
- package/app/models.d.ts +26 -0
- package/esm2020/app/custom-grid.component.mjs +3 -3
- package/esm2020/app/dashboard.component.mjs +41 -10
- package/esm2020/app/models.mjs +1 -1
- package/esm2020/app/widget-renderer.component.mjs +3 -3
- package/fesm2015/ogidor-dashboard.mjs +44 -13
- package/fesm2015/ogidor-dashboard.mjs.map +1 -1
- package/fesm2020/ogidor-dashboard.mjs +44 -13
- package/fesm2020/ogidor-dashboard.mjs.map +1 -1
- package/package.json +2 -2
|
@@ -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-accent-color, #0a84ff);\n opacity: 0.12;\n border-radius: 24px;\n border: 2px dashed 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 filter: drop-shadow(0 20px 40px rgba(0,0,0,0.45));\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: 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 box-shadow: 0 8px 24px rgba(0,0,0,0.25);\n border: 1px solid rgba(255,255,255,0.07);\n transition: box-shadow 0.2s ease;\n box-sizing: border-box;\n background: var(--dash-card-bg, #2c2c2e);\n }\n .widget-card:hover {\n box-shadow: 0 12px 32px rgba(0,0,0,0.35);\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: 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: #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: rgba(255,255,255,0.07);\n border: none;\n 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, Input, Output, OnChanges,\n SimpleChanges, EventEmitter, ContentChild, TemplateRef\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};\n\n@Component({\n selector: 'app-dashboard',\n template: `\n <!-- ══════════════════════════════════════════════════════════\n POPPED-OUT MODE\n ══════════════════════════════════════════════════════════ -->\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 <div class=\"grid-container\">\n <app-grid [widgets]=\"activePage?.widgets || []\" (itemChanged)=\"onItemChanged($event)\">\n <ng-template gridCell let-widget=\"widget\">\n <app-widget-renderer\n [widget]=\"widget\"\n [theme]=\"resolvedTheme\"\n (editRequested)=\"editWidgetRequested.emit($event)\"\n (removeRequested)=\"onRemoveWidget($event)\"\n >\n <ng-container\n *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 </div>\n </ng-container>\n\n <!-- ══════════════════════════════════════════════════════════\n NORMAL MODE\n ══════════════════════════════════════════════════════════ -->\n <ng-template #normalMode>\n <div class=\"dashboard-wrapper\" [ngStyle]=\"wrapperStyles\">\n <main class=\"main-content\">\n\n <header class=\"dashboard-header\">\n <div class=\"tabs-container\">\n <div\n *ngFor=\"let page of pages\"\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 <button class=\"btn-add-page\" (click)=\"onAddPage()\" title=\"New workspace\">\n <i class=\"la la-plus\"></i>\n </button>\n </div>\n\n <!-- Add Widget button — consumer decides what happens -->\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 </header>\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\n [widget]=\"widget\"\n [theme]=\"resolvedTheme\"\n (editRequested)=\"editWidgetRequested.emit($event)\"\n (removeRequested)=\"onRemoveWidget($event)\"\n >\n <!-- Stamp consumer's cell template (if provided) inside the card body -->\n <ng-container\n *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 --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 }\n\n /* ── Normal layout ── */\n .dashboard-wrapper {\n display: flex; height: 100vh; width: 100vw; overflow: hidden;\n padding: 16px; 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; display: flex; flex-direction: column; overflow: hidden;\n border-radius: 40px; padding: 20px;\n background: var(--dash-panel-bg);\n box-shadow: 0 10px 30px rgba(0,0,0,0.5);\n border: 1px solid rgba(255,255,255,0.05);\n }\n\n /* ── Pop-out layout ── */\n .popout-wrapper {\n display: flex; flex-direction: column; height: 100vh; width: 100vw;\n overflow: hidden; padding: 16px; 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; align-items: center; justify-content: space-between;\n margin-bottom: 16px; padding: 10px 18px;\n background: var(--dash-panel-bg); border-radius: 20px;\n border: 1px solid rgba(255,255,255,0.06); flex-shrink: 0;\n }\n .popout-title { font-size: 16px; font-weight: 700; color: #fff; }\n .popout-wrapper .grid-container {\n flex: 1; overflow: auto; border-radius: 24px; min-height: 0;\n background: var(--dash-panel-bg); padding: 16px;\n border: 1px solid rgba(255,255,255,0.05);\n }\n\n /* ── Header ── */\n .dashboard-header {\n display: flex; align-items: center; justify-content: space-between;\n margin-bottom: 20px; gap: 12px;\n }\n .tabs-container {\n display: flex; align-items: center; gap: 8px;\n background: rgba(44,44,46,0.6); backdrop-filter: blur(10px);\n border-radius: 25px; padding: 6px;\n }\n .tab {\n display: flex; align-items: center; gap: 4px;\n padding: 8px 14px 8px 18px; border-radius: 20px;\n cursor: pointer; font-size: 14px; font-weight: 500;\n color: var(--dash-fore-color);\n transition: all 0.3s cubic-bezier(0.25,0.8,0.25,1);\n }\n .tab.active { background: #3a3a3c; color: #fff; box-shadow: 0 2px 10px rgba(0,0,0,0.2); }\n .tab:hover:not(.active) { color: #e5e5ea; background: rgba(255,255,255,0.05); }\n .tab-name { flex: 1; 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 .btn-add-page {\n background: transparent; border: none; color: var(--dash-fore-color);\n padding: 8px 16px; cursor: pointer; border-radius: 20px; transition: all 0.2s;\n }\n .btn-add-page:hover { color: var(--dash-accent-color); background: rgba(10,132,255,0.1); }\n .btn-add-widget {\n display: flex; align-items: center; gap: 6px;\n background: var(--dash-accent-color); border: none; color: #fff;\n font-size: 14px; font-weight: 600; padding: 10px 20px; border-radius: 22px;\n cursor: pointer; white-space: nowrap;\n transition: opacity 0.2s, transform 0.15s;\n box-shadow: 0 4px 14px rgba(10,132,255,0.4);\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, OnDestroy, OnChanges {\n @Input() initialLayout?: string;\n @Input() theme?: DashboardTheme;\n\n /**\n * Emits when the user clicks \"Add Widget\".\n * The consumer should open their own dialog and call `stateService.addWidget(...)`.\n */\n @Output() addWidgetRequested = new EventEmitter<void>();\n\n /**\n * Emits the Widget when the user clicks the edit (pen) icon on a card.\n * The consumer should open their own edit UI and call `stateService.updateWidget(...)`.\n */\n @Output() editWidgetRequested = new EventEmitter<Widget>();\n\n /**\n * Optional: consumer can provide an `<ng-template widgetCell let-widget=\"widget\">` child\n * to render custom content inside every card body.\n */\n @ContentChild(GridCellDirective, { read: TemplateRef })\n cellTemplate?: TemplateRef<{ widget: Widget }>;\n\n resolvedTheme: Required<DashboardTheme> = { ...DEFAULT_THEME };\n wrapperStyles: Record<string, string> = {};\n\n pages: Page[] = [];\n activePageId = '';\n activePage?: Page;\n isPoppedOut = false;\n\n private subs = new Subscription();\n\n constructor(public stateService: DashboardStateService) {}\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 if (this.isPoppedOut && hash) {\n const target = pages.find(p => p.id === hash);\n if (target) this.stateService.setActivePage(hash);\n }\n this.updateActivePage();\n }));\n this.subs.add(this.stateService.activePageId$.subscribe(id => {\n this.activePageId = id;\n this.updateActivePage();\n }));\n }\n\n ngOnDestroy() { this.subs.unsubscribe(); }\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 private applyTheme() {\n this.resolvedTheme = { ...DEFAULT_THEME, ...(this.theme ?? {}) };\n this.wrapperStyles = {\n '--dash-bg': this.resolvedTheme.backgroundColor,\n '--dash-panel-bg': this.resolvedTheme.panelColor,\n '--dash-card-bg': this.resolvedTheme.widgetCardColor,\n '--dash-fore-color': this.resolvedTheme.foreColor,\n '--dash-accent-color': this.resolvedTheme.accentColor,\n '--dash-danger-color': this.resolvedTheme.dangerColor,\n '--dash-font-family': this.resolvedTheme.fontFamily,\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 } 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 WidgetRendererComponent,\n CustomGridComponent,\n GridCellDirective,\n ],\n imports: [\n CommonModule,\n ],\n providers: [DashboardStateService],\n exports: [\n DashboardComponent,\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 filter: drop-shadow(0 20px 40px rgba(0,0,0,0.45));\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 box-shadow: 0 8px 24px rgba(0,0,0,0.25);\n border: 1px solid var(--dash-widget-border-color, rgba(255,255,255,0.07));\n transition: box-shadow 0.2s ease;\n box-sizing: border-box;\n background: var(--dash-card-bg, #2c2c2e);\n }\n .widget-card:hover {\n box-shadow: 0 12px 32px rgba(0,0,0,0.35);\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, Input, Output, OnChanges,\n SimpleChanges, EventEmitter, ContentChild, TemplateRef\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 // Header / Tabs\n tabsContainerColor: 'rgba(44,44,46,0.6)',\n tabActiveColor: '#3a3a3c',\n tabActiveTextColor: '#ffffff',\n tabHoverTextColor: '#e5e5ea',\n addWidgetButtonTextColor:'#ffffff',\n // Pop-out\n popoutTitleColor: '#ffffff',\n // Widget card\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 // Grid\n placeholderColor: '#0a84ff',\n resizeHandleColor: 'rgba(255,255,255,0.25)',\n};\n\n@Component({\n selector: 'app-dashboard',\n template: `\n <!-- ══════════════════════════════════════════════════════════\n POPPED-OUT MODE\n ══════════════════════════════════════════════════════════ -->\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 <div class=\"grid-container\">\n <app-grid [widgets]=\"activePage?.widgets || []\" (itemChanged)=\"onItemChanged($event)\">\n <ng-template gridCell let-widget=\"widget\">\n <app-widget-renderer\n [widget]=\"widget\"\n [theme]=\"resolvedTheme\"\n (editRequested)=\"editWidgetRequested.emit($event)\"\n (removeRequested)=\"onRemoveWidget($event)\"\n >\n <ng-container\n *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 </div>\n </ng-container>\n\n <!-- ══════════════════════════════════════════════════════════\n NORMAL MODE\n ══════════════════════════════════════════════════════════ -->\n <ng-template #normalMode>\n <div class=\"dashboard-wrapper\" [ngStyle]=\"wrapperStyles\">\n <main class=\"main-content\">\n\n <header class=\"dashboard-header\">\n <div class=\"tabs-container\">\n <div\n *ngFor=\"let page of pages\"\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 <button class=\"btn-add-page\" (click)=\"onAddPage()\" title=\"New workspace\">\n <i class=\"la la-plus\"></i>\n </button>\n </div>\n\n <!-- Add Widget button — consumer decides what happens -->\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 </header>\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\n [widget]=\"widget\"\n [theme]=\"resolvedTheme\"\n (editRequested)=\"editWidgetRequested.emit($event)\"\n (removeRequested)=\"onRemoveWidget($event)\"\n >\n <!-- Stamp consumer's cell template (if provided) inside the card body -->\n <ng-container\n *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 --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; height: 100vh; width: 100vw; overflow: hidden;\n padding: 16px; 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; display: flex; flex-direction: column; overflow: hidden;\n border-radius: 40px; padding: 20px;\n background: var(--dash-panel-bg);\n box-shadow: 0 10px 30px rgba(0,0,0,0.5);\n border: 1px solid rgba(255,255,255,0.05);\n }\n\n /* ── Pop-out layout ── */\n .popout-wrapper {\n display: flex; flex-direction: column; height: 100vh; width: 100vw;\n overflow: hidden; padding: 16px; 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; align-items: center; justify-content: space-between;\n margin-bottom: 16px; padding: 10px 18px;\n background: var(--dash-panel-bg); border-radius: 20px;\n border: 1px solid rgba(255,255,255,0.06); flex-shrink: 0;\n }\n .popout-title { font-size: 16px; font-weight: 700; color: var(--dash-popout-title-color); }\n .popout-wrapper .grid-container {\n flex: 1; overflow: auto; border-radius: 24px; min-height: 0;\n background: var(--dash-panel-bg); padding: 16px;\n border: 1px solid rgba(255,255,255,0.05);\n }\n\n /* ── Header ── */\n .dashboard-header {\n display: flex; align-items: center; justify-content: space-between;\n margin-bottom: 20px; gap: 12px;\n }\n .tabs-container {\n display: flex; align-items: center; gap: 8px;\n background: var(--dash-tabs-container-color); backdrop-filter: blur(10px);\n border-radius: 25px; padding: 6px;\n }\n .tab {\n display: flex; align-items: center; gap: 4px;\n padding: 8px 14px 8px 18px; border-radius: 20px;\n cursor: pointer; font-size: 14px; font-weight: 500;\n color: var(--dash-fore-color);\n transition: all 0.3s cubic-bezier(0.25,0.8,0.25,1);\n }\n .tab.active { background: var(--dash-tab-active-color); color: var(--dash-tab-active-text); box-shadow: 0 2px 10px rgba(0,0,0,0.2); }\n .tab:hover:not(.active) { color: var(--dash-tab-hover-text); background: rgba(255,255,255,0.05); }\n .tab-name { flex: 1; 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 .btn-add-page {\n background: transparent; border: none; color: var(--dash-fore-color);\n padding: 8px 16px; cursor: pointer; border-radius: 20px; transition: all 0.2s;\n }\n .btn-add-page:hover { color: var(--dash-accent-color); background: rgba(10,132,255,0.1); }\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;\n transition: opacity 0.2s, transform 0.15s;\n box-shadow: 0 4px 14px rgba(10,132,255,0.4);\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, OnDestroy, OnChanges {\n @Input() initialLayout?: string;\n @Input() theme?: DashboardTheme;\n\n /**\n * Emits when the user clicks \"Add Widget\".\n * The consumer should open their own dialog and call `stateService.addWidget(...)`.\n */\n @Output() addWidgetRequested = new EventEmitter<void>();\n\n /**\n * Emits the Widget when the user clicks the edit (pen) icon on a card.\n * The consumer should open their own edit UI and call `stateService.updateWidget(...)`.\n */\n @Output() editWidgetRequested = new EventEmitter<Widget>();\n\n /**\n * Optional: consumer can provide an `<ng-template widgetCell let-widget=\"widget\">` child\n * to render custom content inside every card body.\n */\n @ContentChild(GridCellDirective, { read: TemplateRef })\n cellTemplate?: TemplateRef<{ widget: Widget }>;\n\n resolvedTheme: Required<DashboardTheme> = { ...DEFAULT_THEME };\n wrapperStyles: Record<string, string> = {};\n\n pages: Page[] = [];\n activePageId = '';\n activePage?: Page;\n isPoppedOut = false;\n\n private subs = new Subscription();\n\n constructor(public stateService: DashboardStateService) {}\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 if (this.isPoppedOut && hash) {\n const target = pages.find(p => p.id === hash);\n if (target) this.stateService.setActivePage(hash);\n }\n this.updateActivePage();\n }));\n this.subs.add(this.stateService.activePageId$.subscribe(id => {\n this.activePageId = id;\n this.updateActivePage();\n }));\n }\n\n ngOnDestroy() { this.subs.unsubscribe(); }\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 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 } 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 WidgetRendererComponent,\n CustomGridComponent,\n GridCellDirective,\n ],\n imports: [\n CommonModule,\n ],\n providers: [DashboardStateService],\n exports: [\n DashboardComponent,\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":";;;;;;;AAQA;;;;;;;;AAQG;MAEU,iBAAiB,CAAA;AAC5B,IAAA,WAAA,CAAmB,WAA4C,EAAA;QAA5C,IAAW,CAAA,WAAA,GAAX,WAAW,CAAiC;KAAI;;+GADxD,iBAAiB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAjB,iBAAiB,EAAA,QAAA,EAAA,YAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;4FAAjB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAD7B,SAAS;mBAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAA;;AAmBrC,MAAM,UAAU,CAAA;AAEd;;AAEG;AACH,IAAA,OAAO,QAAQ,CAAC,CAAW,EAAE,CAAW,EAAA;AACtC,QAAA,OAAO,EACL,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;YACnB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;YACnB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;YACnB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CACpB,CAAC;KACH;AAED;;AAEG;AACH,IAAA,OAAO,gBAAgB,CAAC,OAAmB,EAAE,IAAc,EAAA;QACzD,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;KAC9E;AAED;;AAEG;IACH,OAAO,cAAc,CAAC,OAAmB,EAAA;AACvC,QAAA,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;KAC5D;AAED;;;AAGG;IACH,OAAO,UAAU,CACf,UAAsB,EACtB,MAAgB,EAChB,IAAY,EACZ,IAAY,EACZ,OAAe,EAAA;AAEf,QAAA,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;AAChD,QAAA,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE,CAAC,CAAC;AACrD,QAAA,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO,OAAO,CAAC;QAE5B,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9D,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QAE7B,MAAM,MAAM,GAAG,UAAU,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;AAClD,QAAA,UAAU,CAAC,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC7C,OAAO,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAC5C;AAED;;AAEG;IACH,OAAO,YAAY,CACjB,UAAsB,EACtB,MAAgB,EAChB,OAAe,EACf,OAAe,EACf,OAAe,EAAA;AAEf,QAAA,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;AAChD,QAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE,CAAC,CAAC;AACvD,QAAA,IAAI,CAAC,QAAQ;AAAE,YAAA,OAAO,OAAO,CAAC;QAE9B,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACrE,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAErC,MAAM,MAAM,GAAG,UAAU,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;AAClD,QAAA,UAAU,CAAC,iBAAiB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC/C,OAAO,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAC5C;AAED;;AAEG;AACK,IAAA,OAAO,iBAAiB,CAAC,OAAmB,EAAE,WAAqB,EAAA;QACzE,MAAM,UAAU,GAAG,UAAU,CAAC,gBAAgB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;AACrE,QAAA,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE;YACjC,QAAQ,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC;AAC9C,YAAA,UAAU,CAAC,iBAAiB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AACjD,SAAA;KACF;AAED;;AAEG;AACH,IAAA,OAAO,OAAO,CAAC,OAAmB,EAAE,QAAgB,EAAA;QAClD,MAAM,MAAM,GAAG,UAAU,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QAClD,MAAM,MAAM,GAAe,EAAE,CAAC;AAE9B,QAAA,KAAK,MAAM,MAAM,IAAI,MAAM,EAAE;YAC3B,MAAM,CAAC,CAAC,GAAG,UAAU,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACnD,YAAA,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACrB,SAAA;AAED,QAAA,OAAO,MAAM,CAAC;KACf;AAED;;AAEG;AACK,IAAA,OAAO,YAAY,CAAC,MAAkB,EAAE,MAAgB,EAAA;QAC9D,IAAI,CAAC,GAAG,CAAC,CAAC;AACV,QAAA,OAAO,IAAI,EAAE;YACX,MAAM,IAAI,GAAa,EAAE,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC;AACxC,YAAA,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AACjE,YAAA,IAAI,CAAC,SAAS;AAAE,gBAAA,OAAO,CAAC,CAAC;YACzB,CAAC,GAAG,SAAS,CAAC,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC;AAClC,SAAA;KACF;AAED;;AAEG;IACH,OAAO,aAAa,CAAC,OAAmB,EAAA;AACtC,QAAA,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,CAAC,CAAC;QACnC,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;KACpD;AACF,CAAA;AAED;;AAE6E;MAgHhE,mBAAmB,CAAA;IAyC9B,WAAoB,CAAA,IAAY,EAAU,GAAsB,EAAA;QAA5C,IAAI,CAAA,IAAA,GAAJ,IAAI,CAAQ;QAAU,IAAG,CAAA,GAAA,GAAH,GAAG,CAAmB;QAxCvD,IAAO,CAAA,OAAA,GAAa,EAAE,CAAC;QACvB,IAAO,CAAA,OAAA,GAAW,EAAE,CAAC;QACrB,IAAG,CAAA,GAAA,GAAW,EAAE,CAAC;QACjB,IAAS,CAAA,SAAA,GAAW,EAAE,CAAC;QACvB,IAAW,CAAA,WAAA,GAAW,CAAC,CAAC;QACxB,IAAW,CAAA,WAAA,GAAW,CAAC,CAAC;AAEvB,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,YAAY,EAAU,CAAC;AACzC,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,YAAY,EAAY,CAAC;QAOvD,IAAW,CAAA,WAAA,GAAwE,IAAI,CAAC;QACxF,IAAe,CAAA,eAAA,GAAG,GAAG,CAAC;QAEtB,IAAQ,CAAA,QAAA,GAMG,IAAI,CAAC;QAEhB,IAAQ,CAAA,QAAA,GAQG,IAAI,CAAC;QAER,IAAc,CAAA,cAAA,GAAe,EAAE,CAAC;QAChC,IAAc,CAAA,cAAA,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAY,CAAA,YAAA,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;KAEmB;IAEpE,QAAQ,GAAA;QACN,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,qBAAqB,EAAE,CAAC;AAC7B,QAAA,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAK;YAC/B,MAAM,CAAC,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;YAC1D,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;AACxD,SAAC,CAAC,CAAC;KACJ;AAED,IAAA,WAAW,CAAC,QAAuB,EAAA;QACjC,IAAI,CAAC,qBAAqB,EAAE,CAAC;KAC9B;IAED,WAAW,GAAA;QACT,MAAM,CAAC,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QAC7D,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;KAC1D;IAED,SAAS,CAAC,MAAc,EAAE,IAAY,EAAA,EAAI,OAAO,IAAI,CAAC,EAAE,CAAC,EAAE;;AAI3D,IAAA,IAAY,SAAS,GAAA;QACnB,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,aAAa,EAAE,WAAW,IAAI,GAAG,CAAC;AACzE,QAAA,OAAO,CAAC,UAAU,GAAG,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC;KACpE;AAEO,IAAA,UAAU,CAAC,GAAW,EAAA;QAC5B,OAAO,GAAG,IAAI,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;KAC1C;AAEO,IAAA,UAAU,CAAC,GAAW,EAAA;QAC5B,OAAO,GAAG,IAAI,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;KAC1C;AAEO,IAAA,UAAU,CAAC,EAAU,EAAA;AAC3B,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;KACrD;AAEO,IAAA,UAAU,CAAC,EAAU,EAAA;AAC3B,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;KACrD;AAEO,IAAA,gBAAgB,CAAC,IAAY,EAAA;AACnC,QAAA,OAAO,IAAI,GAAG,IAAI,CAAC,SAAS,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC;KACtD;AAEO,IAAA,iBAAiB,CAAC,IAAY,EAAA;AACpC,QAAA,OAAO,IAAI,GAAG,IAAI,CAAC,SAAS,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC;KACtD;AAED,IAAA,WAAW,CAAC,CAAS,EAAA;AACnB,QAAA,OAAO,IAAI,CAAC,QAAQ,EAAE,EAAE,KAAK,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;KACxF;AAED,IAAA,UAAU,CAAC,CAAS,EAAA;AAClB,QAAA,OAAO,IAAI,CAAC,QAAQ,EAAE,EAAE,KAAK,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;KACxF;AAED,IAAA,YAAY,CAAC,CAAS,EAAA;AACpB,QAAA,OAAO,IAAI,CAAC,QAAQ,EAAE,EAAE,KAAK,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;KACjG;AAED,IAAA,aAAa,CAAC,CAAS,EAAA;AACrB,QAAA,OAAO,IAAI,CAAC,QAAQ,EAAE,EAAE,KAAK,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;KAClG;;IAID,WAAW,CAAC,KAAiB,EAAE,MAAc,EAAA;AAC3C,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB,CAAC;AAC3C,QAAA,IAAI,MAAM,CAAC,OAAO,CAAC,oDAAoD,CAAC;YAAE,OAAO;QACjF,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,KAAK,CAAC,eAAe,EAAE,CAAC;QAExB,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,qBAAqB,EAAE,CAAC;QACtE,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAE1C,IAAI,CAAC,QAAQ,GAAG;YACd,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,OAAO,EAAE,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,GAAG,QAAQ;YAC7C,OAAO,EAAE,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,GAAG,OAAO;AAC3C,YAAA,aAAa,EAAE,QAAQ;AACvB,YAAA,aAAa,EAAE,OAAO;SACvB,CAAC;QACF,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACxG,IAAI,CAAC,WAAW,GAAG;AACjB,YAAA,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO;YAC5B,KAAK,EAAE,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC;YACzC,MAAM,EAAE,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC;SAC5C,CAAC;AACF,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;KACzB;IAED,aAAa,CAAC,KAAiB,EAAE,MAAc,EAAA;QAC7C,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,IAAI,CAAC,QAAQ,GAAG;YACd,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,WAAW,EAAE,KAAK,CAAC,OAAO;YAC1B,WAAW,EAAE,KAAK,CAAC,OAAO;YAC1B,SAAS,EAAE,MAAM,CAAC,IAAI;YACtB,SAAS,EAAE,MAAM,CAAC,IAAI;YACtB,aAAa,EAAE,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC;YACjD,aAAa,EAAE,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC;SACnD,CAAC;QACF,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACxG,IAAI,CAAC,WAAW,GAAG;AACjB,YAAA,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;YAC/D,KAAK,EAAE,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC;YACzC,MAAM,EAAE,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC;SAC5C,CAAC;AACF,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;KACzB;AAEO,IAAA,WAAW,CAAC,KAAiB,EAAA;QACnC,IAAI,IAAI,CAAC,QAAQ;AAAE,YAAA,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;aACzC,IAAI,IAAI,CAAC,QAAQ;AAAE,YAAA,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;KACtD;AAEO,IAAA,SAAS,CAAC,MAAkB,EAAA;QAClC,IAAI,IAAI,CAAC,QAAQ;AAAE,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;aACvD,IAAI,IAAI,CAAC,QAAQ;AAAE,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;KACpE;AAEO,IAAA,cAAc,CAAC,KAAiB,EAAA;QACtC,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,qBAAqB,EAAE,CAAC;QACtE,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,QAAS,CAAC,EAAE,CAAE,CAAC;AACnE,QAAA,IAAI,CAAC,MAAM;YAAE,OAAO;AAEpB,QAAA,IAAI,EAAE,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;AAC3D,QAAA,IAAI,EAAE,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QAC1D,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChF,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAErB,QAAA,IAAI,CAAC,QAAQ,CAAC,aAAa,GAAG,EAAE,CAAC;AACjC,QAAA,IAAI,CAAC,QAAQ,CAAC,aAAa,GAAG,EAAE,CAAC;AAEjC,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AACzF,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;QAEnD,MAAM,QAAQ,GAAG,UAAU,CAAC,UAAU,CACpC,IAAI,CAAC,cAAc,EACnB,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,EACjF,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,CACnC,CAAC;QAEF,IAAI,CAAC,WAAW,GAAG;AACjB,YAAA,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;YACjE,KAAK,EAAE,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC;YACzC,MAAM,EAAE,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC;SAC5C,CAAC;AAEF,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAK;AACjB,YAAA,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE;AACzB,gBAAA,IAAI,EAAE,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE;oBAAE,SAAS;gBAClC,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;AACnD,gBAAA,IAAI,CAAC,EAAE;AAAE,oBAAA,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;AAAC,oBAAA,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;AAAE,iBAAA;AACnC,aAAA;YACD,IAAI,CAAC,qBAAqB,EAAE,CAAC;AAC7B,YAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;AAC1B,SAAC,CAAC,CAAC;KACJ;IAEO,YAAY,GAAA;QAClB,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,QAAS,CAAC,EAAE,CAAE,CAAC;AACnE,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AAClH,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC;AAE5E,QAAA,MAAM,QAAQ,GAAG,UAAU,CAAC,UAAU,CACpC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EACjF,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,EACjF,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,CACnC,CAAC;AACF,QAAA,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE;YACzB,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;AACnD,YAAA,IAAI,CAAC,EAAE;AAAE,gBAAA,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;AAAC,gBAAA,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;AAAC,gBAAA,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC;AAAC,gBAAA,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC;AAAC,gBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAAE,aAAA;AACjG,SAAA;AACD,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;AACrB,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;AACxB,QAAA,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;QACzB,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC7B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACtC,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;KACzB;AAEO,IAAA,gBAAgB,CAAC,KAAiB,EAAA;QACxC,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,QAAS,CAAC,EAAE,CAAE,CAAC;AACnE,QAAA,IAAI,CAAC,MAAM;YAAE,OAAO;QAEpB,MAAM,EAAE,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;QACrD,MAAM,EAAE,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;AAErD,QAAA,IAAI,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAC1I,QAAA,IAAI,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAC3I,QAAA,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QAErD,IAAI,CAAC,QAAQ,CAAC,aAAa,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAC7D,IAAI,CAAC,QAAQ,CAAC,aAAa,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAE9D,MAAM,QAAQ,GAAG,UAAU,CAAC,YAAY,CACtC,IAAI,CAAC,cAAc,EACnB,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,EACjF,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,CAC/B,CAAC;QAEF,IAAI,CAAC,WAAW,GAAG;AACjB,YAAA,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;AAC/D,YAAA,KAAK,EAAE,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC;AACrC,YAAA,MAAM,EAAE,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC;SACxC,CAAC;AAEF,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAK;AACjB,YAAA,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE;AACzB,gBAAA,IAAI,EAAE,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE;oBAAE,SAAS;gBAClC,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;AACnD,gBAAA,IAAI,CAAC,EAAE;AAAE,oBAAA,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;AAAC,oBAAA,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;AAAE,iBAAA;AACnC,aAAA;YACD,IAAI,CAAC,qBAAqB,EAAE,CAAC;AAC7B,YAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;AAC1B,SAAC,CAAC,CAAC;KACJ;IAEO,cAAc,GAAA;QACpB,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,QAAS,CAAC,EAAE,CAAE,CAAC;AAEnE,QAAA,IAAI,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,IAAI,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAChH,QAAA,IAAI,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,IAAI,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAChH,QAAA,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;AAErD,QAAA,MAAM,QAAQ,GAAG,UAAU,CAAC,YAAY,CACtC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EACjF,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,EACjF,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,CAC/B,CAAC;AACF,QAAA,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE;YACzB,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;AACnD,YAAA,IAAI,CAAC,EAAE;AAAE,gBAAA,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;AAAC,gBAAA,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;AAAC,gBAAA,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC;AAAC,gBAAA,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC;AAAC,gBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAAE,aAAA;AACjG,SAAA;AACD,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;AACrB,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;AACxB,QAAA,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;QACzB,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC7B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACtC,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;KACzB;;IAIO,eAAe,GAAA;AACrB,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM;YAAE,OAAO;QAClC,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,CAClC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EACjF,IAAI,CAAC,OAAO,CACb,CAAC;AACF,QAAA,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE;YAC1B,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;AACnD,YAAA,IAAI,CAAC,EAAE;AAAE,gBAAA,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;AAAC,gBAAA,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;AAAE,aAAA;AACnC,SAAA;KACF;IAEO,qBAAqB,GAAA;AAC3B,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE;AAAE,YAAA,IAAI,CAAC,eAAe,GAAG,GAAG,CAAC;YAAC,OAAO;AAAE,SAAA;QAClE,MAAM,MAAM,GAAG,UAAU,CAAC,aAAa,CACrC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAClF,CAAC;AACF,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC;KAC5E;;iHA3TU,mBAAmB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,MAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAnB,mBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,mBAAmB,EAchB,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,SAAA,EAAA,GAAA,EAAA,KAAA,EAAA,SAAA,EAAA,WAAA,EAAA,WAAA,EAAA,aAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,aAAA,EAAA,eAAA,EAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,cAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,iBAAiB,EAAU,WAAA,EAAA,IAAA,EAAA,IAAA,EAAA,WAAW,EA1H1C,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,eAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,eAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,CAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8CT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,qoCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;4FA8DU,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBA9G/B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,UAAU,EACV,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CT,EA4DgB,eAAA,EAAA,uBAAuB,CAAC,MAAM,EAAA,MAAA,EAAA,CAAA,qoCAAA,CAAA,EAAA,CAAA;6HAGtC,OAAO,EAAA,CAAA;sBAAf,KAAK;gBACG,OAAO,EAAA,CAAA;sBAAf,KAAK;gBACG,GAAG,EAAA,CAAA;sBAAX,KAAK;gBACG,SAAS,EAAA,CAAA;sBAAjB,KAAK;gBACG,WAAW,EAAA,CAAA;sBAAnB,KAAK;gBACG,WAAW,EAAA,CAAA;sBAAnB,KAAK;gBAEI,WAAW,EAAA,CAAA;sBAApB,MAAM;gBACG,aAAa,EAAA,CAAA;sBAAtB,MAAM;gBAEuC,aAAa,EAAA,CAAA;sBAA1D,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,eAAe,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;gBAGY,YAAY,EAAA,CAAA;sBAAnE,YAAY;AAAC,gBAAA,IAAA,EAAA,CAAA,iBAAiB,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAA;;;MC9Q3C,qBAAqB,CAAA;AA8BhC,IAAA,WAAA,CAAoB,IAAY,EAAA;QAAZ,IAAI,CAAA,IAAA,GAAJ,IAAI,CAAQ;AA7BhC;;;AAGG;QACc,IAAU,CAAA,UAAA,GAAG,eAAe,CAAC;QAW7B,IAAY,CAAA,YAAA,GAAG,uBAAuB,CAAC;AAChD,QAAA,IAAA,CAAA,OAAO,GAAG,OAAO,gBAAgB,KAAK,WAAW;AACvD,cAAE,IAAI,gBAAgB,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC;AAElC,QAAA,IAAA,CAAA,YAAY,GAAW;YACtC,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,EAAE,EAAE;SACzD,CAAC;QAEM,IAAY,CAAA,YAAA,GAAS,IAAI,eAAe,CAAS,IAAI,CAAC,YAAY,CAAC,CAAC;AACpE,QAAA,IAAA,CAAA,mBAAmB,GAAG,IAAI,eAAe,CAAS,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAEnF,QAAA,IAAA,CAAA,MAAM,GAAU,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,CAAC;AACjD,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,CAAC,mBAAmB,CAAC,YAAY,EAAE,CAAC;;AAItD,QAAA,MAAM,IAAI,GAAG,OAAO,MAAM,KAAK,WAAW;cACtC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC;AACtD,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,GAAG,CAAoB,iBAAA,EAAA,IAAI,CAAE,CAAA,GAAG,uBAAuB,CAAC;;QAGhF,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACrD,QAAA,IAAI,MAAM,EAAE;YACV,IAAI;AAAE,gBAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC;AAAE,aAAA;AACrD,YAAA,OAAO,CAAC,EAAE;AAAE,gBAAA,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,CAAC,CAAC,CAAC;AAAE,aAAA;AAChE,SAAA;;QAGD,IAAI,CAAC,iBAAiB,EAAE,CAAC;;QAGzB,IAAI,IAAI,CAAC,OAAO,EAAE;YAChB,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,CAAC,EAA2B,KAAI;AACvD,gBAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;AAClD,aAAC,CAAC;AACH,SAAA;KACF;IAED,WAAW,GAAA,EAAK,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE;;IAIxC,aAAa,GAAA;QACX,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;KACnF;AAED,IAAA,aAAa,CAAC,EAAU,EAAI,EAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE;AAEhE,IAAA,OAAO,CAAC,IAAY,EAAA;AAClB,QAAA,MAAM,IAAI,GAAS,EAAE,EAAE,EAAE,CAAA,KAAA,EAAQ,IAAI,CAAC,GAAG,EAAE,CAAA,CAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;AACnE,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;QAC3D,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACvC,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,IAAI,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;KAC/C;AAED,IAAA,UAAU,CAAC,EAAU,EAAA;AACnB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;AACtC,QAAA,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC;YAAE,OAAO;AAC9B,QAAA,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AAC/C,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAChC,QAAA,IAAI,IAAI,CAAC,mBAAmB,CAAC,KAAK,KAAK,EAAE,EAAE;AACzC,YAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAC9C,SAAA;QACD,IAAI,CAAC,WAAW,EAAE,CAAC;AACnB,QAAA,IAAI,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;KACvD;;AAID,IAAA,SAAS,CAAC,MAA2C,EAAA;AACnD,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;AACxC,QAAA,IAAI,CAAC,UAAU;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;AACnD,QAAA,MAAM,SAAS,GAAW;AACxB,YAAA,EAAE,EAAE,CAAU,OAAA,EAAA,IAAI,CAAC,GAAG,EAAE,CAAE,CAAA;AAC1B,YAAA,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC;AAC5B,YAAA,GAAG,MAAM;SACV,CAAC;QACF,UAAU,CAAC,OAAO,GAAG,CAAC,GAAG,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;AACxD,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;QACrD,IAAI,CAAC,WAAW,EAAE,CAAC;AACnB,QAAA,IAAI,CAAC,cAAc,EAAE,CAAC;AACtB,QAAA,IAAI,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;AACpF,QAAA,OAAO,SAAS,CAAC;KAClB;IAED,YAAY,CAAC,QAAgB,EAAE,KAAuD,EAAA;AACpF,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;AACtC,QAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACxB,YAAA,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC;AACpD,YAAA,IAAI,CAAC,EAAE;AACL,gBAAA,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;gBACxB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;gBACnC,IAAI,CAAC,WAAW,EAAE,CAAC;AACnB,gBAAA,IAAI,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;gBAC1D,OAAO;AACR,aAAA;AACF,SAAA;KACF;AAED,IAAA,YAAY,CAAC,QAAgB,EAAA;AAC3B,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;AACxC,QAAA,IAAI,CAAC,UAAU;YAAE,OAAO;AACxB,QAAA,MAAM,MAAM,GAAG,UAAU,CAAC,EAAE,CAAC;AAC7B,QAAA,UAAU,CAAC,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC;AACvE,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;QACrD,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,IAAI,CAAC,cAAc,EAAE,CAAC;AACtB,QAAA,IAAI,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;KAC/D;;AAID;;;AAGG;IACH,oBAAoB,CAAC,MAAc,EAAE,QAAgB,EAAE,CAAS,EAAE,CAAS,EAAE,IAAY,EAAE,IAAY,EAAA;AACrG,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;AACtC,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC;AACtF,QAAA,IAAI,MAAM,EAAE;AACV,YAAA,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;AAAC,YAAA,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;AAAC,YAAA,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;AAAC,YAAA,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;YACnE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;AACnC,YAAA,IAAI,CAAC,cAAc,EAAE,CAAC;AACvB,SAAA;KACF;;IAID,eAAe,GAAA;QACb,OAAO,IAAI,CAAC,SAAS,CAAC;AACpB,YAAA,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,KAAK;AAC9B,YAAA,YAAY,EAAE,IAAI,CAAC,mBAAmB,CAAC,KAAK;AAC1B,SAAA,CAAC,CAAC;KACvB;AAED,IAAA,UAAU,CAAC,MAAW,EAAA;QACpB,IAAI,CAAC,MAAM,EAAE,KAAK;YAAE,OAAO;AAC3B,QAAA,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAChC,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,IAAI,CAAC,cAAc,EAAE,CAAC;KACvB;AAED,IAAA,UAAU,CAAC,MAAc,EAAA;AACvB,QAAA,MAAM,GAAG,GAAG,CAAA,EAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAG,EAAA,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAI,CAAA,EAAA,MAAM,EAAE,CAAC;QAC7E,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAa,UAAA,EAAA,MAAM,CAAE,CAAA,EACpC,mEAAmE,CAAC,CAAC;KACxE;;AAID;;AAEG;IACK,WAAW,GAAA;AACjB,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK;AACjD,YAAA,GAAG,CAAC;YACJ,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;;;aAG/D,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CACzD;AACF,SAAA,CAAC,CAAC,CAAC;QACJ,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC;AACnD,YAAA,KAAK,EAAE,QAAQ;AACf,YAAA,YAAY,EAAE,IAAI,CAAC,mBAAmB,CAAC,KAAK;AAC7C,SAAA,CAAC,CAAC,CAAC;KACL;AAED;;AAEG;IACK,cAAc,GAAA;QACpB,MAAM,SAAS,GAAgB,EAAE,CAAC;QAClC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE;AAC1C,YAAA,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE;AAC5B,gBAAA,SAAS,CAAC,CAAG,EAAA,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAA,CAAE,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AAClF,aAAA;AACF,SAAA;AACD,QAAA,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC;KACpE;AAED;;AAEG;IACK,iBAAiB,GAAA;QACvB,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;AACpD,QAAA,IAAI,CAAC,GAAG;YAAE,OAAO;QACjB,IAAI;YACF,MAAM,SAAS,GAAgB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAC/C,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;AACtC,YAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACxB,gBAAA,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE;AAC5B,oBAAA,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,EAAE,CAAA,CAAA,EAAI,CAAC,CAAC,EAAE,CAAA,CAAE,CAAC,CAAC;AAC5C,oBAAA,IAAI,GAAG,EAAE;AAAE,wBAAA,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AAAC,wBAAA,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AAAC,wBAAA,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;AAAC,wBAAA,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;AAAE,qBAAA;AAC7E,iBAAA;AACF,aAAA;YACD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;AACpC,SAAA;AAAC,QAAA,OAAO,CAAC,EAAE;AACV,YAAA,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,CAAC,CAAC,CAAC;AACrD,SAAA;KACF;AAED;;;AAGG;IACK,YAAY,CAAC,MAAW,EAAE,kBAA2B,EAAA;QAC3D,IAAI,CAAC,MAAM,EAAE,KAAK;YAAE,OAAO;QAC3B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACrC,IAAI,MAAM,CAAC,YAAY;YAAE,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;AAC5E,QAAA,IAAI,CAAC,kBAAkB;YAAE,IAAI,CAAC,iBAAiB,EAAE,CAAC;KACnD;AAED;;;AAGG;AACK,IAAA,YAAY,CAAC,KAAgB,EAAA;;AAEnC,QAAA,MAAM,KAAK,GAAW,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK;YACtD,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC;AAC9B,SAAA,CAAC,CAAC,CAAC;QAEJ,QAAQ,KAAK,CAAC,IAAI;AAEhB,YAAA,KAAK,YAAY;AACf,gBAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;oBAC5C,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AAChE,oBAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBAC9B,IAAI,CAAC,WAAW,EAAE,CAAC;AACpB,iBAAA;gBACD,MAAM;YAER,KAAK,cAAc,EAAE;AACnB,gBAAA,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC;AACzD,gBAAA,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE;AACnC,oBAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBAChC,IAAI,IAAI,CAAC,mBAAmB,CAAC,KAAK,KAAK,KAAK,CAAC,MAAM,EAAE;AACnD,wBAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;AACrD,qBAAA;oBACD,IAAI,CAAC,WAAW,EAAE,CAAC;AACpB,iBAAA;gBACD,MAAM;AACP,aAAA;YAED,KAAK,cAAc,EAAE;AACnB,gBAAA,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC;gBACpD,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE;AAC7D,oBAAA,IAAI,CAAC,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;AACtD,oBAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBAC9B,IAAI,CAAC,WAAW,EAAE,CAAC;;;AAGpB,iBAAA;gBACD,MAAM;AACP,aAAA;YAED,KAAK,gBAAgB,EAAE;AACrB,gBAAA,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC;AACpD,gBAAA,IAAI,IAAI,EAAE;oBACR,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,QAAQ,CAAC,CAAC;AACjE,oBAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBAC9B,IAAI,CAAC,WAAW,EAAE,CAAC;oBACnB,IAAI,CAAC,cAAc,EAAE,CAAC;AACvB,iBAAA;gBACD,MAAM;AACP,aAAA;YAED,KAAK,aAAa,EAAE;AAClB,gBAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;oBACxB,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,QAAQ,CAAC,CAAC;AAC1D,oBAAA,IAAI,CAAC,EAAE;wBACL,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;AAC9B,wBAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;wBAC9B,IAAI,CAAC,WAAW,EAAE,CAAC;wBACnB,MAAM;AACP,qBAAA;AACF,iBAAA;gBACD,MAAM;AACP,aAAA;AACF,SAAA;KACF;AAEO,IAAA,UAAU,CAAC,KAAgB,EAAA;AACjC,QAAA,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC;KAClC;;mHA9SU,qBAAqB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,MAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAArB,qBAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,cADR,MAAM,EAAA,CAAA,CAAA;4FACnB,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBADjC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAA;;;MC8GrB,uBAAuB,CAAA;AAvHpC,IAAA,WAAA,GAAA;AA2HY,QAAA,IAAA,CAAA,aAAa,GAAK,IAAI,YAAY,EAAU,CAAC;AAC7C,QAAA,IAAA,CAAA,eAAe,GAAG,IAAI,YAAY,EAAU,CAAC;QAEvD,IAAM,CAAA,MAAA,GAAG,8BAA8B,CAAC;AAOzC,KAAA;AALC,IAAA,WAAW,CAAC,OAAsB,EAAA;QAChC,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;YACzC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,SAAS,IAAI,8BAA8B,CAAC;AACxE,SAAA;KACF;;qHAbU,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAvB,uBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,uBAAuB,EArHxB,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,OAAA,EAAA,EAAA,aAAA,EAAA,eAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,okDAAA,CAAA,EAAA,CAAA,CAAA;4FA0FU,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAvHnC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,qBAAqB,EACrB,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,okDAAA,CAAA,EAAA,CAAA;8BA2FQ,MAAM,EAAA,CAAA;sBAAd,KAAK;gBACG,KAAK,EAAA,CAAA;sBAAb,KAAK;gBAEI,aAAa,EAAA,CAAA;sBAAtB,MAAM;gBACG,eAAe,EAAA,CAAA;sBAAxB,MAAM;;;ACxHT,MAAM,aAAa,GAA6B;AAC9C,IAAA,eAAe,EAAU,SAAS;AAClC,IAAA,UAAU,EAAe,SAAS;AAClC,IAAA,eAAe,EAAU,SAAS;AAClC,IAAA,SAAS,EAAgB,SAAS;AAClC,IAAA,WAAW,EAAc,SAAS;AAClC,IAAA,WAAW,EAAc,SAAS;AAClC,IAAA,UAAU,EAAe,qFAAqF;;AAE9G,IAAA,kBAAkB,EAAO,oBAAoB;AAC7C,IAAA,cAAc,EAAW,SAAS;AAClC,IAAA,kBAAkB,EAAO,SAAS;AAClC,IAAA,iBAAiB,EAAQ,SAAS;AAClC,IAAA,wBAAwB,EAAC,SAAS;;AAElC,IAAA,gBAAgB,EAAS,SAAS;;AAElC,IAAA,gBAAgB,EAAS,SAAS;AAClC,IAAA,eAAe,EAAU,uBAAuB;AAChD,IAAA,iBAAiB,EAAQ,wBAAwB;AACjD,IAAA,mBAAmB,EAAM,wBAAwB;AACjD,IAAA,iBAAiB,EAAQ,uBAAuB;;AAEhD,IAAA,gBAAgB,EAAS,SAAS;AAClC,IAAA,iBAAiB,EAAQ,wBAAwB;CAClD,CAAC;MA4MW,kBAAkB,CAAA;AAiC7B,IAAA,WAAA,CAAmB,YAAmC,EAAA;QAAnC,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAuB;AA7BtD;;;AAGG;AACO,QAAA,IAAA,CAAA,kBAAkB,GAAG,IAAI,YAAY,EAAQ,CAAC;AAExD;;;AAGG;AACO,QAAA,IAAA,CAAA,mBAAmB,GAAG,IAAI,YAAY,EAAU,CAAC;AAS3D,QAAA,IAAA,CAAA,aAAa,GAA6B,EAAE,GAAG,aAAa,EAAE,CAAC;QAC/D,IAAa,CAAA,aAAA,GAA2B,EAAE,CAAC;QAE3C,IAAK,CAAA,KAAA,GAAW,EAAE,CAAC;QACnB,IAAY,CAAA,YAAA,GAAG,EAAE,CAAC;QAElB,IAAW,CAAA,WAAA,GAAG,KAAK,CAAC;AAEZ,QAAA,IAAA,CAAA,IAAI,GAAG,IAAI,YAAY,EAAE,CAAC;KAEwB;AAE1D,IAAA,WAAW,CAAC,OAAsB,EAAA;QAChC,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,eAAe,CAAC;YAAE,IAAI,CAAC,UAAU,EAAE,CAAC;KACrE;IAED,QAAQ,GAAA;QACN,IAAI,CAAC,UAAU,EAAE,CAAC;QAElB,IAAI,IAAI,CAAC,aAAa,EAAE;YACtB,IAAI;AAAE,gBAAA,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;AAAE,aAAA;AACrE,YAAA,OAAO,CAAC,EAAE;AAAE,gBAAA,OAAO,CAAC,KAAK,CAAC,2CAA2C,EAAE,CAAC,CAAC,CAAC;AAAE,aAAA;AAC7E,SAAA;AAED,QAAA,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AAC3D,QAAA,IAAI,IAAI;AAAE,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;AAElC,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,IAAG;AACvD,YAAA,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;AACnB,YAAA,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,EAAE;AAC5B,gBAAA,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC;AAC9C,gBAAA,IAAI,MAAM;AAAE,oBAAA,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;AACnD,aAAA;YACD,IAAI,CAAC,gBAAgB,EAAE,CAAC;SACzB,CAAC,CAAC,CAAC;AACJ,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,IAAG;AAC3D,YAAA,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;YACvB,IAAI,CAAC,gBAAgB,EAAE,CAAC;SACzB,CAAC,CAAC,CAAC;KACL;IAED,WAAW,GAAA,EAAK,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE;AAE1C,IAAA,aAAa,CAAC,MAAc,EAAA;AAC1B,QAAA,IAAI,CAAC,YAAY,CAAC,oBAAoB,CACpC,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAC3E,CAAC;KACH;AAED,IAAA,cAAc,CAAC,QAAgB,EAAI,EAAA,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,EAAE;AAE9E,IAAA,YAAY,CAAC,EAAU,EAAI,EAAA,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE;IAEjE,SAAS,GAAA;AACP,QAAA,MAAM,IAAI,GAAG,MAAM,CAAC,iBAAiB,EAAE,CAAa,UAAA,EAAA,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAA,CAAE,CAAC,CAAC;AAC7E,QAAA,IAAI,IAAI;AAAE,YAAA,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;KAC3C;IAED,YAAY,CAAC,KAAY,EAAE,EAAU,EAAA;QACnC,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,IAAI,OAAO,CAAC,wBAAwB,CAAC;AAAE,YAAA,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;KACzE;IAED,QAAQ,CAAC,KAAY,EAAE,MAAc,EAAA;QACnC,KAAK,CAAC,eAAe,EAAE,CAAC;AACxB,QAAA,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;KACtC;IAED,eAAe,GAAA,EAAa,OAAO,IAAI,CAAC,YAAY,CAAC,eAAe,EAAE,CAAC,EAAE;IAEjE,UAAU,GAAA;AAChB,QAAA,IAAI,CAAC,aAAa,GAAG,EAAE,GAAG,aAAa,EAAE,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC;AACjE,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC;QAC7B,IAAI,CAAC,aAAa,GAAG;YACnB,WAAW,EAAoB,CAAC,CAAC,eAAe;YAChD,iBAAiB,EAAc,CAAC,CAAC,UAAU;YAC3C,gBAAgB,EAAe,CAAC,CAAC,eAAe;YAChD,mBAAmB,EAAY,CAAC,CAAC,SAAS;YAC1C,qBAAqB,EAAU,CAAC,CAAC,WAAW;YAC5C,qBAAqB,EAAU,CAAC,CAAC,WAAW;YAC5C,oBAAoB,EAAW,CAAC,CAAC,UAAU;YAC3C,6BAA6B,EAAE,CAAC,CAAC,kBAAkB;YACnD,yBAAyB,EAAM,CAAC,CAAC,cAAc;YAC/C,wBAAwB,EAAO,CAAC,CAAC,kBAAkB;YACnD,uBAAuB,EAAQ,CAAC,CAAC,iBAAiB;YAClD,wBAAwB,EAAO,CAAC,CAAC,wBAAwB;YACzD,2BAA2B,EAAI,CAAC,CAAC,gBAAgB;YACjD,2BAA2B,EAAI,CAAC,CAAC,gBAAgB;YACjD,0BAA0B,EAAK,CAAC,CAAC,eAAe;YAChD,4BAA4B,EAAG,CAAC,CAAC,iBAAiB;YAClD,sBAAsB,EAAS,CAAC,CAAC,mBAAmB;YACpD,yBAAyB,EAAM,CAAC,CAAC,iBAAiB;YAClD,0BAA0B,EAAK,CAAC,CAAC,gBAAgB;YACjD,4BAA4B,EAAG,CAAC,CAAC,iBAAiB;SACnD,CAAC;KACH;IAEO,gBAAgB,GAAA;QACtB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,YAAY,CAAC,CAAC;KACpE;;gHA1HU,kBAAkB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAC,qBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAlB,kBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,kBAAkB,EAoBf,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,EAAA,aAAA,EAAA,eAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,OAAA,EAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,cAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,iBAAiB,EAAU,WAAA,EAAA,IAAA,EAAA,IAAA,EAAA,WAAW,EA5N1C,CAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwFT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,owHAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,uBAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,EAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,mBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,SAAA,EAAA,KAAA,EAAA,WAAA,EAAA,aAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,iBAAA,EAAA,QAAA,EAAA,YAAA,EAAA,CAAA,EAAA,CAAA,CAAA;4FAgHU,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBA1M9B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,eAAe,EACf,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwFT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,owHAAA,CAAA,EAAA,CAAA;yGAiHQ,aAAa,EAAA,CAAA;sBAArB,KAAK;gBACG,KAAK,EAAA,CAAA;sBAAb,KAAK;gBAMI,kBAAkB,EAAA,CAAA;sBAA3B,MAAM;gBAMG,mBAAmB,EAAA,CAAA;sBAA5B,MAAM;gBAOP,YAAY,EAAA,CAAA;sBADX,YAAY;AAAC,gBAAA,IAAA,EAAA,CAAA,iBAAiB,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAA;;;MCvO3C,eAAe,CAAA;;6GAAf,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;AAAf,eAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,eAAe,iBAhBxB,kBAAkB;QAClB,uBAAuB;QACvB,mBAAmB;QACnB,iBAAiB,CAAA,EAAA,OAAA,EAAA,CAGjB,YAAY,CAAA,EAAA,OAAA,EAAA,CAIZ,kBAAkB;QAClB,uBAAuB;QACvB,mBAAmB;QACnB,iBAAiB,CAAA,EAAA,CAAA,CAAA;AAGR,eAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,eAAe,EARf,SAAA,EAAA,CAAC,qBAAqB,CAAC,YAFhC,YAAY,CAAA,EAAA,CAAA,CAAA;4FAUH,eAAe,EAAA,UAAA,EAAA,CAAA;kBAlB3B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,YAAY,EAAE;wBACZ,kBAAkB;wBAClB,uBAAuB;wBACvB,mBAAmB;wBACnB,iBAAiB;AAClB,qBAAA;AACD,oBAAA,OAAO,EAAE;wBACP,YAAY;AACb,qBAAA;oBACD,SAAS,EAAE,CAAC,qBAAqB,CAAC;AAClC,oBAAA,OAAO,EAAE;wBACP,kBAAkB;wBAClB,uBAAuB;wBACvB,mBAAmB;wBACnB,iBAAiB;AAClB,qBAAA;AACF,iBAAA,CAAA;;AAGD;;;AAGG;MAKU,SAAS,CAAA;;uGAAT,SAAS,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;AAAT,SAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,SAAS,EAFR,SAAA,EAAA,CAAA,kBAAkB,CADpB,EAAA,OAAA,EAAA,CAAA,aAAa,EAPZ,eAAe,CAAA,EAAA,CAAA,CAAA;wGAUf,SAAS,EAAA,OAAA,EAAA,CAHV,aAAa,EAAE,eAAe,CAAA,EAAA,CAAA,CAAA;4FAG7B,SAAS,EAAA,UAAA,EAAA,CAAA;kBAJrB,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE,CAAC,aAAa,EAAE,eAAe,CAAC;oBACzC,SAAS,EAAE,CAAC,kBAAkB,CAAC;AAChC,iBAAA,CAAA;;;ACpCD;;AAEG;;ACFH;;AAEG;;;;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ogidor/dashboard",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.6",
|
|
4
4
|
"description": "A content-agnostic drag-and-drop dashboard library for Angular 15. Multi-workspace, persistent layout, pop-out windows, live cross-tab sync.",
|
|
5
5
|
"author": "",
|
|
6
6
|
"license": "MIT",
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"peerDependencies": {
|
|
18
18
|
"@angular/common": "15.2.10",
|
|
19
19
|
"@angular/core": "15.2.10",
|
|
20
|
-
"rxjs": "
|
|
20
|
+
"rxjs": "6.6.7",
|
|
21
21
|
"zone.js": "0.12.0"
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|