@memberjunction/ng-file-storage 6.1.0-edge.5 → 6.1.0-edge.7

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.
@@ -897,7 +897,7 @@ export class StorageAdminDialogComponent {
897
897
  i0.ɵɵconditional(ctx.IsEditingAccount ? 20 : -1);
898
898
  i0.ɵɵadvance();
899
899
  i0.ɵɵconditional(ctx.AccountToDelete ? 21 : -1);
900
- } }, dependencies: [i1.NgSelectOption, i1.ɵNgSelectMultipleOption, i1.DefaultValueAccessor, i1.CheckboxControlValueAccessor, i1.SelectControlValueAccessor, i1.NgControlStatus, i1.NgModel, i2.LoadingComponent, i3.MJDialogComponent, i3.MJDialogActionsComponent, i3.MJEmptyStateComponent], styles: ["[_nghost-%COMP%] {\n display: block;\n}\n\n.mj-storage-admin-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 16px;\n min-height: 460px;\n color: var(--mj-text-primary);\n}\n\n\n\n.mj-storage-admin-tabs[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n border-bottom: 1px solid var(--mj-border-default);\n padding-bottom: 8px;\n}\n\n.mj-tab-btn[_ngcontent-%COMP%] {\n background: transparent;\n border: none;\n border-radius: var(--mj-radius-md, 8px);\n padding: 8px 14px;\n font-size: 0.86rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n gap: 8px;\n transition: all 0.15s ease;\n}\n\n.mj-tab-btn[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-text-primary) 6%, var(--mj-bg-surface));\n color: var(--mj-text-primary);\n}\n\n.mj-tab-btn.active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.mj-tab-count[_ngcontent-%COMP%] {\n font-size: 0.72rem;\n font-weight: 600;\n padding: 2px 7px;\n border-radius: var(--mj-radius-full, 9999px);\n background: color-mix(in srgb, var(--mj-text-primary) 8%, var(--mj-bg-surface));\n color: var(--mj-text-secondary);\n}\n\n.mj-tab-btn.active[_ngcontent-%COMP%] .mj-tab-count[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse, #ffffff);\n}\n\n\n\n.mj-tab-pane[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 14px;\n}\n\n.mj-admin-pane-desc[_ngcontent-%COMP%] {\n font-size: 0.82rem;\n color: var(--mj-text-secondary);\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n border-radius: var(--mj-radius-md, 8px);\n background: var(--mj-bg-surface-sunken, color-mix(in srgb, var(--mj-text-primary) 3%, var(--mj-bg-surface)));\n border: 1px solid var(--mj-border-default);\n}\n\n.mj-admin-pane-toolbar[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n}\n\n.mj-admin-search-wrapper[_ngcontent-%COMP%] {\n position: relative;\n flex: 1;\n max-width: 440px;\n display: flex;\n align-items: center;\n}\n\n.mj-admin-search-wrapper[_ngcontent-%COMP%] > i[_ngcontent-%COMP%] {\n position: absolute;\n left: 10px;\n font-size: 0.8rem;\n color: var(--mj-text-muted);\n}\n\n.mj-admin-search-wrapper[_ngcontent-%COMP%] input[_ngcontent-%COMP%] {\n width: 100%;\n padding: 7px 32px 7px 32px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-sm, 6px);\n background: var(--mj-bg-surface-sunken, color-mix(in srgb, var(--mj-text-primary) 3%, var(--mj-bg-surface)));\n color: var(--mj-text-primary);\n font-size: 0.82rem;\n outline: none;\n transition: all 0.12s ease;\n}\n\n.mj-admin-search-wrapper[_ngcontent-%COMP%] input[_ngcontent-%COMP%]:focus {\n border-color: var(--mj-brand-primary);\n background: var(--mj-bg-surface);\n}\n\n.mj-clear-btn[_ngcontent-%COMP%] {\n position: absolute;\n right: 8px;\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n padding: 2px;\n}\n\n.mj-admin-loading[_ngcontent-%COMP%] {\n padding: 40px;\n display: flex;\n justify-content: center;\n}\n\n.mj-empty-cta[_ngcontent-%COMP%] {\n margin-top: 14px;\n}\n\n\n\n.mj-admin-table-container[_ngcontent-%COMP%] {\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md, 8px);\n overflow: hidden;\n background: var(--mj-bg-surface);\n}\n\n.mj-admin-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n font-size: 0.82rem;\n text-align: left;\n}\n\n.mj-admin-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n padding: 10px 14px;\n background: var(--mj-bg-surface-sunken, color-mix(in srgb, var(--mj-text-primary) 3%, var(--mj-bg-surface)));\n color: var(--mj-text-secondary);\n font-weight: 600;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.mj-admin-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 10px 14px;\n border-bottom: 1px solid var(--mj-border-default);\n vertical-align: middle;\n}\n\n.mj-admin-table[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:last-child td[_ngcontent-%COMP%] {\n border-bottom: none;\n}\n\n.mj-admin-table[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover td[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-text-primary) 2%, var(--mj-bg-surface));\n}\n\n.mj-row-inactive[_ngcontent-%COMP%] {\n opacity: 0.6;\n}\n\n\n\n.mj-account-name-cell[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.mj-account-title[_ngcontent-%COMP%] {\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.mj-account-desc[_ngcontent-%COMP%] {\n font-size: 0.74rem;\n color: var(--mj-text-muted);\n}\n\n.mj-provider-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 3px 8px;\n border-radius: 4px;\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-weight: 500;\n}\n\n.mj-provider-cell[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.mj-provider-icon-circle[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n border-radius: 50%;\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 1rem;\n flex-shrink: 0;\n}\n\n.mj-provider-name[_ngcontent-%COMP%] {\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.mj-provider-desc[_ngcontent-%COMP%] {\n font-size: 0.74rem;\n color: var(--mj-text-muted);\n}\n\n.mj-status-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 3px 8px;\n border-radius: var(--mj-radius-full, 9999px);\n font-size: 0.72rem;\n font-weight: 600;\n}\n\n.mj-status-badge--success[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success, #10b981) 14%, var(--mj-bg-surface));\n color: var(--mj-status-success, #10b981);\n}\n\n.mj-status-badge--warning[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning, #f59e0b) 14%, var(--mj-bg-surface));\n color: var(--mj-status-warning, #f59e0b);\n}\n\n.mj-status-badge--info[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.mj-status-badge--muted[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-text-primary) 8%, var(--mj-bg-surface));\n color: var(--mj-text-muted);\n}\n\n.mj-role-count-badge[_ngcontent-%COMP%] {\n font-size: 0.74rem;\n color: var(--mj-text-secondary);\n display: inline-flex;\n align-items: center;\n gap: 5px;\n}\n\n.mj-code-pill[_ngcontent-%COMP%] {\n font-family: var(--mj-font-mono, monospace);\n font-size: 0.74rem;\n background: var(--mj-bg-surface-sunken, color-mix(in srgb, var(--mj-text-primary) 5%, var(--mj-bg-surface)));\n border: 1px solid var(--mj-border-default);\n padding: 2px 6px;\n border-radius: 4px;\n color: var(--mj-text-secondary);\n}\n\n.mj-priority-pill[_ngcontent-%COMP%] {\n font-size: 0.74rem;\n font-weight: 600;\n padding: 2px 8px;\n border-radius: 4px;\n background: color-mix(in srgb, var(--mj-text-primary) 6%, var(--mj-bg-surface));\n color: var(--mj-text-secondary);\n}\n\n.mj-action-button-group[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n}\n\n.mj-action-icon-btn[_ngcontent-%COMP%] {\n background: transparent;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-sm, 6px);\n width: 28px;\n height: 28px;\n font-size: 0.78rem;\n color: var(--mj-text-secondary);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.12s;\n}\n\n.mj-action-icon-btn[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-text-primary) 8%, var(--mj-bg-surface));\n color: var(--mj-text-primary);\n border-color: var(--mj-brand-primary);\n}\n\n.mj-action-icon-btn--danger[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-status-error, #ef4444) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error, #ef4444);\n border-color: var(--mj-status-error, #ef4444);\n}\n\n.mj-text-right[_ngcontent-%COMP%] {\n text-align: right;\n}\n\n.mj-text-center[_ngcontent-%COMP%] {\n text-align: center;\n}\n\n\n\n.mj-toggle-switch[_ngcontent-%COMP%] {\n position: relative;\n display: inline-block;\n width: 36px;\n height: 20px;\n cursor: pointer;\n}\n\n.mj-toggle-switch[_ngcontent-%COMP%] input[_ngcontent-%COMP%] {\n opacity: 0;\n width: 0;\n height: 0;\n}\n\n.mj-toggle-slider[_ngcontent-%COMP%] {\n position: absolute;\n inset: 0;\n background-color: color-mix(in srgb, var(--mj-text-primary) 20%, var(--mj-bg-surface));\n border-radius: 20px;\n transition: 0.2s ease;\n}\n\n.mj-toggle-slider[_ngcontent-%COMP%]:before {\n position: absolute;\n content: \"\";\n height: 14px;\n width: 14px;\n left: 3px;\n bottom: 3px;\n background-color: var(--mj-bg-surface);\n border-radius: 50%;\n transition: 0.2s ease;\n}\n\n.mj-toggle-switch[_ngcontent-%COMP%] input[_ngcontent-%COMP%]:checked + .mj-toggle-slider[_ngcontent-%COMP%] {\n background-color: var(--mj-brand-primary);\n}\n\n.mj-toggle-switch[_ngcontent-%COMP%] input[_ngcontent-%COMP%]:checked + .mj-toggle-slider[_ngcontent-%COMP%]:before {\n transform: translateX(16px);\n}\n\n\n\n.mj-account-editor-form[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 14px;\n padding: 4px 0;\n}\n\n.mj-form-group[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 5px;\n}\n\n.mj-form-label-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n.mj-form-label[_ngcontent-%COMP%] {\n font-size: 0.8rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n\n.mj-required[_ngcontent-%COMP%] {\n color: var(--mj-status-error, #ef4444);\n}\n\n.mj-form-input[_ngcontent-%COMP%], .mj-form-select[_ngcontent-%COMP%], .mj-form-textarea[_ngcontent-%COMP%] {\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-sm, 6px);\n padding: 8px 10px;\n font-size: 0.84rem;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n outline: none;\n font-family: inherit;\n transition: border-color 0.12s;\n}\n\n.mj-form-input[_ngcontent-%COMP%]:focus, .mj-form-select[_ngcontent-%COMP%]:focus, .mj-form-textarea[_ngcontent-%COMP%]:focus {\n border-color: var(--mj-brand-primary);\n}\n\n.mj-form-hint[_ngcontent-%COMP%] {\n font-size: 0.72rem;\n color: var(--mj-text-muted);\n}\n\n.mj-credential-input-row[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.mj-credential-input-row[_ngcontent-%COMP%] .mj-form-select[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.mj-form-checkbox-group[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n padding: 6px 0;\n}\n\n.mj-checkbox-label[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n font-size: 0.82rem;\n font-weight: 500;\n cursor: pointer;\n}\n\n.mj-checkbox-hint[_ngcontent-%COMP%] {\n margin-left: 22px;\n}\n\n.mj-roles-checklist[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));\n gap: 8px;\n max-height: 140px;\n overflow-y: auto;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-sm, 6px);\n padding: 10px;\n background: var(--mj-bg-surface-sunken, color-mix(in srgb, var(--mj-text-primary) 3%, var(--mj-bg-surface)));\n}\n\n.mj-role-check-item[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-size: 0.78rem;\n color: var(--mj-text-primary);\n cursor: pointer;\n}\n\n\n\n.mj-delete-confirm-body[_ngcontent-%COMP%] {\n display: flex;\n gap: 16px;\n padding: 10px 0;\n}\n\n.mj-delete-confirm-icon[_ngcontent-%COMP%] {\n font-size: 2.2rem;\n color: var(--mj-status-error, #ef4444);\n flex-shrink: 0;\n}\n\n.mj-delete-confirm-title[_ngcontent-%COMP%] {\n font-size: 0.92rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin: 0 0 6px 0;\n}\n\n.mj-delete-confirm-subtitle[_ngcontent-%COMP%] {\n font-size: 0.8rem;\n color: var(--mj-text-secondary);\n line-height: 1.4;\n margin: 0;\n}\n\n\n\n.mj-admin-btn[_ngcontent-%COMP%] {\n padding: 7px 14px;\n border-radius: var(--mj-radius-sm, 6px);\n font-size: 0.82rem;\n font-weight: 500;\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n border: 1px solid transparent;\n transition: all 0.12s;\n}\n\n.mj-admin-btn-primary[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse, #ffffff);\n}\n\n.mj-admin-btn-primary[_ngcontent-%COMP%]:hover {\n background: var(--mj-brand-primary-hover);\n}\n\n.mj-admin-btn-secondary[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border-color: var(--mj-border-default);\n color: var(--mj-text-secondary);\n}\n\n.mj-admin-btn-secondary[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-text-primary) 8%, var(--mj-bg-surface));\n color: var(--mj-text-primary);\n}\n\n.mj-admin-btn-danger[_ngcontent-%COMP%] {\n background: var(--mj-status-error, #ef4444);\n color: var(--mj-text-inverse, #ffffff);\n}\n\n.mj-admin-btn-danger[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-text-primary, #000000) 15%, var(--mj-status-error, #ef4444));\n}\n\n.mj-admin-btn-link[_ngcontent-%COMP%] {\n background: none;\n border: none;\n color: var(--mj-brand-primary);\n font-size: 0.78rem;\n font-weight: 600;\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 0;\n}\n\n.mj-admin-btn-link[_ngcontent-%COMP%]:hover {\n text-decoration: underline;\n}"] });
900
+ } }, dependencies: [i1.NgSelectOption, i1.ɵNgSelectMultipleOption, i1.DefaultValueAccessor, i1.CheckboxControlValueAccessor, i1.SelectControlValueAccessor, i1.NgControlStatus, i1.NgModel, i2.LoadingComponent, i3.MJDialogComponent, i3.MJDialogActionsComponent, i3.MJEmptyStateComponent], styles: ["[_nghost-%COMP%] {\n display: block;\n}\n\n.mj-storage-admin-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 16px;\n min-height: 460px;\n color: var(--mj-text-primary);\n}\n\n\n.mj-storage-admin-tabs[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n border-bottom: 1px solid var(--mj-border-default);\n padding-bottom: 8px;\n}\n\n.mj-tab-btn[_ngcontent-%COMP%] {\n background: transparent;\n border: none;\n border-radius: var(--mj-radius-md, 8px);\n padding: 8px 14px;\n font-size: 0.86rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n gap: 8px;\n transition: all 0.15s ease;\n}\n\n.mj-tab-btn[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-text-primary) 6%, var(--mj-bg-surface));\n color: var(--mj-text-primary);\n}\n\n.mj-tab-btn.active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.mj-tab-count[_ngcontent-%COMP%] {\n font-size: 0.72rem;\n font-weight: 600;\n padding: 2px 7px;\n border-radius: var(--mj-radius-full, 9999px);\n background: color-mix(in srgb, var(--mj-text-primary) 8%, var(--mj-bg-surface));\n color: var(--mj-text-secondary);\n}\n\n.mj-tab-btn.active[_ngcontent-%COMP%] .mj-tab-count[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse, #ffffff);\n}\n\n\n.mj-tab-pane[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 14px;\n}\n\n.mj-admin-pane-desc[_ngcontent-%COMP%] {\n font-size: 0.82rem;\n color: var(--mj-text-secondary);\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n border-radius: var(--mj-radius-md, 8px);\n background: var(--mj-bg-surface-sunken, color-mix(in srgb, var(--mj-text-primary) 3%, var(--mj-bg-surface)));\n border: 1px solid var(--mj-border-default);\n}\n\n.mj-admin-pane-toolbar[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n}\n\n.mj-admin-search-wrapper[_ngcontent-%COMP%] {\n position: relative;\n flex: 1;\n max-width: 440px;\n display: flex;\n align-items: center;\n}\n\n.mj-admin-search-wrapper[_ngcontent-%COMP%] > i[_ngcontent-%COMP%] {\n position: absolute;\n left: 10px;\n font-size: 0.8rem;\n color: var(--mj-text-muted);\n}\n\n.mj-admin-search-wrapper[_ngcontent-%COMP%] input[_ngcontent-%COMP%] {\n width: 100%;\n padding: 7px 32px 7px 32px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-sm, 6px);\n background: var(--mj-bg-surface-sunken, color-mix(in srgb, var(--mj-text-primary) 3%, var(--mj-bg-surface)));\n color: var(--mj-text-primary);\n font-size: 0.82rem;\n outline: none;\n transition: all 0.12s ease;\n}\n\n.mj-admin-search-wrapper[_ngcontent-%COMP%] input[_ngcontent-%COMP%]:focus {\n border-color: var(--mj-brand-primary);\n background: var(--mj-bg-surface);\n}\n\n.mj-clear-btn[_ngcontent-%COMP%] {\n position: absolute;\n right: 8px;\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n padding: 2px;\n}\n\n.mj-admin-loading[_ngcontent-%COMP%] {\n padding: 40px;\n display: flex;\n justify-content: center;\n}\n\n.mj-empty-cta[_ngcontent-%COMP%] {\n margin-top: 14px;\n}\n\n\n.mj-admin-table-container[_ngcontent-%COMP%] {\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md, 8px);\n overflow: hidden;\n background: var(--mj-bg-surface);\n}\n\n.mj-admin-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n font-size: 0.82rem;\n text-align: left;\n}\n\n.mj-admin-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n padding: 10px 14px;\n background: var(--mj-bg-surface-sunken, color-mix(in srgb, var(--mj-text-primary) 3%, var(--mj-bg-surface)));\n color: var(--mj-text-secondary);\n font-weight: 600;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.mj-admin-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 10px 14px;\n border-bottom: 1px solid var(--mj-border-default);\n vertical-align: middle;\n}\n\n.mj-admin-table[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:last-child td[_ngcontent-%COMP%] {\n border-bottom: none;\n}\n\n.mj-admin-table[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover td[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-text-primary) 2%, var(--mj-bg-surface));\n}\n\n.mj-row-inactive[_ngcontent-%COMP%] {\n opacity: 0.6;\n}\n\n\n.mj-account-name-cell[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.mj-account-title[_ngcontent-%COMP%] {\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.mj-account-desc[_ngcontent-%COMP%] {\n font-size: 0.74rem;\n color: var(--mj-text-muted);\n}\n\n.mj-provider-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 3px 8px;\n border-radius: 4px;\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-weight: 500;\n}\n\n.mj-provider-cell[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.mj-provider-icon-circle[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n border-radius: 50%;\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 1rem;\n flex-shrink: 0;\n}\n\n.mj-provider-name[_ngcontent-%COMP%] {\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.mj-provider-desc[_ngcontent-%COMP%] {\n font-size: 0.74rem;\n color: var(--mj-text-muted);\n}\n\n.mj-status-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 3px 8px;\n border-radius: var(--mj-radius-full, 9999px);\n font-size: 0.72rem;\n font-weight: 600;\n}\n\n.mj-status-badge--success[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success, #10b981) 14%, var(--mj-bg-surface));\n color: var(--mj-status-success, #10b981);\n}\n\n.mj-status-badge--warning[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning, #f59e0b) 14%, var(--mj-bg-surface));\n color: var(--mj-status-warning, #f59e0b);\n}\n\n.mj-status-badge--info[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.mj-status-badge--muted[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-text-primary) 8%, var(--mj-bg-surface));\n color: var(--mj-text-muted);\n}\n\n.mj-role-count-badge[_ngcontent-%COMP%] {\n font-size: 0.74rem;\n color: var(--mj-text-secondary);\n display: inline-flex;\n align-items: center;\n gap: 5px;\n}\n\n.mj-code-pill[_ngcontent-%COMP%] {\n font-family: var(--mj-font-mono, monospace);\n font-size: 0.74rem;\n background: var(--mj-bg-surface-sunken, color-mix(in srgb, var(--mj-text-primary) 5%, var(--mj-bg-surface)));\n border: 1px solid var(--mj-border-default);\n padding: 2px 6px;\n border-radius: 4px;\n color: var(--mj-text-secondary);\n}\n\n.mj-priority-pill[_ngcontent-%COMP%] {\n font-size: 0.74rem;\n font-weight: 600;\n padding: 2px 8px;\n border-radius: 4px;\n background: color-mix(in srgb, var(--mj-text-primary) 6%, var(--mj-bg-surface));\n color: var(--mj-text-secondary);\n}\n\n.mj-action-button-group[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n}\n\n.mj-action-icon-btn[_ngcontent-%COMP%] {\n background: transparent;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-sm, 6px);\n width: 28px;\n height: 28px;\n font-size: 0.78rem;\n color: var(--mj-text-secondary);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.12s;\n}\n\n.mj-action-icon-btn[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-text-primary) 8%, var(--mj-bg-surface));\n color: var(--mj-text-primary);\n border-color: var(--mj-brand-primary);\n}\n\n.mj-action-icon-btn--danger[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-status-error, #ef4444) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error, #ef4444);\n border-color: var(--mj-status-error, #ef4444);\n}\n\n.mj-text-right[_ngcontent-%COMP%] {\n text-align: right;\n}\n\n.mj-text-center[_ngcontent-%COMP%] {\n text-align: center;\n}\n\n\n.mj-toggle-switch[_ngcontent-%COMP%] {\n position: relative;\n display: inline-block;\n width: 36px;\n height: 20px;\n cursor: pointer;\n}\n\n.mj-toggle-switch[_ngcontent-%COMP%] input[_ngcontent-%COMP%] {\n opacity: 0;\n width: 0;\n height: 0;\n}\n\n.mj-toggle-slider[_ngcontent-%COMP%] {\n position: absolute;\n inset: 0;\n background-color: color-mix(in srgb, var(--mj-text-primary) 20%, var(--mj-bg-surface));\n border-radius: 20px;\n transition: 0.2s ease;\n}\n\n.mj-toggle-slider[_ngcontent-%COMP%]:before {\n position: absolute;\n content: \"\";\n height: 14px;\n width: 14px;\n left: 3px;\n bottom: 3px;\n background-color: var(--mj-bg-surface);\n border-radius: 50%;\n transition: 0.2s ease;\n}\n\n.mj-toggle-switch[_ngcontent-%COMP%] input[_ngcontent-%COMP%]:checked + .mj-toggle-slider[_ngcontent-%COMP%] {\n background-color: var(--mj-brand-primary);\n}\n\n.mj-toggle-switch[_ngcontent-%COMP%] input[_ngcontent-%COMP%]:checked + .mj-toggle-slider[_ngcontent-%COMP%]:before {\n transform: translateX(16px);\n}\n\n\n.mj-account-editor-form[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 14px;\n padding: 4px 0;\n}\n\n.mj-form-group[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 5px;\n}\n\n.mj-form-label-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n.mj-form-label[_ngcontent-%COMP%] {\n font-size: 0.8rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n\n.mj-required[_ngcontent-%COMP%] {\n color: var(--mj-status-error, #ef4444);\n}\n\n.mj-form-input[_ngcontent-%COMP%], .mj-form-select[_ngcontent-%COMP%], .mj-form-textarea[_ngcontent-%COMP%] {\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-sm, 6px);\n padding: 8px 10px;\n font-size: 0.84rem;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n outline: none;\n font-family: inherit;\n transition: border-color 0.12s;\n}\n\n.mj-form-input[_ngcontent-%COMP%]:focus, .mj-form-select[_ngcontent-%COMP%]:focus, .mj-form-textarea[_ngcontent-%COMP%]:focus {\n border-color: var(--mj-brand-primary);\n}\n\n.mj-form-hint[_ngcontent-%COMP%] {\n font-size: 0.72rem;\n color: var(--mj-text-muted);\n}\n\n.mj-credential-input-row[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.mj-credential-input-row[_ngcontent-%COMP%] .mj-form-select[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.mj-form-checkbox-group[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n padding: 6px 0;\n}\n\n.mj-checkbox-label[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n font-size: 0.82rem;\n font-weight: 500;\n cursor: pointer;\n}\n\n.mj-checkbox-hint[_ngcontent-%COMP%] {\n margin-left: 22px;\n}\n\n.mj-roles-checklist[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));\n gap: 8px;\n max-height: 140px;\n overflow-y: auto;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-sm, 6px);\n padding: 10px;\n background: var(--mj-bg-surface-sunken, color-mix(in srgb, var(--mj-text-primary) 3%, var(--mj-bg-surface)));\n}\n\n.mj-role-check-item[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-size: 0.78rem;\n color: var(--mj-text-primary);\n cursor: pointer;\n}\n\n\n.mj-delete-confirm-body[_ngcontent-%COMP%] {\n display: flex;\n gap: 16px;\n padding: 10px 0;\n}\n\n.mj-delete-confirm-icon[_ngcontent-%COMP%] {\n font-size: 2.2rem;\n color: var(--mj-status-error, #ef4444);\n flex-shrink: 0;\n}\n\n.mj-delete-confirm-title[_ngcontent-%COMP%] {\n font-size: 0.92rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin: 0 0 6px 0;\n}\n\n.mj-delete-confirm-subtitle[_ngcontent-%COMP%] {\n font-size: 0.8rem;\n color: var(--mj-text-secondary);\n line-height: 1.4;\n margin: 0;\n}\n\n\n.mj-admin-btn[_ngcontent-%COMP%] {\n padding: 7px 14px;\n border-radius: var(--mj-radius-sm, 6px);\n font-size: 0.82rem;\n font-weight: 500;\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n border: 1px solid transparent;\n transition: all 0.12s;\n}\n\n.mj-admin-btn-primary[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse, #ffffff);\n}\n\n.mj-admin-btn-primary[_ngcontent-%COMP%]:hover {\n background: var(--mj-brand-primary-hover);\n}\n\n.mj-admin-btn-secondary[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border-color: var(--mj-border-default);\n color: var(--mj-text-secondary);\n}\n\n.mj-admin-btn-secondary[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-text-primary) 8%, var(--mj-bg-surface));\n color: var(--mj-text-primary);\n}\n\n.mj-admin-btn-danger[_ngcontent-%COMP%] {\n background: var(--mj-status-error, #ef4444);\n color: var(--mj-text-inverse, #ffffff);\n}\n\n.mj-admin-btn-danger[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-text-primary, #000000) 15%, var(--mj-status-error, #ef4444));\n}\n\n.mj-admin-btn-link[_ngcontent-%COMP%] {\n background: none;\n border: none;\n color: var(--mj-brand-primary);\n font-size: 0.78rem;\n font-weight: 600;\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 0;\n}\n\n.mj-admin-btn-link[_ngcontent-%COMP%]:hover {\n text-decoration: underline;\n}"] });
901
901
  }
