- Add API endpoint and handler to delete collections - Introduce LoadingSpinner component for async operations - Show loading spinners during file loading and preview rendering - Enhance modal accessibility by removing aria-hidden attribute - Refactor delete functionality to distinguish between collections and files/folders - Remove unused collection definitions from config
		
			
				
	
	
		
			344 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			CSS
		
	
	
	
	
	
			
		
		
	
	
			344 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			CSS
		
	
	
	
	
	
| /* Base layout styles */
 | |
| html,
 | |
| body {
 | |
|     height: 100vh;
 | |
|     margin: 0;
 | |
|     padding: 0;
 | |
|     overflow: hidden;
 | |
|     /* Prevent page-level scrolling */
 | |
|     font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Noto Sans', Helvetica, Arial, sans-serif;
 | |
|     background-color: var(--bg-primary);
 | |
|     color: var(--text-primary);
 | |
|     transition: background-color 0.3s ease, color 0.3s ease;
 | |
| }
 | |
| 
 | |
| body {
 | |
|     display: flex;
 | |
|     flex-direction: column;
 | |
| }
 | |
| 
 | |
| /* Column Resizer */
 | |
| .column-resizer {
 | |
|     width: 1px;
 | |
|     background-color: var(--border-color);
 | |
|     cursor: col-resize;
 | |
|     transition: background-color 0.2s ease, width 0.2s ease, box-shadow 0.2s ease;
 | |
|     user-select: none;
 | |
|     flex-shrink: 0;
 | |
|     padding: 0 3px;
 | |
|     /* Add invisible padding for easier grab */
 | |
|     margin: 0 -3px;
 | |
|     /* Compensate for padding */
 | |
|     height: 100%;
 | |
|     /* Take full height of parent */
 | |
|     align-self: stretch;
 | |
|     /* Ensure it stretches to full height */
 | |
| }
 | |
| 
 | |
| .column-resizer:hover {
 | |
|     background-color: var(--link-color);
 | |
|     width: 1px;
 | |
|     box-shadow: 0 0 6px rgba(13, 110, 253, 0.3);
 | |
|     /* Visual feedback instead of width change */
 | |
| }
 | |
| 
 | |
| .column-resizer.dragging {
 | |
|     background-color: var(--link-color);
 | |
|     box-shadow: 0 0 8px rgba(13, 110, 253, 0.5);
 | |
| }
 | |
| 
 | |
| .column-resizer.dragging {
 | |
|     background-color: var(--link-color);
 | |
| }
 | |
| 
 | |
| /* Navbar */
 | |
| .navbar {
 | |
|     background-color: var(--bg-secondary);
 | |
|     border-bottom: 1px solid var(--border-color);
 | |
|     transition: background-color 0.3s ease;
 | |
|     flex-shrink: 0;
 | |
|     /* Prevent navbar from shrinking */
 | |
|     padding: 0.5rem 1rem;
 | |
| }
 | |
| 
 | |
| .navbar .container-fluid {
 | |
|     display: flex;
 | |
|     flex-direction: row;
 | |
|     align-items: center;
 | |
|     justify-content: space-between;
 | |
|     padding: 0;
 | |
|     overflow: visible;
 | |
|     /* Override the hidden overflow for navbar */
 | |
| }
 | |
| 
 | |
| .navbar-brand {
 | |
|     color: var(--text-primary) !important;
 | |
|     font-weight: 600;
 | |
|     font-size: 1.1rem;
 | |
|     margin: 0;
 | |
|     flex-shrink: 0;
 | |
| }
 | |
| 
 | |
| .navbar-brand i {
 | |
|     font-size: 1.2rem;
 | |
|     margin-right: 0.5rem;
 | |
| }
 | |
| 
 | |
| .navbar-center {
 | |
|     flex: 1;
 | |
|     display: flex;
 | |
|     justify-content: center;
 | |
|     align-items: center;
 | |
| }
 | |
| 
 | |
| .navbar-right {
 | |
|     flex-shrink: 0;
 | |
| }
 | |
| 
 | |
| /* Adjust container for flex layout */
 | |
| .container-fluid {
 | |
|     flex: 1;
 | |
|     /* Take remaining space after navbar */
 | |
|     padding: 0;
 | |
|     overflow: hidden;
 | |
|     /* Prevent container scrolling */
 | |
|     display: flex;
 | |
|     flex-direction: column;
 | |
| }
 | |
