diff --git a/src/renderer/pages/PicGoSetting.vue b/src/renderer/pages/PicGoSetting.vue index 98e46571..5a0df8df 100644 --- a/src/renderer/pages/PicGoSetting.vue +++ b/src/renderer/pages/PicGoSetting.vue @@ -2425,7 +2425,7 @@ function handleLanguageChange(val: string) { setCurrentLanguage(val) saveConfig({ [configPaths.settings.language]: val }) localStorage.setItem('currentLanguage', val) - // updatePicBedGlobal() + updatePicBeds() } function handleStartModeChange(val: string) { diff --git a/src/renderer/pages/css/PluginPage.css b/src/renderer/pages/css/PluginPage.css index f6f50fef..dececedd 100644 --- a/src/renderer/pages/css/PluginPage.css +++ b/src/renderer/pages/css/PluginPage.css @@ -1,824 +1,824 @@ -/* Global scrolling behavior */ -html, body { - overflow-x: hidden; -} - -/* Container */ -.plugin-container { - display: flex; - overflow-y: auto; - margin: 0; - padding: 1rem; - width: 100%; - min-height: 100vh; - flex-direction: column; - gap: 1.25rem; - box-sizing: border-box; -} - -/* Card Base */ -.plugin-card { - overflow: hidden; - border: 1px solid var(--color-border-secondary); - border-radius: var(--radius-xl); - background: var(--color-surface); - box-shadow: var(--shadow-sm); - transition: var(--transition-medium); -} - -.plugin-card:hover { - border-color: var(--color-border); - box-shadow: var(--shadow-md); -} - -/* Header Card */ -.header-card .card-header { - display: flex; - justify-content: space-between; - align-items: center; - border-bottom: 1px solid var(--color-border-secondary); - padding: 1rem 1.5rem; - flex-wrap: wrap; - gap: 1rem; -} - -.header-content { - display: flex; - align-items: center; - gap: 1rem; - flex: 1; -} - -.header-icon { - display: flex; - align-items: center; - color: var(--color-accent); -} - -.header-content h1 { - margin: 0; - font-size: 1.5rem; - font-weight: 600; - color: var(--color-text-primary); - letter-spacing: -0.025em; -} - -.header-content p { - margin: 0; - font-size: 0.875rem; - color: var(--color-text-secondary); -} - -.header-actions { - display: flex; - align-items: center; - gap: 0.75rem; - flex-wrap: wrap; -} - -.action-button { - display: flex; - align-items: center; - border: none; - border-radius: var(--radius-md); - padding: 0.625rem 1rem; - font-size: 0.875rem; - font-family: inherit; - font-weight: 500; - color: white; - background: var(--color-accent); - transition: var(--transition-fast); - gap: 0.5rem; - cursor: pointer; -} - -.action-button:hover { - background: var(--color-accent-hover); - transform: translateY(-1px); - box-shadow: var(--shadow-md); -} - -.action-button.secondary { - border: 1px solid var(--color-border); - color: var(--color-text-primary); - background: var(--color-surface-elevated); -} - -.action-button.secondary:hover { - border-color: var(--color-accent); - color: var(--color-accent); - background: var(--color-surface); -} - -.action-button.small { - padding: 0.5rem 0.75rem; - font-size: 0.75rem; -} - -/* Search Card */ -.search-card { - border-radius: var(--radius-lg); -} - -.search-container { - display: flex; - padding: 1rem 1.5rem; - flex-direction: column; - gap: 1rem; -} - -.search-input-wrapper { - position: relative; - display: flex; - align-items: center; -} - -.search-icon { - position: absolute; - left: 1rem; - z-index: 1; - color: var(--color-text-secondary); -} - -.search-input { - border: 1px solid var(--color-border); - border-radius: var(--radius-lg); - padding: 0.75rem 1rem 0.75rem 3rem; - width: 100%; - font-size: 0.875rem; - font-family: inherit; - color: var(--color-text-primary); - background: var(--color-surface-elevated); - transition: var(--transition-fast); -} - -.search-input:focus { - border-color: var(--color-accent); - outline: none; - box-shadow: 0 0 0 2px rgb(0 122 255 / 20%); -} - -.search-input::placeholder { - color: var(--color-text-secondary); -} - -.clear-button { - position: absolute; - right: 0.5rem; - display: flex; - align-items: center; - border: none; - border-radius: var(--radius-md); - padding: 0.5rem; - color: var(--color-text-secondary); - background: transparent; - transition: var(--transition-fast); - cursor: pointer; -} - -.clear-button:hover { - color: var(--color-text-primary); - background: var(--color-surface); -} - -/* Search Options */ -.search-options { - display: flex; - align-items: flex-start; - border-top: 1px solid var(--color-border-secondary); - padding-top: 0.5rem; -} - -.strict-search-checkbox { - display: flex; - flex-direction: column; - gap: 0.25rem; - cursor: pointer; - user-select: none; -} - -.checkbox-input { - display: none; -} - -.checkbox-label { - position: relative; - display: flex; - align-items: center; - font-size: 0.875rem; - font-weight: 500; - color: var(--color-text); - gap: 0.5rem; -} - -.checkbox-label::before { - border: 2px solid var(--color-border); - border-radius: 3px; - width: 16px; - height: 16px; - background: var(--color-surface); - transition: all 0.2s ease; - content: ''; - flex-shrink: 0; -} - -.checkbox-input:checked + .checkbox-label::before { - border-color: var(--color-primary); - background: var(--color-primary); -} - -.checkbox-input:checked + .checkbox-label::after { - position: absolute; - left: 3px; - font-size: 10px; - font-weight: bold; - color: white; - content: '✓'; -} - -.checkbox-label:hover::before { - border-color: var(--color-primary); -} - -.checkbox-description { - margin-left: 24px; - font-size: 0.75rem; - color: var(--color-text-secondary); - line-height: 1.4; -} - -/* Notice Card */ -.notice-card { - border-color: var(--color-warning); - border-radius: var(--radius-lg); - background: linear-gradient(135deg, rgb(255 193 7 / 10%) 0%, var(--color-surface) 100%); -} - -.notice-content { - display: flex; - align-items: center; - gap: 1rem; - padding: 1rem 1.5rem; -} - -.notice-icon { - color: var(--color-warning); - flex-shrink: 0; -} - -.notice-text { - flex: 1; - font-size: 0.875rem; - font-weight: 500; - color: var(--color-text-primary); -} - -/* Loading */ -.loading-overlay { - position: absolute; - inset: 0; - z-index: 100; - display: flex; - justify-content: center; - align-items: center; - border-radius: var(--radius-xl); - background: rgb(0 0 0 / 50%); - flex-direction: column; - gap: 1rem; -} - -.loading-spinner { - border: 3px solid var(--color-border); - border-top: 3px solid var(--color-accent); - border-radius: 50%; - width: 40px; - height: 40px; - animation: spin 1s linear infinite; -} - -.loading-text { - font-size: 0.875rem; - font-weight: 500; - color: white; -} - -@keyframes spin { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } -} - -/* Plugin Grid */ -.plugin-grid { - display: grid; - grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); - gap: 1.25rem; - align-items: start; -} - -/* Plugin Item Card */ -.plugin-item-card { - position: relative; - display: flex; - border-radius: var(--radius-lg); - padding: 1.5rem; - height: auto; - min-height: 200px; - transition: var(--transition-medium); - flex-direction: column; -} - -.plugin-item-card:hover { - transform: translateY(-2px); - box-shadow: var(--shadow-lg); -} - -.plugin-item-card.disabled { - opacity: 0.7; -} - -/* Plugin Badges */ -.cli-badge, -.update-badge { - position: absolute; - top: 1rem; - right: 1rem; - z-index: 1; - border-radius: var(--radius-sm); - padding: 0.25rem 0.5rem; - font-size: 0.75rem; - font-weight: 600; -} - -.cli-badge { - color: var(--color-blue-common); - background: var(--color-info); -} - -.update-badge { - right: 3.5rem; - color: white; - background: var(--color-success); -} - -/* Plugin Header */ -.plugin-header { - display: flex; - align-items: flex-start; - gap: 1rem; - margin-bottom: 1rem; -} - -.plugin-logo { - border: 1px solid var(--color-border-secondary); - border-radius: var(--radius-md); - width: 48px; - height: 48px; - object-fit: cover; - flex-shrink: 0; -} - -.plugin-info { - flex: 1; - min-width: 0; -} - -.plugin-name { - display: flex; - align-items: center; - overflow: hidden; - margin: 0 0 0.25rem; - font-size: 1rem; - font-weight: 600; - text-overflow: ellipsis; - white-space: nowrap; - color: var(--color-text-primary); - transition: var(--transition-fast); - cursor: pointer; - gap: 0.5rem; -} - -.plugin-name:hover { - color: var(--color-accent); -} - -.plugin-version { - border-radius: var(--radius-sm); - padding: 0.125rem 0.375rem; - font-size: 0.75rem; - font-weight: 400; - color: var(--color-text-secondary); - background: var(--color-surface-elevated); -} - -.plugin-author { - overflow: hidden; - margin: 0; - font-size: 0.875rem; - text-overflow: ellipsis; - white-space: nowrap; - color: var(--color-text-secondary); -} - -/* Plugin Description */ -.plugin-description { - display: flex; - align-items: flex-start; - margin-bottom: 1.5rem; - flex: 1; -} - -.plugin-description p { - display: -webkit-box; - overflow: hidden; - margin: 0; - min-height: 2.6rem; - font-size: 0.875rem; - text-overflow: ellipsis; - color: var(--color-text-secondary); - line-height: 1.5; - -webkit-line-clamp: 2; - -webkit-box-orient: vertical; -} - -/* Plugin Actions */ -.plugin-actions { - margin-top: auto; - padding-top: 1rem; -} - -.plugin-button { - display: flex; - align-items: center; - border: none; - border-radius: var(--radius-md); - padding: 0.75rem 1rem; - width: 100%; - font-size: 0.875rem; - font-family: inherit; - font-weight: 500; - transition: var(--transition-fast); - gap: 0.5rem; - cursor: pointer; -} - -.plugin-button:disabled { - cursor: not-allowed; - opacity: 0.6; -} - -.install-button { - color: white; - background: var(--color-success); -} - -.install-button:hover:not(:disabled) { - transform: translateY(-1px); -} - -.installing-button, -.processing-button { - border: 1px solid var(--color-border); - color: var(--color-text-secondary); - background: var(--color-surface-elevated); -} - -.installed-button { - border: 1px solid var(--color-success); - color: var(--color-success); - background: var(--color-success-light); -} - -.settings-button { - color: white; - background: var(--color-accent); -} - -.settings-button:hover:not(:disabled) { - background: var(--color-accent-hover); - transform: translateY(-1px); -} - -.disabled-button { - border: 1px solid var(--color-border); - color: var(--color-text-secondary); - background: var(--color-surface-elevated); -} - -.disabled-button:hover:not(:disabled) { - border-color: var(--color-warning); - color: var(--color-warning); - background: var(--color-surface); -} - -/* Button Spinner */ -.button-spinner { - border: 2px solid transparent; - border-top: 2px solid currentcolor; - border-radius: 50%; - width: 16px; - height: 16px; - animation: spin 1s linear infinite; -} - -/* Empty State */ -.empty-state { - border-radius: var(--radius-lg); - padding: 3rem 2rem; -} - -.empty-content { - display: flex; - flex-direction: column; - align-items: center; - gap: 1rem; - text-align: center; -} - -.empty-icon { - color: var(--color-text-secondary); - opacity: 0.5; -} - -.empty-content h3 { - margin: 0; - font-size: 1.125rem; - font-weight: 600; - color: var(--color-text-primary); -} - -.empty-content p { - margin: 0; - max-width: 400px; - font-size: 0.875rem; - color: var(--color-text-secondary); -} - -/* Modal */ -.modal-overlay { - position: fixed; - inset: 0; - z-index: 1000; - display: flex; - justify-content: center; - align-items: center; - background: rgb(0 0 0 / 50%); -} - -.modal-container { - display: flex; - margin: 2rem; - border: 1px solid var(--color-border); - border-radius: var(--radius-xl); - width: 100%; - max-width: 70vw; - max-height: 80vh; - background: var(--color-surface); - box-shadow: var(--shadow-xl); - flex-direction: column; -} - -.modal-header { - display: flex; - justify-content: space-between; - align-items: center; - padding: 1.5rem 1.5rem 0; -} - -.modal-title { - margin: 0; - font-size: 1.25rem; - font-weight: 600; - color: var(--color-text-primary); -} - -.modal-close { - display: flex; - justify-content: center; - align-items: center; - border: none; - border-radius: var(--radius-md); - width: 2rem; - height: 2rem; - color: var(--color-text-secondary); - background: transparent; - transition: var(--transition-fast); - cursor: pointer; -} - -.modal-close:hover { - color: var(--color-text-primary); - background: var(--color-surface-elevated); -} - -.modal-content { - overflow-y: auto; - padding: 1.5rem; - flex: 1; -} - -.modal-content::-webkit-scrollbar { - width: 6px; -} - -.modal-content::-webkit-scrollbar-track { - border-radius: 3px; - background: var(--color-surface-elevated); -} - -.modal-content::-webkit-scrollbar-thumb { - border-radius: 3px; - background: var(--color-border); -} - -.modal-content::-webkit-scrollbar-thumb:hover { - background: var(--color-text-secondary); -} - -.modal-footer { - display: flex; - justify-content: flex-end; - align-items: center; - border-top: 1px solid var(--color-border-secondary); - padding: 1.5rem; - gap: 0.75rem; -} - -/* Buttons */ -.btn { - display: flex; - align-items: center; - border: none; - border-radius: var(--radius-md); - padding: 0.75rem 1.5rem; - font-size: 0.875rem; - font-family: inherit; - font-weight: 500; - transition: var(--transition-fast); - gap: 0.5rem; - cursor: pointer; -} - -.btn:disabled { - cursor: not-allowed; - opacity: 0.6; -} - -.btn:hover:not(:disabled) { - transform: translateY(-1px); - box-shadow: var(--shadow-sm); -} - -.btn-primary { - color: white; - background: var(--color-accent); -} - -.btn-primary:hover:not(:disabled) { - background: var(--color-accent-hover); -} - -.btn-secondary { - border: 1px solid var(--color-border); - color: var(--color-text-primary); - background: var(--color-surface-elevated); -} - -.btn-secondary:hover:not(:disabled) { - border-color: var(--color-accent); - background: var(--color-surface); -} - -/* Transitions */ -.notice-enter-active, -.notice-leave-active { - transition: all var(--transition-medium); -} - -.notice-enter-from, -.notice-leave-to { - opacity: 0; - transform: translateY(-1rem); -} - -/* Responsive Design */ -@media (width <= 768px) { - .plugin-container { - padding: 0.75rem; - gap: 1rem; - } - - .header-card .card-header { - flex-direction: column; - align-items: flex-start; - gap: 1rem; - } - - .header-actions { - justify-content: flex-start; - width: 100%; - flex-wrap: wrap; - } - - .plugin-grid { - grid-template-columns: 1fr; - } - - .modal-container { - margin: 1rem; - max-width: 95vw; - } - - .action-button { - justify-content: center; - min-width: 120px; - } -} - -@media (width <= 480px) { - .plugin-container { - padding: 0.5rem; - } - - .plugin-item-card { - padding: 1rem; - } - - .header-actions { - flex-direction: column; - gap: 0.5rem; - width: 100%; - } - - .action-button { - justify-content: center; - width: 100%; - } -} - -/* Dark mode adjustments */ -:root.dark .plugin-container, -:root.auto.dark .plugin-container { - background: var(--color-background-secondary); -} - -:root.dark .plugin-card, -:root.auto.dark .plugin-card { - border-color: var(--color-border-secondary); - background: var(--color-surface-elevated); -} - -:root.dark .search-input, -:root.auto.dark .search-input { - border-color: var(--color-border); - color: var(--color-text-primary); - background: var(--color-surface-elevated); -} - -:root.dark .search-input:focus, -:root.auto.dark .search-input:focus { - border-color: var(--color-accent); -} - -:root.dark .modal-container, -:root.auto.dark .modal-container { - border-color: var(--color-border); - background: var(--color-surface); -} - -:root.dark .btn-secondary, -:root.auto.dark .btn-secondary { - border-color: var(--color-border); - background: var(--color-surface-elevated); -} - -:root.dark .btn-secondary:hover, -:root.auto.dark .btn-secondary:hover { - border-color: var(--color-accent); - background: var(--color-surface); -} - -/* Accessibility */ -@media (prefers-reduced-motion: reduce) { - * { - animation-duration: 0.01ms !important; - animation-iteration-count: 1 !important; - transition-duration: 0.01ms !important; - } -} - -/* Focus styles for keyboard navigation */ -.action-button:focus-visible, -.plugin-button:focus-visible, -.btn:focus-visible, -.search-input:focus-visible, -.clear-button:focus-visible, -.modal-close:focus-visible { - outline: 2px solid var(--color-accent); - outline-offset: 2px; -} - -.plugin-name:focus-visible { - border-radius: var(--radius-sm); - outline: 2px solid var(--color-accent); - outline-offset: 2px; -} +/* Global scrolling behavior */ +html, body { + overflow-x: hidden; +} + +/* Container */ +.plugin-container { + display: flex; + overflow-y: auto; + margin: 0; + padding: 1rem; + width: 100%; + min-height: 100vh; + flex-direction: column; + gap: 1.25rem; + box-sizing: border-box; +} + +/* Card Base */ +.plugin-card { + overflow: hidden; + border: 1px solid var(--color-border-secondary); + border-radius: var(--radius-xl); + background: var(--color-surface); + box-shadow: var(--shadow-sm); + transition: var(--transition-medium); +} + +.plugin-card:hover { + border-color: var(--color-border); + box-shadow: var(--shadow-md); +} + +/* Header Card */ +.header-card .card-header { + display: flex; + justify-content: space-between; + align-items: center; + border-bottom: 1px solid var(--color-border-secondary); + padding: 1rem 1.5rem; + flex-wrap: wrap; + gap: 1rem; +} + +.header-content { + display: flex; + align-items: center; + gap: 1rem; + flex: 1; +} + +.header-icon { + display: flex; + align-items: center; + color: var(--color-accent); +} + +.header-content h1 { + margin: 0; + font-size: 1.5rem; + font-weight: 600; + color: var(--color-text-primary); + letter-spacing: -0.025em; +} + +.header-content p { + margin: 0; + font-size: 0.875rem; + color: var(--color-text-secondary); +} + +.header-actions { + display: flex; + align-items: center; + gap: 0.75rem; + flex-wrap: wrap; +} + +.action-button { + display: flex; + align-items: center; + border: none; + border-radius: var(--radius-md); + padding: 0.625rem 1rem; + font-size: 0.875rem; + font-family: inherit; + font-weight: 500; + color: white; + background: var(--color-blue-common); + transition: var(--transition-fast); + gap: 0.5rem; + cursor: pointer; +} + +.action-button:hover { + background: var(--color-accent-hover); + transform: translateY(-1px); + box-shadow: var(--shadow-md); +} + +.action-button.secondary { + border: 1px solid var(--color-border); + color: var(--color-text-primary); + background: var(--color-surface-elevated); +} + +.action-button.secondary:hover { + border-color: var(--color-accent); + color: var(--color-accent); + background: var(--color-surface); +} + +.action-button.small { + padding: 0.5rem 0.75rem; + font-size: 0.75rem; +} + +/* Search Card */ +.search-card { + border-radius: var(--radius-lg); +} + +.search-container { + display: flex; + padding: 1rem 1.5rem; + flex-direction: column; + gap: 1rem; +} + +.search-input-wrapper { + position: relative; + display: flex; + align-items: center; +} + +.search-icon { + position: absolute; + left: 1rem; + z-index: 1; + color: var(--color-text-secondary); +} + +.search-input { + border: 1px solid var(--color-border); + border-radius: var(--radius-lg); + padding: 0.75rem 1rem 0.75rem 3rem; + width: 100%; + font-size: 0.875rem; + font-family: inherit; + color: var(--color-text-primary); + background: var(--color-surface-elevated); + transition: var(--transition-fast); +} + +.search-input:focus { + border-color: var(--color-accent); + outline: none; + box-shadow: 0 0 0 2px rgb(0 122 255 / 20%); +} + +.search-input::placeholder { + color: var(--color-text-secondary); +} + +.clear-button { + position: absolute; + right: 0.5rem; + display: flex; + align-items: center; + border: none; + border-radius: var(--radius-md); + padding: 0.5rem; + color: var(--color-text-secondary); + background: transparent; + transition: var(--transition-fast); + cursor: pointer; +} + +.clear-button:hover { + color: var(--color-text-primary); + background: var(--color-surface); +} + +/* Search Options */ +.search-options { + display: flex; + align-items: flex-start; + border-top: 1px solid var(--color-border-secondary); + padding-top: 0.5rem; +} + +.strict-search-checkbox { + display: flex; + flex-direction: column; + gap: 0.25rem; + cursor: pointer; + user-select: none; +} + +.checkbox-input { + display: none; +} + +.checkbox-label { + position: relative; + display: flex; + align-items: center; + font-size: 0.875rem; + font-weight: 500; + color: var(--color-text); + gap: 0.5rem; +} + +.checkbox-label::before { + border: 2px solid var(--color-border); + border-radius: 3px; + width: 16px; + height: 16px; + background: var(--color-surface); + transition: all 0.2s ease; + content: ''; + flex-shrink: 0; +} + +.checkbox-input:checked + .checkbox-label::before { + border-color: var(--color-primary); + background: var(--color-primary); +} + +.checkbox-input:checked + .checkbox-label::after { + position: absolute; + left: 3px; + font-size: 10px; + font-weight: bold; + color: white; + content: '✓'; +} + +.checkbox-label:hover::before { + border-color: var(--color-primary); +} + +.checkbox-description { + margin-left: 24px; + font-size: 0.75rem; + color: var(--color-text-secondary); + line-height: 1.4; +} + +/* Notice Card */ +.notice-card { + border-color: var(--color-warning); + border-radius: var(--radius-lg); + background: linear-gradient(135deg, rgb(255 193 7 / 10%) 0%, var(--color-surface) 100%); +} + +.notice-content { + display: flex; + align-items: center; + gap: 1rem; + padding: 1rem 1.5rem; +} + +.notice-icon { + color: var(--color-warning); + flex-shrink: 0; +} + +.notice-text { + flex: 1; + font-size: 0.875rem; + font-weight: 500; + color: var(--color-text-primary); +} + +/* Loading */ +.loading-overlay { + position: absolute; + inset: 0; + z-index: 100; + display: flex; + justify-content: center; + align-items: center; + border-radius: var(--radius-xl); + background: rgb(0 0 0 / 50%); + flex-direction: column; + gap: 1rem; +} + +.loading-spinner { + border: 3px solid var(--color-border); + border-top: 3px solid var(--color-accent); + border-radius: 50%; + width: 40px; + height: 40px; + animation: spin 1s linear infinite; +} + +.loading-text { + font-size: 0.875rem; + font-weight: 500; + color: white; +} + +@keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} + +/* Plugin Grid */ +.plugin-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); + gap: 1.25rem; + align-items: start; +} + +/* Plugin Item Card */ +.plugin-item-card { + position: relative; + display: flex; + border-radius: var(--radius-lg); + padding: 1.5rem; + height: auto; + min-height: 200px; + transition: var(--transition-medium); + flex-direction: column; +} + +.plugin-item-card:hover { + transform: translateY(-2px); + box-shadow: var(--shadow-lg); +} + +.plugin-item-card.disabled { + opacity: 0.7; +} + +/* Plugin Badges */ +.cli-badge, +.update-badge { + position: absolute; + top: 1rem; + right: 1rem; + z-index: 1; + border-radius: var(--radius-sm); + padding: 0.25rem 0.5rem; + font-size: 0.75rem; + font-weight: 600; +} + +.cli-badge { + color: var(--color-blue-common); + background: var(--color-info); +} + +.update-badge { + right: 3.5rem; + color: white; + background: var(--color-success); +} + +/* Plugin Header */ +.plugin-header { + display: flex; + align-items: flex-start; + gap: 1rem; + margin-bottom: 1rem; +} + +.plugin-logo { + border: 1px solid var(--color-border-secondary); + border-radius: var(--radius-md); + width: 48px; + height: 48px; + object-fit: cover; + flex-shrink: 0; +} + +.plugin-info { + flex: 1; + min-width: 0; +} + +.plugin-name { + display: flex; + align-items: center; + overflow: hidden; + margin: 0 0 0.25rem; + font-size: 1rem; + font-weight: 600; + text-overflow: ellipsis; + white-space: nowrap; + color: var(--color-text-primary); + transition: var(--transition-fast); + cursor: pointer; + gap: 0.5rem; +} + +.plugin-name:hover { + color: var(--color-accent); +} + +.plugin-version { + border-radius: var(--radius-sm); + padding: 0.125rem 0.375rem; + font-size: 0.75rem; + font-weight: 400; + color: var(--color-text-secondary); + background: var(--color-surface-elevated); +} + +.plugin-author { + overflow: hidden; + margin: 0; + font-size: 0.875rem; + text-overflow: ellipsis; + white-space: nowrap; + color: var(--color-text-secondary); +} + +/* Plugin Description */ +.plugin-description { + display: flex; + align-items: flex-start; + margin-bottom: 1.5rem; + flex: 1; +} + +.plugin-description p { + display: -webkit-box; + overflow: hidden; + margin: 0; + min-height: 2.6rem; + font-size: 0.875rem; + text-overflow: ellipsis; + color: var(--color-text-secondary); + line-height: 1.5; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; +} + +/* Plugin Actions */ +.plugin-actions { + margin-top: auto; + padding-top: 1rem; +} + +.plugin-button { + display: flex; + align-items: center; + border: none; + border-radius: var(--radius-md); + padding: 0.75rem 1rem; + width: 100%; + font-size: 0.875rem; + font-family: inherit; + font-weight: 500; + transition: var(--transition-fast); + gap: 0.5rem; + cursor: pointer; +} + +.plugin-button:disabled { + cursor: not-allowed; + opacity: 0.6; +} + +.install-button { + color: white; + background: var(--color-success); +} + +.install-button:hover:not(:disabled) { + transform: translateY(-1px); +} + +.installing-button, +.processing-button { + border: 1px solid var(--color-border); + color: var(--color-text-secondary); + background: var(--color-surface-elevated); +} + +.installed-button { + border: 1px solid var(--color-success); + color: var(--color-success); + background: var(--color-success-light); +} + +.settings-button { + color: white; + background: var(--color-blue-common); +} + +.settings-button:hover:not(:disabled) { + background: var(--color-accent); + transform: translateY(-1px); +} + +.disabled-button { + border: 1px solid var(--color-border); + color: var(--color-text-secondary); + background: var(--color-surface-elevated); +} + +.disabled-button:hover:not(:disabled) { + border-color: var(--color-warning); + color: var(--color-warning); + background: var(--color-surface); +} + +/* Button Spinner */ +.button-spinner { + border: 2px solid transparent; + border-top: 2px solid currentcolor; + border-radius: 50%; + width: 16px; + height: 16px; + animation: spin 1s linear infinite; +} + +/* Empty State */ +.empty-state { + border-radius: var(--radius-lg); + padding: 3rem 2rem; +} + +.empty-content { + display: flex; + flex-direction: column; + align-items: center; + gap: 1rem; + text-align: center; +} + +.empty-icon { + color: var(--color-text-secondary); + opacity: 0.5; +} + +.empty-content h3 { + margin: 0; + font-size: 1.125rem; + font-weight: 600; + color: var(--color-text-primary); +} + +.empty-content p { + margin: 0; + max-width: 400px; + font-size: 0.875rem; + color: var(--color-text-secondary); +} + +/* Modal */ +.modal-overlay { + position: fixed; + inset: 0; + z-index: 1000; + display: flex; + justify-content: center; + align-items: center; + background: rgb(0 0 0 / 50%); +} + +.modal-container { + display: flex; + margin: 2rem; + border: 1px solid var(--color-border); + border-radius: var(--radius-xl); + width: 100%; + max-width: 70vw; + max-height: 80vh; + background: var(--color-surface); + box-shadow: var(--shadow-xl); + flex-direction: column; +} + +.modal-header { + display: flex; + justify-content: space-between; + align-items: center; + padding: 1.5rem 1.5rem 0; +} + +.modal-title { + margin: 0; + font-size: 1.25rem; + font-weight: 600; + color: var(--color-text-primary); +} + +.modal-close { + display: flex; + justify-content: center; + align-items: center; + border: none; + border-radius: var(--radius-md); + width: 2rem; + height: 2rem; + color: var(--color-text-secondary); + background: transparent; + transition: var(--transition-fast); + cursor: pointer; +} + +.modal-close:hover { + color: var(--color-text-primary); + background: var(--color-surface-elevated); +} + +.modal-content { + overflow-y: auto; + padding: 1.5rem; + flex: 1; +} + +.modal-content::-webkit-scrollbar { + width: 6px; +} + +.modal-content::-webkit-scrollbar-track { + border-radius: 3px; + background: var(--color-surface-elevated); +} + +.modal-content::-webkit-scrollbar-thumb { + border-radius: 3px; + background: var(--color-border); +} + +.modal-content::-webkit-scrollbar-thumb:hover { + background: var(--color-text-secondary); +} + +.modal-footer { + display: flex; + justify-content: flex-end; + align-items: center; + border-top: 1px solid var(--color-border-secondary); + padding: 1.5rem; + gap: 0.75rem; +} + +/* Buttons */ +.btn { + display: flex; + align-items: center; + border: none; + border-radius: var(--radius-md); + padding: 0.75rem 1.5rem; + font-size: 0.875rem; + font-family: inherit; + font-weight: 500; + transition: var(--transition-fast); + gap: 0.5rem; + cursor: pointer; +} + +.btn:disabled { + cursor: not-allowed; + opacity: 0.6; +} + +.btn:hover:not(:disabled) { + transform: translateY(-1px); + box-shadow: var(--shadow-sm); +} + +.btn-primary { + color: white; + background: var(--color-accent); +} + +.btn-primary:hover:not(:disabled) { + background: var(--color-accent-hover); +} + +.btn-secondary { + border: 1px solid var(--color-border); + color: var(--color-text-primary); + background: var(--color-surface-elevated); +} + +.btn-secondary:hover:not(:disabled) { + border-color: var(--color-accent); + background: var(--color-surface); +} + +/* Transitions */ +.notice-enter-active, +.notice-leave-active { + transition: all var(--transition-medium); +} + +.notice-enter-from, +.notice-leave-to { + opacity: 0; + transform: translateY(-1rem); +} + +/* Responsive Design */ +@media (width <= 768px) { + .plugin-container { + padding: 0.75rem; + gap: 1rem; + } + + .header-card .card-header { + flex-direction: column; + align-items: flex-start; + gap: 1rem; + } + + .header-actions { + justify-content: flex-start; + width: 100%; + flex-wrap: wrap; + } + + .plugin-grid { + grid-template-columns: 1fr; + } + + .modal-container { + margin: 1rem; + max-width: 95vw; + } + + .action-button { + justify-content: center; + min-width: 120px; + } +} + +@media (width <= 480px) { + .plugin-container { + padding: 0.5rem; + } + + .plugin-item-card { + padding: 1rem; + } + + .header-actions { + flex-direction: column; + gap: 0.5rem; + width: 100%; + } + + .action-button { + justify-content: center; + width: 100%; + } +} + +/* Dark mode adjustments */ +:root.dark .plugin-container, +:root.auto.dark .plugin-container { + background: var(--color-background-secondary); +} + +:root.dark .plugin-card, +:root.auto.dark .plugin-card { + border-color: var(--color-border-secondary); + background: var(--color-surface-elevated); +} + +:root.dark .search-input, +:root.auto.dark .search-input { + border-color: var(--color-border); + color: var(--color-text-primary); + background: var(--color-surface-elevated); +} + +:root.dark .search-input:focus, +:root.auto.dark .search-input:focus { + border-color: var(--color-accent); +} + +:root.dark .modal-container, +:root.auto.dark .modal-container { + border-color: var(--color-border); + background: var(--color-surface); +} + +:root.dark .btn-secondary, +:root.auto.dark .btn-secondary { + border-color: var(--color-border); + background: var(--color-surface-elevated); +} + +:root.dark .btn-secondary:hover, +:root.auto.dark .btn-secondary:hover { + border-color: var(--color-accent); + background: var(--color-surface); +} + +/* Accessibility */ +@media (prefers-reduced-motion: reduce) { + * { + animation-duration: 0.01ms !important; + animation-iteration-count: 1 !important; + transition-duration: 0.01ms !important; + } +} + +/* Focus styles for keyboard navigation */ +.action-button:focus-visible, +.plugin-button:focus-visible, +.btn:focus-visible, +.search-input:focus-visible, +.clear-button:focus-visible, +.modal-close:focus-visible { + outline: 2px solid var(--color-accent); + outline-offset: 2px; +} + +.plugin-name:focus-visible { + border-radius: var(--radius-sm); + outline: 2px solid var(--color-accent); + outline-offset: 2px; +}