902
902
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(StorageAdminDialogComponent, [{
903
903
  type: Component,
@@ -281,11 +281,11 @@ export class CategoryTreeComponent extends BaseAngularComponent {
281
281
  static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: CategoryTreeComponent, selectors: [["mj-files-category-tree"]], outputs: { categorySelected: "categorySelected" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 26, vars: 9, consts: [["treeNode", ""], ["newForm", "ngForm"], ["renameForm", "ngForm"], [1, "container"], [1, "tree-header"], ["mjButton", "", 3, "click"], ["mjButton", "", "variant", "primary", "size", "sm", 3, "click"], [1, "category-tree"], [1, "context-menu", 3, "top", "left"], ["Title", "New file category", 3, "Close", "Visible", "Width", "MinWidth"], [1, "dialog-form-container"], [1, "mj-form-field"], [1, "mj-form-label"], ["name", "name", "required", "", 1, "mj-input", 3, "ngModelChange", "ngModel", "disabled"], ["mjButton", "", "variant", "primary", 3, "click", "disabled"], ["mjButton", "", 3, "click", "disabled"], ["Title", "Rename file category", 3, "Visible", "Width", "MinWidth"], [4, "ngTemplateOutlet", "ngTemplateOutletContext"], [1, "tree-node"], [1, "tree-node-row", 3, "click", "contextmenu"], [1, "tree-expand-btn"], [1, "tree-expand-placeholder"], [1, "fa-solid", "fa-folder", "tree-folder-icon"], [1, "tree-node-label"], [1, "tree-expand-btn", 3, "click"], [1, "fa-solid"], [1, "context-menu", 3, "click"], [1, "context-menu-item", 3, "click"], [1, "fa-solid", "fa-pen"], ["disabled", "", 1, "context-menu-item", 3, "click"], [1, "fa-solid", "fa-trash-can"], ["Title", "Rename file category", 3, "Close", "Visible", "Width", "MinWidth"], ["name", "Name", "required", "", 1, "mj-input", 3, "ngModelChange", "ngModel", "disabled"]], template: function CategoryTreeComponent_Template(rf, ctx) { if (rf & 1) {
282
282
  const _r1 = i0.ɵɵgetCurrentView();
283
283
  i0.ɵɵelementStart(0, "div", 3)(1, "div", 4)(2, "button", 5);
284
- i0.ɵɵlistener("click", function CategoryTreeComponent_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.clearSelection()); });
284
+ i0.ɵɵlistener("click", function CategoryTreeComponent_Template_button_click_2_listener() { return ctx.clearSelection(); });
285
285
  i0.ɵɵtext(3, "All Files");
286
286
  i0.ɵɵelementEnd();
287
287
  i0.ɵɵelementStart(4, "button", 6);
288
- i0.ɵɵlistener("click", function CategoryTreeComponent_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.createNewCategory()); });
288
+ i0.ɵɵlistener("click", function CategoryTreeComponent_Template_button_click_4_listener() { return ctx.createNewCategory(); });
289
289
  i0.ɵɵtext(5, "Add category");
290
290
  i0.ɵɵelementEnd()();
291
291
  i0.ɵɵelementStart(6, "div", 7);
@@ -294,7 +294,7 @@ export class CategoryTreeComponent extends BaseAngularComponent {
294
294
  i0.ɵɵtemplate(9, CategoryTreeComponent_ng_template_9_Template, 8, 7, "ng-template", null, 0, i0.ɵɵtemplateRefExtractor);
295
295
  i0.ɵɵconditionalCreate(11, CategoryTreeComponent_Conditional_11_Template, 7, 4, "div", 8);
296
296
  i0.ɵɵelementStart(12, "mj-dialog", 9);
297
- i0.ɵɵlistener("Close", function CategoryTreeComponent_Template_mj_dialog_Close_12_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.cancelNewCategory()); });
297
+ i0.ɵɵlistener("Close", function CategoryTreeComponent_Template_mj_dialog_Close_12_listener() { return ctx.cancelNewCategory(); });
298
298
  i0.ɵɵelementStart(13, "div", 10)(14, "form", null, 1)(16, "label", 11)(17, "span", 12);
299
299
  i0.ɵɵtext(18, "Name");
300
300
  i0.ɵɵelementEnd();
@@ -302,11 +302,11 @@ export class CategoryTreeComponent extends BaseAngularComponent {
302
302
  i0.ɵɵtwoWayListener("ngModelChange", function CategoryTreeComponent_Template_input_ngModelChange_19_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.newCategoryName, $event) || (ctx.newCategoryName = $event); return i0.ɵɵresetView($event); });
303
303
  i0.ɵɵelementEnd()()()();
304
304
  i0.ɵɵelementStart(20, "mj-dialog-actions")(21, "button", 14);
305
- i0.ɵɵlistener("click", function CategoryTreeComponent_Template_button_click_21_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.saveNewCategory()); });
305
+ i0.ɵɵlistener("click", function CategoryTreeComponent_Template_button_click_21_listener() { return ctx.saveNewCategory(); });
306
306
  i0.ɵɵtext(22, "Save");
307
307
  i0.ɵɵelementEnd();
308
308
  i0.ɵɵelementStart(23, "button", 15);
309
- i0.ɵɵlistener("click", function CategoryTreeComponent_Template_button_click_23_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.cancelNewCategory()); });
309
+ i0.ɵɵlistener("click", function CategoryTreeComponent_Template_button_click_23_listener() { return ctx.cancelNewCategory(); });
310
310
  i0.ɵɵtext(24, "Cancel");
311
311
  i0.ɵɵelementEnd()()();
312
312
  i0.ɵɵconditionalCreate(25, CategoryTreeComponent_Conditional_25_Template, 13, 7, "mj-dialog", 16);
