body { padding: 0; margin: 0; font-family: var(--vscode-font-family); color: var(--vscode-foreground); } .container { display: flex; height: 100vh; gap: 0; background: var(--vscode-panel-border); position: relative; } /* Left panel - Pattern list */ .pattern-list-panel { flex: 0 0 300px; min-width: 200px; max-width: 600px; background: var(--vscode-sideBar-background); display: flex; flex-direction: column; } /* Resize Handle */ .resize-handle { flex: 0 0 4px; background: var(--vscode-panel-border); cursor: ew-resize; position: relative; user-select: none; } .resize-handle:hover { background: var(--vscode-focusBorder); } .resize-handle.resizing { background: var(--vscode-focusBorder); } .search-box { padding: 8px; background: var(--vscode-sideBar-background); border-bottom: 1px solid var(--vscode-panel-border); position: relative; } .search-wrapper { position: relative; display: flex; align-items: center; } .search-icon { position: absolute; left: 8px; pointer-events: none; color: var(--vscode-input-placeholderForeground); font-size: 14px; } .search-input { width: 100%; padding: 6px 30px 6px 30px; background: var(--vscode-input-background); color: var(--vscode-input-foreground); border: 1px solid var(--vscode-input-border); border-radius: 2px; font-size: 13px; box-sizing: border-box; } .search-input:focus { outline: none; border-color: var(--vscode-focusBorder); } .search-clear { position: absolute; right: 6px; padding: 4px; background: transparent; border: none; cursor: pointer; color: var(--vscode-input-placeholderForeground); border-radius: 3px; display: none; align-items: center; justify-content: center; width: 20px; height: 20px; transition: all 0.15s ease; } .search-clear:hover { background: var(--vscode-toolbar-hoverBackground); color: var(--vscode-foreground); } .search-clear.visible { display: flex; } .search-clear .codicon { font-size: 12px; } .pattern-list { flex: 1; overflow-y: auto; padding: 4px; } .section-header { padding: 8px 12px; font-weight: 600; font-size: 11px; text-transform: uppercase; color: var(--vscode-foreground); opacity: 0.6; letter-spacing: 0.5px; margin-top: 8px; display: flex; align-items: center; justify-content: space-between; user-select: none; } .section-header-left { display: flex; align-items: center; gap: 6px; cursor: pointer; flex: 1; } .add-pattern-btn { padding: 4px; background: transparent; border: none; cursor: pointer; color: var(--vscode-foreground); opacity: 0.6; border-radius: 3px; display: flex; align-items: center; justify-content: center; width: 20px; height: 20px; transition: all 0.15s ease; } .add-pattern-btn:hover { background: var(--vscode-toolbar-hoverBackground); opacity: 1; } .add-pattern-btn .codicon { font-size: 14px; } .section-header:hover { opacity: 0.8; } .section-header:first-child { margin-top: 0; } .section-header .codicon { font-size: 14px; transition: transform 0.1s ease; } .section-header.collapsed .codicon { transform: rotate(-90deg); } .section-content { max-height: 10000px; overflow: hidden; transition: max-height 0.15s ease; } .section-content.collapsed { max-height: 0; } .empty-state { display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 48px 24px; color: var(--vscode-descriptionForeground); text-align: center; font-size: 14px; } .empty-state-section { padding: 16px; text-align: center; color: var(--vscode-descriptionForeground); font-size: 13px; opacity: 0.8; } .pattern-item { padding: 8px 12px; cursor: pointer; border-radius: 3px; margin-bottom: 2px; display: flex; align-items: center; gap: 8px; position: relative; } .pattern-item:hover { background: var(--vscode-list-hoverBackground); } .pattern-item:hover .pattern-actions { opacity: 1; } .pattern-item.selected { background: var(--vscode-list-activeSelectionBackground); color: var(--vscode-list-activeSelectionForeground); } .pattern-info { flex: 1; min-width: 0; } .pattern-name { font-weight: 500; margin-bottom: 2px; } .pattern-preview { font-size: 12px; opacity: 0.8; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .pattern-item-invalid { border-left: 2px solid var(--vscode-errorForeground); opacity: 0.8; } .pattern-item-invalid .pattern-name .codicon-warning { color: var(--vscode-errorForeground); margin-left: 4px; font-size: 13px; vertical-align: middle; } .pattern-item-invalid .pattern-preview { color: var(--vscode-errorForeground); } .pattern-item-invalid .pattern-preview em { font-style: italic; opacity: 0.7; } /* Action buttons */ .pattern-actions { display: flex; gap: 4px; opacity: 0; transition: opacity 0.15s ease; } .action-btn { padding: 4px; background: transparent; border: none; cursor: pointer; color: var(--vscode-foreground); opacity: 0.7; border-radius: 3px; display: flex; align-items: center; justify-content: center; width: 24px; height: 24px; } .action-btn:hover { background: var(--vscode-toolbar-hoverBackground); opacity: 1; } .action-btn .codicon { font-size: 16px; } .action-btn.delete:hover { color: var(--vscode-errorForeground); } .action-btn.load:hover { color: var(--vscode-textLink-foreground); } /* Right panel - Edit form */ .edit-panel { flex: 1; background: var(--vscode-editor-background); overflow-y: auto; padding: 16px; } .edit-empty-state { display: flex; flex-direction: column; align-items: center; justify-content: center; height: 100%; opacity: 0.5; text-align: center; padding: 40px 20px; } .edit-empty-state .codicon { font-size: 64px; margin-bottom: 16px; opacity: 0.6; } .edit-empty-state p { margin: 4px 0; font-size: 14px; } .edit-empty-state .hint { font-size: 12px; opacity: 0.7; } .edit-form { display: none; } .edit-form.active { display: block; } .edit-form-header { display: flex; align-items: center; gap: 8px; margin-bottom: 12px; } .edit-form h2 { font-size: 13px; font-weight: 600; margin: 0; text-transform: uppercase; opacity: 0.8; white-space: nowrap; } .form-input-inline { flex: 1; padding: 4px 6px; background: var(--vscode-input-background); color: var(--vscode-input-foreground); border: 1px solid var(--vscode-input-border); border-radius: 2px; font-size: 13px; font-family: var(--vscode-editor-font-family); box-sizing: border-box; } .form-input-inline:focus { outline: none; border-color: var(--vscode-focusBorder); } .form-group { margin-bottom: 12px; } .form-label { display: block; margin-bottom: 3px; font-weight: 500; font-size: 11px; opacity: 0.8; text-transform: uppercase; } .form-label-with-options { display: flex; align-items: center; justify-content: space-between; margin-bottom: 3px; } .form-label-with-options .form-label { margin-bottom: 0; } .form-input, .form-textarea { width: 100%; padding: 4px 6px; background: var(--vscode-input-background); color: var(--vscode-input-foreground); border: 1px solid var(--vscode-input-border); border-radius: 2px; font-size: 13px; font-family: var(--vscode-editor-font-family); box-sizing: border-box; } .form-input:focus, .form-textarea:focus { outline: none; border-color: var(--vscode-focusBorder); } .form-input.error, .form-textarea.error { border-color: var(--vscode-errorForeground); } .form-input.dirty, .form-input-inline.dirty, .form-textarea.dirty { box-shadow: 0 0 0 1px rgba(106, 153, 85, 0.6); } .form-textarea { min-height: 60px; resize: vertical; font-family: var(--vscode-editor-font-family); } .validation-error { display: none; color: var(--vscode-errorForeground); font-size: 11px; margin-top: 3px; } .validation-error.visible { display: block; } .checkbox-group-icons { display: flex; gap: 4px; } .toggle-btn { padding: 4px 8px; background: var(--vscode-button-secondaryBackground); color: var(--vscode-button-secondaryForeground); border: 1px solid transparent; border-radius: 2px; cursor: pointer; display: flex; align-items: center; justify-content: center; transition: all 0.15s ease; min-width: 28px; height: 24px; } .toggle-btn:hover { background: var(--vscode-button-secondaryHoverBackground); } .toggle-btn.active { background: var(--vscode-button-background); color: var(--vscode-button-foreground); border-color: var(--vscode-focusBorder); } .toggle-btn.dirty { border-color: #6a9955; } .toggle-btn.active.dirty { background: var(--vscode-button-background); color: var(--vscode-button-foreground); border-color: #6a9955; } .toggle-btn .codicon { font-size: 14px; } .button-group { display: flex; gap: 6px; margin-top: 16px; padding-top: 12px; border-top: 1px solid var(--vscode-panel-border); } button { padding: 5px 12px; background: var(--vscode-button-background); color: var(--vscode-button-foreground); border: none; border-radius: 2px; cursor: pointer; font-size: 12px; } button:hover { background: var(--vscode-button-hoverBackground); } button.secondary { background: var(--vscode-button-secondaryBackground); color: var(--vscode-button-secondaryForeground); } button.secondary:hover { background: var(--vscode-button-secondaryHoverBackground); } .dirty-indicator { margin-left: 6px; color: var(--vscode-editorWarning-foreground); font-size: 8px; animation: pulse 2s ease-in-out infinite; width: 8px; display: inline-block; visibility: hidden; } @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } } @keyframes pulseBorder { 0%, 100% { border-color: #4ec9b0; } 50% { border-color: #dcdcaa; } }