bways-report 0.1.3 → 0.1.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.
Files changed (36) hide show
  1. package/esm2022/lib/core/models/report-grid.model.mjs +1 -1
  2. package/esm2022/lib/features/designer/components/component-palette/component-palette.component.mjs +24 -3
  3. package/esm2022/lib/features/designer/components/design-canvas/design-canvas.component.mjs +20 -13
  4. package/esm2022/lib/features/designer/components/property-editor/property-editor-datasource.component.mjs +64 -5
  5. package/esm2022/lib/features/designer/components/property-editor/property-editor-grid.component.mjs +161 -3
  6. package/esm2022/lib/features/designer/components/property-editor/property-editor.component.mjs +91 -11
  7. package/esm2022/lib/features/designer/components/toolbar/designer-toolbar.component.mjs +88 -25
  8. package/esm2022/lib/features/designer/designer.component.mjs +194 -65
  9. package/esm2022/lib/features/designer/services/designer-state.service.mjs +9 -2
  10. package/esm2022/lib/features/routing/components/routed-report-runtime.component.mjs +2 -2
  11. package/esm2022/lib/features/runtime/dynamic-renderer.component.mjs +11 -3
  12. package/esm2022/lib/features/runtime/report-execution.service.mjs +1 -9
  13. package/esm2022/lib/features/runtime/report-grid-bridge.component.mjs +214 -19
  14. package/esm2022/lib/features/runtime/report-runtime.component.mjs +11 -3
  15. package/esm2022/lib/features/runtime/rpt-report.component.mjs +11 -3
  16. package/esm2022/lib/primitives/components/checkbox/rpt-checkbox.component.mjs +3 -3
  17. package/esm2022/lib/primitives/components/date/rpt-date.component.mjs +3 -3
  18. package/esm2022/lib/primitives/components/date-range/rpt-date-range.component.mjs +3 -3
  19. package/esm2022/lib/primitives/components/dropdown/rpt-dropdown.component.mjs +4 -4
  20. package/esm2022/lib/primitives/components/icon/rpt-icon.component.mjs +23 -1
  21. package/esm2022/lib/primitives/components/input/rpt-input.component.mjs +3 -3
  22. package/esm2022/lib/primitives/components/kpi-card/rpt-kpi-card.component.mjs +3 -3
  23. package/esm2022/lib/primitives/components/number/rpt-number.component.mjs +3 -3
  24. package/fesm2022/bways-report.mjs +920 -162
  25. package/fesm2022/bways-report.mjs.map +1 -1
  26. package/lib/core/models/report-grid.model.d.ts +23 -1
  27. package/lib/features/designer/components/component-palette/component-palette.component.d.ts +2 -1
  28. package/lib/features/designer/components/property-editor/property-editor-datasource.component.d.ts +9 -0
  29. package/lib/features/designer/components/property-editor/property-editor.component.d.ts +4 -1
  30. package/lib/features/designer/components/toolbar/designer-toolbar.component.d.ts +5 -1
  31. package/lib/features/designer/designer.component.d.ts +6 -0
  32. package/lib/features/runtime/dynamic-renderer.component.d.ts +4 -1
  33. package/lib/features/runtime/report-grid-bridge.component.d.ts +46 -4
  34. package/lib/features/runtime/report-runtime.component.d.ts +4 -1
  35. package/lib/features/runtime/rpt-report.component.d.ts +4 -1
  36. package/package.json +1 -1
@@ -2301,7 +2301,7 @@ class RptInputComponent {
2301
2301
  <span class="rpt-error-text">{{ errorMessage() }}</span>
2302
2302
  }
2303
2303
  </div>
2304
- `, isInline: true, styles: [":host{display:block;width:100%;height:100%;box-sizing:border-box;font-family:var(--rpt-font-family, inherit)}.rpt-field-group{display:flex;flex-direction:column;height:100%;gap:4px;box-sizing:border-box}.rpt-label{font-size:var(--rpt-font-size-sm, .75rem);font-weight:500;color:var(--rpt-color-text, #0f172a);flex-shrink:0}.rpt-required-marker{color:var(--rpt-color-danger, #ef4444);margin-left:2px}.rpt-input-wrapper{position:relative;width:100%;flex:1;min-height:0;display:flex}.rpt-input{width:100%;height:100%;min-height:38px;box-sizing:border-box;padding:6px 12px;font-size:var(--rpt-font-size-base, .875rem);color:var(--rpt-color-text, #0f172a);background-color:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);transition:border-color var(--rpt-transition-speed, .15s) ease,box-shadow var(--rpt-transition-speed, .15s) ease;outline:none}.rpt-input:hover:not(:disabled){border-color:var(--rpt-color-border-hover, #94a3b8)}.rpt-input:focus{border-color:var(--rpt-color-border-focus, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.rpt-input:disabled{background-color:var(--rpt-color-surface, #f8fafc);color:var(--rpt-color-text-muted, #64748b);cursor:not-allowed}.rpt-input.rpt-invalid{border-color:var(--rpt-color-danger, #ef4444)}.rpt-input.rpt-invalid:focus{box-shadow:0 0 0 3px #ef444440}.rpt-error-text{font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-danger, #ef4444);margin-top:2px}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2304
+ `, isInline: true, styles: [":host{display:block;width:100%;height:100%;box-sizing:border-box;font-family:var(--rpt-font-family, inherit)}.rpt-field-group{display:flex;flex-direction:column;height:100%;gap:4px;box-sizing:border-box}.rpt-label{font-size:var(--rpt-font-size-sm, .75rem);font-weight:500;color:var(--rpt-color-text, #0f172a);flex-shrink:0}.rpt-required-marker{color:var(--rpt-color-danger, #ef4444);margin-left:2px}.rpt-input-wrapper{position:relative;width:100%;flex:1;min-height:0;display:flex}.rpt-input{width:100%;height:100%;min-height:38px;box-sizing:border-box;padding:6px 12px;font-size:var(--rpt-font-size-base, .875rem);color:var(--rpt-color-text, #0f172a);background-color:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);transition:border-color var(--rpt-transition-speed, .15s) ease,box-shadow var(--rpt-transition-speed, .15s) ease;outline:none}.rpt-input:hover:not(:disabled){border-color:var(--rpt-color-border-hover, #94a3b8)}.rpt-input:focus{border-color:var(--rpt-color-border-focus, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.rpt-input:disabled{background-color:var(--rpt-color-surface, #f8fafc);color:var(--rpt-color-text-muted, #64748b);cursor:not-allowed}.rpt-input.rpt-invalid{border-color:var(--rpt-color-danger, #ef4444)}.rpt-input.rpt-invalid:focus{box-shadow:0 0 0 3px #ef444440}.rpt-error-text{font-size:.7rem;color:var(--rpt-color-danger, #ef4444);margin-top:3px;line-height:1.25;max-width:100%;overflow-wrap:anywhere;word-break:break-word;display:block}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2305
2305
  }
2306
2306
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RptInputComponent, decorators: [{
2307
2307
  type: Component,
@@ -2331,7 +2331,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
2331
2331
  <span class="rpt-error-text">{{ errorMessage() }}</span>
2332
2332
  }
2333
2333
  </div>
2334
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;width:100%;height:100%;box-sizing:border-box;font-family:var(--rpt-font-family, inherit)}.rpt-field-group{display:flex;flex-direction:column;height:100%;gap:4px;box-sizing:border-box}.rpt-label{font-size:var(--rpt-font-size-sm, .75rem);font-weight:500;color:var(--rpt-color-text, #0f172a);flex-shrink:0}.rpt-required-marker{color:var(--rpt-color-danger, #ef4444);margin-left:2px}.rpt-input-wrapper{position:relative;width:100%;flex:1;min-height:0;display:flex}.rpt-input{width:100%;height:100%;min-height:38px;box-sizing:border-box;padding:6px 12px;font-size:var(--rpt-font-size-base, .875rem);color:var(--rpt-color-text, #0f172a);background-color:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);transition:border-color var(--rpt-transition-speed, .15s) ease,box-shadow var(--rpt-transition-speed, .15s) ease;outline:none}.rpt-input:hover:not(:disabled){border-color:var(--rpt-color-border-hover, #94a3b8)}.rpt-input:focus{border-color:var(--rpt-color-border-focus, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.rpt-input:disabled{background-color:var(--rpt-color-surface, #f8fafc);color:var(--rpt-color-text-muted, #64748b);cursor:not-allowed}.rpt-input.rpt-invalid{border-color:var(--rpt-color-danger, #ef4444)}.rpt-input.rpt-invalid:focus{box-shadow:0 0 0 3px #ef444440}.rpt-error-text{font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-danger, #ef4444);margin-top:2px}\n"] }]
2334
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;width:100%;height:100%;box-sizing:border-box;font-family:var(--rpt-font-family, inherit)}.rpt-field-group{display:flex;flex-direction:column;height:100%;gap:4px;box-sizing:border-box}.rpt-label{font-size:var(--rpt-font-size-sm, .75rem);font-weight:500;color:var(--rpt-color-text, #0f172a);flex-shrink:0}.rpt-required-marker{color:var(--rpt-color-danger, #ef4444);margin-left:2px}.rpt-input-wrapper{position:relative;width:100%;flex:1;min-height:0;display:flex}.rpt-input{width:100%;height:100%;min-height:38px;box-sizing:border-box;padding:6px 12px;font-size:var(--rpt-font-size-base, .875rem);color:var(--rpt-color-text, #0f172a);background-color:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);transition:border-color var(--rpt-transition-speed, .15s) ease,box-shadow var(--rpt-transition-speed, .15s) ease;outline:none}.rpt-input:hover:not(:disabled){border-color:var(--rpt-color-border-hover, #94a3b8)}.rpt-input:focus{border-color:var(--rpt-color-border-focus, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.rpt-input:disabled{background-color:var(--rpt-color-surface, #f8fafc);color:var(--rpt-color-text-muted, #64748b);cursor:not-allowed}.rpt-input.rpt-invalid{border-color:var(--rpt-color-danger, #ef4444)}.rpt-input.rpt-invalid:focus{box-shadow:0 0 0 3px #ef444440}.rpt-error-text{font-size:.7rem;color:var(--rpt-color-danger, #ef4444);margin-top:3px;line-height:1.25;max-width:100%;overflow-wrap:anywhere;word-break:break-word;display:block}\n"] }]
2335
2335
  }] });
2336
2336
 
2337
2337
  class RptDropdownComponent {
@@ -2665,7 +2665,7 @@ class RptDropdownComponent {
2665
2665
  if (!ds || !this.isDynamicSource())
2666
2666
  return;
2667
2667
  // 1. Database Table / Stored Procedure Lookup
2668
- if ((ds.sourceType === 'table' || ds.sourceType === 'procedure' || ds.entityName) && this.lookupAdapter) {
2668
+ if (ds.entityName && (ds.sourceType === 'table' || ds.sourceType === 'procedure') && this.lookupAdapter) {
2669
2669
  const formValues = this.parentForm()?.getRawValue() ?? {};
2670
2670
  // Do not call the database until every canvas field this lookup depends on is filled.
2671
2671
  const missing = findMissingCanvasFields(ds.parameterMappings, formValues);
@@ -2958,7 +2958,7 @@ class RptDropdownComponent {
2958
2958
  <span class="rpt-error-text">{{ errorMessage() }}</span>
2959
2959
  }
2960
2960
  </div>
2961
- `, isInline: true, styles: [":host{display:block;width:100%;height:100%;box-sizing:border-box;font-family:var(--rpt-font-family, inherit);position:relative}.rpt-status-badge{display:inline-flex;align-items:center;gap:5px;font-size:.7rem;padding:2px 6px;border-radius:4px;margin-top:2px;font-weight:500;line-height:1.2}.rpt-status-badge[data-status=loading]{background:#eff6ff;color:#2563eb}.rpt-status-badge[data-status=ok]{background:#f0fdf4;color:#16a34a}.rpt-status-badge[data-status=waiting]{background:#fffbeb;color:#d97706}.rpt-status-badge[data-status=error]{background:#fef2f2;color:#dc2626}.rpt-status-badge[data-status=empty]{background:#f8fafc;color:#64748b}.waiting-tokens{display:inline-flex;align-items:center;gap:3px;margin-left:2px}.waiting-token{background:#b453091f;border:1px solid rgba(180,83,9,.3);padding:0 4px;border-radius:3px;font-weight:700;font-size:.625rem}.status-dot{width:6px;height:6px;border-radius:50%;background:currentColor}.dot-pulse{animation:rpt-pulse 1s infinite alternate}@keyframes rpt-pulse{0%{opacity:.3}to{opacity:1}}.rpt-field-group{display:flex;flex-direction:column;height:100%;gap:4px;box-sizing:border-box;position:relative}.rpt-label{font-size:var(--rpt-font-size-sm, .75rem);font-weight:500;color:var(--rpt-color-text, #0f172a);flex-shrink:0}.rpt-required-marker{color:var(--rpt-color-danger, #ef4444);margin-left:2px}.rpt-select-wrapper{position:relative;width:100%;flex:1;min-height:0;display:flex;align-items:center}.rpt-select{width:100%;height:100%;min-height:38px;box-sizing:border-box;padding:6px 36px 6px 12px;font-size:var(--rpt-font-size-base, .875rem);color:var(--rpt-color-text, #0f172a);background-color:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);appearance:none;-webkit-appearance:none;outline:none;cursor:pointer;transition:border-color var(--rpt-transition-speed, .15s) ease,box-shadow var(--rpt-transition-speed, .15s) ease}.rpt-select:hover:not(:disabled){border-color:var(--rpt-color-border-hover, #94a3b8)}.rpt-select:focus{border-color:var(--rpt-color-border-focus, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.rpt-select:disabled{background-color:var(--rpt-color-surface, #f8fafc);color:var(--rpt-color-text-muted, #64748b);cursor:not-allowed}.rpt-select.rpt-invalid{border-color:var(--rpt-color-danger, #ef4444)}.rpt-select.rpt-invalid:focus{box-shadow:0 0 0 3px #ef444440}.rpt-select-arrow{position:absolute;right:12px;top:50%;transform:translateY(-50%);pointer-events:none;color:var(--rpt-color-text-muted, #64748b);display:flex;align-items:center}.rpt-combobox-wrapper{position:relative;width:100%;flex:1;min-height:0}.rpt-combobox-trigger{width:100%;height:100%;min-height:38px;box-sizing:border-box;padding:6px 10px 6px 12px;display:flex;align-items:center;justify-content:space-between;gap:8px;font-size:var(--rpt-font-size-base, .875rem);font-family:inherit;color:var(--rpt-color-text, #0f172a);background-color:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);outline:none;cursor:pointer;text-align:left;transition:border-color var(--rpt-transition-speed, .15s) ease,box-shadow var(--rpt-transition-speed, .15s) ease}.rpt-combobox-trigger:hover:not(:disabled){border-color:var(--rpt-color-border-hover, #94a3b8)}.rpt-combobox-trigger:focus-visible,.rpt-combobox-trigger.is-open{border-color:var(--rpt-color-border-focus, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.rpt-combobox-trigger:disabled{background-color:var(--rpt-color-surface, #f8fafc);color:var(--rpt-color-text-muted, #64748b);cursor:not-allowed}.rpt-combobox-trigger.rpt-invalid{border-color:var(--rpt-color-danger, #ef4444)}.rpt-combobox-trigger.rpt-invalid:focus-visible{box-shadow:0 0 0 3px #ef444440}.trigger-label{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:1.3}.trigger-label.is-placeholder{color:var(--rpt-color-text-muted, #94a3b8)}.trigger-actions{display:flex;align-items:center;gap:6px;flex-shrink:0}.trigger-clear-btn{display:flex;align-items:center;justify-content:center;width:18px;height:18px;border-radius:50%;font-size:.6875rem;color:var(--rpt-color-text-muted, #64748b);background-color:#f1f5f9;cursor:pointer;-webkit-user-select:none;user-select:none;transition:background-color .15s ease,color .15s ease}.trigger-clear-btn:hover{background-color:#e2e8f0;color:var(--rpt-color-text, #0f172a)}.trigger-arrow{display:flex;align-items:center;color:var(--rpt-color-text-muted, #64748b);transition:transform .18s ease}.trigger-arrow.rotated{transform:rotate(180deg)}.rpt-combobox-menu{position:absolute;top:calc(100% + 4px);left:0;right:0;z-index:1050;background-color:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);box-shadow:0 10px 25px -5px #0000001f,0 8px 10px -6px #00000014;overflow:hidden;display:flex;flex-direction:column;animation:rpt-dropdown-pop .12s cubic-bezier(0,0,.2,1)}.rpt-combobox-menu.opens-above{top:auto;bottom:calc(100% + 4px);box-shadow:0 -10px 25px -5px #0000001f,0 -8px 10px -6px #00000014;animation:rpt-dropdown-pop-above .12s cubic-bezier(0,0,.2,1)}@keyframes rpt-dropdown-pop{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}@keyframes rpt-dropdown-pop-above{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.combobox-search-box{display:flex;align-items:center;gap:8px;padding:8px 10px;border-bottom:1px solid var(--rpt-color-border, #e2e8f0);background-color:#f8fafc}.combobox-search-icon{color:var(--rpt-color-text-muted, #94a3b8);display:flex;align-items:center;flex-shrink:0}.combobox-search-input{flex:1;border:none;outline:none;background:transparent;font-size:var(--rpt-font-size-sm, .8125rem);font-family:inherit;color:var(--rpt-color-text, #0f172a);min-width:0}.combobox-search-input::placeholder{color:#94a3b8}.combobox-search-clear{border:none;background:#e2e8f0;color:#64748b;width:16px;height:16px;border-radius:50%;font-size:.625rem;cursor:pointer;display:flex;align-items:center;justify-content:center;padding:0}.combobox-search-clear:hover{background:#cbd5e1;color:#0f172a}.combobox-options-list{max-height:220px;overflow-y:auto;overscroll-behavior:contain;padding:4px}.combobox-option-item{display:flex;align-items:center;justify-content:space-between;padding:7px 10px;border-radius:4px;font-size:var(--rpt-font-size-base, .84rem);color:var(--rpt-color-text, #0f172a);cursor:pointer;-webkit-user-select:none;user-select:none;transition:background-color .1s ease}.combobox-option-item.is-focused{background-color:var(--rpt-color-surface-hover, #f1f5f9)}.combobox-option-item.is-selected{background-color:#eff6ff;color:var(--rpt-color-primary, #2563eb);font-weight:600}.opt-label{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.opt-check{font-size:.875rem;font-weight:700;color:var(--rpt-color-primary, #2563eb);margin-left:8px}.combobox-status-row{padding:10px 12px;font-size:.78rem;text-align:center;color:var(--rpt-color-text-muted, #64748b)}.combobox-status-row.loading{display:flex;align-items:center;justify-content:center;gap:6px;color:#2563eb}.combobox-status-row.error{color:var(--rpt-color-danger, #dc2626)}.combobox-status-row.hint{font-size:.72rem;color:#94a3b8;border-top:1px dashed #e2e8f0;margin-top:4px;padding:6px}.rpt-error-text{font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-danger, #ef4444);margin-top:2px}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2961
+ `, isInline: true, styles: [":host{display:block;width:100%;max-width:100%;min-width:0;box-sizing:border-box;font-family:var(--rpt-font-family, inherit);position:relative}.rpt-status-badge{display:flex;flex-wrap:wrap;align-items:center;gap:4px;font-size:.6875rem;padding:3px 6px;border-radius:4px;margin-top:4px;font-weight:500;line-height:1.3;max-width:100%;box-sizing:border-box;overflow:hidden;word-break:break-word}.rpt-status-badge>span{overflow-wrap:anywhere;word-break:break-word}.rpt-status-badge[data-status=loading]{background:#eff6ff;color:#2563eb;border:1px solid #dbeafe}.rpt-status-badge[data-status=ok]{background:#f0fdf4;color:#16a34a;border:1px solid #dcfce7}.rpt-status-badge[data-status=waiting]{background:#fffbeb;color:#d97706;border:1px solid #fef3c7}.rpt-status-badge[data-status=error]{background:#fef2f2;color:#dc2626;border:1px solid #fee2e2}.rpt-status-badge[data-status=empty]{background:#f8fafc;color:#64748b;border:1px solid #e2e8f0}.waiting-tokens{display:inline-flex;flex-wrap:wrap;align-items:center;gap:3px;margin-left:2px;max-width:100%}.waiting-token{background:#b453091f;border:1px solid rgba(180,83,9,.3);padding:1px 5px;border-radius:3px;font-weight:700;font-size:.625rem;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:inline-block;box-sizing:border-box}.status-dot{width:6px;height:6px;border-radius:50%;background:currentColor}.dot-pulse{animation:rpt-pulse 1s infinite alternate}@keyframes rpt-pulse{0%{opacity:.3}to{opacity:1}}.rpt-field-group{display:flex;flex-direction:column;max-width:100%;min-width:0;gap:4px;box-sizing:border-box;position:relative}.rpt-label{font-size:var(--rpt-font-size-sm, .75rem);font-weight:500;color:var(--rpt-color-text, #0f172a);flex-shrink:0}.rpt-required-marker{color:var(--rpt-color-danger, #ef4444);margin-left:2px}.rpt-select-wrapper{position:relative;width:100%;flex:1;min-height:0;display:flex;align-items:center}.rpt-select{width:100%;height:100%;min-height:38px;box-sizing:border-box;padding:6px 36px 6px 12px;font-size:var(--rpt-font-size-base, .875rem);color:var(--rpt-color-text, #0f172a);background-color:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);appearance:none;-webkit-appearance:none;outline:none;cursor:pointer;transition:border-color var(--rpt-transition-speed, .15s) ease,box-shadow var(--rpt-transition-speed, .15s) ease}.rpt-select:hover:not(:disabled){border-color:var(--rpt-color-border-hover, #94a3b8)}.rpt-select:focus{border-color:var(--rpt-color-border-focus, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.rpt-select:disabled{background-color:var(--rpt-color-surface, #f8fafc);color:var(--rpt-color-text-muted, #64748b);cursor:not-allowed}.rpt-select.rpt-invalid{border-color:var(--rpt-color-danger, #ef4444)}.rpt-select.rpt-invalid:focus{box-shadow:0 0 0 3px #ef444440}.rpt-select-arrow{position:absolute;right:12px;top:50%;transform:translateY(-50%);pointer-events:none;color:var(--rpt-color-text-muted, #64748b);display:flex;align-items:center}.rpt-combobox-wrapper{position:relative;width:100%;flex:1;min-height:0}.rpt-combobox-trigger{width:100%;height:100%;min-height:38px;box-sizing:border-box;padding:6px 10px 6px 12px;display:flex;align-items:center;justify-content:space-between;gap:8px;font-size:var(--rpt-font-size-base, .875rem);font-family:inherit;color:var(--rpt-color-text, #0f172a);background-color:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);outline:none;cursor:pointer;text-align:left;transition:border-color var(--rpt-transition-speed, .15s) ease,box-shadow var(--rpt-transition-speed, .15s) ease}.rpt-combobox-trigger:hover:not(:disabled){border-color:var(--rpt-color-border-hover, #94a3b8)}.rpt-combobox-trigger:focus-visible,.rpt-combobox-trigger.is-open{border-color:var(--rpt-color-border-focus, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.rpt-combobox-trigger:disabled{background-color:var(--rpt-color-surface, #f8fafc);color:var(--rpt-color-text-muted, #64748b);cursor:not-allowed}.rpt-combobox-trigger.rpt-invalid{border-color:var(--rpt-color-danger, #ef4444)}.rpt-combobox-trigger.rpt-invalid:focus-visible{box-shadow:0 0 0 3px #ef444440}.trigger-label{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:1.3}.trigger-label.is-placeholder{color:var(--rpt-color-text-muted, #94a3b8)}.trigger-actions{display:flex;align-items:center;gap:6px;flex-shrink:0}.trigger-clear-btn{display:flex;align-items:center;justify-content:center;width:18px;height:18px;border-radius:50%;font-size:.6875rem;color:var(--rpt-color-text-muted, #64748b);background-color:#f1f5f9;cursor:pointer;-webkit-user-select:none;user-select:none;transition:background-color .15s ease,color .15s ease}.trigger-clear-btn:hover{background-color:#e2e8f0;color:var(--rpt-color-text, #0f172a)}.trigger-arrow{display:flex;align-items:center;color:var(--rpt-color-text-muted, #64748b);transition:transform .18s ease}.trigger-arrow.rotated{transform:rotate(180deg)}.rpt-combobox-menu{position:absolute;top:calc(100% + 4px);left:0;right:0;z-index:1050;background-color:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);box-shadow:0 10px 25px -5px #0000001f,0 8px 10px -6px #00000014;overflow:hidden;display:flex;flex-direction:column;animation:rpt-dropdown-pop .12s cubic-bezier(0,0,.2,1)}.rpt-combobox-menu.opens-above{top:auto;bottom:calc(100% + 4px);box-shadow:0 -10px 25px -5px #0000001f,0 -8px 10px -6px #00000014;animation:rpt-dropdown-pop-above .12s cubic-bezier(0,0,.2,1)}@keyframes rpt-dropdown-pop{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}@keyframes rpt-dropdown-pop-above{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.combobox-search-box{display:flex;align-items:center;gap:8px;padding:8px 10px;border-bottom:1px solid var(--rpt-color-border, #e2e8f0);background-color:#f8fafc}.combobox-search-icon{color:var(--rpt-color-text-muted, #94a3b8);display:flex;align-items:center;flex-shrink:0}.combobox-search-input{flex:1;border:none;outline:none;background:transparent;font-size:var(--rpt-font-size-sm, .8125rem);font-family:inherit;color:var(--rpt-color-text, #0f172a);min-width:0}.combobox-search-input::placeholder{color:#94a3b8}.combobox-search-clear{border:none;background:#e2e8f0;color:#64748b;width:16px;height:16px;border-radius:50%;font-size:.625rem;cursor:pointer;display:flex;align-items:center;justify-content:center;padding:0}.combobox-search-clear:hover{background:#cbd5e1;color:#0f172a}.combobox-options-list{max-height:220px;overflow-y:auto;overscroll-behavior:contain;padding:4px}.combobox-option-item{display:flex;align-items:center;justify-content:space-between;padding:7px 10px;border-radius:4px;font-size:var(--rpt-font-size-base, .84rem);color:var(--rpt-color-text, #0f172a);cursor:pointer;-webkit-user-select:none;user-select:none;transition:background-color .1s ease}.combobox-option-item.is-focused{background-color:var(--rpt-color-surface-hover, #f1f5f9)}.combobox-option-item.is-selected{background-color:#eff6ff;color:var(--rpt-color-primary, #2563eb);font-weight:600}.opt-label{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.opt-check{font-size:.875rem;font-weight:700;color:var(--rpt-color-primary, #2563eb);margin-left:8px}.combobox-status-row{padding:10px 12px;font-size:.78rem;text-align:center;color:var(--rpt-color-text-muted, #64748b)}.combobox-status-row.loading{display:flex;align-items:center;justify-content:center;gap:6px;color:#2563eb}.combobox-status-row.error{color:var(--rpt-color-danger, #dc2626)}.combobox-status-row.hint{font-size:.72rem;color:#94a3b8;border-top:1px dashed #e2e8f0;margin-top:4px;padding:6px}.rpt-error-text{font-size:.7rem;color:var(--rpt-color-danger, #ef4444);margin-top:3px;line-height:1.25;max-width:100%;overflow-wrap:anywhere;word-break:break-word;display:block}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2962
2962
  }
2963
2963
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RptDropdownComponent, decorators: [{
2964
2964
  type: Component,
@@ -3174,7 +3174,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
3174
3174
  <span class="rpt-error-text">{{ errorMessage() }}</span>
3175
3175
  }
3176
3176
  </div>
3177
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;width:100%;height:100%;box-sizing:border-box;font-family:var(--rpt-font-family, inherit);position:relative}.rpt-status-badge{display:inline-flex;align-items:center;gap:5px;font-size:.7rem;padding:2px 6px;border-radius:4px;margin-top:2px;font-weight:500;line-height:1.2}.rpt-status-badge[data-status=loading]{background:#eff6ff;color:#2563eb}.rpt-status-badge[data-status=ok]{background:#f0fdf4;color:#16a34a}.rpt-status-badge[data-status=waiting]{background:#fffbeb;color:#d97706}.rpt-status-badge[data-status=error]{background:#fef2f2;color:#dc2626}.rpt-status-badge[data-status=empty]{background:#f8fafc;color:#64748b}.waiting-tokens{display:inline-flex;align-items:center;gap:3px;margin-left:2px}.waiting-token{background:#b453091f;border:1px solid rgba(180,83,9,.3);padding:0 4px;border-radius:3px;font-weight:700;font-size:.625rem}.status-dot{width:6px;height:6px;border-radius:50%;background:currentColor}.dot-pulse{animation:rpt-pulse 1s infinite alternate}@keyframes rpt-pulse{0%{opacity:.3}to{opacity:1}}.rpt-field-group{display:flex;flex-direction:column;height:100%;gap:4px;box-sizing:border-box;position:relative}.rpt-label{font-size:var(--rpt-font-size-sm, .75rem);font-weight:500;color:var(--rpt-color-text, #0f172a);flex-shrink:0}.rpt-required-marker{color:var(--rpt-color-danger, #ef4444);margin-left:2px}.rpt-select-wrapper{position:relative;width:100%;flex:1;min-height:0;display:flex;align-items:center}.rpt-select{width:100%;height:100%;min-height:38px;box-sizing:border-box;padding:6px 36px 6px 12px;font-size:var(--rpt-font-size-base, .875rem);color:var(--rpt-color-text, #0f172a);background-color:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);appearance:none;-webkit-appearance:none;outline:none;cursor:pointer;transition:border-color var(--rpt-transition-speed, .15s) ease,box-shadow var(--rpt-transition-speed, .15s) ease}.rpt-select:hover:not(:disabled){border-color:var(--rpt-color-border-hover, #94a3b8)}.rpt-select:focus{border-color:var(--rpt-color-border-focus, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.rpt-select:disabled{background-color:var(--rpt-color-surface, #f8fafc);color:var(--rpt-color-text-muted, #64748b);cursor:not-allowed}.rpt-select.rpt-invalid{border-color:var(--rpt-color-danger, #ef4444)}.rpt-select.rpt-invalid:focus{box-shadow:0 0 0 3px #ef444440}.rpt-select-arrow{position:absolute;right:12px;top:50%;transform:translateY(-50%);pointer-events:none;color:var(--rpt-color-text-muted, #64748b);display:flex;align-items:center}.rpt-combobox-wrapper{position:relative;width:100%;flex:1;min-height:0}.rpt-combobox-trigger{width:100%;height:100%;min-height:38px;box-sizing:border-box;padding:6px 10px 6px 12px;display:flex;align-items:center;justify-content:space-between;gap:8px;font-size:var(--rpt-font-size-base, .875rem);font-family:inherit;color:var(--rpt-color-text, #0f172a);background-color:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);outline:none;cursor:pointer;text-align:left;transition:border-color var(--rpt-transition-speed, .15s) ease,box-shadow var(--rpt-transition-speed, .15s) ease}.rpt-combobox-trigger:hover:not(:disabled){border-color:var(--rpt-color-border-hover, #94a3b8)}.rpt-combobox-trigger:focus-visible,.rpt-combobox-trigger.is-open{border-color:var(--rpt-color-border-focus, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.rpt-combobox-trigger:disabled{background-color:var(--rpt-color-surface, #f8fafc);color:var(--rpt-color-text-muted, #64748b);cursor:not-allowed}.rpt-combobox-trigger.rpt-invalid{border-color:var(--rpt-color-danger, #ef4444)}.rpt-combobox-trigger.rpt-invalid:focus-visible{box-shadow:0 0 0 3px #ef444440}.trigger-label{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:1.3}.trigger-label.is-placeholder{color:var(--rpt-color-text-muted, #94a3b8)}.trigger-actions{display:flex;align-items:center;gap:6px;flex-shrink:0}.trigger-clear-btn{display:flex;align-items:center;justify-content:center;width:18px;height:18px;border-radius:50%;font-size:.6875rem;color:var(--rpt-color-text-muted, #64748b);background-color:#f1f5f9;cursor:pointer;-webkit-user-select:none;user-select:none;transition:background-color .15s ease,color .15s ease}.trigger-clear-btn:hover{background-color:#e2e8f0;color:var(--rpt-color-text, #0f172a)}.trigger-arrow{display:flex;align-items:center;color:var(--rpt-color-text-muted, #64748b);transition:transform .18s ease}.trigger-arrow.rotated{transform:rotate(180deg)}.rpt-combobox-menu{position:absolute;top:calc(100% + 4px);left:0;right:0;z-index:1050;background-color:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);box-shadow:0 10px 25px -5px #0000001f,0 8px 10px -6px #00000014;overflow:hidden;display:flex;flex-direction:column;animation:rpt-dropdown-pop .12s cubic-bezier(0,0,.2,1)}.rpt-combobox-menu.opens-above{top:auto;bottom:calc(100% + 4px);box-shadow:0 -10px 25px -5px #0000001f,0 -8px 10px -6px #00000014;animation:rpt-dropdown-pop-above .12s cubic-bezier(0,0,.2,1)}@keyframes rpt-dropdown-pop{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}@keyframes rpt-dropdown-pop-above{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.combobox-search-box{display:flex;align-items:center;gap:8px;padding:8px 10px;border-bottom:1px solid var(--rpt-color-border, #e2e8f0);background-color:#f8fafc}.combobox-search-icon{color:var(--rpt-color-text-muted, #94a3b8);display:flex;align-items:center;flex-shrink:0}.combobox-search-input{flex:1;border:none;outline:none;background:transparent;font-size:var(--rpt-font-size-sm, .8125rem);font-family:inherit;color:var(--rpt-color-text, #0f172a);min-width:0}.combobox-search-input::placeholder{color:#94a3b8}.combobox-search-clear{border:none;background:#e2e8f0;color:#64748b;width:16px;height:16px;border-radius:50%;font-size:.625rem;cursor:pointer;display:flex;align-items:center;justify-content:center;padding:0}.combobox-search-clear:hover{background:#cbd5e1;color:#0f172a}.combobox-options-list{max-height:220px;overflow-y:auto;overscroll-behavior:contain;padding:4px}.combobox-option-item{display:flex;align-items:center;justify-content:space-between;padding:7px 10px;border-radius:4px;font-size:var(--rpt-font-size-base, .84rem);color:var(--rpt-color-text, #0f172a);cursor:pointer;-webkit-user-select:none;user-select:none;transition:background-color .1s ease}.combobox-option-item.is-focused{background-color:var(--rpt-color-surface-hover, #f1f5f9)}.combobox-option-item.is-selected{background-color:#eff6ff;color:var(--rpt-color-primary, #2563eb);font-weight:600}.opt-label{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.opt-check{font-size:.875rem;font-weight:700;color:var(--rpt-color-primary, #2563eb);margin-left:8px}.combobox-status-row{padding:10px 12px;font-size:.78rem;text-align:center;color:var(--rpt-color-text-muted, #64748b)}.combobox-status-row.loading{display:flex;align-items:center;justify-content:center;gap:6px;color:#2563eb}.combobox-status-row.error{color:var(--rpt-color-danger, #dc2626)}.combobox-status-row.hint{font-size:.72rem;color:#94a3b8;border-top:1px dashed #e2e8f0;margin-top:4px;padding:6px}.rpt-error-text{font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-danger, #ef4444);margin-top:2px}\n"] }]
3177
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;width:100%;max-width:100%;min-width:0;box-sizing:border-box;font-family:var(--rpt-font-family, inherit);position:relative}.rpt-status-badge{display:flex;flex-wrap:wrap;align-items:center;gap:4px;font-size:.6875rem;padding:3px 6px;border-radius:4px;margin-top:4px;font-weight:500;line-height:1.3;max-width:100%;box-sizing:border-box;overflow:hidden;word-break:break-word}.rpt-status-badge>span{overflow-wrap:anywhere;word-break:break-word}.rpt-status-badge[data-status=loading]{background:#eff6ff;color:#2563eb;border:1px solid #dbeafe}.rpt-status-badge[data-status=ok]{background:#f0fdf4;color:#16a34a;border:1px solid #dcfce7}.rpt-status-badge[data-status=waiting]{background:#fffbeb;color:#d97706;border:1px solid #fef3c7}.rpt-status-badge[data-status=error]{background:#fef2f2;color:#dc2626;border:1px solid #fee2e2}.rpt-status-badge[data-status=empty]{background:#f8fafc;color:#64748b;border:1px solid #e2e8f0}.waiting-tokens{display:inline-flex;flex-wrap:wrap;align-items:center;gap:3px;margin-left:2px;max-width:100%}.waiting-token{background:#b453091f;border:1px solid rgba(180,83,9,.3);padding:1px 5px;border-radius:3px;font-weight:700;font-size:.625rem;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:inline-block;box-sizing:border-box}.status-dot{width:6px;height:6px;border-radius:50%;background:currentColor}.dot-pulse{animation:rpt-pulse 1s infinite alternate}@keyframes rpt-pulse{0%{opacity:.3}to{opacity:1}}.rpt-field-group{display:flex;flex-direction:column;max-width:100%;min-width:0;gap:4px;box-sizing:border-box;position:relative}.rpt-label{font-size:var(--rpt-font-size-sm, .75rem);font-weight:500;color:var(--rpt-color-text, #0f172a);flex-shrink:0}.rpt-required-marker{color:var(--rpt-color-danger, #ef4444);margin-left:2px}.rpt-select-wrapper{position:relative;width:100%;flex:1;min-height:0;display:flex;align-items:center}.rpt-select{width:100%;height:100%;min-height:38px;box-sizing:border-box;padding:6px 36px 6px 12px;font-size:var(--rpt-font-size-base, .875rem);color:var(--rpt-color-text, #0f172a);background-color:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);appearance:none;-webkit-appearance:none;outline:none;cursor:pointer;transition:border-color var(--rpt-transition-speed, .15s) ease,box-shadow var(--rpt-transition-speed, .15s) ease}.rpt-select:hover:not(:disabled){border-color:var(--rpt-color-border-hover, #94a3b8)}.rpt-select:focus{border-color:var(--rpt-color-border-focus, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.rpt-select:disabled{background-color:var(--rpt-color-surface, #f8fafc);color:var(--rpt-color-text-muted, #64748b);cursor:not-allowed}.rpt-select.rpt-invalid{border-color:var(--rpt-color-danger, #ef4444)}.rpt-select.rpt-invalid:focus{box-shadow:0 0 0 3px #ef444440}.rpt-select-arrow{position:absolute;right:12px;top:50%;transform:translateY(-50%);pointer-events:none;color:var(--rpt-color-text-muted, #64748b);display:flex;align-items:center}.rpt-combobox-wrapper{position:relative;width:100%;flex:1;min-height:0}.rpt-combobox-trigger{width:100%;height:100%;min-height:38px;box-sizing:border-box;padding:6px 10px 6px 12px;display:flex;align-items:center;justify-content:space-between;gap:8px;font-size:var(--rpt-font-size-base, .875rem);font-family:inherit;color:var(--rpt-color-text, #0f172a);background-color:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);outline:none;cursor:pointer;text-align:left;transition:border-color var(--rpt-transition-speed, .15s) ease,box-shadow var(--rpt-transition-speed, .15s) ease}.rpt-combobox-trigger:hover:not(:disabled){border-color:var(--rpt-color-border-hover, #94a3b8)}.rpt-combobox-trigger:focus-visible,.rpt-combobox-trigger.is-open{border-color:var(--rpt-color-border-focus, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.rpt-combobox-trigger:disabled{background-color:var(--rpt-color-surface, #f8fafc);color:var(--rpt-color-text-muted, #64748b);cursor:not-allowed}.rpt-combobox-trigger.rpt-invalid{border-color:var(--rpt-color-danger, #ef4444)}.rpt-combobox-trigger.rpt-invalid:focus-visible{box-shadow:0 0 0 3px #ef444440}.trigger-label{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:1.3}.trigger-label.is-placeholder{color:var(--rpt-color-text-muted, #94a3b8)}.trigger-actions{display:flex;align-items:center;gap:6px;flex-shrink:0}.trigger-clear-btn{display:flex;align-items:center;justify-content:center;width:18px;height:18px;border-radius:50%;font-size:.6875rem;color:var(--rpt-color-text-muted, #64748b);background-color:#f1f5f9;cursor:pointer;-webkit-user-select:none;user-select:none;transition:background-color .15s ease,color .15s ease}.trigger-clear-btn:hover{background-color:#e2e8f0;color:var(--rpt-color-text, #0f172a)}.trigger-arrow{display:flex;align-items:center;color:var(--rpt-color-text-muted, #64748b);transition:transform .18s ease}.trigger-arrow.rotated{transform:rotate(180deg)}.rpt-combobox-menu{position:absolute;top:calc(100% + 4px);left:0;right:0;z-index:1050;background-color:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);box-shadow:0 10px 25px -5px #0000001f,0 8px 10px -6px #00000014;overflow:hidden;display:flex;flex-direction:column;animation:rpt-dropdown-pop .12s cubic-bezier(0,0,.2,1)}.rpt-combobox-menu.opens-above{top:auto;bottom:calc(100% + 4px);box-shadow:0 -10px 25px -5px #0000001f,0 -8px 10px -6px #00000014;animation:rpt-dropdown-pop-above .12s cubic-bezier(0,0,.2,1)}@keyframes rpt-dropdown-pop{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}@keyframes rpt-dropdown-pop-above{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.combobox-search-box{display:flex;align-items:center;gap:8px;padding:8px 10px;border-bottom:1px solid var(--rpt-color-border, #e2e8f0);background-color:#f8fafc}.combobox-search-icon{color:var(--rpt-color-text-muted, #94a3b8);display:flex;align-items:center;flex-shrink:0}.combobox-search-input{flex:1;border:none;outline:none;background:transparent;font-size:var(--rpt-font-size-sm, .8125rem);font-family:inherit;color:var(--rpt-color-text, #0f172a);min-width:0}.combobox-search-input::placeholder{color:#94a3b8}.combobox-search-clear{border:none;background:#e2e8f0;color:#64748b;width:16px;height:16px;border-radius:50%;font-size:.625rem;cursor:pointer;display:flex;align-items:center;justify-content:center;padding:0}.combobox-search-clear:hover{background:#cbd5e1;color:#0f172a}.combobox-options-list{max-height:220px;overflow-y:auto;overscroll-behavior:contain;padding:4px}.combobox-option-item{display:flex;align-items:center;justify-content:space-between;padding:7px 10px;border-radius:4px;font-size:var(--rpt-font-size-base, .84rem);color:var(--rpt-color-text, #0f172a);cursor:pointer;-webkit-user-select:none;user-select:none;transition:background-color .1s ease}.combobox-option-item.is-focused{background-color:var(--rpt-color-surface-hover, #f1f5f9)}.combobox-option-item.is-selected{background-color:#eff6ff;color:var(--rpt-color-primary, #2563eb);font-weight:600}.opt-label{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.opt-check{font-size:.875rem;font-weight:700;color:var(--rpt-color-primary, #2563eb);margin-left:8px}.combobox-status-row{padding:10px 12px;font-size:.78rem;text-align:center;color:var(--rpt-color-text-muted, #64748b)}.combobox-status-row.loading{display:flex;align-items:center;justify-content:center;gap:6px;color:#2563eb}.combobox-status-row.error{color:var(--rpt-color-danger, #dc2626)}.combobox-status-row.hint{font-size:.72rem;color:#94a3b8;border-top:1px dashed #e2e8f0;margin-top:4px;padding:6px}.rpt-error-text{font-size:.7rem;color:var(--rpt-color-danger, #ef4444);margin-top:3px;line-height:1.25;max-width:100%;overflow-wrap:anywhere;word-break:break-word;display:block}\n"] }]
3178
3178
  }], ctorParameters: () => [], propDecorators: { onDocumentClick: [{
3179
3179
  type: HostListener,
3180
3180
  args: ['document:click', ['$event']]
@@ -3235,7 +3235,7 @@ class RptDateComponent {
3235
3235
  <span class="rpt-error-text">{{ errorMessage() }}</span>
3236
3236
  }
3237
3237
  </div>
3238
- `, isInline: true, styles: [":host{display:block;width:100%;height:100%;box-sizing:border-box;font-family:var(--rpt-font-family, inherit)}.rpt-field-group{display:flex;flex-direction:column;height:100%;gap:4px;box-sizing:border-box}.rpt-label{font-size:var(--rpt-font-size-sm, .75rem);font-weight:500;color:var(--rpt-color-text, #0f172a);flex-shrink:0}.rpt-required-marker{color:var(--rpt-color-danger, #ef4444);margin-left:2px}.rpt-date-wrapper{position:relative;width:100%;flex:1;min-height:0;display:flex}.rpt-date-input{width:100%;height:100%;min-height:38px;box-sizing:border-box;padding:6px 12px;font-size:var(--rpt-font-size-base, .875rem);color:var(--rpt-color-text, #0f172a);background-color:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);transition:border-color var(--rpt-transition-speed, .15s) ease,box-shadow var(--rpt-transition-speed, .15s) ease;outline:none}.rpt-date-input:hover:not(:disabled){border-color:var(--rpt-color-border-hover, #94a3b8)}.rpt-date-input:focus{border-color:var(--rpt-color-border-focus, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.rpt-date-input:disabled{background-color:var(--rpt-color-surface, #f8fafc);color:var(--rpt-color-text-muted, #64748b);cursor:not-allowed}.rpt-date-input.rpt-invalid{border-color:var(--rpt-color-danger, #ef4444)}.rpt-date-input.rpt-invalid:focus{box-shadow:0 0 0 3px #ef444440}.rpt-error-text{font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-danger, #ef4444);margin-top:2px}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3238
+ `, isInline: true, styles: [":host{display:block;width:100%;height:100%;box-sizing:border-box;font-family:var(--rpt-font-family, inherit)}.rpt-field-group{display:flex;flex-direction:column;height:100%;gap:4px;box-sizing:border-box}.rpt-label{font-size:var(--rpt-font-size-sm, .75rem);font-weight:500;color:var(--rpt-color-text, #0f172a);flex-shrink:0}.rpt-required-marker{color:var(--rpt-color-danger, #ef4444);margin-left:2px}.rpt-date-wrapper{position:relative;width:100%;flex:1;min-height:0;display:flex}.rpt-date-input{width:100%;height:100%;min-height:38px;box-sizing:border-box;padding:6px 12px;font-size:var(--rpt-font-size-base, .875rem);color:var(--rpt-color-text, #0f172a);background-color:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);transition:border-color var(--rpt-transition-speed, .15s) ease,box-shadow var(--rpt-transition-speed, .15s) ease;outline:none}.rpt-date-input:hover:not(:disabled){border-color:var(--rpt-color-border-hover, #94a3b8)}.rpt-date-input:focus{border-color:var(--rpt-color-border-focus, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.rpt-date-input:disabled{background-color:var(--rpt-color-surface, #f8fafc);color:var(--rpt-color-text-muted, #64748b);cursor:not-allowed}.rpt-date-input.rpt-invalid{border-color:var(--rpt-color-danger, #ef4444)}.rpt-date-input.rpt-invalid:focus{box-shadow:0 0 0 3px #ef444440}.rpt-error-text{font-size:.7rem;color:var(--rpt-color-danger, #ef4444);margin-top:3px;line-height:1.25;max-width:100%;overflow-wrap:anywhere;word-break:break-word;display:block}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3239
3239
  }
3240
3240
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RptDateComponent, decorators: [{
3241
3241
  type: Component,
@@ -3266,7 +3266,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
3266
3266
  <span class="rpt-error-text">{{ errorMessage() }}</span>
3267
3267
  }
3268
3268
  </div>
3269
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;width:100%;height:100%;box-sizing:border-box;font-family:var(--rpt-font-family, inherit)}.rpt-field-group{display:flex;flex-direction:column;height:100%;gap:4px;box-sizing:border-box}.rpt-label{font-size:var(--rpt-font-size-sm, .75rem);font-weight:500;color:var(--rpt-color-text, #0f172a);flex-shrink:0}.rpt-required-marker{color:var(--rpt-color-danger, #ef4444);margin-left:2px}.rpt-date-wrapper{position:relative;width:100%;flex:1;min-height:0;display:flex}.rpt-date-input{width:100%;height:100%;min-height:38px;box-sizing:border-box;padding:6px 12px;font-size:var(--rpt-font-size-base, .875rem);color:var(--rpt-color-text, #0f172a);background-color:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);transition:border-color var(--rpt-transition-speed, .15s) ease,box-shadow var(--rpt-transition-speed, .15s) ease;outline:none}.rpt-date-input:hover:not(:disabled){border-color:var(--rpt-color-border-hover, #94a3b8)}.rpt-date-input:focus{border-color:var(--rpt-color-border-focus, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.rpt-date-input:disabled{background-color:var(--rpt-color-surface, #f8fafc);color:var(--rpt-color-text-muted, #64748b);cursor:not-allowed}.rpt-date-input.rpt-invalid{border-color:var(--rpt-color-danger, #ef4444)}.rpt-date-input.rpt-invalid:focus{box-shadow:0 0 0 3px #ef444440}.rpt-error-text{font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-danger, #ef4444);margin-top:2px}\n"] }]
3269
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;width:100%;height:100%;box-sizing:border-box;font-family:var(--rpt-font-family, inherit)}.rpt-field-group{display:flex;flex-direction:column;height:100%;gap:4px;box-sizing:border-box}.rpt-label{font-size:var(--rpt-font-size-sm, .75rem);font-weight:500;color:var(--rpt-color-text, #0f172a);flex-shrink:0}.rpt-required-marker{color:var(--rpt-color-danger, #ef4444);margin-left:2px}.rpt-date-wrapper{position:relative;width:100%;flex:1;min-height:0;display:flex}.rpt-date-input{width:100%;height:100%;min-height:38px;box-sizing:border-box;padding:6px 12px;font-size:var(--rpt-font-size-base, .875rem);color:var(--rpt-color-text, #0f172a);background-color:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);transition:border-color var(--rpt-transition-speed, .15s) ease,box-shadow var(--rpt-transition-speed, .15s) ease;outline:none}.rpt-date-input:hover:not(:disabled){border-color:var(--rpt-color-border-hover, #94a3b8)}.rpt-date-input:focus{border-color:var(--rpt-color-border-focus, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.rpt-date-input:disabled{background-color:var(--rpt-color-surface, #f8fafc);color:var(--rpt-color-text-muted, #64748b);cursor:not-allowed}.rpt-date-input.rpt-invalid{border-color:var(--rpt-color-danger, #ef4444)}.rpt-date-input.rpt-invalid:focus{box-shadow:0 0 0 3px #ef444440}.rpt-error-text{font-size:.7rem;color:var(--rpt-color-danger, #ef4444);margin-top:3px;line-height:1.25;max-width:100%;overflow-wrap:anywhere;word-break:break-word;display:block}\n"] }]
3270
3270
  }] });
3271
3271
 
3272
3272
  const pad = (n) => String(n).padStart(2, '0');
@@ -3520,7 +3520,7 @@ class RptDateRangeComponent {
3520
3520
  <span class="rpt-error-text">{{ errorMessage() }}</span>
3521
3521
  }
3522
3522
  </div>
3523
- `, isInline: true, styles: [":host{display:block;width:100%;height:100%;box-sizing:border-box;font-family:var(--rpt-font-family, inherit)}.rpt-field-group{display:flex;flex-direction:column;height:100%;gap:5px;box-sizing:border-box}.rpt-label-row{display:flex;align-items:center;justify-content:space-between;gap:8px;flex-wrap:wrap}.rpt-label{font-size:var(--rpt-font-size-sm, .75rem);font-weight:500;color:var(--rpt-color-text, #0f172a);flex-shrink:0}.rpt-required-marker{color:var(--rpt-color-danger, #ef4444);margin-left:2px}.rpt-preset-pills{display:inline-flex;align-items:center;gap:3px;flex-wrap:wrap}.rpt-preset-pill{border:1px solid var(--rpt-color-border, #cbd5e1);background:var(--rpt-color-surface, #f8fafc);color:var(--rpt-color-text-muted, #64748b);font-size:.6875rem;font-weight:500;padding:1px 7px;border-radius:12px;cursor:pointer;line-height:1.4;transition:all .12s ease}.rpt-preset-pill:hover:not(:disabled){border-color:var(--rpt-color-primary, #2563eb);color:var(--rpt-color-primary, #2563eb);background:#eff6ff}.rpt-preset-pill.is-active{background:var(--rpt-color-primary, #2563eb);border-color:var(--rpt-color-primary, #2563eb);color:#fff;font-weight:600}.rpt-preset-pill:disabled{cursor:not-allowed;opacity:.5}.rpt-date-range-container{display:flex;align-items:center;gap:8px;width:100%;flex:1;min-height:38px;box-sizing:border-box;padding:3px 8px;background-color:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);transition:border-color var(--rpt-transition-speed, .15s) ease,box-shadow var(--rpt-transition-speed, .15s) ease}.rpt-date-range-container:focus-within{border-color:var(--rpt-color-border-focus, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.rpt-date-range-container.rpt-invalid{border-color:var(--rpt-color-danger, #ef4444)}.rpt-date-subfield{display:flex;align-items:center;gap:6px;flex:1;min-width:0}.rpt-date-prefix{font-size:.6875rem;font-weight:600;text-transform:uppercase;letter-spacing:.03em;color:var(--rpt-color-text-muted, #94a3b8);-webkit-user-select:none;user-select:none}.rpt-date-input{width:100%;border:none;outline:none;background:transparent;font-size:var(--rpt-font-size-base, .84rem);font-family:inherit;color:var(--rpt-color-text, #0f172a);min-width:0;padding:4px 0}.rpt-date-input:disabled{color:var(--rpt-color-text-muted, #94a3b8);cursor:not-allowed}.rpt-range-separator{color:var(--rpt-color-text-muted, #94a3b8);font-size:.8125rem;-webkit-user-select:none;user-select:none;padding:0 2px}.rpt-range-clear-btn{border:none;background:#f1f5f9;color:var(--rpt-color-text-muted, #64748b);width:18px;height:18px;border-radius:50%;font-size:.6875rem;cursor:pointer;display:flex;align-items:center;justify-content:center;flex-shrink:0;padding:0;transition:background-color .15s ease,color .15s ease}.rpt-range-clear-btn:hover{background-color:#e2e8f0;color:var(--rpt-color-text, #0f172a)}.rpt-error-text{font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-danger, #ef4444);margin-top:2px}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3523
+ `, isInline: true, styles: [":host{display:block;width:100%;height:100%;box-sizing:border-box;font-family:var(--rpt-font-family, inherit)}.rpt-field-group{display:flex;flex-direction:column;height:100%;gap:5px;box-sizing:border-box}.rpt-label-row{display:flex;align-items:center;justify-content:space-between;gap:8px;flex-wrap:wrap}.rpt-label{font-size:var(--rpt-font-size-sm, .75rem);font-weight:500;color:var(--rpt-color-text, #0f172a);flex-shrink:0}.rpt-required-marker{color:var(--rpt-color-danger, #ef4444);margin-left:2px}.rpt-preset-pills{display:inline-flex;align-items:center;gap:3px;flex-wrap:wrap}.rpt-preset-pill{border:1px solid var(--rpt-color-border, #cbd5e1);background:var(--rpt-color-surface, #f8fafc);color:var(--rpt-color-text-muted, #64748b);font-size:.6875rem;font-weight:500;padding:1px 7px;border-radius:12px;cursor:pointer;line-height:1.4;transition:all .12s ease}.rpt-preset-pill:hover:not(:disabled){border-color:var(--rpt-color-primary, #2563eb);color:var(--rpt-color-primary, #2563eb);background:#eff6ff}.rpt-preset-pill.is-active{background:var(--rpt-color-primary, #2563eb);border-color:var(--rpt-color-primary, #2563eb);color:#fff;font-weight:600}.rpt-preset-pill:disabled{cursor:not-allowed;opacity:.5}.rpt-date-range-container{display:flex;align-items:center;gap:8px;width:100%;flex:1;min-height:38px;box-sizing:border-box;padding:3px 8px;background-color:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);transition:border-color var(--rpt-transition-speed, .15s) ease,box-shadow var(--rpt-transition-speed, .15s) ease}.rpt-date-range-container:focus-within{border-color:var(--rpt-color-border-focus, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.rpt-date-range-container.rpt-invalid{border-color:var(--rpt-color-danger, #ef4444)}.rpt-date-subfield{display:flex;align-items:center;gap:6px;flex:1;min-width:0}.rpt-date-prefix{font-size:.6875rem;font-weight:600;text-transform:uppercase;letter-spacing:.03em;color:var(--rpt-color-text-muted, #94a3b8);-webkit-user-select:none;user-select:none}.rpt-date-input{width:100%;border:none;outline:none;background:transparent;font-size:var(--rpt-font-size-base, .84rem);font-family:inherit;color:var(--rpt-color-text, #0f172a);min-width:0;padding:4px 0}.rpt-date-input:disabled{color:var(--rpt-color-text-muted, #94a3b8);cursor:not-allowed}.rpt-range-separator{color:var(--rpt-color-text-muted, #94a3b8);font-size:.8125rem;-webkit-user-select:none;user-select:none;padding:0 2px}.rpt-range-clear-btn{border:none;background:#f1f5f9;color:var(--rpt-color-text-muted, #64748b);width:18px;height:18px;border-radius:50%;font-size:.6875rem;cursor:pointer;display:flex;align-items:center;justify-content:center;flex-shrink:0;padding:0;transition:background-color .15s ease,color .15s ease}.rpt-range-clear-btn:hover{background-color:#e2e8f0;color:var(--rpt-color-text, #0f172a)}.rpt-error-text{font-size:.7rem;color:var(--rpt-color-danger, #ef4444);margin-top:3px;line-height:1.25;max-width:100%;overflow-wrap:anywhere;word-break:break-word;display:block}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3524
3524
  }
3525
3525
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RptDateRangeComponent, decorators: [{
3526
3526
  type: Component,
@@ -3608,7 +3608,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
3608
3608
  <span class="rpt-error-text">{{ errorMessage() }}</span>
3609
3609
  }
3610
3610
  </div>
3611
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;width:100%;height:100%;box-sizing:border-box;font-family:var(--rpt-font-family, inherit)}.rpt-field-group{display:flex;flex-direction:column;height:100%;gap:5px;box-sizing:border-box}.rpt-label-row{display:flex;align-items:center;justify-content:space-between;gap:8px;flex-wrap:wrap}.rpt-label{font-size:var(--rpt-font-size-sm, .75rem);font-weight:500;color:var(--rpt-color-text, #0f172a);flex-shrink:0}.rpt-required-marker{color:var(--rpt-color-danger, #ef4444);margin-left:2px}.rpt-preset-pills{display:inline-flex;align-items:center;gap:3px;flex-wrap:wrap}.rpt-preset-pill{border:1px solid var(--rpt-color-border, #cbd5e1);background:var(--rpt-color-surface, #f8fafc);color:var(--rpt-color-text-muted, #64748b);font-size:.6875rem;font-weight:500;padding:1px 7px;border-radius:12px;cursor:pointer;line-height:1.4;transition:all .12s ease}.rpt-preset-pill:hover:not(:disabled){border-color:var(--rpt-color-primary, #2563eb);color:var(--rpt-color-primary, #2563eb);background:#eff6ff}.rpt-preset-pill.is-active{background:var(--rpt-color-primary, #2563eb);border-color:var(--rpt-color-primary, #2563eb);color:#fff;font-weight:600}.rpt-preset-pill:disabled{cursor:not-allowed;opacity:.5}.rpt-date-range-container{display:flex;align-items:center;gap:8px;width:100%;flex:1;min-height:38px;box-sizing:border-box;padding:3px 8px;background-color:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);transition:border-color var(--rpt-transition-speed, .15s) ease,box-shadow var(--rpt-transition-speed, .15s) ease}.rpt-date-range-container:focus-within{border-color:var(--rpt-color-border-focus, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.rpt-date-range-container.rpt-invalid{border-color:var(--rpt-color-danger, #ef4444)}.rpt-date-subfield{display:flex;align-items:center;gap:6px;flex:1;min-width:0}.rpt-date-prefix{font-size:.6875rem;font-weight:600;text-transform:uppercase;letter-spacing:.03em;color:var(--rpt-color-text-muted, #94a3b8);-webkit-user-select:none;user-select:none}.rpt-date-input{width:100%;border:none;outline:none;background:transparent;font-size:var(--rpt-font-size-base, .84rem);font-family:inherit;color:var(--rpt-color-text, #0f172a);min-width:0;padding:4px 0}.rpt-date-input:disabled{color:var(--rpt-color-text-muted, #94a3b8);cursor:not-allowed}.rpt-range-separator{color:var(--rpt-color-text-muted, #94a3b8);font-size:.8125rem;-webkit-user-select:none;user-select:none;padding:0 2px}.rpt-range-clear-btn{border:none;background:#f1f5f9;color:var(--rpt-color-text-muted, #64748b);width:18px;height:18px;border-radius:50%;font-size:.6875rem;cursor:pointer;display:flex;align-items:center;justify-content:center;flex-shrink:0;padding:0;transition:background-color .15s ease,color .15s ease}.rpt-range-clear-btn:hover{background-color:#e2e8f0;color:var(--rpt-color-text, #0f172a)}.rpt-error-text{font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-danger, #ef4444);margin-top:2px}\n"] }]
3611
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;width:100%;height:100%;box-sizing:border-box;font-family:var(--rpt-font-family, inherit)}.rpt-field-group{display:flex;flex-direction:column;height:100%;gap:5px;box-sizing:border-box}.rpt-label-row{display:flex;align-items:center;justify-content:space-between;gap:8px;flex-wrap:wrap}.rpt-label{font-size:var(--rpt-font-size-sm, .75rem);font-weight:500;color:var(--rpt-color-text, #0f172a);flex-shrink:0}.rpt-required-marker{color:var(--rpt-color-danger, #ef4444);margin-left:2px}.rpt-preset-pills{display:inline-flex;align-items:center;gap:3px;flex-wrap:wrap}.rpt-preset-pill{border:1px solid var(--rpt-color-border, #cbd5e1);background:var(--rpt-color-surface, #f8fafc);color:var(--rpt-color-text-muted, #64748b);font-size:.6875rem;font-weight:500;padding:1px 7px;border-radius:12px;cursor:pointer;line-height:1.4;transition:all .12s ease}.rpt-preset-pill:hover:not(:disabled){border-color:var(--rpt-color-primary, #2563eb);color:var(--rpt-color-primary, #2563eb);background:#eff6ff}.rpt-preset-pill.is-active{background:var(--rpt-color-primary, #2563eb);border-color:var(--rpt-color-primary, #2563eb);color:#fff;font-weight:600}.rpt-preset-pill:disabled{cursor:not-allowed;opacity:.5}.rpt-date-range-container{display:flex;align-items:center;gap:8px;width:100%;flex:1;min-height:38px;box-sizing:border-box;padding:3px 8px;background-color:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);transition:border-color var(--rpt-transition-speed, .15s) ease,box-shadow var(--rpt-transition-speed, .15s) ease}.rpt-date-range-container:focus-within{border-color:var(--rpt-color-border-focus, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.rpt-date-range-container.rpt-invalid{border-color:var(--rpt-color-danger, #ef4444)}.rpt-date-subfield{display:flex;align-items:center;gap:6px;flex:1;min-width:0}.rpt-date-prefix{font-size:.6875rem;font-weight:600;text-transform:uppercase;letter-spacing:.03em;color:var(--rpt-color-text-muted, #94a3b8);-webkit-user-select:none;user-select:none}.rpt-date-input{width:100%;border:none;outline:none;background:transparent;font-size:var(--rpt-font-size-base, .84rem);font-family:inherit;color:var(--rpt-color-text, #0f172a);min-width:0;padding:4px 0}.rpt-date-input:disabled{color:var(--rpt-color-text-muted, #94a3b8);cursor:not-allowed}.rpt-range-separator{color:var(--rpt-color-text-muted, #94a3b8);font-size:.8125rem;-webkit-user-select:none;user-select:none;padding:0 2px}.rpt-range-clear-btn{border:none;background:#f1f5f9;color:var(--rpt-color-text-muted, #64748b);width:18px;height:18px;border-radius:50%;font-size:.6875rem;cursor:pointer;display:flex;align-items:center;justify-content:center;flex-shrink:0;padding:0;transition:background-color .15s ease,color .15s ease}.rpt-range-clear-btn:hover{background-color:#e2e8f0;color:var(--rpt-color-text, #0f172a)}.rpt-error-text{font-size:.7rem;color:var(--rpt-color-danger, #ef4444);margin-top:3px;line-height:1.25;max-width:100%;overflow-wrap:anywhere;word-break:break-word;display:block}\n"] }]
3612
3612
  }], ctorParameters: () => [] });
3613
3613
 
3614
3614
  class RptNumberComponent {
@@ -3674,7 +3674,7 @@ class RptNumberComponent {
3674
3674
  <span class="rpt-error-text">{{ errorMessage() }}</span>
3675
3675
  }
3676
3676
  </div>
3677
- `, isInline: true, styles: [":host{display:block;width:100%;height:100%;box-sizing:border-box;font-family:var(--rpt-font-family, inherit)}.rpt-field-group{display:flex;flex-direction:column;height:100%;gap:4px;box-sizing:border-box}.rpt-label{font-size:var(--rpt-font-size-sm, .75rem);font-weight:500;color:var(--rpt-color-text, #0f172a);flex-shrink:0}.rpt-required-marker{color:var(--rpt-color-danger, #ef4444);margin-left:2px}.rpt-input-wrapper{position:relative;display:flex;align-items:stretch;width:100%;flex:1;min-height:0}.rpt-affix{font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-text-muted, #64748b);background-color:var(--rpt-color-surface, #f8fafc);padding:0 10px;height:100%;min-height:38px;display:flex;align-items:center;border:1px solid var(--rpt-color-border, #cbd5e1);-webkit-user-select:none;user-select:none;box-sizing:border-box}.rpt-prefix{border-right:none;border-top-left-radius:var(--rpt-border-radius, 6px);border-bottom-left-radius:var(--rpt-border-radius, 6px)}.rpt-suffix{border-left:none;border-top-right-radius:var(--rpt-border-radius, 6px);border-bottom-right-radius:var(--rpt-border-radius, 6px)}.rpt-number-input{width:100%;box-sizing:border-box;height:100%;min-height:38px;padding:6px 12px;font-size:var(--rpt-font-size-base, .875rem);color:var(--rpt-color-text, #0f172a);background-color:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);transition:border-color var(--rpt-transition-speed, .15s) ease,box-shadow var(--rpt-transition-speed, .15s) ease;outline:none}.has-prefix .rpt-number-input{border-top-left-radius:0;border-bottom-left-radius:0}.has-suffix .rpt-number-input{border-top-right-radius:0;border-bottom-right-radius:0}.rpt-number-input:hover:not(:disabled){border-color:var(--rpt-color-border-hover, #94a3b8)}.rpt-number-input:focus{border-color:var(--rpt-color-border-focus, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.rpt-number-input:disabled{background-color:var(--rpt-color-surface, #f8fafc);color:var(--rpt-color-text-muted, #64748b);cursor:not-allowed}.rpt-number-input.rpt-invalid{border-color:var(--rpt-color-danger, #ef4444)}.rpt-number-input.rpt-invalid:focus{box-shadow:0 0 0 3px #ef444440}.rpt-error-text{font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-danger, #ef4444);margin-top:2px}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i1.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3677
+ `, isInline: true, styles: [":host{display:block;width:100%;height:100%;box-sizing:border-box;font-family:var(--rpt-font-family, inherit)}.rpt-field-group{display:flex;flex-direction:column;height:100%;gap:4px;box-sizing:border-box}.rpt-label{font-size:var(--rpt-font-size-sm, .75rem);font-weight:500;color:var(--rpt-color-text, #0f172a);flex-shrink:0}.rpt-required-marker{color:var(--rpt-color-danger, #ef4444);margin-left:2px}.rpt-input-wrapper{position:relative;display:flex;align-items:stretch;width:100%;flex:1;min-height:0}.rpt-affix{font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-text-muted, #64748b);background-color:var(--rpt-color-surface, #f8fafc);padding:0 10px;height:100%;min-height:38px;display:flex;align-items:center;border:1px solid var(--rpt-color-border, #cbd5e1);-webkit-user-select:none;user-select:none;box-sizing:border-box}.rpt-prefix{border-right:none;border-top-left-radius:var(--rpt-border-radius, 6px);border-bottom-left-radius:var(--rpt-border-radius, 6px)}.rpt-suffix{border-left:none;border-top-right-radius:var(--rpt-border-radius, 6px);border-bottom-right-radius:var(--rpt-border-radius, 6px)}.rpt-number-input{width:100%;box-sizing:border-box;height:100%;min-height:38px;padding:6px 12px;font-size:var(--rpt-font-size-base, .875rem);color:var(--rpt-color-text, #0f172a);background-color:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);transition:border-color var(--rpt-transition-speed, .15s) ease,box-shadow var(--rpt-transition-speed, .15s) ease;outline:none}.has-prefix .rpt-number-input{border-top-left-radius:0;border-bottom-left-radius:0}.has-suffix .rpt-number-input{border-top-right-radius:0;border-bottom-right-radius:0}.rpt-number-input:hover:not(:disabled){border-color:var(--rpt-color-border-hover, #94a3b8)}.rpt-number-input:focus{border-color:var(--rpt-color-border-focus, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.rpt-number-input:disabled{background-color:var(--rpt-color-surface, #f8fafc);color:var(--rpt-color-text-muted, #64748b);cursor:not-allowed}.rpt-number-input.rpt-invalid{border-color:var(--rpt-color-danger, #ef4444)}.rpt-number-input.rpt-invalid:focus{box-shadow:0 0 0 3px #ef444440}.rpt-error-text{font-size:.7rem;color:var(--rpt-color-danger, #ef4444);margin-top:3px;line-height:1.25;max-width:100%;overflow-wrap:anywhere;word-break:break-word;display:block}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i1.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3678
3678
  }
3679
3679
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RptNumberComponent, decorators: [{
3680
3680
  type: Component,
@@ -3713,7 +3713,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
3713
3713
  <span class="rpt-error-text">{{ errorMessage() }}</span>
3714
3714
  }
3715
3715
  </div>
3716
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;width:100%;height:100%;box-sizing:border-box;font-family:var(--rpt-font-family, inherit)}.rpt-field-group{display:flex;flex-direction:column;height:100%;gap:4px;box-sizing:border-box}.rpt-label{font-size:var(--rpt-font-size-sm, .75rem);font-weight:500;color:var(--rpt-color-text, #0f172a);flex-shrink:0}.rpt-required-marker{color:var(--rpt-color-danger, #ef4444);margin-left:2px}.rpt-input-wrapper{position:relative;display:flex;align-items:stretch;width:100%;flex:1;min-height:0}.rpt-affix{font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-text-muted, #64748b);background-color:var(--rpt-color-surface, #f8fafc);padding:0 10px;height:100%;min-height:38px;display:flex;align-items:center;border:1px solid var(--rpt-color-border, #cbd5e1);-webkit-user-select:none;user-select:none;box-sizing:border-box}.rpt-prefix{border-right:none;border-top-left-radius:var(--rpt-border-radius, 6px);border-bottom-left-radius:var(--rpt-border-radius, 6px)}.rpt-suffix{border-left:none;border-top-right-radius:var(--rpt-border-radius, 6px);border-bottom-right-radius:var(--rpt-border-radius, 6px)}.rpt-number-input{width:100%;box-sizing:border-box;height:100%;min-height:38px;padding:6px 12px;font-size:var(--rpt-font-size-base, .875rem);color:var(--rpt-color-text, #0f172a);background-color:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);transition:border-color var(--rpt-transition-speed, .15s) ease,box-shadow var(--rpt-transition-speed, .15s) ease;outline:none}.has-prefix .rpt-number-input{border-top-left-radius:0;border-bottom-left-radius:0}.has-suffix .rpt-number-input{border-top-right-radius:0;border-bottom-right-radius:0}.rpt-number-input:hover:not(:disabled){border-color:var(--rpt-color-border-hover, #94a3b8)}.rpt-number-input:focus{border-color:var(--rpt-color-border-focus, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.rpt-number-input:disabled{background-color:var(--rpt-color-surface, #f8fafc);color:var(--rpt-color-text-muted, #64748b);cursor:not-allowed}.rpt-number-input.rpt-invalid{border-color:var(--rpt-color-danger, #ef4444)}.rpt-number-input.rpt-invalid:focus{box-shadow:0 0 0 3px #ef444440}.rpt-error-text{font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-danger, #ef4444);margin-top:2px}\n"] }]
3716
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;width:100%;height:100%;box-sizing:border-box;font-family:var(--rpt-font-family, inherit)}.rpt-field-group{display:flex;flex-direction:column;height:100%;gap:4px;box-sizing:border-box}.rpt-label{font-size:var(--rpt-font-size-sm, .75rem);font-weight:500;color:var(--rpt-color-text, #0f172a);flex-shrink:0}.rpt-required-marker{color:var(--rpt-color-danger, #ef4444);margin-left:2px}.rpt-input-wrapper{position:relative;display:flex;align-items:stretch;width:100%;flex:1;min-height:0}.rpt-affix{font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-text-muted, #64748b);background-color:var(--rpt-color-surface, #f8fafc);padding:0 10px;height:100%;min-height:38px;display:flex;align-items:center;border:1px solid var(--rpt-color-border, #cbd5e1);-webkit-user-select:none;user-select:none;box-sizing:border-box}.rpt-prefix{border-right:none;border-top-left-radius:var(--rpt-border-radius, 6px);border-bottom-left-radius:var(--rpt-border-radius, 6px)}.rpt-suffix{border-left:none;border-top-right-radius:var(--rpt-border-radius, 6px);border-bottom-right-radius:var(--rpt-border-radius, 6px)}.rpt-number-input{width:100%;box-sizing:border-box;height:100%;min-height:38px;padding:6px 12px;font-size:var(--rpt-font-size-base, .875rem);color:var(--rpt-color-text, #0f172a);background-color:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);transition:border-color var(--rpt-transition-speed, .15s) ease,box-shadow var(--rpt-transition-speed, .15s) ease;outline:none}.has-prefix .rpt-number-input{border-top-left-radius:0;border-bottom-left-radius:0}.has-suffix .rpt-number-input{border-top-right-radius:0;border-bottom-right-radius:0}.rpt-number-input:hover:not(:disabled){border-color:var(--rpt-color-border-hover, #94a3b8)}.rpt-number-input:focus{border-color:var(--rpt-color-border-focus, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.rpt-number-input:disabled{background-color:var(--rpt-color-surface, #f8fafc);color:var(--rpt-color-text-muted, #64748b);cursor:not-allowed}.rpt-number-input.rpt-invalid{border-color:var(--rpt-color-danger, #ef4444)}.rpt-number-input.rpt-invalid:focus{box-shadow:0 0 0 3px #ef444440}.rpt-error-text{font-size:.7rem;color:var(--rpt-color-danger, #ef4444);margin-top:3px;line-height:1.25;max-width:100%;overflow-wrap:anywhere;word-break:break-word;display:block}\n"] }]
3717
3717
  }] });
3718
3718
 
3719
3719
  class RptCheckboxComponent {
@@ -3764,7 +3764,7 @@ class RptCheckboxComponent {
3764
3764
  <span class="rpt-error-text">{{ errorMessage() }}</span>
3765
3765
  }
3766
3766
  </div>
3767
- `, isInline: true, styles: [":host{display:block;width:100%;height:100%;box-sizing:border-box;font-family:var(--rpt-font-family, inherit)}.rpt-checkbox-field{display:flex;flex-direction:column;justify-content:flex-end;height:100%;gap:4px;padding-bottom:8px;box-sizing:border-box}.rpt-checkbox-label{display:inline-flex;align-items:center;gap:8px;cursor:pointer;-webkit-user-select:none;user-select:none}.rpt-checkbox-input{position:absolute;opacity:0;width:0;height:0;margin:0}.rpt-custom-checkbox{width:18px;height:18px;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-sm, 4px);background-color:var(--rpt-color-bg, #ffffff);display:flex;align-items:center;justify-content:center;transition:all var(--rpt-transition-speed, .15s) ease;color:var(--rpt-color-text-inverse, #ffffff);flex-shrink:0}.rpt-checkbox-label:hover .rpt-custom-checkbox{border-color:var(--rpt-color-border-hover, #94a3b8)}.rpt-checkbox-input:focus-visible+.rpt-custom-checkbox{border-color:var(--rpt-color-border-focus, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.rpt-checkbox-input:checked+.rpt-custom-checkbox{background-color:var(--rpt-color-primary, #2563eb);border-color:var(--rpt-color-primary, #2563eb)}.rpt-check-icon{opacity:0;transform:scale(.6);transition:all var(--rpt-transition-speed, .15s) ease}.rpt-checkbox-input:checked+.rpt-custom-checkbox .rpt-check-icon{opacity:1;transform:scale(1)}.rpt-checkbox-input:disabled+.rpt-custom-checkbox{background-color:var(--rpt-color-surface, #f8fafc);border-color:var(--rpt-color-border, #cbd5e1);cursor:not-allowed}.rpt-checkbox-text{font-size:var(--rpt-font-size-base, .875rem);color:var(--rpt-color-text, #0f172a)}.rpt-required-marker{color:var(--rpt-color-danger, #ef4444);margin-left:2px}.rpt-error-text{font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-danger, #ef4444)}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3767
+ `, isInline: true, styles: [":host{display:block;width:100%;height:100%;box-sizing:border-box;font-family:var(--rpt-font-family, inherit)}.rpt-checkbox-field{display:flex;flex-direction:column;justify-content:flex-end;height:100%;gap:4px;padding-bottom:8px;box-sizing:border-box}.rpt-checkbox-label{display:inline-flex;align-items:center;gap:8px;cursor:pointer;-webkit-user-select:none;user-select:none}.rpt-checkbox-input{position:absolute;opacity:0;width:0;height:0;margin:0}.rpt-custom-checkbox{width:18px;height:18px;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-sm, 4px);background-color:var(--rpt-color-bg, #ffffff);display:flex;align-items:center;justify-content:center;transition:all var(--rpt-transition-speed, .15s) ease;color:var(--rpt-color-text-inverse, #ffffff);flex-shrink:0}.rpt-checkbox-label:hover .rpt-custom-checkbox{border-color:var(--rpt-color-border-hover, #94a3b8)}.rpt-checkbox-input:focus-visible+.rpt-custom-checkbox{border-color:var(--rpt-color-border-focus, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.rpt-checkbox-input:checked+.rpt-custom-checkbox{background-color:var(--rpt-color-primary, #2563eb);border-color:var(--rpt-color-primary, #2563eb)}.rpt-check-icon{opacity:0;transform:scale(.6);transition:all var(--rpt-transition-speed, .15s) ease}.rpt-checkbox-input:checked+.rpt-custom-checkbox .rpt-check-icon{opacity:1;transform:scale(1)}.rpt-checkbox-input:disabled+.rpt-custom-checkbox{background-color:var(--rpt-color-surface, #f8fafc);border-color:var(--rpt-color-border, #cbd5e1);cursor:not-allowed}.rpt-checkbox-text{font-size:var(--rpt-font-size-base, .875rem);color:var(--rpt-color-text, #0f172a)}.rpt-required-marker{color:var(--rpt-color-danger, #ef4444);margin-left:2px}.rpt-error-text{font-size:.7rem;color:var(--rpt-color-danger, #ef4444);margin-top:3px;line-height:1.25;max-width:100%;overflow-wrap:anywhere;word-break:break-word;display:block}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3768
3768
  }
3769
3769
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RptCheckboxComponent, decorators: [{
3770
3770
  type: Component,
@@ -3794,7 +3794,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
3794
3794
  <span class="rpt-error-text">{{ errorMessage() }}</span>
3795
3795
  }
3796
3796
  </div>
3797
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;width:100%;height:100%;box-sizing:border-box;font-family:var(--rpt-font-family, inherit)}.rpt-checkbox-field{display:flex;flex-direction:column;justify-content:flex-end;height:100%;gap:4px;padding-bottom:8px;box-sizing:border-box}.rpt-checkbox-label{display:inline-flex;align-items:center;gap:8px;cursor:pointer;-webkit-user-select:none;user-select:none}.rpt-checkbox-input{position:absolute;opacity:0;width:0;height:0;margin:0}.rpt-custom-checkbox{width:18px;height:18px;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-sm, 4px);background-color:var(--rpt-color-bg, #ffffff);display:flex;align-items:center;justify-content:center;transition:all var(--rpt-transition-speed, .15s) ease;color:var(--rpt-color-text-inverse, #ffffff);flex-shrink:0}.rpt-checkbox-label:hover .rpt-custom-checkbox{border-color:var(--rpt-color-border-hover, #94a3b8)}.rpt-checkbox-input:focus-visible+.rpt-custom-checkbox{border-color:var(--rpt-color-border-focus, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.rpt-checkbox-input:checked+.rpt-custom-checkbox{background-color:var(--rpt-color-primary, #2563eb);border-color:var(--rpt-color-primary, #2563eb)}.rpt-check-icon{opacity:0;transform:scale(.6);transition:all var(--rpt-transition-speed, .15s) ease}.rpt-checkbox-input:checked+.rpt-custom-checkbox .rpt-check-icon{opacity:1;transform:scale(1)}.rpt-checkbox-input:disabled+.rpt-custom-checkbox{background-color:var(--rpt-color-surface, #f8fafc);border-color:var(--rpt-color-border, #cbd5e1);cursor:not-allowed}.rpt-checkbox-text{font-size:var(--rpt-font-size-base, .875rem);color:var(--rpt-color-text, #0f172a)}.rpt-required-marker{color:var(--rpt-color-danger, #ef4444);margin-left:2px}.rpt-error-text{font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-danger, #ef4444)}\n"] }]
3797
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;width:100%;height:100%;box-sizing:border-box;font-family:var(--rpt-font-family, inherit)}.rpt-checkbox-field{display:flex;flex-direction:column;justify-content:flex-end;height:100%;gap:4px;padding-bottom:8px;box-sizing:border-box}.rpt-checkbox-label{display:inline-flex;align-items:center;gap:8px;cursor:pointer;-webkit-user-select:none;user-select:none}.rpt-checkbox-input{position:absolute;opacity:0;width:0;height:0;margin:0}.rpt-custom-checkbox{width:18px;height:18px;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-sm, 4px);background-color:var(--rpt-color-bg, #ffffff);display:flex;align-items:center;justify-content:center;transition:all var(--rpt-transition-speed, .15s) ease;color:var(--rpt-color-text-inverse, #ffffff);flex-shrink:0}.rpt-checkbox-label:hover .rpt-custom-checkbox{border-color:var(--rpt-color-border-hover, #94a3b8)}.rpt-checkbox-input:focus-visible+.rpt-custom-checkbox{border-color:var(--rpt-color-border-focus, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.rpt-checkbox-input:checked+.rpt-custom-checkbox{background-color:var(--rpt-color-primary, #2563eb);border-color:var(--rpt-color-primary, #2563eb)}.rpt-check-icon{opacity:0;transform:scale(.6);transition:all var(--rpt-transition-speed, .15s) ease}.rpt-checkbox-input:checked+.rpt-custom-checkbox .rpt-check-icon{opacity:1;transform:scale(1)}.rpt-checkbox-input:disabled+.rpt-custom-checkbox{background-color:var(--rpt-color-surface, #f8fafc);border-color:var(--rpt-color-border, #cbd5e1);cursor:not-allowed}.rpt-checkbox-text{font-size:var(--rpt-font-size-base, .875rem);color:var(--rpt-color-text, #0f172a)}.rpt-required-marker{color:var(--rpt-color-danger, #ef4444);margin-left:2px}.rpt-error-text{font-size:.7rem;color:var(--rpt-color-danger, #ef4444);margin-top:3px;line-height:1.25;max-width:100%;overflow-wrap:anywhere;word-break:break-word;display:block}\n"] }]
3798
3798
  }] });
3799
3799
 
3800
3800
  /**
@@ -3949,6 +3949,28 @@ const ICON_REGISTRY = {
3949
3949
  'chevron-up': {
3950
3950
  polylines: ['18 15 12 9 6 15']
3951
3951
  },
3952
+ 'chevron-left': {
3953
+ polylines: ['15 18 9 12 15 6']
3954
+ },
3955
+ 'chevron-right': {
3956
+ polylines: ['9 18 15 12 9 6']
3957
+ },
3958
+ 'panel-left': {
3959
+ rects: [{ x: 3, y: 3, width: 18, height: 18, rx: 3 }],
3960
+ lines: [{ x1: 9, y1: 3, x2: 9, y2: 21 }]
3961
+ },
3962
+ 'sidebar-left': {
3963
+ rects: [{ x: 3, y: 3, width: 18, height: 18, rx: 3 }],
3964
+ lines: [{ x1: 9, y1: 3, x2: 9, y2: 21 }]
3965
+ },
3966
+ 'panel-right': {
3967
+ rects: [{ x: 3, y: 3, width: 18, height: 18, rx: 3 }],
3968
+ lines: [{ x1: 15, y1: 3, x2: 15, y2: 21 }]
3969
+ },
3970
+ 'sidebar-right': {
3971
+ rects: [{ x: 3, y: 3, width: 18, height: 18, rx: 3 }],
3972
+ lines: [{ x1: 15, y1: 3, x2: 15, y2: 21 }]
3973
+ },
3952
3974
  // Date / Calendar
3953
3975
  'date': {
3954
3976
  rects: [{ x: 3, y: 4, width: 18, height: 18, rx: 3 }],
@@ -4513,7 +4535,7 @@ class RptKpiCardComponent {
4513
4535
  <!-- Subtle glowing gradient bar at card top -->
4514
4536
  <div class="rpt-kpi-accent-bar"></div>
4515
4537
  </div>
4516
- `, isInline: true, styles: [":host{display:block;width:100%;height:100%;box-sizing:border-box}.rpt-kpi-card{position:relative;background:var(--rpt-surface-bg, #ffffff);border:1px solid var(--rpt-border-color, #e2e8f0);border-radius:var(--rpt-radius-lg, 12px);padding:var(--rpt-space-md, 20px);box-shadow:0 2px 6px -1px #0000000d,0 1px 4px -2px #0000000a;display:flex;flex-direction:column;justify-content:space-between;height:100%;box-sizing:border-box;gap:12px;overflow:hidden;transition:transform .2s ease,box-shadow .2s ease,border-color .2s ease;-webkit-user-select:none;user-select:none}.rpt-kpi-card:hover{transform:translateY(-2px);box-shadow:0 8px 20px -4px #00000014,0 4px 10px -4px #0000000d;border-color:var(--rpt-border-hover, #cbd5e1)}.rpt-kpi-accent-bar{position:absolute;top:0;left:0;right:0;height:3px;background:var(--kpi-accent, var(--rpt-primary, #2563eb))}.rpt-kpi-header{display:flex;align-items:center;justify-content:space-between;gap:8px}.rpt-kpi-title{font-size:.8125rem;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--rpt-text-muted, #64748b)}.rpt-kpi-icon-badge{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:8px;background:var(--kpi-badge-bg, rgba(37, 99, 235, .08));color:var(--kpi-accent, var(--rpt-primary, #2563eb));font-size:1rem}.rpt-kpi-body{display:flex;flex-direction:column;gap:6px}.rpt-kpi-value-row{display:flex;align-items:baseline;gap:4px}.rpt-kpi-prefix,.rpt-kpi-suffix{font-size:1.125rem;font-weight:500;color:var(--rpt-text-muted, #64748b)}.rpt-kpi-value{font-size:1.875rem;font-weight:700;color:var(--rpt-text-color, #0f172a);line-height:1.1;font-feature-settings:\"tnum\";font-variant-numeric:tabular-nums}.rpt-kpi-footer{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:2px}.rpt-kpi-trend{display:inline-flex;align-items:center;gap:2px;font-size:.75rem;font-weight:600;padding:2px 6px;border-radius:4px}.rpt-kpi-trend--up{background:#10b9811f;color:#059669}.rpt-kpi-trend--down{background:#ef44441f;color:#dc2626}.rpt-kpi-trend--neutral{background:#64748b1f;color:#475569}.rpt-kpi-subtitle{font-size:.75rem;color:var(--rpt-text-muted, #64748b)}.rpt-kpi-card--primary{--kpi-accent: var(--rpt-primary, #2563eb);--kpi-badge-bg: rgba(37, 99, 235, .1)}.rpt-kpi-card--success{--kpi-accent: #10b981;--kpi-badge-bg: rgba(16, 185, 129, .1)}.rpt-kpi-card--warning{--kpi-accent: #f59e0b;--kpi-badge-bg: rgba(245, 158, 11, .1)}.rpt-kpi-card--danger{--kpi-accent: #ef4444;--kpi-badge-bg: rgba(239, 68, 68, .1)}.rpt-kpi-card--info{--kpi-accent: #06b6d4;--kpi-badge-bg: rgba(6, 182, 212, .1)}.rpt-kpi-card--neutral{--kpi-accent: #64748b;--kpi-badge-bg: rgba(100, 116, 139, .1)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: RptIconComponent, selector: "rpt-icon", inputs: ["name", "size", "color", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4538
+ `, isInline: true, styles: [":host{display:block;width:100%;height:100%;box-sizing:border-box}.rpt-kpi-card{position:relative;background:var(--rpt-surface-bg, #ffffff);border:1px solid var(--rpt-border-color, #e2e8f0);border-radius:var(--rpt-radius-lg, 12px);padding:var(--rpt-space-md, 20px);box-shadow:0 2px 6px -1px #0000000d,0 1px 4px -2px #0000000a;display:flex;flex-direction:column;justify-content:space-between;height:100%;box-sizing:border-box;gap:12px;overflow:hidden;transition:transform .2s ease,box-shadow .2s ease,border-color .2s ease;-webkit-user-select:none;user-select:none}.rpt-kpi-card:hover{transform:translateY(-2px);box-shadow:0 8px 20px -4px #00000014,0 4px 10px -4px #0000000d;border-color:var(--rpt-border-hover, #cbd5e1)}.rpt-kpi-accent-bar{position:absolute;top:0;left:0;right:0;height:3px;background:var(--kpi-accent, var(--rpt-primary, #2563eb))}.rpt-kpi-header{display:flex;align-items:center;justify-content:space-between;gap:8px}.rpt-kpi-title{font-size:.8125rem;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--rpt-text-muted, #64748b)}.rpt-kpi-icon-badge{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:8px;background:var(--kpi-badge-bg, rgba(37, 99, 235, .08));color:var(--kpi-accent, var(--rpt-primary, #2563eb));font-size:1rem}.rpt-kpi-body{display:flex;flex-direction:column;gap:6px}.rpt-kpi-value-row{display:flex;align-items:baseline;gap:4px}.rpt-kpi-prefix,.rpt-kpi-suffix{font-size:1.125rem;font-weight:500;color:var(--rpt-text-muted, #64748b)}.rpt-kpi-value{font-size:1.875rem;font-weight:700;color:var(--rpt-text-color, #0f172a);line-height:1.1;font-feature-settings:\"tnum\";font-variant-numeric:tabular-nums}.rpt-kpi-footer{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:2px}.rpt-kpi-trend{display:inline-flex;align-items:center;gap:2px;font-size:.75rem;font-weight:600;padding:2px 6px;border-radius:4px}.rpt-kpi-trend--up{background:#10b9811f;color:#059669}.rpt-kpi-trend--down{background:#ef44441f;color:#dc2626}.rpt-kpi-trend--neutral{background:#64748b1f;color:#475569}.rpt-kpi-subtitle{font-size:var(--rpt-font-size-sm, .75rem);font-weight:500;color:var(--rpt-color-text-muted, var(--rpt-text-muted, #64748b));line-height:1.4}.rpt-kpi-card--primary{--kpi-accent: var(--rpt-primary, #2563eb);--kpi-badge-bg: rgba(37, 99, 235, .1)}.rpt-kpi-card--success{--kpi-accent: #10b981;--kpi-badge-bg: rgba(16, 185, 129, .1)}.rpt-kpi-card--warning{--kpi-accent: #f59e0b;--kpi-badge-bg: rgba(245, 158, 11, .1)}.rpt-kpi-card--danger{--kpi-accent: #ef4444;--kpi-badge-bg: rgba(239, 68, 68, .1)}.rpt-kpi-card--info{--kpi-accent: #06b6d4;--kpi-badge-bg: rgba(6, 182, 212, .1)}.rpt-kpi-card--neutral{--kpi-accent: #64748b;--kpi-badge-bg: rgba(100, 116, 139, .1)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: RptIconComponent, selector: "rpt-icon", inputs: ["name", "size", "color", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4517
4539
  }
4518
4540
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RptKpiCardComponent, decorators: [{
4519
4541
  type: Component,
@@ -4569,7 +4591,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
4569
4591
  <!-- Subtle glowing gradient bar at card top -->
4570
4592
  <div class="rpt-kpi-accent-bar"></div>
4571
4593
  </div>
4572
- `, styles: [":host{display:block;width:100%;height:100%;box-sizing:border-box}.rpt-kpi-card{position:relative;background:var(--rpt-surface-bg, #ffffff);border:1px solid var(--rpt-border-color, #e2e8f0);border-radius:var(--rpt-radius-lg, 12px);padding:var(--rpt-space-md, 20px);box-shadow:0 2px 6px -1px #0000000d,0 1px 4px -2px #0000000a;display:flex;flex-direction:column;justify-content:space-between;height:100%;box-sizing:border-box;gap:12px;overflow:hidden;transition:transform .2s ease,box-shadow .2s ease,border-color .2s ease;-webkit-user-select:none;user-select:none}.rpt-kpi-card:hover{transform:translateY(-2px);box-shadow:0 8px 20px -4px #00000014,0 4px 10px -4px #0000000d;border-color:var(--rpt-border-hover, #cbd5e1)}.rpt-kpi-accent-bar{position:absolute;top:0;left:0;right:0;height:3px;background:var(--kpi-accent, var(--rpt-primary, #2563eb))}.rpt-kpi-header{display:flex;align-items:center;justify-content:space-between;gap:8px}.rpt-kpi-title{font-size:.8125rem;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--rpt-text-muted, #64748b)}.rpt-kpi-icon-badge{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:8px;background:var(--kpi-badge-bg, rgba(37, 99, 235, .08));color:var(--kpi-accent, var(--rpt-primary, #2563eb));font-size:1rem}.rpt-kpi-body{display:flex;flex-direction:column;gap:6px}.rpt-kpi-value-row{display:flex;align-items:baseline;gap:4px}.rpt-kpi-prefix,.rpt-kpi-suffix{font-size:1.125rem;font-weight:500;color:var(--rpt-text-muted, #64748b)}.rpt-kpi-value{font-size:1.875rem;font-weight:700;color:var(--rpt-text-color, #0f172a);line-height:1.1;font-feature-settings:\"tnum\";font-variant-numeric:tabular-nums}.rpt-kpi-footer{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:2px}.rpt-kpi-trend{display:inline-flex;align-items:center;gap:2px;font-size:.75rem;font-weight:600;padding:2px 6px;border-radius:4px}.rpt-kpi-trend--up{background:#10b9811f;color:#059669}.rpt-kpi-trend--down{background:#ef44441f;color:#dc2626}.rpt-kpi-trend--neutral{background:#64748b1f;color:#475569}.rpt-kpi-subtitle{font-size:.75rem;color:var(--rpt-text-muted, #64748b)}.rpt-kpi-card--primary{--kpi-accent: var(--rpt-primary, #2563eb);--kpi-badge-bg: rgba(37, 99, 235, .1)}.rpt-kpi-card--success{--kpi-accent: #10b981;--kpi-badge-bg: rgba(16, 185, 129, .1)}.rpt-kpi-card--warning{--kpi-accent: #f59e0b;--kpi-badge-bg: rgba(245, 158, 11, .1)}.rpt-kpi-card--danger{--kpi-accent: #ef4444;--kpi-badge-bg: rgba(239, 68, 68, .1)}.rpt-kpi-card--info{--kpi-accent: #06b6d4;--kpi-badge-bg: rgba(6, 182, 212, .1)}.rpt-kpi-card--neutral{--kpi-accent: #64748b;--kpi-badge-bg: rgba(100, 116, 139, .1)}\n"] }]
4594
+ `, styles: [":host{display:block;width:100%;height:100%;box-sizing:border-box}.rpt-kpi-card{position:relative;background:var(--rpt-surface-bg, #ffffff);border:1px solid var(--rpt-border-color, #e2e8f0);border-radius:var(--rpt-radius-lg, 12px);padding:var(--rpt-space-md, 20px);box-shadow:0 2px 6px -1px #0000000d,0 1px 4px -2px #0000000a;display:flex;flex-direction:column;justify-content:space-between;height:100%;box-sizing:border-box;gap:12px;overflow:hidden;transition:transform .2s ease,box-shadow .2s ease,border-color .2s ease;-webkit-user-select:none;user-select:none}.rpt-kpi-card:hover{transform:translateY(-2px);box-shadow:0 8px 20px -4px #00000014,0 4px 10px -4px #0000000d;border-color:var(--rpt-border-hover, #cbd5e1)}.rpt-kpi-accent-bar{position:absolute;top:0;left:0;right:0;height:3px;background:var(--kpi-accent, var(--rpt-primary, #2563eb))}.rpt-kpi-header{display:flex;align-items:center;justify-content:space-between;gap:8px}.rpt-kpi-title{font-size:.8125rem;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--rpt-text-muted, #64748b)}.rpt-kpi-icon-badge{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:8px;background:var(--kpi-badge-bg, rgba(37, 99, 235, .08));color:var(--kpi-accent, var(--rpt-primary, #2563eb));font-size:1rem}.rpt-kpi-body{display:flex;flex-direction:column;gap:6px}.rpt-kpi-value-row{display:flex;align-items:baseline;gap:4px}.rpt-kpi-prefix,.rpt-kpi-suffix{font-size:1.125rem;font-weight:500;color:var(--rpt-text-muted, #64748b)}.rpt-kpi-value{font-size:1.875rem;font-weight:700;color:var(--rpt-text-color, #0f172a);line-height:1.1;font-feature-settings:\"tnum\";font-variant-numeric:tabular-nums}.rpt-kpi-footer{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:2px}.rpt-kpi-trend{display:inline-flex;align-items:center;gap:2px;font-size:.75rem;font-weight:600;padding:2px 6px;border-radius:4px}.rpt-kpi-trend--up{background:#10b9811f;color:#059669}.rpt-kpi-trend--down{background:#ef44441f;color:#dc2626}.rpt-kpi-trend--neutral{background:#64748b1f;color:#475569}.rpt-kpi-subtitle{font-size:var(--rpt-font-size-sm, .75rem);font-weight:500;color:var(--rpt-color-text-muted, var(--rpt-text-muted, #64748b));line-height:1.4}.rpt-kpi-card--primary{--kpi-accent: var(--rpt-primary, #2563eb);--kpi-badge-bg: rgba(37, 99, 235, .1)}.rpt-kpi-card--success{--kpi-accent: #10b981;--kpi-badge-bg: rgba(16, 185, 129, .1)}.rpt-kpi-card--warning{--kpi-accent: #f59e0b;--kpi-badge-bg: rgba(245, 158, 11, .1)}.rpt-kpi-card--danger{--kpi-accent: #ef4444;--kpi-badge-bg: rgba(239, 68, 68, .1)}.rpt-kpi-card--info{--kpi-accent: #06b6d4;--kpi-badge-bg: rgba(6, 182, 212, .1)}.rpt-kpi-card--neutral{--kpi-accent: #64748b;--kpi-badge-bg: rgba(100, 116, 139, .1)}\n"] }]
4573
4595
  }] });
4574
4596
 
4575
4597
  class ReportChartBridgeComponent {
@@ -5841,6 +5863,7 @@ class RptGridOutletDirective {
5841
5863
  gridStateChange = output();
5842
5864
  columnDefsChange = output();
5843
5865
  rowClick = output();
5866
+ selectionChange = output();
5844
5867
  constructor() {
5845
5868
  effect(() => {
5846
5869
  const type = this.componentType();
@@ -5891,6 +5914,12 @@ class RptGridOutletDirective {
5891
5914
  else if (instance.cellClick && typeof instance.cellClick.subscribe === 'function') {
5892
5915
  this.subs.push(instance.cellClick.subscribe(emitRow));
5893
5916
  }
5917
+ if (instance.selectionChanged && typeof instance.selectionChanged.subscribe === 'function') {
5918
+ this.subs.push(instance.selectionChanged.subscribe((selection) => {
5919
+ const rows = Array.isArray(selection) ? selection : (selection ? [selection] : []);
5920
+ this.selectionChange.emit(rows);
5921
+ }));
5922
+ }
5894
5923
  const currentInputs = this.inputs();
5895
5924
  for (const [key, value] of Object.entries(currentInputs)) {
5896
5925
  try {
@@ -5916,7 +5945,7 @@ class RptGridOutletDirective {
5916
5945
  this.clear();
5917
5946
  }
5918
5947
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RptGridOutletDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5919
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.14", type: RptGridOutletDirective, isStandalone: true, selector: "[rptGridOutlet]", inputs: { componentType: { classPropertyName: "componentType", publicName: "rptGridOutlet", isSignal: true, isRequired: false, transformFunction: null }, inputs: { classPropertyName: "inputs", publicName: "inputs", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { gridStateChange: "gridStateChange", columnDefsChange: "columnDefsChange", rowClick: "rowClick" }, ngImport: i0 });
5948
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.14", type: RptGridOutletDirective, isStandalone: true, selector: "[rptGridOutlet]", inputs: { componentType: { classPropertyName: "componentType", publicName: "rptGridOutlet", isSignal: true, isRequired: false, transformFunction: null }, inputs: { classPropertyName: "inputs", publicName: "inputs", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { gridStateChange: "gridStateChange", columnDefsChange: "columnDefsChange", rowClick: "rowClick", selectionChange: "selectionChange" }, ngImport: i0 });
5920
5949
  }
5921
5950
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RptGridOutletDirective, decorators: [{
5922
5951
  type: Directive,
@@ -5943,13 +5972,43 @@ class ReportGridBridgeComponent {
5943
5972
  gridStateChange = output();
5944
5973
  columnDefsChange = output();
5945
5974
  rowClick = output();
5975
+ selectionChange = output();
5946
5976
  customGridComponent = computed(() => this.injectedGrid ?? null);
5977
+ selectedRows = signal([]);
5947
5978
  hasRowClickAction = computed(() => {
5948
5979
  const def = this.gridDefinition();
5949
5980
  return !!(def?.rowClickAction ||
5950
5981
  def?.options?.rowClickAction ||
5951
5982
  this.visibleColumns().some((c) => !!c.action));
5952
5983
  });
5984
+ isCheckboxSelectionEnabled = computed(() => {
5985
+ const opts = this.gridDefinition()?.options;
5986
+ if (opts?.checkboxSelection !== undefined) {
5987
+ return opts.checkboxSelection;
5988
+ }
5989
+ if (opts?.selectable) {
5990
+ return true;
5991
+ }
5992
+ return this.visibleColumns().some((c) => c.checkboxSelection);
5993
+ });
5994
+ effectiveRowSelection = computed(() => {
5995
+ const opts = this.gridDefinition()?.options;
5996
+ return opts?.selectionMode || opts?.rowSelection || 'multiple';
5997
+ });
5998
+ isHeaderCheckboxSelectionEnabled = computed(() => {
5999
+ if (this.effectiveRowSelection() === 'single') {
6000
+ return false;
6001
+ }
6002
+ const opts = this.gridDefinition()?.options;
6003
+ if (opts?.headerCheckboxSelection !== undefined) {
6004
+ return opts.headerCheckboxSelection;
6005
+ }
6006
+ return this.isCheckboxSelectionEnabled();
6007
+ });
6008
+ isSelectionEnabled = computed(() => {
6009
+ const opts = this.gridDefinition()?.options;
6010
+ return !!(opts?.selectable || opts?.checkboxSelection || this.visibleColumns().some((c) => c.checkboxSelection));
6011
+ });
5953
6012
  sortColumn = signal(null);
5954
6013
  sortDirection = signal('asc');
5955
6014
  currentPage = signal(1);
@@ -5974,7 +6033,10 @@ class ReportGridBridgeComponent {
5974
6033
  return defined;
5975
6034
  });
5976
6035
  bridgedColumns = computed(() => {
5977
- return this.visibleColumns().map((col) => {
6036
+ const isGridCheckbox = this.isCheckboxSelectionEnabled();
6037
+ const isGridHeaderCheckbox = this.isHeaderCheckboxSelectionEnabled();
6038
+ const hasExplicitColCheckbox = this.visibleColumns().some((c) => c.checkboxSelection);
6039
+ return this.visibleColumns().map((col, idx) => {
5978
6040
  let widthNum;
5979
6041
  if (typeof col.width === 'string' && col.width.endsWith('px')) {
5980
6042
  widthNum = parseInt(col.width, 10);
@@ -5982,6 +6044,12 @@ class ReportGridBridgeComponent {
5982
6044
  else if (typeof col.width === 'number') {
5983
6045
  widthNum = col.width;
5984
6046
  }
6047
+ let colCheckboxSelection = col.checkboxSelection;
6048
+ let colHeaderCheckboxSelection = col.headerCheckboxSelection;
6049
+ if (!hasExplicitColCheckbox && isGridCheckbox && idx === 0) {
6050
+ colCheckboxSelection = true;
6051
+ colHeaderCheckboxSelection = isGridHeaderCheckbox;
6052
+ }
5985
6053
  return {
5986
6054
  ...col,
5987
6055
  headerName: col.label, // BWays-grid / AG Grid standard
@@ -5990,6 +6058,8 @@ class ReportGridBridgeComponent {
5990
6058
  hide: col.visible === false,
5991
6059
  width: widthNum,
5992
6060
  aggFunc: col.aggregate && col.aggregate !== 'none' ? col.aggregate : undefined,
6061
+ checkboxSelection: colCheckboxSelection,
6062
+ headerCheckboxSelection: colHeaderCheckboxSelection,
5993
6063
  };
5994
6064
  });
5995
6065
  });
@@ -6003,10 +6073,23 @@ class ReportGridBridgeComponent {
6003
6073
  const cols = this.visibleColumns().map((c) => c.field).slice(0, 5).join('_');
6004
6074
  return `rpt_${ds}_${cols || 'grid'}`;
6005
6075
  });
6006
- gridConfig = computed(() => ({
6007
- ...(this.gridDefinition().options || {}),
6008
- stateKey: this.gridStateKey(),
6009
- }));
6076
+ gridConfig = computed(() => {
6077
+ const opts = this.gridDefinition()?.options || {};
6078
+ const rowSel = this.effectiveRowSelection();
6079
+ const hasCheckbox = this.isCheckboxSelectionEnabled();
6080
+ const hasHeaderCheckbox = this.isHeaderCheckboxSelectionEnabled();
6081
+ return {
6082
+ sideBar: opts.sideBar !== undefined ? opts.sideBar : true,
6083
+ statusBar: opts.statusBar !== undefined ? opts.statusBar : true,
6084
+ globalSearch: opts.globalSearch !== undefined ? opts.globalSearch : true,
6085
+ ...opts,
6086
+ rowSelection: rowSel,
6087
+ selectionMode: rowSel,
6088
+ checkboxSelection: hasCheckbox,
6089
+ headerCheckboxSelection: hasHeaderCheckbox,
6090
+ stateKey: this.gridStateKey(),
6091
+ };
6092
+ });
6010
6093
  gridReportState = computed(() => {
6011
6094
  const opts = this.gridDefinition()?.options;
6012
6095
  return {
@@ -6026,6 +6109,7 @@ class ReportGridBridgeComponent {
6026
6109
  reportState: this.gridReportState(),
6027
6110
  pagination: this.gridDefinition().options?.pagination !== false,
6028
6111
  pageSize: this.gridDefinition().options?.pageSize ?? 10,
6112
+ rowSelection: this.effectiveRowSelection(),
6029
6113
  }));
6030
6114
  showRowNumbers = computed(() => {
6031
6115
  return !!this.gridDefinition().options?.showRowNumbers;
@@ -6037,7 +6121,7 @@ class ReportGridBridgeComponent {
6037
6121
  return this.gridDefinition().options?.pageSize ?? 10;
6038
6122
  });
6039
6123
  colSpan = computed(() => {
6040
- return this.visibleColumns().length + (this.showRowNumbers() ? 1 : 0);
6124
+ return this.visibleColumns().length + (this.showRowNumbers() ? 1 : 0) + (this.isSelectionEnabled() ? 1 : 0);
6041
6125
  });
6042
6126
  hasAggregates = computed(() => {
6043
6127
  return (this.gridDefinition().options?.showFooter &&
@@ -6155,10 +6239,78 @@ class ReportGridBridgeComponent {
6155
6239
  }
6156
6240
  return '';
6157
6241
  }
6242
+ onSelectionChange(selected) {
6243
+ const rows = Array.isArray(selected) ? selected : (selected ? [selected] : []);
6244
+ this.selectedRows.set(rows);
6245
+ this.selectionChange.emit(rows);
6246
+ }
6247
+ isRowSelected(row) {
6248
+ return this.selectedRows().includes(row);
6249
+ }
6250
+ isAllSelected() {
6251
+ const data = this.paginatedData();
6252
+ if (data.length === 0)
6253
+ return false;
6254
+ return data.every((r) => this.isRowSelected(r));
6255
+ }
6256
+ isPartiallySelected() {
6257
+ const data = this.paginatedData();
6258
+ if (data.length === 0)
6259
+ return false;
6260
+ const count = data.filter((r) => this.isRowSelected(r)).length;
6261
+ return count > 0 && count < data.length;
6262
+ }
6263
+ toggleSelectAll(event) {
6264
+ const checked = event.target.checked;
6265
+ const current = this.selectedRows();
6266
+ const pageRows = this.paginatedData();
6267
+ let next;
6268
+ if (checked) {
6269
+ const set = new Set([...current, ...pageRows]);
6270
+ next = Array.from(set);
6271
+ }
6272
+ else {
6273
+ next = current.filter((r) => !pageRows.includes(r));
6274
+ }
6275
+ this.selectedRows.set(next);
6276
+ this.selectionChange.emit(next);
6277
+ }
6278
+ toggleRowSelection(row, event) {
6279
+ const checked = event.target.checked;
6280
+ const current = this.selectedRows();
6281
+ const mode = this.effectiveRowSelection();
6282
+ let next;
6283
+ if (mode === 'single') {
6284
+ next = checked ? [row] : [];
6285
+ }
6286
+ else {
6287
+ if (checked) {
6288
+ next = current.includes(row) ? current : [...current, row];
6289
+ }
6290
+ else {
6291
+ next = current.filter((r) => r !== row);
6292
+ }
6293
+ }
6294
+ this.selectedRows.set(next);
6295
+ this.selectionChange.emit(next);
6296
+ }
6158
6297
  onRowClick(row, event) {
6159
- if (!this.hasRowClickAction())
6160
- return;
6161
- this.rowClick.emit({ row, event });
6298
+ if (this.isSelectionEnabled()) {
6299
+ const current = this.selectedRows();
6300
+ const mode = this.effectiveRowSelection();
6301
+ let next;
6302
+ if (mode === 'single') {
6303
+ next = [row];
6304
+ }
6305
+ else {
6306
+ next = current.includes(row) ? current.filter((r) => r !== row) : [...current, row];
6307
+ }
6308
+ this.selectedRows.set(next);
6309
+ this.selectionChange.emit(next);
6310
+ }
6311
+ if (this.hasRowClickAction()) {
6312
+ this.rowClick.emit({ row, event });
6313
+ }
6162
6314
  }
6163
6315
  onCellClick(row, col, event) {
6164
6316
  if (col.action) {
@@ -6167,7 +6319,7 @@ class ReportGridBridgeComponent {
6167
6319
  }
6168
6320
  }
6169
6321
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportGridBridgeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6170
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ReportGridBridgeComponent, isStandalone: true, selector: "rpt-grid-bridge", inputs: { gridDefinition: { classPropertyName: "gridDefinition", publicName: "gridDefinition", isSignal: true, isRequired: true, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { gridStateChange: "gridStateChange", columnDefsChange: "columnDefsChange", rowClick: "rowClick" }, ngImport: i0, template: `
6322
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ReportGridBridgeComponent, isStandalone: true, selector: "rpt-grid-bridge", inputs: { gridDefinition: { classPropertyName: "gridDefinition", publicName: "gridDefinition", isSignal: true, isRequired: true, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { gridStateChange: "gridStateChange", columnDefsChange: "columnDefsChange", rowClick: "rowClick", selectionChange: "selectionChange" }, ngImport: i0, template: `
6171
6323
  <div class="rpt-grid-container">
6172
6324
  @if (customGridComponent()) {
6173
6325
  <!-- Host-provided grid component (e.g. BWays-grid UltraGridComponent) -->
@@ -6177,6 +6329,7 @@ class ReportGridBridgeComponent {
6177
6329
  (gridStateChange)="gridStateChange.emit($event)"
6178
6330
  (columnDefsChange)="columnDefsChange.emit($event)"
6179
6331
  (rowClick)="rowClick.emit($event)"
6332
+ (selectionChange)="onSelectionChange($event)"
6180
6333
  />
6181
6334
  } @else {
6182
6335
  <!-- Built-in fallback table when no external grid is provided -->
@@ -6192,6 +6345,20 @@ class ReportGridBridgeComponent {
6192
6345
  @if (showRowNumbers()) {
6193
6346
  <th class="rpt-th rpt-th-num">#</th>
6194
6347
  }
6348
+ @if (isSelectionEnabled()) {
6349
+ <th class="rpt-th rpt-th-cb">
6350
+ @if (effectiveRowSelection() !== 'single' && isHeaderCheckboxSelectionEnabled()) {
6351
+ <input
6352
+ type="checkbox"
6353
+ class="rpt-checkbox"
6354
+ [checked]="isAllSelected()"
6355
+ [indeterminate]="isPartiallySelected()"
6356
+ (change)="toggleSelectAll($event)"
6357
+ title="Select all rows"
6358
+ />
6359
+ }
6360
+ </th>
6361
+ }
6195
6362
  @for (col of visibleColumns(); track col.field) {
6196
6363
  <th
6197
6364
  class="rpt-th"
@@ -6223,12 +6390,24 @@ class ReportGridBridgeComponent {
6223
6390
  @for (row of paginatedData(); track $index) {
6224
6391
  <tr
6225
6392
  class="rpt-tr"
6226
- [class.is-clickable]="hasRowClickAction()"
6393
+ [class.is-clickable]="hasRowClickAction() || isSelectionEnabled()"
6394
+ [class.is-selected]="isRowSelected(row)"
6227
6395
  (click)="onRowClick(row, $event)"
6228
6396
  >
6229
6397
  @if (showRowNumbers()) {
6230
6398
  <td class="rpt-td rpt-td-num">{{ (currentPage() - 1) * pageSize() + $index + 1 }}</td>
6231
6399
  }
6400
+ @if (isSelectionEnabled()) {
6401
+ <td class="rpt-td rpt-td-cb" (click)="$event.stopPropagation()">
6402
+ <input
6403
+ [type]="effectiveRowSelection() === 'single' ? 'radio' : 'checkbox'"
6404
+ name="rpt-fallback-selection"
6405
+ class="rpt-checkbox"
6406
+ [checked]="isRowSelected(row)"
6407
+ (change)="toggleRowSelection(row, $event)"
6408
+ />
6409
+ </td>
6410
+ }
6232
6411
  @for (col of visibleColumns(); track col.field) {
6233
6412
  <td
6234
6413
  class="rpt-td"
@@ -6253,10 +6432,16 @@ class ReportGridBridgeComponent {
6253
6432
  @if (showRowNumbers()) {
6254
6433
  <td class="rpt-td-num"></td>
6255
6434
  }
6435
+ @if (isSelectionEnabled()) {
6436
+ <td class="rpt-td-cb"></td>
6437
+ }
6256
6438
  @for (col of visibleColumns(); track col.field) {
6257
6439
  <td class="rpt-td-aggregate" [style.text-align]="col.align || 'left'">
6258
6440
  @if (col.aggregate && col.aggregate !== 'none') {
6259
- <strong>{{ col.aggregate | uppercase }}: {{ computeAggregate(col) }}</strong>
6441
+ <div class="rpt-aggregate-wrap" [class.is-right]="col.align === 'right'" [class.is-center]="col.align === 'center'">
6442
+ <span class="rpt-aggregate-label">{{ col.aggregate }}</span>
6443
+ <span class="rpt-aggregate-value">{{ computeAggregate(col) }}</span>
6444
+ </div>
6260
6445
  }
6261
6446
  </td>
6262
6447
  }
@@ -6296,7 +6481,7 @@ class ReportGridBridgeComponent {
6296
6481
  </div>
6297
6482
  }
6298
6483
  </div>
6299
- `, isInline: true, styles: [":host{display:block;width:100%;margin-top:16px;font-family:var(--rpt-font-family, inherit)}.rpt-grid-container{width:100%;min-height:480px;display:flex;flex-direction:column}:host ::ng-deep bways-grid{display:block;width:100%;height:480px;min-height:480px}:host ::ng-deep .ug-wrapper{height:100%!important;min-height:480px!important}:host ::ng-deep .ug-viewport{min-height:350px!important}.rpt-table-card{background:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-lg, 8px);box-shadow:var(--rpt-box-shadow, 0 1px 3px rgba(0, 0, 0, .05));overflow:hidden}.rpt-table-toolbar{padding:12px 16px;background-color:var(--rpt-color-surface, #f8fafc);border-bottom:1px solid var(--rpt-color-border, #cbd5e1);display:flex;align-items:center;justify-content:space-between}.rpt-table-title{font-size:var(--rpt-font-size-sm, .75rem);font-weight:600;color:var(--rpt-color-text-muted, #64748b);text-transform:uppercase;letter-spacing:.05em}.rpt-table-responsive{width:100%;overflow-x:auto}.rpt-table{width:100%;border-collapse:collapse;font-size:var(--rpt-font-size-base, .875rem);text-align:left}.rpt-th{background-color:var(--rpt-color-surface, #f8fafc);padding:10px 14px;font-weight:600;font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-text-muted, #475569);border-bottom:1px solid var(--rpt-color-border, #cbd5e1);white-space:nowrap;-webkit-user-select:none;user-select:none}.rpt-th.sortable{cursor:pointer}.rpt-th.sortable:hover{background-color:var(--rpt-color-surface-hover, #f1f5f9)}.rpt-th-content{display:flex;align-items:center;gap:4px}.rpt-sort-indicator{display:inline-flex;align-items:center;color:var(--rpt-color-primary, #2563eb)}.rpt-th-num,.rpt-td-num{width:48px;text-align:center;color:var(--rpt-color-text-muted, #94a3b8);font-size:var(--rpt-font-size-sm, .75rem)}.rpt-td{padding:10px 14px;border-bottom:1px solid var(--rpt-color-border, #e2e8f0);color:var(--rpt-color-text, #1e293b)}.rpt-tr:hover{background-color:var(--rpt-color-surface-hover, #f8fafc)}.rpt-tr.is-clickable{cursor:pointer}.rpt-tr.is-clickable:hover{background-color:#f1f5f9}.rpt-td.is-clickable-cell{cursor:pointer}.rpt-cell-action-link{color:var(--rpt-color-primary, #2563eb);font-weight:600;text-decoration:underline;text-underline-offset:2px;cursor:pointer;transition:color .15s ease}.rpt-cell-action-link:hover{color:var(--rpt-color-primary-hover, #1d4ed8)}.rpt-empty-message{text-align:center;padding:40px 20px;color:var(--rpt-color-text-muted, #94a3b8);font-style:italic}.rpt-tfoot-row{background-color:var(--rpt-color-surface, #f8fafc);border-top:2px solid var(--rpt-color-border, #cbd5e1)}.rpt-td-aggregate{padding:10px 14px;color:var(--rpt-color-text, #0f172a);font-size:var(--rpt-font-size-sm, .75rem)}.rpt-pagination-bar{display:flex;justify-content:space-between;align-items:center;padding:12px 16px;border-top:1px solid var(--rpt-color-border, #e2e8f0);background-color:var(--rpt-color-surface, #f8fafc)}.rpt-page-info{font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-text-muted, #64748b)}.rpt-page-buttons{display:flex;gap:8px}.rpt-page-btn{display:inline-flex;align-items:center;gap:5px;padding:4px 10px;font-size:var(--rpt-font-size-sm, .75rem);background-color:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-sm, 4px);cursor:pointer;transition:all var(--rpt-transition-speed, .15s) ease}.rpt-page-btn:hover:not(:disabled){background-color:var(--rpt-color-surface-hover, #f1f5f9);border-color:var(--rpt-color-border-hover, #94a3b8)}.rpt-page-btn:disabled{opacity:.5;cursor:not-allowed}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1$1.UpperCasePipe, name: "uppercase" }, { kind: "component", type: RptIconComponent, selector: "rpt-icon", inputs: ["name", "size", "color", "strokeWidth"] }, { kind: "directive", type: RptGridOutletDirective, selector: "[rptGridOutlet]", inputs: ["rptGridOutlet", "inputs"], outputs: ["gridStateChange", "columnDefsChange", "rowClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
6484
+ `, isInline: true, styles: [":host{display:block;width:100%;margin-top:16px;font-family:var(--rpt-font-family, inherit)}.rpt-grid-container{width:100%;min-height:480px;display:flex;flex-direction:column}:host ::ng-deep bways-grid{display:block;width:100%;height:480px;min-height:480px;--ug-footer-bg: var(--rpt-color-surface, #f8fafc);--ug-footer-color: var(--rpt-color-text-secondary, #334155);--ug-header-color: var(--rpt-color-text, #0f172a);--ug-border-color: var(--rpt-color-border, #cbd5e1);--ug-font-family: var(--rpt-font-family, inherit);--ug-font-size: var(--rpt-font-size-sm, .75rem);--ug-header-font-weight: 600}:host ::ng-deep .ug-wrapper{height:100%!important;min-height:480px!important}:host ::ng-deep .ug-viewport{min-height:350px!important}:host ::ng-deep .ug-bottom-bar,:host ::ng-deep ug-pagination{background-color:var(--rpt-color-surface, #f8fafc)!important;border-top:1px solid var(--rpt-color-border, #cbd5e1)!important;color:var(--rpt-color-text-muted, #64748b)!important;font-family:var(--rpt-font-family, inherit)!important;font-size:var(--rpt-font-size-sm, .75rem)!important}:host ::ng-deep .ug-status-bar-content,:host ::ng-deep .ug-pagination-info,:host ::ng-deep .ug-page-info{font-family:var(--rpt-font-family, inherit)!important;font-size:var(--rpt-font-size-sm, .75rem)!important;font-weight:500!important;color:var(--rpt-color-text-muted, #64748b)!important;font-variant-numeric:tabular-nums!important}:host ::ng-deep .ug-page-size{font-family:var(--rpt-font-family, inherit)!important;font-size:var(--rpt-font-size-sm, .75rem)!important;font-weight:500!important;color:var(--rpt-color-text-muted, #64748b)!important}:host ::ng-deep .ug-page-size select{font-family:var(--rpt-font-family, inherit)!important;font-size:var(--rpt-font-size-sm, .75rem)!important;color:var(--rpt-color-text, #0f172a)!important;border-color:var(--rpt-color-border, #cbd5e1)!important;background-color:var(--rpt-color-surface, #ffffff)!important;border-radius:var(--rpt-border-radius-sm, 4px)!important}:host ::ng-deep .ug-total-row{background-color:var(--rpt-color-surface, #f8fafc)!important;border-top:1px solid var(--rpt-color-border, #cbd5e1)!important;border-bottom:2px solid var(--rpt-color-border, #cbd5e1)!important;font-family:var(--rpt-font-family, inherit)!important;font-size:var(--rpt-font-size-sm, .75rem)!important;font-weight:600!important;color:var(--rpt-color-text, #0f172a)!important;font-variant-numeric:tabular-nums!important}:host ::ng-deep .ug-total-row-label{font-family:var(--rpt-font-family, inherit)!important;font-size:var(--rpt-font-size-xs, .6875rem)!important;font-weight:600!important;text-transform:uppercase!important;letter-spacing:.05em!important;color:var(--rpt-color-text-muted, #64748b)!important;background-color:var(--rpt-color-surface, #f8fafc)!important}:host ::ng-deep .ug-total-cell{font-family:var(--rpt-font-family, inherit)!important;font-size:var(--rpt-font-size-sm, .75rem)!important;font-weight:600!important;color:var(--rpt-color-text, #0f172a)!important;font-variant-numeric:tabular-nums!important}.rpt-table-card{background:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-lg, 8px);box-shadow:var(--rpt-box-shadow, 0 1px 3px rgba(0, 0, 0, .05));overflow:hidden}.rpt-table-toolbar{padding:12px 16px;background-color:var(--rpt-color-surface, #f8fafc);border-bottom:1px solid var(--rpt-color-border, #cbd5e1);display:flex;align-items:center;justify-content:space-between}.rpt-table-title{font-size:var(--rpt-font-size-sm, .75rem);font-weight:600;color:var(--rpt-color-text-muted, #64748b);text-transform:uppercase;letter-spacing:.05em}.rpt-table-responsive{width:100%;overflow-x:auto}.rpt-table{width:100%;border-collapse:collapse;font-size:var(--rpt-font-size-base, .875rem);text-align:left}.rpt-th{background-color:var(--rpt-color-surface, #f8fafc);padding:10px 14px;font-weight:600;font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-text-muted, #475569);border-bottom:1px solid var(--rpt-color-border, #cbd5e1);white-space:nowrap;-webkit-user-select:none;user-select:none}.rpt-th.sortable{cursor:pointer}.rpt-th.sortable:hover{background-color:var(--rpt-color-surface-hover, #f1f5f9)}.rpt-th-content{display:flex;align-items:center;gap:4px}.rpt-sort-indicator{display:inline-flex;align-items:center;color:var(--rpt-color-primary, #2563eb)}.rpt-th-num,.rpt-td-num{width:48px;text-align:center;color:var(--rpt-color-text-muted, #94a3b8);font-size:var(--rpt-font-size-sm, .75rem)}.rpt-th-cb,.rpt-td-cb{width:42px;min-width:42px;max-width:42px;text-align:center;padding:8px 10px}.rpt-checkbox{width:15px;height:15px;cursor:pointer;accent-color:var(--rpt-color-primary, #2563eb);border-radius:4px;vertical-align:middle;margin:0}.rpt-td{padding:10px 14px;border-bottom:1px solid var(--rpt-color-border, #e2e8f0);color:var(--rpt-color-text, #1e293b)}.rpt-tr:hover{background-color:var(--rpt-color-surface-hover, #f8fafc)}.rpt-tr.is-selected{background-color:#eff6ff}.rpt-tr.is-selected:hover{background-color:#dbeafe}.rpt-tr.is-clickable{cursor:pointer}.rpt-tr.is-clickable:hover{background-color:#f1f5f9}.rpt-td.is-clickable-cell{cursor:pointer}.rpt-cell-action-link{color:var(--rpt-color-primary, #2563eb);font-weight:600;text-decoration:underline;text-underline-offset:2px;cursor:pointer;transition:color .15s ease}.rpt-cell-action-link:hover{color:var(--rpt-color-primary-hover, #1d4ed8)}.rpt-empty-message{text-align:center;padding:40px 20px;color:var(--rpt-color-text-muted, #94a3b8);font-style:italic}.rpt-tfoot-row{background-color:var(--rpt-color-surface, #f8fafc);border-top:1px solid var(--rpt-color-border, #cbd5e1);border-bottom:2px solid var(--rpt-color-border, #cbd5e1)}.rpt-td-aggregate{padding:8px 14px;color:var(--rpt-color-text, #0f172a);font-size:var(--rpt-font-size-sm, .75rem);line-height:1.4}.rpt-aggregate-wrap{display:inline-flex;align-items:baseline;gap:6px}.rpt-aggregate-wrap.is-right{justify-content:flex-end;width:100%}.rpt-aggregate-wrap.is-center{justify-content:center;width:100%}.rpt-aggregate-label{font-size:var(--rpt-font-size-xs, .6875rem);font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--rpt-color-text-muted, #64748b)}.rpt-aggregate-value{font-size:var(--rpt-font-size-sm, .75rem);font-weight:600;color:var(--rpt-color-text, #0f172a);font-variant-numeric:tabular-nums;font-feature-settings:\"tnum\"}.rpt-pagination-bar{display:flex;justify-content:space-between;align-items:center;padding:10px 16px;border-top:1px solid var(--rpt-color-border-subtle, #e2e8f0);background-color:var(--rpt-color-surface, #f8fafc)}.rpt-page-info{font-size:var(--rpt-font-size-sm, .75rem);font-weight:500;color:var(--rpt-color-text-muted, #64748b);font-variant-numeric:tabular-nums}.rpt-page-buttons{display:flex;gap:8px}.rpt-page-btn{display:inline-flex;align-items:center;gap:5px;padding:4px 10px;font-size:var(--rpt-font-size-sm, .75rem);font-weight:500;color:var(--rpt-color-text-secondary, #334155);background-color:var(--rpt-color-surface, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-sm, 4px);cursor:pointer;transition:all var(--rpt-transition-speed, .15s) ease}.rpt-page-btn:hover:not(:disabled){background-color:var(--rpt-color-surface-hover, #f1f5f9);border-color:var(--rpt-color-border-hover, #94a3b8);color:var(--rpt-color-text, #0f172a)}.rpt-page-btn:disabled{opacity:.5;cursor:not-allowed}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: RptIconComponent, selector: "rpt-icon", inputs: ["name", "size", "color", "strokeWidth"] }, { kind: "directive", type: RptGridOutletDirective, selector: "[rptGridOutlet]", inputs: ["rptGridOutlet", "inputs"], outputs: ["gridStateChange", "columnDefsChange", "rowClick", "selectionChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
6300
6485
  }
6301
6486
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportGridBridgeComponent, decorators: [{
6302
6487
  type: Component,
@@ -6310,6 +6495,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
6310
6495
  (gridStateChange)="gridStateChange.emit($event)"
6311
6496
  (columnDefsChange)="columnDefsChange.emit($event)"
6312
6497
  (rowClick)="rowClick.emit($event)"
6498
+ (selectionChange)="onSelectionChange($event)"
6313
6499
  />
6314
6500
  } @else {
6315
6501
  <!-- Built-in fallback table when no external grid is provided -->
@@ -6325,6 +6511,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
6325
6511
  @if (showRowNumbers()) {
6326
6512
  <th class="rpt-th rpt-th-num">#</th>
6327
6513
  }
6514
+ @if (isSelectionEnabled()) {
6515
+ <th class="rpt-th rpt-th-cb">
6516
+ @if (effectiveRowSelection() !== 'single' && isHeaderCheckboxSelectionEnabled()) {
6517
+ <input
6518
+ type="checkbox"
6519
+ class="rpt-checkbox"
6520
+ [checked]="isAllSelected()"
6521
+ [indeterminate]="isPartiallySelected()"
6522
+ (change)="toggleSelectAll($event)"
6523
+ title="Select all rows"
6524
+ />
6525
+ }
6526
+ </th>
6527
+ }
6328
6528
  @for (col of visibleColumns(); track col.field) {
6329
6529
  <th
6330
6530
  class="rpt-th"
@@ -6356,12 +6556,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
6356
6556
  @for (row of paginatedData(); track $index) {
6357
6557
  <tr
6358
6558
  class="rpt-tr"
6359
- [class.is-clickable]="hasRowClickAction()"
6559
+ [class.is-clickable]="hasRowClickAction() || isSelectionEnabled()"
6560
+ [class.is-selected]="isRowSelected(row)"
6360
6561
  (click)="onRowClick(row, $event)"
6361
6562
  >
6362
6563
  @if (showRowNumbers()) {
6363
6564
  <td class="rpt-td rpt-td-num">{{ (currentPage() - 1) * pageSize() + $index + 1 }}</td>
6364
6565
  }
6566
+ @if (isSelectionEnabled()) {
6567
+ <td class="rpt-td rpt-td-cb" (click)="$event.stopPropagation()">
6568
+ <input
6569
+ [type]="effectiveRowSelection() === 'single' ? 'radio' : 'checkbox'"
6570
+ name="rpt-fallback-selection"
6571
+ class="rpt-checkbox"
6572
+ [checked]="isRowSelected(row)"
6573
+ (change)="toggleRowSelection(row, $event)"
6574
+ />
6575
+ </td>
6576
+ }
6365
6577
  @for (col of visibleColumns(); track col.field) {
6366
6578
  <td
6367
6579
  class="rpt-td"
@@ -6386,10 +6598,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
6386
6598
  @if (showRowNumbers()) {
6387
6599
  <td class="rpt-td-num"></td>
6388
6600
  }
6601
+ @if (isSelectionEnabled()) {
6602
+ <td class="rpt-td-cb"></td>
6603
+ }
6389
6604
  @for (col of visibleColumns(); track col.field) {
6390
6605
  <td class="rpt-td-aggregate" [style.text-align]="col.align || 'left'">
6391
6606
  @if (col.aggregate && col.aggregate !== 'none') {
6392
- <strong>{{ col.aggregate | uppercase }}: {{ computeAggregate(col) }}</strong>
6607
+ <div class="rpt-aggregate-wrap" [class.is-right]="col.align === 'right'" [class.is-center]="col.align === 'center'">
6608
+ <span class="rpt-aggregate-label">{{ col.aggregate }}</span>
6609
+ <span class="rpt-aggregate-value">{{ computeAggregate(col) }}</span>
6610
+ </div>
6393
6611
  }
6394
6612
  </td>
6395
6613
  }
@@ -6429,7 +6647,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
6429
6647
  </div>
6430
6648
  }
6431
6649
  </div>
6432
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;width:100%;margin-top:16px;font-family:var(--rpt-font-family, inherit)}.rpt-grid-container{width:100%;min-height:480px;display:flex;flex-direction:column}:host ::ng-deep bways-grid{display:block;width:100%;height:480px;min-height:480px}:host ::ng-deep .ug-wrapper{height:100%!important;min-height:480px!important}:host ::ng-deep .ug-viewport{min-height:350px!important}.rpt-table-card{background:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-lg, 8px);box-shadow:var(--rpt-box-shadow, 0 1px 3px rgba(0, 0, 0, .05));overflow:hidden}.rpt-table-toolbar{padding:12px 16px;background-color:var(--rpt-color-surface, #f8fafc);border-bottom:1px solid var(--rpt-color-border, #cbd5e1);display:flex;align-items:center;justify-content:space-between}.rpt-table-title{font-size:var(--rpt-font-size-sm, .75rem);font-weight:600;color:var(--rpt-color-text-muted, #64748b);text-transform:uppercase;letter-spacing:.05em}.rpt-table-responsive{width:100%;overflow-x:auto}.rpt-table{width:100%;border-collapse:collapse;font-size:var(--rpt-font-size-base, .875rem);text-align:left}.rpt-th{background-color:var(--rpt-color-surface, #f8fafc);padding:10px 14px;font-weight:600;font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-text-muted, #475569);border-bottom:1px solid var(--rpt-color-border, #cbd5e1);white-space:nowrap;-webkit-user-select:none;user-select:none}.rpt-th.sortable{cursor:pointer}.rpt-th.sortable:hover{background-color:var(--rpt-color-surface-hover, #f1f5f9)}.rpt-th-content{display:flex;align-items:center;gap:4px}.rpt-sort-indicator{display:inline-flex;align-items:center;color:var(--rpt-color-primary, #2563eb)}.rpt-th-num,.rpt-td-num{width:48px;text-align:center;color:var(--rpt-color-text-muted, #94a3b8);font-size:var(--rpt-font-size-sm, .75rem)}.rpt-td{padding:10px 14px;border-bottom:1px solid var(--rpt-color-border, #e2e8f0);color:var(--rpt-color-text, #1e293b)}.rpt-tr:hover{background-color:var(--rpt-color-surface-hover, #f8fafc)}.rpt-tr.is-clickable{cursor:pointer}.rpt-tr.is-clickable:hover{background-color:#f1f5f9}.rpt-td.is-clickable-cell{cursor:pointer}.rpt-cell-action-link{color:var(--rpt-color-primary, #2563eb);font-weight:600;text-decoration:underline;text-underline-offset:2px;cursor:pointer;transition:color .15s ease}.rpt-cell-action-link:hover{color:var(--rpt-color-primary-hover, #1d4ed8)}.rpt-empty-message{text-align:center;padding:40px 20px;color:var(--rpt-color-text-muted, #94a3b8);font-style:italic}.rpt-tfoot-row{background-color:var(--rpt-color-surface, #f8fafc);border-top:2px solid var(--rpt-color-border, #cbd5e1)}.rpt-td-aggregate{padding:10px 14px;color:var(--rpt-color-text, #0f172a);font-size:var(--rpt-font-size-sm, .75rem)}.rpt-pagination-bar{display:flex;justify-content:space-between;align-items:center;padding:12px 16px;border-top:1px solid var(--rpt-color-border, #e2e8f0);background-color:var(--rpt-color-surface, #f8fafc)}.rpt-page-info{font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-text-muted, #64748b)}.rpt-page-buttons{display:flex;gap:8px}.rpt-page-btn{display:inline-flex;align-items:center;gap:5px;padding:4px 10px;font-size:var(--rpt-font-size-sm, .75rem);background-color:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-sm, 4px);cursor:pointer;transition:all var(--rpt-transition-speed, .15s) ease}.rpt-page-btn:hover:not(:disabled){background-color:var(--rpt-color-surface-hover, #f1f5f9);border-color:var(--rpt-color-border-hover, #94a3b8)}.rpt-page-btn:disabled{opacity:.5;cursor:not-allowed}\n"] }]
6650
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;width:100%;margin-top:16px;font-family:var(--rpt-font-family, inherit)}.rpt-grid-container{width:100%;min-height:480px;display:flex;flex-direction:column}:host ::ng-deep bways-grid{display:block;width:100%;height:480px;min-height:480px;--ug-footer-bg: var(--rpt-color-surface, #f8fafc);--ug-footer-color: var(--rpt-color-text-secondary, #334155);--ug-header-color: var(--rpt-color-text, #0f172a);--ug-border-color: var(--rpt-color-border, #cbd5e1);--ug-font-family: var(--rpt-font-family, inherit);--ug-font-size: var(--rpt-font-size-sm, .75rem);--ug-header-font-weight: 600}:host ::ng-deep .ug-wrapper{height:100%!important;min-height:480px!important}:host ::ng-deep .ug-viewport{min-height:350px!important}:host ::ng-deep .ug-bottom-bar,:host ::ng-deep ug-pagination{background-color:var(--rpt-color-surface, #f8fafc)!important;border-top:1px solid var(--rpt-color-border, #cbd5e1)!important;color:var(--rpt-color-text-muted, #64748b)!important;font-family:var(--rpt-font-family, inherit)!important;font-size:var(--rpt-font-size-sm, .75rem)!important}:host ::ng-deep .ug-status-bar-content,:host ::ng-deep .ug-pagination-info,:host ::ng-deep .ug-page-info{font-family:var(--rpt-font-family, inherit)!important;font-size:var(--rpt-font-size-sm, .75rem)!important;font-weight:500!important;color:var(--rpt-color-text-muted, #64748b)!important;font-variant-numeric:tabular-nums!important}:host ::ng-deep .ug-page-size{font-family:var(--rpt-font-family, inherit)!important;font-size:var(--rpt-font-size-sm, .75rem)!important;font-weight:500!important;color:var(--rpt-color-text-muted, #64748b)!important}:host ::ng-deep .ug-page-size select{font-family:var(--rpt-font-family, inherit)!important;font-size:var(--rpt-font-size-sm, .75rem)!important;color:var(--rpt-color-text, #0f172a)!important;border-color:var(--rpt-color-border, #cbd5e1)!important;background-color:var(--rpt-color-surface, #ffffff)!important;border-radius:var(--rpt-border-radius-sm, 4px)!important}:host ::ng-deep .ug-total-row{background-color:var(--rpt-color-surface, #f8fafc)!important;border-top:1px solid var(--rpt-color-border, #cbd5e1)!important;border-bottom:2px solid var(--rpt-color-border, #cbd5e1)!important;font-family:var(--rpt-font-family, inherit)!important;font-size:var(--rpt-font-size-sm, .75rem)!important;font-weight:600!important;color:var(--rpt-color-text, #0f172a)!important;font-variant-numeric:tabular-nums!important}:host ::ng-deep .ug-total-row-label{font-family:var(--rpt-font-family, inherit)!important;font-size:var(--rpt-font-size-xs, .6875rem)!important;font-weight:600!important;text-transform:uppercase!important;letter-spacing:.05em!important;color:var(--rpt-color-text-muted, #64748b)!important;background-color:var(--rpt-color-surface, #f8fafc)!important}:host ::ng-deep .ug-total-cell{font-family:var(--rpt-font-family, inherit)!important;font-size:var(--rpt-font-size-sm, .75rem)!important;font-weight:600!important;color:var(--rpt-color-text, #0f172a)!important;font-variant-numeric:tabular-nums!important}.rpt-table-card{background:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-lg, 8px);box-shadow:var(--rpt-box-shadow, 0 1px 3px rgba(0, 0, 0, .05));overflow:hidden}.rpt-table-toolbar{padding:12px 16px;background-color:var(--rpt-color-surface, #f8fafc);border-bottom:1px solid var(--rpt-color-border, #cbd5e1);display:flex;align-items:center;justify-content:space-between}.rpt-table-title{font-size:var(--rpt-font-size-sm, .75rem);font-weight:600;color:var(--rpt-color-text-muted, #64748b);text-transform:uppercase;letter-spacing:.05em}.rpt-table-responsive{width:100%;overflow-x:auto}.rpt-table{width:100%;border-collapse:collapse;font-size:var(--rpt-font-size-base, .875rem);text-align:left}.rpt-th{background-color:var(--rpt-color-surface, #f8fafc);padding:10px 14px;font-weight:600;font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-text-muted, #475569);border-bottom:1px solid var(--rpt-color-border, #cbd5e1);white-space:nowrap;-webkit-user-select:none;user-select:none}.rpt-th.sortable{cursor:pointer}.rpt-th.sortable:hover{background-color:var(--rpt-color-surface-hover, #f1f5f9)}.rpt-th-content{display:flex;align-items:center;gap:4px}.rpt-sort-indicator{display:inline-flex;align-items:center;color:var(--rpt-color-primary, #2563eb)}.rpt-th-num,.rpt-td-num{width:48px;text-align:center;color:var(--rpt-color-text-muted, #94a3b8);font-size:var(--rpt-font-size-sm, .75rem)}.rpt-th-cb,.rpt-td-cb{width:42px;min-width:42px;max-width:42px;text-align:center;padding:8px 10px}.rpt-checkbox{width:15px;height:15px;cursor:pointer;accent-color:var(--rpt-color-primary, #2563eb);border-radius:4px;vertical-align:middle;margin:0}.rpt-td{padding:10px 14px;border-bottom:1px solid var(--rpt-color-border, #e2e8f0);color:var(--rpt-color-text, #1e293b)}.rpt-tr:hover{background-color:var(--rpt-color-surface-hover, #f8fafc)}.rpt-tr.is-selected{background-color:#eff6ff}.rpt-tr.is-selected:hover{background-color:#dbeafe}.rpt-tr.is-clickable{cursor:pointer}.rpt-tr.is-clickable:hover{background-color:#f1f5f9}.rpt-td.is-clickable-cell{cursor:pointer}.rpt-cell-action-link{color:var(--rpt-color-primary, #2563eb);font-weight:600;text-decoration:underline;text-underline-offset:2px;cursor:pointer;transition:color .15s ease}.rpt-cell-action-link:hover{color:var(--rpt-color-primary-hover, #1d4ed8)}.rpt-empty-message{text-align:center;padding:40px 20px;color:var(--rpt-color-text-muted, #94a3b8);font-style:italic}.rpt-tfoot-row{background-color:var(--rpt-color-surface, #f8fafc);border-top:1px solid var(--rpt-color-border, #cbd5e1);border-bottom:2px solid var(--rpt-color-border, #cbd5e1)}.rpt-td-aggregate{padding:8px 14px;color:var(--rpt-color-text, #0f172a);font-size:var(--rpt-font-size-sm, .75rem);line-height:1.4}.rpt-aggregate-wrap{display:inline-flex;align-items:baseline;gap:6px}.rpt-aggregate-wrap.is-right{justify-content:flex-end;width:100%}.rpt-aggregate-wrap.is-center{justify-content:center;width:100%}.rpt-aggregate-label{font-size:var(--rpt-font-size-xs, .6875rem);font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--rpt-color-text-muted, #64748b)}.rpt-aggregate-value{font-size:var(--rpt-font-size-sm, .75rem);font-weight:600;color:var(--rpt-color-text, #0f172a);font-variant-numeric:tabular-nums;font-feature-settings:\"tnum\"}.rpt-pagination-bar{display:flex;justify-content:space-between;align-items:center;padding:10px 16px;border-top:1px solid var(--rpt-color-border-subtle, #e2e8f0);background-color:var(--rpt-color-surface, #f8fafc)}.rpt-page-info{font-size:var(--rpt-font-size-sm, .75rem);font-weight:500;color:var(--rpt-color-text-muted, #64748b);font-variant-numeric:tabular-nums}.rpt-page-buttons{display:flex;gap:8px}.rpt-page-btn{display:inline-flex;align-items:center;gap:5px;padding:4px 10px;font-size:var(--rpt-font-size-sm, .75rem);font-weight:500;color:var(--rpt-color-text-secondary, #334155);background-color:var(--rpt-color-surface, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-sm, 4px);cursor:pointer;transition:all var(--rpt-transition-speed, .15s) ease}.rpt-page-btn:hover:not(:disabled){background-color:var(--rpt-color-surface-hover, #f1f5f9);border-color:var(--rpt-color-border-hover, #94a3b8);color:var(--rpt-color-text, #0f172a)}.rpt-page-btn:disabled{opacity:.5;cursor:not-allowed}\n"] }]
6433
6651
  }], ctorParameters: () => [] });
6434
6652
 
6435
6653
  /**
@@ -6604,6 +6822,8 @@ class DynamicRendererComponent {
6604
6822
  customActionTriggered = output();
6605
6823
  gridStateChanged = output();
6606
6824
  columnDefsChanged = output();
6825
+ selectionChange = output();
6826
+ selectionChanged = output();
6607
6827
  rowActionTriggered = output();
6608
6828
  form = computed(() => {
6609
6829
  return this.formBuilder.toFormGroup(this.definition().components, this.initialValues());
@@ -6822,8 +7042,12 @@ class DynamicRendererComponent {
6822
7042
  parameters: mappedParameters,
6823
7043
  });
6824
7044
  }
7045
+ onGridSelectionChange(rows) {
7046
+ this.selectionChange.emit(rows);
7047
+ this.selectionChanged.emit(rows);
7048
+ }
6825
7049
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DynamicRendererComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6826
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: DynamicRendererComponent, isStandalone: true, selector: "rpt-dynamic-renderer", inputs: { definition: { classPropertyName: "definition", publicName: "definition", isSignal: true, isRequired: true, transformFunction: null }, initialValues: { classPropertyName: "initialValues", publicName: "initialValues", isSignal: true, isRequired: false, transformFunction: null }, resultData: { classPropertyName: "resultData", publicName: "resultData", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { executeRequested: "executeRequested", resetRequested: "resetRequested", exportRequested: "exportRequested", printRequested: "printRequested", customActionTriggered: "customActionTriggered", gridStateChanged: "gridStateChanged", columnDefsChanged: "columnDefsChanged", rowActionTriggered: "rowActionTriggered" }, ngImport: i0, template: `
7050
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: DynamicRendererComponent, isStandalone: true, selector: "rpt-dynamic-renderer", inputs: { definition: { classPropertyName: "definition", publicName: "definition", isSignal: true, isRequired: true, transformFunction: null }, initialValues: { classPropertyName: "initialValues", publicName: "initialValues", isSignal: true, isRequired: false, transformFunction: null }, resultData: { classPropertyName: "resultData", publicName: "resultData", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { executeRequested: "executeRequested", resetRequested: "resetRequested", exportRequested: "exportRequested", printRequested: "printRequested", customActionTriggered: "customActionTriggered", gridStateChanged: "gridStateChanged", columnDefsChanged: "columnDefsChanged", selectionChange: "selectionChange", selectionChanged: "selectionChanged", rowActionTriggered: "rowActionTriggered" }, ngImport: i0, template: `
6827
7051
  <div
6828
7052
  class="rpt-renderer-root"
6829
7053
  [style.direction]="definition().layout.direction || 'ltr'"
@@ -6883,6 +7107,7 @@ class DynamicRendererComponent {
6883
7107
  (gridStateChange)="gridStateChanged.emit($event)"
6884
7108
  (columnDefsChange)="columnDefsChanged.emit($event)"
6885
7109
  (rowClick)="onGridRowClick($event)"
7110
+ (selectionChange)="onGridSelectionChange($event)"
6886
7111
  />
6887
7112
  </div>
6888
7113
  } @else {
@@ -6905,7 +7130,7 @@ class DynamicRendererComponent {
6905
7130
  }
6906
7131
  }
6907
7132
  </div>
6908
- `, isInline: true, styles: [":host{display:block;width:100%;box-sizing:border-box;font-family:var(--rpt-font-family, inherit)}.rpt-renderer-root{width:100%;box-sizing:border-box}.rpt-header{margin-bottom:20px}.rpt-title{font-size:var(--rpt-font-size-xl, 1.5rem);font-weight:700;color:var(--rpt-color-text, #0f172a);margin:0 0 6px;letter-spacing:-.02em}.rpt-description{font-size:var(--rpt-font-size-base, .875rem);color:var(--rpt-color-text-muted, #64748b);margin:0}.rpt-form{margin-bottom:24px}.rpt-layout-grid{display:grid;width:100%;align-items:stretch}.rpt-cell{box-sizing:border-box;min-width:0;display:flex;flex-direction:column;height:100%}.rpt-cell>*{width:100%;height:100%;flex:1;display:flex;flex-direction:column;min-height:0;box-sizing:border-box}.rpt-unregistered-placeholder{padding:8px 12px;font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-danger, #ef4444);background-color:var(--rpt-color-danger-bg, #fef2f2);border:1px dashed var(--rpt-color-danger, #ef4444);border-radius:var(--rpt-border-radius, 6px)}.rpt-grid-section{width:100%;margin-top:16px}.rpt-grid-initial-state{padding:12px 0}.grid-initial-card{border:2px dashed var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-xl, 12px);background:var(--rpt-color-surface, #ffffff);padding:48px 24px;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center;box-shadow:var(--rpt-box-shadow-xs, 0 1px 2px rgba(0, 0, 0, .04))}.grid-initial-icon{width:52px;height:52px;border-radius:12px;background:#eff6ff;color:var(--rpt-color-primary, #2563eb);display:flex;align-items:center;justify-content:center;margin-bottom:14px}.grid-initial-title{font-size:var(--rpt-font-size-md, 1rem);font-weight:700;color:var(--rpt-color-text, #0f172a);margin:0 0 6px}.grid-initial-desc{font-size:var(--rpt-font-size-sm, .8125rem);color:var(--rpt-color-text-muted, #64748b);max-width:460px;line-height:1.5;margin:0 0 20px}.btn-grid-initial-exec{padding:8px 20px;background:var(--rpt-color-primary, #2563eb);color:#fff;border:none;border-radius:var(--rpt-border-radius, 6px);font-size:var(--rpt-font-size-sm, .75rem);font-weight:600;cursor:pointer;box-shadow:0 1px 3px #2563eb33;transition:all var(--rpt-transition-speed, .15s) ease}.btn-grid-initial-exec:hover{background:var(--rpt-color-primary-hover, #1d4ed8);transform:translateY(-1px)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: ReportGridBridgeComponent, selector: "rpt-grid-bridge", inputs: ["gridDefinition", "data"], outputs: ["gridStateChange", "columnDefsChange", "rowClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
7133
+ `, isInline: true, styles: [":host{display:block;width:100%;box-sizing:border-box;font-family:var(--rpt-font-family, inherit)}.rpt-renderer-root{width:100%;box-sizing:border-box}.rpt-header{margin-bottom:20px}.rpt-title{font-size:var(--rpt-font-size-xl, 1.5rem);font-weight:700;color:var(--rpt-color-text, #0f172a);margin:0 0 6px;letter-spacing:-.02em}.rpt-description{font-size:var(--rpt-font-size-base, .875rem);color:var(--rpt-color-text-muted, #64748b);margin:0}.rpt-form{margin-bottom:24px}.rpt-layout-grid{display:grid;width:100%;align-items:stretch}.rpt-cell{box-sizing:border-box;min-width:0;display:flex;flex-direction:column;height:100%}.rpt-cell>*{width:100%;height:100%;flex:1;display:flex;flex-direction:column;min-height:0;box-sizing:border-box}.rpt-unregistered-placeholder{padding:8px 12px;font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-danger, #ef4444);background-color:var(--rpt-color-danger-bg, #fef2f2);border:1px dashed var(--rpt-color-danger, #ef4444);border-radius:var(--rpt-border-radius, 6px)}.rpt-grid-section{width:100%;margin-top:16px}.rpt-grid-initial-state{padding:12px 0}.grid-initial-card{border:2px dashed var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-xl, 12px);background:var(--rpt-color-surface, #ffffff);padding:48px 24px;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center;box-shadow:var(--rpt-box-shadow-xs, 0 1px 2px rgba(0, 0, 0, .04))}.grid-initial-icon{width:52px;height:52px;border-radius:12px;background:#eff6ff;color:var(--rpt-color-primary, #2563eb);display:flex;align-items:center;justify-content:center;margin-bottom:14px}.grid-initial-title{font-size:var(--rpt-font-size-md, 1rem);font-weight:700;color:var(--rpt-color-text, #0f172a);margin:0 0 6px}.grid-initial-desc{font-size:var(--rpt-font-size-sm, .8125rem);color:var(--rpt-color-text-muted, #64748b);max-width:460px;line-height:1.5;margin:0 0 20px}.btn-grid-initial-exec{padding:8px 20px;background:var(--rpt-color-primary, #2563eb);color:#fff;border:none;border-radius:var(--rpt-border-radius, 6px);font-size:var(--rpt-font-size-sm, .75rem);font-weight:600;cursor:pointer;box-shadow:0 1px 3px #2563eb33;transition:all var(--rpt-transition-speed, .15s) ease}.btn-grid-initial-exec:hover{background:var(--rpt-color-primary-hover, #1d4ed8);transform:translateY(-1px)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: ReportGridBridgeComponent, selector: "rpt-grid-bridge", inputs: ["gridDefinition", "data"], outputs: ["gridStateChange", "columnDefsChange", "rowClick", "selectionChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
6909
7134
  }
6910
7135
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DynamicRendererComponent, decorators: [{
6911
7136
  type: Component,
@@ -6969,6 +7194,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
6969
7194
  (gridStateChange)="gridStateChanged.emit($event)"
6970
7195
  (columnDefsChange)="columnDefsChanged.emit($event)"
6971
7196
  (rowClick)="onGridRowClick($event)"
7197
+ (selectionChange)="onGridSelectionChange($event)"
6972
7198
  />
6973
7199
  </div>
6974
7200
  } @else {
@@ -7026,18 +7252,10 @@ class ReportExecutionService {
7026
7252
  flattenedFormValues[`${k}_to`] = obj['to'];
7027
7253
  flattenedFormValues[`${k}From`] = obj['from'];
7028
7254
  flattenedFormValues[`${k}To`] = obj['to'];
7029
- flattenedFormValues[`@${k}_from`] = obj['from'];
7030
- flattenedFormValues[`@${k}_to`] = obj['to'];
7031
- flattenedFormValues[`@${k}From`] = obj['from'];
7032
- flattenedFormValues[`@${k}To`] = obj['to'];
7033
7255
  if (!flattenedFormValues['fromDate'])
7034
7256
  flattenedFormValues['fromDate'] = obj['from'];
7035
7257
  if (!flattenedFormValues['toDate'])
7036
7258
  flattenedFormValues['toDate'] = obj['to'];
7037
- if (!flattenedFormValues['@fromDate'])
7038
- flattenedFormValues['@fromDate'] = obj['from'];
7039
- if (!flattenedFormValues['@toDate'])
7040
- flattenedFormValues['@toDate'] = obj['to'];
7041
7259
  }
7042
7260
  }
7043
7261
  }
@@ -7067,6 +7285,8 @@ class ReportRuntimeComponent {
7067
7285
  customActionTriggered = output();
7068
7286
  gridStateChange = output();
7069
7287
  columnDefsChange = output();
7288
+ selectionChange = output();
7289
+ selectionChanged = output();
7070
7290
  rowActionTriggered = output();
7071
7291
  drilldownRequested = output();
7072
7292
  internalDefinition = signal(null);
@@ -7189,6 +7409,10 @@ class ReportRuntimeComponent {
7189
7409
  onCustomAction(event) {
7190
7410
  this.customActionTriggered.emit(event);
7191
7411
  }
7412
+ onSelectionChange(rows) {
7413
+ this.selectionChange.emit(rows);
7414
+ this.selectionChanged.emit(rows);
7415
+ }
7192
7416
  onRowActionTriggered(event) {
7193
7417
  this.rowActionTriggered.emit(event);
7194
7418
  if (event.action.targetReportId) {
@@ -7309,7 +7533,7 @@ class ReportRuntimeComponent {
7309
7533
  }
7310
7534
  }
7311
7535
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportRuntimeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
7312
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ReportRuntimeComponent, isStandalone: true, selector: "rpt-report-runtime, rpt-runtime", inputs: { reportId: { classPropertyName: "reportId", publicName: "reportId", isSignal: true, isRequired: false, transformFunction: null }, definition: { classPropertyName: "definition", publicName: "report", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { resetRequested: "resetRequested", exportRequested: "exportRequested", printRequested: "printRequested", customActionTriggered: "customActionTriggered", gridStateChange: "gridStateChange", columnDefsChange: "columnDefsChange", rowActionTriggered: "rowActionTriggered", drilldownRequested: "drilldownRequested" }, host: { listeners: { "window:keydown.escape": "onEscapePressed()" } }, ngImport: i0, template: `
7536
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ReportRuntimeComponent, isStandalone: true, selector: "rpt-report-runtime, rpt-runtime", inputs: { reportId: { classPropertyName: "reportId", publicName: "reportId", isSignal: true, isRequired: false, transformFunction: null }, definition: { classPropertyName: "definition", publicName: "report", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { resetRequested: "resetRequested", exportRequested: "exportRequested", printRequested: "printRequested", customActionTriggered: "customActionTriggered", gridStateChange: "gridStateChange", columnDefsChange: "columnDefsChange", selectionChange: "selectionChange", selectionChanged: "selectionChanged", rowActionTriggered: "rowActionTriggered", drilldownRequested: "drilldownRequested" }, host: { listeners: { "window:keydown.escape": "onEscapePressed()" } }, ngImport: i0, template: `
7313
7537
  <div class="rpt-runtime-container">
7314
7538
  @if (isLoading()) {
7315
7539
  <div class="rpt-state-card rpt-loading-state">
@@ -7335,6 +7559,7 @@ class ReportRuntimeComponent {
7335
7559
  (gridStateChanged)="gridStateChange.emit($event)"
7336
7560
  (columnDefsChanged)="columnDefsChange.emit($event)"
7337
7561
  (rowActionTriggered)="onRowActionTriggered($event)"
7562
+ (selectionChange)="onSelectionChange($event)"
7338
7563
  />
7339
7564
  } @else {
7340
7565
  <div class="rpt-state-card rpt-empty-state">
@@ -7410,7 +7635,7 @@ class ReportRuntimeComponent {
7410
7635
  </aside>
7411
7636
  }
7412
7637
  </div>
7413
- `, isInline: true, styles: [":host{display:block;width:100%;font-family:var(--rpt-font-family, inherit)}.rpt-runtime-container{width:100%;box-sizing:border-box;position:relative}.rpt-state-card{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:48px 24px;text-align:center;background:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-lg, 8px);margin:24px 0}.rpt-state-text{color:var(--rpt-color-text-muted, #64748b);font-size:var(--rpt-font-size-base, .875rem);margin:8px 0 0}.rpt-error-title{font-weight:600;color:var(--rpt-color-danger, #ef4444);margin:8px 0 0;font-size:var(--rpt-font-size-base, .875rem)}.rpt-spinner{width:36px;height:36px;border:3px solid var(--rpt-color-border, #cbd5e1);border-top-color:var(--rpt-color-primary, #2563eb);border-radius:50%;animation:rpt-spin .8s linear infinite}@keyframes rpt-spin{to{transform:rotate(360deg)}}.rpt-retry-btn{margin-top:16px;padding:6px 16px;font-size:var(--rpt-font-size-sm, .75rem);background-color:var(--rpt-color-primary, #2563eb);color:var(--rpt-color-text-inverse, #ffffff);border:none;border-radius:var(--rpt-border-radius, 6px);cursor:pointer;font-weight:500;transition:background .12s ease}.rpt-retry-btn:hover{background-color:#1d4ed8}.rpt-drawer-backdrop{position:fixed;inset:0;background:#0f172a73;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);z-index:1000;animation:rpt-fade-in .18s ease-out forwards}.rpt-drawer-panel{position:fixed;top:0;right:0;bottom:0;max-width:95vw;background:var(--rpt-color-surface, #ffffff);box-shadow:-12px 0 40px #0f172a29;z-index:1001;display:flex;flex-direction:column;animation:rpt-slide-in-right .24s cubic-bezier(.16,1,.3,1) forwards;overflow:hidden;border-left:1px solid var(--rpt-color-border-subtle, #e2e8f0)}:host-context([dir=\"rtl\"]) .rpt-drawer-panel{right:auto;left:0;box-shadow:8px 0 32px #0f172a33;animation-name:rpt-slide-in-left;border-left:none;border-right:1px solid var(--rpt-color-border, #cbd5e1)}@keyframes rpt-fade-in{0%{opacity:0}to{opacity:1}}@keyframes rpt-slide-in-right{0%{transform:translate(100%)}to{transform:translate(0)}}@keyframes rpt-slide-in-left{0%{transform:translate(-100%)}to{transform:translate(0)}}.rpt-drawer-header{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;padding:16px 20px;border-bottom:1px solid var(--rpt-color-border, #e2e8f0);background:#f8fafc;flex-shrink:0}.rpt-drawer-header-left{min-width:0;flex:1}.rpt-drawer-title-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.rpt-drawer-title{font-size:1.125rem;font-weight:700;color:#0f172a;margin:0;line-height:1.3}.rpt-drawer-badge{display:inline-flex;align-items:center;padding:2px 8px;font-size:.725rem;font-weight:600;background:#eff6ff;color:#2563eb;border:1px solid #bfdbfe;border-radius:9999px;white-space:nowrap;max-width:300px;overflow:hidden;text-overflow:ellipsis}.rpt-drawer-desc{font-size:.8rem;color:#64748b;margin:4px 0 0}.rpt-drawer-close-btn{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;border:1px solid transparent;border-radius:6px;background:transparent;color:#64748b;font-size:1.125rem;cursor:pointer;transition:all .12s ease;flex-shrink:0}.rpt-drawer-close-btn:hover{background:#e2e8f0;color:#0f172a}.rpt-drawer-body{flex:1;overflow-y:auto;overflow-x:hidden;padding:8px 12px}.rpt-drawer-loading{margin:48px auto;max-width:400px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: DynamicRendererComponent, selector: "rpt-dynamic-renderer", inputs: ["definition", "initialValues", "resultData"], outputs: ["executeRequested", "resetRequested", "exportRequested", "printRequested", "customActionTriggered", "gridStateChanged", "columnDefsChanged", "rowActionTriggered"] }, { kind: "component", type: RptIconComponent, selector: "rpt-icon", inputs: ["name", "size", "color", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
7638
+ `, isInline: true, styles: [":host{display:block;width:100%;font-family:var(--rpt-font-family, inherit)}.rpt-runtime-container{width:100%;box-sizing:border-box;position:relative}.rpt-state-card{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:48px 24px;text-align:center;background:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-lg, 8px);margin:24px 0}.rpt-state-text{color:var(--rpt-color-text-muted, #64748b);font-size:var(--rpt-font-size-base, .875rem);margin:8px 0 0}.rpt-error-title{font-weight:600;color:var(--rpt-color-danger, #ef4444);margin:8px 0 0;font-size:var(--rpt-font-size-base, .875rem)}.rpt-spinner{width:36px;height:36px;border:3px solid var(--rpt-color-border, #cbd5e1);border-top-color:var(--rpt-color-primary, #2563eb);border-radius:50%;animation:rpt-spin .8s linear infinite}@keyframes rpt-spin{to{transform:rotate(360deg)}}.rpt-retry-btn{margin-top:16px;padding:6px 16px;font-size:var(--rpt-font-size-sm, .75rem);background-color:var(--rpt-color-primary, #2563eb);color:var(--rpt-color-text-inverse, #ffffff);border:none;border-radius:var(--rpt-border-radius, 6px);cursor:pointer;font-weight:500;transition:background .12s ease}.rpt-retry-btn:hover{background-color:#1d4ed8}.rpt-drawer-backdrop{position:fixed;inset:0;background:#0f172a73;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);z-index:1000;animation:rpt-fade-in .18s ease-out forwards}.rpt-drawer-panel{position:fixed;top:0;right:0;bottom:0;max-width:95vw;background:var(--rpt-color-surface, #ffffff);box-shadow:-12px 0 40px #0f172a29;z-index:1001;display:flex;flex-direction:column;animation:rpt-slide-in-right .24s cubic-bezier(.16,1,.3,1) forwards;overflow:hidden;border-left:1px solid var(--rpt-color-border-subtle, #e2e8f0)}:host-context([dir=\"rtl\"]) .rpt-drawer-panel{right:auto;left:0;box-shadow:8px 0 32px #0f172a33;animation-name:rpt-slide-in-left;border-left:none;border-right:1px solid var(--rpt-color-border, #cbd5e1)}@keyframes rpt-fade-in{0%{opacity:0}to{opacity:1}}@keyframes rpt-slide-in-right{0%{transform:translate(100%)}to{transform:translate(0)}}@keyframes rpt-slide-in-left{0%{transform:translate(-100%)}to{transform:translate(0)}}.rpt-drawer-header{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;padding:16px 20px;border-bottom:1px solid var(--rpt-color-border, #e2e8f0);background:#f8fafc;flex-shrink:0}.rpt-drawer-header-left{min-width:0;flex:1}.rpt-drawer-title-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.rpt-drawer-title{font-size:1.125rem;font-weight:700;color:#0f172a;margin:0;line-height:1.3}.rpt-drawer-badge{display:inline-flex;align-items:center;padding:2px 8px;font-size:.725rem;font-weight:600;background:#eff6ff;color:#2563eb;border:1px solid #bfdbfe;border-radius:9999px;white-space:nowrap;max-width:300px;overflow:hidden;text-overflow:ellipsis}.rpt-drawer-desc{font-size:.8rem;color:#64748b;margin:4px 0 0}.rpt-drawer-close-btn{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;border:1px solid transparent;border-radius:6px;background:transparent;color:#64748b;font-size:1.125rem;cursor:pointer;transition:all .12s ease;flex-shrink:0}.rpt-drawer-close-btn:hover{background:#e2e8f0;color:#0f172a}.rpt-drawer-body{flex:1;overflow-y:auto;overflow-x:hidden;padding:8px 12px}.rpt-drawer-loading{margin:48px auto;max-width:400px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: DynamicRendererComponent, selector: "rpt-dynamic-renderer", inputs: ["definition", "initialValues", "resultData"], outputs: ["executeRequested", "resetRequested", "exportRequested", "printRequested", "customActionTriggered", "gridStateChanged", "columnDefsChanged", "selectionChange", "selectionChanged", "rowActionTriggered"] }, { kind: "component", type: RptIconComponent, selector: "rpt-icon", inputs: ["name", "size", "color", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
7414
7639
  }
7415
7640
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportRuntimeComponent, decorators: [{
7416
7641
  type: Component,
@@ -7440,6 +7665,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
7440
7665
  (gridStateChanged)="gridStateChange.emit($event)"
7441
7666
  (columnDefsChanged)="columnDefsChange.emit($event)"
7442
7667
  (rowActionTriggered)="onRowActionTriggered($event)"
7668
+ (selectionChange)="onSelectionChange($event)"
7443
7669
  />
7444
7670
  } @else {
7445
7671
  <div class="rpt-state-card rpt-empty-state">
@@ -7536,6 +7762,8 @@ class RptReportComponent {
7536
7762
  rowClick = output();
7537
7763
  dataLoaded = output();
7538
7764
  gridStateChange = output();
7765
+ selectionChange = output();
7766
+ selectionChanged = output();
7539
7767
  presetSaved = output();
7540
7768
  presetChange = output();
7541
7769
  exportRequested = output();
@@ -7584,6 +7812,10 @@ class RptReportComponent {
7584
7812
  this.latestGridState.set(state);
7585
7813
  this.gridStateChange.emit(state);
7586
7814
  }
7815
+ onSelectionChange(rows) {
7816
+ this.selectionChange.emit(rows);
7817
+ this.selectionChanged.emit(rows);
7818
+ }
7587
7819
  onSelectPreset(presetId) {
7588
7820
  this.activePresetId.set(presetId);
7589
7821
  if (presetId === 'default') {
@@ -7703,7 +7935,7 @@ class RptReportComponent {
7703
7935
  });
7704
7936
  }
7705
7937
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RptReportComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
7706
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: RptReportComponent, isStandalone: true, selector: "rpt-report, rpt-view", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, report: { classPropertyName: "report", publicName: "report", isSignal: true, isRequired: false, transformFunction: null }, parameters: { classPropertyName: "parameters", publicName: "parameters", isSignal: true, isRequired: false, transformFunction: null }, showExport: { classPropertyName: "showExport", publicName: "showExport", isSignal: true, isRequired: false, transformFunction: null }, enablePresets: { classPropertyName: "enablePresets", publicName: "enablePresets", isSignal: true, isRequired: false, transformFunction: null }, autoExecute: { classPropertyName: "autoExecute", publicName: "autoExecute", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { rowClick: "rowClick", dataLoaded: "dataLoaded", gridStateChange: "gridStateChange", presetSaved: "presetSaved", presetChange: "presetChange", exportRequested: "exportRequested", printRequested: "printRequested" }, viewQueries: [{ propertyName: "runtimeComponent", first: true, predicate: ReportRuntimeComponent, descendants: true, isSignal: true }], ngImport: i0, template: `
7938
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: RptReportComponent, isStandalone: true, selector: "rpt-report, rpt-view", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, report: { classPropertyName: "report", publicName: "report", isSignal: true, isRequired: false, transformFunction: null }, parameters: { classPropertyName: "parameters", publicName: "parameters", isSignal: true, isRequired: false, transformFunction: null }, showExport: { classPropertyName: "showExport", publicName: "showExport", isSignal: true, isRequired: false, transformFunction: null }, enablePresets: { classPropertyName: "enablePresets", publicName: "enablePresets", isSignal: true, isRequired: false, transformFunction: null }, autoExecute: { classPropertyName: "autoExecute", publicName: "autoExecute", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { rowClick: "rowClick", dataLoaded: "dataLoaded", gridStateChange: "gridStateChange", selectionChange: "selectionChange", selectionChanged: "selectionChanged", presetSaved: "presetSaved", presetChange: "presetChange", exportRequested: "exportRequested", printRequested: "printRequested" }, viewQueries: [{ propertyName: "runtimeComponent", first: true, predicate: ReportRuntimeComponent, descendants: true, isSignal: true }], ngImport: i0, template: `
7707
7939
  <div class="rpt-facade-container">
7708
7940
  <!-- Top Action & Preset Bar -->
7709
7941
  @if (showToolbar()) {
@@ -7799,6 +8031,7 @@ class RptReportComponent {
7799
8031
  [report]="currentDefinition()"
7800
8032
  (rowActionTriggered)="onRowActionTriggered($event)"
7801
8033
  (gridStateChange)="onGridStateChanged($event)"
8034
+ (selectionChange)="onSelectionChange($event)"
7802
8035
  (exportRequested)="exportRequested.emit($event)"
7803
8036
  (printRequested)="printRequested.emit($event)"
7804
8037
  />
@@ -7874,7 +8107,7 @@ class RptReportComponent {
7874
8107
  </div>
7875
8108
  }
7876
8109
  </div>
7877
- `, isInline: true, styles: [":host{display:block;width:100%;box-sizing:border-box;font-family:var(--rpt-font-family, inherit)}.rpt-facade-container{width:100%;position:relative}.rpt-facade-toolbar{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 16px;background:#fff;border:1px solid var(--rpt-color-border-subtle, #e2e8f0);border-radius:var(--rpt-border-radius-lg, 8px);box-shadow:var(--rpt-box-shadow-xs, 0 1px 2px rgba(0, 0, 0, .04));margin-bottom:14px;flex-wrap:wrap}.rpt-toolbar-left,.rpt-toolbar-right{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.rpt-report-title-badge{display:inline-flex;align-items:center;gap:6px;font-size:.875rem;font-weight:700;color:#0f172a;padding-right:4px}.rpt-title-dot{width:8px;height:8px;border-radius:50%;background:var(--rpt-color-primary, #2563eb)}.rpt-record-count-chip{display:inline-flex;align-items:center;gap:5px;background:#f1f5f9;color:#475569;font-size:.725rem;font-weight:600;padding:3px 8px;border-radius:var(--rpt-border-radius-full, 9999px);border:1px solid #e2e8f0}.rpt-chip-dot{width:6px;height:6px;border-radius:50%;background:#10b981}.rpt-preset-control{display:flex;align-items:center;gap:6px;background:#f8fafc;padding:3px 6px;border-radius:var(--rpt-border-radius, 6px);border:1px solid #e2e8f0}.rpt-preset-label{display:inline-flex;align-items:center;gap:4px;font-size:.725rem;font-weight:600;color:#64748b}.rpt-preset-select{border:1px solid #cbd5e1;border-radius:var(--rpt-border-radius-sm, 4px);padding:3px 8px;font-size:.75rem;font-weight:500;color:#0f172a;background:#fff;outline:none;cursor:pointer;transition:border-color var(--rpt-transition-speed, .15s) ease}.rpt-preset-select:focus{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 0 0 2px var(--rpt-color-primary-focus, rgba(37, 99, 235, .25))}.rpt-btn-save-view{display:inline-flex;align-items:center;gap:4px;background:var(--rpt-color-primary-light, #eff6ff);border:1px solid #bfdbfe;color:var(--rpt-color-primary, #2563eb);font-size:.725rem;font-weight:600;padding:3px 8px;border-radius:var(--rpt-border-radius-sm, 4px);cursor:pointer;transition:all var(--rpt-transition-speed, .15s) ease}.rpt-btn-save-view:hover{background:#dbeafe;border-color:#93c5fd}.rpt-export-btn{display:inline-flex;align-items:center;gap:5px;border-radius:var(--rpt-border-radius, 6px);padding:5px 12px;font-size:.75rem;font-weight:600;cursor:pointer;transition:all var(--rpt-transition-speed, .15s) ease}.rpt-export-btn:disabled{opacity:.45;cursor:not-allowed}.rpt-export-excel{background:#f0fdf4;border:1px solid #bbf7d0;color:#15803d}.rpt-export-excel:hover:not(:disabled){background:#dcfce7;border-color:#86efac}.rpt-export-csv{background:#f8fafc;border:1px solid #cbd5e1;color:#334155}.rpt-export-csv:hover:not(:disabled){background:#f1f5f9;border-color:#94a3b8;color:#0f172a}.rpt-export-print{background:#eef2ff;border:1px solid #c7d2fe;color:#4338ca}.rpt-export-print:hover:not(:disabled){background:#e0e7ff;border-color:#a5b4fc}.rpt-modal-backdrop{position:fixed;inset:0;background:#0f172a73;backdrop-filter:blur(6px);z-index:1100}.rpt-modal-dialog{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);width:min(460px,92vw);background:#fff;border:1px solid #cbd5e1;border-radius:var(--rpt-border-radius-lg, 8px);box-shadow:0 20px 25px -5px #00000026,0 8px 10px -6px #0000001a;z-index:1101;display:flex;flex-direction:column;overflow:hidden;animation:rpt-modal-pop .16s cubic-bezier(.16,1,.3,1)}@keyframes rpt-modal-pop{0%{opacity:0;transform:translate(-50%,-46%) scale(.97)}to{opacity:1;transform:translate(-50%,-50%) scale(1)}}.rpt-modal-header{display:flex;align-items:center;justify-content:space-between;padding:14px 18px;border-bottom:1px solid #e2e8f0;background:#f8fafc}.rpt-modal-header-title{display:inline-flex;align-items:center;gap:8px;color:var(--rpt-color-primary, #2563eb)}.rpt-modal-title{font-size:.95rem;font-weight:700;color:#0f172a;margin:0}.rpt-modal-close{background:transparent;border:none;color:#64748b;font-size:1.1rem;cursor:pointer;width:28px;height:28px;display:flex;align-items:center;justify-content:center;border-radius:4px;transition:all .12s ease}.rpt-modal-close:hover{background:#e2e8f0;color:#0f172a}.rpt-modal-body{padding:18px}.rpt-modal-hint{font-size:.8rem;color:#64748b;margin:0 0 16px;line-height:1.45}.rpt-input-group{margin-bottom:16px}.rpt-field-label{display:block;font-size:.75rem;font-weight:600;color:#334155;margin-bottom:6px}.rpt-modal-input{width:100%;box-sizing:border-box;border:1px solid #cbd5e1;border-radius:var(--rpt-border-radius, 6px);padding:8px 12px;font-size:.85rem;outline:none;transition:all var(--rpt-transition-speed, .15s) ease}.rpt-modal-input:focus{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 0 0 3px var(--rpt-color-primary-focus, rgba(37, 99, 235, .25))}.rpt-existing-presets{border-top:1px solid #e2e8f0;padding-top:12px;margin-top:8px}.rpt-existing-label{display:block;font-size:.725rem;font-weight:600;color:#64748b;margin-bottom:8px;text-transform:uppercase;letter-spacing:.5px}.rpt-presets-list{max-height:140px;overflow-y:auto;display:flex;flex-direction:column;gap:6px}.rpt-preset-row{display:flex;align-items:center;justify-content:space-between;padding:6px 10px;background:#f8fafc;border:1px solid #e2e8f0;border-radius:4px}.rpt-preset-info{display:inline-flex;align-items:center;gap:8px}.rpt-preset-row-name{font-size:.775rem;font-weight:600;color:#1e293b}.rpt-preset-active-tag{font-size:.65rem;font-weight:600;background:#dbeafe;color:#1d4ed8;padding:1px 6px;border-radius:9999px}.rpt-btn-del-preset{background:transparent;border:none;color:#94a3b8;cursor:pointer;padding:4px;border-radius:4px;display:flex;align-items:center;justify-content:center;transition:all .12s ease}.rpt-btn-del-preset:hover{background:#fee2e2;color:#dc2626}.rpt-modal-footer{display:flex;align-items:center;justify-content:flex-end;gap:10px;padding:12px 18px;border-top:1px solid #e2e8f0;background:#f8fafc}.rpt-btn-cancel{background:#fff;border:1px solid #cbd5e1;border-radius:var(--rpt-border-radius, 6px);padding:6px 14px;font-size:.775rem;font-weight:500;color:#475569;cursor:pointer;transition:all .12s ease}.rpt-btn-cancel:hover{background:#f1f5f9;color:#0f172a}.rpt-btn-confirm{background:var(--rpt-color-primary, #2563eb);color:#fff;border:none;border-radius:var(--rpt-border-radius, 6px);padding:6px 16px;font-size:.775rem;font-weight:600;cursor:pointer;transition:all .12s ease}.rpt-btn-confirm:hover:not(:disabled){background:var(--rpt-color-primary-hover, #1d4ed8)}.rpt-btn-confirm:disabled{opacity:.5;cursor:not-allowed}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: ReportRuntimeComponent, selector: "rpt-report-runtime, rpt-runtime", inputs: ["reportId", "report"], outputs: ["resetRequested", "exportRequested", "printRequested", "customActionTriggered", "gridStateChange", "columnDefsChange", "rowActionTriggered", "drilldownRequested"] }, { kind: "component", type: RptIconComponent, selector: "rpt-icon", inputs: ["name", "size", "color", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
8110
+ `, isInline: true, styles: [":host{display:block;width:100%;box-sizing:border-box;font-family:var(--rpt-font-family, inherit)}.rpt-facade-container{width:100%;position:relative}.rpt-facade-toolbar{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 16px;background:#fff;border:1px solid var(--rpt-color-border-subtle, #e2e8f0);border-radius:var(--rpt-border-radius-lg, 8px);box-shadow:var(--rpt-box-shadow-xs, 0 1px 2px rgba(0, 0, 0, .04));margin-bottom:14px;flex-wrap:wrap}.rpt-toolbar-left,.rpt-toolbar-right{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.rpt-report-title-badge{display:inline-flex;align-items:center;gap:6px;font-size:.875rem;font-weight:700;color:#0f172a;padding-right:4px}.rpt-title-dot{width:8px;height:8px;border-radius:50%;background:var(--rpt-color-primary, #2563eb)}.rpt-record-count-chip{display:inline-flex;align-items:center;gap:5px;background:#f1f5f9;color:#475569;font-size:.725rem;font-weight:600;padding:3px 8px;border-radius:var(--rpt-border-radius-full, 9999px);border:1px solid #e2e8f0}.rpt-chip-dot{width:6px;height:6px;border-radius:50%;background:#10b981}.rpt-preset-control{display:flex;align-items:center;gap:6px;background:#f8fafc;padding:3px 6px;border-radius:var(--rpt-border-radius, 6px);border:1px solid #e2e8f0}.rpt-preset-label{display:inline-flex;align-items:center;gap:4px;font-size:.725rem;font-weight:600;color:#64748b}.rpt-preset-select{border:1px solid #cbd5e1;border-radius:var(--rpt-border-radius-sm, 4px);padding:3px 8px;font-size:.75rem;font-weight:500;color:#0f172a;background:#fff;outline:none;cursor:pointer;transition:border-color var(--rpt-transition-speed, .15s) ease}.rpt-preset-select:focus{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 0 0 2px var(--rpt-color-primary-focus, rgba(37, 99, 235, .25))}.rpt-btn-save-view{display:inline-flex;align-items:center;gap:4px;background:var(--rpt-color-primary-light, #eff6ff);border:1px solid #bfdbfe;color:var(--rpt-color-primary, #2563eb);font-size:.725rem;font-weight:600;padding:3px 8px;border-radius:var(--rpt-border-radius-sm, 4px);cursor:pointer;transition:all var(--rpt-transition-speed, .15s) ease}.rpt-btn-save-view:hover{background:#dbeafe;border-color:#93c5fd}.rpt-export-btn{display:inline-flex;align-items:center;gap:5px;border-radius:var(--rpt-border-radius, 6px);padding:5px 12px;font-size:.75rem;font-weight:600;cursor:pointer;transition:all var(--rpt-transition-speed, .15s) ease}.rpt-export-btn:disabled{opacity:.45;cursor:not-allowed}.rpt-export-excel{background:#f0fdf4;border:1px solid #bbf7d0;color:#15803d}.rpt-export-excel:hover:not(:disabled){background:#dcfce7;border-color:#86efac}.rpt-export-csv{background:#f8fafc;border:1px solid #cbd5e1;color:#334155}.rpt-export-csv:hover:not(:disabled){background:#f1f5f9;border-color:#94a3b8;color:#0f172a}.rpt-export-print{background:#eef2ff;border:1px solid #c7d2fe;color:#4338ca}.rpt-export-print:hover:not(:disabled){background:#e0e7ff;border-color:#a5b4fc}.rpt-modal-backdrop{position:fixed;inset:0;background:#0f172a73;backdrop-filter:blur(6px);z-index:1100}.rpt-modal-dialog{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);width:min(460px,92vw);background:#fff;border:1px solid #cbd5e1;border-radius:var(--rpt-border-radius-lg, 8px);box-shadow:0 20px 25px -5px #00000026,0 8px 10px -6px #0000001a;z-index:1101;display:flex;flex-direction:column;overflow:hidden;animation:rpt-modal-pop .16s cubic-bezier(.16,1,.3,1)}@keyframes rpt-modal-pop{0%{opacity:0;transform:translate(-50%,-46%) scale(.97)}to{opacity:1;transform:translate(-50%,-50%) scale(1)}}.rpt-modal-header{display:flex;align-items:center;justify-content:space-between;padding:14px 18px;border-bottom:1px solid #e2e8f0;background:#f8fafc}.rpt-modal-header-title{display:inline-flex;align-items:center;gap:8px;color:var(--rpt-color-primary, #2563eb)}.rpt-modal-title{font-size:.95rem;font-weight:700;color:#0f172a;margin:0}.rpt-modal-close{background:transparent;border:none;color:#64748b;font-size:1.1rem;cursor:pointer;width:28px;height:28px;display:flex;align-items:center;justify-content:center;border-radius:4px;transition:all .12s ease}.rpt-modal-close:hover{background:#e2e8f0;color:#0f172a}.rpt-modal-body{padding:18px}.rpt-modal-hint{font-size:.8rem;color:#64748b;margin:0 0 16px;line-height:1.45}.rpt-input-group{margin-bottom:16px}.rpt-field-label{display:block;font-size:.75rem;font-weight:600;color:#334155;margin-bottom:6px}.rpt-modal-input{width:100%;box-sizing:border-box;border:1px solid #cbd5e1;border-radius:var(--rpt-border-radius, 6px);padding:8px 12px;font-size:.85rem;outline:none;transition:all var(--rpt-transition-speed, .15s) ease}.rpt-modal-input:focus{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 0 0 3px var(--rpt-color-primary-focus, rgba(37, 99, 235, .25))}.rpt-existing-presets{border-top:1px solid #e2e8f0;padding-top:12px;margin-top:8px}.rpt-existing-label{display:block;font-size:.725rem;font-weight:600;color:#64748b;margin-bottom:8px;text-transform:uppercase;letter-spacing:.5px}.rpt-presets-list{max-height:140px;overflow-y:auto;display:flex;flex-direction:column;gap:6px}.rpt-preset-row{display:flex;align-items:center;justify-content:space-between;padding:6px 10px;background:#f8fafc;border:1px solid #e2e8f0;border-radius:4px}.rpt-preset-info{display:inline-flex;align-items:center;gap:8px}.rpt-preset-row-name{font-size:.775rem;font-weight:600;color:#1e293b}.rpt-preset-active-tag{font-size:.65rem;font-weight:600;background:#dbeafe;color:#1d4ed8;padding:1px 6px;border-radius:9999px}.rpt-btn-del-preset{background:transparent;border:none;color:#94a3b8;cursor:pointer;padding:4px;border-radius:4px;display:flex;align-items:center;justify-content:center;transition:all .12s ease}.rpt-btn-del-preset:hover{background:#fee2e2;color:#dc2626}.rpt-modal-footer{display:flex;align-items:center;justify-content:flex-end;gap:10px;padding:12px 18px;border-top:1px solid #e2e8f0;background:#f8fafc}.rpt-btn-cancel{background:#fff;border:1px solid #cbd5e1;border-radius:var(--rpt-border-radius, 6px);padding:6px 14px;font-size:.775rem;font-weight:500;color:#475569;cursor:pointer;transition:all .12s ease}.rpt-btn-cancel:hover{background:#f1f5f9;color:#0f172a}.rpt-btn-confirm{background:var(--rpt-color-primary, #2563eb);color:#fff;border:none;border-radius:var(--rpt-border-radius, 6px);padding:6px 16px;font-size:.775rem;font-weight:600;cursor:pointer;transition:all .12s ease}.rpt-btn-confirm:hover:not(:disabled){background:var(--rpt-color-primary-hover, #1d4ed8)}.rpt-btn-confirm:disabled{opacity:.5;cursor:not-allowed}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: ReportRuntimeComponent, selector: "rpt-report-runtime, rpt-runtime", inputs: ["reportId", "report"], outputs: ["resetRequested", "exportRequested", "printRequested", "customActionTriggered", "gridStateChange", "columnDefsChange", "selectionChange", "selectionChanged", "rowActionTriggered", "drilldownRequested"] }, { kind: "component", type: RptIconComponent, selector: "rpt-icon", inputs: ["name", "size", "color", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
7878
8111
  }
7879
8112
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RptReportComponent, decorators: [{
7880
8113
  type: Component,
@@ -7974,6 +8207,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
7974
8207
  [report]="currentDefinition()"
7975
8208
  (rowActionTriggered)="onRowActionTriggered($event)"
7976
8209
  (gridStateChange)="onGridStateChanged($event)"
8210
+ (selectionChange)="onSelectionChange($event)"
7977
8211
  (exportRequested)="exportRequested.emit($event)"
7978
8212
  (printRequested)="printRequested.emit($event)"
7979
8213
  />
@@ -8098,7 +8332,14 @@ class DesignerStateService {
8098
8332
  loadDefinition(def) {
8099
8333
  const cloned = JSON.parse(JSON.stringify(def));
8100
8334
  this.definition.set(cloned);
8101
- this.selectedComponentId.set(null);
8335
+ // Preserve active component selection if it still exists in the loaded definition
8336
+ const currentSelectedId = this.selectedComponentId();
8337
+ if (currentSelectedId && cloned.components.some((c) => c.id === currentSelectedId)) {
8338
+ this.selectedComponentId.set(currentSelectedId);
8339
+ }
8340
+ else {
8341
+ this.selectedComponentId.set(null);
8342
+ }
8102
8343
  this.isDirty.set(false);
8103
8344
  this.history.set([JSON.parse(JSON.stringify(cloned))]);
8104
8345
  this.historyIndex.set(0);
@@ -8369,6 +8610,10 @@ class DesignerToolbarComponent {
8369
8610
  canRedo = this.designerState.canRedo;
8370
8611
  isTemplatesModalOpen = signal(false);
8371
8612
  availableBlueprints = this.templateService.getTemplates();
8613
+ isLeftPanelCollapsed = input(false);
8614
+ isRightPanelCollapsed = input(false);
8615
+ toggleLeftPanel = output();
8616
+ toggleRightPanel = output();
8372
8617
  saveRequested = output();
8373
8618
  setMode(mode) {
8374
8619
  this.designerState.setViewMode(mode);
@@ -8406,6 +8651,9 @@ class DesignerToolbarComponent {
8406
8651
  pageSize: 25,
8407
8652
  showRowNumbers: true,
8408
8653
  showFooter: true,
8654
+ sideBar: true,
8655
+ globalSearch: true,
8656
+ statusBar: true,
8409
8657
  },
8410
8658
  };
8411
8659
  this.designerState.updateGridSettings(defaultGrid);
@@ -8427,10 +8675,22 @@ class DesignerToolbarComponent {
8427
8675
  downloadAnchor.remove();
8428
8676
  }
8429
8677
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DesignerToolbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
8430
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: DesignerToolbarComponent, isStandalone: true, selector: "rpt-designer-toolbar", outputs: { saveRequested: "saveRequested" }, ngImport: i0, template: `
8678
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: DesignerToolbarComponent, isStandalone: true, selector: "rpt-designer-toolbar", inputs: { isLeftPanelCollapsed: { classPropertyName: "isLeftPanelCollapsed", publicName: "isLeftPanelCollapsed", isSignal: true, isRequired: false, transformFunction: null }, isRightPanelCollapsed: { classPropertyName: "isRightPanelCollapsed", publicName: "isRightPanelCollapsed", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { toggleLeftPanel: "toggleLeftPanel", toggleRightPanel: "toggleRightPanel", saveRequested: "saveRequested" }, ngImport: i0, template: `
8431
8679
  <div class="toolbar-root">
8432
- <!-- Left: Title & Dirty indicator -->
8680
+ <!-- Left: Panel toggle, Title & Dirty indicator -->
8433
8681
  <div class="toolbar-left">
8682
+ @if (viewMode() === 'design') {
8683
+ <button
8684
+ type="button"
8685
+ class="tool-btn btn-panel-toggle"
8686
+ [class.active]="!isLeftPanelCollapsed()"
8687
+ (click)="toggleLeftPanel.emit()"
8688
+ [title]="isLeftPanelCollapsed() ? 'Show Component Palette (Ctrl+B)' : 'Hide Component Palette (Ctrl+B)'"
8689
+ [attr.aria-label]="isLeftPanelCollapsed() ? 'Show Component Palette (Ctrl+B)' : 'Hide Component Palette (Ctrl+B)'"
8690
+ >
8691
+ <rpt-icon name="panel-left" [size]="14" />
8692
+ </button>
8693
+ }
8434
8694
  <div class="report-identity">
8435
8695
  <span class="report-name">{{ definition().name || 'Untitled Report' }}</span>
8436
8696
  @if (isDirty()) {
@@ -8441,33 +8701,36 @@ class DesignerToolbarComponent {
8441
8701
 
8442
8702
  <!-- Center: Mode Switcher -->
8443
8703
  <div class="toolbar-center">
8444
- <div class="mode-pill-group">
8704
+ <div class="mode-pill-group" role="tablist" aria-label="Workbench View Mode">
8445
8705
  <button
8446
8706
  type="button"
8447
8707
  class="mode-btn"
8448
8708
  [class.active]="viewMode() === 'design'"
8449
8709
  (click)="setMode('design')"
8710
+ title="Visual Design Canvas"
8450
8711
  >
8451
8712
  <rpt-icon name="edit" [size]="14" />
8452
- <span>Design</span>
8713
+ <span class="mode-label">Design</span>
8453
8714
  </button>
8454
8715
  <button
8455
8716
  type="button"
8456
8717
  class="mode-btn"
8457
8718
  [class.active]="viewMode() === 'preview'"
8458
8719
  (click)="setMode('preview')"
8720
+ title="Live Runtime Preview"
8459
8721
  >
8460
8722
  <rpt-icon name="eye" [size]="14" />
8461
- <span>Live Preview</span>
8723
+ <span class="mode-label">Preview</span>
8462
8724
  </button>
8463
8725
  <button
8464
8726
  type="button"
8465
8727
  class="mode-btn"
8466
8728
  [class.active]="viewMode() === 'json'"
8467
8729
  (click)="setMode('json')"
8730
+ title="JSON Report Schema"
8468
8731
  >
8469
8732
  <rpt-icon name="code" [size]="14" />
8470
- <span>JSON Schema</span>
8733
+ <span class="mode-label">JSON</span>
8471
8734
  </button>
8472
8735
  </div>
8473
8736
  </div>
@@ -8495,6 +8758,19 @@ class DesignerToolbarComponent {
8495
8758
  </button>
8496
8759
  </div>
8497
8760
 
8761
+ @if (viewMode() === 'design') {
8762
+ <button
8763
+ type="button"
8764
+ class="tool-btn btn-panel-toggle"
8765
+ [class.active]="!isRightPanelCollapsed()"
8766
+ (click)="toggleRightPanel.emit()"
8767
+ [title]="isRightPanelCollapsed() ? 'Show Property Editor (Ctrl+Alt+B)' : 'Hide Property Editor (Ctrl+Alt+B)'"
8768
+ [attr.aria-label]="isRightPanelCollapsed() ? 'Show Property Editor (Ctrl+Alt+B)' : 'Hide Property Editor (Ctrl+Alt+B)'"
8769
+ >
8770
+ <rpt-icon name="panel-right" [size]="14" />
8771
+ </button>
8772
+ }
8773
+
8498
8774
  <div class="actions-divider"></div>
8499
8775
 
8500
8776
  <!-- 1-Click Blueprints Gallery Button -->
@@ -8505,7 +8781,7 @@ class DesignerToolbarComponent {
8505
8781
  title="Start from pre-configured enterprise blueprints"
8506
8782
  >
8507
8783
  <rpt-icon name="layers" [size]="14" />
8508
- <span>Blueprints</span>
8784
+ <span class="btn-label">Blueprints</span>
8509
8785
  </button>
8510
8786
 
8511
8787
  <!-- Add / Configure Grid Quick Button -->
@@ -8517,7 +8793,7 @@ class DesignerToolbarComponent {
8517
8793
  title="Attach a Result Data Grid (UltraGrid / Table) to this report"
8518
8794
  >
8519
8795
  <rpt-icon name="table" [size]="14" />
8520
- <span>+ Add Grid</span>
8796
+ <span class="btn-label">+ Add Grid</span>
8521
8797
  </button>
8522
8798
  } @else {
8523
8799
  <button
@@ -8527,7 +8803,7 @@ class DesignerToolbarComponent {
8527
8803
  title="Configure Result Data Grid columns and pagination"
8528
8804
  >
8529
8805
  <rpt-icon name="table" [size]="14" />
8530
- <span>Grid ({{ definition().grid?.columns?.length ?? 0 }})</span>
8806
+ <span class="btn-label">Grid ({{ definition().grid?.columns?.length ?? 0 }})</span>
8531
8807
  </button>
8532
8808
  }
8533
8809
 
@@ -8540,7 +8816,7 @@ class DesignerToolbarComponent {
8540
8816
  title="Download JSON Definition"
8541
8817
  >
8542
8818
  <rpt-icon name="download" [size]="14" />
8543
- <span>Export</span>
8819
+ <span class="btn-label">Export</span>
8544
8820
  </button>
8545
8821
 
8546
8822
  <button
@@ -8550,7 +8826,7 @@ class DesignerToolbarComponent {
8550
8826
  title="Save Report Definition"
8551
8827
  >
8552
8828
  <rpt-icon name="save" [size]="14" />
8553
- <span>Save Changes</span>
8829
+ <span class="btn-label">Save</span>
8554
8830
  </button>
8555
8831
  </div>
8556
8832
 
@@ -8587,14 +8863,26 @@ class DesignerToolbarComponent {
8587
8863
  </div>
8588
8864
  }
8589
8865
  </div>
8590
- `, isInline: true, styles: [":host{display:block;background:var(--rpt-color-surface, #ffffff);color:var(--rpt-color-text, #0f172a);height:56px;font-family:var(--rpt-font-family, inherit);border-bottom:1px solid var(--rpt-color-border, #cbd5e1);box-sizing:border-box;position:relative;box-shadow:0 1px 3px #0000000a;z-index:30}.toolbar-root{display:flex;align-items:center;justify-content:space-between;height:100%;padding:0 20px}.toolbar-left,.toolbar-right{display:flex;align-items:center;gap:12px;min-width:240px}.toolbar-right{justify-content:flex-end}.toolbar-center{display:flex;justify-content:center;flex:1}.report-identity{display:flex;align-items:center;gap:8px}.report-name{font-weight:600;font-size:.9rem;letter-spacing:-.01em;color:var(--rpt-color-text, #0f172a);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:280px}.dirty-badge{font-size:.65rem;font-weight:600;color:#b45309;background:#fef3c7;border:1px solid #fde68a;padding:1px 6px;border-radius:9999px;white-space:nowrap}.mode-pill-group{display:flex;background:#f1f5f9;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-lg, 8px);padding:3px;gap:2px}.mode-btn{display:inline-flex;align-items:center;gap:6px;padding:5px 12px;font-size:var(--rpt-font-size-sm, .75rem);font-weight:500;color:var(--rpt-color-text-muted, #64748b);background:transparent;border:none;border-radius:var(--rpt-border-radius, 6px);cursor:pointer;transition:all var(--rpt-transition-speed, .15s) ease}.mode-btn:hover{color:var(--rpt-color-text, #0f172a);background:#0000000a}.mode-btn.active{background:#fff;color:var(--rpt-color-primary, #2563eb);font-weight:600;box-shadow:0 1px 3px #00000014}.history-group{display:flex;gap:2px}.tool-btn{display:inline-flex;align-items:center;gap:6px;padding:6px 12px;font-size:var(--rpt-font-size-sm, .75rem);font-weight:500;color:var(--rpt-color-text-secondary, #334155);background:#fff;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);cursor:pointer;transition:all var(--rpt-transition-speed, .15s) ease}.tool-btn:hover:not(:disabled){background:var(--rpt-color-surface-hover, #f8fafc);color:var(--rpt-color-text, #0f172a);border-color:var(--rpt-color-border-hover, #94a3b8)}.tool-btn:disabled{opacity:.45;cursor:not-allowed}.actions-divider{width:1px;height:20px;background:var(--rpt-color-border, #cbd5e1)}.btn-blueprints{background:#faf5ff;border-color:#e9d5ff;color:#7c3aed}.btn-blueprints:hover:not(:disabled){background:#f3e8ff;color:#6d28d9;border-color:#c084fc}.btn-save{background:var(--rpt-color-primary, #2563eb);border-color:var(--rpt-color-primary, #2563eb);color:#fff}.btn-save:hover:not(:disabled){background:var(--rpt-color-primary-hover, #1d4ed8);border-color:var(--rpt-color-primary-hover, #1d4ed8)}.btn-export{background:#fff;color:var(--rpt-color-text-secondary, #334155)}.btn-grid-action{background:#f0fdf4;border-color:#bbf7d0;color:#16a34a}.btn-grid-action:hover:not(:disabled){background:#dcfce7;color:#15803d;border-color:#86efac}.btn-grid-configured{background:#eff6ff;border-color:#bfdbfe;color:#2563eb}.btn-grid-configured:hover:not(:disabled){background:#dbeafe;color:#1d4ed8;border-color:#93c5fd}.blueprint-backdrop{position:fixed;inset:0;background:#0f172a73;backdrop-filter:blur(4px);z-index:2000;animation:rpt-fade-in .15s ease-out}.blueprint-modal{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);width:min(840px,92vw);max-height:85vh;background:#fff;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-xl, 12px);box-shadow:var(--rpt-box-shadow-xl, 0 20px 25px -5px rgba(0, 0, 0, .15));z-index:2001;display:flex;flex-direction:column;overflow:hidden;animation:rpt-modal-in .18s cubic-bezier(.16,1,.3,1)}@keyframes rpt-fade-in{0%{opacity:0}to{opacity:1}}@keyframes rpt-modal-in{0%{transform:translate(-50%,-46%) scale(.96);opacity:0}to{transform:translate(-50%,-50%) scale(1);opacity:1}}.blueprint-modal-header{display:flex;align-items:flex-start;justify-content:space-between;padding:20px 24px;border-bottom:1px solid var(--rpt-color-border, #cbd5e1);background:var(--rpt-color-surface, #f8fafc)}.blueprint-modal-title{font-size:var(--rpt-font-size-lg, 1.125rem);font-weight:700;color:var(--rpt-color-text, #0f172a);margin:0 0 4px}.blueprint-modal-sub{font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-text-muted, #64748b);margin:0}.btn-close-modal{background:transparent;border:none;color:var(--rpt-color-text-muted, #64748b);font-size:1.25rem;cursor:pointer;padding:4px;line-height:1;border-radius:4px;transition:all .12s ease}.btn-close-modal:hover{color:var(--rpt-color-text, #0f172a);background:#e2e8f0}.blueprint-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:16px;padding:20px 24px;overflow-y:auto}.blueprint-card{background:#fff;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-lg, 8px);padding:16px;cursor:pointer;display:flex;flex-direction:column;transition:all .15s ease}.blueprint-card:hover{border-color:var(--rpt-color-primary, #2563eb);transform:translateY(-2px);box-shadow:0 8px 24px #2563eb1f}.blueprint-card-top{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}.blueprint-cat-badge{font-size:.65rem;font-weight:600;color:#7c3aed;background:#f5f3ff;border:1px solid #ddd6fe;padding:2px 6px;border-radius:4px}.blueprint-card-icon{color:var(--rpt-color-primary, #2563eb)}.blueprint-card-title{font-size:var(--rpt-font-size-base, .875rem);font-weight:700;color:var(--rpt-color-text, #0f172a);margin:0 0 6px}.blueprint-card-desc{font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-text-muted, #64748b);line-height:1.4;margin:0 0 16px;flex:1}.blueprint-card-footer{margin-top:auto}.btn-apply-blueprint{width:100%;background:var(--rpt-color-primary, #2563eb);color:#fff;border:none;border-radius:var(--rpt-border-radius, 6px);padding:6px 12px;font-size:.75rem;font-weight:600;cursor:pointer;transition:background .12s ease}.blueprint-card:hover .btn-apply-blueprint{background:var(--rpt-color-primary-hover, #1d4ed8)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: RptIconComponent, selector: "rpt-icon", inputs: ["name", "size", "color", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
8866
+ `, isInline: true, styles: [":host{display:block;background:var(--rpt-color-surface, #ffffff);color:var(--rpt-color-text, #0f172a);height:56px;font-family:var(--rpt-font-family, inherit);border-bottom:1px solid var(--rpt-color-border, #cbd5e1);box-sizing:border-box;position:relative;box-shadow:0 1px 3px #0000000a;z-index:30;flex-shrink:0}.toolbar-root{display:flex;align-items:center;justify-content:flex-start;height:100%;padding:0 16px;gap:8px;overflow-x:auto;overflow-y:hidden;scrollbar-width:none;-webkit-overflow-scrolling:touch;box-sizing:border-box}.toolbar-root::-webkit-scrollbar{display:none}.toolbar-left{display:flex;align-items:center;gap:8px;min-width:0;flex-shrink:0}.toolbar-right{display:flex;align-items:center;gap:6px;min-width:0;flex-shrink:0;margin-left:auto;justify-content:flex-end}.toolbar-center{display:flex;align-items:center;justify-content:center;flex-shrink:0;margin:0 auto}.report-identity{display:flex;align-items:center;gap:8px;min-width:0}.report-name{font-weight:600;font-size:.9rem;letter-spacing:-.01em;color:var(--rpt-color-text, #0f172a);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:220px}.dirty-badge{font-size:.65rem;font-weight:600;color:#b45309;background:#fef3c7;border:1px solid #fde68a;padding:1px 6px;border-radius:9999px;white-space:nowrap;flex-shrink:0}.mode-pill-group{display:flex;background:#f1f5f9;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-lg, 8px);padding:3px;gap:2px;flex-shrink:0}.mode-btn{display:inline-flex;align-items:center;gap:6px;padding:5px 12px;font-size:var(--rpt-font-size-sm, .75rem);font-weight:500;color:var(--rpt-color-text-muted, #64748b);background:transparent;border:none;border-radius:var(--rpt-border-radius, 6px);cursor:pointer;transition:all var(--rpt-transition-speed, .15s) ease;white-space:nowrap}.mode-btn:hover{color:var(--rpt-color-text, #0f172a);background:#0000000a}.mode-btn.active{background:#fff;color:var(--rpt-color-primary, #2563eb);font-weight:600;box-shadow:0 1px 3px #00000014}.history-group{display:flex;gap:2px;flex-shrink:0}.tool-btn{display:inline-flex;align-items:center;gap:6px;padding:6px 12px;font-size:var(--rpt-font-size-sm, .75rem);font-weight:500;color:var(--rpt-color-text-secondary, #334155);background:#fff;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);cursor:pointer;transition:all var(--rpt-transition-speed, .15s) ease;white-space:nowrap;flex-shrink:0}.tool-btn:hover:not(:disabled){background:var(--rpt-color-surface-hover, #f8fafc);color:var(--rpt-color-text, #0f172a);border-color:var(--rpt-color-border-hover, #94a3b8)}.tool-btn:disabled{opacity:.45;cursor:not-allowed}.btn-panel-toggle{padding:6px 8px;color:var(--rpt-color-text-muted, #64748b)}.btn-panel-toggle:hover:not(:disabled){color:var(--rpt-color-text, #0f172a);background:var(--rpt-color-surface-hover, #f8fafc)}.btn-panel-toggle.active{background:#eff6ff;border-color:#bfdbfe;color:var(--rpt-color-primary, #2563eb)}.actions-divider{width:1px;height:20px;background:var(--rpt-color-border, #cbd5e1);flex-shrink:0}.btn-blueprints{background:#faf5ff;border-color:#e9d5ff;color:#7c3aed}.btn-blueprints:hover:not(:disabled){background:#f3e8ff;color:#6d28d9;border-color:#c084fc}.btn-save{background:var(--rpt-color-primary, #2563eb);border-color:var(--rpt-color-primary, #2563eb);color:#fff;font-weight:600}.btn-save:hover:not(:disabled){background:var(--rpt-color-primary-hover, #1d4ed8);border-color:var(--rpt-color-primary-hover, #1d4ed8)}.btn-export{background:#fff;color:var(--rpt-color-text-secondary, #334155)}.btn-grid-action{background:#f0fdf4;border-color:#bbf7d0;color:#16a34a}.btn-grid-action:hover:not(:disabled){background:#dcfce7;color:#15803d;border-color:#86efac}.btn-grid-configured{background:#eff6ff;border-color:#bfdbfe;color:#2563eb}.btn-grid-configured:hover:not(:disabled){background:#dbeafe;color:#1d4ed8;border-color:#93c5fd}@media (max-width: 1024px){.toolbar-root{padding:0 12px;gap:6px}.report-name{max-width:140px}.btn-blueprints .btn-label,.btn-export .btn-label{display:none}.tool-btn{padding:6px 9px}}@media (max-width: 900px){:host{height:48px}.toolbar-root{padding:0 8px;gap:4px}.btn-panel-toggle{display:none!important}.report-name{max-width:100px;font-size:.8125rem}.actions-divider{display:none}.tool-btn .btn-label{display:none!important}.tool-btn{padding:5px 7px;min-width:30px;height:30px;justify-content:center}.mode-pill-group{padding:2px;gap:1px}.mode-btn{padding:4px 8px;font-size:.725rem;gap:4px}}@media (max-width: 680px){:host{height:46px}.toolbar-root{padding:0 6px;gap:3px}.report-name{max-width:75px;font-size:.75rem}.dirty-badge{font-size:.6rem;padding:1px 4px}.mode-btn .mode-label{display:none}.mode-btn{padding:5px 8px}.tool-btn{min-width:28px;height:28px;padding:4px 6px}.toolbar-right{gap:3px}}.blueprint-backdrop{position:fixed;inset:0;background:#0f172a73;backdrop-filter:blur(4px);z-index:2000;animation:rpt-fade-in .15s ease-out}.blueprint-modal{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);width:min(840px,92vw);max-height:85vh;background:#fff;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-xl, 12px);box-shadow:var(--rpt-box-shadow-xl, 0 20px 25px -5px rgba(0, 0, 0, .15));z-index:2001;display:flex;flex-direction:column;overflow:hidden;animation:rpt-modal-in .18s cubic-bezier(.16,1,.3,1)}@keyframes rpt-fade-in{0%{opacity:0}to{opacity:1}}@keyframes rpt-modal-in{0%{transform:translate(-50%,-46%) scale(.96);opacity:0}to{transform:translate(-50%,-50%) scale(1);opacity:1}}.blueprint-modal-header{display:flex;align-items:flex-start;justify-content:space-between;padding:20px 24px;border-bottom:1px solid var(--rpt-color-border, #cbd5e1);background:var(--rpt-color-surface, #f8fafc)}.blueprint-modal-title{font-size:var(--rpt-font-size-lg, 1.125rem);font-weight:700;color:var(--rpt-color-text, #0f172a);margin:0 0 4px}.blueprint-modal-sub{font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-text-muted, #64748b);margin:0}.btn-close-modal{background:transparent;border:none;color:var(--rpt-color-text-muted, #64748b);font-size:1.25rem;cursor:pointer;padding:4px;line-height:1;border-radius:4px;transition:all .12s ease}.btn-close-modal:hover{color:var(--rpt-color-text, #0f172a);background:#e2e8f0}.blueprint-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:16px;padding:20px 24px;overflow-y:auto}.blueprint-card{background:#fff;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-lg, 8px);padding:16px;cursor:pointer;display:flex;flex-direction:column;transition:all .15s ease}.blueprint-card:hover{border-color:var(--rpt-color-primary, #2563eb);transform:translateY(-2px);box-shadow:0 8px 24px #2563eb1f}.blueprint-card-top{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}.blueprint-cat-badge{font-size:.65rem;font-weight:600;color:#7c3aed;background:#f5f3ff;border:1px solid #ddd6fe;padding:2px 6px;border-radius:4px}.blueprint-card-icon{color:var(--rpt-color-primary, #2563eb)}.blueprint-card-title{font-size:var(--rpt-font-size-base, .875rem);font-weight:700;color:var(--rpt-color-text, #0f172a);margin:0 0 6px}.blueprint-card-desc{font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-text-muted, #64748b);line-height:1.4;margin:0 0 16px;flex:1}.blueprint-card-footer{margin-top:auto}.btn-apply-blueprint{width:100%;background:var(--rpt-color-primary, #2563eb);color:#fff;border:none;border-radius:var(--rpt-border-radius, 6px);padding:6px 12px;font-size:.75rem;font-weight:600;cursor:pointer;transition:background .12s ease}.blueprint-card:hover .btn-apply-blueprint{background:var(--rpt-color-primary-hover, #1d4ed8)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: RptIconComponent, selector: "rpt-icon", inputs: ["name", "size", "color", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
8591
8867
  }
8592
8868
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DesignerToolbarComponent, decorators: [{
8593
8869
  type: Component,
8594
8870
  args: [{ selector: 'rpt-designer-toolbar', standalone: true, imports: [CommonModule, RptIconComponent], template: `
8595
8871
  <div class="toolbar-root">
8596
- <!-- Left: Title & Dirty indicator -->
8872
+ <!-- Left: Panel toggle, Title & Dirty indicator -->
8597
8873
  <div class="toolbar-left">
8874
+ @if (viewMode() === 'design') {
8875
+ <button
8876
+ type="button"
8877
+ class="tool-btn btn-panel-toggle"
8878
+ [class.active]="!isLeftPanelCollapsed()"
8879
+ (click)="toggleLeftPanel.emit()"
8880
+ [title]="isLeftPanelCollapsed() ? 'Show Component Palette (Ctrl+B)' : 'Hide Component Palette (Ctrl+B)'"
8881
+ [attr.aria-label]="isLeftPanelCollapsed() ? 'Show Component Palette (Ctrl+B)' : 'Hide Component Palette (Ctrl+B)'"
8882
+ >
8883
+ <rpt-icon name="panel-left" [size]="14" />
8884
+ </button>
8885
+ }
8598
8886
  <div class="report-identity">
8599
8887
  <span class="report-name">{{ definition().name || 'Untitled Report' }}</span>
8600
8888
  @if (isDirty()) {
@@ -8605,33 +8893,36 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
8605
8893
 
8606
8894
  <!-- Center: Mode Switcher -->
8607
8895
  <div class="toolbar-center">
8608
- <div class="mode-pill-group">
8896
+ <div class="mode-pill-group" role="tablist" aria-label="Workbench View Mode">
8609
8897
  <button
8610
8898
  type="button"
8611
8899
  class="mode-btn"
8612
8900
  [class.active]="viewMode() === 'design'"
8613
8901
  (click)="setMode('design')"
8902
+ title="Visual Design Canvas"
8614
8903
  >
8615
8904
  <rpt-icon name="edit" [size]="14" />
8616
- <span>Design</span>
8905
+ <span class="mode-label">Design</span>
8617
8906
  </button>
8618
8907
  <button
8619
8908
  type="button"
8620
8909
  class="mode-btn"
8621
8910
  [class.active]="viewMode() === 'preview'"
8622
8911
  (click)="setMode('preview')"
8912
+ title="Live Runtime Preview"
8623
8913
  >
8624
8914
  <rpt-icon name="eye" [size]="14" />
8625
- <span>Live Preview</span>
8915
+ <span class="mode-label">Preview</span>
8626
8916
  </button>
8627
8917
  <button
8628
8918
  type="button"
8629
8919
  class="mode-btn"
8630
8920
  [class.active]="viewMode() === 'json'"
8631
8921
  (click)="setMode('json')"
8922
+ title="JSON Report Schema"
8632
8923
  >
8633
8924
  <rpt-icon name="code" [size]="14" />
8634
- <span>JSON Schema</span>
8925
+ <span class="mode-label">JSON</span>
8635
8926
  </button>
8636
8927
  </div>
8637
8928
  </div>
@@ -8659,6 +8950,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
8659
8950
  </button>
8660
8951
  </div>
8661
8952
 
8953
+ @if (viewMode() === 'design') {
8954
+ <button
8955
+ type="button"
8956
+ class="tool-btn btn-panel-toggle"
8957
+ [class.active]="!isRightPanelCollapsed()"
8958
+ (click)="toggleRightPanel.emit()"
8959
+ [title]="isRightPanelCollapsed() ? 'Show Property Editor (Ctrl+Alt+B)' : 'Hide Property Editor (Ctrl+Alt+B)'"
8960
+ [attr.aria-label]="isRightPanelCollapsed() ? 'Show Property Editor (Ctrl+Alt+B)' : 'Hide Property Editor (Ctrl+Alt+B)'"
8961
+ >
8962
+ <rpt-icon name="panel-right" [size]="14" />
8963
+ </button>
8964
+ }
8965
+
8662
8966
  <div class="actions-divider"></div>
8663
8967
 
8664
8968
  <!-- 1-Click Blueprints Gallery Button -->
@@ -8669,7 +8973,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
8669
8973
  title="Start from pre-configured enterprise blueprints"
8670
8974
  >
8671
8975
  <rpt-icon name="layers" [size]="14" />
8672
- <span>Blueprints</span>
8976
+ <span class="btn-label">Blueprints</span>
8673
8977
  </button>
8674
8978
 
8675
8979
  <!-- Add / Configure Grid Quick Button -->
@@ -8681,7 +8985,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
8681
8985
  title="Attach a Result Data Grid (UltraGrid / Table) to this report"
8682
8986
  >
8683
8987
  <rpt-icon name="table" [size]="14" />
8684
- <span>+ Add Grid</span>
8988
+ <span class="btn-label">+ Add Grid</span>
8685
8989
  </button>
8686
8990
  } @else {
8687
8991
  <button
@@ -8691,7 +8995,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
8691
8995
  title="Configure Result Data Grid columns and pagination"
8692
8996
  >
8693
8997
  <rpt-icon name="table" [size]="14" />
8694
- <span>Grid ({{ definition().grid?.columns?.length ?? 0 }})</span>
8998
+ <span class="btn-label">Grid ({{ definition().grid?.columns?.length ?? 0 }})</span>
8695
8999
  </button>
8696
9000
  }
8697
9001
 
@@ -8704,7 +9008,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
8704
9008
  title="Download JSON Definition"
8705
9009
  >
8706
9010
  <rpt-icon name="download" [size]="14" />
8707
- <span>Export</span>
9011
+ <span class="btn-label">Export</span>
8708
9012
  </button>
8709
9013
 
8710
9014
  <button
@@ -8714,7 +9018,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
8714
9018
  title="Save Report Definition"
8715
9019
  >
8716
9020
  <rpt-icon name="save" [size]="14" />
8717
- <span>Save Changes</span>
9021
+ <span class="btn-label">Save</span>
8718
9022
  </button>
8719
9023
  </div>
8720
9024
 
@@ -8751,12 +9055,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
8751
9055
  </div>
8752
9056
  }
8753
9057
  </div>
8754
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;background:var(--rpt-color-surface, #ffffff);color:var(--rpt-color-text, #0f172a);height:56px;font-family:var(--rpt-font-family, inherit);border-bottom:1px solid var(--rpt-color-border, #cbd5e1);box-sizing:border-box;position:relative;box-shadow:0 1px 3px #0000000a;z-index:30}.toolbar-root{display:flex;align-items:center;justify-content:space-between;height:100%;padding:0 20px}.toolbar-left,.toolbar-right{display:flex;align-items:center;gap:12px;min-width:240px}.toolbar-right{justify-content:flex-end}.toolbar-center{display:flex;justify-content:center;flex:1}.report-identity{display:flex;align-items:center;gap:8px}.report-name{font-weight:600;font-size:.9rem;letter-spacing:-.01em;color:var(--rpt-color-text, #0f172a);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:280px}.dirty-badge{font-size:.65rem;font-weight:600;color:#b45309;background:#fef3c7;border:1px solid #fde68a;padding:1px 6px;border-radius:9999px;white-space:nowrap}.mode-pill-group{display:flex;background:#f1f5f9;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-lg, 8px);padding:3px;gap:2px}.mode-btn{display:inline-flex;align-items:center;gap:6px;padding:5px 12px;font-size:var(--rpt-font-size-sm, .75rem);font-weight:500;color:var(--rpt-color-text-muted, #64748b);background:transparent;border:none;border-radius:var(--rpt-border-radius, 6px);cursor:pointer;transition:all var(--rpt-transition-speed, .15s) ease}.mode-btn:hover{color:var(--rpt-color-text, #0f172a);background:#0000000a}.mode-btn.active{background:#fff;color:var(--rpt-color-primary, #2563eb);font-weight:600;box-shadow:0 1px 3px #00000014}.history-group{display:flex;gap:2px}.tool-btn{display:inline-flex;align-items:center;gap:6px;padding:6px 12px;font-size:var(--rpt-font-size-sm, .75rem);font-weight:500;color:var(--rpt-color-text-secondary, #334155);background:#fff;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);cursor:pointer;transition:all var(--rpt-transition-speed, .15s) ease}.tool-btn:hover:not(:disabled){background:var(--rpt-color-surface-hover, #f8fafc);color:var(--rpt-color-text, #0f172a);border-color:var(--rpt-color-border-hover, #94a3b8)}.tool-btn:disabled{opacity:.45;cursor:not-allowed}.actions-divider{width:1px;height:20px;background:var(--rpt-color-border, #cbd5e1)}.btn-blueprints{background:#faf5ff;border-color:#e9d5ff;color:#7c3aed}.btn-blueprints:hover:not(:disabled){background:#f3e8ff;color:#6d28d9;border-color:#c084fc}.btn-save{background:var(--rpt-color-primary, #2563eb);border-color:var(--rpt-color-primary, #2563eb);color:#fff}.btn-save:hover:not(:disabled){background:var(--rpt-color-primary-hover, #1d4ed8);border-color:var(--rpt-color-primary-hover, #1d4ed8)}.btn-export{background:#fff;color:var(--rpt-color-text-secondary, #334155)}.btn-grid-action{background:#f0fdf4;border-color:#bbf7d0;color:#16a34a}.btn-grid-action:hover:not(:disabled){background:#dcfce7;color:#15803d;border-color:#86efac}.btn-grid-configured{background:#eff6ff;border-color:#bfdbfe;color:#2563eb}.btn-grid-configured:hover:not(:disabled){background:#dbeafe;color:#1d4ed8;border-color:#93c5fd}.blueprint-backdrop{position:fixed;inset:0;background:#0f172a73;backdrop-filter:blur(4px);z-index:2000;animation:rpt-fade-in .15s ease-out}.blueprint-modal{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);width:min(840px,92vw);max-height:85vh;background:#fff;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-xl, 12px);box-shadow:var(--rpt-box-shadow-xl, 0 20px 25px -5px rgba(0, 0, 0, .15));z-index:2001;display:flex;flex-direction:column;overflow:hidden;animation:rpt-modal-in .18s cubic-bezier(.16,1,.3,1)}@keyframes rpt-fade-in{0%{opacity:0}to{opacity:1}}@keyframes rpt-modal-in{0%{transform:translate(-50%,-46%) scale(.96);opacity:0}to{transform:translate(-50%,-50%) scale(1);opacity:1}}.blueprint-modal-header{display:flex;align-items:flex-start;justify-content:space-between;padding:20px 24px;border-bottom:1px solid var(--rpt-color-border, #cbd5e1);background:var(--rpt-color-surface, #f8fafc)}.blueprint-modal-title{font-size:var(--rpt-font-size-lg, 1.125rem);font-weight:700;color:var(--rpt-color-text, #0f172a);margin:0 0 4px}.blueprint-modal-sub{font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-text-muted, #64748b);margin:0}.btn-close-modal{background:transparent;border:none;color:var(--rpt-color-text-muted, #64748b);font-size:1.25rem;cursor:pointer;padding:4px;line-height:1;border-radius:4px;transition:all .12s ease}.btn-close-modal:hover{color:var(--rpt-color-text, #0f172a);background:#e2e8f0}.blueprint-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:16px;padding:20px 24px;overflow-y:auto}.blueprint-card{background:#fff;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-lg, 8px);padding:16px;cursor:pointer;display:flex;flex-direction:column;transition:all .15s ease}.blueprint-card:hover{border-color:var(--rpt-color-primary, #2563eb);transform:translateY(-2px);box-shadow:0 8px 24px #2563eb1f}.blueprint-card-top{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}.blueprint-cat-badge{font-size:.65rem;font-weight:600;color:#7c3aed;background:#f5f3ff;border:1px solid #ddd6fe;padding:2px 6px;border-radius:4px}.blueprint-card-icon{color:var(--rpt-color-primary, #2563eb)}.blueprint-card-title{font-size:var(--rpt-font-size-base, .875rem);font-weight:700;color:var(--rpt-color-text, #0f172a);margin:0 0 6px}.blueprint-card-desc{font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-text-muted, #64748b);line-height:1.4;margin:0 0 16px;flex:1}.blueprint-card-footer{margin-top:auto}.btn-apply-blueprint{width:100%;background:var(--rpt-color-primary, #2563eb);color:#fff;border:none;border-radius:var(--rpt-border-radius, 6px);padding:6px 12px;font-size:.75rem;font-weight:600;cursor:pointer;transition:background .12s ease}.blueprint-card:hover .btn-apply-blueprint{background:var(--rpt-color-primary-hover, #1d4ed8)}\n"] }]
9058
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;background:var(--rpt-color-surface, #ffffff);color:var(--rpt-color-text, #0f172a);height:56px;font-family:var(--rpt-font-family, inherit);border-bottom:1px solid var(--rpt-color-border, #cbd5e1);box-sizing:border-box;position:relative;box-shadow:0 1px 3px #0000000a;z-index:30;flex-shrink:0}.toolbar-root{display:flex;align-items:center;justify-content:flex-start;height:100%;padding:0 16px;gap:8px;overflow-x:auto;overflow-y:hidden;scrollbar-width:none;-webkit-overflow-scrolling:touch;box-sizing:border-box}.toolbar-root::-webkit-scrollbar{display:none}.toolbar-left{display:flex;align-items:center;gap:8px;min-width:0;flex-shrink:0}.toolbar-right{display:flex;align-items:center;gap:6px;min-width:0;flex-shrink:0;margin-left:auto;justify-content:flex-end}.toolbar-center{display:flex;align-items:center;justify-content:center;flex-shrink:0;margin:0 auto}.report-identity{display:flex;align-items:center;gap:8px;min-width:0}.report-name{font-weight:600;font-size:.9rem;letter-spacing:-.01em;color:var(--rpt-color-text, #0f172a);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:220px}.dirty-badge{font-size:.65rem;font-weight:600;color:#b45309;background:#fef3c7;border:1px solid #fde68a;padding:1px 6px;border-radius:9999px;white-space:nowrap;flex-shrink:0}.mode-pill-group{display:flex;background:#f1f5f9;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-lg, 8px);padding:3px;gap:2px;flex-shrink:0}.mode-btn{display:inline-flex;align-items:center;gap:6px;padding:5px 12px;font-size:var(--rpt-font-size-sm, .75rem);font-weight:500;color:var(--rpt-color-text-muted, #64748b);background:transparent;border:none;border-radius:var(--rpt-border-radius, 6px);cursor:pointer;transition:all var(--rpt-transition-speed, .15s) ease;white-space:nowrap}.mode-btn:hover{color:var(--rpt-color-text, #0f172a);background:#0000000a}.mode-btn.active{background:#fff;color:var(--rpt-color-primary, #2563eb);font-weight:600;box-shadow:0 1px 3px #00000014}.history-group{display:flex;gap:2px;flex-shrink:0}.tool-btn{display:inline-flex;align-items:center;gap:6px;padding:6px 12px;font-size:var(--rpt-font-size-sm, .75rem);font-weight:500;color:var(--rpt-color-text-secondary, #334155);background:#fff;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);cursor:pointer;transition:all var(--rpt-transition-speed, .15s) ease;white-space:nowrap;flex-shrink:0}.tool-btn:hover:not(:disabled){background:var(--rpt-color-surface-hover, #f8fafc);color:var(--rpt-color-text, #0f172a);border-color:var(--rpt-color-border-hover, #94a3b8)}.tool-btn:disabled{opacity:.45;cursor:not-allowed}.btn-panel-toggle{padding:6px 8px;color:var(--rpt-color-text-muted, #64748b)}.btn-panel-toggle:hover:not(:disabled){color:var(--rpt-color-text, #0f172a);background:var(--rpt-color-surface-hover, #f8fafc)}.btn-panel-toggle.active{background:#eff6ff;border-color:#bfdbfe;color:var(--rpt-color-primary, #2563eb)}.actions-divider{width:1px;height:20px;background:var(--rpt-color-border, #cbd5e1);flex-shrink:0}.btn-blueprints{background:#faf5ff;border-color:#e9d5ff;color:#7c3aed}.btn-blueprints:hover:not(:disabled){background:#f3e8ff;color:#6d28d9;border-color:#c084fc}.btn-save{background:var(--rpt-color-primary, #2563eb);border-color:var(--rpt-color-primary, #2563eb);color:#fff;font-weight:600}.btn-save:hover:not(:disabled){background:var(--rpt-color-primary-hover, #1d4ed8);border-color:var(--rpt-color-primary-hover, #1d4ed8)}.btn-export{background:#fff;color:var(--rpt-color-text-secondary, #334155)}.btn-grid-action{background:#f0fdf4;border-color:#bbf7d0;color:#16a34a}.btn-grid-action:hover:not(:disabled){background:#dcfce7;color:#15803d;border-color:#86efac}.btn-grid-configured{background:#eff6ff;border-color:#bfdbfe;color:#2563eb}.btn-grid-configured:hover:not(:disabled){background:#dbeafe;color:#1d4ed8;border-color:#93c5fd}@media (max-width: 1024px){.toolbar-root{padding:0 12px;gap:6px}.report-name{max-width:140px}.btn-blueprints .btn-label,.btn-export .btn-label{display:none}.tool-btn{padding:6px 9px}}@media (max-width: 900px){:host{height:48px}.toolbar-root{padding:0 8px;gap:4px}.btn-panel-toggle{display:none!important}.report-name{max-width:100px;font-size:.8125rem}.actions-divider{display:none}.tool-btn .btn-label{display:none!important}.tool-btn{padding:5px 7px;min-width:30px;height:30px;justify-content:center}.mode-pill-group{padding:2px;gap:1px}.mode-btn{padding:4px 8px;font-size:.725rem;gap:4px}}@media (max-width: 680px){:host{height:46px}.toolbar-root{padding:0 6px;gap:3px}.report-name{max-width:75px;font-size:.75rem}.dirty-badge{font-size:.6rem;padding:1px 4px}.mode-btn .mode-label{display:none}.mode-btn{padding:5px 8px}.tool-btn{min-width:28px;height:28px;padding:4px 6px}.toolbar-right{gap:3px}}.blueprint-backdrop{position:fixed;inset:0;background:#0f172a73;backdrop-filter:blur(4px);z-index:2000;animation:rpt-fade-in .15s ease-out}.blueprint-modal{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);width:min(840px,92vw);max-height:85vh;background:#fff;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-xl, 12px);box-shadow:var(--rpt-box-shadow-xl, 0 20px 25px -5px rgba(0, 0, 0, .15));z-index:2001;display:flex;flex-direction:column;overflow:hidden;animation:rpt-modal-in .18s cubic-bezier(.16,1,.3,1)}@keyframes rpt-fade-in{0%{opacity:0}to{opacity:1}}@keyframes rpt-modal-in{0%{transform:translate(-50%,-46%) scale(.96);opacity:0}to{transform:translate(-50%,-50%) scale(1);opacity:1}}.blueprint-modal-header{display:flex;align-items:flex-start;justify-content:space-between;padding:20px 24px;border-bottom:1px solid var(--rpt-color-border, #cbd5e1);background:var(--rpt-color-surface, #f8fafc)}.blueprint-modal-title{font-size:var(--rpt-font-size-lg, 1.125rem);font-weight:700;color:var(--rpt-color-text, #0f172a);margin:0 0 4px}.blueprint-modal-sub{font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-text-muted, #64748b);margin:0}.btn-close-modal{background:transparent;border:none;color:var(--rpt-color-text-muted, #64748b);font-size:1.25rem;cursor:pointer;padding:4px;line-height:1;border-radius:4px;transition:all .12s ease}.btn-close-modal:hover{color:var(--rpt-color-text, #0f172a);background:#e2e8f0}.blueprint-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:16px;padding:20px 24px;overflow-y:auto}.blueprint-card{background:#fff;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-lg, 8px);padding:16px;cursor:pointer;display:flex;flex-direction:column;transition:all .15s ease}.blueprint-card:hover{border-color:var(--rpt-color-primary, #2563eb);transform:translateY(-2px);box-shadow:0 8px 24px #2563eb1f}.blueprint-card-top{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}.blueprint-cat-badge{font-size:.65rem;font-weight:600;color:#7c3aed;background:#f5f3ff;border:1px solid #ddd6fe;padding:2px 6px;border-radius:4px}.blueprint-card-icon{color:var(--rpt-color-primary, #2563eb)}.blueprint-card-title{font-size:var(--rpt-font-size-base, .875rem);font-weight:700;color:var(--rpt-color-text, #0f172a);margin:0 0 6px}.blueprint-card-desc{font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-text-muted, #64748b);line-height:1.4;margin:0 0 16px;flex:1}.blueprint-card-footer{margin-top:auto}.btn-apply-blueprint{width:100%;background:var(--rpt-color-primary, #2563eb);color:#fff;border:none;border-radius:var(--rpt-border-radius, 6px);padding:6px 12px;font-size:.75rem;font-weight:600;cursor:pointer;transition:background .12s ease}.blueprint-card:hover .btn-apply-blueprint{background:var(--rpt-color-primary-hover, #1d4ed8)}\n"] }]
8755
9059
  }] });
8756
9060
 
8757
9061
  class ComponentPaletteComponent {
8758
9062
  registry = inject(ComponentRegistry);
8759
9063
  designerState = inject(DesignerStateService);
9064
+ collapseRequested = output();
8760
9065
  searchQuery = signal('');
8761
9066
  /** Layout view mode: 'grid' (2-column side-by-side grid) or 'list' (compact row list). Defaults to 'grid'. */
8762
9067
  layoutMode = signal('grid');
@@ -8857,7 +9162,7 @@ class ComponentPaletteComponent {
8857
9162
  this.designerState.addComponent(type);
8858
9163
  }
8859
9164
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ComponentPaletteComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
8860
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ComponentPaletteComponent, isStandalone: true, selector: "rpt-component-palette", ngImport: i0, template: `
9165
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ComponentPaletteComponent, isStandalone: true, selector: "rpt-component-palette", outputs: { collapseRequested: "collapseRequested" }, ngImport: i0, template: `
8861
9166
  <div class="palette-container">
8862
9167
  <div class="palette-header">
8863
9168
  <div class="palette-title-area">
@@ -8903,6 +9208,16 @@ class ComponentPaletteComponent {
8903
9208
  >
8904
9209
  <rpt-icon [name]="allExpanded() ? 'chevron-up' : 'chevron-down'" [size]="13" />
8905
9210
  </button>
9211
+
9212
+ <button
9213
+ type="button"
9214
+ class="palette-action-btn icon-only"
9215
+ (click)="collapseRequested.emit()"
9216
+ title="Collapse Component Palette"
9217
+ aria-label="Collapse Component Palette"
9218
+ >
9219
+ <rpt-icon name="chevron-left" [size]="13" />
9220
+ </button>
8906
9221
  </div>
8907
9222
  </div>
8908
9223
 
@@ -9081,6 +9396,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
9081
9396
  >
9082
9397
  <rpt-icon [name]="allExpanded() ? 'chevron-up' : 'chevron-down'" [size]="13" />
9083
9398
  </button>
9399
+
9400
+ <button
9401
+ type="button"
9402
+ class="palette-action-btn icon-only"
9403
+ (click)="collapseRequested.emit()"
9404
+ title="Collapse Component Palette"
9405
+ aria-label="Collapse Component Palette"
9406
+ >
9407
+ <rpt-icon name="chevron-left" [size]="13" />
9408
+ </button>
9084
9409
  </div>
9085
9410
  </div>
9086
9411
 
@@ -9553,6 +9878,9 @@ class DesignCanvasComponent {
9553
9878
  pageSize: 25,
9554
9879
  showRowNumbers: true,
9555
9880
  showFooter: true,
9881
+ sideBar: true,
9882
+ globalSearch: true,
9883
+ statusBar: true,
9556
9884
  },
9557
9885
  };
9558
9886
  this.designerState.updateGridSettings(defaultGrid);
@@ -9692,7 +10020,7 @@ class DesignCanvasComponent {
9692
10020
  } @else {
9693
10021
  <button
9694
10022
  type="button"
9695
- class="canvas-action-btn"
10023
+ class="canvas-action-btn btn-grid-configured"
9696
10024
  (click)="selectGridSettings($event)"
9697
10025
  title="Configure Result Data Grid"
9698
10026
  >
@@ -9707,7 +10035,7 @@ class DesignCanvasComponent {
9707
10035
  (click)="selectReportSettings($event)"
9708
10036
  title="Configure Page Layout & Grid Settings"
9709
10037
  >
9710
- <rpt-icon name="settings" [size]="15" />
10038
+ <rpt-icon name="settings" [size]="14" />
9711
10039
  <span>Report Settings</span>
9712
10040
  </button>
9713
10041
  </div>
@@ -9747,8 +10075,8 @@ class DesignCanvasComponent {
9747
10075
  [class.is-selected]="isSelected(comp.id)"
9748
10076
  [class.is-resizing]="resizingCompId() === comp.id"
9749
10077
  [class.is-field-highlighted]="isFieldHighlighted(comp)"
9750
- [class.is-narrow]="getSpan(comp) <= 2"
9751
- [class.is-compact]="getSpan(comp) === 1"
10078
+ [class.is-narrow]="getSpan(comp) <= 4"
10079
+ [class.is-compact]="getSpan(comp) <= 2"
9752
10080
  [style.grid-column]="getGridColumn(comp)"
9753
10081
  [style.grid-row]="getGridRow(comp)"
9754
10082
  [style.width]="comp.layout?.width || 'auto'"
@@ -9802,7 +10130,9 @@ class DesignCanvasComponent {
9802
10130
  >
9803
10131
  <rpt-icon name="minus" [size]="9" />
9804
10132
  </button>
9805
- <span class="span-badge">{{ getSpan(comp) <= 2 ? getSpan(comp) : (getSpan(comp) + '/' + totalColumns()) }}</span>
10133
+ <span class="span-badge" [title]="'Column span: ' + getSpan(comp) + ' of ' + totalColumns()">
10134
+ <span class="span-num">{{ getSpan(comp) }}</span><span class="span-total">/{{ totalColumns() }}</span>
10135
+ </span>
9806
10136
  <button
9807
10137
  type="button"
9808
10138
  class="span-btn"
@@ -10166,7 +10496,7 @@ class DesignCanvasComponent {
10166
10496
  </div>
10167
10497
  </div>
10168
10498
  </div>
10169
- `, isInline: true, styles: [":host{display:block;height:100%;background-color:#f1f5f9;font-family:var(--rpt-font-family, inherit);box-sizing:border-box}.canvas-wrapper{display:flex;flex-direction:column;height:100%}.canvas-toolbar{display:flex;align-items:center;justify-content:space-between;min-height:46px;padding:6px 20px;background:#fff;border-bottom:1px solid var(--rpt-color-border, #cbd5e1);box-sizing:border-box}.canvas-info{display:flex;align-items:center;gap:8px;color:var(--rpt-color-text-muted, #64748b);font-size:.8125rem}.info-label{color:#64748b}.info-value{font-weight:600;color:var(--rpt-color-text, #0f172a)}.info-divider{color:var(--rpt-color-border, #cbd5e1);margin:0 2px}.canvas-action-btn{display:inline-flex;align-items:center;gap:8px;height:32px;padding:0 14px;background:#fff;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:6px;font-size:.8125rem;font-weight:500;color:#1e293b;cursor:pointer;line-height:1;white-space:nowrap;box-shadow:0 1px 2px #0000000a;transition:all var(--rpt-transition-speed, .15s) ease}.canvas-action-btn rpt-icon{color:#64748b;transition:color .15s ease}.canvas-action-btn:hover{background:var(--rpt-color-surface, #f8fafc);border-color:var(--rpt-color-primary, #2563eb);color:var(--rpt-color-primary, #2563eb);box-shadow:0 2px 4px #2563eb14}.canvas-action-btn:hover rpt-icon{color:var(--rpt-color-primary, #2563eb)}.canvas-action-btn:active{transform:translateY(1px)}.canvas-scroll-area{flex:1;overflow-y:auto;padding:16px}.canvas-artboard{width:100%;max-width:1400px;margin:0 auto;background:#fff;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-lg, 8px);box-shadow:0 4px 6px -1px #0000000d;min-height:480px;box-sizing:border-box}.canvas-report-header{margin-bottom:24px;padding-bottom:16px;border-bottom:1px solid var(--rpt-color-border, #e2e8f0)}.canvas-report-title{font-size:var(--rpt-font-size-xl, 1.5rem);font-weight:700;color:var(--rpt-color-text, #0f172a);margin:0 0 6px}.canvas-report-desc{font-size:var(--rpt-font-size-base, .875rem);color:var(--rpt-color-text-muted, #64748b);margin:0}.canvas-grid{display:grid;width:100%;min-height:180px;align-items:start;border-radius:6px;transition:all var(--rpt-transition-speed, .15s) ease}.canvas-component-card{background:#fff;border:1.5px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);box-shadow:var(--rpt-box-shadow, 0 1px 2px rgba(0, 0, 0, .05));box-sizing:border-box;transition:all var(--rpt-transition-speed, .15s) ease;cursor:pointer;position:relative;overflow:visible;display:flex;flex-direction:column;min-height:96px;z-index:1}.canvas-component-card:hover{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 4px 6px -1px #2563eb1a;z-index:2}.canvas-component-card.is-selected{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 0 0 2px #2563eb40;z-index:10}.canvas-component-card:focus-within,.canvas-component-card:has(.rpt-combobox-menu),.canvas-component-card:has(.is-open){z-index:100}.canvas-component-card.is-resizing{-webkit-user-select:none;user-select:none;border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 0 0 2px #2563eb59;z-index:30;transition:none!important}.resize-handle{position:absolute;z-index:20;touch-action:none;opacity:0;pointer-events:none;transition:opacity .15s ease}.canvas-component-card.is-selected .resize-handle{opacity:1;pointer-events:auto}.resize-handle.handle-e{top:0;right:0;width:6px;height:100%;cursor:ew-resize;display:flex;align-items:center;justify-content:center}.resize-handle.handle-e:after{content:\"\";width:3px;height:24px;background:#cbd5e1;border-radius:2px;transition:background .15s ease}.resize-handle.handle-e:hover:after,.canvas-component-card.is-selected .resize-handle.handle-e:after{background:var(--rpt-color-primary, #2563eb)}.resize-handle.handle-s{bottom:0;left:0;height:6px;width:100%;cursor:ns-resize;display:flex;align-items:center;justify-content:center}.resize-handle.handle-s:after{content:\"\";height:3px;width:24px;background:#cbd5e1;border-radius:2px;transition:background .15s ease}.resize-handle.handle-s:hover:after,.canvas-component-card.is-selected .resize-handle.handle-s:after{background:var(--rpt-color-primary, #2563eb)}.resize-handle.handle-se{bottom:0;right:0;width:12px;height:12px;cursor:nwse-resize;display:flex;align-items:flex-end;justify-content:flex-end;padding:2px}.resize-handle.handle-se:after{content:\"\";width:5px;height:5px;border-right:2px solid #cbd5e1;border-bottom:2px solid #cbd5e1;transition:border-color .15s ease}.resize-handle.handle-se:hover:after,.canvas-component-card.is-selected .resize-handle.handle-se:after{border-color:var(--rpt-color-primary, #2563eb)}.resize-dimension-tooltip{position:absolute;top:38px;right:8px;background:#0f172ae6;color:#fff;font-size:.7rem;font-weight:600;padding:3px 8px;border-radius:4px;white-space:nowrap;pointer-events:none;z-index:50;box-shadow:0 2px 4px #0003}.card-header{display:flex;align-items:center;justify-content:space-between;gap:6px;padding:5px 8px;background:var(--rpt-color-surface, #f8fafc);border-bottom:1px solid var(--rpt-color-border, #e2e8f0);border-top-left-radius:var(--rpt-border-radius, 6px);border-top-right-radius:var(--rpt-border-radius, 6px);min-height:32px;box-sizing:border-box;overflow:hidden}.card-title-group{display:flex;align-items:center;gap:5px;cursor:grab;min-width:0;flex:1;overflow:hidden}.drag-handle-dots{color:var(--rpt-color-text-muted, #94a3b8);font-size:.85rem;letter-spacing:-2px;flex-shrink:0;-webkit-user-select:none;user-select:none}.comp-title{font-size:.75rem;font-weight:600;color:var(--rpt-color-text, #0f172a);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-webkit-user-select:none;user-select:none}.card-actions{display:flex;align-items:center;gap:4px;flex-shrink:0;margin-left:auto}.new-row-pill-static{font-size:.65rem;font-weight:600;color:#7c3aed;background:#f5f3ff;border:1px solid #ddd6fe;padding:1px 5px;border-radius:9999px;white-space:nowrap;line-height:1;flex-shrink:0}.span-pill-static{display:inline-flex;align-items:center;justify-content:center;font-size:.65rem;font-weight:600;color:var(--rpt-color-text-muted, #64748b);background:var(--rpt-color-surface, #f1f5f9);border:1px solid var(--rpt-color-border, #e2e8f0);padding:1px 6px;border-radius:9999px;line-height:1.2;white-space:nowrap;-webkit-user-select:none;user-select:none}.card-quick-controls{display:none;align-items:center;gap:3px}.canvas-component-card:hover .span-pill-static,.canvas-component-card.is-selected .span-pill-static,.canvas-component-card:hover .new-row-pill-static,.canvas-component-card.is-selected .new-row-pill-static{display:none}.canvas-component-card:hover .card-quick-controls,.canvas-component-card.is-selected .card-quick-controls{display:inline-flex}.canvas-component-card.is-narrow .card-header{padding:4px 6px;gap:3px}.canvas-component-card.is-narrow:hover .comp-title,.canvas-component-card.is-narrow.is-selected .comp-title,.canvas-component-card.is-narrow:hover .drag-handle-dots,.canvas-component-card.is-narrow.is-selected .drag-handle-dots{display:none}.canvas-component-card.is-narrow .card-quick-controls{gap:2px}.canvas-component-card.is-narrow .span-control-group{height:18px}.canvas-component-card.is-narrow .span-btn{width:14px;height:16px}.canvas-component-card.is-narrow .span-badge{font-size:.6rem;padding:0 2px}.canvas-component-card.is-narrow .card-action-btn{width:18px;height:18px}.canvas-component-card.is-compact:hover .card-action-btn:not(.btn-delete),.canvas-component-card.is-compact.is-selected .card-action-btn:not(.btn-delete){display:none}.span-control-group{display:inline-flex;align-items:center;background:#fff;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:4px;height:20px;padding:0 1px;white-space:nowrap;flex-shrink:0}.span-btn{width:16px;height:18px;display:inline-flex;align-items:center;justify-content:center;border:none;background:transparent;padding:0;color:var(--rpt-color-text-muted, #64748b);cursor:pointer;border-radius:2px;transition:all .12s ease}.span-btn:hover:not(:disabled){background:var(--rpt-color-surface-hover, #f1f5f9);color:var(--rpt-color-primary, #2563eb)}.span-btn:disabled{opacity:.3;cursor:not-allowed}.span-badge{font-size:.65rem;font-weight:600;color:var(--rpt-color-text, #0f172a);padding:0 3px;white-space:nowrap;-webkit-user-select:none;user-select:none;line-height:1}.card-action-btn{width:20px;height:20px;border:none;background:transparent;border-radius:4px;display:inline-flex;align-items:center;justify-content:center;padding:0;cursor:pointer;color:var(--rpt-color-text-muted, #64748b);transition:all .12s ease;flex-shrink:0}.card-action-btn:hover{background:#e2e8f0;color:var(--rpt-color-text, #0f172a)}.card-action-btn.btn-active-toggle{background:#7c3aed;color:#fff;border-color:#7c3aed}.card-action-btn.btn-active-toggle:hover{background:#6d28d9;color:#fff}.btn-delete:hover{background:#fee2e2;color:#ef4444}.card-body{padding:8px 12px 8px 10px;flex:1;display:flex;flex-direction:column;min-height:0;box-sizing:border-box;overflow:visible}.mock-input-field{display:flex;flex-direction:column;gap:4px;flex:1;height:100%;min-height:0}.mock-label{font-size:.7rem;font-weight:600;color:var(--rpt-color-text-muted, #475569);flex-shrink:0}.mock-input-box,.mock-select-box{border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:6px;padding:6px 12px;font-size:var(--rpt-font-size-base, .875rem);color:var(--rpt-color-text-muted, #94a3b8);background:#fff;flex:1;min-height:38px;height:100%;display:flex;align-items:center;justify-content:space-between;box-sizing:border-box}.mock-checkbox-field{display:flex;align-items:center;gap:6px;flex:1;height:100%;min-height:0;padding-top:14px}.mock-check-box{width:18px;height:18px;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:4px;display:flex;align-items:center;justify-content:center;font-size:.65rem;color:var(--rpt-color-primary, #2563eb);flex-shrink:0}.mock-btn-wrapper{display:flex;flex:1;height:100%;min-height:38px;align-items:center;justify-content:flex-start;width:100%;min-width:0;box-sizing:border-box}.mock-btn{border-radius:var(--rpt-border-radius, 6px);padding:0 16px;height:36px;font-size:var(--rpt-font-size-base, .875rem);font-weight:500;border:1px solid transparent;cursor:pointer;width:auto;max-width:100%;display:inline-flex;align-items:center;justify-content:center;gap:6px;box-sizing:border-box;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:all .15s ease}.mock-btn.mock-btn-full{width:100%}.canvas-component-card.is-narrow .mock-btn{padding:0 6px;font-size:.775rem;width:100%;height:34px}.mock-kpi-field{display:flex;flex-direction:column;justify-content:space-between;flex:1;height:100%;min-height:0}.mock-kpi-header{display:flex;align-items:center;justify-content:space-between}.mock-kpi-value{font-size:1.25rem;font-weight:700;color:var(--rpt-color-text, #0f172a);margin:2px 0}.mock-kpi-footer{display:flex;align-items:center;gap:6px;font-size:.65rem}.mock-kpi-trend{color:#16a34a;font-weight:600}.mock-kpi-sub{color:#64748b}.mock-chart-field{display:flex;flex-direction:column;flex:1;height:100%;min-height:140px}.mock-chart-bars{display:flex;align-items:flex-end;justify-content:space-around;gap:16px;flex:1;min-height:100px;padding-top:12px;box-sizing:border-box}.mock-chart-col{flex:1;display:flex;flex-direction:column;align-items:center;height:100%;min-width:60px;max-width:140px}.mock-chart-bar{width:38px;max-width:44px;margin:0 auto;background:var(--rpt-color-primary, #2563eb);border-radius:6px 6px 0 0;opacity:.85;min-height:10px;transition:height .2s ease}.mock-bar-lbl{font-size:.6875rem;color:#64748b;margin-top:6px;text-align:center;white-space:normal;line-height:1.2}.btn-primary{background:var(--rpt-color-primary, #2563eb);color:#fff}.btn-secondary{background:#f1f5f9;color:#0f172a;border:1px solid #cbd5e1}.btn-outline{background:transparent;color:#2563eb;border:1px solid #2563eb}.btn-danger{background:#ef4444;color:#fff}.mock-generic-box{border:1px dashed #cbd5e1;border-radius:4px;padding:8px;font-size:.75rem;text-align:center;color:#64748b}.canvas-drag-placeholder{background:#2563eb0f;border:2px dashed var(--rpt-color-primary, #2563eb);border-radius:6px;min-height:80px;box-sizing:border-box;transition:transform .15s ease}.canvas-drag-preview,::ng-deep .canvas-drag-preview{background:#fff;border:2px solid var(--rpt-color-primary, #2563eb);border-radius:6px;padding:8px 14px;display:inline-flex;align-items:center;gap:8px;font-family:var(--rpt-font-family, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif)!important;font-size:.8rem;font-weight:600;color:var(--rpt-color-text, #0f172a);box-shadow:0 12px 24px -4px #00000040;z-index:10000}.preview-title,::ng-deep .preview-title{font-family:inherit!important;max-width:160px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.preview-span,::ng-deep .preview-span{font-family:inherit!important;font-size:.65rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border:1px solid #bfdbfe;padding:1px 6px;border-radius:9999px}.canvas-empty-state{grid-column:1 / -1;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:56px 28px;border:2px dashed var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-xl, 12px);background:var(--rpt-color-surface, #ffffff);text-align:center;box-shadow:var(--rpt-box-shadow-xs, 0 1px 2px 0 rgba(0, 0, 0, .04));transition:border-color var(--rpt-transition-speed, .15s) ease}.canvas-empty-state:hover{border-color:var(--rpt-color-primary, #2563eb)}.empty-hero-badge{width:56px;height:56px;border-radius:var(--rpt-border-radius-xl, 12px);background:var(--rpt-color-primary-light, #eff6ff);color:var(--rpt-color-primary, #2563eb);display:flex;align-items:center;justify-content:center;margin-bottom:16px;box-shadow:0 2px 8px #2563eb1f}.empty-hero-title{font-size:var(--rpt-font-size-lg, 1.125rem);font-weight:700;color:var(--rpt-color-text, #0f172a);margin:0 0 8px;letter-spacing:-.01em}.empty-hero-desc{font-size:var(--rpt-font-size-base, .875rem);color:var(--rpt-color-text-muted, #64748b);max-width:520px;line-height:1.5;margin:0 0 24px}.empty-hero-actions{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:10px}.empty-btn{display:inline-flex;align-items:center;gap:7px;padding:8px 16px;font-size:var(--rpt-font-size-sm, .75rem);font-weight:600;border-radius:var(--rpt-border-radius, 6px);cursor:pointer;transition:all var(--rpt-transition-speed, .15s) ease;font-family:inherit}.empty-btn-primary{background:var(--rpt-color-primary, #2563eb);color:#fff;border:1px solid var(--rpt-color-primary, #2563eb);box-shadow:0 1px 3px #2563eb33}.empty-btn-primary:hover{background:var(--rpt-color-primary-hover, #1d4ed8);border-color:var(--rpt-color-primary-hover, #1d4ed8);transform:translateY(-1px)}.empty-btn-secondary{background:#f8fafc;color:#334155;border:1px solid var(--rpt-color-border, #cbd5e1)}.empty-btn-secondary:hover{background:#f1f5f9;color:#0f172a;border-color:#94a3b8;transform:translateY(-1px)}.empty-btn-outline{background:#fff;color:var(--rpt-color-primary, #2563eb);border:1px solid #bfdbfe}.empty-btn-outline:hover{background:#eff6ff;border-color:var(--rpt-color-primary, #2563eb);transform:translateY(-1px)}.canvas-active-input{width:100%;height:32px;padding:4px 8px;font-size:.8125rem;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:4px;outline:none;box-sizing:border-box;background:#fff;color:#0f172a;transition:border-color .15s ease}.canvas-active-input:focus{border-color:var(--rpt-color-primary, #2563eb)}.canvas-active-checkbox-lbl{display:inline-flex;align-items:center;gap:6px;cursor:pointer}.canvas-live-control-wrapper{width:100%;position:relative;z-index:1}.canvas-grid-box{margin-top:24px;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:8px;background:#fff;box-shadow:0 1px 3px #0000000d;overflow:hidden}.grid-preview-header{display:flex;align-items:center;justify-content:space-between;padding:10px 16px;background:var(--rpt-color-surface, #f8fafc);border-bottom:1px solid var(--rpt-color-border, #cbd5e1);font-size:.8rem;font-weight:600;color:var(--rpt-color-text, #0f172a)}.grid-title{font-weight:700}.grid-exec-badge{font-size:.6875rem;font-weight:600;padding:2px 8px;border-radius:10px}.grid-exec-badge.is-loading{background:#eff6ff;color:#2563eb}.grid-exec-badge.is-error{background:#fee2e2;color:#ef4444}.grid-exec-badge.is-success{background:#ecfdf5;color:#059669}.btn-canvas-run-grid{display:inline-flex;align-items:center;gap:5px;padding:4px 10px;font-size:.72rem;font-weight:600;color:#fff;background:var(--rpt-color-primary, #2563eb);border:none;border-radius:4px;cursor:pointer;transition:background .15s ease}.btn-canvas-run-grid:hover:not(:disabled){background:#1d4ed8}.btn-canvas-run-grid:disabled{opacity:.6;cursor:not-allowed}.btn-canvas-edit-grid{display:inline-flex;align-items:center;gap:4px;padding:4px 8px;font-size:.72rem;font-weight:500;color:#334155;background:#fff;border:1px solid #cbd5e1;border-radius:4px;cursor:pointer;transition:all .12s ease}.btn-canvas-edit-grid:hover{background:#f1f5f9}.canvas-live-grid-container{width:100%;min-height:480px;background:#fff}.live-mode-badge{display:inline-flex;align-items:center;gap:4px;font-size:.6875rem;font-weight:700;color:#047857;background:#ecfdf5;border:1px solid #a7f3d0;padding:1px 8px;border-radius:9999px}.canvas-component-card.is-field-highlighted{border-color:#f59e0b!important;box-shadow:0 0 0 3px #f59e0b59!important;animation:rpt-pulse-border 1s ease-in-out infinite alternate}@keyframes rpt-pulse-border{0%{box-shadow:0 0 0 2px #f59e0b40}to{box-shadow:0 0 0 5px #f59e0b80}}.grid-layout-status-strip{display:flex;align-items:center;justify-content:space-between;padding:6px 16px;background:#f1f5f9;border-bottom:1px solid var(--rpt-color-border, #cbd5e1);font-size:.6875rem;color:#475569}.grid-status-info{display:inline-flex;align-items:center;gap:6px;font-weight:600}.grid-status-sync{display:inline-flex;align-items:center;gap:4px;color:#059669;font-weight:600;transition:transform .2s ease}.grid-status-sync.is-pulsing{transform:scale(1.08);color:#047857}.canvas-actions{display:flex;align-items:center;gap:8px}.btn-grid-add{background:#f0fdf4;border-color:#bbf7d0;color:#16a34a}.btn-grid-add:hover{background:#dcfce7;border-color:#86efac;color:#15803d}.btn-remove-grid{display:inline-flex;align-items:center;justify-content:center;padding:4px;border:none;background:transparent;color:#94a3b8;border-radius:4px;cursor:pointer;transition:all .15s ease}.btn-remove-grid:hover{background:#fee2e2;color:#ef4444}.canvas-add-grid-banner{margin-top:24px;border:2px dashed #cbd5e1;border-radius:8px;background:#fff;padding:16px 20px;display:flex;align-items:center;gap:16px;cursor:pointer;transition:all .15s ease}.canvas-add-grid-banner:hover{border-color:#2563eb;background:#f8fafc;box-shadow:0 2px 8px #2563eb14}.add-grid-icon{width:40px;height:40px;border-radius:8px;background:#eff6ff;color:#2563eb;display:flex;align-items:center;justify-content:center;flex-shrink:0}.add-grid-text{display:flex;flex-direction:column;gap:2px;flex:1}.add-grid-title{font-size:.875rem;font-weight:600;color:#0f172a}.add-grid-sub{font-size:.75rem;color:#64748b}.btn-banner-add{padding:6px 14px;font-size:.75rem;font-weight:600;color:#2563eb;background:#eff6ff;border:1px solid #bfdbfe;border-radius:6px;cursor:pointer;white-space:nowrap;transition:all .15s ease}.canvas-add-grid-banner:hover .btn-banner-add{background:#2563eb;color:#fff;border-color:#2563eb}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i1$2.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i1$2.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i1$2.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "directive", type: i1$2.CdkDragPreview, selector: "ng-template[cdkDragPreview]", inputs: ["data", "matchSize"] }, { kind: "directive", type: i1$2.CdkDragPlaceholder, selector: "ng-template[cdkDragPlaceholder]", inputs: ["data"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: RptIconComponent, selector: "rpt-icon", inputs: ["name", "size", "color", "strokeWidth"] }, { kind: "component", type: RptDropdownComponent, selector: "rpt-dropdown", inputs: ["config", "control", "parentForm", "showStatus"] }, { kind: "component", type: RptDateRangeComponent, selector: "rpt-date-range", inputs: ["config", "control"] }, { kind: "component", type: ReportGridBridgeComponent, selector: "rpt-grid-bridge", inputs: ["gridDefinition", "data"], outputs: ["gridStateChange", "columnDefsChange", "rowClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
10499
+ `, isInline: true, styles: [":host{display:block;height:100%;background-color:#f1f5f9;font-family:var(--rpt-font-family, inherit);box-sizing:border-box}.canvas-wrapper{display:flex;flex-direction:column;height:100%}.canvas-toolbar{display:flex;align-items:center;justify-content:space-between;min-height:42px;height:42px;padding:0 24px;background:var(--rpt-color-surface, #ffffff);border-bottom:1px solid var(--rpt-color-border, #cbd5e1);box-sizing:border-box;gap:12px;overflow-x:auto;scrollbar-width:none;font-family:var(--rpt-font-family, inherit);flex-shrink:0}.canvas-toolbar::-webkit-scrollbar{display:none}.canvas-info{display:flex;align-items:center;gap:8px;font-family:var(--rpt-font-family, inherit);font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-text-muted, #64748b);white-space:nowrap;line-height:1}.info-label{color:var(--rpt-color-text-muted, #64748b);font-weight:500;font-size:var(--rpt-font-size-sm, .75rem)}.info-value{font-weight:600;color:var(--rpt-color-text, #0f172a);font-size:var(--rpt-font-size-sm, .75rem)}.info-divider{color:var(--rpt-color-border, #cbd5e1);margin:0 2px}.live-mode-badge{display:inline-flex;align-items:center;gap:4px;font-family:var(--rpt-font-family, inherit);font-size:var(--rpt-font-size-xs, .7rem);font-weight:600;color:#047857;background:#ecfdf5;border:1px solid #a7f3d0;padding:2px 8px;border-radius:9999px;line-height:1}.canvas-actions{display:flex;align-items:center;gap:8px;white-space:nowrap}.canvas-action-btn{display:inline-flex;align-items:center;gap:6px;height:28px;padding:0 10px;font-family:var(--rpt-font-family, inherit);font-size:var(--rpt-font-size-sm, .75rem);font-weight:500;letter-spacing:-.01em;color:var(--rpt-color-text-secondary, #334155);background:var(--rpt-color-surface, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);cursor:pointer;line-height:1;white-space:nowrap;box-shadow:0 1px 2px #0000000a;transition:all var(--rpt-transition-speed, .15s) ease}.canvas-action-btn:hover{background:var(--rpt-color-surface-hover, #f8fafc);border-color:var(--rpt-color-border-hover, #94a3b8);color:var(--rpt-color-text, #0f172a);box-shadow:0 2px 4px #0000000f}.canvas-action-btn.btn-grid-configured{background:#eff6ff;border-color:#bfdbfe;color:#2563eb;font-weight:600}.canvas-action-btn.btn-grid-configured:hover{background:#dbeafe;color:#1d4ed8;border-color:#93c5fd}.canvas-action-btn.btn-grid-add{background:#f0fdf4;border-color:#bbf7d0;color:#16a34a;font-weight:600}.canvas-action-btn.btn-grid-add:hover{background:#dcfce7;color:#15803d;border-color:#86efac}.canvas-action-btn:active{transform:translateY(1px)}.canvas-scroll-area{flex:1;overflow-y:auto;padding:16px}.canvas-artboard{width:100%;max-width:1400px;margin:0 auto;background:#fff;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-lg, 8px);box-shadow:0 4px 6px -1px #0000000d;min-height:480px;box-sizing:border-box}@media (max-width: 900px){.canvas-toolbar{min-height:36px;height:36px;padding:0 10px;gap:6px}.live-mode-badge{display:none}.canvas-info{font-size:.75rem;gap:5px}.canvas-action-btn{padding:0 8px;font-size:.725rem;height:28px;gap:4px}.canvas-scroll-area{padding:10px}.canvas-artboard{min-height:360px}}@media (max-width: 600px){.canvas-toolbar{padding:0 8px;gap:4px}.canvas-info .info-label,.canvas-action-btn span{display:none}.canvas-action-btn{padding:0 6px;min-width:28px;justify-content:center}}.canvas-report-header{margin-bottom:24px;padding-bottom:16px;border-bottom:1px solid var(--rpt-color-border, #e2e8f0)}.canvas-report-title{font-size:var(--rpt-font-size-xl, 1.5rem);font-weight:700;color:var(--rpt-color-text, #0f172a);margin:0 0 6px}.canvas-report-desc{font-size:var(--rpt-font-size-base, .875rem);color:var(--rpt-color-text-muted, #64748b);margin:0}.canvas-grid{display:grid;width:100%;min-height:180px;align-items:start;border-radius:6px;transition:all var(--rpt-transition-speed, .15s) ease}.canvas-component-card{container-type:inline-size;background:#fff;border:1.5px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);box-shadow:var(--rpt-box-shadow, 0 1px 2px rgba(0, 0, 0, .05));box-sizing:border-box;transition:all var(--rpt-transition-speed, .15s) ease;cursor:pointer;position:relative;overflow:visible;display:flex;flex-direction:column;min-height:104px;z-index:1}.canvas-component-card:hover{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 4px 6px -1px #2563eb1a;z-index:2}.canvas-component-card.is-selected{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 0 0 2px #2563eb40;z-index:10}.canvas-component-card:focus-within,.canvas-component-card:has(.rpt-combobox-menu),.canvas-component-card:has(.is-open){z-index:100}.canvas-component-card.is-resizing{-webkit-user-select:none;user-select:none;border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 0 0 2px #2563eb59;z-index:30;transition:none!important}.resize-handle{position:absolute;z-index:20;touch-action:none;opacity:0;pointer-events:none;transition:opacity .15s ease}.canvas-component-card.is-selected .resize-handle{opacity:1;pointer-events:auto}.resize-handle.handle-e{top:0;right:0;width:6px;height:100%;cursor:ew-resize;display:flex;align-items:center;justify-content:center}.resize-handle.handle-e:after{content:\"\";width:3px;height:24px;background:#cbd5e1;border-radius:2px;transition:background .15s ease}.resize-handle.handle-e:hover:after,.canvas-component-card.is-selected .resize-handle.handle-e:after{background:var(--rpt-color-primary, #2563eb)}.resize-handle.handle-s{bottom:0;left:0;height:6px;width:100%;cursor:ns-resize;display:flex;align-items:center;justify-content:center}.resize-handle.handle-s:after{content:\"\";height:3px;width:24px;background:#cbd5e1;border-radius:2px;transition:background .15s ease}.resize-handle.handle-s:hover:after,.canvas-component-card.is-selected .resize-handle.handle-s:after{background:var(--rpt-color-primary, #2563eb)}.resize-handle.handle-se{bottom:0;right:0;width:12px;height:12px;cursor:nwse-resize;display:flex;align-items:flex-end;justify-content:flex-end;padding:2px}.resize-handle.handle-se:after{content:\"\";width:5px;height:5px;border-right:2px solid #cbd5e1;border-bottom:2px solid #cbd5e1;transition:border-color .15s ease}.resize-handle.handle-se:hover:after,.canvas-component-card.is-selected .resize-handle.handle-se:after{border-color:var(--rpt-color-primary, #2563eb)}.resize-dimension-tooltip{position:absolute;top:38px;right:8px;background:#0f172ae6;color:#fff;font-size:.7rem;font-weight:600;padding:3px 8px;border-radius:4px;white-space:nowrap;pointer-events:none;z-index:50;box-shadow:0 2px 4px #0003}.card-header{display:flex;align-items:center;justify-content:space-between;gap:6px;padding:5px 8px;background:var(--rpt-color-surface, #f8fafc);border-bottom:1px solid var(--rpt-color-border, #e2e8f0);border-top-left-radius:var(--rpt-border-radius, 6px);border-top-right-radius:var(--rpt-border-radius, 6px);min-height:32px;box-sizing:border-box;overflow:hidden;position:relative}.canvas-component-card.is-selected .card-header{overflow:visible}.card-title-group{display:flex;align-items:center;gap:5px;cursor:grab;min-width:0;flex:1;overflow:hidden}.drag-handle-dots{color:var(--rpt-color-text-muted, #94a3b8);font-size:.85rem;letter-spacing:-2px;flex-shrink:0;-webkit-user-select:none;user-select:none}.comp-title{font-size:.75rem;font-weight:600;color:var(--rpt-color-text, #0f172a);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-webkit-user-select:none;user-select:none}.card-actions{display:flex;align-items:center;gap:4px;flex-shrink:0;margin-left:auto}.new-row-pill-static{font-size:.65rem;font-weight:600;color:#7c3aed;background:#f5f3ff;border:1px solid #ddd6fe;padding:1px 5px;border-radius:9999px;white-space:nowrap;line-height:1;flex-shrink:0}.span-pill-static{display:inline-flex;align-items:center;justify-content:center;font-size:.65rem;font-weight:600;color:var(--rpt-color-text-muted, #64748b);background:var(--rpt-color-surface, #f1f5f9);border:1px solid var(--rpt-color-border, #e2e8f0);padding:1px 6px;border-radius:9999px;line-height:1.2;white-space:nowrap;-webkit-user-select:none;user-select:none}.card-quick-controls{display:none;align-items:center;gap:3px;flex-shrink:0}.canvas-component-card:hover .span-pill-static,.canvas-component-card.is-selected .span-pill-static,.canvas-component-card:hover .new-row-pill-static,.canvas-component-card.is-selected .new-row-pill-static{display:none}.canvas-component-card:hover .card-quick-controls,.canvas-component-card.is-selected .card-quick-controls{display:inline-flex}.canvas-component-card.is-narrow .card-header{padding:4px 6px;gap:3px}.canvas-component-card.is-narrow:hover .comp-title,.canvas-component-card.is-narrow.is-selected .comp-title,.canvas-component-card.is-narrow:hover .drag-handle-dots,.canvas-component-card.is-narrow.is-selected .drag-handle-dots{display:none}.canvas-component-card.is-narrow .card-quick-controls{gap:2px}.canvas-component-card.is-narrow .span-control-group{height:18px}.canvas-component-card.is-narrow .span-btn{width:14px;height:16px}.canvas-component-card.is-narrow .span-badge{font-size:.6rem;padding:0 2px}.canvas-component-card.is-narrow .span-total{display:none}.canvas-component-card.is-narrow .card-action-btn{width:18px;height:18px}@container (max-width: 250px){.card-header{padding:4px 6px;gap:3px}.canvas-component-card:hover .comp-title,.canvas-component-card.is-selected .comp-title,.canvas-component-card:hover .drag-handle-dots,.canvas-component-card.is-selected .drag-handle-dots,.span-total{display:none}.card-quick-controls{gap:2px}.card-action-btn{width:18px;height:18px}.span-control-group{height:18px}.span-btn{width:14px;height:16px}.span-badge{font-size:.6rem;padding:0 2px}}@container (max-width: 160px){.canvas-component-card.is-selected .card-quick-controls{position:absolute;top:-30px;right:0;background:#fff;border:1.5px solid var(--rpt-color-primary, #2563eb);border-radius:6px;padding:2px 4px;gap:3px;box-shadow:0 4px 12px #2563eb2e,0 2px 4px #00000014;z-index:120;white-space:nowrap}}@media (max-width: 900px){.canvas-component-card:hover .comp-title,.canvas-component-card.is-selected .comp-title,.canvas-component-card:hover .drag-handle-dots,.canvas-component-card.is-selected .drag-handle-dots,.canvas-component-card .span-total{display:none}.canvas-component-card.is-selected .card-header{overflow:visible}.canvas-component-card.is-selected .card-quick-controls{position:absolute;top:-30px;right:0;background:#fff;border:1.5px solid var(--rpt-color-primary, #2563eb);border-radius:6px;padding:2px 4px;gap:3px;box-shadow:0 4px 12px #2563eb2e,0 2px 4px #00000014;z-index:120;white-space:nowrap}}.span-control-group{display:inline-flex;align-items:center;background:#fff;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:4px;height:20px;padding:0 1px;white-space:nowrap;flex-shrink:0}.span-btn{width:16px;height:18px;display:inline-flex;align-items:center;justify-content:center;border:none;background:transparent;padding:0;color:var(--rpt-color-text-muted, #64748b);cursor:pointer;border-radius:2px;transition:all .12s ease}.span-btn:hover:not(:disabled){background:var(--rpt-color-surface-hover, #f1f5f9);color:var(--rpt-color-primary, #2563eb)}.span-btn:disabled{opacity:.3;cursor:not-allowed}.span-badge{font-size:.65rem;font-weight:600;color:var(--rpt-color-text, #0f172a);padding:0 3px;white-space:nowrap;-webkit-user-select:none;user-select:none;line-height:1}.span-total{font-size:.6rem;color:var(--rpt-color-text-muted, #64748b);font-weight:500}.card-action-btn{width:20px;height:20px;border:none;background:transparent;border-radius:4px;display:inline-flex;align-items:center;justify-content:center;padding:0;cursor:pointer;color:var(--rpt-color-text-muted, #64748b);transition:all .12s ease;flex-shrink:0}.card-action-btn:hover{background:#e2e8f0;color:var(--rpt-color-text, #0f172a)}.card-action-btn.btn-active-toggle{background:#7c3aed;color:#fff;border-color:#7c3aed}.card-action-btn.btn-active-toggle:hover{background:#6d28d9;color:#fff}.btn-delete:hover{background:#fee2e2;color:#ef4444}.card-body{padding:8px 10px 14px;flex:1;display:flex;flex-direction:column;min-height:0;min-width:0;max-width:100%;box-sizing:border-box;overflow:visible}.mock-input-field{display:flex;flex-direction:column;gap:4px;flex:1;height:100%;min-height:0}.mock-label{font-size:.7rem;font-weight:600;color:var(--rpt-color-text-muted, #475569);flex-shrink:0}.mock-input-box,.mock-select-box{border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:6px;padding:6px 12px;font-size:var(--rpt-font-size-base, .875rem);color:var(--rpt-color-text-muted, #94a3b8);background:#fff;flex:1;min-height:38px;height:100%;display:flex;align-items:center;justify-content:space-between;box-sizing:border-box}.mock-checkbox-field{display:flex;align-items:center;gap:6px;flex:1;height:100%;min-height:0;padding-top:14px}.mock-check-box{width:18px;height:18px;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:4px;display:flex;align-items:center;justify-content:center;font-size:.65rem;color:var(--rpt-color-primary, #2563eb);flex-shrink:0}.mock-btn-wrapper{display:flex;flex:1;height:100%;min-height:38px;align-items:center;justify-content:flex-start;width:100%;min-width:0;box-sizing:border-box}.mock-btn{border-radius:var(--rpt-border-radius, 6px);padding:0 16px;height:36px;font-size:var(--rpt-font-size-base, .875rem);font-weight:500;border:1px solid transparent;cursor:pointer;width:auto;max-width:100%;display:inline-flex;align-items:center;justify-content:center;gap:6px;box-sizing:border-box;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:all .15s ease}.mock-btn.mock-btn-full{width:100%}.canvas-component-card.is-narrow .mock-btn{padding:0 6px;font-size:.775rem;width:100%;height:34px}.mock-kpi-field{display:flex;flex-direction:column;justify-content:space-between;flex:1;height:100%;min-height:0}.mock-kpi-header{display:flex;align-items:center;justify-content:space-between}.mock-kpi-value{font-size:1.25rem;font-weight:700;color:var(--rpt-color-text, #0f172a);margin:2px 0}.mock-kpi-footer{display:flex;align-items:center;gap:6px;font-size:.65rem}.mock-kpi-trend{color:#16a34a;font-weight:600}.mock-kpi-sub{color:#64748b}.mock-chart-field{display:flex;flex-direction:column;flex:1;height:100%;min-height:140px}.mock-chart-bars{display:flex;align-items:flex-end;justify-content:space-around;gap:16px;flex:1;min-height:100px;padding-top:12px;box-sizing:border-box}.mock-chart-col{flex:1;display:flex;flex-direction:column;align-items:center;height:100%;min-width:60px;max-width:140px}.mock-chart-bar{width:38px;max-width:44px;margin:0 auto;background:var(--rpt-color-primary, #2563eb);border-radius:6px 6px 0 0;opacity:.85;min-height:10px;transition:height .2s ease}.mock-bar-lbl{font-size:.6875rem;color:#64748b;margin-top:6px;text-align:center;white-space:normal;line-height:1.2}.btn-primary{background:var(--rpt-color-primary, #2563eb);color:#fff}.btn-secondary{background:#f1f5f9;color:#0f172a;border:1px solid #cbd5e1}.btn-outline{background:transparent;color:#2563eb;border:1px solid #2563eb}.btn-danger{background:#ef4444;color:#fff}.mock-generic-box{border:1px dashed #cbd5e1;border-radius:4px;padding:8px;font-size:.75rem;text-align:center;color:#64748b}.canvas-drag-placeholder{background:#2563eb0f;border:2px dashed var(--rpt-color-primary, #2563eb);border-radius:6px;min-height:80px;box-sizing:border-box;transition:transform .15s ease}.canvas-drag-preview,::ng-deep .canvas-drag-preview{background:#fff;border:2px solid var(--rpt-color-primary, #2563eb);border-radius:6px;padding:8px 14px;display:inline-flex;align-items:center;gap:8px;font-family:var(--rpt-font-family, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif)!important;font-size:.8rem;font-weight:600;color:var(--rpt-color-text, #0f172a);box-shadow:0 12px 24px -4px #00000040;z-index:10000}.preview-title,::ng-deep .preview-title{font-family:inherit!important;max-width:160px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.preview-span,::ng-deep .preview-span{font-family:inherit!important;font-size:.65rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border:1px solid #bfdbfe;padding:1px 6px;border-radius:9999px}.canvas-empty-state{grid-column:1 / -1;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:56px 28px;border:2px dashed var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-xl, 12px);background:var(--rpt-color-surface, #ffffff);text-align:center;box-shadow:var(--rpt-box-shadow-xs, 0 1px 2px 0 rgba(0, 0, 0, .04));transition:border-color var(--rpt-transition-speed, .15s) ease}.canvas-empty-state:hover{border-color:var(--rpt-color-primary, #2563eb)}.empty-hero-badge{width:56px;height:56px;border-radius:var(--rpt-border-radius-xl, 12px);background:var(--rpt-color-primary-light, #eff6ff);color:var(--rpt-color-primary, #2563eb);display:flex;align-items:center;justify-content:center;margin-bottom:16px;box-shadow:0 2px 8px #2563eb1f}.empty-hero-title{font-size:var(--rpt-font-size-lg, 1.125rem);font-weight:700;color:var(--rpt-color-text, #0f172a);margin:0 0 8px;letter-spacing:-.01em}.empty-hero-desc{font-size:var(--rpt-font-size-base, .875rem);color:var(--rpt-color-text-muted, #64748b);max-width:520px;line-height:1.5;margin:0 0 24px}.empty-hero-actions{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:10px}.empty-btn{display:inline-flex;align-items:center;gap:7px;padding:8px 16px;font-size:var(--rpt-font-size-sm, .75rem);font-weight:600;border-radius:var(--rpt-border-radius, 6px);cursor:pointer;transition:all var(--rpt-transition-speed, .15s) ease;font-family:inherit}.empty-btn-primary{background:var(--rpt-color-primary, #2563eb);color:#fff;border:1px solid var(--rpt-color-primary, #2563eb);box-shadow:0 1px 3px #2563eb33}.empty-btn-primary:hover{background:var(--rpt-color-primary-hover, #1d4ed8);border-color:var(--rpt-color-primary-hover, #1d4ed8);transform:translateY(-1px)}.empty-btn-secondary{background:#f8fafc;color:#334155;border:1px solid var(--rpt-color-border, #cbd5e1)}.empty-btn-secondary:hover{background:#f1f5f9;color:#0f172a;border-color:#94a3b8;transform:translateY(-1px)}.empty-btn-outline{background:#fff;color:var(--rpt-color-primary, #2563eb);border:1px solid #bfdbfe}.empty-btn-outline:hover{background:#eff6ff;border-color:var(--rpt-color-primary, #2563eb);transform:translateY(-1px)}.canvas-active-input{width:100%;height:32px;padding:4px 8px;font-size:.8125rem;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:4px;outline:none;box-sizing:border-box;background:#fff;color:#0f172a;transition:border-color .15s ease}.canvas-active-input:focus{border-color:var(--rpt-color-primary, #2563eb)}.canvas-active-checkbox-lbl{display:inline-flex;align-items:center;gap:6px;cursor:pointer}.canvas-live-control-wrapper{width:100%;max-width:100%;min-width:0;position:relative;z-index:1;box-sizing:border-box}.canvas-grid-box{margin-top:24px;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:8px;background:#fff;box-shadow:0 1px 3px #0000000d;overflow:hidden}.grid-preview-header{display:flex;align-items:center;justify-content:space-between;padding:10px 16px;background:var(--rpt-color-surface, #f8fafc);border-bottom:1px solid var(--rpt-color-border, #cbd5e1);font-size:.8rem;font-weight:600;color:var(--rpt-color-text, #0f172a)}.grid-title{font-weight:700}.grid-exec-badge{font-size:.6875rem;font-weight:600;padding:2px 8px;border-radius:10px}.grid-exec-badge.is-loading{background:#eff6ff;color:#2563eb}.grid-exec-badge.is-error{background:#fee2e2;color:#ef4444}.grid-exec-badge.is-success{background:#ecfdf5;color:#059669}.btn-canvas-run-grid{display:inline-flex;align-items:center;gap:5px;padding:4px 10px;font-size:.72rem;font-weight:600;color:#fff;background:var(--rpt-color-primary, #2563eb);border:none;border-radius:4px;cursor:pointer;transition:background .15s ease}.btn-canvas-run-grid:hover:not(:disabled){background:#1d4ed8}.btn-canvas-run-grid:disabled{opacity:.6;cursor:not-allowed}.btn-canvas-edit-grid{display:inline-flex;align-items:center;gap:4px;padding:4px 8px;font-size:.72rem;font-weight:500;color:#334155;background:#fff;border:1px solid #cbd5e1;border-radius:4px;cursor:pointer;transition:all .12s ease}.btn-canvas-edit-grid:hover{background:#f1f5f9}.canvas-live-grid-container{width:100%;min-height:480px;background:#fff}.live-mode-badge{display:inline-flex;align-items:center;gap:4px;font-size:.6875rem;font-weight:700;color:#047857;background:#ecfdf5;border:1px solid #a7f3d0;padding:1px 8px;border-radius:9999px}.canvas-component-card.is-field-highlighted{border-color:#f59e0b!important;box-shadow:0 0 0 3px #f59e0b59!important;animation:rpt-pulse-border 1s ease-in-out infinite alternate}@keyframes rpt-pulse-border{0%{box-shadow:0 0 0 2px #f59e0b40}to{box-shadow:0 0 0 5px #f59e0b80}}.grid-layout-status-strip{display:flex;align-items:center;justify-content:space-between;padding:6px 16px;background:#f1f5f9;border-bottom:1px solid var(--rpt-color-border, #cbd5e1);font-size:.6875rem;color:#475569}.grid-status-info{display:inline-flex;align-items:center;gap:6px;font-weight:600}.grid-status-sync{display:inline-flex;align-items:center;gap:4px;color:#059669;font-weight:600;transition:transform .2s ease}.grid-status-sync.is-pulsing{transform:scale(1.08);color:#047857}.canvas-actions{display:flex;align-items:center;gap:8px}.btn-grid-add{background:#f0fdf4;border-color:#bbf7d0;color:#16a34a}.btn-grid-add:hover{background:#dcfce7;border-color:#86efac;color:#15803d}.btn-remove-grid{display:inline-flex;align-items:center;justify-content:center;padding:4px;border:none;background:transparent;color:#94a3b8;border-radius:4px;cursor:pointer;transition:all .15s ease}.btn-remove-grid:hover{background:#fee2e2;color:#ef4444}.canvas-add-grid-banner{margin-top:24px;border:2px dashed #cbd5e1;border-radius:8px;background:#fff;padding:16px 20px;display:flex;align-items:center;gap:16px;cursor:pointer;transition:all .15s ease}.canvas-add-grid-banner:hover{border-color:#2563eb;background:#f8fafc;box-shadow:0 2px 8px #2563eb14}.add-grid-icon{width:40px;height:40px;border-radius:8px;background:#eff6ff;color:#2563eb;display:flex;align-items:center;justify-content:center;flex-shrink:0}.add-grid-text{display:flex;flex-direction:column;gap:2px;flex:1}.add-grid-title{font-size:.875rem;font-weight:600;color:#0f172a}.add-grid-sub{font-size:.75rem;color:#64748b}.btn-banner-add{padding:6px 14px;font-size:.75rem;font-weight:600;color:#2563eb;background:#eff6ff;border:1px solid #bfdbfe;border-radius:6px;cursor:pointer;white-space:nowrap;transition:all .15s ease}.canvas-add-grid-banner:hover .btn-banner-add{background:#2563eb;color:#fff;border-color:#2563eb}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i1$2.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i1$2.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i1$2.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "directive", type: i1$2.CdkDragPreview, selector: "ng-template[cdkDragPreview]", inputs: ["data", "matchSize"] }, { kind: "directive", type: i1$2.CdkDragPlaceholder, selector: "ng-template[cdkDragPlaceholder]", inputs: ["data"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: RptIconComponent, selector: "rpt-icon", inputs: ["name", "size", "color", "strokeWidth"] }, { kind: "component", type: RptDropdownComponent, selector: "rpt-dropdown", inputs: ["config", "control", "parentForm", "showStatus"] }, { kind: "component", type: RptDateRangeComponent, selector: "rpt-date-range", inputs: ["config", "control"] }, { kind: "component", type: ReportGridBridgeComponent, selector: "rpt-grid-bridge", inputs: ["gridDefinition", "data"], outputs: ["gridStateChange", "columnDefsChange", "rowClick", "selectionChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
10170
10500
  }
10171
10501
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DesignCanvasComponent, decorators: [{
10172
10502
  type: Component,
@@ -10208,7 +10538,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
10208
10538
  } @else {
10209
10539
  <button
10210
10540
  type="button"
10211
- class="canvas-action-btn"
10541
+ class="canvas-action-btn btn-grid-configured"
10212
10542
  (click)="selectGridSettings($event)"
10213
10543
  title="Configure Result Data Grid"
10214
10544
  >
@@ -10223,7 +10553,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
10223
10553
  (click)="selectReportSettings($event)"
10224
10554
  title="Configure Page Layout & Grid Settings"
10225
10555
  >
10226
- <rpt-icon name="settings" [size]="15" />
10556
+ <rpt-icon name="settings" [size]="14" />
10227
10557
  <span>Report Settings</span>
10228
10558
  </button>
10229
10559
  </div>
@@ -10263,8 +10593,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
10263
10593
  [class.is-selected]="isSelected(comp.id)"
10264
10594
  [class.is-resizing]="resizingCompId() === comp.id"
10265
10595
  [class.is-field-highlighted]="isFieldHighlighted(comp)"
10266
- [class.is-narrow]="getSpan(comp) <= 2"
10267
- [class.is-compact]="getSpan(comp) === 1"
10596
+ [class.is-narrow]="getSpan(comp) <= 4"
10597
+ [class.is-compact]="getSpan(comp) <= 2"
10268
10598
  [style.grid-column]="getGridColumn(comp)"
10269
10599
  [style.grid-row]="getGridRow(comp)"
10270
10600
  [style.width]="comp.layout?.width || 'auto'"
@@ -10318,7 +10648,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
10318
10648
  >
10319
10649
  <rpt-icon name="minus" [size]="9" />
10320
10650
  </button>
10321
- <span class="span-badge">{{ getSpan(comp) <= 2 ? getSpan(comp) : (getSpan(comp) + '/' + totalColumns()) }}</span>
10651
+ <span class="span-badge" [title]="'Column span: ' + getSpan(comp) + ' of ' + totalColumns()">
10652
+ <span class="span-num">{{ getSpan(comp) }}</span><span class="span-total">/{{ totalColumns() }}</span>
10653
+ </span>
10322
10654
  <button
10323
10655
  type="button"
10324
10656
  class="span-btn"
@@ -10682,7 +11014,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
10682
11014
  </div>
10683
11015
  </div>
10684
11016
  </div>
10685
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;height:100%;background-color:#f1f5f9;font-family:var(--rpt-font-family, inherit);box-sizing:border-box}.canvas-wrapper{display:flex;flex-direction:column;height:100%}.canvas-toolbar{display:flex;align-items:center;justify-content:space-between;min-height:46px;padding:6px 20px;background:#fff;border-bottom:1px solid var(--rpt-color-border, #cbd5e1);box-sizing:border-box}.canvas-info{display:flex;align-items:center;gap:8px;color:var(--rpt-color-text-muted, #64748b);font-size:.8125rem}.info-label{color:#64748b}.info-value{font-weight:600;color:var(--rpt-color-text, #0f172a)}.info-divider{color:var(--rpt-color-border, #cbd5e1);margin:0 2px}.canvas-action-btn{display:inline-flex;align-items:center;gap:8px;height:32px;padding:0 14px;background:#fff;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:6px;font-size:.8125rem;font-weight:500;color:#1e293b;cursor:pointer;line-height:1;white-space:nowrap;box-shadow:0 1px 2px #0000000a;transition:all var(--rpt-transition-speed, .15s) ease}.canvas-action-btn rpt-icon{color:#64748b;transition:color .15s ease}.canvas-action-btn:hover{background:var(--rpt-color-surface, #f8fafc);border-color:var(--rpt-color-primary, #2563eb);color:var(--rpt-color-primary, #2563eb);box-shadow:0 2px 4px #2563eb14}.canvas-action-btn:hover rpt-icon{color:var(--rpt-color-primary, #2563eb)}.canvas-action-btn:active{transform:translateY(1px)}.canvas-scroll-area{flex:1;overflow-y:auto;padding:16px}.canvas-artboard{width:100%;max-width:1400px;margin:0 auto;background:#fff;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-lg, 8px);box-shadow:0 4px 6px -1px #0000000d;min-height:480px;box-sizing:border-box}.canvas-report-header{margin-bottom:24px;padding-bottom:16px;border-bottom:1px solid var(--rpt-color-border, #e2e8f0)}.canvas-report-title{font-size:var(--rpt-font-size-xl, 1.5rem);font-weight:700;color:var(--rpt-color-text, #0f172a);margin:0 0 6px}.canvas-report-desc{font-size:var(--rpt-font-size-base, .875rem);color:var(--rpt-color-text-muted, #64748b);margin:0}.canvas-grid{display:grid;width:100%;min-height:180px;align-items:start;border-radius:6px;transition:all var(--rpt-transition-speed, .15s) ease}.canvas-component-card{background:#fff;border:1.5px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);box-shadow:var(--rpt-box-shadow, 0 1px 2px rgba(0, 0, 0, .05));box-sizing:border-box;transition:all var(--rpt-transition-speed, .15s) ease;cursor:pointer;position:relative;overflow:visible;display:flex;flex-direction:column;min-height:96px;z-index:1}.canvas-component-card:hover{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 4px 6px -1px #2563eb1a;z-index:2}.canvas-component-card.is-selected{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 0 0 2px #2563eb40;z-index:10}.canvas-component-card:focus-within,.canvas-component-card:has(.rpt-combobox-menu),.canvas-component-card:has(.is-open){z-index:100}.canvas-component-card.is-resizing{-webkit-user-select:none;user-select:none;border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 0 0 2px #2563eb59;z-index:30;transition:none!important}.resize-handle{position:absolute;z-index:20;touch-action:none;opacity:0;pointer-events:none;transition:opacity .15s ease}.canvas-component-card.is-selected .resize-handle{opacity:1;pointer-events:auto}.resize-handle.handle-e{top:0;right:0;width:6px;height:100%;cursor:ew-resize;display:flex;align-items:center;justify-content:center}.resize-handle.handle-e:after{content:\"\";width:3px;height:24px;background:#cbd5e1;border-radius:2px;transition:background .15s ease}.resize-handle.handle-e:hover:after,.canvas-component-card.is-selected .resize-handle.handle-e:after{background:var(--rpt-color-primary, #2563eb)}.resize-handle.handle-s{bottom:0;left:0;height:6px;width:100%;cursor:ns-resize;display:flex;align-items:center;justify-content:center}.resize-handle.handle-s:after{content:\"\";height:3px;width:24px;background:#cbd5e1;border-radius:2px;transition:background .15s ease}.resize-handle.handle-s:hover:after,.canvas-component-card.is-selected .resize-handle.handle-s:after{background:var(--rpt-color-primary, #2563eb)}.resize-handle.handle-se{bottom:0;right:0;width:12px;height:12px;cursor:nwse-resize;display:flex;align-items:flex-end;justify-content:flex-end;padding:2px}.resize-handle.handle-se:after{content:\"\";width:5px;height:5px;border-right:2px solid #cbd5e1;border-bottom:2px solid #cbd5e1;transition:border-color .15s ease}.resize-handle.handle-se:hover:after,.canvas-component-card.is-selected .resize-handle.handle-se:after{border-color:var(--rpt-color-primary, #2563eb)}.resize-dimension-tooltip{position:absolute;top:38px;right:8px;background:#0f172ae6;color:#fff;font-size:.7rem;font-weight:600;padding:3px 8px;border-radius:4px;white-space:nowrap;pointer-events:none;z-index:50;box-shadow:0 2px 4px #0003}.card-header{display:flex;align-items:center;justify-content:space-between;gap:6px;padding:5px 8px;background:var(--rpt-color-surface, #f8fafc);border-bottom:1px solid var(--rpt-color-border, #e2e8f0);border-top-left-radius:var(--rpt-border-radius, 6px);border-top-right-radius:var(--rpt-border-radius, 6px);min-height:32px;box-sizing:border-box;overflow:hidden}.card-title-group{display:flex;align-items:center;gap:5px;cursor:grab;min-width:0;flex:1;overflow:hidden}.drag-handle-dots{color:var(--rpt-color-text-muted, #94a3b8);font-size:.85rem;letter-spacing:-2px;flex-shrink:0;-webkit-user-select:none;user-select:none}.comp-title{font-size:.75rem;font-weight:600;color:var(--rpt-color-text, #0f172a);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-webkit-user-select:none;user-select:none}.card-actions{display:flex;align-items:center;gap:4px;flex-shrink:0;margin-left:auto}.new-row-pill-static{font-size:.65rem;font-weight:600;color:#7c3aed;background:#f5f3ff;border:1px solid #ddd6fe;padding:1px 5px;border-radius:9999px;white-space:nowrap;line-height:1;flex-shrink:0}.span-pill-static{display:inline-flex;align-items:center;justify-content:center;font-size:.65rem;font-weight:600;color:var(--rpt-color-text-muted, #64748b);background:var(--rpt-color-surface, #f1f5f9);border:1px solid var(--rpt-color-border, #e2e8f0);padding:1px 6px;border-radius:9999px;line-height:1.2;white-space:nowrap;-webkit-user-select:none;user-select:none}.card-quick-controls{display:none;align-items:center;gap:3px}.canvas-component-card:hover .span-pill-static,.canvas-component-card.is-selected .span-pill-static,.canvas-component-card:hover .new-row-pill-static,.canvas-component-card.is-selected .new-row-pill-static{display:none}.canvas-component-card:hover .card-quick-controls,.canvas-component-card.is-selected .card-quick-controls{display:inline-flex}.canvas-component-card.is-narrow .card-header{padding:4px 6px;gap:3px}.canvas-component-card.is-narrow:hover .comp-title,.canvas-component-card.is-narrow.is-selected .comp-title,.canvas-component-card.is-narrow:hover .drag-handle-dots,.canvas-component-card.is-narrow.is-selected .drag-handle-dots{display:none}.canvas-component-card.is-narrow .card-quick-controls{gap:2px}.canvas-component-card.is-narrow .span-control-group{height:18px}.canvas-component-card.is-narrow .span-btn{width:14px;height:16px}.canvas-component-card.is-narrow .span-badge{font-size:.6rem;padding:0 2px}.canvas-component-card.is-narrow .card-action-btn{width:18px;height:18px}.canvas-component-card.is-compact:hover .card-action-btn:not(.btn-delete),.canvas-component-card.is-compact.is-selected .card-action-btn:not(.btn-delete){display:none}.span-control-group{display:inline-flex;align-items:center;background:#fff;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:4px;height:20px;padding:0 1px;white-space:nowrap;flex-shrink:0}.span-btn{width:16px;height:18px;display:inline-flex;align-items:center;justify-content:center;border:none;background:transparent;padding:0;color:var(--rpt-color-text-muted, #64748b);cursor:pointer;border-radius:2px;transition:all .12s ease}.span-btn:hover:not(:disabled){background:var(--rpt-color-surface-hover, #f1f5f9);color:var(--rpt-color-primary, #2563eb)}.span-btn:disabled{opacity:.3;cursor:not-allowed}.span-badge{font-size:.65rem;font-weight:600;color:var(--rpt-color-text, #0f172a);padding:0 3px;white-space:nowrap;-webkit-user-select:none;user-select:none;line-height:1}.card-action-btn{width:20px;height:20px;border:none;background:transparent;border-radius:4px;display:inline-flex;align-items:center;justify-content:center;padding:0;cursor:pointer;color:var(--rpt-color-text-muted, #64748b);transition:all .12s ease;flex-shrink:0}.card-action-btn:hover{background:#e2e8f0;color:var(--rpt-color-text, #0f172a)}.card-action-btn.btn-active-toggle{background:#7c3aed;color:#fff;border-color:#7c3aed}.card-action-btn.btn-active-toggle:hover{background:#6d28d9;color:#fff}.btn-delete:hover{background:#fee2e2;color:#ef4444}.card-body{padding:8px 12px 8px 10px;flex:1;display:flex;flex-direction:column;min-height:0;box-sizing:border-box;overflow:visible}.mock-input-field{display:flex;flex-direction:column;gap:4px;flex:1;height:100%;min-height:0}.mock-label{font-size:.7rem;font-weight:600;color:var(--rpt-color-text-muted, #475569);flex-shrink:0}.mock-input-box,.mock-select-box{border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:6px;padding:6px 12px;font-size:var(--rpt-font-size-base, .875rem);color:var(--rpt-color-text-muted, #94a3b8);background:#fff;flex:1;min-height:38px;height:100%;display:flex;align-items:center;justify-content:space-between;box-sizing:border-box}.mock-checkbox-field{display:flex;align-items:center;gap:6px;flex:1;height:100%;min-height:0;padding-top:14px}.mock-check-box{width:18px;height:18px;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:4px;display:flex;align-items:center;justify-content:center;font-size:.65rem;color:var(--rpt-color-primary, #2563eb);flex-shrink:0}.mock-btn-wrapper{display:flex;flex:1;height:100%;min-height:38px;align-items:center;justify-content:flex-start;width:100%;min-width:0;box-sizing:border-box}.mock-btn{border-radius:var(--rpt-border-radius, 6px);padding:0 16px;height:36px;font-size:var(--rpt-font-size-base, .875rem);font-weight:500;border:1px solid transparent;cursor:pointer;width:auto;max-width:100%;display:inline-flex;align-items:center;justify-content:center;gap:6px;box-sizing:border-box;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:all .15s ease}.mock-btn.mock-btn-full{width:100%}.canvas-component-card.is-narrow .mock-btn{padding:0 6px;font-size:.775rem;width:100%;height:34px}.mock-kpi-field{display:flex;flex-direction:column;justify-content:space-between;flex:1;height:100%;min-height:0}.mock-kpi-header{display:flex;align-items:center;justify-content:space-between}.mock-kpi-value{font-size:1.25rem;font-weight:700;color:var(--rpt-color-text, #0f172a);margin:2px 0}.mock-kpi-footer{display:flex;align-items:center;gap:6px;font-size:.65rem}.mock-kpi-trend{color:#16a34a;font-weight:600}.mock-kpi-sub{color:#64748b}.mock-chart-field{display:flex;flex-direction:column;flex:1;height:100%;min-height:140px}.mock-chart-bars{display:flex;align-items:flex-end;justify-content:space-around;gap:16px;flex:1;min-height:100px;padding-top:12px;box-sizing:border-box}.mock-chart-col{flex:1;display:flex;flex-direction:column;align-items:center;height:100%;min-width:60px;max-width:140px}.mock-chart-bar{width:38px;max-width:44px;margin:0 auto;background:var(--rpt-color-primary, #2563eb);border-radius:6px 6px 0 0;opacity:.85;min-height:10px;transition:height .2s ease}.mock-bar-lbl{font-size:.6875rem;color:#64748b;margin-top:6px;text-align:center;white-space:normal;line-height:1.2}.btn-primary{background:var(--rpt-color-primary, #2563eb);color:#fff}.btn-secondary{background:#f1f5f9;color:#0f172a;border:1px solid #cbd5e1}.btn-outline{background:transparent;color:#2563eb;border:1px solid #2563eb}.btn-danger{background:#ef4444;color:#fff}.mock-generic-box{border:1px dashed #cbd5e1;border-radius:4px;padding:8px;font-size:.75rem;text-align:center;color:#64748b}.canvas-drag-placeholder{background:#2563eb0f;border:2px dashed var(--rpt-color-primary, #2563eb);border-radius:6px;min-height:80px;box-sizing:border-box;transition:transform .15s ease}.canvas-drag-preview,::ng-deep .canvas-drag-preview{background:#fff;border:2px solid var(--rpt-color-primary, #2563eb);border-radius:6px;padding:8px 14px;display:inline-flex;align-items:center;gap:8px;font-family:var(--rpt-font-family, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif)!important;font-size:.8rem;font-weight:600;color:var(--rpt-color-text, #0f172a);box-shadow:0 12px 24px -4px #00000040;z-index:10000}.preview-title,::ng-deep .preview-title{font-family:inherit!important;max-width:160px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.preview-span,::ng-deep .preview-span{font-family:inherit!important;font-size:.65rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border:1px solid #bfdbfe;padding:1px 6px;border-radius:9999px}.canvas-empty-state{grid-column:1 / -1;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:56px 28px;border:2px dashed var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-xl, 12px);background:var(--rpt-color-surface, #ffffff);text-align:center;box-shadow:var(--rpt-box-shadow-xs, 0 1px 2px 0 rgba(0, 0, 0, .04));transition:border-color var(--rpt-transition-speed, .15s) ease}.canvas-empty-state:hover{border-color:var(--rpt-color-primary, #2563eb)}.empty-hero-badge{width:56px;height:56px;border-radius:var(--rpt-border-radius-xl, 12px);background:var(--rpt-color-primary-light, #eff6ff);color:var(--rpt-color-primary, #2563eb);display:flex;align-items:center;justify-content:center;margin-bottom:16px;box-shadow:0 2px 8px #2563eb1f}.empty-hero-title{font-size:var(--rpt-font-size-lg, 1.125rem);font-weight:700;color:var(--rpt-color-text, #0f172a);margin:0 0 8px;letter-spacing:-.01em}.empty-hero-desc{font-size:var(--rpt-font-size-base, .875rem);color:var(--rpt-color-text-muted, #64748b);max-width:520px;line-height:1.5;margin:0 0 24px}.empty-hero-actions{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:10px}.empty-btn{display:inline-flex;align-items:center;gap:7px;padding:8px 16px;font-size:var(--rpt-font-size-sm, .75rem);font-weight:600;border-radius:var(--rpt-border-radius, 6px);cursor:pointer;transition:all var(--rpt-transition-speed, .15s) ease;font-family:inherit}.empty-btn-primary{background:var(--rpt-color-primary, #2563eb);color:#fff;border:1px solid var(--rpt-color-primary, #2563eb);box-shadow:0 1px 3px #2563eb33}.empty-btn-primary:hover{background:var(--rpt-color-primary-hover, #1d4ed8);border-color:var(--rpt-color-primary-hover, #1d4ed8);transform:translateY(-1px)}.empty-btn-secondary{background:#f8fafc;color:#334155;border:1px solid var(--rpt-color-border, #cbd5e1)}.empty-btn-secondary:hover{background:#f1f5f9;color:#0f172a;border-color:#94a3b8;transform:translateY(-1px)}.empty-btn-outline{background:#fff;color:var(--rpt-color-primary, #2563eb);border:1px solid #bfdbfe}.empty-btn-outline:hover{background:#eff6ff;border-color:var(--rpt-color-primary, #2563eb);transform:translateY(-1px)}.canvas-active-input{width:100%;height:32px;padding:4px 8px;font-size:.8125rem;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:4px;outline:none;box-sizing:border-box;background:#fff;color:#0f172a;transition:border-color .15s ease}.canvas-active-input:focus{border-color:var(--rpt-color-primary, #2563eb)}.canvas-active-checkbox-lbl{display:inline-flex;align-items:center;gap:6px;cursor:pointer}.canvas-live-control-wrapper{width:100%;position:relative;z-index:1}.canvas-grid-box{margin-top:24px;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:8px;background:#fff;box-shadow:0 1px 3px #0000000d;overflow:hidden}.grid-preview-header{display:flex;align-items:center;justify-content:space-between;padding:10px 16px;background:var(--rpt-color-surface, #f8fafc);border-bottom:1px solid var(--rpt-color-border, #cbd5e1);font-size:.8rem;font-weight:600;color:var(--rpt-color-text, #0f172a)}.grid-title{font-weight:700}.grid-exec-badge{font-size:.6875rem;font-weight:600;padding:2px 8px;border-radius:10px}.grid-exec-badge.is-loading{background:#eff6ff;color:#2563eb}.grid-exec-badge.is-error{background:#fee2e2;color:#ef4444}.grid-exec-badge.is-success{background:#ecfdf5;color:#059669}.btn-canvas-run-grid{display:inline-flex;align-items:center;gap:5px;padding:4px 10px;font-size:.72rem;font-weight:600;color:#fff;background:var(--rpt-color-primary, #2563eb);border:none;border-radius:4px;cursor:pointer;transition:background .15s ease}.btn-canvas-run-grid:hover:not(:disabled){background:#1d4ed8}.btn-canvas-run-grid:disabled{opacity:.6;cursor:not-allowed}.btn-canvas-edit-grid{display:inline-flex;align-items:center;gap:4px;padding:4px 8px;font-size:.72rem;font-weight:500;color:#334155;background:#fff;border:1px solid #cbd5e1;border-radius:4px;cursor:pointer;transition:all .12s ease}.btn-canvas-edit-grid:hover{background:#f1f5f9}.canvas-live-grid-container{width:100%;min-height:480px;background:#fff}.live-mode-badge{display:inline-flex;align-items:center;gap:4px;font-size:.6875rem;font-weight:700;color:#047857;background:#ecfdf5;border:1px solid #a7f3d0;padding:1px 8px;border-radius:9999px}.canvas-component-card.is-field-highlighted{border-color:#f59e0b!important;box-shadow:0 0 0 3px #f59e0b59!important;animation:rpt-pulse-border 1s ease-in-out infinite alternate}@keyframes rpt-pulse-border{0%{box-shadow:0 0 0 2px #f59e0b40}to{box-shadow:0 0 0 5px #f59e0b80}}.grid-layout-status-strip{display:flex;align-items:center;justify-content:space-between;padding:6px 16px;background:#f1f5f9;border-bottom:1px solid var(--rpt-color-border, #cbd5e1);font-size:.6875rem;color:#475569}.grid-status-info{display:inline-flex;align-items:center;gap:6px;font-weight:600}.grid-status-sync{display:inline-flex;align-items:center;gap:4px;color:#059669;font-weight:600;transition:transform .2s ease}.grid-status-sync.is-pulsing{transform:scale(1.08);color:#047857}.canvas-actions{display:flex;align-items:center;gap:8px}.btn-grid-add{background:#f0fdf4;border-color:#bbf7d0;color:#16a34a}.btn-grid-add:hover{background:#dcfce7;border-color:#86efac;color:#15803d}.btn-remove-grid{display:inline-flex;align-items:center;justify-content:center;padding:4px;border:none;background:transparent;color:#94a3b8;border-radius:4px;cursor:pointer;transition:all .15s ease}.btn-remove-grid:hover{background:#fee2e2;color:#ef4444}.canvas-add-grid-banner{margin-top:24px;border:2px dashed #cbd5e1;border-radius:8px;background:#fff;padding:16px 20px;display:flex;align-items:center;gap:16px;cursor:pointer;transition:all .15s ease}.canvas-add-grid-banner:hover{border-color:#2563eb;background:#f8fafc;box-shadow:0 2px 8px #2563eb14}.add-grid-icon{width:40px;height:40px;border-radius:8px;background:#eff6ff;color:#2563eb;display:flex;align-items:center;justify-content:center;flex-shrink:0}.add-grid-text{display:flex;flex-direction:column;gap:2px;flex:1}.add-grid-title{font-size:.875rem;font-weight:600;color:#0f172a}.add-grid-sub{font-size:.75rem;color:#64748b}.btn-banner-add{padding:6px 14px;font-size:.75rem;font-weight:600;color:#2563eb;background:#eff6ff;border:1px solid #bfdbfe;border-radius:6px;cursor:pointer;white-space:nowrap;transition:all .15s ease}.canvas-add-grid-banner:hover .btn-banner-add{background:#2563eb;color:#fff;border-color:#2563eb}\n"] }]
11017
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;height:100%;background-color:#f1f5f9;font-family:var(--rpt-font-family, inherit);box-sizing:border-box}.canvas-wrapper{display:flex;flex-direction:column;height:100%}.canvas-toolbar{display:flex;align-items:center;justify-content:space-between;min-height:42px;height:42px;padding:0 24px;background:var(--rpt-color-surface, #ffffff);border-bottom:1px solid var(--rpt-color-border, #cbd5e1);box-sizing:border-box;gap:12px;overflow-x:auto;scrollbar-width:none;font-family:var(--rpt-font-family, inherit);flex-shrink:0}.canvas-toolbar::-webkit-scrollbar{display:none}.canvas-info{display:flex;align-items:center;gap:8px;font-family:var(--rpt-font-family, inherit);font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-text-muted, #64748b);white-space:nowrap;line-height:1}.info-label{color:var(--rpt-color-text-muted, #64748b);font-weight:500;font-size:var(--rpt-font-size-sm, .75rem)}.info-value{font-weight:600;color:var(--rpt-color-text, #0f172a);font-size:var(--rpt-font-size-sm, .75rem)}.info-divider{color:var(--rpt-color-border, #cbd5e1);margin:0 2px}.live-mode-badge{display:inline-flex;align-items:center;gap:4px;font-family:var(--rpt-font-family, inherit);font-size:var(--rpt-font-size-xs, .7rem);font-weight:600;color:#047857;background:#ecfdf5;border:1px solid #a7f3d0;padding:2px 8px;border-radius:9999px;line-height:1}.canvas-actions{display:flex;align-items:center;gap:8px;white-space:nowrap}.canvas-action-btn{display:inline-flex;align-items:center;gap:6px;height:28px;padding:0 10px;font-family:var(--rpt-font-family, inherit);font-size:var(--rpt-font-size-sm, .75rem);font-weight:500;letter-spacing:-.01em;color:var(--rpt-color-text-secondary, #334155);background:var(--rpt-color-surface, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);cursor:pointer;line-height:1;white-space:nowrap;box-shadow:0 1px 2px #0000000a;transition:all var(--rpt-transition-speed, .15s) ease}.canvas-action-btn:hover{background:var(--rpt-color-surface-hover, #f8fafc);border-color:var(--rpt-color-border-hover, #94a3b8);color:var(--rpt-color-text, #0f172a);box-shadow:0 2px 4px #0000000f}.canvas-action-btn.btn-grid-configured{background:#eff6ff;border-color:#bfdbfe;color:#2563eb;font-weight:600}.canvas-action-btn.btn-grid-configured:hover{background:#dbeafe;color:#1d4ed8;border-color:#93c5fd}.canvas-action-btn.btn-grid-add{background:#f0fdf4;border-color:#bbf7d0;color:#16a34a;font-weight:600}.canvas-action-btn.btn-grid-add:hover{background:#dcfce7;color:#15803d;border-color:#86efac}.canvas-action-btn:active{transform:translateY(1px)}.canvas-scroll-area{flex:1;overflow-y:auto;padding:16px}.canvas-artboard{width:100%;max-width:1400px;margin:0 auto;background:#fff;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-lg, 8px);box-shadow:0 4px 6px -1px #0000000d;min-height:480px;box-sizing:border-box}@media (max-width: 900px){.canvas-toolbar{min-height:36px;height:36px;padding:0 10px;gap:6px}.live-mode-badge{display:none}.canvas-info{font-size:.75rem;gap:5px}.canvas-action-btn{padding:0 8px;font-size:.725rem;height:28px;gap:4px}.canvas-scroll-area{padding:10px}.canvas-artboard{min-height:360px}}@media (max-width: 600px){.canvas-toolbar{padding:0 8px;gap:4px}.canvas-info .info-label,.canvas-action-btn span{display:none}.canvas-action-btn{padding:0 6px;min-width:28px;justify-content:center}}.canvas-report-header{margin-bottom:24px;padding-bottom:16px;border-bottom:1px solid var(--rpt-color-border, #e2e8f0)}.canvas-report-title{font-size:var(--rpt-font-size-xl, 1.5rem);font-weight:700;color:var(--rpt-color-text, #0f172a);margin:0 0 6px}.canvas-report-desc{font-size:var(--rpt-font-size-base, .875rem);color:var(--rpt-color-text-muted, #64748b);margin:0}.canvas-grid{display:grid;width:100%;min-height:180px;align-items:start;border-radius:6px;transition:all var(--rpt-transition-speed, .15s) ease}.canvas-component-card{container-type:inline-size;background:#fff;border:1.5px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);box-shadow:var(--rpt-box-shadow, 0 1px 2px rgba(0, 0, 0, .05));box-sizing:border-box;transition:all var(--rpt-transition-speed, .15s) ease;cursor:pointer;position:relative;overflow:visible;display:flex;flex-direction:column;min-height:104px;z-index:1}.canvas-component-card:hover{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 4px 6px -1px #2563eb1a;z-index:2}.canvas-component-card.is-selected{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 0 0 2px #2563eb40;z-index:10}.canvas-component-card:focus-within,.canvas-component-card:has(.rpt-combobox-menu),.canvas-component-card:has(.is-open){z-index:100}.canvas-component-card.is-resizing{-webkit-user-select:none;user-select:none;border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 0 0 2px #2563eb59;z-index:30;transition:none!important}.resize-handle{position:absolute;z-index:20;touch-action:none;opacity:0;pointer-events:none;transition:opacity .15s ease}.canvas-component-card.is-selected .resize-handle{opacity:1;pointer-events:auto}.resize-handle.handle-e{top:0;right:0;width:6px;height:100%;cursor:ew-resize;display:flex;align-items:center;justify-content:center}.resize-handle.handle-e:after{content:\"\";width:3px;height:24px;background:#cbd5e1;border-radius:2px;transition:background .15s ease}.resize-handle.handle-e:hover:after,.canvas-component-card.is-selected .resize-handle.handle-e:after{background:var(--rpt-color-primary, #2563eb)}.resize-handle.handle-s{bottom:0;left:0;height:6px;width:100%;cursor:ns-resize;display:flex;align-items:center;justify-content:center}.resize-handle.handle-s:after{content:\"\";height:3px;width:24px;background:#cbd5e1;border-radius:2px;transition:background .15s ease}.resize-handle.handle-s:hover:after,.canvas-component-card.is-selected .resize-handle.handle-s:after{background:var(--rpt-color-primary, #2563eb)}.resize-handle.handle-se{bottom:0;right:0;width:12px;height:12px;cursor:nwse-resize;display:flex;align-items:flex-end;justify-content:flex-end;padding:2px}.resize-handle.handle-se:after{content:\"\";width:5px;height:5px;border-right:2px solid #cbd5e1;border-bottom:2px solid #cbd5e1;transition:border-color .15s ease}.resize-handle.handle-se:hover:after,.canvas-component-card.is-selected .resize-handle.handle-se:after{border-color:var(--rpt-color-primary, #2563eb)}.resize-dimension-tooltip{position:absolute;top:38px;right:8px;background:#0f172ae6;color:#fff;font-size:.7rem;font-weight:600;padding:3px 8px;border-radius:4px;white-space:nowrap;pointer-events:none;z-index:50;box-shadow:0 2px 4px #0003}.card-header{display:flex;align-items:center;justify-content:space-between;gap:6px;padding:5px 8px;background:var(--rpt-color-surface, #f8fafc);border-bottom:1px solid var(--rpt-color-border, #e2e8f0);border-top-left-radius:var(--rpt-border-radius, 6px);border-top-right-radius:var(--rpt-border-radius, 6px);min-height:32px;box-sizing:border-box;overflow:hidden;position:relative}.canvas-component-card.is-selected .card-header{overflow:visible}.card-title-group{display:flex;align-items:center;gap:5px;cursor:grab;min-width:0;flex:1;overflow:hidden}.drag-handle-dots{color:var(--rpt-color-text-muted, #94a3b8);font-size:.85rem;letter-spacing:-2px;flex-shrink:0;-webkit-user-select:none;user-select:none}.comp-title{font-size:.75rem;font-weight:600;color:var(--rpt-color-text, #0f172a);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-webkit-user-select:none;user-select:none}.card-actions{display:flex;align-items:center;gap:4px;flex-shrink:0;margin-left:auto}.new-row-pill-static{font-size:.65rem;font-weight:600;color:#7c3aed;background:#f5f3ff;border:1px solid #ddd6fe;padding:1px 5px;border-radius:9999px;white-space:nowrap;line-height:1;flex-shrink:0}.span-pill-static{display:inline-flex;align-items:center;justify-content:center;font-size:.65rem;font-weight:600;color:var(--rpt-color-text-muted, #64748b);background:var(--rpt-color-surface, #f1f5f9);border:1px solid var(--rpt-color-border, #e2e8f0);padding:1px 6px;border-radius:9999px;line-height:1.2;white-space:nowrap;-webkit-user-select:none;user-select:none}.card-quick-controls{display:none;align-items:center;gap:3px;flex-shrink:0}.canvas-component-card:hover .span-pill-static,.canvas-component-card.is-selected .span-pill-static,.canvas-component-card:hover .new-row-pill-static,.canvas-component-card.is-selected .new-row-pill-static{display:none}.canvas-component-card:hover .card-quick-controls,.canvas-component-card.is-selected .card-quick-controls{display:inline-flex}.canvas-component-card.is-narrow .card-header{padding:4px 6px;gap:3px}.canvas-component-card.is-narrow:hover .comp-title,.canvas-component-card.is-narrow.is-selected .comp-title,.canvas-component-card.is-narrow:hover .drag-handle-dots,.canvas-component-card.is-narrow.is-selected .drag-handle-dots{display:none}.canvas-component-card.is-narrow .card-quick-controls{gap:2px}.canvas-component-card.is-narrow .span-control-group{height:18px}.canvas-component-card.is-narrow .span-btn{width:14px;height:16px}.canvas-component-card.is-narrow .span-badge{font-size:.6rem;padding:0 2px}.canvas-component-card.is-narrow .span-total{display:none}.canvas-component-card.is-narrow .card-action-btn{width:18px;height:18px}@container (max-width: 250px){.card-header{padding:4px 6px;gap:3px}.canvas-component-card:hover .comp-title,.canvas-component-card.is-selected .comp-title,.canvas-component-card:hover .drag-handle-dots,.canvas-component-card.is-selected .drag-handle-dots,.span-total{display:none}.card-quick-controls{gap:2px}.card-action-btn{width:18px;height:18px}.span-control-group{height:18px}.span-btn{width:14px;height:16px}.span-badge{font-size:.6rem;padding:0 2px}}@container (max-width: 160px){.canvas-component-card.is-selected .card-quick-controls{position:absolute;top:-30px;right:0;background:#fff;border:1.5px solid var(--rpt-color-primary, #2563eb);border-radius:6px;padding:2px 4px;gap:3px;box-shadow:0 4px 12px #2563eb2e,0 2px 4px #00000014;z-index:120;white-space:nowrap}}@media (max-width: 900px){.canvas-component-card:hover .comp-title,.canvas-component-card.is-selected .comp-title,.canvas-component-card:hover .drag-handle-dots,.canvas-component-card.is-selected .drag-handle-dots,.canvas-component-card .span-total{display:none}.canvas-component-card.is-selected .card-header{overflow:visible}.canvas-component-card.is-selected .card-quick-controls{position:absolute;top:-30px;right:0;background:#fff;border:1.5px solid var(--rpt-color-primary, #2563eb);border-radius:6px;padding:2px 4px;gap:3px;box-shadow:0 4px 12px #2563eb2e,0 2px 4px #00000014;z-index:120;white-space:nowrap}}.span-control-group{display:inline-flex;align-items:center;background:#fff;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:4px;height:20px;padding:0 1px;white-space:nowrap;flex-shrink:0}.span-btn{width:16px;height:18px;display:inline-flex;align-items:center;justify-content:center;border:none;background:transparent;padding:0;color:var(--rpt-color-text-muted, #64748b);cursor:pointer;border-radius:2px;transition:all .12s ease}.span-btn:hover:not(:disabled){background:var(--rpt-color-surface-hover, #f1f5f9);color:var(--rpt-color-primary, #2563eb)}.span-btn:disabled{opacity:.3;cursor:not-allowed}.span-badge{font-size:.65rem;font-weight:600;color:var(--rpt-color-text, #0f172a);padding:0 3px;white-space:nowrap;-webkit-user-select:none;user-select:none;line-height:1}.span-total{font-size:.6rem;color:var(--rpt-color-text-muted, #64748b);font-weight:500}.card-action-btn{width:20px;height:20px;border:none;background:transparent;border-radius:4px;display:inline-flex;align-items:center;justify-content:center;padding:0;cursor:pointer;color:var(--rpt-color-text-muted, #64748b);transition:all .12s ease;flex-shrink:0}.card-action-btn:hover{background:#e2e8f0;color:var(--rpt-color-text, #0f172a)}.card-action-btn.btn-active-toggle{background:#7c3aed;color:#fff;border-color:#7c3aed}.card-action-btn.btn-active-toggle:hover{background:#6d28d9;color:#fff}.btn-delete:hover{background:#fee2e2;color:#ef4444}.card-body{padding:8px 10px 14px;flex:1;display:flex;flex-direction:column;min-height:0;min-width:0;max-width:100%;box-sizing:border-box;overflow:visible}.mock-input-field{display:flex;flex-direction:column;gap:4px;flex:1;height:100%;min-height:0}.mock-label{font-size:.7rem;font-weight:600;color:var(--rpt-color-text-muted, #475569);flex-shrink:0}.mock-input-box,.mock-select-box{border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:6px;padding:6px 12px;font-size:var(--rpt-font-size-base, .875rem);color:var(--rpt-color-text-muted, #94a3b8);background:#fff;flex:1;min-height:38px;height:100%;display:flex;align-items:center;justify-content:space-between;box-sizing:border-box}.mock-checkbox-field{display:flex;align-items:center;gap:6px;flex:1;height:100%;min-height:0;padding-top:14px}.mock-check-box{width:18px;height:18px;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:4px;display:flex;align-items:center;justify-content:center;font-size:.65rem;color:var(--rpt-color-primary, #2563eb);flex-shrink:0}.mock-btn-wrapper{display:flex;flex:1;height:100%;min-height:38px;align-items:center;justify-content:flex-start;width:100%;min-width:0;box-sizing:border-box}.mock-btn{border-radius:var(--rpt-border-radius, 6px);padding:0 16px;height:36px;font-size:var(--rpt-font-size-base, .875rem);font-weight:500;border:1px solid transparent;cursor:pointer;width:auto;max-width:100%;display:inline-flex;align-items:center;justify-content:center;gap:6px;box-sizing:border-box;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:all .15s ease}.mock-btn.mock-btn-full{width:100%}.canvas-component-card.is-narrow .mock-btn{padding:0 6px;font-size:.775rem;width:100%;height:34px}.mock-kpi-field{display:flex;flex-direction:column;justify-content:space-between;flex:1;height:100%;min-height:0}.mock-kpi-header{display:flex;align-items:center;justify-content:space-between}.mock-kpi-value{font-size:1.25rem;font-weight:700;color:var(--rpt-color-text, #0f172a);margin:2px 0}.mock-kpi-footer{display:flex;align-items:center;gap:6px;font-size:.65rem}.mock-kpi-trend{color:#16a34a;font-weight:600}.mock-kpi-sub{color:#64748b}.mock-chart-field{display:flex;flex-direction:column;flex:1;height:100%;min-height:140px}.mock-chart-bars{display:flex;align-items:flex-end;justify-content:space-around;gap:16px;flex:1;min-height:100px;padding-top:12px;box-sizing:border-box}.mock-chart-col{flex:1;display:flex;flex-direction:column;align-items:center;height:100%;min-width:60px;max-width:140px}.mock-chart-bar{width:38px;max-width:44px;margin:0 auto;background:var(--rpt-color-primary, #2563eb);border-radius:6px 6px 0 0;opacity:.85;min-height:10px;transition:height .2s ease}.mock-bar-lbl{font-size:.6875rem;color:#64748b;margin-top:6px;text-align:center;white-space:normal;line-height:1.2}.btn-primary{background:var(--rpt-color-primary, #2563eb);color:#fff}.btn-secondary{background:#f1f5f9;color:#0f172a;border:1px solid #cbd5e1}.btn-outline{background:transparent;color:#2563eb;border:1px solid #2563eb}.btn-danger{background:#ef4444;color:#fff}.mock-generic-box{border:1px dashed #cbd5e1;border-radius:4px;padding:8px;font-size:.75rem;text-align:center;color:#64748b}.canvas-drag-placeholder{background:#2563eb0f;border:2px dashed var(--rpt-color-primary, #2563eb);border-radius:6px;min-height:80px;box-sizing:border-box;transition:transform .15s ease}.canvas-drag-preview,::ng-deep .canvas-drag-preview{background:#fff;border:2px solid var(--rpt-color-primary, #2563eb);border-radius:6px;padding:8px 14px;display:inline-flex;align-items:center;gap:8px;font-family:var(--rpt-font-family, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif)!important;font-size:.8rem;font-weight:600;color:var(--rpt-color-text, #0f172a);box-shadow:0 12px 24px -4px #00000040;z-index:10000}.preview-title,::ng-deep .preview-title{font-family:inherit!important;max-width:160px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.preview-span,::ng-deep .preview-span{font-family:inherit!important;font-size:.65rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border:1px solid #bfdbfe;padding:1px 6px;border-radius:9999px}.canvas-empty-state{grid-column:1 / -1;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:56px 28px;border:2px dashed var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-xl, 12px);background:var(--rpt-color-surface, #ffffff);text-align:center;box-shadow:var(--rpt-box-shadow-xs, 0 1px 2px 0 rgba(0, 0, 0, .04));transition:border-color var(--rpt-transition-speed, .15s) ease}.canvas-empty-state:hover{border-color:var(--rpt-color-primary, #2563eb)}.empty-hero-badge{width:56px;height:56px;border-radius:var(--rpt-border-radius-xl, 12px);background:var(--rpt-color-primary-light, #eff6ff);color:var(--rpt-color-primary, #2563eb);display:flex;align-items:center;justify-content:center;margin-bottom:16px;box-shadow:0 2px 8px #2563eb1f}.empty-hero-title{font-size:var(--rpt-font-size-lg, 1.125rem);font-weight:700;color:var(--rpt-color-text, #0f172a);margin:0 0 8px;letter-spacing:-.01em}.empty-hero-desc{font-size:var(--rpt-font-size-base, .875rem);color:var(--rpt-color-text-muted, #64748b);max-width:520px;line-height:1.5;margin:0 0 24px}.empty-hero-actions{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:10px}.empty-btn{display:inline-flex;align-items:center;gap:7px;padding:8px 16px;font-size:var(--rpt-font-size-sm, .75rem);font-weight:600;border-radius:var(--rpt-border-radius, 6px);cursor:pointer;transition:all var(--rpt-transition-speed, .15s) ease;font-family:inherit}.empty-btn-primary{background:var(--rpt-color-primary, #2563eb);color:#fff;border:1px solid var(--rpt-color-primary, #2563eb);box-shadow:0 1px 3px #2563eb33}.empty-btn-primary:hover{background:var(--rpt-color-primary-hover, #1d4ed8);border-color:var(--rpt-color-primary-hover, #1d4ed8);transform:translateY(-1px)}.empty-btn-secondary{background:#f8fafc;color:#334155;border:1px solid var(--rpt-color-border, #cbd5e1)}.empty-btn-secondary:hover{background:#f1f5f9;color:#0f172a;border-color:#94a3b8;transform:translateY(-1px)}.empty-btn-outline{background:#fff;color:var(--rpt-color-primary, #2563eb);border:1px solid #bfdbfe}.empty-btn-outline:hover{background:#eff6ff;border-color:var(--rpt-color-primary, #2563eb);transform:translateY(-1px)}.canvas-active-input{width:100%;height:32px;padding:4px 8px;font-size:.8125rem;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:4px;outline:none;box-sizing:border-box;background:#fff;color:#0f172a;transition:border-color .15s ease}.canvas-active-input:focus{border-color:var(--rpt-color-primary, #2563eb)}.canvas-active-checkbox-lbl{display:inline-flex;align-items:center;gap:6px;cursor:pointer}.canvas-live-control-wrapper{width:100%;max-width:100%;min-width:0;position:relative;z-index:1;box-sizing:border-box}.canvas-grid-box{margin-top:24px;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:8px;background:#fff;box-shadow:0 1px 3px #0000000d;overflow:hidden}.grid-preview-header{display:flex;align-items:center;justify-content:space-between;padding:10px 16px;background:var(--rpt-color-surface, #f8fafc);border-bottom:1px solid var(--rpt-color-border, #cbd5e1);font-size:.8rem;font-weight:600;color:var(--rpt-color-text, #0f172a)}.grid-title{font-weight:700}.grid-exec-badge{font-size:.6875rem;font-weight:600;padding:2px 8px;border-radius:10px}.grid-exec-badge.is-loading{background:#eff6ff;color:#2563eb}.grid-exec-badge.is-error{background:#fee2e2;color:#ef4444}.grid-exec-badge.is-success{background:#ecfdf5;color:#059669}.btn-canvas-run-grid{display:inline-flex;align-items:center;gap:5px;padding:4px 10px;font-size:.72rem;font-weight:600;color:#fff;background:var(--rpt-color-primary, #2563eb);border:none;border-radius:4px;cursor:pointer;transition:background .15s ease}.btn-canvas-run-grid:hover:not(:disabled){background:#1d4ed8}.btn-canvas-run-grid:disabled{opacity:.6;cursor:not-allowed}.btn-canvas-edit-grid{display:inline-flex;align-items:center;gap:4px;padding:4px 8px;font-size:.72rem;font-weight:500;color:#334155;background:#fff;border:1px solid #cbd5e1;border-radius:4px;cursor:pointer;transition:all .12s ease}.btn-canvas-edit-grid:hover{background:#f1f5f9}.canvas-live-grid-container{width:100%;min-height:480px;background:#fff}.live-mode-badge{display:inline-flex;align-items:center;gap:4px;font-size:.6875rem;font-weight:700;color:#047857;background:#ecfdf5;border:1px solid #a7f3d0;padding:1px 8px;border-radius:9999px}.canvas-component-card.is-field-highlighted{border-color:#f59e0b!important;box-shadow:0 0 0 3px #f59e0b59!important;animation:rpt-pulse-border 1s ease-in-out infinite alternate}@keyframes rpt-pulse-border{0%{box-shadow:0 0 0 2px #f59e0b40}to{box-shadow:0 0 0 5px #f59e0b80}}.grid-layout-status-strip{display:flex;align-items:center;justify-content:space-between;padding:6px 16px;background:#f1f5f9;border-bottom:1px solid var(--rpt-color-border, #cbd5e1);font-size:.6875rem;color:#475569}.grid-status-info{display:inline-flex;align-items:center;gap:6px;font-weight:600}.grid-status-sync{display:inline-flex;align-items:center;gap:4px;color:#059669;font-weight:600;transition:transform .2s ease}.grid-status-sync.is-pulsing{transform:scale(1.08);color:#047857}.canvas-actions{display:flex;align-items:center;gap:8px}.btn-grid-add{background:#f0fdf4;border-color:#bbf7d0;color:#16a34a}.btn-grid-add:hover{background:#dcfce7;border-color:#86efac;color:#15803d}.btn-remove-grid{display:inline-flex;align-items:center;justify-content:center;padding:4px;border:none;background:transparent;color:#94a3b8;border-radius:4px;cursor:pointer;transition:all .15s ease}.btn-remove-grid:hover{background:#fee2e2;color:#ef4444}.canvas-add-grid-banner{margin-top:24px;border:2px dashed #cbd5e1;border-radius:8px;background:#fff;padding:16px 20px;display:flex;align-items:center;gap:16px;cursor:pointer;transition:all .15s ease}.canvas-add-grid-banner:hover{border-color:#2563eb;background:#f8fafc;box-shadow:0 2px 8px #2563eb14}.add-grid-icon{width:40px;height:40px;border-radius:8px;background:#eff6ff;color:#2563eb;display:flex;align-items:center;justify-content:center;flex-shrink:0}.add-grid-text{display:flex;flex-direction:column;gap:2px;flex:1}.add-grid-title{font-size:.875rem;font-weight:600;color:#0f172a}.add-grid-sub{font-size:.75rem;color:#64748b}.btn-banner-add{padding:6px 14px;font-size:.75rem;font-weight:600;color:#2563eb;background:#eff6ff;border:1px solid #bfdbfe;border-radius:6px;cursor:pointer;white-space:nowrap;transition:all .15s ease}.canvas-add-grid-banner:hover .btn-banner-add{background:#2563eb;color:#fff;border-color:#2563eb}\n"] }]
10686
11018
  }], propDecorators: { onEscape: [{
10687
11019
  type: HostListener,
10688
11020
  args: ['document:keydown.escape']
@@ -11590,6 +11922,14 @@ class PropertyEditorGridComponent {
11590
11922
  />
11591
11923
  <span>Visible</span>
11592
11924
  </label>
11925
+ <label class="col-checkbox-toggle">
11926
+ <input
11927
+ type="checkbox"
11928
+ [ngModel]="col.checkboxSelection ?? false"
11929
+ (ngModelChange)="onUpdateCol(idx, 'checkboxSelection', $event)"
11930
+ />
11931
+ <span>Checkbox</span>
11932
+ </label>
11593
11933
  </div>
11594
11934
  </div>
11595
11935
  </div>
@@ -11601,6 +11941,39 @@ class PropertyEditorGridComponent {
11601
11941
  <div class="property-group">
11602
11942
  <div class="group-title">Table Options</div>
11603
11943
 
11944
+ <div class="field-row">
11945
+ <label class="checkbox-toggle">
11946
+ <input
11947
+ type="checkbox"
11948
+ [ngModel]="grid()?.options?.sideBar !== false"
11949
+ (ngModelChange)="updateOption.emit({ field: 'sideBar', value: $event })"
11950
+ />
11951
+ <span>Enable Side Panel (Tool Panels)</span>
11952
+ </label>
11953
+ </div>
11954
+
11955
+ <div class="field-row">
11956
+ <label class="checkbox-toggle">
11957
+ <input
11958
+ type="checkbox"
11959
+ [ngModel]="grid()?.options?.globalSearch !== false"
11960
+ (ngModelChange)="updateOption.emit({ field: 'globalSearch', value: $event })"
11961
+ />
11962
+ <span>Global Search Box</span>
11963
+ </label>
11964
+ </div>
11965
+
11966
+ <div class="field-row">
11967
+ <label class="checkbox-toggle">
11968
+ <input
11969
+ type="checkbox"
11970
+ [ngModel]="grid()?.options?.statusBar !== false"
11971
+ (ngModelChange)="updateOption.emit({ field: 'statusBar', value: $event })"
11972
+ />
11973
+ <span>Status Bar</span>
11974
+ </label>
11975
+ </div>
11976
+
11604
11977
  <div class="field-row">
11605
11978
  <label class="checkbox-toggle">
11606
11979
  <input
@@ -11623,6 +11996,44 @@ class PropertyEditorGridComponent {
11623
11996
  </label>
11624
11997
  </div>
11625
11998
 
11999
+ @if (grid()?.options?.selectable) {
12000
+ <div class="field-row">
12001
+ <label class="field-label">Selection Mode</label>
12002
+ <select
12003
+ class="field-input"
12004
+ [ngModel]="grid()?.options?.selectionMode ?? 'multiple'"
12005
+ (ngModelChange)="updateOption.emit({ field: 'selectionMode', value: $event })"
12006
+ >
12007
+ <option value="multiple">Multiple Rows</option>
12008
+ <option value="single">Single Row</option>
12009
+ </select>
12010
+ </div>
12011
+
12012
+ <div class="field-row">
12013
+ <label class="checkbox-toggle">
12014
+ <input
12015
+ type="checkbox"
12016
+ [ngModel]="grid()?.options?.checkboxSelection ?? true"
12017
+ (ngModelChange)="updateOption.emit({ field: 'checkboxSelection', value: $event })"
12018
+ />
12019
+ <span>Checkbox Selection</span>
12020
+ </label>
12021
+ </div>
12022
+
12023
+ @if ((grid()?.options?.selectionMode ?? 'multiple') === 'multiple') {
12024
+ <div class="field-row">
12025
+ <label class="checkbox-toggle">
12026
+ <input
12027
+ type="checkbox"
12028
+ [ngModel]="grid()?.options?.headerCheckboxSelection ?? true"
12029
+ (ngModelChange)="updateOption.emit({ field: 'headerCheckboxSelection', value: $event })"
12030
+ />
12031
+ <span>Header Select All Checkbox</span>
12032
+ </label>
12033
+ </div>
12034
+ }
12035
+ }
12036
+
11626
12037
  <div class="field-row">
11627
12038
  <label class="checkbox-toggle">
11628
12039
  <input
@@ -11835,7 +12246,7 @@ class PropertyEditorGridComponent {
11835
12246
  </div>
11836
12247
  </div>
11837
12248
  }
11838
- `, isInline: true, styles: [".property-group{display:flex;flex-direction:column;gap:12px}.group-title{font-size:.7rem;font-weight:700;color:var(--rpt-color-text-muted, #64748b);text-transform:uppercase;letter-spacing:.05em;border-bottom:1px solid var(--rpt-color-border, #e2e8f0);padding-bottom:4px}.field-row{display:flex;flex-direction:column;gap:4px}.field-label-row{display:flex;align-items:center;justify-content:space-between}.field-badge-val{font-size:.65rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border:1px solid #bfdbfe;padding:1px 6px;border-radius:9999px}.field-label{font-size:.7rem;font-weight:600;color:var(--rpt-color-text, #0f172a)}.field-input,.field-select,.field-textarea{width:100%;box-sizing:border-box;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-sm, 4px);padding:6px 10px;font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-text, #0f172a);background:#fff;outline:none;transition:all var(--rpt-transition-speed, .15s) ease}.field-select{appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 10px center;background-size:13px 13px;padding-right:28px;cursor:pointer}.field-input:focus,.field-select:focus,.field-textarea:focus{border-color:var(--rpt-color-primary, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.checkbox-toggle{display:inline-flex;align-items:center;gap:8px;font-size:.75rem;font-weight:500;color:var(--rpt-color-text, #0f172a);cursor:pointer}.preset-pill-group{display:flex;flex-wrap:wrap;gap:4px;margin-top:4px}.preset-pill{background:#f1f5f9;border:1px solid #e2e8f0;border-radius:4px;padding:2px 8px;font-size:.65rem;font-weight:600;color:#475569;cursor:pointer;transition:all .12s ease}.preset-pill:hover{background:#e2e8f0;color:#0f172a;border-color:#cbd5e1}.preset-pill-active{background:var(--rpt-color-primary, #2563eb)!important;color:#fff!important;border-color:var(--rpt-color-primary, #2563eb)!important}.preset-pill-reset{color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border-color:#bfdbfe}.preset-pill-reset:hover{background:#dbeafe;color:#1d4ed8;border-color:#93c5fd}\n", ".empty-grid-card{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:40px 16px;text-align:center;border:2px dashed #cbd5e1;border-radius:8px;background:#fff;margin:10px 0}.empty-grid-icon{width:48px;height:48px;border-radius:10px;background:#eff6ff;color:#2563eb;display:flex;align-items:center;justify-content:center;margin-bottom:12px}.empty-grid-title{font-size:.95rem;font-weight:700;color:#0f172a;margin:0 0 6px}.empty-grid-desc{font-size:.775rem;color:#64748b;margin:0 0 18px;line-height:1.4;max-width:280px}.btn-create-grid-action{display:inline-flex;align-items:center;gap:6px;padding:8px 16px;background:#2563eb;color:#fff;font-size:.775rem;font-weight:600;border:none;border-radius:6px;cursor:pointer;box-shadow:0 2px 4px #2563eb33;transition:all .15s ease}.btn-create-grid-action:hover{background:#1d4ed8;box-shadow:0 4px 8px #2563eb40}.grid-danger-zone{margin-top:10px;padding-top:16px;border-top:1px dashed #e2e8f0;display:flex;justify-content:center}.btn-remove-grid-action{display:inline-flex;align-items:center;gap:6px;background:#fee2e2;border:1px solid #fecaca;color:#dc2626;font-size:.75rem;font-weight:600;padding:6px 12px;border-radius:6px;cursor:pointer;transition:all .15s ease}.btn-remove-grid-action:hover{background:#fecaca;border-color:#f87171;color:#b91c1c}.props-form{display:flex;flex-direction:column;gap:20px}.group-header-with-btn{display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid var(--rpt-color-border, #e2e8f0);padding-bottom:8px;margin-bottom:4px}.btn-add-col{display:inline-flex;align-items:center;gap:5px;background:#eff6ff;border:1px solid #bfdbfe;border-radius:4px;padding:4px 10px;font-size:.725rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);cursor:pointer;transition:all .15s ease}.btn-add-col:hover{background:var(--rpt-color-primary, #2563eb);color:#fff;border-color:var(--rpt-color-primary, #2563eb)}.columns-editor-list{display:flex;flex-direction:column;gap:10px}.col-edit-card{background:#fff;border:1.5px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);box-shadow:var(--rpt-box-shadow, 0 1px 2px rgba(0, 0, 0, .05));box-sizing:border-box;transition:all var(--rpt-transition-speed, .15s) ease;position:relative;overflow:hidden;display:flex;flex-direction:column}.col-edit-card:hover{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 4px 6px -1px #2563eb1a}.col-card-header{display:flex;align-items:center;justify-content:space-between;gap:6px;padding:5px 8px;background:var(--rpt-color-surface, #f8fafc);border-bottom:1px solid var(--rpt-color-border, #e2e8f0);min-height:32px;box-sizing:border-box}.col-header-title-group{display:flex;align-items:center;gap:5px;min-width:0;flex:1}.col-drag-dots{color:#94a3b8;font-size:.8rem;cursor:grab;-webkit-user-select:none;user-select:none;line-height:1;padding-left:2px}.col-idx-badge{font-size:.65rem;font-weight:700;color:#64748b;background:#e2e8f0;padding:1px 5px;border-radius:3px;letter-spacing:.02em}.col-title-input{flex:1;border:1px solid transparent;background:transparent;font-size:.75rem;font-weight:600;color:var(--rpt-color-text, #0f172a);padding:2px 6px;border-radius:4px;outline:none;transition:all .15s ease}.col-title-input:hover{border-color:#cbd5e1;background:#fff}.col-title-input:focus{border-color:var(--rpt-color-primary, #2563eb);background:#fff;box-shadow:0 0 0 2px #2563eb26}.col-card-actions{display:flex;align-items:center;gap:4px}.col-type-pill{font-size:.625rem;font-weight:700;color:#1e40af;background:#dbeafe;border:1px solid #bfdbfe;padding:1px 5px;border-radius:3px;text-transform:uppercase;letter-spacing:.04em}.col-action-btn{display:inline-flex;align-items:center;justify-content:center;background:none;border:none;color:var(--rpt-color-text-muted, #64748b);cursor:pointer;padding:3px;border-radius:4px;transition:all .15s ease}.col-action-btn.btn-delete:hover{color:var(--rpt-color-danger, #ef4444);background:#fee2e2}.col-card-body{padding:8px 10px;display:flex;flex-direction:column;gap:6px;background:#fff}.col-edit-fields{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:6px 8px}.col-field-item{display:flex;flex-direction:column;gap:2px;min-width:0}.mini-label{font-size:.625rem;font-weight:600;color:#64748b;letter-spacing:.02em}.col-mini-input,.col-mini-select{width:100%;box-sizing:border-box;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:3px;padding:3px 5px;font-size:.7rem;color:var(--rpt-color-text, #0f172a);background:#fff;outline:none;transition:all .12s ease}.col-mini-select{appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 4px center;background-size:10px 10px;padding-right:16px;cursor:pointer}.col-mini-input:focus,.col-mini-select:focus{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 0 0 2px #2563eb26}.col-card-footer{display:flex;align-items:center;justify-content:flex-end;padding-top:4px;border-top:1px dashed #e2e8f0;margin-top:2px}.col-checkbox-toggle{display:inline-flex;align-items:center;gap:5px;font-size:.675rem;font-weight:500;color:#475569;cursor:pointer;-webkit-user-select:none;user-select:none}.btn-add-mapping{display:inline-flex;align-items:center;background:#eff6ff;border:1px solid #bfdbfe;color:#2563eb;font-size:.65rem;font-weight:600;padding:2px 6px;border-radius:4px;cursor:pointer;transition:all .12s ease}.btn-add-mapping:hover{background:#dbeafe}.mapping-pair-row{display:flex;align-items:center;gap:6px;margin-top:4px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i1.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: RptIconComponent, selector: "rpt-icon", inputs: ["name", "size", "color", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
12249
+ `, isInline: true, styles: [".property-group{display:flex;flex-direction:column;gap:12px}.group-title{font-size:.7rem;font-weight:700;color:var(--rpt-color-text-muted, #64748b);text-transform:uppercase;letter-spacing:.05em;border-bottom:1px solid var(--rpt-color-border, #e2e8f0);padding-bottom:4px}.field-row{display:flex;flex-direction:column;gap:4px}.field-label-row{display:flex;align-items:center;justify-content:space-between}.field-badge-val{font-size:.65rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border:1px solid #bfdbfe;padding:1px 6px;border-radius:9999px}.field-label{font-size:.7rem;font-weight:600;color:var(--rpt-color-text, #0f172a)}.field-input,.field-select,.field-textarea{width:100%;box-sizing:border-box;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-sm, 4px);padding:6px 10px;font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-text, #0f172a);background:#fff;outline:none;transition:all var(--rpt-transition-speed, .15s) ease}.field-select{appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 10px center;background-size:13px 13px;padding-right:28px;cursor:pointer}.field-input:focus,.field-select:focus,.field-textarea:focus{border-color:var(--rpt-color-primary, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.checkbox-toggle{display:inline-flex;align-items:center;gap:8px;font-size:.75rem;font-weight:500;color:var(--rpt-color-text, #0f172a);cursor:pointer}.preset-pill-group{display:flex;flex-wrap:wrap;gap:4px;margin-top:4px}.preset-pill{background:#f1f5f9;border:1px solid #e2e8f0;border-radius:4px;padding:2px 8px;font-size:.65rem;font-weight:600;color:#475569;cursor:pointer;transition:all .12s ease}.preset-pill:hover{background:#e2e8f0;color:#0f172a;border-color:#cbd5e1}.preset-pill-active{background:var(--rpt-color-primary, #2563eb)!important;color:#fff!important;border-color:var(--rpt-color-primary, #2563eb)!important}.preset-pill-reset{color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border-color:#bfdbfe}.preset-pill-reset:hover{background:#dbeafe;color:#1d4ed8;border-color:#93c5fd}\n", ".empty-grid-card{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:40px 16px;text-align:center;border:2px dashed #cbd5e1;border-radius:8px;background:#fff;margin:10px 0}.empty-grid-icon{width:48px;height:48px;border-radius:10px;background:#eff6ff;color:#2563eb;display:flex;align-items:center;justify-content:center;margin-bottom:12px}.empty-grid-title{font-size:.95rem;font-weight:700;color:#0f172a;margin:0 0 6px}.empty-grid-desc{font-size:.775rem;color:#64748b;margin:0 0 18px;line-height:1.4;max-width:280px}.btn-create-grid-action{display:inline-flex;align-items:center;gap:6px;padding:8px 16px;background:#2563eb;color:#fff;font-size:.775rem;font-weight:600;border:none;border-radius:6px;cursor:pointer;box-shadow:0 2px 4px #2563eb33;transition:all .15s ease}.btn-create-grid-action:hover{background:#1d4ed8;box-shadow:0 4px 8px #2563eb40}.grid-danger-zone{margin-top:10px;padding-top:16px;border-top:1px dashed #e2e8f0;display:flex;justify-content:center}.btn-remove-grid-action{display:inline-flex;align-items:center;gap:6px;background:#fee2e2;border:1px solid #fecaca;color:#dc2626;font-size:.75rem;font-weight:600;padding:6px 12px;border-radius:6px;cursor:pointer;transition:all .15s ease}.btn-remove-grid-action:hover{background:#fecaca;border-color:#f87171;color:#b91c1c}.props-form{display:flex;flex-direction:column;gap:20px}.group-header-with-btn{display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid var(--rpt-color-border, #e2e8f0);padding-bottom:8px;margin-bottom:4px}.btn-add-col{display:inline-flex;align-items:center;gap:5px;background:#eff6ff;border:1px solid #bfdbfe;border-radius:4px;padding:4px 10px;font-size:.725rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);cursor:pointer;transition:all .15s ease}.btn-add-col:hover{background:var(--rpt-color-primary, #2563eb);color:#fff;border-color:var(--rpt-color-primary, #2563eb)}.columns-editor-list{display:flex;flex-direction:column;gap:10px}.col-edit-card{background:#fff;border:1.5px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);box-shadow:var(--rpt-box-shadow, 0 1px 2px rgba(0, 0, 0, .05));box-sizing:border-box;transition:all var(--rpt-transition-speed, .15s) ease;position:relative;overflow:hidden;display:flex;flex-direction:column}.col-edit-card:hover{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 4px 6px -1px #2563eb1a}.col-card-header{display:flex;align-items:center;justify-content:space-between;gap:6px;padding:5px 8px;background:var(--rpt-color-surface, #f8fafc);border-bottom:1px solid var(--rpt-color-border, #e2e8f0);min-height:32px;box-sizing:border-box}.col-header-title-group{display:flex;align-items:center;gap:5px;min-width:0;flex:1}.col-drag-dots{color:#94a3b8;font-size:.8rem;cursor:grab;-webkit-user-select:none;user-select:none;line-height:1;padding-left:2px}.col-idx-badge{font-size:.65rem;font-weight:700;color:#64748b;background:#e2e8f0;padding:1px 5px;border-radius:3px;letter-spacing:.02em}.col-title-input{flex:1;border:1px solid transparent;background:transparent;font-size:.75rem;font-weight:600;color:var(--rpt-color-text, #0f172a);padding:2px 6px;border-radius:4px;outline:none;transition:all .15s ease}.col-title-input:hover{border-color:#cbd5e1;background:#fff}.col-title-input:focus{border-color:var(--rpt-color-primary, #2563eb);background:#fff;box-shadow:0 0 0 2px #2563eb26}.col-card-actions{display:flex;align-items:center;gap:4px}.col-type-pill{font-size:.625rem;font-weight:700;color:#1e40af;background:#dbeafe;border:1px solid #bfdbfe;padding:1px 5px;border-radius:3px;text-transform:uppercase;letter-spacing:.04em}.col-action-btn{display:inline-flex;align-items:center;justify-content:center;background:none;border:none;color:var(--rpt-color-text-muted, #64748b);cursor:pointer;padding:3px;border-radius:4px;transition:all .15s ease}.col-action-btn.btn-delete:hover{color:var(--rpt-color-danger, #ef4444);background:#fee2e2}.col-card-body{padding:8px 10px;display:flex;flex-direction:column;gap:6px;background:#fff}.col-edit-fields{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:6px 8px}.col-field-item{display:flex;flex-direction:column;gap:2px;min-width:0}.mini-label{font-size:.625rem;font-weight:600;color:#64748b;letter-spacing:.02em}.col-mini-input,.col-mini-select{width:100%;box-sizing:border-box;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:3px;padding:3px 5px;font-size:.7rem;color:var(--rpt-color-text, #0f172a);background:#fff;outline:none;transition:all .12s ease}.col-mini-select{appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 4px center;background-size:10px 10px;padding-right:16px;cursor:pointer}.col-mini-input:focus,.col-mini-select:focus{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 0 0 2px #2563eb26}.col-card-footer{display:flex;align-items:center;justify-content:flex-end;gap:12px;padding-top:4px;border-top:1px dashed #e2e8f0;margin-top:2px}.col-checkbox-toggle{display:inline-flex;align-items:center;gap:5px;font-size:.675rem;font-weight:500;color:#475569;cursor:pointer;-webkit-user-select:none;user-select:none}.btn-add-mapping{display:inline-flex;align-items:center;background:#eff6ff;border:1px solid #bfdbfe;color:#2563eb;font-size:.65rem;font-weight:600;padding:2px 6px;border-radius:4px;cursor:pointer;transition:all .12s ease}.btn-add-mapping:hover{background:#dbeafe}.mapping-pair-row{display:flex;align-items:center;gap:6px;margin-top:4px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i1.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: RptIconComponent, selector: "rpt-icon", inputs: ["name", "size", "color", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
11839
12250
  }
11840
12251
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PropertyEditorGridComponent, decorators: [{
11841
12252
  type: Component,
@@ -11987,6 +12398,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
11987
12398
  />
11988
12399
  <span>Visible</span>
11989
12400
  </label>
12401
+ <label class="col-checkbox-toggle">
12402
+ <input
12403
+ type="checkbox"
12404
+ [ngModel]="col.checkboxSelection ?? false"
12405
+ (ngModelChange)="onUpdateCol(idx, 'checkboxSelection', $event)"
12406
+ />
12407
+ <span>Checkbox</span>
12408
+ </label>
11990
12409
  </div>
11991
12410
  </div>
11992
12411
  </div>
@@ -11998,6 +12417,39 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
11998
12417
  <div class="property-group">
11999
12418
  <div class="group-title">Table Options</div>
12000
12419
 
12420
+ <div class="field-row">
12421
+ <label class="checkbox-toggle">
12422
+ <input
12423
+ type="checkbox"
12424
+ [ngModel]="grid()?.options?.sideBar !== false"
12425
+ (ngModelChange)="updateOption.emit({ field: 'sideBar', value: $event })"
12426
+ />
12427
+ <span>Enable Side Panel (Tool Panels)</span>
12428
+ </label>
12429
+ </div>
12430
+
12431
+ <div class="field-row">
12432
+ <label class="checkbox-toggle">
12433
+ <input
12434
+ type="checkbox"
12435
+ [ngModel]="grid()?.options?.globalSearch !== false"
12436
+ (ngModelChange)="updateOption.emit({ field: 'globalSearch', value: $event })"
12437
+ />
12438
+ <span>Global Search Box</span>
12439
+ </label>
12440
+ </div>
12441
+
12442
+ <div class="field-row">
12443
+ <label class="checkbox-toggle">
12444
+ <input
12445
+ type="checkbox"
12446
+ [ngModel]="grid()?.options?.statusBar !== false"
12447
+ (ngModelChange)="updateOption.emit({ field: 'statusBar', value: $event })"
12448
+ />
12449
+ <span>Status Bar</span>
12450
+ </label>
12451
+ </div>
12452
+
12001
12453
  <div class="field-row">
12002
12454
  <label class="checkbox-toggle">
12003
12455
  <input
@@ -12020,6 +12472,44 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
12020
12472
  </label>
12021
12473
  </div>
12022
12474
 
12475
+ @if (grid()?.options?.selectable) {
12476
+ <div class="field-row">
12477
+ <label class="field-label">Selection Mode</label>
12478
+ <select
12479
+ class="field-input"
12480
+ [ngModel]="grid()?.options?.selectionMode ?? 'multiple'"
12481
+ (ngModelChange)="updateOption.emit({ field: 'selectionMode', value: $event })"
12482
+ >
12483
+ <option value="multiple">Multiple Rows</option>
12484
+ <option value="single">Single Row</option>
12485
+ </select>
12486
+ </div>
12487
+
12488
+ <div class="field-row">
12489
+ <label class="checkbox-toggle">
12490
+ <input
12491
+ type="checkbox"
12492
+ [ngModel]="grid()?.options?.checkboxSelection ?? true"
12493
+ (ngModelChange)="updateOption.emit({ field: 'checkboxSelection', value: $event })"
12494
+ />
12495
+ <span>Checkbox Selection</span>
12496
+ </label>
12497
+ </div>
12498
+
12499
+ @if ((grid()?.options?.selectionMode ?? 'multiple') === 'multiple') {
12500
+ <div class="field-row">
12501
+ <label class="checkbox-toggle">
12502
+ <input
12503
+ type="checkbox"
12504
+ [ngModel]="grid()?.options?.headerCheckboxSelection ?? true"
12505
+ (ngModelChange)="updateOption.emit({ field: 'headerCheckboxSelection', value: $event })"
12506
+ />
12507
+ <span>Header Select All Checkbox</span>
12508
+ </label>
12509
+ </div>
12510
+ }
12511
+ }
12512
+
12023
12513
  <div class="field-row">
12024
12514
  <label class="checkbox-toggle">
12025
12515
  <input
@@ -12232,7 +12722,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
12232
12722
  </div>
12233
12723
  </div>
12234
12724
  }
12235
- `, styles: [".property-group{display:flex;flex-direction:column;gap:12px}.group-title{font-size:.7rem;font-weight:700;color:var(--rpt-color-text-muted, #64748b);text-transform:uppercase;letter-spacing:.05em;border-bottom:1px solid var(--rpt-color-border, #e2e8f0);padding-bottom:4px}.field-row{display:flex;flex-direction:column;gap:4px}.field-label-row{display:flex;align-items:center;justify-content:space-between}.field-badge-val{font-size:.65rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border:1px solid #bfdbfe;padding:1px 6px;border-radius:9999px}.field-label{font-size:.7rem;font-weight:600;color:var(--rpt-color-text, #0f172a)}.field-input,.field-select,.field-textarea{width:100%;box-sizing:border-box;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-sm, 4px);padding:6px 10px;font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-text, #0f172a);background:#fff;outline:none;transition:all var(--rpt-transition-speed, .15s) ease}.field-select{appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 10px center;background-size:13px 13px;padding-right:28px;cursor:pointer}.field-input:focus,.field-select:focus,.field-textarea:focus{border-color:var(--rpt-color-primary, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.checkbox-toggle{display:inline-flex;align-items:center;gap:8px;font-size:.75rem;font-weight:500;color:var(--rpt-color-text, #0f172a);cursor:pointer}.preset-pill-group{display:flex;flex-wrap:wrap;gap:4px;margin-top:4px}.preset-pill{background:#f1f5f9;border:1px solid #e2e8f0;border-radius:4px;padding:2px 8px;font-size:.65rem;font-weight:600;color:#475569;cursor:pointer;transition:all .12s ease}.preset-pill:hover{background:#e2e8f0;color:#0f172a;border-color:#cbd5e1}.preset-pill-active{background:var(--rpt-color-primary, #2563eb)!important;color:#fff!important;border-color:var(--rpt-color-primary, #2563eb)!important}.preset-pill-reset{color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border-color:#bfdbfe}.preset-pill-reset:hover{background:#dbeafe;color:#1d4ed8;border-color:#93c5fd}\n", ".empty-grid-card{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:40px 16px;text-align:center;border:2px dashed #cbd5e1;border-radius:8px;background:#fff;margin:10px 0}.empty-grid-icon{width:48px;height:48px;border-radius:10px;background:#eff6ff;color:#2563eb;display:flex;align-items:center;justify-content:center;margin-bottom:12px}.empty-grid-title{font-size:.95rem;font-weight:700;color:#0f172a;margin:0 0 6px}.empty-grid-desc{font-size:.775rem;color:#64748b;margin:0 0 18px;line-height:1.4;max-width:280px}.btn-create-grid-action{display:inline-flex;align-items:center;gap:6px;padding:8px 16px;background:#2563eb;color:#fff;font-size:.775rem;font-weight:600;border:none;border-radius:6px;cursor:pointer;box-shadow:0 2px 4px #2563eb33;transition:all .15s ease}.btn-create-grid-action:hover{background:#1d4ed8;box-shadow:0 4px 8px #2563eb40}.grid-danger-zone{margin-top:10px;padding-top:16px;border-top:1px dashed #e2e8f0;display:flex;justify-content:center}.btn-remove-grid-action{display:inline-flex;align-items:center;gap:6px;background:#fee2e2;border:1px solid #fecaca;color:#dc2626;font-size:.75rem;font-weight:600;padding:6px 12px;border-radius:6px;cursor:pointer;transition:all .15s ease}.btn-remove-grid-action:hover{background:#fecaca;border-color:#f87171;color:#b91c1c}.props-form{display:flex;flex-direction:column;gap:20px}.group-header-with-btn{display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid var(--rpt-color-border, #e2e8f0);padding-bottom:8px;margin-bottom:4px}.btn-add-col{display:inline-flex;align-items:center;gap:5px;background:#eff6ff;border:1px solid #bfdbfe;border-radius:4px;padding:4px 10px;font-size:.725rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);cursor:pointer;transition:all .15s ease}.btn-add-col:hover{background:var(--rpt-color-primary, #2563eb);color:#fff;border-color:var(--rpt-color-primary, #2563eb)}.columns-editor-list{display:flex;flex-direction:column;gap:10px}.col-edit-card{background:#fff;border:1.5px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);box-shadow:var(--rpt-box-shadow, 0 1px 2px rgba(0, 0, 0, .05));box-sizing:border-box;transition:all var(--rpt-transition-speed, .15s) ease;position:relative;overflow:hidden;display:flex;flex-direction:column}.col-edit-card:hover{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 4px 6px -1px #2563eb1a}.col-card-header{display:flex;align-items:center;justify-content:space-between;gap:6px;padding:5px 8px;background:var(--rpt-color-surface, #f8fafc);border-bottom:1px solid var(--rpt-color-border, #e2e8f0);min-height:32px;box-sizing:border-box}.col-header-title-group{display:flex;align-items:center;gap:5px;min-width:0;flex:1}.col-drag-dots{color:#94a3b8;font-size:.8rem;cursor:grab;-webkit-user-select:none;user-select:none;line-height:1;padding-left:2px}.col-idx-badge{font-size:.65rem;font-weight:700;color:#64748b;background:#e2e8f0;padding:1px 5px;border-radius:3px;letter-spacing:.02em}.col-title-input{flex:1;border:1px solid transparent;background:transparent;font-size:.75rem;font-weight:600;color:var(--rpt-color-text, #0f172a);padding:2px 6px;border-radius:4px;outline:none;transition:all .15s ease}.col-title-input:hover{border-color:#cbd5e1;background:#fff}.col-title-input:focus{border-color:var(--rpt-color-primary, #2563eb);background:#fff;box-shadow:0 0 0 2px #2563eb26}.col-card-actions{display:flex;align-items:center;gap:4px}.col-type-pill{font-size:.625rem;font-weight:700;color:#1e40af;background:#dbeafe;border:1px solid #bfdbfe;padding:1px 5px;border-radius:3px;text-transform:uppercase;letter-spacing:.04em}.col-action-btn{display:inline-flex;align-items:center;justify-content:center;background:none;border:none;color:var(--rpt-color-text-muted, #64748b);cursor:pointer;padding:3px;border-radius:4px;transition:all .15s ease}.col-action-btn.btn-delete:hover{color:var(--rpt-color-danger, #ef4444);background:#fee2e2}.col-card-body{padding:8px 10px;display:flex;flex-direction:column;gap:6px;background:#fff}.col-edit-fields{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:6px 8px}.col-field-item{display:flex;flex-direction:column;gap:2px;min-width:0}.mini-label{font-size:.625rem;font-weight:600;color:#64748b;letter-spacing:.02em}.col-mini-input,.col-mini-select{width:100%;box-sizing:border-box;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:3px;padding:3px 5px;font-size:.7rem;color:var(--rpt-color-text, #0f172a);background:#fff;outline:none;transition:all .12s ease}.col-mini-select{appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 4px center;background-size:10px 10px;padding-right:16px;cursor:pointer}.col-mini-input:focus,.col-mini-select:focus{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 0 0 2px #2563eb26}.col-card-footer{display:flex;align-items:center;justify-content:flex-end;padding-top:4px;border-top:1px dashed #e2e8f0;margin-top:2px}.col-checkbox-toggle{display:inline-flex;align-items:center;gap:5px;font-size:.675rem;font-weight:500;color:#475569;cursor:pointer;-webkit-user-select:none;user-select:none}.btn-add-mapping{display:inline-flex;align-items:center;background:#eff6ff;border:1px solid #bfdbfe;color:#2563eb;font-size:.65rem;font-weight:600;padding:2px 6px;border-radius:4px;cursor:pointer;transition:all .12s ease}.btn-add-mapping:hover{background:#dbeafe}.mapping-pair-row{display:flex;align-items:center;gap:6px;margin-top:4px}\n"] }]
12725
+ `, styles: [".property-group{display:flex;flex-direction:column;gap:12px}.group-title{font-size:.7rem;font-weight:700;color:var(--rpt-color-text-muted, #64748b);text-transform:uppercase;letter-spacing:.05em;border-bottom:1px solid var(--rpt-color-border, #e2e8f0);padding-bottom:4px}.field-row{display:flex;flex-direction:column;gap:4px}.field-label-row{display:flex;align-items:center;justify-content:space-between}.field-badge-val{font-size:.65rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border:1px solid #bfdbfe;padding:1px 6px;border-radius:9999px}.field-label{font-size:.7rem;font-weight:600;color:var(--rpt-color-text, #0f172a)}.field-input,.field-select,.field-textarea{width:100%;box-sizing:border-box;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-sm, 4px);padding:6px 10px;font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-text, #0f172a);background:#fff;outline:none;transition:all var(--rpt-transition-speed, .15s) ease}.field-select{appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 10px center;background-size:13px 13px;padding-right:28px;cursor:pointer}.field-input:focus,.field-select:focus,.field-textarea:focus{border-color:var(--rpt-color-primary, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.checkbox-toggle{display:inline-flex;align-items:center;gap:8px;font-size:.75rem;font-weight:500;color:var(--rpt-color-text, #0f172a);cursor:pointer}.preset-pill-group{display:flex;flex-wrap:wrap;gap:4px;margin-top:4px}.preset-pill{background:#f1f5f9;border:1px solid #e2e8f0;border-radius:4px;padding:2px 8px;font-size:.65rem;font-weight:600;color:#475569;cursor:pointer;transition:all .12s ease}.preset-pill:hover{background:#e2e8f0;color:#0f172a;border-color:#cbd5e1}.preset-pill-active{background:var(--rpt-color-primary, #2563eb)!important;color:#fff!important;border-color:var(--rpt-color-primary, #2563eb)!important}.preset-pill-reset{color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border-color:#bfdbfe}.preset-pill-reset:hover{background:#dbeafe;color:#1d4ed8;border-color:#93c5fd}\n", ".empty-grid-card{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:40px 16px;text-align:center;border:2px dashed #cbd5e1;border-radius:8px;background:#fff;margin:10px 0}.empty-grid-icon{width:48px;height:48px;border-radius:10px;background:#eff6ff;color:#2563eb;display:flex;align-items:center;justify-content:center;margin-bottom:12px}.empty-grid-title{font-size:.95rem;font-weight:700;color:#0f172a;margin:0 0 6px}.empty-grid-desc{font-size:.775rem;color:#64748b;margin:0 0 18px;line-height:1.4;max-width:280px}.btn-create-grid-action{display:inline-flex;align-items:center;gap:6px;padding:8px 16px;background:#2563eb;color:#fff;font-size:.775rem;font-weight:600;border:none;border-radius:6px;cursor:pointer;box-shadow:0 2px 4px #2563eb33;transition:all .15s ease}.btn-create-grid-action:hover{background:#1d4ed8;box-shadow:0 4px 8px #2563eb40}.grid-danger-zone{margin-top:10px;padding-top:16px;border-top:1px dashed #e2e8f0;display:flex;justify-content:center}.btn-remove-grid-action{display:inline-flex;align-items:center;gap:6px;background:#fee2e2;border:1px solid #fecaca;color:#dc2626;font-size:.75rem;font-weight:600;padding:6px 12px;border-radius:6px;cursor:pointer;transition:all .15s ease}.btn-remove-grid-action:hover{background:#fecaca;border-color:#f87171;color:#b91c1c}.props-form{display:flex;flex-direction:column;gap:20px}.group-header-with-btn{display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid var(--rpt-color-border, #e2e8f0);padding-bottom:8px;margin-bottom:4px}.btn-add-col{display:inline-flex;align-items:center;gap:5px;background:#eff6ff;border:1px solid #bfdbfe;border-radius:4px;padding:4px 10px;font-size:.725rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);cursor:pointer;transition:all .15s ease}.btn-add-col:hover{background:var(--rpt-color-primary, #2563eb);color:#fff;border-color:var(--rpt-color-primary, #2563eb)}.columns-editor-list{display:flex;flex-direction:column;gap:10px}.col-edit-card{background:#fff;border:1.5px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);box-shadow:var(--rpt-box-shadow, 0 1px 2px rgba(0, 0, 0, .05));box-sizing:border-box;transition:all var(--rpt-transition-speed, .15s) ease;position:relative;overflow:hidden;display:flex;flex-direction:column}.col-edit-card:hover{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 4px 6px -1px #2563eb1a}.col-card-header{display:flex;align-items:center;justify-content:space-between;gap:6px;padding:5px 8px;background:var(--rpt-color-surface, #f8fafc);border-bottom:1px solid var(--rpt-color-border, #e2e8f0);min-height:32px;box-sizing:border-box}.col-header-title-group{display:flex;align-items:center;gap:5px;min-width:0;flex:1}.col-drag-dots{color:#94a3b8;font-size:.8rem;cursor:grab;-webkit-user-select:none;user-select:none;line-height:1;padding-left:2px}.col-idx-badge{font-size:.65rem;font-weight:700;color:#64748b;background:#e2e8f0;padding:1px 5px;border-radius:3px;letter-spacing:.02em}.col-title-input{flex:1;border:1px solid transparent;background:transparent;font-size:.75rem;font-weight:600;color:var(--rpt-color-text, #0f172a);padding:2px 6px;border-radius:4px;outline:none;transition:all .15s ease}.col-title-input:hover{border-color:#cbd5e1;background:#fff}.col-title-input:focus{border-color:var(--rpt-color-primary, #2563eb);background:#fff;box-shadow:0 0 0 2px #2563eb26}.col-card-actions{display:flex;align-items:center;gap:4px}.col-type-pill{font-size:.625rem;font-weight:700;color:#1e40af;background:#dbeafe;border:1px solid #bfdbfe;padding:1px 5px;border-radius:3px;text-transform:uppercase;letter-spacing:.04em}.col-action-btn{display:inline-flex;align-items:center;justify-content:center;background:none;border:none;color:var(--rpt-color-text-muted, #64748b);cursor:pointer;padding:3px;border-radius:4px;transition:all .15s ease}.col-action-btn.btn-delete:hover{color:var(--rpt-color-danger, #ef4444);background:#fee2e2}.col-card-body{padding:8px 10px;display:flex;flex-direction:column;gap:6px;background:#fff}.col-edit-fields{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:6px 8px}.col-field-item{display:flex;flex-direction:column;gap:2px;min-width:0}.mini-label{font-size:.625rem;font-weight:600;color:#64748b;letter-spacing:.02em}.col-mini-input,.col-mini-select{width:100%;box-sizing:border-box;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:3px;padding:3px 5px;font-size:.7rem;color:var(--rpt-color-text, #0f172a);background:#fff;outline:none;transition:all .12s ease}.col-mini-select{appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 4px center;background-size:10px 10px;padding-right:16px;cursor:pointer}.col-mini-input:focus,.col-mini-select:focus{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 0 0 2px #2563eb26}.col-card-footer{display:flex;align-items:center;justify-content:flex-end;gap:12px;padding-top:4px;border-top:1px dashed #e2e8f0;margin-top:2px}.col-checkbox-toggle{display:inline-flex;align-items:center;gap:5px;font-size:.675rem;font-weight:500;color:#475569;cursor:pointer;-webkit-user-select:none;user-select:none}.btn-add-mapping{display:inline-flex;align-items:center;background:#eff6ff;border:1px solid #bfdbfe;color:#2563eb;font-size:.65rem;font-weight:600;padding:2px 6px;border-radius:4px;cursor:pointer;transition:all .12s ease}.btn-add-mapping:hover{background:#dbeafe}.mapping-pair-row{display:flex;align-items:center;gap:6px;margin-top:4px}\n"] }]
12236
12726
  }] });
12237
12727
 
12238
12728
  class PropertyEditorReportComponent {
@@ -13068,12 +13558,64 @@ class PropertyEditorDatasourceComponent {
13068
13558
  this.discoveryAdapter.getParameters(entityName, 'dbo').subscribe({
13069
13559
  next: (params) => {
13070
13560
  this.procedureParameters.set(params);
13071
- this.autoWireAllParameters(params);
13561
+ // Only auto-link to existing session or existing canvas fields.
13562
+ // NEVER mutate canvas or create new components automatically!
13563
+ this.autoLinkExistingParameters(params);
13072
13564
  },
13073
13565
  error: (err) => console.error(`[PropertyEditorDatasource] Failed to load params for ${entityName}:`, err),
13074
13566
  });
13075
13567
  }
13076
13568
  }
13569
+ /**
13570
+ * Non-destructive linking: binds parameters to session or already-existing canvas fields.
13571
+ * Never mutates or adds new components to the canvas.
13572
+ */
13573
+ autoLinkExistingParameters(paramsList) {
13574
+ const params = paramsList || this.procedureParameters();
13575
+ if (!params || params.length === 0)
13576
+ return;
13577
+ const currentMappings = { ...(this.comp().dataSource?.parameterMappings ?? {}) };
13578
+ let changed = false;
13579
+ for (const param of params) {
13580
+ const clean = param.name.replace(/^@/, '');
13581
+ const existing = currentMappings[param.name] ?? currentMappings[clean];
13582
+ if (existing !== undefined && existing !== '') {
13583
+ continue;
13584
+ }
13585
+ // 1. Session match (e.g. companyId, branchId, userId)
13586
+ const sessionMatch = this.sessionService?.matchParameter(clean) ?? this.sessionService?.matchParameter(param.name);
13587
+ if (sessionMatch) {
13588
+ currentMappings[param.name] = `{{session.${sessionMatch.sessionKey}}}`;
13589
+ currentMappings[clean] = `{{session.${sessionMatch.sessionKey}}}`;
13590
+ changed = true;
13591
+ continue;
13592
+ }
13593
+ // 2. Existing canvas field match
13594
+ const matchedComp = this.allComponents().find((c) => {
13595
+ if (c.id === this.comp().id)
13596
+ return false;
13597
+ const ck = (c.key || '').toLowerCase();
13598
+ const cl = clean.toLowerCase();
13599
+ return ck === cl || ck === toFieldKey(cl);
13600
+ });
13601
+ if (matchedComp) {
13602
+ currentMappings[param.name] = `{{${matchedComp.key}}}`;
13603
+ currentMappings[clean] = `{{${matchedComp.key}}}`;
13604
+ changed = true;
13605
+ continue;
13606
+ }
13607
+ }
13608
+ if (changed) {
13609
+ this.updateDataSource.emit({
13610
+ ...(this.comp().dataSource ?? { displayField: '', valueField: '' }),
13611
+ parameterMappings: currentMappings,
13612
+ });
13613
+ }
13614
+ }
13615
+ /**
13616
+ * Explicit user-initiated action: links existing fields, and creates missing filter inputs on canvas.
13617
+ * Restores selection to the current dropdown component so the user stays in this property editor.
13618
+ */
13077
13619
  autoWireAllParameters(paramsList) {
13078
13620
  const params = paramsList || this.procedureParameters();
13079
13621
  if (!params || params.length === 0)
@@ -13108,7 +13650,7 @@ class PropertyEditorDatasourceComponent {
13108
13650
  changed = true;
13109
13651
  continue;
13110
13652
  }
13111
- // 3. Auto-create missing canvas field so user can fill it directly on canvas
13653
+ // 3. Auto-create missing canvas field when explicitly requested by user
13112
13654
  if (this.designerState) {
13113
13655
  const lower = clean.toLowerCase();
13114
13656
  let compType = 'input';
@@ -13140,6 +13682,10 @@ class PropertyEditorDatasourceComponent {
13140
13682
  }
13141
13683
  }
13142
13684
  }
13685
+ // Restore selection to current dropdown so user is not navigated away
13686
+ if (this.designerState) {
13687
+ this.designerState.selectComponent(this.comp().id);
13688
+ }
13143
13689
  if (changed) {
13144
13690
  this.updateDataSource.emit({
13145
13691
  ...(this.comp().dataSource ?? { displayField: '', valueField: '' }),
@@ -13159,10 +13705,13 @@ class PropertyEditorDatasourceComponent {
13159
13705
  if (this.allEntities().length === 0) {
13160
13706
  this.loadEntities();
13161
13707
  }
13162
- const firstEntity = type === 'table' ? this.availableTables()[0]?.name : this.availableProcedures()[0]?.name;
13708
+ const currentEntity = this.comp().dataSource?.entityName;
13709
+ const isValidForType = type === 'table'
13710
+ ? this.availableTables().some((t) => t.name === currentEntity)
13711
+ : this.availableProcedures().some((p) => p.name === currentEntity);
13163
13712
  this.updateDataSource.emit({
13164
13713
  sourceType: type,
13165
- entityName: firstEntity || '',
13714
+ entityName: isValidForType ? (currentEntity || '') : '',
13166
13715
  schema: 'dbo',
13167
13716
  displayField: '',
13168
13717
  valueField: '',
@@ -14524,6 +15073,7 @@ class PropertyEditorComponent {
14524
15073
  definition = this.designerState.definition;
14525
15074
  activeTab = this.designerState.activeTab;
14526
15075
  selectedComponent = this.designerState.selectedComponent;
15076
+ collapseRequested = output();
14527
15077
  maxColumns = computed(() => this.definition().layout.columns || 12);
14528
15078
  allComponents = computed(() => this.definition().components);
14529
15079
  propertySchema = computed(() => {
@@ -14542,6 +15092,12 @@ class PropertyEditorComponent {
14542
15092
  deselect() {
14543
15093
  this.designerState.selectComponent(null);
14544
15094
  }
15095
+ duplicateComponent(id) {
15096
+ this.designerState.duplicateComponent(id);
15097
+ }
15098
+ deleteComponent(id) {
15099
+ this.designerState.removeComponent(id);
15100
+ }
14545
15101
  updateComp(field, value) {
14546
15102
  const comp = this.selectedComponent();
14547
15103
  if (comp) {
@@ -14605,6 +15161,9 @@ class PropertyEditorComponent {
14605
15161
  pageSize: 25,
14606
15162
  showRowNumbers: true,
14607
15163
  showFooter: true,
15164
+ sideBar: true,
15165
+ globalSearch: true,
15166
+ statusBar: true,
14608
15167
  },
14609
15168
  };
14610
15169
  this.designerState.updateGridSettings(defaultGrid);
@@ -14782,7 +15341,7 @@ class PropertyEditorComponent {
14782
15341
  return comp.validation?.required ? 'Required' : 'Optional';
14783
15342
  }
14784
15343
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PropertyEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
14785
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: PropertyEditorComponent, isStandalone: true, selector: "rpt-property-editor", ngImport: i0, template: `
15344
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: PropertyEditorComponent, isStandalone: true, selector: "rpt-property-editor", outputs: { collapseRequested: "collapseRequested" }, ngImport: i0, template: `
14786
15345
  <div class="editor-container">
14787
15346
  <!-- Editor Header & Tabs -->
14788
15347
  <div class="editor-tabs">
@@ -14814,6 +15373,18 @@ class PropertyEditorComponent {
14814
15373
  <rpt-icon name="table" [size]="13" />
14815
15374
  <span>Grid</span>
14816
15375
  </button>
15376
+
15377
+ <div style="flex: 1;"></div>
15378
+
15379
+ <button
15380
+ type="button"
15381
+ class="tab-btn btn-collapse-inspector"
15382
+ (click)="collapseRequested.emit()"
15383
+ title="Collapse Property Editor"
15384
+ aria-label="Collapse Property Editor"
15385
+ >
15386
+ <rpt-icon name="chevron-right" [size]="13" />
15387
+ </button>
14817
15388
  </div>
14818
15389
 
14819
15390
  <!-- Editor Body -->
@@ -14828,9 +15399,32 @@ class PropertyEditorComponent {
14828
15399
  <span class="badge-type">{{ comp.type }}</span>
14829
15400
  <span class="badge-id">{{ comp.id }}</span>
14830
15401
  </div>
14831
- <button type="button" class="btn-deselect" (click)="deselect()" title="Deselect component">
14832
- <rpt-icon name="close" [size]="13" />
14833
- </button>
15402
+ <div class="badge-header-actions">
15403
+ <button
15404
+ type="button"
15405
+ class="btn-badge-action"
15406
+ (click)="duplicateComponent(comp.id)"
15407
+ title="Duplicate component"
15408
+ >
15409
+ <rpt-icon name="copy" [size]="13" />
15410
+ </button>
15411
+ <button
15412
+ type="button"
15413
+ class="btn-badge-action btn-badge-delete"
15414
+ (click)="deleteComponent(comp.id)"
15415
+ title="Delete component"
15416
+ >
15417
+ <rpt-icon name="trash" [size]="13" />
15418
+ </button>
15419
+ <button
15420
+ type="button"
15421
+ class="btn-deselect"
15422
+ (click)="deselect()"
15423
+ title="Deselect component"
15424
+ >
15425
+ <rpt-icon name="close" [size]="13" />
15426
+ </button>
15427
+ </div>
14834
15428
  </div>
14835
15429
 
14836
15430
  <!-- Accordion Container -->
@@ -15020,7 +15614,7 @@ class PropertyEditorComponent {
15020
15614
  }
15021
15615
  </div>
15022
15616
  </div>
15023
- `, isInline: true, styles: [":host{display:block;height:100%;background:#fff;border-left:1px solid var(--rpt-color-border, #cbd5e1);box-sizing:border-box;font-family:var(--rpt-font-family, inherit)}.editor-container{display:flex;flex-direction:column;height:100%}.editor-tabs{display:flex;flex-shrink:0;border-bottom:1px solid var(--rpt-color-border, #cbd5e1);background:var(--rpt-color-surface, #f8fafc)}.tab-btn{flex:1;display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:12px 8px;font-size:var(--rpt-font-size-sm, .75rem);font-weight:600;color:var(--rpt-color-text-muted, #64748b);background:transparent;border:none;border-bottom:2px solid transparent;cursor:pointer;transition:all var(--rpt-transition-speed, .15s) ease}.tab-btn:hover:not(:disabled){color:var(--rpt-color-text, #0f172a)}.tab-btn.active{color:var(--rpt-color-primary, #2563eb);border-bottom-color:var(--rpt-color-primary, #2563eb);background:#fff}.tab-btn:disabled{opacity:.4;cursor:not-allowed}.editor-body{flex:1;overflow-y:auto;padding:12px 14px}.component-sections-wrapper{display:flex;flex-direction:column;gap:12px}.comp-badge-header{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;background:var(--rpt-color-surface, #f8fafc);border-radius:6px;border:1px solid var(--rpt-color-border, #e2e8f0)}.badge-title{display:flex;align-items:center}.badge-type{font-size:.75rem;font-weight:700;color:var(--rpt-color-primary, #2563eb);text-transform:uppercase;margin-right:8px}.badge-id{font-size:.7rem;color:var(--rpt-color-text-muted, #94a3b8);font-family:monospace}.btn-deselect{background:none;border:none;display:flex;align-items:center;justify-content:center;color:var(--rpt-color-text-muted, #64748b);cursor:pointer;padding:3px;border-radius:4px;transition:all .15s ease}.btn-deselect:hover{color:var(--rpt-color-danger, #ef4444);background:#fee2e2}.property-accordion{display:flex;flex-direction:column;gap:10px}.accordion-item{border:1px solid var(--rpt-color-border, #e2e8f0);border-radius:6px;background:#fff;overflow:hidden;transition:all .15s ease}.accordion-item.is-expanded{border-color:#cbd5e1;box-shadow:0 1px 3px #0000000a}.accordion-header{width:100%;display:flex;align-items:center;justify-content:space-between;padding:10px 12px;background:var(--rpt-color-surface, #f8fafc);border:none;cursor:pointer;text-align:left;-webkit-user-select:none;user-select:none;transition:background .15s ease}.accordion-header:hover{background:#f1f5f9}.accordion-item.is-expanded .accordion-header{background:#f8fafc;border-bottom:1px solid var(--rpt-color-border, #e2e8f0)}.header-left{display:flex;align-items:center;gap:8px;min-width:0;flex:1}.header-title{font-size:.72rem;font-weight:700;color:var(--rpt-color-text, #0f172a);text-transform:uppercase;letter-spacing:.03em;white-space:nowrap}.header-badge{font-size:.65rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border:1px solid #bfdbfe;padding:1px 6px;border-radius:9999px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:120px}.header-right{display:flex;align-items:center;color:var(--rpt-color-text-muted, #64748b);margin-left:8px}.accordion-chevron{transition:transform .2s ease}.accordion-item.is-expanded .accordion-chevron{transform:rotate(180deg)}.accordion-content{padding:12px;display:flex;flex-direction:column;gap:12px}::ng-deep .accordion-content .group-title{display:none}::ng-deep .accordion-content .comp-badge-header{display:none}.empty-selection{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;text-align:center;box-sizing:border-box}.empty-icon-wrap{display:inline-flex;align-items:center;justify-content:center;width:52px;height:52px;border-radius:50%;background:#f1f5f9;margin-bottom:16px;box-shadow:0 1px 3px #0000000a}.empty-text{font-size:.8125rem;line-height:1.5;max-width:220px;margin:0;color:var(--rpt-color-text-muted, #64748b)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: RptIconComponent, selector: "rpt-icon", inputs: ["name", "size", "color", "strokeWidth"] }, { kind: "component", type: PropertyEditorGeneralComponent, selector: "rpt-property-editor-general", inputs: ["comp", "propertySchema"], outputs: ["update", "updateProperty", "deselect"] }, { kind: "component", type: PropertyEditorLayoutComponent, selector: "rpt-property-editor-layout", inputs: ["comp", "maxColumns"], outputs: ["updateLayout", "updateHeight", "resetDimensions"] }, { kind: "component", type: PropertyEditorValidationComponent, selector: "rpt-property-editor-validation", inputs: ["comp"], outputs: ["updateValidation"] }, { kind: "component", type: PropertyEditorGridComponent, selector: "rpt-property-editor-grid", inputs: ["grid"], outputs: ["addGrid", "removeGrid", "addColumn", "autoDetectColumns", "removeColumn", "updateColumn", "updateOption", "updateRowClickAction"] }, { kind: "component", type: PropertyEditorReportComponent, selector: "rpt-property-editor-report", inputs: ["definition"], outputs: ["updateReport", "updateLayout"] }, { kind: "component", type: PropertyEditorDatasourceComponent, selector: "rpt-property-editor-datasource", inputs: ["comp", "allComponents"], outputs: ["updateDataSource", "updateProperty"] }, { kind: "component", type: PropertyEditorActionComponent, selector: "rpt-property-editor-action", inputs: ["comp"], outputs: ["updateProperty"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
15617
+ `, isInline: true, styles: [":host{display:block;height:100%;background:#fff;border-left:1px solid var(--rpt-color-border, #cbd5e1);box-sizing:border-box;font-family:var(--rpt-font-family, inherit)}.editor-container{display:flex;flex-direction:column;height:100%}.editor-tabs{display:flex;flex-shrink:0;border-bottom:1px solid var(--rpt-color-border, #cbd5e1);background:var(--rpt-color-surface, #f8fafc)}.tab-btn{flex:1;display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:12px 8px;font-size:var(--rpt-font-size-sm, .75rem);font-weight:600;color:var(--rpt-color-text-muted, #64748b);background:transparent;border:none;border-bottom:2px solid transparent;cursor:pointer;transition:all var(--rpt-transition-speed, .15s) ease}.tab-btn:hover:not(:disabled){color:var(--rpt-color-text, #0f172a)}.tab-btn.active{color:var(--rpt-color-primary, #2563eb);border-bottom-color:var(--rpt-color-primary, #2563eb);background:#fff}.tab-btn:disabled{opacity:.4;cursor:not-allowed}.editor-body{flex:1;overflow-y:auto;padding:12px 14px}.component-sections-wrapper{display:flex;flex-direction:column;gap:12px}.comp-badge-header{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;background:var(--rpt-color-surface, #f8fafc);border-radius:6px;border:1px solid var(--rpt-color-border, #e2e8f0)}.badge-title{display:flex;align-items:center}.badge-type{font-size:.75rem;font-weight:700;color:var(--rpt-color-primary, #2563eb);text-transform:uppercase;margin-right:8px}.badge-id{font-size:.7rem;color:var(--rpt-color-text-muted, #94a3b8);font-family:monospace}.badge-header-actions{display:flex;align-items:center;gap:4px}.btn-badge-action{background:#fff;border:1px solid var(--rpt-color-border, #cbd5e1);display:inline-flex;align-items:center;justify-content:center;color:var(--rpt-color-text-muted, #64748b);cursor:pointer;width:24px;height:24px;border-radius:4px;padding:0;transition:all .12s ease}.btn-badge-action:hover{background:var(--rpt-color-surface-hover, #f1f5f9);color:var(--rpt-color-primary, #2563eb);border-color:var(--rpt-color-primary, #2563eb)}.btn-badge-action.btn-badge-delete:hover{background:#fee2e2;color:#ef4444;border-color:#fca5a5}.btn-deselect{background:none;border:1px solid transparent;display:inline-flex;align-items:center;justify-content:center;color:var(--rpt-color-text-muted, #64748b);cursor:pointer;width:24px;height:24px;border-radius:4px;padding:0;transition:all .15s ease}.btn-deselect:hover{color:var(--rpt-color-danger, #ef4444);background:#fee2e2;border-color:#fca5a5}.property-accordion{display:flex;flex-direction:column;gap:10px}.accordion-item{border:1px solid var(--rpt-color-border, #e2e8f0);border-radius:6px;background:#fff;overflow:hidden;transition:all .15s ease}.accordion-item.is-expanded{border-color:#cbd5e1;box-shadow:0 1px 3px #0000000a}.accordion-header{width:100%;display:flex;align-items:center;justify-content:space-between;padding:10px 12px;background:var(--rpt-color-surface, #f8fafc);border:none;cursor:pointer;text-align:left;-webkit-user-select:none;user-select:none;transition:background .15s ease}.accordion-header:hover{background:#f1f5f9}.accordion-item.is-expanded .accordion-header{background:#f8fafc;border-bottom:1px solid var(--rpt-color-border, #e2e8f0)}.header-left{display:flex;align-items:center;gap:8px;min-width:0;flex:1}.header-title{font-size:.72rem;font-weight:700;color:var(--rpt-color-text, #0f172a);text-transform:uppercase;letter-spacing:.03em;white-space:nowrap}.header-badge{font-size:.65rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border:1px solid #bfdbfe;padding:1px 6px;border-radius:9999px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:120px}.header-right{display:flex;align-items:center;color:var(--rpt-color-text-muted, #64748b);margin-left:8px}.accordion-chevron{transition:transform .2s ease}.accordion-item.is-expanded .accordion-chevron{transform:rotate(180deg)}.accordion-content{padding:12px;display:flex;flex-direction:column;gap:12px}::ng-deep .accordion-content .group-title{display:none}::ng-deep .accordion-content .comp-badge-header{display:none}.empty-selection{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;text-align:center;box-sizing:border-box}.empty-icon-wrap{display:inline-flex;align-items:center;justify-content:center;width:52px;height:52px;border-radius:50%;background:#f1f5f9;margin-bottom:16px;box-shadow:0 1px 3px #0000000a}.empty-text{font-size:.8125rem;line-height:1.5;max-width:220px;margin:0;color:var(--rpt-color-text-muted, #64748b)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: RptIconComponent, selector: "rpt-icon", inputs: ["name", "size", "color", "strokeWidth"] }, { kind: "component", type: PropertyEditorGeneralComponent, selector: "rpt-property-editor-general", inputs: ["comp", "propertySchema"], outputs: ["update", "updateProperty", "deselect"] }, { kind: "component", type: PropertyEditorLayoutComponent, selector: "rpt-property-editor-layout", inputs: ["comp", "maxColumns"], outputs: ["updateLayout", "updateHeight", "resetDimensions"] }, { kind: "component", type: PropertyEditorValidationComponent, selector: "rpt-property-editor-validation", inputs: ["comp"], outputs: ["updateValidation"] }, { kind: "component", type: PropertyEditorGridComponent, selector: "rpt-property-editor-grid", inputs: ["grid"], outputs: ["addGrid", "removeGrid", "addColumn", "autoDetectColumns", "removeColumn", "updateColumn", "updateOption", "updateRowClickAction"] }, { kind: "component", type: PropertyEditorReportComponent, selector: "rpt-property-editor-report", inputs: ["definition"], outputs: ["updateReport", "updateLayout"] }, { kind: "component", type: PropertyEditorDatasourceComponent, selector: "rpt-property-editor-datasource", inputs: ["comp", "allComponents"], outputs: ["updateDataSource", "updateProperty"] }, { kind: "component", type: PropertyEditorActionComponent, selector: "rpt-property-editor-action", inputs: ["comp"], outputs: ["updateProperty"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
15024
15618
  }
15025
15619
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PropertyEditorComponent, decorators: [{
15026
15620
  type: Component,
@@ -15066,6 +15660,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
15066
15660
  <rpt-icon name="table" [size]="13" />
15067
15661
  <span>Grid</span>
15068
15662
  </button>
15663
+
15664
+ <div style="flex: 1;"></div>
15665
+
15666
+ <button
15667
+ type="button"
15668
+ class="tab-btn btn-collapse-inspector"
15669
+ (click)="collapseRequested.emit()"
15670
+ title="Collapse Property Editor"
15671
+ aria-label="Collapse Property Editor"
15672
+ >
15673
+ <rpt-icon name="chevron-right" [size]="13" />
15674
+ </button>
15069
15675
  </div>
15070
15676
 
15071
15677
  <!-- Editor Body -->
@@ -15080,9 +15686,32 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
15080
15686
  <span class="badge-type">{{ comp.type }}</span>
15081
15687
  <span class="badge-id">{{ comp.id }}</span>
15082
15688
  </div>
15083
- <button type="button" class="btn-deselect" (click)="deselect()" title="Deselect component">
15084
- <rpt-icon name="close" [size]="13" />
15085
- </button>
15689
+ <div class="badge-header-actions">
15690
+ <button
15691
+ type="button"
15692
+ class="btn-badge-action"
15693
+ (click)="duplicateComponent(comp.id)"
15694
+ title="Duplicate component"
15695
+ >
15696
+ <rpt-icon name="copy" [size]="13" />
15697
+ </button>
15698
+ <button
15699
+ type="button"
15700
+ class="btn-badge-action btn-badge-delete"
15701
+ (click)="deleteComponent(comp.id)"
15702
+ title="Delete component"
15703
+ >
15704
+ <rpt-icon name="trash" [size]="13" />
15705
+ </button>
15706
+ <button
15707
+ type="button"
15708
+ class="btn-deselect"
15709
+ (click)="deselect()"
15710
+ title="Deselect component"
15711
+ >
15712
+ <rpt-icon name="close" [size]="13" />
15713
+ </button>
15714
+ </div>
15086
15715
  </div>
15087
15716
 
15088
15717
  <!-- Accordion Container -->
@@ -15272,7 +15901,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
15272
15901
  }
15273
15902
  </div>
15274
15903
  </div>
15275
- `, styles: [":host{display:block;height:100%;background:#fff;border-left:1px solid var(--rpt-color-border, #cbd5e1);box-sizing:border-box;font-family:var(--rpt-font-family, inherit)}.editor-container{display:flex;flex-direction:column;height:100%}.editor-tabs{display:flex;flex-shrink:0;border-bottom:1px solid var(--rpt-color-border, #cbd5e1);background:var(--rpt-color-surface, #f8fafc)}.tab-btn{flex:1;display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:12px 8px;font-size:var(--rpt-font-size-sm, .75rem);font-weight:600;color:var(--rpt-color-text-muted, #64748b);background:transparent;border:none;border-bottom:2px solid transparent;cursor:pointer;transition:all var(--rpt-transition-speed, .15s) ease}.tab-btn:hover:not(:disabled){color:var(--rpt-color-text, #0f172a)}.tab-btn.active{color:var(--rpt-color-primary, #2563eb);border-bottom-color:var(--rpt-color-primary, #2563eb);background:#fff}.tab-btn:disabled{opacity:.4;cursor:not-allowed}.editor-body{flex:1;overflow-y:auto;padding:12px 14px}.component-sections-wrapper{display:flex;flex-direction:column;gap:12px}.comp-badge-header{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;background:var(--rpt-color-surface, #f8fafc);border-radius:6px;border:1px solid var(--rpt-color-border, #e2e8f0)}.badge-title{display:flex;align-items:center}.badge-type{font-size:.75rem;font-weight:700;color:var(--rpt-color-primary, #2563eb);text-transform:uppercase;margin-right:8px}.badge-id{font-size:.7rem;color:var(--rpt-color-text-muted, #94a3b8);font-family:monospace}.btn-deselect{background:none;border:none;display:flex;align-items:center;justify-content:center;color:var(--rpt-color-text-muted, #64748b);cursor:pointer;padding:3px;border-radius:4px;transition:all .15s ease}.btn-deselect:hover{color:var(--rpt-color-danger, #ef4444);background:#fee2e2}.property-accordion{display:flex;flex-direction:column;gap:10px}.accordion-item{border:1px solid var(--rpt-color-border, #e2e8f0);border-radius:6px;background:#fff;overflow:hidden;transition:all .15s ease}.accordion-item.is-expanded{border-color:#cbd5e1;box-shadow:0 1px 3px #0000000a}.accordion-header{width:100%;display:flex;align-items:center;justify-content:space-between;padding:10px 12px;background:var(--rpt-color-surface, #f8fafc);border:none;cursor:pointer;text-align:left;-webkit-user-select:none;user-select:none;transition:background .15s ease}.accordion-header:hover{background:#f1f5f9}.accordion-item.is-expanded .accordion-header{background:#f8fafc;border-bottom:1px solid var(--rpt-color-border, #e2e8f0)}.header-left{display:flex;align-items:center;gap:8px;min-width:0;flex:1}.header-title{font-size:.72rem;font-weight:700;color:var(--rpt-color-text, #0f172a);text-transform:uppercase;letter-spacing:.03em;white-space:nowrap}.header-badge{font-size:.65rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border:1px solid #bfdbfe;padding:1px 6px;border-radius:9999px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:120px}.header-right{display:flex;align-items:center;color:var(--rpt-color-text-muted, #64748b);margin-left:8px}.accordion-chevron{transition:transform .2s ease}.accordion-item.is-expanded .accordion-chevron{transform:rotate(180deg)}.accordion-content{padding:12px;display:flex;flex-direction:column;gap:12px}::ng-deep .accordion-content .group-title{display:none}::ng-deep .accordion-content .comp-badge-header{display:none}.empty-selection{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;text-align:center;box-sizing:border-box}.empty-icon-wrap{display:inline-flex;align-items:center;justify-content:center;width:52px;height:52px;border-radius:50%;background:#f1f5f9;margin-bottom:16px;box-shadow:0 1px 3px #0000000a}.empty-text{font-size:.8125rem;line-height:1.5;max-width:220px;margin:0;color:var(--rpt-color-text-muted, #64748b)}\n"] }]
15904
+ `, styles: [":host{display:block;height:100%;background:#fff;border-left:1px solid var(--rpt-color-border, #cbd5e1);box-sizing:border-box;font-family:var(--rpt-font-family, inherit)}.editor-container{display:flex;flex-direction:column;height:100%}.editor-tabs{display:flex;flex-shrink:0;border-bottom:1px solid var(--rpt-color-border, #cbd5e1);background:var(--rpt-color-surface, #f8fafc)}.tab-btn{flex:1;display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:12px 8px;font-size:var(--rpt-font-size-sm, .75rem);font-weight:600;color:var(--rpt-color-text-muted, #64748b);background:transparent;border:none;border-bottom:2px solid transparent;cursor:pointer;transition:all var(--rpt-transition-speed, .15s) ease}.tab-btn:hover:not(:disabled){color:var(--rpt-color-text, #0f172a)}.tab-btn.active{color:var(--rpt-color-primary, #2563eb);border-bottom-color:var(--rpt-color-primary, #2563eb);background:#fff}.tab-btn:disabled{opacity:.4;cursor:not-allowed}.editor-body{flex:1;overflow-y:auto;padding:12px 14px}.component-sections-wrapper{display:flex;flex-direction:column;gap:12px}.comp-badge-header{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;background:var(--rpt-color-surface, #f8fafc);border-radius:6px;border:1px solid var(--rpt-color-border, #e2e8f0)}.badge-title{display:flex;align-items:center}.badge-type{font-size:.75rem;font-weight:700;color:var(--rpt-color-primary, #2563eb);text-transform:uppercase;margin-right:8px}.badge-id{font-size:.7rem;color:var(--rpt-color-text-muted, #94a3b8);font-family:monospace}.badge-header-actions{display:flex;align-items:center;gap:4px}.btn-badge-action{background:#fff;border:1px solid var(--rpt-color-border, #cbd5e1);display:inline-flex;align-items:center;justify-content:center;color:var(--rpt-color-text-muted, #64748b);cursor:pointer;width:24px;height:24px;border-radius:4px;padding:0;transition:all .12s ease}.btn-badge-action:hover{background:var(--rpt-color-surface-hover, #f1f5f9);color:var(--rpt-color-primary, #2563eb);border-color:var(--rpt-color-primary, #2563eb)}.btn-badge-action.btn-badge-delete:hover{background:#fee2e2;color:#ef4444;border-color:#fca5a5}.btn-deselect{background:none;border:1px solid transparent;display:inline-flex;align-items:center;justify-content:center;color:var(--rpt-color-text-muted, #64748b);cursor:pointer;width:24px;height:24px;border-radius:4px;padding:0;transition:all .15s ease}.btn-deselect:hover{color:var(--rpt-color-danger, #ef4444);background:#fee2e2;border-color:#fca5a5}.property-accordion{display:flex;flex-direction:column;gap:10px}.accordion-item{border:1px solid var(--rpt-color-border, #e2e8f0);border-radius:6px;background:#fff;overflow:hidden;transition:all .15s ease}.accordion-item.is-expanded{border-color:#cbd5e1;box-shadow:0 1px 3px #0000000a}.accordion-header{width:100%;display:flex;align-items:center;justify-content:space-between;padding:10px 12px;background:var(--rpt-color-surface, #f8fafc);border:none;cursor:pointer;text-align:left;-webkit-user-select:none;user-select:none;transition:background .15s ease}.accordion-header:hover{background:#f1f5f9}.accordion-item.is-expanded .accordion-header{background:#f8fafc;border-bottom:1px solid var(--rpt-color-border, #e2e8f0)}.header-left{display:flex;align-items:center;gap:8px;min-width:0;flex:1}.header-title{font-size:.72rem;font-weight:700;color:var(--rpt-color-text, #0f172a);text-transform:uppercase;letter-spacing:.03em;white-space:nowrap}.header-badge{font-size:.65rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border:1px solid #bfdbfe;padding:1px 6px;border-radius:9999px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:120px}.header-right{display:flex;align-items:center;color:var(--rpt-color-text-muted, #64748b);margin-left:8px}.accordion-chevron{transition:transform .2s ease}.accordion-item.is-expanded .accordion-chevron{transform:rotate(180deg)}.accordion-content{padding:12px;display:flex;flex-direction:column;gap:12px}::ng-deep .accordion-content .group-title{display:none}::ng-deep .accordion-content .comp-badge-header{display:none}.empty-selection{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;text-align:center;box-sizing:border-box}.empty-icon-wrap{display:inline-flex;align-items:center;justify-content:center;width:52px;height:52px;border-radius:50%;background:#f1f5f9;margin-bottom:16px;box-shadow:0 1px 3px #0000000a}.empty-text{font-size:.8125rem;line-height:1.5;max-width:220px;margin:0;color:var(--rpt-color-text-muted, #64748b)}\n"] }]
15276
15905
  }] });
15277
15906
 
15278
15907
  class DesignerComponent {
@@ -15301,15 +15930,59 @@ class DesignerComponent {
15301
15930
  toggleRightPanel() {
15302
15931
  this.isRightPanelCollapsed.update((v) => !v);
15303
15932
  }
15933
+ openLeftPanelOnly() {
15934
+ this.isLeftPanelCollapsed.set(false);
15935
+ this.isRightPanelCollapsed.set(true);
15936
+ }
15937
+ openRightPanelOnly() {
15938
+ this.isRightPanelCollapsed.set(false);
15939
+ this.isLeftPanelCollapsed.set(true);
15940
+ }
15941
+ closeAllPanels() {
15942
+ this.isLeftPanelCollapsed.set(true);
15943
+ this.isRightPanelCollapsed.set(true);
15944
+ }
15945
+ onResize() {
15946
+ if (typeof window !== 'undefined' && window.innerWidth < 900) {
15947
+ if (!this.isLeftPanelCollapsed() && !this.isRightPanelCollapsed()) {
15948
+ this.isRightPanelCollapsed.set(true);
15949
+ }
15950
+ }
15951
+ }
15952
+ onKeyDown(event) {
15953
+ const isCtrlOrCmd = event.ctrlKey || event.metaKey;
15954
+ const target = event.target;
15955
+ const isInput = target && (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.isContentEditable);
15956
+ if (isInput)
15957
+ return;
15958
+ if (isCtrlOrCmd && !event.altKey && event.key.toLowerCase() === 'b') {
15959
+ event.preventDefault();
15960
+ this.toggleLeftPanel();
15961
+ }
15962
+ else if (isCtrlOrCmd && event.altKey && event.key.toLowerCase() === 'b') {
15963
+ event.preventDefault();
15964
+ this.toggleRightPanel();
15965
+ }
15966
+ }
15304
15967
  formattedJson = computed(() => {
15305
15968
  return JSON.stringify(this.currentDefinition(), null, 2);
15306
15969
  });
15307
15970
  loadedReportId = null;
15308
15971
  loadedReportDef = null;
15972
+ lastEmittedDef = null;
15309
15973
  constructor() {
15310
15974
  effect(() => {
15311
15975
  const def = this.definition();
15312
- if (def && (def !== this.loadedReportDef || def.id !== this.loadedReportId)) {
15976
+ if (!def)
15977
+ return;
15978
+ // Skip if this definition is reference-identical to what the designer just emitted or current internal state
15979
+ if (def === this.lastEmittedDef || def === this.designerState.definition()) {
15980
+ this.loadedReportDef = def;
15981
+ return;
15982
+ }
15983
+ // Only reload if report ID changed (different report), or initial load, or external definition when not actively editing
15984
+ const isNewReport = def.id !== this.loadedReportId;
15985
+ if (isNewReport || (def !== this.loadedReportDef && !this.designerState.isDirty())) {
15313
15986
  this.loadedReportId = def.id;
15314
15987
  this.loadedReportDef = def;
15315
15988
  this.designerState.loadDefinition(def);
@@ -15320,6 +15993,7 @@ class DesignerComponent {
15320
15993
  if (id && id !== this.loadedReportId && !this.definition() && this.persistenceAdapter) {
15321
15994
  this.loadedReportId = id;
15322
15995
  this.persistenceAdapter.load(id).subscribe((def) => {
15996
+ this.loadedReportDef = def;
15323
15997
  this.designerState.loadDefinition(def);
15324
15998
  });
15325
15999
  }
@@ -15327,11 +16001,23 @@ class DesignerComponent {
15327
16001
  effect(() => {
15328
16002
  const current = this.designerState.definition();
15329
16003
  if (this.designerState.isDirty()) {
16004
+ this.lastEmittedDef = current;
16005
+ this.loadedReportDef = current;
16006
+ this.loadedReportId = current.id;
15330
16007
  this.definitionChanged.emit(current);
15331
16008
  }
15332
16009
  });
15333
16010
  }
15334
16011
  ngOnInit() {
16012
+ if (typeof window !== 'undefined') {
16013
+ if (window.innerWidth < 900) {
16014
+ this.isLeftPanelCollapsed.set(true);
16015
+ this.isRightPanelCollapsed.set(true);
16016
+ }
16017
+ else if (window.innerWidth < 1200) {
16018
+ this.isRightPanelCollapsed.set(true);
16019
+ }
16020
+ }
15335
16021
  if (!this.definition() && !this.reportId()) {
15336
16022
  // Start with a clean report definition
15337
16023
  this.designerState.loadDefinition({
@@ -15430,30 +16116,35 @@ class DesignerComponent {
15430
16116
  setTimeout(() => this.saveMessage.set(null), 3000);
15431
16117
  }
15432
16118
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DesignerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
15433
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: DesignerComponent, isStandalone: true, selector: "rpt-designer", inputs: { reportId: { classPropertyName: "reportId", publicName: "reportId", isSignal: true, isRequired: false, transformFunction: null }, definition: { classPropertyName: "definition", publicName: "initialReport", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { reportSaved: "save", definitionChanged: "definitionChange" }, providers: [DesignerStateService], ngImport: i0, template: `
16119
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: DesignerComponent, isStandalone: true, selector: "rpt-designer", inputs: { reportId: { classPropertyName: "reportId", publicName: "reportId", isSignal: true, isRequired: false, transformFunction: null }, definition: { classPropertyName: "definition", publicName: "initialReport", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { reportSaved: "save", definitionChanged: "definitionChange" }, host: { listeners: { "window:resize": "onResize()", "window:keydown": "onKeyDown($event)" } }, providers: [DesignerStateService], ngImport: i0, template: `
15434
16120
  <div class="designer-shell">
15435
- <!-- Top Actions Toolbar -->
15436
- <rpt-designer-toolbar (saveRequested)="onSave()" />
16121
+ <!-- Top Actions Toolbar with Sidebar Controls -->
16122
+ <rpt-designer-toolbar
16123
+ [isLeftPanelCollapsed]="isLeftPanelCollapsed()"
16124
+ [isRightPanelCollapsed]="isRightPanelCollapsed()"
16125
+ (toggleLeftPanel)="toggleLeftPanel()"
16126
+ (toggleRightPanel)="toggleRightPanel()"
16127
+ (saveRequested)="onSave()"
16128
+ />
15437
16129
 
15438
16130
  <!-- Main 3-Panel Layout with CDK Drop List Group connecting Palette & Canvas -->
15439
16131
  <div class="designer-workbench" cdkDropListGroup>
16132
+ <!-- Backdrop for compact/mobile slide-out drawers -->
16133
+ @if (viewMode() === 'design' && (!isLeftPanelCollapsed() || !isRightPanelCollapsed())) {
16134
+ <div
16135
+ class="workbench-drawer-backdrop"
16136
+ (click)="closeAllPanels()"
16137
+ aria-hidden="true"
16138
+ ></div>
16139
+ }
16140
+
15440
16141
  <!-- 1. Left Panel: Component Palette (only shown in design mode) -->
15441
16142
  @if (viewMode() === 'design') {
15442
- <aside class="workbench-left-panel" [class.is-collapsed]="isLeftPanelCollapsed()">
15443
- <rpt-component-palette />
15444
- </aside>
15445
-
15446
- <!-- Left Panel Collapse/Expand Toggle -->
15447
- <button
15448
- type="button"
15449
- class="workbench-collapse-btn btn-collapse-left"
15450
- [class.is-collapsed]="isLeftPanelCollapsed()"
15451
- (click)="toggleLeftPanel()"
15452
- [title]="isLeftPanelCollapsed() ? 'Expand Component Palette' : 'Collapse Component Palette'"
15453
- [attr.aria-label]="isLeftPanelCollapsed() ? 'Expand Component Palette' : 'Collapse Component Palette'"
15454
- >
15455
- <rpt-icon [name]="isLeftPanelCollapsed() ? 'chevron-right' : 'chevron-left'" [size]="12" />
15456
- </button>
16143
+ <div class="workbench-left-container" [class.is-collapsed]="isLeftPanelCollapsed()">
16144
+ <aside class="workbench-left-panel">
16145
+ <rpt-component-palette (collapseRequested)="toggleLeftPanel()" />
16146
+ </aside>
16147
+ </div>
15457
16148
  }
15458
16149
 
15459
16150
  <!-- 2. Center Panel: Design Canvas OR Live Preview OR JSON Schema -->
@@ -15497,23 +16188,51 @@ class DesignerComponent {
15497
16188
 
15498
16189
  <!-- 3. Right Panel: Property Editor (only shown in design mode) -->
15499
16190
  @if (viewMode() === 'design') {
15500
- <!-- Right Panel Collapse/Expand Toggle -->
16191
+ <div class="workbench-right-container" [class.is-collapsed]="isRightPanelCollapsed()">
16192
+ <aside class="workbench-right-panel">
16193
+ <rpt-property-editor (collapseRequested)="toggleRightPanel()" />
16194
+ </aside>
16195
+ </div>
16196
+ }
16197
+ </div>
16198
+
16199
+ <!-- Compact/Mobile Workbench Bottom Navigation Bar -->
16200
+ @if (viewMode() === 'design') {
16201
+ <nav class="compact-workbench-bar" aria-label="Mobile Workbench Navigation">
15501
16202
  <button
15502
16203
  type="button"
15503
- class="workbench-collapse-btn btn-collapse-right"
15504
- [class.is-collapsed]="isRightPanelCollapsed()"
15505
- (click)="toggleRightPanel()"
15506
- [title]="isRightPanelCollapsed() ? 'Expand Property Editor' : 'Collapse Property Editor'"
15507
- [attr.aria-label]="isRightPanelCollapsed() ? 'Expand Property Editor' : 'Collapse Property Editor'"
16204
+ class="compact-nav-btn"
16205
+ [class.active]="!isLeftPanelCollapsed()"
16206
+ (click)="openLeftPanelOnly()"
16207
+ title="Open Component Palette"
15508
16208
  >
15509
- <rpt-icon [name]="isRightPanelCollapsed() ? 'chevron-left' : 'chevron-right'" [size]="12" />
16209
+ <rpt-icon name="layers" [size]="14" />
16210
+ <span>Components</span>
15510
16211
  </button>
15511
16212
 
15512
- <aside class="workbench-right-panel" [class.is-collapsed]="isRightPanelCollapsed()">
15513
- <rpt-property-editor />
15514
- </aside>
15515
- }
15516
- </div>
16213
+ <button
16214
+ type="button"
16215
+ class="compact-nav-btn"
16216
+ [class.active]="isLeftPanelCollapsed() && isRightPanelCollapsed()"
16217
+ (click)="closeAllPanels()"
16218
+ title="Full Canvas View"
16219
+ >
16220
+ <rpt-icon name="edit" [size]="14" />
16221
+ <span>Canvas</span>
16222
+ </button>
16223
+
16224
+ <button
16225
+ type="button"
16226
+ class="compact-nav-btn"
16227
+ [class.active]="!isRightPanelCollapsed()"
16228
+ (click)="openRightPanelOnly()"
16229
+ title="Open Properties Inspector"
16230
+ >
16231
+ <rpt-icon name="settings" [size]="14" />
16232
+ <span>Properties</span>
16233
+ </button>
16234
+ </nav>
16235
+ }
15517
16236
 
15518
16237
  <!-- Save Notification Toast -->
15519
16238
  @if (saveMessage()) {
@@ -15523,7 +16242,7 @@ class DesignerComponent {
15523
16242
  </div>
15524
16243
  }
15525
16244
  </div>
15526
- `, isInline: true, styles: [":host{display:block;width:100%;height:100%;min-height:600px;font-family:var(--rpt-font-family, inherit);box-sizing:border-box}.designer-shell{display:flex;flex-direction:column;height:100%;background-color:#f8fafc;position:relative}.designer-workbench{display:flex;flex:1;overflow:hidden;position:relative}.workbench-left-panel{width:250px;flex-shrink:0;height:100%;overflow:hidden;z-index:10;transition:width var(--rpt-transition-speed-smooth, .25s) cubic-bezier(.16,1,.3,1);border-right:1px solid var(--rpt-color-border, #cbd5e1);background:#fff}.workbench-left-panel.is-collapsed{width:0!important;border-right:none;visibility:hidden}.workbench-center-panel{flex:1;height:100%;overflow:hidden;display:flex;flex-direction:column;min-width:0}.workbench-right-panel{width:320px;flex-shrink:0;height:100%;overflow:hidden;z-index:10;transition:width var(--rpt-transition-speed-smooth, .25s) cubic-bezier(.16,1,.3,1);border-left:1px solid var(--rpt-color-border, #cbd5e1);background:#fff}.workbench-right-panel.is-collapsed{width:0!important;border-left:none;visibility:hidden}.workbench-collapse-btn{position:absolute;top:14px;width:18px;height:36px;background:#fff;border:1px solid var(--rpt-color-border, #cbd5e1);color:var(--rpt-color-text-muted, #64748b);cursor:pointer;z-index:25;display:flex;align-items:center;justify-content:center;padding:0;box-shadow:0 2px 4px #0000000f;transition:all var(--rpt-transition-speed, .15s) ease}.workbench-collapse-btn:hover{background:var(--rpt-color-surface-hover, #f8fafc);color:var(--rpt-color-primary, #2563eb);border-color:var(--rpt-color-primary, #2563eb)}.btn-collapse-left{left:242px;border-radius:0 6px 6px 0;border-left:none;transition:left var(--rpt-transition-speed-smooth, .25s) cubic-bezier(.16,1,.3,1)}.btn-collapse-left.is-collapsed{left:0;border-left:1px solid var(--rpt-color-border, #cbd5e1)}.btn-collapse-right{right:312px;border-radius:6px 0 0 6px;border-right:none;transition:right var(--rpt-transition-speed-smooth, .25s) cubic-bezier(.16,1,.3,1)}.btn-collapse-right.is-collapsed{right:0;border-right:1px solid var(--rpt-color-border, #cbd5e1)}.preview-mode-container{flex:1;overflow-y:auto;padding:16px;background-color:#f1f5f9;box-sizing:border-box}.preview-banner{max-width:1400px;margin:0 auto 16px;background:#eff6ff;color:#1e40af;border:1px solid #bfdbfe;padding:10px 18px;border-radius:var(--rpt-border-radius-lg, 8px);font-size:var(--rpt-font-size-sm, .8rem);font-weight:600;display:flex;align-items:center;gap:8px;box-shadow:var(--rpt-box-shadow-xs, 0 1px 2px rgba(0, 0, 0, .04));box-sizing:border-box}.preview-content{max-width:1400px;margin:0 auto;background:#fff;border-radius:var(--rpt-border-radius-lg, 8px);border:1px solid var(--rpt-color-border, #cbd5e1);box-shadow:0 4px 6px -1px #0000000d;padding:0;min-height:480px;box-sizing:border-box}.json-mode-container{flex:1;overflow-y:auto;padding:24px;background-color:#0f172a;display:flex;flex-direction:column}.json-banner{display:flex;align-items:center;justify-content:space-between;color:#94a3b8;font-size:.8rem;font-weight:600;margin-bottom:16px;padding-bottom:12px;border-bottom:1px solid #1e293b}.btn-copy-json{background:#ffffff1a;color:#fff;border:1px solid rgba(255,255,255,.2);border-radius:4px;padding:4px 12px;font-size:.75rem;cursor:pointer;transition:all .15s ease}.btn-copy-json:hover{background:#fff3}.json-display{flex:1;margin:0;padding:20px;background:#090d16;border-radius:8px;border:1px solid #1e293b;color:#38bdf8;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:.85rem;line-height:1.5;overflow-x:auto}.save-toast{position:absolute;bottom:24px;right:24px;background:#10b981;color:#fff;padding:10px 20px;border-radius:6px;font-size:.85rem;font-weight:600;box-shadow:0 10px 15px -3px #0000001a;z-index:100;animation:rpt-fade-in .2s ease}@keyframes rpt-fade-in{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i1$2.CdkDropListGroup, selector: "[cdkDropListGroup]", inputs: ["cdkDropListGroupDisabled"], exportAs: ["cdkDropListGroup"] }, { kind: "component", type: DesignerToolbarComponent, selector: "rpt-designer-toolbar", outputs: ["saveRequested"] }, { kind: "component", type: ComponentPaletteComponent, selector: "rpt-component-palette" }, { kind: "component", type: DesignCanvasComponent, selector: "rpt-design-canvas" }, { kind: "component", type: PropertyEditorComponent, selector: "rpt-property-editor" }, { kind: "component", type: DynamicRendererComponent, selector: "rpt-dynamic-renderer", inputs: ["definition", "initialValues", "resultData"], outputs: ["executeRequested", "resetRequested", "exportRequested", "printRequested", "customActionTriggered", "gridStateChanged", "columnDefsChanged", "rowActionTriggered"] }, { kind: "component", type: RptIconComponent, selector: "rpt-icon", inputs: ["name", "size", "color", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
16245
+ `, isInline: true, styles: [":host{display:block;width:100%;height:100%;min-height:400px;font-family:var(--rpt-font-family, inherit);box-sizing:border-box}.designer-shell{display:flex;flex-direction:column;height:100%;background-color:#f8fafc;position:relative;overflow:hidden}.designer-workbench{display:flex;flex:1;overflow:hidden;position:relative;min-height:0}.workbench-left-container{display:flex;position:relative;width:250px;flex-shrink:0;height:100%;transition:width var(--rpt-transition-speed-smooth, .25s) cubic-bezier(.16,1,.3,1);z-index:20}.workbench-left-container.is-collapsed{width:0!important}.workbench-left-panel{width:100%;height:100%;overflow:hidden;border-right:1px solid var(--rpt-color-border, #cbd5e1);background:#fff;box-sizing:border-box}.workbench-left-container.is-collapsed .workbench-left-panel{visibility:hidden;border-right:none}.workbench-center-panel{flex:1;height:100%;overflow:hidden;display:flex;flex-direction:column;min-width:0;position:relative}.workbench-right-container{display:flex;position:relative;width:320px;flex-shrink:0;height:100%;transition:width var(--rpt-transition-speed-smooth, .25s) cubic-bezier(.16,1,.3,1);z-index:20}.workbench-right-container.is-collapsed{width:0!important}.workbench-right-panel{width:100%;height:100%;overflow:hidden;border-left:1px solid var(--rpt-color-border, #cbd5e1);background:#fff;box-sizing:border-box}.workbench-right-container.is-collapsed .workbench-right-panel{visibility:hidden;border-left:none}.compact-workbench-bar,.workbench-drawer-backdrop{display:none}@media (max-width: 900px){.compact-workbench-bar{display:flex;align-items:center;justify-content:space-around;height:48px;background:var(--rpt-color-surface, #ffffff);border-top:1px solid var(--rpt-color-border, #cbd5e1);padding:0 12px;gap:8px;z-index:45;flex-shrink:0;box-shadow:0 -2px 8px #0000000a;font-family:var(--rpt-font-family, inherit)}.compact-nav-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:6px 14px;border-radius:var(--rpt-border-radius, 6px);border:1px solid transparent;background:transparent;font-family:var(--rpt-font-family, inherit);font-size:var(--rpt-font-size-sm, .75rem);font-weight:var(--rpt-font-weight-medium, 500);letter-spacing:-.01em;line-height:1.4;color:var(--rpt-color-text-secondary, #334155);cursor:pointer;-webkit-user-select:none;user-select:none;transition:all var(--rpt-transition-speed, .15s) ease;white-space:nowrap}.compact-nav-btn rpt-icon{display:inline-flex;align-items:center;justify-content:center;color:var(--rpt-color-text-muted, #64748b);transition:color var(--rpt-transition-speed, .15s) ease}.compact-nav-btn:hover{background:var(--rpt-color-surface-hover, #f1f5f9);color:var(--rpt-color-text, #0f172a);border-color:var(--rpt-color-border-subtle, #e2e8f0)}.compact-nav-btn:hover rpt-icon{color:var(--rpt-color-text, #0f172a)}.compact-nav-btn.active{background:var(--rpt-color-primary-light, #eff6ff);color:var(--rpt-color-primary, #2563eb);border-color:#2563eb40;font-weight:var(--rpt-font-weight-semibold, 600);box-shadow:0 1px 2px #2563eb14}.compact-nav-btn.active rpt-icon{color:var(--rpt-color-primary, #2563eb)}.compact-nav-btn:focus-visible{outline:2px solid var(--rpt-color-primary, #2563eb);outline-offset:1px}.workbench-drawer-backdrop{display:block;position:absolute;inset:0;background:#0f172a59;backdrop-filter:blur(1px);z-index:50}.workbench-left-container{position:absolute;left:0;top:0;bottom:0;width:280px;max-width:85vw;z-index:60;box-shadow:4px 0 24px #00000026;transform:translate(0);transition:transform .25s cubic-bezier(.16,1,.3,1)}.workbench-left-container.is-collapsed{transform:translate(-100%);width:280px!important}.workbench-right-container{position:absolute;right:0;top:0;bottom:0;width:320px;max-width:90vw;z-index:60;box-shadow:-4px 0 24px #00000026;transform:translate(0);transition:transform .25s cubic-bezier(.16,1,.3,1)}.workbench-right-container.is-collapsed{transform:translate(100%);width:320px!important}}.preview-mode-container{flex:1;overflow-y:auto;padding:16px;background-color:#f1f5f9;box-sizing:border-box}.preview-banner{max-width:1400px;margin:0 auto 16px;background:#eff6ff;color:#1e40af;border:1px solid #bfdbfe;padding:10px 18px;border-radius:var(--rpt-border-radius-lg, 8px);font-size:var(--rpt-font-size-sm, .8rem);font-weight:600;display:flex;align-items:center;gap:8px;box-shadow:var(--rpt-box-shadow-xs, 0 1px 2px rgba(0, 0, 0, .04));box-sizing:border-box}.preview-content{max-width:1400px;margin:0 auto;background:#fff;border-radius:var(--rpt-border-radius-lg, 8px);border:1px solid var(--rpt-color-border, #cbd5e1);box-shadow:0 4px 6px -1px #0000000d;padding:0;min-height:480px;box-sizing:border-box}.json-mode-container{flex:1;overflow-y:auto;padding:24px;background-color:#0f172a;display:flex;flex-direction:column}.json-banner{display:flex;align-items:center;justify-content:space-between;color:#94a3b8;font-size:.8rem;font-weight:600;margin-bottom:16px;padding-bottom:12px;border-bottom:1px solid #1e293b}.btn-copy-json{background:#ffffff1a;color:#fff;border:1px solid rgba(255,255,255,.2);border-radius:4px;padding:4px 12px;font-size:.75rem;cursor:pointer;transition:all .15s ease}.btn-copy-json:hover{background:#fff3}.json-display{flex:1;margin:0;padding:20px;background:#090d16;border-radius:8px;border:1px solid #1e293b;color:#38bdf8;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:.85rem;line-height:1.5;overflow-x:auto}.save-toast{position:absolute;bottom:24px;right:24px;background:#10b981;color:#fff;padding:10px 20px;border-radius:6px;font-size:.85rem;font-weight:600;box-shadow:0 10px 15px -3px #0000001a;z-index:100;animation:rpt-fade-in .2s ease}@keyframes rpt-fade-in{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i1$2.CdkDropListGroup, selector: "[cdkDropListGroup]", inputs: ["cdkDropListGroupDisabled"], exportAs: ["cdkDropListGroup"] }, { kind: "component", type: DesignerToolbarComponent, selector: "rpt-designer-toolbar", inputs: ["isLeftPanelCollapsed", "isRightPanelCollapsed"], outputs: ["toggleLeftPanel", "toggleRightPanel", "saveRequested"] }, { kind: "component", type: ComponentPaletteComponent, selector: "rpt-component-palette", outputs: ["collapseRequested"] }, { kind: "component", type: DesignCanvasComponent, selector: "rpt-design-canvas" }, { kind: "component", type: PropertyEditorComponent, selector: "rpt-property-editor", outputs: ["collapseRequested"] }, { kind: "component", type: DynamicRendererComponent, selector: "rpt-dynamic-renderer", inputs: ["definition", "initialValues", "resultData"], outputs: ["executeRequested", "resetRequested", "exportRequested", "printRequested", "customActionTriggered", "gridStateChanged", "columnDefsChanged", "selectionChange", "selectionChanged", "rowActionTriggered"] }, { kind: "component", type: RptIconComponent, selector: "rpt-icon", inputs: ["name", "size", "color", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
15527
16246
  }
15528
16247
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DesignerComponent, decorators: [{
15529
16248
  type: Component,
@@ -15539,28 +16258,33 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
15539
16258
  RptIconComponent,
15540
16259
  ], providers: [DesignerStateService], template: `
15541
16260
  <div class="designer-shell">
15542
- <!-- Top Actions Toolbar -->
15543
- <rpt-designer-toolbar (saveRequested)="onSave()" />
16261
+ <!-- Top Actions Toolbar with Sidebar Controls -->
16262
+ <rpt-designer-toolbar
16263
+ [isLeftPanelCollapsed]="isLeftPanelCollapsed()"
16264
+ [isRightPanelCollapsed]="isRightPanelCollapsed()"
16265
+ (toggleLeftPanel)="toggleLeftPanel()"
16266
+ (toggleRightPanel)="toggleRightPanel()"
16267
+ (saveRequested)="onSave()"
16268
+ />
15544
16269
 
15545
16270
  <!-- Main 3-Panel Layout with CDK Drop List Group connecting Palette & Canvas -->
15546
16271
  <div class="designer-workbench" cdkDropListGroup>
16272
+ <!-- Backdrop for compact/mobile slide-out drawers -->
16273
+ @if (viewMode() === 'design' && (!isLeftPanelCollapsed() || !isRightPanelCollapsed())) {
16274
+ <div
16275
+ class="workbench-drawer-backdrop"
16276
+ (click)="closeAllPanels()"
16277
+ aria-hidden="true"
16278
+ ></div>
16279
+ }
16280
+
15547
16281
  <!-- 1. Left Panel: Component Palette (only shown in design mode) -->
15548
16282
  @if (viewMode() === 'design') {
15549
- <aside class="workbench-left-panel" [class.is-collapsed]="isLeftPanelCollapsed()">
15550
- <rpt-component-palette />
15551
- </aside>
15552
-
15553
- <!-- Left Panel Collapse/Expand Toggle -->
15554
- <button
15555
- type="button"
15556
- class="workbench-collapse-btn btn-collapse-left"
15557
- [class.is-collapsed]="isLeftPanelCollapsed()"
15558
- (click)="toggleLeftPanel()"
15559
- [title]="isLeftPanelCollapsed() ? 'Expand Component Palette' : 'Collapse Component Palette'"
15560
- [attr.aria-label]="isLeftPanelCollapsed() ? 'Expand Component Palette' : 'Collapse Component Palette'"
15561
- >
15562
- <rpt-icon [name]="isLeftPanelCollapsed() ? 'chevron-right' : 'chevron-left'" [size]="12" />
15563
- </button>
16283
+ <div class="workbench-left-container" [class.is-collapsed]="isLeftPanelCollapsed()">
16284
+ <aside class="workbench-left-panel">
16285
+ <rpt-component-palette (collapseRequested)="toggleLeftPanel()" />
16286
+ </aside>
16287
+ </div>
15564
16288
  }
15565
16289
 
15566
16290
  <!-- 2. Center Panel: Design Canvas OR Live Preview OR JSON Schema -->
@@ -15604,23 +16328,51 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
15604
16328
 
15605
16329
  <!-- 3. Right Panel: Property Editor (only shown in design mode) -->
15606
16330
  @if (viewMode() === 'design') {
15607
- <!-- Right Panel Collapse/Expand Toggle -->
16331
+ <div class="workbench-right-container" [class.is-collapsed]="isRightPanelCollapsed()">
16332
+ <aside class="workbench-right-panel">
16333
+ <rpt-property-editor (collapseRequested)="toggleRightPanel()" />
16334
+ </aside>
16335
+ </div>
16336
+ }
16337
+ </div>
16338
+
16339
+ <!-- Compact/Mobile Workbench Bottom Navigation Bar -->
16340
+ @if (viewMode() === 'design') {
16341
+ <nav class="compact-workbench-bar" aria-label="Mobile Workbench Navigation">
15608
16342
  <button
15609
16343
  type="button"
15610
- class="workbench-collapse-btn btn-collapse-right"
15611
- [class.is-collapsed]="isRightPanelCollapsed()"
15612
- (click)="toggleRightPanel()"
15613
- [title]="isRightPanelCollapsed() ? 'Expand Property Editor' : 'Collapse Property Editor'"
15614
- [attr.aria-label]="isRightPanelCollapsed() ? 'Expand Property Editor' : 'Collapse Property Editor'"
16344
+ class="compact-nav-btn"
16345
+ [class.active]="!isLeftPanelCollapsed()"
16346
+ (click)="openLeftPanelOnly()"
16347
+ title="Open Component Palette"
15615
16348
  >
15616
- <rpt-icon [name]="isRightPanelCollapsed() ? 'chevron-left' : 'chevron-right'" [size]="12" />
16349
+ <rpt-icon name="layers" [size]="14" />
16350
+ <span>Components</span>
15617
16351
  </button>
15618
16352
 
15619
- <aside class="workbench-right-panel" [class.is-collapsed]="isRightPanelCollapsed()">
15620
- <rpt-property-editor />
15621
- </aside>
15622
- }
15623
- </div>
16353
+ <button
16354
+ type="button"
16355
+ class="compact-nav-btn"
16356
+ [class.active]="isLeftPanelCollapsed() && isRightPanelCollapsed()"
16357
+ (click)="closeAllPanels()"
16358
+ title="Full Canvas View"
16359
+ >
16360
+ <rpt-icon name="edit" [size]="14" />
16361
+ <span>Canvas</span>
16362
+ </button>
16363
+
16364
+ <button
16365
+ type="button"
16366
+ class="compact-nav-btn"
16367
+ [class.active]="!isRightPanelCollapsed()"
16368
+ (click)="openRightPanelOnly()"
16369
+ title="Open Properties Inspector"
16370
+ >
16371
+ <rpt-icon name="settings" [size]="14" />
16372
+ <span>Properties</span>
16373
+ </button>
16374
+ </nav>
16375
+ }
15624
16376
 
15625
16377
  <!-- Save Notification Toast -->
15626
16378
  @if (saveMessage()) {
@@ -15630,8 +16382,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
15630
16382
  </div>
15631
16383
  }
15632
16384
  </div>
15633
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;width:100%;height:100%;min-height:600px;font-family:var(--rpt-font-family, inherit);box-sizing:border-box}.designer-shell{display:flex;flex-direction:column;height:100%;background-color:#f8fafc;position:relative}.designer-workbench{display:flex;flex:1;overflow:hidden;position:relative}.workbench-left-panel{width:250px;flex-shrink:0;height:100%;overflow:hidden;z-index:10;transition:width var(--rpt-transition-speed-smooth, .25s) cubic-bezier(.16,1,.3,1);border-right:1px solid var(--rpt-color-border, #cbd5e1);background:#fff}.workbench-left-panel.is-collapsed{width:0!important;border-right:none;visibility:hidden}.workbench-center-panel{flex:1;height:100%;overflow:hidden;display:flex;flex-direction:column;min-width:0}.workbench-right-panel{width:320px;flex-shrink:0;height:100%;overflow:hidden;z-index:10;transition:width var(--rpt-transition-speed-smooth, .25s) cubic-bezier(.16,1,.3,1);border-left:1px solid var(--rpt-color-border, #cbd5e1);background:#fff}.workbench-right-panel.is-collapsed{width:0!important;border-left:none;visibility:hidden}.workbench-collapse-btn{position:absolute;top:14px;width:18px;height:36px;background:#fff;border:1px solid var(--rpt-color-border, #cbd5e1);color:var(--rpt-color-text-muted, #64748b);cursor:pointer;z-index:25;display:flex;align-items:center;justify-content:center;padding:0;box-shadow:0 2px 4px #0000000f;transition:all var(--rpt-transition-speed, .15s) ease}.workbench-collapse-btn:hover{background:var(--rpt-color-surface-hover, #f8fafc);color:var(--rpt-color-primary, #2563eb);border-color:var(--rpt-color-primary, #2563eb)}.btn-collapse-left{left:242px;border-radius:0 6px 6px 0;border-left:none;transition:left var(--rpt-transition-speed-smooth, .25s) cubic-bezier(.16,1,.3,1)}.btn-collapse-left.is-collapsed{left:0;border-left:1px solid var(--rpt-color-border, #cbd5e1)}.btn-collapse-right{right:312px;border-radius:6px 0 0 6px;border-right:none;transition:right var(--rpt-transition-speed-smooth, .25s) cubic-bezier(.16,1,.3,1)}.btn-collapse-right.is-collapsed{right:0;border-right:1px solid var(--rpt-color-border, #cbd5e1)}.preview-mode-container{flex:1;overflow-y:auto;padding:16px;background-color:#f1f5f9;box-sizing:border-box}.preview-banner{max-width:1400px;margin:0 auto 16px;background:#eff6ff;color:#1e40af;border:1px solid #bfdbfe;padding:10px 18px;border-radius:var(--rpt-border-radius-lg, 8px);font-size:var(--rpt-font-size-sm, .8rem);font-weight:600;display:flex;align-items:center;gap:8px;box-shadow:var(--rpt-box-shadow-xs, 0 1px 2px rgba(0, 0, 0, .04));box-sizing:border-box}.preview-content{max-width:1400px;margin:0 auto;background:#fff;border-radius:var(--rpt-border-radius-lg, 8px);border:1px solid var(--rpt-color-border, #cbd5e1);box-shadow:0 4px 6px -1px #0000000d;padding:0;min-height:480px;box-sizing:border-box}.json-mode-container{flex:1;overflow-y:auto;padding:24px;background-color:#0f172a;display:flex;flex-direction:column}.json-banner{display:flex;align-items:center;justify-content:space-between;color:#94a3b8;font-size:.8rem;font-weight:600;margin-bottom:16px;padding-bottom:12px;border-bottom:1px solid #1e293b}.btn-copy-json{background:#ffffff1a;color:#fff;border:1px solid rgba(255,255,255,.2);border-radius:4px;padding:4px 12px;font-size:.75rem;cursor:pointer;transition:all .15s ease}.btn-copy-json:hover{background:#fff3}.json-display{flex:1;margin:0;padding:20px;background:#090d16;border-radius:8px;border:1px solid #1e293b;color:#38bdf8;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:.85rem;line-height:1.5;overflow-x:auto}.save-toast{position:absolute;bottom:24px;right:24px;background:#10b981;color:#fff;padding:10px 20px;border-radius:6px;font-size:.85rem;font-weight:600;box-shadow:0 10px 15px -3px #0000001a;z-index:100;animation:rpt-fade-in .2s ease}@keyframes rpt-fade-in{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}\n"] }]
15634
- }], ctorParameters: () => [] });
16385
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;width:100%;height:100%;min-height:400px;font-family:var(--rpt-font-family, inherit);box-sizing:border-box}.designer-shell{display:flex;flex-direction:column;height:100%;background-color:#f8fafc;position:relative;overflow:hidden}.designer-workbench{display:flex;flex:1;overflow:hidden;position:relative;min-height:0}.workbench-left-container{display:flex;position:relative;width:250px;flex-shrink:0;height:100%;transition:width var(--rpt-transition-speed-smooth, .25s) cubic-bezier(.16,1,.3,1);z-index:20}.workbench-left-container.is-collapsed{width:0!important}.workbench-left-panel{width:100%;height:100%;overflow:hidden;border-right:1px solid var(--rpt-color-border, #cbd5e1);background:#fff;box-sizing:border-box}.workbench-left-container.is-collapsed .workbench-left-panel{visibility:hidden;border-right:none}.workbench-center-panel{flex:1;height:100%;overflow:hidden;display:flex;flex-direction:column;min-width:0;position:relative}.workbench-right-container{display:flex;position:relative;width:320px;flex-shrink:0;height:100%;transition:width var(--rpt-transition-speed-smooth, .25s) cubic-bezier(.16,1,.3,1);z-index:20}.workbench-right-container.is-collapsed{width:0!important}.workbench-right-panel{width:100%;height:100%;overflow:hidden;border-left:1px solid var(--rpt-color-border, #cbd5e1);background:#fff;box-sizing:border-box}.workbench-right-container.is-collapsed .workbench-right-panel{visibility:hidden;border-left:none}.compact-workbench-bar,.workbench-drawer-backdrop{display:none}@media (max-width: 900px){.compact-workbench-bar{display:flex;align-items:center;justify-content:space-around;height:48px;background:var(--rpt-color-surface, #ffffff);border-top:1px solid var(--rpt-color-border, #cbd5e1);padding:0 12px;gap:8px;z-index:45;flex-shrink:0;box-shadow:0 -2px 8px #0000000a;font-family:var(--rpt-font-family, inherit)}.compact-nav-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:6px 14px;border-radius:var(--rpt-border-radius, 6px);border:1px solid transparent;background:transparent;font-family:var(--rpt-font-family, inherit);font-size:var(--rpt-font-size-sm, .75rem);font-weight:var(--rpt-font-weight-medium, 500);letter-spacing:-.01em;line-height:1.4;color:var(--rpt-color-text-secondary, #334155);cursor:pointer;-webkit-user-select:none;user-select:none;transition:all var(--rpt-transition-speed, .15s) ease;white-space:nowrap}.compact-nav-btn rpt-icon{display:inline-flex;align-items:center;justify-content:center;color:var(--rpt-color-text-muted, #64748b);transition:color var(--rpt-transition-speed, .15s) ease}.compact-nav-btn:hover{background:var(--rpt-color-surface-hover, #f1f5f9);color:var(--rpt-color-text, #0f172a);border-color:var(--rpt-color-border-subtle, #e2e8f0)}.compact-nav-btn:hover rpt-icon{color:var(--rpt-color-text, #0f172a)}.compact-nav-btn.active{background:var(--rpt-color-primary-light, #eff6ff);color:var(--rpt-color-primary, #2563eb);border-color:#2563eb40;font-weight:var(--rpt-font-weight-semibold, 600);box-shadow:0 1px 2px #2563eb14}.compact-nav-btn.active rpt-icon{color:var(--rpt-color-primary, #2563eb)}.compact-nav-btn:focus-visible{outline:2px solid var(--rpt-color-primary, #2563eb);outline-offset:1px}.workbench-drawer-backdrop{display:block;position:absolute;inset:0;background:#0f172a59;backdrop-filter:blur(1px);z-index:50}.workbench-left-container{position:absolute;left:0;top:0;bottom:0;width:280px;max-width:85vw;z-index:60;box-shadow:4px 0 24px #00000026;transform:translate(0);transition:transform .25s cubic-bezier(.16,1,.3,1)}.workbench-left-container.is-collapsed{transform:translate(-100%);width:280px!important}.workbench-right-container{position:absolute;right:0;top:0;bottom:0;width:320px;max-width:90vw;z-index:60;box-shadow:-4px 0 24px #00000026;transform:translate(0);transition:transform .25s cubic-bezier(.16,1,.3,1)}.workbench-right-container.is-collapsed{transform:translate(100%);width:320px!important}}.preview-mode-container{flex:1;overflow-y:auto;padding:16px;background-color:#f1f5f9;box-sizing:border-box}.preview-banner{max-width:1400px;margin:0 auto 16px;background:#eff6ff;color:#1e40af;border:1px solid #bfdbfe;padding:10px 18px;border-radius:var(--rpt-border-radius-lg, 8px);font-size:var(--rpt-font-size-sm, .8rem);font-weight:600;display:flex;align-items:center;gap:8px;box-shadow:var(--rpt-box-shadow-xs, 0 1px 2px rgba(0, 0, 0, .04));box-sizing:border-box}.preview-content{max-width:1400px;margin:0 auto;background:#fff;border-radius:var(--rpt-border-radius-lg, 8px);border:1px solid var(--rpt-color-border, #cbd5e1);box-shadow:0 4px 6px -1px #0000000d;padding:0;min-height:480px;box-sizing:border-box}.json-mode-container{flex:1;overflow-y:auto;padding:24px;background-color:#0f172a;display:flex;flex-direction:column}.json-banner{display:flex;align-items:center;justify-content:space-between;color:#94a3b8;font-size:.8rem;font-weight:600;margin-bottom:16px;padding-bottom:12px;border-bottom:1px solid #1e293b}.btn-copy-json{background:#ffffff1a;color:#fff;border:1px solid rgba(255,255,255,.2);border-radius:4px;padding:4px 12px;font-size:.75rem;cursor:pointer;transition:all .15s ease}.btn-copy-json:hover{background:#fff3}.json-display{flex:1;margin:0;padding:20px;background:#090d16;border-radius:8px;border:1px solid #1e293b;color:#38bdf8;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:.85rem;line-height:1.5;overflow-x:auto}.save-toast{position:absolute;bottom:24px;right:24px;background:#10b981;color:#fff;padding:10px 20px;border-radius:6px;font-size:.85rem;font-weight:600;box-shadow:0 10px 15px -3px #0000001a;z-index:100;animation:rpt-fade-in .2s ease}@keyframes rpt-fade-in{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}\n"] }]
16386
+ }], ctorParameters: () => [], propDecorators: { onResize: [{
16387
+ type: HostListener,
16388
+ args: ['window:resize']
16389
+ }], onKeyDown: [{
16390
+ type: HostListener,
16391
+ args: ['window:keydown', ['$event']]
16392
+ }] } });
15635
16393
 
15636
16394
  /**
15637
16395
  * `<rpt-report-designer>` (and `<rpt-designer-view>`)
@@ -16202,7 +16960,7 @@ class RoutedReportRuntimeComponent {
16202
16960
  </div>
16203
16961
  }
16204
16962
  </div>
16205
- `, isInline: true, styles: [".rpt-routed-container{display:flex;flex-direction:column;gap:var(--rpt-space-md, 16px);width:100%;min-height:100%;box-sizing:border-box;padding:var(--rpt-space-md, 16px)}.rpt-routed-header{display:flex;justify-content:space-between;align-items:center;padding-bottom:var(--rpt-space-sm, 8px);border-bottom:1px solid var(--rpt-border-color, #e2e8f0)}.rpt-routed-title-row{display:flex;align-items:center;gap:12px}.rpt-routed-title{font-size:1.25rem;font-weight:700;color:var(--rpt-text-color, #0f172a);margin:0}.rpt-routed-version{font-size:.75rem;font-weight:600;padding:2px 8px;border-radius:9999px;background:var(--rpt-bg-subtle, #f1f5f9);color:var(--rpt-text-muted, #64748b)}.rpt-routed-loading,.rpt-routed-error{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;text-align:center;color:var(--rpt-text-muted, #64748b)}.rpt-error-card{background:var(--rpt-surface-bg, #ffffff);border:1px solid var(--rpt-border-color, #e2e8f0);border-radius:var(--rpt-radius-md, 8px);padding:32px 40px;box-shadow:var(--rpt-shadow-sm, 0 1px 3px rgba(0,0,0,.05))}.rpt-error-card h3{color:var(--rpt-error-color, #ef4444);margin-top:0}.rpt-spinner{width:36px;height:36px;border:3px solid var(--rpt-border-color, #e2e8f0);border-top-color:var(--rpt-primary, #2563eb);border-radius:50%;animation:rpt-spin .8s linear infinite;margin-bottom:12px}@keyframes rpt-spin{to{transform:rotate(360deg)}}.rpt-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:8px 14px;font-size:.875rem;font-weight:500;border-radius:var(--rpt-radius-md, 6px);cursor:pointer;border:1px solid transparent;transition:all .15s ease}.rpt-btn-sm{padding:5px 10px;font-size:.8125rem}.rpt-btn-primary{background:var(--rpt-primary, #2563eb);color:#fff}.rpt-btn-primary:hover{background:var(--rpt-primary-hover, #1d4ed8)}.rpt-btn-secondary{background:var(--rpt-surface-bg, #ffffff);color:var(--rpt-text-color, #1e293b);border-color:var(--rpt-border-color, #cbd5e1)}.rpt-btn-secondary:hover{background:var(--rpt-bg-subtle, #f8fafc)}.rpt-btn-ghost{background:transparent;color:var(--rpt-text-muted, #64748b)}.rpt-btn-ghost:hover{color:var(--rpt-text-color, #1e293b);background:var(--rpt-bg-subtle, #f1f5f9)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: RouterModule }, { kind: "component", type: ReportRuntimeComponent, selector: "rpt-report-runtime, rpt-runtime", inputs: ["reportId", "report"], outputs: ["resetRequested", "exportRequested", "printRequested", "customActionTriggered", "gridStateChange", "columnDefsChange", "rowActionTriggered", "drilldownRequested"] }, { kind: "component", type: RptIconComponent, selector: "rpt-icon", inputs: ["name", "size", "color", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
16963
+ `, isInline: true, styles: [".rpt-routed-container{display:flex;flex-direction:column;gap:var(--rpt-space-md, 16px);width:100%;min-height:100%;box-sizing:border-box;padding:var(--rpt-space-md, 16px)}.rpt-routed-header{display:flex;justify-content:space-between;align-items:center;padding-bottom:var(--rpt-space-sm, 8px);border-bottom:1px solid var(--rpt-border-color, #e2e8f0)}.rpt-routed-title-row{display:flex;align-items:center;gap:12px}.rpt-routed-title{font-size:1.25rem;font-weight:700;color:var(--rpt-text-color, #0f172a);margin:0}.rpt-routed-version{font-size:.75rem;font-weight:600;padding:2px 8px;border-radius:9999px;background:var(--rpt-bg-subtle, #f1f5f9);color:var(--rpt-text-muted, #64748b)}.rpt-routed-loading,.rpt-routed-error{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;text-align:center;color:var(--rpt-text-muted, #64748b)}.rpt-error-card{background:var(--rpt-surface-bg, #ffffff);border:1px solid var(--rpt-border-color, #e2e8f0);border-radius:var(--rpt-radius-md, 8px);padding:32px 40px;box-shadow:var(--rpt-shadow-sm, 0 1px 3px rgba(0,0,0,.05))}.rpt-error-card h3{color:var(--rpt-error-color, #ef4444);margin-top:0}.rpt-spinner{width:36px;height:36px;border:3px solid var(--rpt-border-color, #e2e8f0);border-top-color:var(--rpt-primary, #2563eb);border-radius:50%;animation:rpt-spin .8s linear infinite;margin-bottom:12px}@keyframes rpt-spin{to{transform:rotate(360deg)}}.rpt-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:8px 14px;font-size:.875rem;font-weight:500;border-radius:var(--rpt-radius-md, 6px);cursor:pointer;border:1px solid transparent;transition:all .15s ease}.rpt-btn-sm{padding:5px 10px;font-size:.8125rem}.rpt-btn-primary{background:var(--rpt-primary, #2563eb);color:#fff}.rpt-btn-primary:hover{background:var(--rpt-primary-hover, #1d4ed8)}.rpt-btn-secondary{background:var(--rpt-surface-bg, #ffffff);color:var(--rpt-text-color, #1e293b);border-color:var(--rpt-border-color, #cbd5e1)}.rpt-btn-secondary:hover{background:var(--rpt-bg-subtle, #f8fafc)}.rpt-btn-ghost{background:transparent;color:var(--rpt-text-muted, #64748b)}.rpt-btn-ghost:hover{color:var(--rpt-text-color, #1e293b);background:var(--rpt-bg-subtle, #f1f5f9)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: RouterModule }, { kind: "component", type: ReportRuntimeComponent, selector: "rpt-report-runtime, rpt-runtime", inputs: ["reportId", "report"], outputs: ["resetRequested", "exportRequested", "printRequested", "customActionTriggered", "gridStateChange", "columnDefsChange", "selectionChange", "selectionChanged", "rowActionTriggered", "drilldownRequested"] }, { kind: "component", type: RptIconComponent, selector: "rpt-icon", inputs: ["name", "size", "color", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
16206
16964
  }
16207
16965
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RoutedReportRuntimeComponent, decorators: [{
16208
16966
  type: Component,