@@ -327,7 +327,7 @@ export class CategoryTreeComponent extends BaseAngularComponent {
327
327
  i0.ɵɵproperty("disabled", ctx.isLoading);
328
328
  i0.ɵɵadvance(2);
329
329
  i0.ɵɵconditional(!!ctx.renameFileCategory ? 25 : -1);
330
- } }, dependencies: [i2.NgTemplateOutlet, i3.ɵNgNoValidate, i3.DefaultValueAccessor, i3.NgControlStatus, i3.NgControlStatusGroup, i3.RequiredValidator, i3.NgModel, i3.NgForm, i4.MJButtonDirective, i4.MJDialogComponent, i4.MJDialogActionsComponent], styles: ["\n\n.container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n}\n\n.category-tree[_ngcontent-%COMP%] {\n width: 250px;\n max-height: 500px;\n overflow-y: auto;\n border: 1px solid var(--mj-border-subtle);\n border-radius: 4px;\n background: var(--mj-bg-surface);\n}\n\n.tree-header[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n padding-right: 4px;\n margin-bottom: 4px;\n}\n\n.tree-node-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 4px 8px;\n cursor: pointer;\n border-radius: 4px;\n transition: background-color 0.15s;\n user-select: none;\n}\n\n.tree-node-row[_ngcontent-%COMP%]:hover {\n background-color: var(--mj-bg-surface-hover);\n}\n\n.tree-node-row.selected[_ngcontent-%COMP%] {\n background-color: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.tree-expand-btn[_ngcontent-%COMP%] {\n background: none;\n border: none;\n cursor: pointer;\n padding: 0;\n width: 16px;\n height: 16px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-muted);\n font-size: 10px;\n}\n\n.tree-expand-placeholder[_ngcontent-%COMP%] {\n width: 16px;\n height: 16px;\n display: inline-block;\n}\n\n.tree-folder-icon[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 14px;\n}\n\n.tree-node-label[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-primary);\n}\n\n\n\n.context-menu[_ngcontent-%COMP%] {\n position: fixed;\n z-index: 10000;\n background: var(--mj-bg-surface-elevated);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n box-shadow: 0 4px 12px var(--mj-bg-overlay);\n padding: 4px 0;\n min-width: 140px;\n}\n\n.context-menu-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 8px 16px;\n border: none;\n background: none;\n color: var(--mj-text-primary);\n font-size: 13px;\n cursor: pointer;\n text-align: left;\n}\n\n.context-menu-item[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-bg-surface-hover);\n}\n\n.context-menu-item[_ngcontent-%COMP%]:disabled {\n opacity: 0.4;\n cursor: default;\n}\n\n.dialog-form-container[_ngcontent-%COMP%] {\n padding: 8px 0;\n}\n\n.mj-form-field[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: row;\n align-items: center;\n column-gap: 12px;\n margin-bottom: 8px;\n}\n\n.mj-form-label[_ngcontent-%COMP%] {\n min-width: 80px;\n color: var(--mj-text-secondary);\n font-weight: 500;\n}\n\n.mj-form-field[_ngcontent-%COMP%] .mj-input[_ngcontent-%COMP%] {\n width: 100%;\n}"] });
330
+ } }, dependencies: [i2.NgTemplateOutlet, i3.ɵNgNoValidate, i3.DefaultValueAccessor, i3.NgControlStatus, i3.NgControlStatusGroup, i3.RequiredValidator, i3.NgModel, i3.NgForm, i4.MJButtonDirective, i4.MJDialogComponent, i4.MJDialogActionsComponent], styles: ["\n.container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n}\n\n.category-tree[_ngcontent-%COMP%] {\n width: 250px;\n max-height: 500px;\n overflow-y: auto;\n border: 1px solid var(--mj-border-subtle);\n border-radius: 4px;\n background: var(--mj-bg-surface);\n}\n\n.tree-header[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n padding-right: 4px;\n margin-bottom: 4px;\n}\n\n.tree-node-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 4px 8px;\n cursor: pointer;\n border-radius: 4px;\n transition: background-color 0.15s;\n user-select: none;\n}\n\n.tree-node-row[_ngcontent-%COMP%]:hover {\n background-color: var(--mj-bg-surface-hover);\n}\n\n.tree-node-row.selected[_ngcontent-%COMP%] {\n background-color: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.tree-expand-btn[_ngcontent-%COMP%] {\n background: none;\n border: none;\n cursor: pointer;\n padding: 0;\n width: 16px;\n height: 16px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-muted);\n font-size: 10px;\n}\n\n.tree-expand-placeholder[_ngcontent-%COMP%] {\n width: 16px;\n height: 16px;\n display: inline-block;\n}\n\n.tree-folder-icon[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 14px;\n}\n\n.tree-node-label[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-primary);\n}\n\n\n.context-menu[_ngcontent-%COMP%] {\n position: fixed;\n z-index: 10000;\n background: var(--mj-bg-surface-elevated);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n box-shadow: 0 4px 12px var(--mj-bg-overlay);\n padding: 4px 0;\n min-width: 140px;\n}\n\n.context-menu-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 8px 16px;\n border: none;\n background: none;\n color: var(--mj-text-primary);\n font-size: 13px;\n cursor: pointer;\n text-align: left;\n}\n\n.context-menu-item[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-bg-surface-hover);\n}\n\n.context-menu-item[_ngcontent-%COMP%]:disabled {\n opacity: 0.4;\n cursor: default;\n}\n\n.dialog-form-container[_ngcontent-%COMP%] {\n padding: 8px 0;\n}\n\n.mj-form-field[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: row;\n align-items: center;\n column-gap: 12px;\n margin-bottom: 8px;\n}\n\n.mj-form-label[_ngcontent-%COMP%] {\n min-width: 80px;\n color: var(--mj-text-secondary);\n font-weight: 500;\n}\n\n.mj-form-field[_ngcontent-%COMP%] .mj-input[_ngcontent-%COMP%] {\n width: 100%;\n}"] });
331
331
  }
332
332
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(CategoryTreeComponent, [{
333
333
  type: Component,
@@ -1 +1 @@
1
- {"version":3,"file":"category-tree.js","sourceRoot":"","sources":["../../../src/lib/category-tree/category-tree.ts","../../../src/lib/category-tree/category-tree.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, EventEmitter, OnInit, Output } from '@angular/core';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { RunView } from '@memberjunction/core';\nimport { MJFileCategoryEntity } from '@memberjunction/core-entities';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\n\n@Component({\n standalone: false,\n selector: 'mj-files-category-tree',\n templateUrl: './category-tree.html',\n styleUrls: ['./category-tree.css'],\n})\nexport class CategoryTreeComponent extends BaseAngularComponent implements OnInit {\n @Output() categorySelected = new EventEmitter<string | undefined>();\n\n public isLoading: boolean = false;\n public showNew: boolean = false;\n public newCategoryName = '';\n public renameFileCategory: MJFileCategoryEntity | undefined;\n\n public categoriesData: MJFileCategoryEntity[] = [];\n\n /** Expanded node IDs for the tree */\n public expandedIds = new Set<string>();\n\n /** Currently selected node ID */\n private selectedId: string | undefined;\n\n /** Context menu state */\n public contextMenuVisible = false;\n public contextMenuX = 0;\n public contextMenuY = 0;\n private contextMenuNode: MJFileCategoryEntity | undefined;\n\n private get md() { return this.ProviderToUse; }\n\n constructor(private notifications: MJNotificationService) { super(); }\n\n ngOnInit(): void {\n this.Refresh();\n }\n\n /** Returns root-level nodes (no parent). */\n get rootNodes(): MJFileCategoryEntity[] {\n return this.categoriesData.filter((c) => !c.ParentID);\n }\n\n /** Checks if a node has children. */\n hasChildren(node: MJFileCategoryEntity): boolean {\n return this.categoriesData.some((c) => UUIDsEqual(c.ParentID, node.ID));\n }\n\n /** Returns children of a node. */\n getChildren(node: MJFileCategoryEntity): MJFileCategoryEntity[] {\n return this.categoriesData.filter((c) => UUIDsEqual(c.ParentID, node.ID));\n }\n\n /** Checks if a node is expanded. */\n isExpanded(node: MJFileCategoryEntity): boolean {\n return this.expandedIds.has(node.ID);\n }\n\n /** Toggles expand/collapse on a node. */\n toggleExpand(node: MJFileCategoryEntity, event: Event): void {\n event.stopPropagation();\n if (this.expandedIds.has(node.ID)) {\n this.expandedIds.delete(node.ID);\n } else {\n this.expandedIds.add(node.ID);\n }\n }\n\n /** Checks if a node is the currently selected node. */\n isSelected(node: MJFileCategoryEntity): boolean {\n return this.selectedId != null && UUIDsEqual(this.selectedId, node.ID);\n }\n\n /** Selects a node and emits event. */\n selectNode(node: MJFileCategoryEntity): void {\n this.selectedId = node.ID;\n this.categorySelected.emit(node.ID);\n }\n\n /** Opens context menu on right-click. */\n onContextMenu(event: MouseEvent, node: MJFileCategoryEntity): void {\n event.preventDefault();\n event.stopPropagation();\n this.contextMenuNode = node;\n this.contextMenuX = event.clientX;\n this.contextMenuY = event.clientY;\n this.contextMenuVisible = true;\n }\n\n /** Closes the context menu. */\n closeContextMenu(): void {\n this.contextMenuVisible = false;\n this.contextMenuNode = undefined;\n }\n\n /** Handles context menu action selection. */\n onContextMenuAction(action: string): void {\n const node = this.contextMenuNode;\n this.closeContextMenu();\n if (!node) {\n return;\n }\n\n switch (action) {\n case 'rename':\n this.renameFileCategory = node;\n break;\n case 'delete':\n this.deleteCategory(node);\n break;\n }\n }\n\n async createNewCategory() {\n this.showNew = true;\n }\n\n cancelNewCategory() {\n this.showNew = false;\n }\n\n async saveNewCategory() {\n this.isLoading = true;\n const categoryEntity: MJFileCategoryEntity = await this.md.GetEntityObject('MJ: File Categories', this.md.CurrentUser);\n categoryEntity.NewRecord();\n categoryEntity.Name = this.newCategoryName;\n await categoryEntity?.Save();\n this.categoriesData = [...this.categoriesData, categoryEntity];\n this.showNew = false;\n this.newCategoryName = '';\n this.isLoading = false;\n }\n\n async deleteCategory(fileCategory: MJFileCategoryEntity) {\n this.isLoading = true;\n const { ID } = fileCategory;\n const success = await fileCategory.Delete();\n if (!success) {\n console.error('Unable to delete file category:', fileCategory);\n this.notifications.CreateSimpleNotification(`Unable to delete category '${fileCategory.Name}'`, 'error');\n this.isLoading = false;\n return;\n }\n\n this.categoriesData = this.categoriesData.filter((c) => !UUIDsEqual(c.ID, ID));\n this.clearSelection();\n this.isLoading = false;\n }\n\n clearSelection() {\n this.selectedId = undefined;\n this.categorySelected.emit(undefined);\n }\n\n cancelRename() {\n this.renameFileCategory?.Revert();\n this.renameFileCategory = undefined;\n }\n\n async saveRename() {\n this.isLoading = true;\n await this.renameFileCategory?.Save();\n this.renameFileCategory = undefined;\n this.isLoading = false;\n }\n\n async Refresh() {\n this.isLoading = true;\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView({\n EntityName: 'MJ: File Categories',\n ResultType: 'entity_object',\n });\n\n if (result.Success) {\n this.categoriesData = <MJFileCategoryEntity[]>result.Results;\n } else {\n throw new Error('Error loading file categories: ' + result.ErrorMessage);\n }\n this.isLoading = false;\n }\n}\n","<div class=\"container\">\n <div class=\"tree-header\">\n <button mjButton (click)=\"clearSelection()\">All Files</button>\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"createNewCategory()\">Add category</button>\n </div>\n\n <div class=\"category-tree\">\n @for (node of rootNodes; track node.ID) {\n <ng-container *ngTemplateOutlet=\"treeNode; context: { $implicit: node, level: 0 }\"></ng-container>\n }\n </div>\n\n <ng-template #treeNode let-node let-level=\"level\">\n <div class=\"tree-node\" [style.padding-left.px]=\"level * 20\">\n <div class=\"tree-node-row\"\n [class.selected]=\"isSelected(node)\"\n (click)=\"selectNode(node)\"\n (contextmenu)=\"onContextMenu($event, node)\">\n @if (hasChildren(node)) {\n <button class=\"tree-expand-btn\" (click)=\"toggleExpand(node, $event)\">\n <i class=\"fa-solid\" [class.fa-chevron-right]=\"!isExpanded(node)\" [class.fa-chevron-down]=\"isExpanded(node)\"></i>\n </button>\n } @else {\n <span class=\"tree-expand-placeholder\"></span>\n }\n <i class=\"fa-solid fa-folder tree-folder-icon\"></i>\n <span class=\"tree-node-label\">{{ node.Name }}</span>\n </div>\n @if (isExpanded(node)) {\n @for (child of getChildren(node); track child.ID) {\n <ng-container *ngTemplateOutlet=\"treeNode; context: { $implicit: child, level: level + 1 }\"></ng-container>\n }\n }\n </div>\n </ng-template>\n\n <!-- Context Menu -->\n @if (contextMenuVisible) {\n <div class=\"context-menu\"\n [style.top.px]=\"contextMenuY\"\n [style.left.px]=\"contextMenuX\"\n (document:click)=\"closeContextMenu()\">\n <button class=\"context-menu-item\" (click)=\"onContextMenuAction('rename')\">\n <i class=\"fa-solid fa-pen\"></i> Rename\n </button>\n <button class=\"context-menu-item\" (click)=\"onContextMenuAction('delete')\" disabled>\n <i class=\"fa-solid fa-trash-can\"></i> Delete\n </button>\n </div>\n }\n\n <mj-dialog\n [Visible]=\"showNew\"\n Title=\"New file category\"\n [Width]=\"450\"\n [MinWidth]=\"250\"\n (Close)=\"cancelNewCategory()\">\n <div class=\"dialog-form-container\">\n <form #newForm=\"ngForm\">\n <label class=\"mj-form-field\">\n <span class=\"mj-form-label\">Name</span>\n <input\n class=\"mj-input\"\n name=\"name\"\n [(ngModel)]=\"newCategoryName\"\n required\n [disabled]=\"isLoading\" />\n </label>\n </form>\n </div>\n <mj-dialog-actions>\n <button mjButton variant=\"primary\" (click)=\"saveNewCategory()\" [disabled]=\"isLoading\">Save</button>\n <button mjButton (click)=\"cancelNewCategory()\" [disabled]=\"isLoading\">Cancel</button>\n </mj-dialog-actions>\n </mj-dialog>\n\n @if (!!renameFileCategory) {\n <mj-dialog\n [Visible]=\"true\"\n Title=\"Rename file category\"\n [Width]=\"450\"\n [MinWidth]=\"250\"\n (Close)=\"cancelRename()\">\n <div class=\"dialog-form-container\">\n <form #renameForm=\"ngForm\">\n <label class=\"mj-form-field\">\n <span class=\"mj-form-label\">Name</span>\n <input\n class=\"mj-input\"\n name=\"Name\"\n [(ngModel)]=\"renameFileCategory.Name\"\n required\n [disabled]=\"isLoading\" />\n </label>\n </form>\n </div>\n <mj-dialog-actions>\n <button mjButton variant=\"primary\" (click)=\"saveRename()\" [disabled]=\"isLoading || !renameFileCategory.Dirty\">Save</button>\n <button mjButton (click)=\"cancelRename()\" [disabled]=\"isLoading\">Cancel</button>\n </mj-dialog-actions>\n </mj-dialog>\n }\n</div>\n"]}
1
+ {"version":3,"file":"category-tree.js","sourceRoot":"","sources":["../../../src/lib/category-tree/category-tree.ts","../../../src/lib/category-tree/category-tree.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, EventEmitter, OnInit, Output } from '@angular/core';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { RunView } from '@memberjunction/core';\nimport { MJFileCategoryEntity } from '@memberjunction/core-entities';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\n\n@Component({\n standalone: false,\n selector: 'mj-files-category-tree',\n templateUrl: './category-tree.html',\n styleUrls: ['./category-tree.css'],\n})\nexport class CategoryTreeComponent extends BaseAngularComponent implements OnInit {\n @Output() categorySelected = new EventEmitter<string | undefined>();\n\n public isLoading: boolean = false;\n public showNew: boolean = false;\n public newCategoryName = '';\n public renameFileCategory: MJFileCategoryEntity | undefined;\n\n public categoriesData: MJFileCategoryEntity[] = [];\n\n /** Expanded node IDs for the tree */\n public expandedIds = new Set<string>();\n\n /** Currently selected node ID */\n private selectedId: string | undefined;\n\n /** Context menu state */\n public contextMenuVisible = false;\n public contextMenuX = 0;\n public contextMenuY = 0;\n private contextMenuNode: MJFileCategoryEntity | undefined;\n\n private get md() { return this.ProviderToUse; }\n\n constructor(private notifications: MJNotificationService) { super(); }\n\n ngOnInit(): void {\n this.Refresh();\n }\n\n /** Returns root-level nodes (no parent). */\n get rootNodes(): MJFileCategoryEntity[] {\n return this.categoriesData.filter((c) => !c.ParentID);\n }\n\n /** Checks if a node has children. */\n hasChildren(node: MJFileCategoryEntity): boolean {\n return this.categoriesData.some((c) => UUIDsEqual(c.ParentID, node.ID));\n }\n\n /** Returns children of a node. */\n getChildren(node: MJFileCategoryEntity): MJFileCategoryEntity[] {\n return this.categoriesData.filter((c) => UUIDsEqual(c.ParentID, node.ID));\n }\n\n /** Checks if a node is expanded. */\n isExpanded(node: MJFileCategoryEntity): boolean {\n return this.expandedIds.has(node.ID);\n }\n\n /** Toggles expand/collapse on a node. */\n toggleExpand(node: MJFileCategoryEntity, event: Event): void {\n event.stopPropagation();\n if (this.expandedIds.has(node.ID)) {\n this.expandedIds.delete(node.ID);\n } else {\n this.expandedIds.add(node.ID);\n }\n }\n\n /** Checks if a node is the currently selected node. */\n isSelected(node: MJFileCategoryEntity): boolean {\n return this.selectedId != null && UUIDsEqual(this.selectedId, node.ID);\n }\n\n /** Selects a node and emits event. */\n selectNode(node: MJFileCategoryEntity): void {\n this.selectedId = node.ID;\n this.categorySelected.emit(node.ID);\n }\n\n /** Opens context menu on right-click. */\n onContextMenu(event: MouseEvent, node: MJFileCategoryEntity): void {\n event.preventDefault();\n event.stopPropagation();\n this.contextMenuNode = node;\n this.contextMenuX = event.clientX;\n this.contextMenuY = event.clientY;\n this.contextMenuVisible = true;\n }\n\n /** Closes the context menu. */\n closeContextMenu(): void {\n this.contextMenuVisible = false;\n this.contextMenuNode = undefined;\n }\n\n /** Handles context menu action selection. */\n onContextMenuAction(action: string): void {\n const node = this.contextMenuNode;\n this.closeContextMenu();\n if (!node) {\n return;\n }\n\n switch (action) {\n case 'rename':\n this.renameFileCategory = node;\n break;\n case 'delete':\n this.deleteCategory(node);\n break;\n }\n }\n\n async createNewCategory() {\n this.showNew = true;\n }\n\n cancelNewCategory() {\n this.showNew = false;\n }\n\n async saveNewCategory() {\n this.isLoading = true;\n const categoryEntity: MJFileCategoryEntity = await this.md.GetEntityObject('MJ: File Categories', this.md.CurrentUser);\n categoryEntity.NewRecord();\n categoryEntity.Name = this.newCategoryName;\n await categoryEntity?.Save();\n this.categoriesData = [...this.categoriesData, categoryEntity];\n this.showNew = false;\n this.newCategoryName = '';\n this.isLoading = false;\n }\n\n async deleteCategory(fileCategory: MJFileCategoryEntity) {\n this.isLoading = true;\n const { ID } = fileCategory;\n const success = await fileCategory.Delete();\n if (!success) {\n console.error('Unable to delete file category:', fileCategory);\n this.notifications.CreateSimpleNotification(`Unable to delete category '${fileCategory.Name}'`, 'error');\n this.isLoading = false;\n return;\n }\n\n this.categoriesData = this.categoriesData.filter((c) => !UUIDsEqual(c.ID, ID));\n this.clearSelection();\n this.isLoading = false;\n }\n\n clearSelection() {\n this.selectedId = undefined;\n this.categorySelected.emit(undefined);\n }\n\n cancelRename() {\n this.renameFileCategory?.Revert();\n this.renameFileCategory = undefined;\n }\n\n async saveRename() {\n this.isLoading = true;\n await this.renameFileCategory?.Save();\n this.renameFileCategory = undefined;\n this.isLoading = false;\n }\n\n async Refresh() {\n this.isLoading = true;\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView({\n EntityName: 'MJ: File Categories',\n ResultType: 'entity_object',\n });\n\n if (result.Success) {\n this.categoriesData = <MJFileCategoryEntity[]>result.Results;\n } else {\n throw new Error('Error loading file categories: ' + result.ErrorMessage);\n }\n this.isLoading = false;\n }\n}\n","<div class=\"container\">\n <div class=\"tree-header\">\n <button mjButton (click)=\"clearSelection()\">All Files</button>\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"createNewCategory()\">Add category</button>\n </div>\n\n <div class=\"category-tree\">\n @for (node of rootNodes; track node.ID) {\n <ng-container *ngTemplateOutlet=\"treeNode; context: { $implicit: node, level: 0 }\"></ng-container>\n }\n </div>\n\n <ng-template #treeNode let-node let-level=\"level\">\n <div class=\"tree-node\" [style.padding-left.px]=\"level * 20\">\n <div class=\"tree-node-row\"\n [class.selected]=\"isSelected(node)\"\n (click)=\"selectNode(node)\"\n (contextmenu)=\"onContextMenu($event, node)\">\n @if (hasChildren(node)) {\n <button class=\"tree-expand-btn\" (click)=\"toggleExpand(node, $event)\">\n <i class=\"fa-solid\" [class.fa-chevron-right]=\"!isExpanded(node)\" [class.fa-chevron-down]=\"isExpanded(node)\"></i>\n </button>\n } @else {\n <span class=\"tree-expand-placeholder\"></span>\n }\n <i class=\"fa-solid fa-folder tree-folder-icon\"></i>\n <span class=\"tree-node-label\">{{ node.Name }}</span>\n </div>\n @if (isExpanded(node)) {\n @for (child of getChildren(node); track child.ID) {\n <ng-container *ngTemplateOutlet=\"treeNode; context: { $implicit: child, level: level + 1 }\"></ng-container>\n }\n }\n </div>\n </ng-template>\n\n <!-- Context Menu -->\n @if (contextMenuVisible) {\n <div class=\"context-menu\"\n [style.top.px]=\"contextMenuY\"\n [style.left.px]=\"contextMenuX\"\n (document:click)=\"closeContextMenu()\">\n <button class=\"context-menu-item\" (click)=\"onContextMenuAction('rename')\">\n <i class=\"fa-solid fa-pen\"></i> Rename\n </button>\n <button class=\"context-menu-item\" (click)=\"onContextMenuAction('delete')\" disabled>\n <i class=\"fa-solid fa-trash-can\"></i> Delete\n </button>\n </div>\n }\n\n <mj-dialog\n [Visible]=\"showNew\"\n Title=\"New file category\"\n [Width]=\"450\"\n [MinWidth]=\"250\"\n (Close)=\"cancelNewCategory()\">\n <div class=\"dialog-form-container\">\n <form #newForm=\"ngForm\">\n <label class=\"mj-form-field\">\n <span class=\"mj-form-label\">Name</span>\n <input\n class=\"mj-input\"\n name=\"name\"\n [(ngModel)]=\"newCategoryName\"\n required\n [disabled]=\"isLoading\" />\n </label>\n </form>\n </div>\n <mj-dialog-actions>\n <button mjButton variant=\"primary\" (click)=\"saveNewCategory()\" [disabled]=\"isLoading\">Save</button>\n <button mjButton (click)=\"cancelNewCategory()\" [disabled]=\"isLoading\">Cancel</button>\n </mj-dialog-actions>\n </mj-dialog>\n\n @if (!!renameFileCategory) {\n <mj-dialog\n [Visible]=\"true\"\n Title=\"Rename file category\"\n [Width]=\"450\"\n [MinWidth]=\"250\"\n (Close)=\"cancelRename()\">\n <div class=\"dialog-form-container\">\n <form #renameForm=\"ngForm\">\n <label class=\"mj-form-field\">\n <span class=\"mj-form-label\">Name</span>\n <input\n class=\"mj-input\"\n name=\"Name\"\n [(ngModel)]=\"renameFileCategory.Name\"\n required\n [disabled]=\"isLoading\" />\n </label>\n </form>\n </div>\n <mj-dialog-actions>\n <button mjButton variant=\"primary\" (click)=\"saveRename()\" [disabled]=\"isLoading || !renameFileCategory.Dirty\">Save</button>\n <button mjButton (click)=\"cancelRename()\" [disabled]=\"isLoading\">Cancel</button>\n </mj-dialog-actions>\n </mj-dialog>\n }\n</div>\n"]}
@@ -61,7 +61,7 @@ let FileBrowserResource = class FileBrowserResource extends BaseResourceComponen
61
61
  i0.ɵɵelementStart(0, "div", 0);
62
62
  i0.ɵɵelement(1, "mj-file-browser");
63
63
  i0.ɵɵelementEnd();
64
- } }, dependencies: [i1.FileBrowserComponent], styles: ["[_nghost-%COMP%] {\n display: block;\n width: 100%;\n height: 100%;\n }\n .file-browser-resource-container[_ngcontent-%COMP%] {\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n \n\n .file-browser-resource-container[_ngcontent-%COMP%] :is(mj-file-browser[_ngcontent-%COMP%]) {\n flex: 1;\n min-height: 0;\n min-width: 0;\n display: flex;\n }"] });
64
+ } }, dependencies: [i1.FileBrowserComponent], styles: ["[_nghost-%COMP%] {\n display: block;\n width: 100%;\n height: 100%;\n }\n .file-browser-resource-container[_ngcontent-%COMP%] {\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n \n .file-browser-resource-container[_ngcontent-%COMP%] :is(mj-file-browser[_ngcontent-%COMP%]) {\n flex: 1;\n min-height: 0;\n min-width: 0;\n display: flex;\n }"] });
65
65
  };