| 
 | |
| .row {
 | |
|     width: 100%;
 | |
|     display: flex;
 | |
|     flex-direction: row;
 | |
|     margin: 0;
 | |
|     height: 100%;
 | |
|     overflow: hidden;
 | |
|     /* Prevent row scrolling */
 | |
| }
 | |
| 
 | |
| #sidebarPane {
 | |
|     flex: 0 0 20%;
 | |
|     min-width: 150px;
 | |
|     max-width: 20%;
 | |
|     padding: 0;
 | |
|     height: 100%;
 | |
|     overflow: hidden;
 | |
|     /* Prevent pane scrolling */
 | |
|     transition: flex 0.3s ease, min-width 0.3s ease, max-width 0.3s ease;
 | |
| }
 | |
| 
 | |
| /* Collapsed sidebar state - mini sidebar */
 | |
| #sidebarPane.collapsed {
 | |
|     flex: 0 0 50px;
 | |
|     min-width: 50px;
 | |
|     max-width: 50px;
 | |
|     border-right: 1px solid var(--border-color);
 | |
|     position: relative;
 | |
|     cursor: pointer;
 | |
| }
 | |
| 
 | |
| /* Hide file tree content when collapsed */
 | |
| #sidebarPane.collapsed #fileTree {
 | |
|     display: none;
 | |
| }
 | |
| 
 | |
| /* Hide collection selector when collapsed */
 | |
| #sidebarPane.collapsed .collection-selector {
 | |
|     display: none;
 | |
| }
 | |
| 
 | |
| /* Visual indicator in the mini sidebar */
 | |
| #sidebarPane.collapsed::before {
 | |
|     content: '';
 | |
|     display: block;
 | |
|     width: 100%;
 | |
|     height: 100%;
 | |
|     background: var(--bg-secondary);
 | |
|     transition: background 0.2s ease;
 | |
| }
 | |
| 
 | |
| /* Hover effect on mini sidebar */
 | |
| #sidebarPane.collapsed:hover::before {
 | |
|     background: var(--hover-bg);
 | |
| }
 | |
| 
 | |
| /* Right arrow icon in the center of mini sidebar */
 | |
| #sidebarPane.collapsed::after {
 | |
|     content: '\F285';
 | |
|     /* Bootstrap icon chevron-right */
 | |
|     font-family: 'bootstrap-icons';
 | |
|     position: absolute;
 | |
|     top: 50%;
 | |
|     left: 50%;
 | |
|     transform: translate(-50%, -50%);
 | |
|     font-size: 20px;
 | |
|     color: var(--text-secondary);
 | |
|     pointer-events: none;
 | |
|     opacity: 0.5;
 | |
|     transition: opacity 0.2s ease;
 | |
|     cursor: pointer;
 | |
| }
 | |
| 
 | |
| #sidebarPane.collapsed:hover::after {
 | |
|     opacity: 1;
 | |
| }
 | |
| 
 | |
| #editorPane {
 | |
|     flex: 1 1 40%;
 | |
|     min-width: 250px;
 | |
|     max-width: 70%;
 | |
|     padding: 0;
 | |
|     display: flex;
 | |
|     flex-direction: column;
 | |
|     height: 100%;
 | |
|     overflow: hidden;
 | |
|     /* Prevent pane scrolling */
 | |
| }
 | |
| 
 | |
| /* Sidebar - improved */
 | |
| .sidebar {
 | |
|     background-color: var(--bg-secondary);
 | |
|     border-right: 1px solid var(--border-color);
 | |
|     height: 100%;
 | |
|     transition: background-color 0.3s ease;
 | |
|     display: flex;
 | |
|     flex-direction: column;
 | |
|     overflow: hidden;
 | |
|     /* Prevent sidebar container scrolling */
 | |
| }
 | |
| 
 | |
| .sidebar h6 {
 | |
|     margin: 12px 8px 6px;
 | |
|     font-size: 11px;
 | |
|     font-weight: 600;
 | |
|     color: var(--text-secondary);
 | |
|     text-transform: uppercase;
 | |
|     letter-spacing: 0.5px;
 | |
|     flex-shrink: 0;
 | |
|     /* Prevent header from shrinking */
 | |
| }
 | |
