@ogidor/dashboard 1.0.2 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"ogidor-dashboard.mjs","sources":["../../src/app/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 { Injectable } from '@angular/core';\nimport { BehaviorSubject, Subject } from 'rxjs';\nimport { Page, Widget, DashboardConfig, WidgetType, LineBarData, DonutData } from './models';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class DashboardStateService {\n private readonly STORAGE_KEY = 'xtb_dashboard_layout';\n \n private initialPages: Page[] = [\n {\n id: 'page-1',\n name: 'Default Workspace',\n widgets: [\n {\n id: 'w-1',\n type: 'LINE',\n x: 0,\n y: 0,\n cols: 4,\n rows: 4,\n title: 'Market Trend',\n data: { series: [{ name: 'Price', data: [30, 40, 35, 50, 49, 60, 70, 91, 125] }] }\n },\n {\n id: 'w-2',\n type: 'DONUT',\n x: 4,\n y: 0,\n cols: 2,\n rows: 4,\n title: 'Asset Allocation',\n data: { series: [44, 55, 41, 17, 15] }\n }\n ]\n }\n ];\n\n private pagesSubject = new BehaviorSubject<Page[]>(this.initialPages);\n private activePageIdSubject = new BehaviorSubject<string>(this.initialPages[0].id);\n\n /**\n * Emits whenever a widget's data is updated programmatically.\n * Key = widget id, value = new data payload.\n */\n private widgetDataSubject = new Subject<{ widgetId: string; data: LineBarData | DonutData }>();\n widgetData$ = this.widgetDataSubject.asObservable();\n\n pages$ = this.pagesSubject.asObservable();\n activePageId$ = this.activePageIdSubject.asObservable();\n\n constructor() {\n const saved = localStorage.getItem(this.STORAGE_KEY);\n if (saved) {\n try {\n this.loadLayout(JSON.parse(saved));\n } catch (e) {\n console.error('Failed to load saved layout', e);\n }\n }\n }\n\n getActivePage(): Page | undefined {\n return this.pagesSubject.value.find(p => p.id === this.activePageIdSubject.value);\n }\n\n setActivePage(id: string) {\n this.activePageIdSubject.next(id);\n }\n\n addPage(name: string) {\n const newPage: Page = {\n id: `page-${Date.now()}`,\n name,\n widgets: []\n };\n const updatedPages = [...this.pagesSubject.value, newPage];\n this.pagesSubject.next(updatedPages);\n this.activePageIdSubject.next(newPage.id);\n this.saveToLocalStorage();\n }\n\n removePage(id: string) {\n const pages = this.pagesSubject.value;\n if (pages.length <= 1) return;\n\n const updatedPages = pages.filter(p => p.id !== id);\n this.pagesSubject.next(updatedPages);\n \n if (this.activePageIdSubject.value === id) {\n this.activePageIdSubject.next(updatedPages[0].id);\n }\n this.saveToLocalStorage();\n }\n\n addWidget(type: WidgetType) {\n const activePage = this.getActivePage();\n if (!activePage) return;\n\n const newWidget: Widget = {\n id: `widget-${Date.now()}`,\n type,\n x: 0, y: 0,\n cols: type === 'DONUT' ? 2 : 4,\n rows: 4,\n title: `${type.charAt(0) + type.slice(1).toLowerCase()} Chart`,\n data: this.getDefaultDataForType(type)\n };\n\n activePage.widgets.push(newWidget);\n this.updatePages(this.pagesSubject.value);\n }\n\n addWidgetWithData(type: WidgetType, title: string, data: LineBarData | DonutData) {\n const activePage = this.getActivePage();\n if (!activePage) return;\n\n const newWidget: Widget = {\n id: `widget-${Date.now()}`,\n type,\n x: 0, y: 0,\n cols: type === 'DONUT' ? 3 : 6,\n rows: 4,\n title,\n data\n };\n\n activePage.widgets.push(newWidget);\n this.updatePages(this.pagesSubject.value);\n }\n\n private getDefaultDataForType(type: WidgetType) {\n if (type === 'DONUT') {\n return { series: [30, 20, 50] };\n }\n return {\n series: [{\n name: 'Sample Data',\n data: Array.from({ length: 10 }, () => Math.floor(Math.random() * 100))\n }]\n };\n }\n\n updateWidgetPosition(pageId: string, widgetId: string, x: number, y: number, cols: number, rows: number) {\n const pages = this.pagesSubject.value;\n const page = pages.find(p => p.id === pageId);\n if (page) {\n const widget = page.widgets.find(w => w.id === widgetId);\n if (widget) {\n widget.x = x;\n widget.y = y;\n widget.cols = cols;\n widget.rows = rows;\n this.updatePages(pages);\n }\n }\n }\n\n removeWidget(widgetId: string) {\n const activePage = this.getActivePage();\n if (activePage) {\n activePage.widgets = activePage.widgets.filter(w => w.id !== widgetId);\n this.updatePages(this.pagesSubject.value);\n }\n }\n\n /**\n * Push new data into a widget by its id.\n * The widget's chart will re-render immediately.\n *\n * @param widgetId The `id` of the target widget.\n * @param data New data — `LineBarData` for LINE/BAR, `DonutData` for DONUT.\n */\n updateWidgetData(widgetId: string, data: LineBarData | DonutData) {\n const pages = this.pagesSubject.value;\n for (const page of pages) {\n const widget = page.widgets.find(w => w.id === widgetId);\n if (widget) {\n widget.data = data;\n this.widgetDataSubject.next({ widgetId, data });\n this.updatePages(pages);\n return;\n }\n }\n console.warn(`[Dashboard] updateWidgetData: widget \"${widgetId}\" not found.`);\n }\n\n updateWidgetMeta(widgetId: string, meta: { title?: string; colors?: string[]; cardColor?: string; data?: LineBarData | DonutData }) {\n const pages = this.pagesSubject.value;\n for (const page of pages) {\n const widget = page.widgets.find(w => w.id === widgetId);\n if (widget) {\n if (meta.title !== undefined) widget.title = meta.title;\n if (meta.colors !== undefined) widget.colors = meta.colors;\n if (meta.cardColor !== undefined) widget.cardColor = meta.cardColor;\n if (meta.data !== undefined) {\n widget.data = meta.data;\n this.widgetDataSubject.next({ widgetId, data: meta.data });\n }\n this.updatePages(pages);\n return;\n }\n }\n }\n\n private updatePages(pages: Page[]) {\n this.pagesSubject.next([...pages]);\n this.saveToLocalStorage();\n }\n\n serializeLayout(): string {\n const config: DashboardConfig = {\n pages: this.pagesSubject.value,\n activePageId: this.activePageIdSubject.value\n };\n return JSON.stringify(config);\n }\n\n loadLayout(config: any) {\n if (config && config.pages) {\n this.pagesSubject.next(config.pages);\n if (config.activePageId) {\n this.activePageIdSubject.next(config.activePageId);\n }\n }\n }\n\n private saveToLocalStorage() {\n localStorage.setItem(this.STORAGE_KEY, this.serializeLayout());\n }\n}\n","import { Component, Input, Output, EventEmitter, OnInit, OnChanges, OnDestroy, SimpleChanges } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { Widget, DashboardTheme } from './models';\nimport { DashboardStateService } from './dashboard-state.service';\nimport {\n ApexAxisChartSeries, ApexChart, ApexXAxis, ApexDataLabels,\n ApexStroke, ApexYAxis, ApexTitleSubtitle, ApexLegend,\n ApexPlotOptions, ApexTooltip, ApexTheme\n} from 'ng-apexcharts';\n\nexport type ChartOptions = {\n series: ApexAxisChartSeries | number[];\n chart: ApexChart; xaxis: ApexXAxis; stroke: ApexStroke;\n dataLabels: ApexDataLabels; yaxis: ApexYAxis; title: ApexTitleSubtitle;\n labels: string[]; legend: ApexLegend; plotOptions: ApexPlotOptions;\n tooltip: ApexTooltip; theme: ApexTheme; colors: string[];\n};\n\nconst DEFAULT_CHART_COLORS = ['#0a84ff', '#30d158', '#ff9f0a', '#bf5af2', '#ff453a'];\nconst DEFAULT_FORECOLOR = '#8e8e93';\nconst DEFAULT_CARD_BG = '#2c2c2e';\n\n@Component({\n selector: 'app-widget-renderer',\n template: `\n <div class=\"widget-container\" [ngStyle]=\"cardStyles\">\n <div class=\"widget-header\">\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 widget\">\n <i class=\"la la-pen\"></i>\n </button>\n <button class=\"btn-icon btn-close-widget\" (click)=\"onRemove()\" title=\"Remove widget\">\n <i class=\"la la-times\"></i>\n </button>\n </div>\n </div>\n <div class=\"widget-body\">\n <apx-chart\n *ngIf=\"chartOptions.chart\"\n style=\"display:block;width:100%;height:100%;\"\n [series]=\"chartOptions.series!\"\n [chart]=\"chartOptions.chart!\"\n [xaxis]=\"chartOptions.xaxis!\"\n [stroke]=\"chartOptions.stroke!\"\n [dataLabels]=\"chartOptions.dataLabels!\"\n [plotOptions]=\"chartOptions.plotOptions!\"\n [yaxis]=\"chartOptions.yaxis!\"\n [labels]=\"chartOptions.labels!\"\n [legend]=\"chartOptions.legend!\"\n [colors]=\"chartOptions.colors!\"\n [theme]=\"chartOptions.theme!\"\n [tooltip]=\"chartOptions.tooltip!\"\n ></apx-chart>\n </div>\n </div>\n `,\n styles: [`\n .widget-container {\n height: 100%; width: 100%;\n display: flex; flex-direction: column;\n border-radius: 30px; overflow: hidden;\n box-shadow: 0 8px 24px rgba(0,0,0,0.25);\n border: 1px solid rgba(255,255,255,0.08);\n transition: box-shadow 0.2s ease;\n box-sizing: border-box;\n background: var(--dash-card-bg);\n }\n .widget-container:hover { box-shadow: 0 12px 32px rgba(0,0,0,0.35); }\n .widget-header {\n padding: 14px 16px 4px;\n display: flex; justify-content: space-between; align-items: center;\n cursor: move; flex-shrink: 0;\n }\n .widget-title { color: #fff; font-size: 15px; font-weight: 600; letter-spacing: 0.3px; }\n .header-actions { display: flex; gap: 6px; align-items: center; }\n .btn-icon {\n background: rgba(255,255,255,0.08); border: none; color: var(--dash-fore-color);\n cursor: pointer; font-size: 12px; width: 26px; height: 26px;\n border-radius: 50%; display: flex; align-items: center; justify-content: center;\n transition: all 0.2s; flex-shrink: 0;\n }\n .btn-edit:hover { background: rgba(10,132,255,0.25); color: var(--dash-accent-color); }\n .btn-close-widget:hover { background: rgba(255,69,58,0.25); color: var(--dash-danger-color); }\n .widget-body {\n flex: 1; min-height: 0; padding: 4px 12px 12px;\n display: flex; flex-direction: column;\n }\n `]\n})\nexport class WidgetRendererComponent implements OnInit, OnChanges, OnDestroy {\n @Input() widget!: Widget;\n @Input() onRemoveWidget!: (id: string) => void;\n @Input() theme?: Required<DashboardTheme>;\n @Output() editRequested = new EventEmitter<Widget>();\n\n chartOptions!: Partial<ChartOptions>;\n cardStyles: Record<string, string> = {};\n\n private subs = new Subscription();\n\n constructor(private stateService: DashboardStateService) {}\n\n ngOnInit() {\n this.applyStyles();\n this.initChart();\n this.subs.add(\n this.stateService.widgetData$.subscribe(({ widgetId, data }) => {\n if (widgetId === this.widget.id) {\n this.widget = { ...this.widget, data };\n this.initChart();\n }\n })\n );\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['theme']) { this.applyStyles(); this.initChart(); }\n if (changes['widget'] && !changes['widget'].firstChange) { this.applyStyles(); this.initChart(); }\n }\n\n ngOnDestroy() { this.subs.unsubscribe(); }\n\n private applyStyles() {\n this.cardStyles = {\n background: this.widget.cardColor ?? 'var(--dash-card-bg)'\n };\n }\n\n private resolvedColors(): string[] {\n return this.widget.colors ?? this.theme?.chartColors ?? DEFAULT_CHART_COLORS;\n }\n\n private initChart() {\n const isDonut = this.widget.type === 'DONUT';\n const colors = this.resolvedColors();\n const foreColor = this.theme?.chartForeColor ?? DEFAULT_FORECOLOR;\n const lineBarData = !isDonut ? (this.widget.data as any) : null;\n const donutData = isDonut ? (this.widget.data as any) : null;\n const categories: string[] = lineBarData?.categories ?? [];\n const donutLabels: string[] = donutData?.labels ?? ['A','B','C','D','E'];\n\n this.chartOptions = {\n series: this.widget.data.series as any,\n chart: {\n width: '100%', height: '100%',\n type: this.widget.type.toLowerCase() as any,\n toolbar: { show: false },\n animations: { enabled: true, speed: 400 },\n background: 'transparent', foreColor,\n parentHeightOffset: 0, sparkline: { enabled: false },\n },\n theme: { mode: 'dark' },\n colors,\n stroke: { curve: 'smooth', width: isDonut ? 0 : 3 },\n dataLabels: { enabled: false },\n legend: { position: 'bottom', labels: { colors: foreColor } },\n tooltip: { theme: 'dark' },\n plotOptions: {\n pie: { donut: { size: '70%', labels: { show: true, total: { show: true, label: 'Total', color: '#fff' } } } },\n bar: { borderRadius: 8, columnWidth: '50%' }\n },\n xaxis: {\n categories: categories.length ? categories : undefined,\n labels: { style: { colors: foreColor } },\n axisBorder: { show: false }, axisTicks: { show: false }\n },\n yaxis: { labels: { style: { colors: foreColor } } },\n labels: isDonut ? donutLabels : undefined,\n };\n }\n\n onRemove() { this.onRemoveWidget(this.widget.id); }\n}\n","import { Component, OnInit, OnDestroy, Input, OnChanges, SimpleChanges } from '@angular/core';\nimport { GridsterConfig } from 'angular-gridster2';\nimport { DashboardStateService } from './dashboard-state.service';\nimport { Page, Widget, WidgetType, DashboardTheme, LineBarData, DonutData } from './models';\nimport { Subscription } from 'rxjs';\n\nconst DEFAULT_THEME: Required<DashboardTheme> = {\n backgroundColor: '#000000',\n panelColor: '#1c1c1e',\n widgetCardColor: '#2c2c2e',\n chartForeColor: '#8e8e93',\n accentColor: '#0a84ff',\n dangerColor: '#ff453a',\n chartColors: ['#0a84ff', '#30d158', '#ff9f0a', '#bf5af2', '#ff453a'],\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif',\n};\n\n@Component({\n selector: 'app-dashboard',\n template: `\n <div class=\"dashboard-wrapper\" [ngStyle]=\"wrapperStyles\">\n <main class=\"main-content\">\n\n <!-- ── Header ── -->\n <header class=\"dashboard-header\">\n <!-- Tabs -->\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-close\" *ngIf=\"pages.length > 1\" (click)=\"onRemovePage($event, page.id)\">\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 -->\n <button class=\"btn-add-widget\" (click)=\"openDialog()\" title=\"Add widget\">\n <i class=\"la la-plus\"></i>\n <span>Add Widget</span>\n </button>\n </header>\n\n <!-- ── Grid ── -->\n <div class=\"grid-container\">\n <gridster [options]=\"options\">\n <gridster-item [item]=\"widget\" *ngFor=\"let widget of activePage?.widgets\">\n <app-widget-renderer\n [widget]=\"widget\"\n [onRemoveWidget]=\"removeWidgetHandler\"\n [theme]=\"resolvedTheme\"\n (editRequested)=\"openEditDialog($event)\"\n ></app-widget-renderer>\n </gridster-item>\n </gridster>\n </div>\n </main>\n </div>\n\n <!-- ── Add Widget Dialog ── -->\n <div class=\"dialog-backdrop\" *ngIf=\"dialogOpen\" (click)=\"closeDialog()\"></div>\n <div class=\"dialog\" *ngIf=\"dialogOpen\">\n <div class=\"dialog-header\">\n <span class=\"dialog-title\">Add Widget</span>\n <button class=\"dialog-close\" (click)=\"closeDialog()\"><i class=\"la la-times\"></i></button>\n </div>\n\n <div class=\"dialog-body\">\n\n <!-- Chart type picker -->\n <div class=\"field-group\">\n <label class=\"field-label\">Chart type</label>\n <div class=\"type-picker\">\n <button\n *ngFor=\"let t of widgetTypes\"\n class=\"type-btn\"\n [class.selected]=\"dialogType === t.value\"\n (click)=\"dialogType = t.value\"\n >\n <i [class]=\"'la ' + t.icon\"></i>\n <span>{{ t.label }}</span>\n </button>\n </div>\n </div>\n\n <!-- Title -->\n <div class=\"field-group\">\n <label class=\"field-label\">Title</label>\n <input class=\"field-input\" [(ngModel)]=\"dialogTitle\" placeholder=\"My Chart\" />\n </div>\n\n <!-- Series (LINE / BAR) -->\n <ng-container *ngIf=\"dialogType !== 'DONUT'\">\n <div class=\"field-group\">\n <div class=\"field-row-header\">\n <label class=\"field-label\">Series</label>\n <button class=\"btn-link\" (click)=\"addSeries()\"><i class=\"la la-plus\"></i> Add series</button>\n </div>\n <div class=\"series-list\">\n <div class=\"series-row\" *ngFor=\"let s of dialogSeries; let i = index\">\n <input class=\"field-input series-name\" [(ngModel)]=\"s.name\" placeholder=\"Series name\" />\n <input class=\"field-input series-data\" [(ngModel)]=\"s.dataRaw\"\n placeholder=\"Comma-separated values, e.g. 10,25,40\" />\n <button class=\"btn-remove-series\" *ngIf=\"dialogSeries.length > 1\" (click)=\"removeSeries(i)\">\n <i class=\"la la-times\"></i>\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"field-group\">\n <label class=\"field-label\">X-axis labels <span class=\"field-hint\">(optional, comma-separated)</span></label>\n <input class=\"field-input\" [(ngModel)]=\"dialogCategories\" placeholder=\"Jan,Feb,Mar,Apr\" />\n </div>\n </ng-container>\n\n <!-- Slices (DONUT) -->\n <ng-container *ngIf=\"dialogType === 'DONUT'\">\n <div class=\"field-group\">\n <div class=\"field-row-header\">\n <label class=\"field-label\">Slices</label>\n <button class=\"btn-link\" (click)=\"addSlice()\"><i class=\"la la-plus\"></i> Add slice</button>\n </div>\n <div class=\"series-list\">\n <div class=\"series-row\" *ngFor=\"let sl of dialogSlices; let i = index\">\n <input class=\"field-input series-name\" [(ngModel)]=\"sl.label\" placeholder=\"Label\" />\n <input class=\"field-input series-data\" [(ngModel)]=\"sl.value\" type=\"number\" placeholder=\"Value\" />\n <button class=\"btn-remove-series\" *ngIf=\"dialogSlices.length > 1\" (click)=\"removeSlice(i)\">\n <i class=\"la la-times\"></i>\n </button>\n </div>\n </div>\n </div>\n </ng-container>\n\n </div>\n\n <div class=\"dialog-footer\">\n <button class=\"btn-cancel\" (click)=\"closeDialog()\">Cancel</button>\n <button class=\"btn-confirm\" (click)=\"confirmAddWidget()\" [disabled]=\"!dialogTitle.trim()\">\n <i class=\"la la-check\"></i> Add Widget\n </button>\n </div>\n </div>\n <!-- ── Edit Widget Dialog ── -->\n <div class=\"dialog-backdrop\" *ngIf=\"editDialogOpen\" (click)=\"closeEditDialog()\"></div>\n <div class=\"dialog\" *ngIf=\"editDialogOpen\">\n <div class=\"dialog-header\">\n <span class=\"dialog-title\">Edit Widget</span>\n <button class=\"dialog-close\" (click)=\"closeEditDialog()\"><i class=\"la la-times\"></i></button>\n </div>\n\n <div class=\"dialog-body\">\n\n <!-- Title -->\n <div class=\"field-group\">\n <label class=\"field-label\">Title</label>\n <input class=\"field-input\" [(ngModel)]=\"editTitle\" placeholder=\"Chart title\" />\n </div>\n\n <!-- Card background -->\n <div class=\"field-group\">\n <label class=\"field-label\">Card color</label>\n <div class=\"color-row\">\n <input type=\"color\" class=\"color-swatch\" [(ngModel)]=\"editCardColor\" />\n <input class=\"field-input\" [(ngModel)]=\"editCardColor\" placeholder=\"#2c2c2e\" />\n </div>\n </div>\n\n <!-- Series colors -->\n <div class=\"field-group\">\n <label class=\"field-label\">Series colors</label>\n <div class=\"color-list\">\n <div class=\"color-item\" *ngFor=\"let c of editColors; let i = index\">\n <input type=\"color\" class=\"color-swatch\" [(ngModel)]=\"editColors[i]\" />\n <input class=\"field-input color-hex\" [(ngModel)]=\"editColors[i]\" placeholder=\"#0a84ff\" />\n <span class=\"color-label\">{{ getEditSeriesLabel(i) }}</span>\n </div>\n </div>\n </div>\n\n <!-- Data: LINE / BAR -->\n <ng-container *ngIf=\"editWidgetType !== 'DONUT'\">\n <div class=\"field-group\">\n <div class=\"field-row-header\">\n <label class=\"field-label\">Series data</label>\n <button class=\"btn-link\" (click)=\"addEditSeries()\"><i class=\"la la-plus\"></i> Add</button>\n </div>\n <div class=\"series-list\">\n <div class=\"series-row\" *ngFor=\"let s of editSeries; let i = index\">\n <input class=\"field-input series-name\" [(ngModel)]=\"s.name\" placeholder=\"Name\" />\n <input class=\"field-input series-data\" [(ngModel)]=\"s.dataRaw\" placeholder=\"10,20,30\" />\n <button class=\"btn-remove-series\" *ngIf=\"editSeries.length > 1\" (click)=\"removeEditSeries(i)\">\n <i class=\"la la-times\"></i>\n </button>\n </div>\n </div>\n </div>\n <div class=\"field-group\">\n <label class=\"field-label\">X-axis labels <span class=\"field-hint\">(optional, comma-separated)</span></label>\n <input class=\"field-input\" [(ngModel)]=\"editCategories\" placeholder=\"Jan,Feb,Mar\" />\n </div>\n </ng-container>\n\n <!-- Data: DONUT -->\n <ng-container *ngIf=\"editWidgetType === 'DONUT'\">\n <div class=\"field-group\">\n <div class=\"field-row-header\">\n <label class=\"field-label\">Slices</label>\n <button class=\"btn-link\" (click)=\"addEditSlice()\"><i class=\"la la-plus\"></i> Add</button>\n </div>\n <div class=\"series-list\">\n <div class=\"series-row\" *ngFor=\"let sl of editSlices; let i = index\">\n <input class=\"field-input series-name\" [(ngModel)]=\"sl.label\" placeholder=\"Label\" />\n <input class=\"field-input series-data\" [(ngModel)]=\"sl.value\" type=\"number\" placeholder=\"Value\" />\n <button class=\"btn-remove-series\" *ngIf=\"editSlices.length > 1\" (click)=\"removeEditSlice(i)\">\n <i class=\"la la-times\"></i>\n </button>\n </div>\n </div>\n </div>\n </ng-container>\n\n </div>\n\n <div class=\"dialog-footer\">\n <button class=\"btn-cancel\" (click)=\"closeEditDialog()\">Cancel</button>\n <button class=\"btn-confirm\" (click)=\"confirmEditWidget()\">\n <i class=\"la la-check\"></i> Save\n </button>\n </div>\n </div>\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 /* ── Layout ── */\n .dashboard-wrapper {\n display: flex;\n height: 100vh;\n width: 100vw;\n overflow: hidden;\n padding: 16px;\n box-sizing: border-box;\n background: var(--dash-bg);\n color: var(--dash-fore-color);\n font-family: var(--dash-font-family);\n }\n .main-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n border-radius: 40px;\n padding: 20px;\n background: var(--dash-panel-bg);\n box-shadow: 0 10px 30px rgba(0,0,0,0.5);\n border: 1px solid rgba(255,255,255,0.05);\n }\n\n /* ── Header ── */\n .dashboard-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 20px;\n gap: 12px;\n }\n .tabs-container {\n display: flex;\n align-items: center;\n gap: 8px;\n background: rgba(44,44,46,0.6);\n backdrop-filter: blur(10px);\n border-radius: 25px;\n padding: 6px;\n }\n .tab {\n display: flex;\n align-items: center;\n padding: 8px 20px;\n border-radius: 20px;\n cursor: pointer;\n font-size: 14px;\n 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 {\n background: #3a3a3c;\n color: #ffffff;\n box-shadow: 0 2px 10px rgba(0,0,0,0.2);\n }\n .tab:hover:not(.active) {\n color: #e5e5ea;\n background: rgba(255,255,255,0.05);\n }\n .tab-name { margin-right: 8px; }\n .tab-close {\n background: transparent; border: none; color: var(--dash-fore-color); padding: 2px;\n font-size: 12px; cursor: pointer; opacity: 0; border-radius: 50%;\n display: flex; align-items: center; justify-content: center; transition: all 0.2s;\n }\n .tab-close:hover { color: var(--dash-danger-color); background: rgba(255, 69, 58, 0.2); }\n .tab:hover .tab-close { opacity: 1; }\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\n /* Add Widget button */\n .btn-add-widget {\n display: flex;\n align-items: center;\n gap: 6px;\n background: var(--dash-accent-color);\n border: none;\n color: #ffffff;\n font-size: 14px;\n font-weight: 600;\n padding: 10px 20px;\n border-radius: 22px;\n cursor: pointer;\n 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 .grid-container { flex: 1; overflow: auto; border-radius: 24px; min-height: 0; }\n gridster { background: transparent; height: 100% !important; }\n\n /* ── Dialog ── */\n .dialog-backdrop {\n position: fixed;\n inset: 0;\n background: rgba(0,0,0,0.6);\n backdrop-filter: blur(6px);\n z-index: 900;\n }\n .dialog {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n z-index: 901;\n width: min(520px, calc(100vw - 32px));\n max-height: calc(100vh - 64px);\n display: flex;\n flex-direction: column;\n background: var(--dash-panel-bg);\n border-radius: 28px;\n border: 1px solid rgba(255,255,255,0.1);\n box-shadow: 0 24px 60px rgba(0,0,0,0.7);\n overflow: hidden;\n }\n .dialog-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 22px 24px 16px;\n border-bottom: 1px solid rgba(255,255,255,0.07);\n }\n .dialog-title { font-size: 17px; font-weight: 700; color: #ffffff; }\n .dialog-close {\n background: rgba(255,255,255,0.08); border: none; color: var(--dash-fore-color);\n width: 30px; height: 30px; border-radius: 50%;\n display: flex; align-items: center; justify-content: center;\n cursor: pointer; font-size: 14px; transition: all 0.2s;\n }\n .dialog-close:hover { background: rgba(255,69,58,0.25); color: var(--dash-danger-color); }\n .dialog-body { flex: 1; overflow-y: auto; padding: 20px 24px; display: flex; flex-direction: column; gap: 20px; }\n .field-group { display: flex; flex-direction: column; gap: 8px; }\n .field-label { font-size: 13px; font-weight: 600; color: var(--dash-fore-color); text-transform: uppercase; letter-spacing: 0.5px; }\n .field-input {\n background: var(--dash-card-bg);\n border: 1px solid rgba(255,255,255,0.08);\n border-radius: 12px;\n padding: 10px 14px;\n color: #ffffff;\n font-size: 14px;\n outline: none;\n width: 100%;\n box-sizing: border-box;\n }\n .field-input:focus { border-color: var(--dash-accent-color); }\n .type-picker { display: flex; gap: 10px; }\n .type-btn {\n flex: 1; display: flex; flex-direction: column; align-items: center; gap: 6px; padding: 14px 10px;\n background: var(--dash-card-bg); border: 2px solid transparent; border-radius: 16px;\n color: var(--dash-fore-color); font-size: 12px; font-weight: 600; cursor: pointer; transition: all 0.2s;\n }\n .type-btn.selected { border-color: var(--dash-accent-color); color: var(--dash-accent-color); background: rgba(10,132,255,0.12); }\n .btn-link { background: transparent; border: none; color: var(--dash-accent-color); font-size: 13px; font-weight: 600; cursor: pointer; }\n .dialog-footer { display: flex; align-items: center; justify-content: flex-end; gap: 10px; padding: 16px 24px 22px; border-top: 1px solid rgba(255,255,255,0.07); }\n .btn-cancel { background: transparent; border: 1px solid rgba(255,255,255,0.12); color: var(--dash-fore-color); padding: 10px 20px; border-radius: 20px; cursor: pointer; }\n .btn-confirm { background: var(--dash-accent-color); border: none; color: #ffffff; padding: 10px 22px; border-radius: 20px; font-weight: 600; cursor: pointer; }\n .btn-confirm:disabled { opacity: 0.4; cursor: not-allowed; }\n `]\n})\nexport class DashboardComponent implements OnInit, OnDestroy, OnChanges {\n @Input() initialLayout?: string;\n @Input() theme?: DashboardTheme;\n\n resolvedTheme: Required<DashboardTheme> = { ...DEFAULT_THEME };\n wrapperStyles: Record<string, string> = {};\n\n options!: GridsterConfig;\n pages: Page[] = [];\n activePageId: string = '';\n activePage?: Page;\n\n // ── Dialog state ──\n dialogOpen = false;\n dialogType: WidgetType = 'LINE';\n dialogTitle = '';\n dialogCategories = '';\n dialogSeries: { name: string; dataRaw: string }[] = [{ name: 'Series 1', dataRaw: '' }];\n dialogSlices: { label: string; value: number | null }[] = [\n { label: 'Slice A', value: null },\n { label: 'Slice B', value: null },\n { label: 'Slice C', value: null },\n ];\n\n readonly widgetTypes: { value: WidgetType; label: string; icon: string }[] = [\n { value: 'LINE', label: 'Line', icon: 'la-chart-area' },\n { value: 'BAR', label: 'Bar', icon: 'la-chart-bar' },\n { value: 'DONUT',label: 'Donut', icon: 'la-chart-pie' },\n ];\n\n private subs = new Subscription();\n\n constructor(private 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 this.options = {\n gridType: 'fit',\n displayGrid: 'none',\n pushItems: true,\n draggable: { enabled: true },\n resizable: { enabled: true },\n minCols: 12, maxCols: 12,\n minRows: 12, maxRows: 50,\n margin: 20, outerMargin: true,\n itemChangeCallback: (item: any) => {\n this.stateService.updateWidgetPosition(\n this.activePageId, item.id, item.x, item.y, item.cols, item.rows\n );\n }\n };\n\n this.subs.add(this.stateService.pages$.subscribe(pages => {\n this.pages = pages;\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 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.chartForeColor,\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\n // ── Page actions ──\n onSelectPage(id: string) { this.stateService.setActivePage(id); }\n\n onAddPage() {\n const name = prompt('Enter 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 // ── Dialog ──\n openDialog() {\n this.dialogType = 'LINE';\n this.dialogTitle = '';\n this.dialogCategories = '';\n this.dialogSeries = [{ name: 'Series 1', dataRaw: '' }];\n this.dialogSlices = [\n { label: 'Slice A', value: null },\n { label: 'Slice B', value: null },\n { label: 'Slice C', value: null },\n ];\n this.dialogOpen = true;\n }\n\n closeDialog() { this.dialogOpen = false; }\n\n addSeries() { this.dialogSeries.push({ name: `Series ${this.dialogSeries.length + 1}`, dataRaw: '' }); }\n removeSeries(i: number) { this.dialogSeries.splice(i, 1); }\n\n addSlice() { this.dialogSlices.push({ label: `Slice ${this.dialogSlices.length + 1}`, value: null }); }\n removeSlice(i: number) { this.dialogSlices.splice(i, 1); }\n\n confirmAddWidget() {\n const title = this.dialogTitle.trim();\n if (!title) return;\n\n let data: LineBarData | DonutData;\n\n if (this.dialogType === 'DONUT') {\n const validSlices = this.dialogSlices.filter(s => s.value !== null && s.label.trim());\n data = {\n series: validSlices.length\n ? validSlices.map(s => Number(s.value))\n : [30, 20, 50],\n labels: validSlices.length\n ? validSlices.map(s => s.label)\n : ['A', 'B', 'C'],\n } as DonutData;\n } else {\n const parseNums = (raw: string) =>\n raw.split(',').map(v => parseFloat(v.trim())).filter(n => !isNaN(n));\n\n data = {\n series: this.dialogSeries.map(s => ({\n name: s.name || 'Series',\n data: s.dataRaw.trim()\n ? parseNums(s.dataRaw)\n : Array.from({ length: 8 }, () => Math.floor(Math.random() * 100)),\n })),\n categories: this.dialogCategories.trim()\n ? this.dialogCategories.split(',').map(c => c.trim())\n : undefined,\n } as LineBarData;\n }\n\n this.stateService.addWidgetWithData(this.dialogType, title, data);\n this.closeDialog();\n }\n\n // ── Edit dialog state ──\n editDialogOpen = false;\n editingWidget?: Widget;\n editWidgetType: WidgetType = 'LINE';\n editTitle = '';\n editCardColor = '';\n editColors: string[] = [];\n editSeries: { name: string; dataRaw: string }[] = [];\n editCategories = '';\n editSlices: { label: string; value: number | null }[] = [];\n\n private readonly DEFAULT_COLORS = ['#0a84ff', '#30d158', '#ff9f0a', '#bf5af2', '#ff453a'];\n\n openEditDialog(widget: Widget) {\n this.editingWidget = widget;\n this.editWidgetType = widget.type;\n this.editTitle = widget.title;\n this.editCardColor = widget.cardColor ?? this.resolvedTheme.widgetCardColor;\n this.editColors = widget.colors?.length\n ? [...widget.colors]\n : [...this.resolvedTheme.chartColors];\n\n if (widget.type === 'DONUT') {\n const d = widget.data as any;\n this.editSlices = (d.series as number[]).map((v: number, i: number) => ({\n label: d.labels?.[i] ?? `Slice ${i + 1}`,\n value: v,\n }));\n this.editColors = this.editColors.slice(0, this.editSlices.length);\n while (this.editColors.length < this.editSlices.length) {\n this.editColors.push(this.DEFAULT_COLORS[this.editColors.length % this.DEFAULT_COLORS.length]);\n }\n } else {\n const d = widget.data as any;\n this.editSeries = (d.series as any[]).map((s: any) => ({ name: s.name, dataRaw: s.data.join(',') }));\n this.editCategories = d.categories?.join(',') ?? '';\n this.editColors = this.editColors.slice(0, this.editSeries.length);\n while (this.editColors.length < this.editSeries.length) {\n this.editColors.push(this.DEFAULT_COLORS[this.editColors.length % this.DEFAULT_COLORS.length]);\n }\n }\n\n this.editDialogOpen = true;\n }\n\n closeEditDialog() { this.editDialogOpen = false; this.editingWidget = undefined; }\n\n getEditSeriesLabel(i: number): string {\n if (this.editWidgetType === 'DONUT') return this.editSlices[i]?.label || `Slice ${i + 1}`;\n return this.editSeries[i]?.name || `Series ${i + 1}`;\n }\n\n addEditSeries() {\n this.editSeries.push({ name: `Series ${this.editSeries.length + 1}`, dataRaw: '' });\n this.editColors.push(this.DEFAULT_COLORS[this.editColors.length % this.DEFAULT_COLORS.length]);\n }\n removeEditSeries(i: number) { this.editSeries.splice(i, 1); this.editColors.splice(i, 1); }\n\n addEditSlice() {\n this.editSlices.push({ label: `Slice ${this.editSlices.length + 1}`, value: null });\n this.editColors.push(this.DEFAULT_COLORS[this.editColors.length % this.DEFAULT_COLORS.length]);\n }\n removeEditSlice(i: number) { this.editSlices.splice(i, 1); this.editColors.splice(i, 1); }\n\n confirmEditWidget() {\n if (!this.editingWidget) return;\n const parseNums = (raw: string) =>\n raw.split(',').map(v => parseFloat(v.trim())).filter(n => !isNaN(n));\n\n let data: LineBarData | DonutData;\n if (this.editWidgetType === 'DONUT') {\n data = {\n series: this.editSlices.map(s => Number(s.value) || 0),\n labels: this.editSlices.map(s => s.label),\n } as DonutData;\n } else {\n data = {\n series: this.editSeries.map(s => ({\n name: s.name || 'Series',\n data: s.dataRaw.trim() ? parseNums(s.dataRaw) : [],\n })),\n categories: this.editCategories.trim()\n ? this.editCategories.split(',').map(c => c.trim())\n : undefined,\n } as LineBarData;\n }\n\n this.stateService.updateWidgetMeta(this.editingWidget.id, {\n title: this.editTitle.trim() || this.editingWidget.title,\n colors: [...this.editColors],\n cardColor: this.editCardColor,\n data,\n });\n this.closeEditDialog();\n }\n\n // ── Widget actions ──\n onAddWidget(type: WidgetType) { this.stateService.addWidget(type); }\n\n updateWidgetData(widgetId: string, data: LineBarData | DonutData) {\n this.stateService.updateWidgetData(widgetId, data);\n }\n\n removeWidgetHandler = (id: string) => { this.stateService.removeWidget(id); };\n\n serializeLayout(): string { return this.stateService.serializeLayout(); }\n}\n","import { NgModule, NO_ERRORS_SCHEMA } from '@angular/core';\nimport { BrowserModule } from '@angular/platform-browser';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { GridsterModule } from 'angular-gridster2';\nimport { NgApexchartsModule } from 'ng-apexcharts';\n\nimport { DashboardComponent } from './dashboard.component';\nimport { WidgetRendererComponent } from './widget-renderer.component';\nimport { DashboardStateService } from './dashboard-state.service';\n\n@NgModule({\n declarations: [\n DashboardComponent,\n WidgetRendererComponent\n ],\n imports: [\n CommonModule,\n FormsModule,\n GridsterModule,\n NgApexchartsModule\n ],\n providers: [DashboardStateService],\n exports: [\n DashboardComponent,\n WidgetRendererComponent\n ],\n schemas: [NO_ERRORS_SCHEMA]\n})\nexport class DashboardModule { }\n\n/**\n * Root module for local demo / testing purposes.\n * In the final NPM package, users would only import the `DashboardModule`.\n */\n@NgModule({\n imports: [\n BrowserModule,\n DashboardModule\n ],\n bootstrap: [DashboardComponent]\n})\nexport class AppModule { }\n","/*\n * Public API Surface of the dashboard library\n */\n\nexport * from './app/dashboard.component';\nexport * from './app/widget-renderer.component';\nexport * from './app/app.module'; // This is the DashboardModule\nexport * from './app/models';\nexport * from './app/dashboard-state.service';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.DashboardStateService","i3","i5.WidgetRendererComponent"],"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-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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"}