66
66
  FileBrowserResource = __decorate([
67
67
  RegisterClass(BaseResourceComponent, 'FileBrowserResource')
@@ -119,7 +119,7 @@ export class FileBrowserComponent {
119
119
  i0.ɵɵproperty("account", ctx.selectedAccount);
120
120
  i0.ɵɵadvance(2);
121
121
  i0.ɵɵproperty("account", ctx.selectedAccount)("folderPath", ctx.selectedFolderPath);
122
- } }, dependencies: [i1.StorageProvidersListComponent, i2.FolderTreeComponent, i3.FileGridComponent], styles: ["\n\n\n\n\n\n[_nghost-%COMP%] {\n display: block;\n width: 100%;\n height: 100%;\n}\n\n.file-browser[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n background-color: var(--mj-bg-surface);\n border: none;\n border-radius: 0;\n overflow: hidden;\n box-shadow: none;\n}\n\n\n\n.mobile-header[_ngcontent-%COMP%] {\n display: none;\n align-items: center;\n gap: 12px;\n padding: 10px 16px;\n background-color: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.mobile-header[_ngcontent-%COMP%] .browser-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 0.95rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.sidebar-toggle[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n color: var(--mj-text-secondary);\n padding: 6px 10px;\n cursor: pointer;\n border-radius: var(--mj-radius-sm, 6px);\n font-size: 0.85rem;\n transition: all 0.15s ease;\n}\n\n.sidebar-toggle[_ngcontent-%COMP%]:hover {\n background-color: color-mix(in srgb, var(--mj-text-primary) 6%, var(--mj-bg-surface));\n color: var(--mj-text-primary);\n}\n\n\n\n.browser-container[_ngcontent-%COMP%] {\n display: flex;\n flex: 1;\n overflow: hidden;\n position: relative;\n}\n\n\n\n.sidebar[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n background-color: var(--mj-bg-surface-sunken, color-mix(in srgb, var(--mj-text-primary) 2%, var(--mj-bg-surface)));\n border-right: 1px solid var(--mj-border-default);\n width: 250px;\n min-width: 250px;\n max-width: 250px;\n overflow: hidden;\n transition: width 0.25s cubic-bezier(0.4, 0, 0.2, 1), transform 0.25s ease, opacity 0.2s ease;\n z-index: 10;\n}\n\n.sidebar.collapsed[_ngcontent-%COMP%] {\n width: 0;\n min-width: 0;\n border-right: none;\n opacity: 0;\n pointer-events: none;\n}\n\n\n\n.sidebar-section[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n min-height: 180px;\n max-height: 48%;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.sidebar-section[_ngcontent-%COMP%]:last-child {\n flex: 1;\n max-height: none;\n border-bottom: none;\n}\n\n.section-header[_ngcontent-%COMP%] {\n padding: 8px 14px;\n background-color: transparent;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.section-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 0.7rem;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.06em;\n}\n\n.section-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n}\n\n\n\n.main-panel[_ngcontent-%COMP%] {\n flex: 1;\n background-color: var(--mj-bg-surface);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n min-width: 0;\n}\n\n\n\n.section-content[_ngcontent-%COMP%]::-webkit-scrollbar {\n width: 5px;\n}\n\n.section-content[_ngcontent-%COMP%]::-webkit-scrollbar-track {\n background: transparent;\n}\n\n.section-content[_ngcontent-%COMP%]::-webkit-scrollbar-thumb {\n background: var(--mj-border-default);\n border-radius: 4px;\n}\n\n.section-content[_ngcontent-%COMP%]::-webkit-scrollbar-thumb:hover {\n background: var(--mj-text-muted);\n}\n\n\n\n\n\n\n\n\n@media screen and (max-width: 1024px) {\n .sidebar[_ngcontent-%COMP%] {\n width: 220px;\n min-width: 220px;\n max-width: 220px;\n }\n}\n\n\n\n@media screen and (max-width: 768px) {\n .mobile-header[_ngcontent-%COMP%] {\n display: flex;\n }\n\n .browser-container[_ngcontent-%COMP%] {\n flex-direction: column;\n }\n\n .sidebar[_ngcontent-%COMP%] {\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 270px;\n min-width: 270px;\n max-width: 270px;\n z-index: 1000;\n box-shadow: var(--mj-shadow-lg, 0 10px 25px rgba(0, 0, 0, 0.2));\n background-color: var(--mj-bg-surface);\n }\n\n .sidebar.collapsed[_ngcontent-%COMP%] {\n transform: translateX(-100%);\n }\n\n .main-panel[_ngcontent-%COMP%] {\n flex: 1;\n }\n}"] });
122
+ } }, dependencies: [i1.StorageProvidersListComponent, i2.FolderTreeComponent, i3.FileGridComponent], styles: ["\n\n\n\n\n[_nghost-%COMP%] {\n display: block;\n width: 100%;\n height: 100%;\n}\n\n.file-browser[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n background-color: var(--mj-bg-surface);\n border: none;\n border-radius: 0;\n overflow: hidden;\n box-shadow: none;\n}\n\n\n.mobile-header[_ngcontent-%COMP%] {\n display: none;\n align-items: center;\n gap: 12px;\n padding: 10px 16px;\n background-color: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.mobile-header[_ngcontent-%COMP%] .browser-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 0.95rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.sidebar-toggle[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n color: var(--mj-text-secondary);\n padding: 6px 10px;\n cursor: pointer;\n border-radius: var(--mj-radius-sm, 6px);\n font-size: 0.85rem;\n transition: all 0.15s ease;\n}\n\n.sidebar-toggle[_ngcontent-%COMP%]:hover {\n background-color: color-mix(in srgb, var(--mj-text-primary) 6%, var(--mj-bg-surface));\n color: var(--mj-text-primary);\n}\n\n\n.browser-container[_ngcontent-%COMP%] {\n display: flex;\n flex: 1;\n overflow: hidden;\n position: relative;\n}\n\n\n.sidebar[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n background-color: var(--mj-bg-surface-sunken, color-mix(in srgb, var(--mj-text-primary) 2%, var(--mj-bg-surface)));\n border-right: 1px solid var(--mj-border-default);\n width: 250px;\n min-width: 250px;\n max-width: 250px;\n overflow: hidden;\n transition: width 0.25s cubic-bezier(0.4, 0, 0.2, 1), transform 0.25s ease, opacity 0.2s ease;\n z-index: 10;\n}\n\n.sidebar.collapsed[_ngcontent-%COMP%] {\n width: 0;\n min-width: 0;\n border-right: none;\n opacity: 0;\n pointer-events: none;\n}\n\n\n.sidebar-section[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n min-height: 180px;\n max-height: 48%;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.sidebar-section[_ngcontent-%COMP%]:last-child {\n flex: 1;\n max-height: none;\n border-bottom: none;\n}\n\n.section-header[_ngcontent-%COMP%] {\n padding: 8px 14px;\n background-color: transparent;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.section-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 0.7rem;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.06em;\n}\n\n.section-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n}\n\n\n.main-panel[_ngcontent-%COMP%] {\n flex: 1;\n background-color: var(--mj-bg-surface);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n min-width: 0;\n}\n\n\n.section-content[_ngcontent-%COMP%]::-webkit-scrollbar {\n width: 5px;\n}\n\n.section-content[_ngcontent-%COMP%]::-webkit-scrollbar-track {\n background: transparent;\n}\n\n.section-content[_ngcontent-%COMP%]::-webkit-scrollbar-thumb {\n background: var(--mj-border-default);\n border-radius: 4px;\n}\n\n.section-content[_ngcontent-%COMP%]::-webkit-scrollbar-thumb:hover {\n background: var(--mj-text-muted);\n}\n\n\n\n\n\n\n@media screen and (max-width: 1024px) {\n .sidebar[_ngcontent-%COMP%] {\n width: 220px;\n min-width: 220px;\n max-width: 220px;\n }\n}\n\n\n@media screen and (max-width: 768px) {\n .mobile-header[_ngcontent-%COMP%] {\n display: flex;\n }\n\n .browser-container[_ngcontent-%COMP%] {\n flex-direction: column;\n }\n\n .sidebar[_ngcontent-%COMP%] {\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 270px;\n min-width: 270px;\n max-width: 270px;\n z-index: 1000;\n box-shadow: var(--mj-shadow-lg, 0 10px 25px rgba(0, 0, 0, 0.2));\n background-color: var(--mj-bg-surface);\n }\n\n .sidebar.collapsed[_ngcontent-%COMP%] {\n transform: translateX(-100%);\n }\n\n .main-panel[_ngcontent-%COMP%] {\n flex: 1;\n }\n}"] });
123
123
  }