| 
 | |
| /* Collection selector - fixed height */
 | |
| .collection-selector {
 | |
|     flex-shrink: 0;
 | |
|     /* Prevent selector from shrinking */
 | |
|     padding: 12px 10px;
 | |
|     background-color: var(--bg-secondary);
 | |
| }
 | |
| 
 | |
| #fileTree {
 | |
|     flex: 1;
 | |
|     /* Take remaining space */
 | |
|     overflow-y: auto;
 | |
|     /* Enable vertical scrolling */
 | |
|     overflow-x: hidden;
 | |
|     padding: 4px 10px;
 | |
|     min-height: 0;
 | |
|     /* Important: allows flex child to shrink below content size */
 | |
| }
 | |
| 
 | |
| /* Scrollbar styling */
 | |
| ::-webkit-scrollbar {
 | |
|     width: 10px;
 | |
|     height: 10px;
 | |
| }
 | |
| 
 | |
| ::-webkit-scrollbar-track {
 | |
|     background: var(--bg-secondary);
 | |
| }
 | |
| 
 | |
| ::-webkit-scrollbar-thumb {
 | |
|     background: var(--border-color);
 | |
|     border-radius: 5px;
 | |
| }
 | |
| 
 | |
| ::-webkit-scrollbar-thumb:hover {
 | |
|     background: var(--text-secondary);
 | |
| }
 | |
| 
 | |
| 
 | |
| /* Preview Pane Styling */
 | |
| #previewPane {
 | |
|     min-width: 250px;
 | |
|     max-width: 70%;
 | |
|     padding: 0;
 | |
|     background-color: var(--bg-primary);
 | |
|     border-left: 1px solid var(--border-color);
 | |
|     flex: 1;
 | |
|     height: 100%;
 | |
|     overflow-y: auto;
 | |
|     /* Enable vertical scrolling for preview pane */
 | |
|     overflow-x: hidden;
 | |
| }
 | |
| 
 | |
| #preview {
 | |
|     padding: 20px;
 | |
|     overflow-wrap: break-word;
 | |
|     word-wrap: break-word;
 | |
|     color: var(--text-primary);
 | |
|     min-height: 100%;
 | |
|     /* Ensure content fills at least the full height */
 | |
| }
 | |
| 
 | |
| #preview>p:first-child {
 | |
|     margin-top: 0;
 | |
| }
 | |
| 
 | |
| #preview>h1:first-child,
 | |
| #preview>h2:first-child {
 | |
|     margin-top: 0;
 | |
| }
 | |
| 
 | |
| /* Iframe styles in preview - minimal defaults that can be overridden */
 | |
| #preview iframe {
 | |
|     border: none;
 | |
|     /* Default to no border, can be overridden by inline styles */
 | |
|     display: block;
 | |
|     /* Prevent inline spacing issues */
 | |
| }
 | |
| 
 | |
| /* View Mode Styles */
 | |
| body.view-mode #editorPane {
 | |
|     display: none;
 | |
| }
 | |
| 
 | |
| body.view-mode #resizer1 {
 | |
|     display: none;
 | |
| }
 | |
| 
 | |
| body.view-mode #resizer2 {
 | |
|     display: none;
 | |
| }
 | |
| 
 | |
| body.view-mode #previewPane {
 | |
|     max-width: 100%;
 | |
|     min-width: auto;
 | |
| }
 | |
| 
 | |
| body.view-mode #sidebarPane {
 | |
|     display: flex;
 | |
|     flex: 0 0 20%;
 | |
|     height: 100%;
 | |
|     /* Keep sidebar at 20% width in view mode */
 | |
| }
 | |
| 
 | |
| body.edit-mode #editorPane {
 | |
|     display: flex;
 | |
| }
 | |
| 
 | |
| body.edit-mode #resizer1 {
 | |
|     display: block;
 | |
| }
 | |
| 
 | |
| body.edit-mode #resizer2 {
 | |
|     display: block;
 | |
| }
 | |
| 
 | |
| body.edit-mode #previewPane {
 | |
|     max-width: 70%;
 | |
| }
 | |
| 
 | |
| body.edit-mode #sidebarPane {
 | |
|     display: flex;
 | |
|     height: 100%;
 | |
| } |