124
124
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(FileBrowserComponent, [{
125
125
  type: Component,
@@ -167,7 +167,7 @@ function FileGridComponent_Conditional_2_Conditional_8_Template(rf, ctx) { if (r
167
167
  function FileGridComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
168
168
  const _r8 = i0.ɵɵgetCurrentView();
169
169
  i0.ɵɵelementStart(0, "div", 2)(1, "div", 46)(2, "label", 47);
170
- i0.ɵɵlistener("click", function FileGridComponent_Conditional_2_Template_label_click_2_listener($event) { i0.ɵɵrestoreView(_r8); return i0.ɵɵresetView($event.stopPropagation()); });
170
+ i0.ɵɵlistener("click", function FileGridComponent_Conditional_2_Template_label_click_2_listener($event) { return $event.stopPropagation(); });
171
171
  i0.ɵɵelementStart(3, "input", 48);
172
172
  i0.ɵɵlistener("change", function FileGridComponent_Conditional_2_Template_input_change_3_listener() { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.areAllSelected() ? ctx_r1.deselectAll() : ctx_r1.selectAll()); });
173
173
  i0.ɵɵelementEnd();
@@ -424,12 +424,12 @@ function FileGridComponent_Conditional_6_For_2_Template(rf, ctx) { if (rf & 1) {
424
424
  i0.ɵɵelementStart(0, "div", 108);
425
425
  i0.ɵɵlistener("click", function FileGridComponent_Conditional_6_For_2_Template_div_click_0_listener($event) { const item_r19 = i0.ɵɵrestoreView(_r18).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onTileClick(item_r19, $event)); })("dblclick", function FileGridComponent_Conditional_6_For_2_Template_div_dblclick_0_listener() { const item_r19 = i0.ɵɵrestoreView(_r18).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onItemDoubleClick(item_r19)); });
426
426
  i0.ɵɵelementStart(1, "div", 109)(2, "label", 110);
427
- i0.ɵɵlistener("click", function FileGridComponent_Conditional_6_For_2_Template_label_click_2_listener($event) { i0.ɵɵrestoreView(_r18); return i0.ɵɵresetView($event.stopPropagation()); });
427
+ i0.ɵɵlistener("click", function FileGridComponent_Conditional_6_For_2_Template_label_click_2_listener($event) { return $event.stopPropagation(); });
428
428
  i0.ɵɵelementStart(3, "input", 48);
429
429
  i0.ɵɵlistener("change", function FileGridComponent_Conditional_6_For_2_Template_input_change_3_listener($event) { const item_r19 = i0.ɵɵrestoreView(_r18).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleItemSelection(item_r19, $event)); });
430
430
  i0.ɵɵelementEnd()();
431
431
  i0.ɵɵelementStart(4, "div", 111);
432
- i0.ɵɵlistener("click", function FileGridComponent_Conditional_6_For_2_Template_div_click_4_listener($event) { i0.ɵɵrestoreView(_r18); return i0.ɵɵresetView($event.stopPropagation()); });
432
+ i0.ɵɵlistener("click", function FileGridComponent_Conditional_6_For_2_Template_div_click_4_listener($event) { return $event.stopPropagation(); });
433
433
  i0.ɵɵconditionalCreate(5, FileGridComponent_Conditional_6_For_2_Conditional_5_Template, 4, 0);
434
434
  i0.ɵɵelementEnd()();
435
435
  i0.ɵɵelementStart(6, "div", 112);
@@ -489,7 +489,7 @@ function FileGridComponent_Conditional_7_For_24_Template(rf, ctx) { if (rf & 1)
489
489
  i0.ɵɵelementStart(0, "tr", 129);
490
490
  i0.ɵɵlistener("click", function FileGridComponent_Conditional_7_For_24_Template_tr_click_0_listener($event) { const item_r23 = i0.ɵɵrestoreView(_r22).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onTileClick(item_r23, $event)); })("dblclick", function FileGridComponent_Conditional_7_For_24_Template_tr_dblclick_0_listener() { const item_r23 = i0.ɵɵrestoreView(_r22).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onItemDoubleClick(item_r23)); });
491
491
  i0.ɵɵelementStart(1, "td", 130);
492
- i0.ɵɵlistener("click", function FileGridComponent_Conditional_7_For_24_Template_td_click_1_listener($event) { i0.ɵɵrestoreView(_r22); return i0.ɵɵresetView($event.stopPropagation()); });
492
+ i0.ɵɵlistener("click", function FileGridComponent_Conditional_7_For_24_Template_td_click_1_listener($event) { return $event.stopPropagation(); });
493
493
  i0.ɵɵelementStart(2, "input", 48);
494
494
  i0.ɵɵlistener("change", function FileGridComponent_Conditional_7_For_24_Template_input_change_2_listener($event) { const item_r23 = i0.ɵɵrestoreView(_r22).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleItemSelection(item_r23, $event)); });
495
495
  i0.ɵɵelementEnd()();
@@ -509,7 +509,7 @@ function FileGridComponent_Conditional_7_For_24_Template(rf, ctx) { if (rf & 1)
509
509
  i0.ɵɵtext(17);
510
510
  i0.ɵɵelementEnd()();
511
511
  i0.ɵɵelementStart(18, "td", 142);
512
- i0.ɵɵlistener("click", function FileGridComponent_Conditional_7_For_24_Template_td_click_18_listener($event) { i0.ɵɵrestoreView(_r22); return i0.ɵɵresetView($event.stopPropagation()); });
512
+ i0.ɵɵlistener("click", function FileGridComponent_Conditional_7_For_24_Template_td_click_18_listener($event) { return $event.stopPropagation(); });
513
513
  i0.ɵɵelementStart(19, "div", 143);
514
514
  i0.ɵɵconditionalCreate(20, FileGridComponent_Conditional_7_For_24_Conditional_20_Template, 4, 0);
515
515
  i0.ɵɵelementEnd()()();
@@ -743,7 +743,7 @@ function FileGridComponent_Conditional_12_Template(rf, ctx) { if (rf & 1) {
743
743
  i0.ɵɵelementStart(0, "div", 159);
744
744
  i0.ɵɵlistener("click", function FileGridComponent_Conditional_12_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r26); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.closePreview()); });
745
745
  i0.ɵɵelementStart(1, "div", 160);
746
- i0.ɵɵlistener("click", function FileGridComponent_Conditional_12_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r26); return i0.ɵɵresetView($event.stopPropagation()); });
746
+ i0.ɵɵlistener("click", function FileGridComponent_Conditional_12_Template_div_click_1_listener($event) { return $event.stopPropagation(); });
747
747
  i0.ɵɵelementStart(2, "div", 161)(3, "div", 162)(4, "div", 133);
748
748
  i0.ɵɵelement(5, "i");
749
749
  i0.ɵɵelementEnd();
@@ -787,7 +787,7 @@ function FileGridComponent_Conditional_13_Template(rf, ctx) { if (rf & 1) {
787
787
  i0.ɵɵelementStart(0, "div", 184);
788
788
  i0.ɵɵlistener("click", function FileGridComponent_Conditional_13_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r29); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onCancelNewFolder()); });
789
789
  i0.ɵɵelementStart(1, "div", 185);
790
- i0.ɵɵlistener("click", function FileGridComponent_Conditional_13_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r29); return i0.ɵɵresetView($event.stopPropagation()); });
790
+ i0.ɵɵlistener("click", function FileGridComponent_Conditional_13_Template_div_click_1_listener($event) { return $event.stopPropagation(); });
791
791
  i0.ɵɵelementStart(2, "div", 186)(3, "h3", 163);
792
792
  i0.ɵɵtext(4, "Create New Folder");
793
793
  i0.ɵɵelementEnd();
@@ -841,7 +841,7 @@ function FileGridComponent_Conditional_14_Template(rf, ctx) { if (rf & 1) {
841
841
  i0.ɵɵelementStart(0, "div", 184);
842
842
  i0.ɵɵlistener("click", function FileGridComponent_Conditional_14_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r30); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onCancelDelete()); });
843
843
  i0.ɵɵelementStart(1, "div", 185);
844
- i0.ɵɵlistener("click", function FileGridComponent_Conditional_14_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r30); return i0.ɵɵresetView($event.stopPropagation()); });
844
+ i0.ɵɵlistener("click", function FileGridComponent_Conditional_14_Template_div_click_1_listener($event) { return $event.stopPropagation(); });
845
845
  i0.ɵɵelementStart(2, "div", 186)(3, "h3", 163);
846
846
  i0.ɵɵtext(4);
847
847
  i0.ɵɵelementEnd();
@@ -893,7 +893,7 @@ function FileGridComponent_Conditional_15_Template(rf, ctx) { if (rf & 1) {
893
893
  i0.ɵɵelementStart(0, "div", 184);
894
894
  i0.ɵɵlistener("click", function FileGridComponent_Conditional_15_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r31); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onCancelRename()); });
895
895
  i0.ɵɵelementStart(1, "div", 185);
896
- i0.ɵɵlistener("click", function FileGridComponent_Conditional_15_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r31); return i0.ɵɵresetView($event.stopPropagation()); });
896
+ i0.ɵɵlistener("click", function FileGridComponent_Conditional_15_Template_div_click_1_listener($event) { return $event.stopPropagation(); });
897
897
  i0.ɵɵelementStart(2, "div", 186)(3, "h3", 163);
898
898
  i0.ɵɵtext(4);
899
899
  i0.ɵɵelementEnd();
@@ -942,7 +942,7 @@ function FileGridComponent_Conditional_16_Template(rf, ctx) { if (rf & 1) {
942
942
  i0.ɵɵelementStart(0, "div", 159);
943
943
  i0.ɵɵlistener("click", function FileGridComponent_Conditional_16_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r32); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onCancelCopy()); });
944
944
  i0.ɵɵelementStart(1, "div", 199);
945
- i0.ɵɵlistener("click", function FileGridComponent_Conditional_16_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r32); return i0.ɵɵresetView($event.stopPropagation()); });
945
+ i0.ɵɵlistener("click", function FileGridComponent_Conditional_16_Template_div_click_1_listener($event) { return $event.stopPropagation(); });
946
946
  i0.ɵɵelementStart(2, "div", 161)(3, "h3", 163);
947
947
  i0.ɵɵtext(4);
948
948
  i0.ɵɵelementEnd();
@@ -998,7 +998,7 @@ function FileGridComponent_Conditional_17_Template(rf, ctx) { if (rf & 1) {
998
998
  i0.ɵɵelementStart(0, "div", 159);
999
999
  i0.ɵɵlistener("click", function FileGridComponent_Conditional_17_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r33); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onCancelMove()); });
1000
1000
  i0.ɵɵelementStart(1, "div", 199);
1001
- i0.ɵɵlistener("click", function FileGridComponent_Conditional_17_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r33); return i0.ɵɵresetView($event.stopPropagation()); });
1001
+ i0.ɵɵlistener("click", function FileGridComponent_Conditional_17_Template_div_click_1_listener($event) { return $event.stopPropagation(); });
1002
1002
  i0.ɵɵelementStart(2, "div", 161)(3, "h3", 163);
1003
1003
  i0.ɵɵtext(4);
1004
1004
  i0.ɵɵelementEnd();
@@ -1087,7 +1087,7 @@ function FileGridComponent_Conditional_18_Template(rf, ctx) { if (rf & 1) {
1087
1087
  i0.ɵɵelementStart(0, "div", 159);
1088
1088
  i0.ɵɵlistener("click", function FileGridComponent_Conditional_18_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r34); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onCancelCopyToAccount()); });
1089
1089
  i0.ɵɵelementStart(1, "div", 205);
1090
- i0.ɵɵlistener("click", function FileGridComponent_Conditional_18_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r34); return i0.ɵɵresetView($event.stopPropagation()); });
1090
+ i0.ɵɵlistener("click", function FileGridComponent_Conditional_18_Template_div_click_1_listener($event) { return $event.stopPropagation(); });
1091
1091
  i0.ɵɵelementStart(2, "div", 161)(3, "h3", 163);
1092
1092
  i0.ɵɵtext(4, "Copy to Another Account");
1093
1093
  i0.ɵɵelementEnd();
@@ -2741,7 +2741,7 @@ export class FileGridComponent {
2741
2741
  i0.ɵɵconditional(ctx.showMoveDialog && ctx.itemToMove ? 17 : -1);
2742
2742
  i0.ɵɵadvance();
2743
2743
  i0.ɵɵconditional(ctx.showCopyToProviderDialog && ctx.itemToCopyToProvider ? 18 : -1);
2744
- } }, dependencies: [i1.NgIf, i2.NgSelectOption, i2.ɵNgSelectMultipleOption, i2.DefaultValueAccessor, i2.SelectControlValueAccessor, i2.NgControlStatus, i2.NgModel, i3.LoadingComponent, i4.MJEmptyStateComponent], styles: ["\n\n\n\n\n\n[_nghost-%COMP%] {\n display: block;\n width: 100%;\n height: 100%;\n overflow: hidden;\n}\n\n.file-grid-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n background-color: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n position: relative;\n overflow: hidden;\n}\n\n\n\n\n\n\n.command-bar[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n padding: 10px 16px;\n background-color: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n flex-wrap: wrap;\n}\n\n.command-bar-left[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n min-width: 0;\n flex: 1;\n}\n\n.nav-btn-group[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n flex-shrink: 0;\n}\n\n.mj-tool-btn[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n min-width: 32px;\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: var(--mj-radius-sm, 6px);\n border: 1px solid var(--mj-border-default);\n background-color: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.mj-tool-btn[_ngcontent-%COMP%]:hover:not([disabled]) {\n background-color: color-mix(in srgb, var(--mj-text-primary) 6%, var(--mj-bg-surface));\n color: var(--mj-text-primary);\n border-color: var(--mj-brand-primary);\n}\n\n.mj-tool-btn[disabled][_ngcontent-%COMP%] {\n opacity: 0.4;\n cursor: not-allowed;\n background-color: transparent;\n}\n\n\n\n.breadcrumb-trail[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n overflow-x: auto;\n overflow-y: hidden;\n scrollbar-width: none;\n min-width: 0;\n padding: 2px 4px;\n}\n\n.breadcrumb-trail[_ngcontent-%COMP%]::-webkit-scrollbar {\n display: none;\n}\n\n.trail-root-icon[_ngcontent-%COMP%] {\n color: var(--mj-status-warning, #f59e0b);\n font-size: 0.95rem;\n margin-right: 2px;\n flex-shrink: 0;\n}\n\n.crumb-btn[_ngcontent-%COMP%] {\n background: transparent;\n border: none;\n color: var(--mj-text-secondary);\n font-size: 0.82rem;\n font-weight: 500;\n padding: 4px 8px;\n border-radius: var(--mj-radius-sm, 6px);\n cursor: pointer;\n white-space: nowrap;\n transition: all 0.12s ease;\n}\n\n.crumb-btn[_ngcontent-%COMP%]:hover {\n background-color: color-mix(in srgb, var(--mj-text-primary) 6%, var(--mj-bg-surface));\n color: var(--mj-text-primary);\n}\n\n.crumb-btn.current[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-weight: 600;\n background-color: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n.crumb-separator[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 0.75rem;\n}\n\n\n\n.command-bar-right[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-shrink: 0;\n}\n\n\n\n.search-pill[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n background-color: var(--mj-bg-surface-sunken, color-mix(in srgb, var(--mj-text-primary) 4%, var(--mj-bg-surface)));\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-full, 9999px);\n padding: 2px 10px;\n gap: 6px;\n transition: border-color 0.15s ease;\n}\n\n.search-pill[_ngcontent-%COMP%]:focus-within {\n border-color: var(--mj-brand-primary);\n}\n\n.search-icon[_ngcontent-%COMP%] {\n font-size: 0.78rem;\n color: var(--mj-text-muted);\n}\n\n.search-input[_ngcontent-%COMP%] {\n border: none;\n background: transparent;\n outline: none;\n font-size: 0.82rem;\n color: var(--mj-text-primary);\n width: 150px;\n padding: 4px 0;\n}\n\n.search-input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-muted);\n}\n\n.search-clear-btn[_ngcontent-%COMP%] {\n background: transparent;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n padding: 0 4px;\n font-size: 0.75rem;\n}\n\n.search-clear-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n}\n\n.type-filter-select[_ngcontent-%COMP%] {\n border: none;\n background: transparent;\n font-size: 0.76rem;\n color: var(--mj-text-secondary);\n outline: none;\n cursor: pointer;\n padding: 2px 4px;\n border-left: 1px solid var(--mj-border-default);\n}\n\n\n\n.mj-btn-search-toggle[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n background-color: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n color: var(--mj-text-secondary);\n font-size: 0.8rem;\n font-weight: 500;\n padding: 6px 12px;\n border-radius: var(--mj-radius-full, 9999px);\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.mj-btn-search-toggle[_ngcontent-%COMP%]:hover {\n background-color: color-mix(in srgb, var(--mj-text-primary) 6%, var(--mj-bg-surface));\n color: var(--mj-text-primary);\n}\n\n.mj-btn-search-toggle.active[_ngcontent-%COMP%] {\n background-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse, #ffffff);\n border-color: var(--mj-brand-primary);\n}\n\n\n\n.view-mode-toggle[_ngcontent-%COMP%] {\n display: flex;\n background-color: var(--mj-bg-surface-sunken, color-mix(in srgb, var(--mj-text-primary) 4%, var(--mj-bg-surface)));\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-sm, 6px);\n padding: 2px;\n gap: 2px;\n}\n\n.view-mode-btn[_ngcontent-%COMP%] {\n background: transparent;\n border: none;\n color: var(--mj-text-secondary);\n padding: 5px 8px;\n font-size: 0.8rem;\n border-radius: 4px;\n cursor: pointer;\n transition: all 0.12s ease;\n}\n\n.view-mode-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n}\n\n.view-mode-btn.active[_ngcontent-%COMP%] {\n background-color: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);\n}\n\n\n\n.mj-action-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n font-size: 0.82rem;\n font-weight: 500;\n border-radius: var(--mj-radius-sm, 6px);\n cursor: pointer;\n transition: all 0.15s ease;\n border: 1px solid transparent;\n white-space: nowrap;\n}\n\n.mj-action-btn--primary[_ngcontent-%COMP%] {\n background-color: var(--mj-brand-primary, #3b82f6);\n color: var(--mj-text-inverse, #ffffff);\n border-color: var(--mj-brand-primary, #3b82f6);\n}\n\n.mj-action-btn--primary[_ngcontent-%COMP%]:hover:not([disabled]) {\n background-color: color-mix(in srgb, var(--mj-brand-primary) 85%, var(--mj-text-primary, #000000));\n}\n\n.mj-action-btn--secondary[_ngcontent-%COMP%] {\n background-color: var(--mj-bg-surface);\n border-color: var(--mj-border-default);\n color: var(--mj-text-primary);\n}\n\n.mj-action-btn--secondary[_ngcontent-%COMP%]:hover:not([disabled]) {\n background-color: color-mix(in srgb, var(--mj-text-primary) 6%, var(--mj-bg-surface));\n}\n\n.mj-action-btn--danger[_ngcontent-%COMP%] {\n background-color: var(--mj-status-error, #ef4444);\n color: var(--mj-text-inverse, #ffffff);\n border-color: var(--mj-status-error, #ef4444);\n}\n\n.mj-action-btn--danger[_ngcontent-%COMP%]:hover:not([disabled]) {\n background-color: color-mix(in srgb, var(--mj-status-error, #ef4444) 85%, var(--mj-text-primary, #000000));\n}\n\n.mj-action-btn[disabled][_ngcontent-%COMP%] {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n\n\n\n\n\n.selection-bar[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 16px;\n background-color: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n border-bottom: 1px solid color-mix(in srgb, var(--mj-brand-primary) 25%, transparent);\n gap: 12px;\n flex-shrink: 0;\n animation: _ngcontent-%COMP%_slideDown 0.18s ease-out;\n}\n\n@keyframes _ngcontent-%COMP%_slideDown {\n from { transform: translateY(-100%); opacity: 0; }\n to { transform: translateY(0); opacity: 1; }\n}\n\n.selection-bar-left[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.selection-checkbox-wrap[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n user-select: none;\n}\n\n.selection-count[_ngcontent-%COMP%] {\n font-size: 0.82rem;\n font-weight: 600;\n color: var(--mj-brand-primary);\n}\n\n.selection-bar-right[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n flex-wrap: wrap;\n}\n\n.sel-action-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 4px 10px;\n font-size: 0.76rem;\n font-weight: 500;\n border-radius: var(--mj-radius-sm, 6px);\n background-color: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n color: var(--mj-text-primary);\n cursor: pointer;\n transition: all 0.12s ease;\n}\n\n.sel-action-btn[_ngcontent-%COMP%]:hover {\n background-color: color-mix(in srgb, var(--mj-text-primary) 6%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.sel-action-btn--danger[_ngcontent-%COMP%]:hover {\n background-color: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n border-color: var(--mj-status-error);\n color: var(--mj-status-error);\n}\n\n.sel-action-btn--ghost[_ngcontent-%COMP%] {\n background: transparent;\n border-color: transparent;\n}\n\n\n\n\n\n\n.multi-search-card[_ngcontent-%COMP%] {\n margin: 12px 16px;\n background-color: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-lg, 10px);\n box-shadow: var(--mj-shadow-md, 0 4px 12px rgba(0, 0, 0, 0.08));\n overflow: hidden;\n animation: _ngcontent-%COMP%_fadeIn 0.2s ease;\n}\n\n@keyframes _ngcontent-%COMP%_fadeIn {\n from { opacity: 0; transform: translateY(-6px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n.multi-search-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 16px;\n background-color: var(--mj-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.multi-search-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n color: var(--mj-brand-primary);\n}\n\n.multi-search-title[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 0.88rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.multi-search-body[_ngcontent-%COMP%] {\n padding: 14px 16px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.multi-search-bar[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.multi-search-text[_ngcontent-%COMP%] {\n flex: 1;\n padding: 8px 12px;\n border-radius: var(--mj-radius-sm, 6px);\n border: 1px solid var(--mj-border-default);\n background-color: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 0.85rem;\n outline: none;\n}\n\n.multi-search-text[_ngcontent-%COMP%]:focus {\n border-color: var(--mj-brand-primary);\n}\n\n.multi-search-accounts[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.account-select-label[_ngcontent-%COMP%] {\n font-size: 0.74rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n}\n\n.account-pill-list[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.account-select-pill[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n border-radius: var(--mj-radius-full, 9999px);\n border: 1px solid var(--mj-border-default);\n background-color: var(--mj-bg-surface-sunken);\n font-size: 0.76rem;\n cursor: pointer;\n transition: all 0.12s ease;\n}\n\n.account-select-pill.checked[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n background-color: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n.account-select-pill.disabled[_ngcontent-%COMP%] {\n opacity: 0.4;\n cursor: not-allowed;\n}\n\n.pill-account-name[_ngcontent-%COMP%] {\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.pill-provider-tag[_ngcontent-%COMP%] {\n font-size: 0.68rem;\n color: var(--mj-text-muted);\n}\n\n.pill-no-search[_ngcontent-%COMP%] {\n font-size: 0.68rem;\n color: var(--mj-status-warning);\n}\n\n\n\n.multi-search-results[_ngcontent-%COMP%] {\n border-top: 1px solid var(--mj-border-default);\n padding: 12px 16px;\n max-height: 400px;\n overflow-y: auto;\n}\n\n.results-meta-bar[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-bottom: 12px;\n font-size: 0.8rem;\n}\n\n.meta-count[_ngcontent-%COMP%] {\n color: var(--mj-text-primary);\n}\n\n.meta-stats[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n}\n\n.clear-results-btn[_ngcontent-%COMP%] {\n margin-left: auto;\n background: transparent;\n border: none;\n color: var(--mj-text-secondary);\n font-size: 0.76rem;\n cursor: pointer;\n}\n\n.clear-results-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n}\n\n.results-groups[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.result-group[_ngcontent-%COMP%] {\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-sm, 6px);\n overflow: hidden;\n}\n\n.result-group-head[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background-color: var(--mj-bg-surface-sunken);\n font-size: 0.8rem;\n}\n\n.group-account-name[_ngcontent-%COMP%] {\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.group-count-badge[_ngcontent-%COMP%] {\n margin-left: auto;\n background-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse, #ffffff);\n font-size: 0.7rem;\n font-weight: 600;\n padding: 1px 6px;\n border-radius: 9999px;\n}\n\n.group-error-badge[_ngcontent-%COMP%] {\n margin-left: auto;\n color: var(--mj-status-error);\n font-size: 0.72rem;\n}\n\n.result-items-grid[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n}\n\n.search-item-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 8px 12px;\n border-bottom: 1px solid var(--mj-border-default);\n font-size: 0.8rem;\n}\n\n.search-item-row[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n}\n\n.search-item-icon[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.search-item-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-width: 0;\n}\n\n.search-item-name[_ngcontent-%COMP%] {\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.search-item-path[_ngcontent-%COMP%] {\n font-size: 0.7rem;\n color: var(--mj-text-muted);\n}\n\n.search-item-size[_ngcontent-%COMP%], .search-item-date[_ngcontent-%COMP%] {\n font-size: 0.74rem;\n color: var(--mj-text-secondary);\n}\n\n.group-empty-text[_ngcontent-%COMP%] {\n padding: 12px;\n font-size: 0.78rem;\n color: var(--mj-text-muted);\n text-align: center;\n}\n\n\n\n\n\n\n.file-cards-grid[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(170px, 1fr));\n gap: 14px;\n align-content: start;\n}\n\n.file-card[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n background-color: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-lg, 10px);\n padding: 10px;\n cursor: pointer;\n transition: all 0.15s cubic-bezier(0.4, 0, 0.2, 1);\n position: relative;\n user-select: none;\n}\n\n.file-card[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary);\n box-shadow: var(--mj-shadow-md, 0 4px 12px rgba(0, 0, 0, 0.08));\n transform: translateY(-2px);\n}\n\n.file-card.selected[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n background-color: color-mix(in srgb, var(--mj-brand-primary) 6%, var(--mj-bg-surface));\n box-shadow: 0 0 0 1px var(--mj-brand-primary);\n}\n\n.file-card-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n height: 22px;\n margin-bottom: 6px;\n}\n\n.file-card-checkbox[_ngcontent-%COMP%] {\n cursor: pointer;\n}\n\n.file-card-quick-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 4px;\n opacity: 0;\n transition: opacity 0.15s ease;\n}\n\n.file-card[_ngcontent-%COMP%]:hover .file-card-quick-actions[_ngcontent-%COMP%] {\n opacity: 1;\n}\n\n.quick-action-btn[_ngcontent-%COMP%] {\n width: 22px;\n height: 22px;\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n color: var(--mj-text-secondary);\n font-size: 0.68rem;\n cursor: pointer;\n transition: all 0.12s ease;\n}\n\n.quick-action-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n}\n\n\n\n.file-card-icon-container[_ngcontent-%COMP%] {\n height: 74px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: var(--mj-radius-md, 8px);\n margin-bottom: 8px;\n font-size: 2rem;\n transition: transform 0.15s ease;\n}\n\n.file-card[_ngcontent-%COMP%]:hover .file-card-icon-container[_ngcontent-%COMP%] {\n transform: scale(1.04);\n}\n\n\n\n.file-card-body[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.file-card-name[_ngcontent-%COMP%] {\n font-size: 0.8rem;\n font-weight: 500;\n color: var(--mj-text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n line-height: 1.25;\n min-height: 2em;\n}\n\n.file-card-meta[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n font-size: 0.7rem;\n color: var(--mj-text-muted);\n}\n\n\n\n\n\n\n.file-table-container[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 8px 16px;\n}\n\n.file-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n font-size: 0.82rem;\n}\n\n.file-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n text-align: left;\n padding: 8px 10px;\n border-bottom: 1px solid var(--mj-border-default);\n color: var(--mj-text-muted);\n font-size: 0.72rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n user-select: none;\n cursor: pointer;\n}\n\n.file-table[_ngcontent-%COMP%] th.th-check[_ngcontent-%COMP%] {\n width: 32px;\n cursor: default;\n}\n\n.file-table[_ngcontent-%COMP%] th.th-actions[_ngcontent-%COMP%] {\n width: 70px;\n text-align: right;\n cursor: default;\n}\n\n.sort-arrow[_ngcontent-%COMP%] {\n margin-left: 4px;\n font-size: 0.65rem;\n}\n\n.file-table-row[_ngcontent-%COMP%] {\n border-bottom: 1px solid var(--mj-border-default);\n cursor: pointer;\n transition: background-color 0.12s ease;\n}\n\n.file-table-row[_ngcontent-%COMP%]:hover {\n background-color: color-mix(in srgb, var(--mj-brand-primary) 4%, var(--mj-bg-surface));\n}\n\n.file-table-row.selected[_ngcontent-%COMP%] {\n background-color: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n.file-table-row[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 8px 10px;\n vertical-align: middle;\n}\n\n.row-name-wrap[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n min-width: 0;\n}\n\n.row-icon-badge[_ngcontent-%COMP%] {\n width: 28px;\n height: 28px;\n min-width: 28px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: var(--mj-radius-sm, 6px);\n font-size: 0.9rem;\n}\n\n.row-file-name[_ngcontent-%COMP%] {\n font-weight: 500;\n color: var(--mj-text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.type-badge[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 2px 6px;\n border-radius: 4px;\n background-color: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n font-size: 0.7rem;\n}\n\n.size-text[_ngcontent-%COMP%], .date-text[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n font-size: 0.76rem;\n white-space: nowrap;\n}\n\n.row-action-buttons[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 4px;\n opacity: 0;\n transition: opacity 0.12s ease;\n}\n\n.file-table-row[_ngcontent-%COMP%]:hover .row-action-buttons[_ngcontent-%COMP%] {\n opacity: 1;\n}\n\n.row-act-btn[_ngcontent-%COMP%] {\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n color: var(--mj-text-secondary);\n font-size: 0.7rem;\n cursor: pointer;\n}\n\n.row-act-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n}\n\n\n\n\n\n\n.mj-file-thumb--folder[_ngcontent-%COMP%] {\n background-color: color-mix(in srgb, var(--mj-status-warning, #f59e0b) 14%, transparent);\n color: var(--mj-status-warning, #f59e0b);\n}\n\n.mj-file-thumb--pdf[_ngcontent-%COMP%] {\n background-color: color-mix(in srgb, var(--mj-status-error, #ef4444) 14%, transparent);\n color: var(--mj-status-error, #ef4444);\n}\n\n.mj-file-thumb--image[_ngcontent-%COMP%] {\n background-color: color-mix(in srgb, var(--mj-media-image, #8b5cf6) 14%, transparent);\n color: var(--mj-media-image, #8b5cf6);\n}\n\n.mj-file-thumb--video[_ngcontent-%COMP%] {\n background-color: color-mix(in srgb, var(--mj-brand-primary, #3b82f6) 14%, transparent);\n color: var(--mj-brand-primary, #3b82f6);\n}\n\n.mj-file-thumb--audio[_ngcontent-%COMP%] {\n background-color: color-mix(in srgb, var(--mj-status-warning, #f59e0b) 14%, transparent);\n color: var(--mj-status-warning, #f59e0b);\n}\n\n.mj-file-thumb--code[_ngcontent-%COMP%] {\n background-color: color-mix(in srgb, var(--mj-status-success, #10b981) 14%, transparent);\n color: var(--mj-status-success, #10b981);\n}\n\n.mj-file-thumb--text[_ngcontent-%COMP%] {\n background-color: color-mix(in srgb, var(--mj-text-muted, #6b7280) 14%, transparent);\n color: var(--mj-text-muted, #6b7280);\n}\n\n.mj-file-thumb--document[_ngcontent-%COMP%] {\n background-color: color-mix(in srgb, var(--mj-brand-primary-hover, #2563eb) 14%, transparent);\n color: var(--mj-brand-primary-hover, #2563eb);\n}\n\n\n\n\n\n\n.status-bar[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 6px 16px;\n background-color: var(--mj-bg-surface-sunken, color-mix(in srgb, var(--mj-text-primary) 3%, var(--mj-bg-surface)));\n border-top: 1px solid var(--mj-border-default);\n font-size: 0.72rem;\n color: var(--mj-text-secondary);\n flex-shrink: 0;\n}\n\n.status-account-badge[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n color: var(--mj-brand-primary);\n font-weight: 500;\n}\n\n\n\n\n\n\n.drag-drop-overlay[_ngcontent-%COMP%] {\n position: absolute;\n inset: 0;\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, rgba(255, 255, 255, 0.9));\n backdrop-filter: blur(4px);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 100;\n pointer-events: none;\n}\n\n.drag-drop-content[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 32px 48px;\n background-color: var(--mj-bg-surface);\n border: 2px dashed var(--mj-brand-primary);\n border-radius: var(--mj-radius-lg, 12px);\n box-shadow: var(--mj-shadow-lg, 0 10px 25px rgba(0, 0, 0, 0.15));\n}\n\n.drag-icon[_ngcontent-%COMP%] {\n font-size: 3rem;\n color: var(--mj-brand-primary);\n margin-bottom: 12px;\n}\n\n.drag-drop-content[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0 0 6px 0;\n font-size: 1.1rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.drag-drop-content[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 0.8rem;\n color: var(--mj-text-secondary);\n}\n\n.upload-progress-bar-wrap[_ngcontent-%COMP%] {\n position: absolute;\n bottom: 36px;\n right: 20px;\n z-index: 90;\n}\n\n.upload-progress-card[_ngcontent-%COMP%] {\n background-color: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md, 8px);\n padding: 10px 14px;\n box-shadow: var(--mj-shadow-lg, 0 8px 20px rgba(0, 0, 0, 0.15));\n width: 260px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.upload-info[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.upload-spinner[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.upload-text[_ngcontent-%COMP%] {\n font-size: 0.78rem;\n font-weight: 500;\n color: var(--mj-text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.progress-track[_ngcontent-%COMP%] {\n height: 4px;\n background-color: var(--mj-bg-surface-sunken);\n border-radius: 9999px;\n overflow: hidden;\n}\n\n.progress-fill[_ngcontent-%COMP%] {\n height: 100%;\n background-color: var(--mj-brand-primary);\n transition: width 0.15s ease;\n}\n\n.grid-loading-container[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n flex: 1;\n}\n\n\n\n\n\n\n.mj-modal-backdrop[_ngcontent-%COMP%] {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.5);\n backdrop-filter: blur(4px);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1050;\n padding: 20px;\n animation: _ngcontent-%COMP%_modalFadeIn 0.18s ease-out;\n}\n\n@keyframes _ngcontent-%COMP%_modalFadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n.mj-modal-window[_ngcontent-%COMP%] {\n background-color: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-lg, 12px);\n box-shadow: var(--mj-shadow-xl, 0 20px 35px rgba(0, 0, 0, 0.25));\n width: 100%;\n max-width: 500px;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n}\n\n.mj-modal-window.modal-compact[_ngcontent-%COMP%] {\n max-width: 420px;\n}\n\n.mj-modal-window.preview-modal-window[_ngcontent-%COMP%] {\n max-width: 850px;\n max-height: 85vh;\n height: 80vh;\n}\n\n.mj-modal-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 18px;\n border-bottom: 1px solid var(--mj-border-default);\n background-color: var(--mj-bg-surface);\n}\n\n.modal-title-wrap[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.modal-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 0.95rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.modal-subtitle[_ngcontent-%COMP%] {\n font-size: 0.72rem;\n color: var(--mj-text-muted);\n}\n\n.modal-header-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.modal-close-btn[_ngcontent-%COMP%] {\n background: transparent;\n border: none;\n color: var(--mj-text-secondary);\n font-size: 1rem;\n cursor: pointer;\n padding: 4px;\n border-radius: 4px;\n}\n\n.modal-close-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n background-color: var(--mj-bg-surface-sunken);\n}\n\n.mj-modal-body[_ngcontent-%COMP%] {\n padding: 18px;\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.form-label[_ngcontent-%COMP%] {\n font-size: 0.78rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n\n.form-input[_ngcontent-%COMP%] {\n padding: 8px 12px;\n border-radius: var(--mj-radius-sm, 6px);\n border: 1px solid var(--mj-border-default);\n background-color: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 0.85rem;\n outline: none;\n}\n\n.form-input[_ngcontent-%COMP%]:focus {\n border-color: var(--mj-brand-primary);\n}\n\n.modal-body-text[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 0.85rem;\n color: var(--mj-text-primary);\n}\n\n.modal-warning-banner[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background-color: color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface));\n border: 1px solid var(--mj-status-warning);\n border-radius: var(--mj-radius-sm, 6px);\n font-size: 0.76rem;\n color: var(--mj-text-primary);\n}\n\n.mj-modal-footer[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 8px;\n padding: 12px 18px;\n border-top: 1px solid var(--mj-border-default);\n background-color: var(--mj-bg-surface-sunken);\n}\n\n\n\n.preview-modal-body[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: var(--mj-bg-surface-sunken);\n padding: 16px;\n overflow: hidden;\n}\n\n.preview-media-wrap[_ngcontent-%COMP%] {\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.preview-img[_ngcontent-%COMP%] {\n max-width: 100%;\n max-height: 100%;\n object-fit: contain;\n border-radius: var(--mj-radius-md, 8px);\n}\n\n.preview-iframe[_ngcontent-%COMP%] {\n width: 100%;\n height: 100%;\n border: none;\n border-radius: var(--mj-radius-md, 8px);\n}\n\n.preview-video[_ngcontent-%COMP%] {\n max-width: 100%;\n max-height: 100%;\n border-radius: var(--mj-radius-md, 8px);\n}\n\n.audio-preview-wrap[_ngcontent-%COMP%] {\n flex-direction: column;\n gap: 16px;\n}\n\n.preview-audio-icon[_ngcontent-%COMP%] {\n font-size: 3rem;\n color: var(--mj-brand-primary);\n}\n\n.preview-audio[_ngcontent-%COMP%] {\n width: 320px;\n}\n\n.preview-fallback[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n text-align: center;\n color: var(--mj-text-secondary);\n}\n\n.preview-fallback-icon[_ngcontent-%COMP%] {\n font-size: 3rem;\n color: var(--mj-text-muted);\n margin-bottom: 8px;\n}\n\n.preview-fallback[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 0.95rem;\n color: var(--mj-text-primary);\n}\n\n.preview-fallback[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 0.8rem;\n}\n\n.account-picker-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n max-height: 180px;\n overflow-y: auto;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-sm, 6px);\n padding: 6px;\n}\n\n.account-picker-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 8px;\n border-radius: 4px;\n cursor: pointer;\n}\n\n.account-picker-item[_ngcontent-%COMP%]:hover {\n background-color: var(--mj-bg-surface-sunken);\n}\n\n.picker-name[_ngcontent-%COMP%] {\n font-size: 0.82rem;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.picker-badge[_ngcontent-%COMP%] {\n margin-left: auto;\n font-size: 0.7rem;\n color: var(--mj-text-muted);\n}\n\n.copy-progress-indicator[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 0.78rem;\n color: var(--mj-brand-primary);\n margin-top: 8px;\n}"] });
2744
+ } }, dependencies: [i1.NgIf, i2.NgSelectOption, i2.ɵNgSelectMultipleOption, i2.DefaultValueAccessor, i2.SelectControlValueAccessor, i2.NgControlStatus, i2.NgModel, i3.LoadingComponent, i4.MJEmptyStateComponent], styles: ["\n\n\n\n\n[_nghost-%COMP%] {\n display: block;\n width: 100%;\n height: 100%;\n overflow: hidden;\n}\n\n.file-grid-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n background-color: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n position: relative;\n overflow: hidden;\n}\n\n\n\n\n\n.command-bar[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n padding: 10px 16px;\n background-color: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n flex-wrap: wrap;\n}\n\n.command-bar-left[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n min-width: 0;\n flex: 1;\n}\n\n.nav-btn-group[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n flex-shrink: 0;\n}\n\n.mj-tool-btn[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n min-width: 32px;\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: var(--mj-radius-sm, 6px);\n border: 1px solid var(--mj-border-default);\n background-color: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.mj-tool-btn[_ngcontent-%COMP%]:hover:not([disabled]) {\n background-color: color-mix(in srgb, var(--mj-text-primary) 6%, var(--mj-bg-surface));\n color: var(--mj-text-primary);\n border-color: var(--mj-brand-primary);\n}\n\n.mj-tool-btn[disabled][_ngcontent-%COMP%] {\n opacity: 0.4;\n cursor: not-allowed;\n background-color: transparent;\n}\n\n\n.breadcrumb-trail[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n overflow-x: auto;\n overflow-y: hidden;\n scrollbar-width: none;\n min-width: 0;\n padding: 2px 4px;\n}\n\n.breadcrumb-trail[_ngcontent-%COMP%]::-webkit-scrollbar {\n display: none;\n}\n\n.trail-root-icon[_ngcontent-%COMP%] {\n color: var(--mj-status-warning, #f59e0b);\n font-size: 0.95rem;\n margin-right: 2px;\n flex-shrink: 0;\n}\n\n.crumb-btn[_ngcontent-%COMP%] {\n background: transparent;\n border: none;\n color: var(--mj-text-secondary);\n font-size: 0.82rem;\n font-weight: 500;\n padding: 4px 8px;\n border-radius: var(--mj-radius-sm, 6px);\n cursor: pointer;\n white-space: nowrap;\n transition: all 0.12s ease;\n}\n\n.crumb-btn[_ngcontent-%COMP%]:hover {\n background-color: color-mix(in srgb, var(--mj-text-primary) 6%, var(--mj-bg-surface));\n color: var(--mj-text-primary);\n}\n\n.crumb-btn.current[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-weight: 600;\n background-color: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n.crumb-separator[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 0.75rem;\n}\n\n\n.command-bar-right[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-shrink: 0;\n}\n\n\n.search-pill[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n background-color: var(--mj-bg-surface-sunken, color-mix(in srgb, var(--mj-text-primary) 4%, var(--mj-bg-surface)));\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-full, 9999px);\n padding: 2px 10px;\n gap: 6px;\n transition: border-color 0.15s ease;\n}\n\n.search-pill[_ngcontent-%COMP%]:focus-within {\n border-color: var(--mj-brand-primary);\n}\n\n.search-icon[_ngcontent-%COMP%] {\n font-size: 0.78rem;\n color: var(--mj-text-muted);\n}\n\n.search-input[_ngcontent-%COMP%] {\n border: none;\n background: transparent;\n outline: none;\n font-size: 0.82rem;\n color: var(--mj-text-primary);\n width: 150px;\n padding: 4px 0;\n}\n\n.search-input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-muted);\n}\n\n.search-clear-btn[_ngcontent-%COMP%] {\n background: transparent;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n padding: 0 4px;\n font-size: 0.75rem;\n}\n\n.search-clear-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n}\n\n.type-filter-select[_ngcontent-%COMP%] {\n border: none;\n background: transparent;\n font-size: 0.76rem;\n color: var(--mj-text-secondary);\n outline: none;\n cursor: pointer;\n padding: 2px 4px;\n border-left: 1px solid var(--mj-border-default);\n}\n\n\n.mj-btn-search-toggle[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n background-color: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n color: var(--mj-text-secondary);\n font-size: 0.8rem;\n font-weight: 500;\n padding: 6px 12px;\n border-radius: var(--mj-radius-full, 9999px);\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.mj-btn-search-toggle[_ngcontent-%COMP%]:hover {\n background-color: color-mix(in srgb, var(--mj-text-primary) 6%, var(--mj-bg-surface));\n color: var(--mj-text-primary);\n}\n\n.mj-btn-search-toggle.active[_ngcontent-%COMP%] {\n background-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse, #ffffff);\n border-color: var(--mj-brand-primary);\n}\n\n\n.view-mode-toggle[_ngcontent-%COMP%] {\n display: flex;\n background-color: var(--mj-bg-surface-sunken, color-mix(in srgb, var(--mj-text-primary) 4%, var(--mj-bg-surface)));\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-sm, 6px);\n padding: 2px;\n gap: 2px;\n}\n\n.view-mode-btn[_ngcontent-%COMP%] {\n background: transparent;\n border: none;\n color: var(--mj-text-secondary);\n padding: 5px 8px;\n font-size: 0.8rem;\n border-radius: 4px;\n cursor: pointer;\n transition: all 0.12s ease;\n}\n\n.view-mode-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n}\n\n.view-mode-btn.active[_ngcontent-%COMP%] {\n background-color: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);\n}\n\n\n.mj-action-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n font-size: 0.82rem;\n font-weight: 500;\n border-radius: var(--mj-radius-sm, 6px);\n cursor: pointer;\n transition: all 0.15s ease;\n border: 1px solid transparent;\n white-space: nowrap;\n}\n\n.mj-action-btn--primary[_ngcontent-%COMP%] {\n background-color: var(--mj-brand-primary, #3b82f6);\n color: var(--mj-text-inverse, #ffffff);\n border-color: var(--mj-brand-primary, #3b82f6);\n}\n\n.mj-action-btn--primary[_ngcontent-%COMP%]:hover:not([disabled]) {\n background-color: color-mix(in srgb, var(--mj-brand-primary) 85%, var(--mj-text-primary, #000000));\n}\n\n.mj-action-btn--secondary[_ngcontent-%COMP%] {\n background-color: var(--mj-bg-surface);\n border-color: var(--mj-border-default);\n color: var(--mj-text-primary);\n}\n\n.mj-action-btn--secondary[_ngcontent-%COMP%]:hover:not([disabled]) {\n background-color: color-mix(in srgb, var(--mj-text-primary) 6%, var(--mj-bg-surface));\n}\n\n.mj-action-btn--danger[_ngcontent-%COMP%] {\n background-color: var(--mj-status-error, #ef4444);\n color: var(--mj-text-inverse, #ffffff);\n border-color: var(--mj-status-error, #ef4444);\n}\n\n.mj-action-btn--danger[_ngcontent-%COMP%]:hover:not([disabled]) {\n background-color: color-mix(in srgb, var(--mj-status-error, #ef4444) 85%, var(--mj-text-primary, #000000));\n}\n\n.mj-action-btn[disabled][_ngcontent-%COMP%] {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n\n\n\n\n.selection-bar[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 16px;\n background-color: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n border-bottom: 1px solid color-mix(in srgb, var(--mj-brand-primary) 25%, transparent);\n gap: 12px;\n flex-shrink: 0;\n animation: _ngcontent-%COMP%_slideDown 0.18s ease-out;\n}\n\n@keyframes _ngcontent-%COMP%_slideDown {\n from { transform: translateY(-100%); opacity: 0; }\n to { transform: translateY(0); opacity: 1; }\n}\n\n.selection-bar-left[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.selection-checkbox-wrap[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n user-select: none;\n}\n\n.selection-count[_ngcontent-%COMP%] {\n font-size: 0.82rem;\n font-weight: 600;\n color: var(--mj-brand-primary);\n}\n\n.selection-bar-right[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n flex-wrap: wrap;\n}\n\n.sel-action-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 4px 10px;\n font-size: 0.76rem;\n font-weight: 500;\n border-radius: var(--mj-radius-sm, 6px);\n background-color: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n color: var(--mj-text-primary);\n cursor: pointer;\n transition: all 0.12s ease;\n}\n\n.sel-action-btn[_ngcontent-%COMP%]:hover {\n background-color: color-mix(in srgb, var(--mj-text-primary) 6%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.sel-action-btn--danger[_ngcontent-%COMP%]:hover {\n background-color: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n border-color: var(--mj-status-error);\n color: var(--mj-status-error);\n}\n\n.sel-action-btn--ghost[_ngcontent-%COMP%] {\n background: transparent;\n border-color: transparent;\n}\n\n\n\n\n\n.multi-search-card[_ngcontent-%COMP%] {\n margin: 12px 16px;\n background-color: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-lg, 10px);\n box-shadow: var(--mj-shadow-md, 0 4px 12px rgba(0, 0, 0, 0.08));\n overflow: hidden;\n animation: _ngcontent-%COMP%_fadeIn 0.2s ease;\n}\n\n@keyframes _ngcontent-%COMP%_fadeIn {\n from { opacity: 0; transform: translateY(-6px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n.multi-search-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 16px;\n background-color: var(--mj-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.multi-search-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n color: var(--mj-brand-primary);\n}\n\n.multi-search-title[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 0.88rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.multi-search-body[_ngcontent-%COMP%] {\n padding: 14px 16px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.multi-search-bar[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.multi-search-text[_ngcontent-%COMP%] {\n flex: 1;\n padding: 8px 12px;\n border-radius: var(--mj-radius-sm, 6px);\n border: 1px solid var(--mj-border-default);\n background-color: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 0.85rem;\n outline: none;\n}\n\n.multi-search-text[_ngcontent-%COMP%]:focus {\n border-color: var(--mj-brand-primary);\n}\n\n.multi-search-accounts[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.account-select-label[_ngcontent-%COMP%] {\n font-size: 0.74rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n}\n\n.account-pill-list[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.account-select-pill[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n border-radius: var(--mj-radius-full, 9999px);\n border: 1px solid var(--mj-border-default);\n background-color: var(--mj-bg-surface-sunken);\n font-size: 0.76rem;\n cursor: pointer;\n transition: all 0.12s ease;\n}\n\n.account-select-pill.checked[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n background-color: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n.account-select-pill.disabled[_ngcontent-%COMP%] {\n opacity: 0.4;\n cursor: not-allowed;\n}\n\n.pill-account-name[_ngcontent-%COMP%] {\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.pill-provider-tag[_ngcontent-%COMP%] {\n font-size: 0.68rem;\n color: var(--mj-text-muted);\n}\n\n.pill-no-search[_ngcontent-%COMP%] {\n font-size: 0.68rem;\n color: var(--mj-status-warning);\n}\n\n\n.multi-search-results[_ngcontent-%COMP%] {\n border-top: 1px solid var(--mj-border-default);\n padding: 12px 16px;\n max-height: 400px;\n overflow-y: auto;\n}\n\n.results-meta-bar[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-bottom: 12px;\n font-size: 0.8rem;\n}\n\n.meta-count[_ngcontent-%COMP%] {\n color: var(--mj-text-primary);\n}\n\n.meta-stats[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n}\n\n.clear-results-btn[_ngcontent-%COMP%] {\n margin-left: auto;\n background: transparent;\n border: none;\n color: var(--mj-text-secondary);\n font-size: 0.76rem;\n cursor: pointer;\n}\n\n.clear-results-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n}\n\n.results-groups[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.result-group[_ngcontent-%COMP%] {\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-sm, 6px);\n overflow: hidden;\n}\n\n.result-group-head[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background-color: var(--mj-bg-surface-sunken);\n font-size: 0.8rem;\n}\n\n.group-account-name[_ngcontent-%COMP%] {\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.group-count-badge[_ngcontent-%COMP%] {\n margin-left: auto;\n background-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse, #ffffff);\n font-size: 0.7rem;\n font-weight: 600;\n padding: 1px 6px;\n border-radius: 9999px;\n}\n\n.group-error-badge[_ngcontent-%COMP%] {\n margin-left: auto;\n color: var(--mj-status-error);\n font-size: 0.72rem;\n}\n\n.result-items-grid[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n}\n\n.search-item-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 8px 12px;\n border-bottom: 1px solid var(--mj-border-default);\n font-size: 0.8rem;\n}\n\n.search-item-row[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n}\n\n.search-item-icon[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.search-item-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-width: 0;\n}\n\n.search-item-name[_ngcontent-%COMP%] {\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.search-item-path[_ngcontent-%COMP%] {\n font-size: 0.7rem;\n color: var(--mj-text-muted);\n}\n\n.search-item-size[_ngcontent-%COMP%], .search-item-date[_ngcontent-%COMP%] {\n font-size: 0.74rem;\n color: var(--mj-text-secondary);\n}\n\n.group-empty-text[_ngcontent-%COMP%] {\n padding: 12px;\n font-size: 0.78rem;\n color: var(--mj-text-muted);\n text-align: center;\n}\n\n\n\n\n\n.file-cards-grid[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(170px, 1fr));\n gap: 14px;\n align-content: start;\n}\n\n.file-card[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n background-color: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-lg, 10px);\n padding: 10px;\n cursor: pointer;\n transition: all 0.15s cubic-bezier(0.4, 0, 0.2, 1);\n position: relative;\n user-select: none;\n}\n\n.file-card[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary);\n box-shadow: var(--mj-shadow-md, 0 4px 12px rgba(0, 0, 0, 0.08));\n transform: translateY(-2px);\n}\n\n.file-card.selected[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n background-color: color-mix(in srgb, var(--mj-brand-primary) 6%, var(--mj-bg-surface));\n box-shadow: 0 0 0 1px var(--mj-brand-primary);\n}\n\n.file-card-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n height: 22px;\n margin-bottom: 6px;\n}\n\n.file-card-checkbox[_ngcontent-%COMP%] {\n cursor: pointer;\n}\n\n.file-card-quick-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 4px;\n opacity: 0;\n transition: opacity 0.15s ease;\n}\n\n.file-card[_ngcontent-%COMP%]:hover .file-card-quick-actions[_ngcontent-%COMP%] {\n opacity: 1;\n}\n\n.quick-action-btn[_ngcontent-%COMP%] {\n width: 22px;\n height: 22px;\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n color: var(--mj-text-secondary);\n font-size: 0.68rem;\n cursor: pointer;\n transition: all 0.12s ease;\n}\n\n.quick-action-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n}\n\n\n.file-card-icon-container[_ngcontent-%COMP%] {\n height: 74px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: var(--mj-radius-md, 8px);\n margin-bottom: 8px;\n font-size: 2rem;\n transition: transform 0.15s ease;\n}\n\n.file-card[_ngcontent-%COMP%]:hover .file-card-icon-container[_ngcontent-%COMP%] {\n transform: scale(1.04);\n}\n\n\n.file-card-body[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.file-card-name[_ngcontent-%COMP%] {\n font-size: 0.8rem;\n font-weight: 500;\n color: var(--mj-text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n line-height: 1.25;\n min-height: 2em;\n}\n\n.file-card-meta[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n font-size: 0.7rem;\n color: var(--mj-text-muted);\n}\n\n\n\n\n\n.file-table-container[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 8px 16px;\n}\n\n.file-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n font-size: 0.82rem;\n}\n\n.file-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n text-align: left;\n padding: 8px 10px;\n border-bottom: 1px solid var(--mj-border-default);\n color: var(--mj-text-muted);\n font-size: 0.72rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n user-select: none;\n cursor: pointer;\n}\n\n.file-table[_ngcontent-%COMP%] th.th-check[_ngcontent-%COMP%] {\n width: 32px;\n cursor: default;\n}\n\n.file-table[_ngcontent-%COMP%] th.th-actions[_ngcontent-%COMP%] {\n width: 70px;\n text-align: right;\n cursor: default;\n}\n\n.sort-arrow[_ngcontent-%COMP%] {\n margin-left: 4px;\n font-size: 0.65rem;\n}\n\n.file-table-row[_ngcontent-%COMP%] {\n border-bottom: 1px solid var(--mj-border-default);\n cursor: pointer;\n transition: background-color 0.12s ease;\n}\n\n.file-table-row[_ngcontent-%COMP%]:hover {\n background-color: color-mix(in srgb, var(--mj-brand-primary) 4%, var(--mj-bg-surface));\n}\n\n.file-table-row.selected[_ngcontent-%COMP%] {\n background-color: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n.file-table-row[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 8px 10px;\n vertical-align: middle;\n}\n\n.row-name-wrap[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n min-width: 0;\n}\n\n.row-icon-badge[_ngcontent-%COMP%] {\n width: 28px;\n height: 28px;\n min-width: 28px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: var(--mj-radius-sm, 6px);\n font-size: 0.9rem;\n}\n\n.row-file-name[_ngcontent-%COMP%] {\n font-weight: 500;\n color: var(--mj-text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.type-badge[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 2px 6px;\n border-radius: 4px;\n background-color: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n font-size: 0.7rem;\n}\n\n.size-text[_ngcontent-%COMP%], .date-text[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n font-size: 0.76rem;\n white-space: nowrap;\n}\n\n.row-action-buttons[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 4px;\n opacity: 0;\n transition: opacity 0.12s ease;\n}\n\n.file-table-row[_ngcontent-%COMP%]:hover .row-action-buttons[_ngcontent-%COMP%] {\n opacity: 1;\n}\n\n.row-act-btn[_ngcontent-%COMP%] {\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n color: var(--mj-text-secondary);\n font-size: 0.7rem;\n cursor: pointer;\n}\n\n.row-act-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n}\n\n\n\n\n\n.mj-file-thumb--folder[_ngcontent-%COMP%] {\n background-color: color-mix(in srgb, var(--mj-status-warning, #f59e0b) 14%, transparent);\n color: var(--mj-status-warning, #f59e0b);\n}\n\n.mj-file-thumb--pdf[_ngcontent-%COMP%] {\n background-color: color-mix(in srgb, var(--mj-status-error, #ef4444) 14%, transparent);\n color: var(--mj-status-error, #ef4444);\n}\n\n.mj-file-thumb--image[_ngcontent-%COMP%] {\n background-color: color-mix(in srgb, var(--mj-media-image, #8b5cf6) 14%, transparent);\n color: var(--mj-media-image, #8b5cf6);\n}\n\n.mj-file-thumb--video[_ngcontent-%COMP%] {\n background-color: color-mix(in srgb, var(--mj-brand-primary, #3b82f6) 14%, transparent);\n color: var(--mj-brand-primary, #3b82f6);\n}\n\n.mj-file-thumb--audio[_ngcontent-%COMP%] {\n background-color: color-mix(in srgb, var(--mj-status-warning, #f59e0b) 14%, transparent);\n color: var(--mj-status-warning, #f59e0b);\n}\n\n.mj-file-thumb--code[_ngcontent-%COMP%] {\n background-color: color-mix(in srgb, var(--mj-status-success, #10b981) 14%, transparent);\n color: var(--mj-status-success, #10b981);\n}\n\n.mj-file-thumb--text[_ngcontent-%COMP%] {\n background-color: color-mix(in srgb, var(--mj-text-muted, #6b7280) 14%, transparent);\n color: var(--mj-text-muted, #6b7280);\n}\n\n.mj-file-thumb--document[_ngcontent-%COMP%] {\n background-color: color-mix(in srgb, var(--mj-brand-primary-hover, #2563eb) 14%, transparent);\n color: var(--mj-brand-primary-hover, #2563eb);\n}\n\n\n\n\n\n.status-bar[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 6px 16px;\n background-color: var(--mj-bg-surface-sunken, color-mix(in srgb, var(--mj-text-primary) 3%, var(--mj-bg-surface)));\n border-top: 1px solid var(--mj-border-default);\n font-size: 0.72rem;\n color: var(--mj-text-secondary);\n flex-shrink: 0;\n}\n\n.status-account-badge[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n color: var(--mj-brand-primary);\n font-weight: 500;\n}\n\n\n\n\n\n.drag-drop-overlay[_ngcontent-%COMP%] {\n position: absolute;\n inset: 0;\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, rgba(255, 255, 255, 0.9));\n backdrop-filter: blur(4px);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 100;\n pointer-events: none;\n}\n\n.drag-drop-content[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 32px 48px;\n background-color: var(--mj-bg-surface);\n border: 2px dashed var(--mj-brand-primary);\n border-radius: var(--mj-radius-lg, 12px);\n box-shadow: var(--mj-shadow-lg, 0 10px 25px rgba(0, 0, 0, 0.15));\n}\n\n.drag-icon[_ngcontent-%COMP%] {\n font-size: 3rem;\n color: var(--mj-brand-primary);\n margin-bottom: 12px;\n}\n\n.drag-drop-content[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0 0 6px 0;\n font-size: 1.1rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.drag-drop-content[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 0.8rem;\n color: var(--mj-text-secondary);\n}\n\n.upload-progress-bar-wrap[_ngcontent-%COMP%] {\n position: absolute;\n bottom: 36px;\n right: 20px;\n z-index: 90;\n}\n\n.upload-progress-card[_ngcontent-%COMP%] {\n background-color: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md, 8px);\n padding: 10px 14px;\n box-shadow: var(--mj-shadow-lg, 0 8px 20px rgba(0, 0, 0, 0.15));\n width: 260px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.upload-info[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.upload-spinner[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.upload-text[_ngcontent-%COMP%] {\n font-size: 0.78rem;\n font-weight: 500;\n color: var(--mj-text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.progress-track[_ngcontent-%COMP%] {\n height: 4px;\n background-color: var(--mj-bg-surface-sunken);\n border-radius: 9999px;\n overflow: hidden;\n}\n\n.progress-fill[_ngcontent-%COMP%] {\n height: 100%;\n background-color: var(--mj-brand-primary);\n transition: width 0.15s ease;\n}\n\n.grid-loading-container[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n flex: 1;\n}\n\n\n\n\n\n.mj-modal-backdrop[_ngcontent-%COMP%] {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.5);\n backdrop-filter: blur(4px);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1050;\n padding: 20px;\n animation: _ngcontent-%COMP%_modalFadeIn 0.18s ease-out;\n}\n\n@keyframes _ngcontent-%COMP%_modalFadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n.mj-modal-window[_ngcontent-%COMP%] {\n background-color: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-lg, 12px);\n box-shadow: var(--mj-shadow-xl, 0 20px 35px rgba(0, 0, 0, 0.25));\n width: 100%;\n max-width: 500px;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n}\n\n.mj-modal-window.modal-compact[_ngcontent-%COMP%] {\n max-width: 420px;\n}\n\n.mj-modal-window.preview-modal-window[_ngcontent-%COMP%] {\n max-width: 850px;\n max-height: 85vh;\n height: 80vh;\n}\n\n.mj-modal-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 18px;\n border-bottom: 1px solid var(--mj-border-default);\n background-color: var(--mj-bg-surface);\n}\n\n.modal-title-wrap[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.modal-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 0.95rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.modal-subtitle[_ngcontent-%COMP%] {\n font-size: 0.72rem;\n color: var(--mj-text-muted);\n}\n\n.modal-header-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.modal-close-btn[_ngcontent-%COMP%] {\n background: transparent;\n border: none;\n color: var(--mj-text-secondary);\n font-size: 1rem;\n cursor: pointer;\n padding: 4px;\n border-radius: 4px;\n}\n\n.modal-close-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n background-color: var(--mj-bg-surface-sunken);\n}\n\n.mj-modal-body[_ngcontent-%COMP%] {\n padding: 18px;\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.form-label[_ngcontent-%COMP%] {\n font-size: 0.78rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n\n.form-input[_ngcontent-%COMP%] {\n padding: 8px 12px;\n border-radius: var(--mj-radius-sm, 6px);\n border: 1px solid var(--mj-border-default);\n background-color: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 0.85rem;\n outline: none;\n}\n\n.form-input[_ngcontent-%COMP%]:focus {\n border-color: var(--mj-brand-primary);\n}\n\n.modal-body-text[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 0.85rem;\n color: var(--mj-text-primary);\n}\n\n.modal-warning-banner[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background-color: color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface));\n border: 1px solid var(--mj-status-warning);\n border-radius: var(--mj-radius-sm, 6px);\n font-size: 0.76rem;\n color: var(--mj-text-primary);\n}\n\n.mj-modal-footer[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 8px;\n padding: 12px 18px;\n border-top: 1px solid var(--mj-border-default);\n background-color: var(--mj-bg-surface-sunken);\n}\n\n\n.preview-modal-body[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: var(--mj-bg-surface-sunken);\n padding: 16px;\n overflow: hidden;\n}\n\n.preview-media-wrap[_ngcontent-%COMP%] {\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.preview-img[_ngcontent-%COMP%] {\n max-width: 100%;\n max-height: 100%;\n object-fit: contain;\n border-radius: var(--mj-radius-md, 8px);\n}\n\n.preview-iframe[_ngcontent-%COMP%] {\n width: 100%;\n height: 100%;\n border: none;\n border-radius: var(--mj-radius-md, 8px);\n}\n\n.preview-video[_ngcontent-%COMP%] {\n max-width: 100%;\n max-height: 100%;\n border-radius: var(--mj-radius-md, 8px);\n}\n\n.audio-preview-wrap[_ngcontent-%COMP%] {\n flex-direction: column;\n gap: 16px;\n}\n\n.preview-audio-icon[_ngcontent-%COMP%] {\n font-size: 3rem;\n color: var(--mj-brand-primary);\n}\n\n.preview-audio[_ngcontent-%COMP%] {\n width: 320px;\n}\n\n.preview-fallback[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n text-align: center;\n color: var(--mj-text-secondary);\n}\n\n.preview-fallback-icon[_ngcontent-%COMP%] {\n font-size: 3rem;\n color: var(--mj-text-muted);\n margin-bottom: 8px;\n}\n\n.preview-fallback[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 0.95rem;\n color: var(--mj-text-primary);\n}\n\n.preview-fallback[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 0.8rem;\n}\n\n.account-picker-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n max-height: 180px;\n overflow-y: auto;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-sm, 6px);\n padding: 6px;\n}\n\n.account-picker-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 8px;\n border-radius: 4px;\n cursor: pointer;\n}\n\n.account-picker-item[_ngcontent-%COMP%]:hover {\n background-color: var(--mj-bg-surface-sunken);\n}\n\n.picker-name[_ngcontent-%COMP%] {\n font-size: 0.82rem;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.picker-badge[_ngcontent-%COMP%] {\n margin-left: auto;\n font-size: 0.7rem;\n color: var(--mj-text-muted);\n}\n\n.copy-progress-indicator[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 0.78rem;\n color: var(--mj-brand-primary);\n margin-top: 8px;\n}"] });
2745
2745
  }
2746
2746
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(FileGridComponent, [{
2747
2747
  type: Component,