blob: a0adbd071c00bcd946f5523c9110f262200607d0 [file] [log] [blame]
/*!
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/* Tokens & Base — @import must precede all style declarations */
@import './tokens.css';
@import './base/reset.css';
@import './base/typography.css';
/* Self-hosted fonts (previously loaded from Google Fonts CDN) */
@font-face {
font-family: 'Plus Jakarta Sans';
font-style: normal;
font-weight: 400 700;
font-display: swap;
src: url('../fonts/plus-jakarta-sans-latin.woff2') format('woff2');
}
@font-face {
font-family: 'JetBrains Mono';
font-style: normal;
font-weight: 400 600;
font-display: swap;
src: url('../fonts/jetbrains-mono-latin.woff2') format('woff2');
}
/* Scrollbar */
::-webkit-scrollbar {
width: 0.5rem;
}
::-webkit-scrollbar-track {
background: var(--color-scrollbar-track);
}
::-webkit-scrollbar-thumb {
background: var(--color-scrollbar-thumb);
border-radius: var(--radius-full);
}
::-webkit-scrollbar-thumb:hover {
background: var(--color-scrollbar-thumb-hover);
}
/* Layout */
.container {
width: 100%;
max-width: 1280px;
margin-left: auto;
margin-right: auto;
padding-left: var(--space-4);
padding-right: var(--space-4);
}
@media (min-width: 640px) {
.container {
padding-left: var(--space-6);
padding-right: var(--space-6);
}
}
@media (min-width: 1024px) {
.container {
padding-left: var(--space-8);
padding-right: var(--space-8);
}
}
/* Header */
#site-header {
position: sticky;
top: 0;
z-index: 50;
background: var(--color-header-bg);
backdrop-filter: blur(12px);
border-bottom: 1px solid var(--color-header-border);
}
#site-header .container {
display: flex;
align-items: center;
justify-content: space-between;
gap: var(--space-2);
height: 4rem;
}
#site-header > .container > a {
display: flex;
align-items: center;
gap: var(--space-2);
transition: opacity var(--transition-base);
}
#site-header > .container > a:hover {
opacity: 0.8;
}
#site-header img {
height: 2rem;
}
#site-header .logo-dark {
display: none;
}
:root[style*="color-scheme: dark"] #site-header .logo-light {
display: none;
}
:root[style*="color-scheme: dark"] #site-header .logo-dark {
display: block;
}
@media (prefers-color-scheme: dark) {
#site-header .logo-light {
display: none;
}
#site-header .logo-dark {
display: block;
}
}
:root[style*="color-scheme: light"] #site-header .logo-light {
display: block;
}
:root[style*="color-scheme: light"] #site-header .logo-dark {
display: none;
}
#site-header .wordmark::before {
content: "|";
margin-right: var(--space-2);
font-weight: var(--font-medium);
opacity: 0.6;
}
#site-header .wordmark {
font-size: var(--text-base);
font-weight: var(--font-semibold);
color: var(--text-primary);
}
#site-header nav {
display: none;
align-items: center;
gap: var(--space-6);
margin-left: auto;
margin-right: auto;
}
@media (min-width: 768px) {
#site-header nav {
display: flex;
}
}
#site-header nav a {
color: var(--color-nav-link);
transition: color var(--transition-base);
}
#site-header nav a:hover {
color: var(--text-primary);
}
/* Search Buttons */
.search {
display: flex;
align-items: center;
gap: var(--space-2);
border: 1px solid;
border-radius: var(--radius-lg);
color: var(--text-secondary);
transition: all var(--transition-base);
}
.search svg {
flex-shrink: 0;
color: var(--text-muted);
transition: color var(--transition-base);
}
/* Header Search */
#search-trigger {
display: none;
padding: 0.375rem var(--space-2);
background: var(--color-input-bg);
border-color: var(--color-input-border);
}
.js #search-trigger {
display: flex;
}
@media (min-width: 640px) {
#search-trigger {
padding: 0.375rem var(--space-3);
}
}
#search-trigger:hover {
border-color: light-dark(var(--color-gray-400), rgba(6, 182, 212, 0.5));
}
#search-trigger svg {
width: 1rem;
height: 1rem;
}
#search-trigger > span:not(.kbd) {
display: none;
font-size: var(--text-sm);
}
@media (min-width: 640px) {
#search-trigger > span:not(.kbd) {
display: inline;
}
}
/* Keyboard shortcut badge */
.kbd {
display: none;
padding: 0.125rem 0.375rem;
background: var(--bg-tertiary);
border: 1px solid var(--border-primary-light);
border-color: light-dark(var(--border-primary-light), var(--color-navy-600));
border-radius: var(--radius);
font-family: var(--font-mono);
font-size: var(--text-xs);
line-height: 1rem;
color: var(--text-secondary);
}
@media (min-width: 640px) {
.kbd {
display: inline;
}
}
/* Theme Toggle */
#theme-toggle {
padding: var(--space-2);
background: var(--bg-tertiary);
border: 1px solid var(--border-primary-light);
border-color: light-dark(var(--border-primary-light), var(--color-gray-700));
border-radius: var(--radius-lg);
color: var(--text-secondary);
transition: all var(--transition-base);
}
#theme-toggle:hover {
color: var(--text-primary);
border-color: light-dark(var(--border-primary-light), rgba(6, 182, 212, 0.5));
}
#theme-toggle svg {
width: 1.25rem;
height: 1.25rem;
}
/* Mobile Menu Button */
#mobile-menu-btn {
display: block;
padding: var(--space-2);
background: var(--bg-tertiary);
border: 1px solid light-dark(var(--border-primary-light), var(--color-gray-700));
border-radius: var(--radius-lg);
color: var(--text-secondary);
}
@media (min-width: 768px) {
#mobile-menu-btn {
display: none;
}
}
#mobile-menu-btn svg {
width: 1.25rem;
height: 1.25rem;
}
/* Mobile Nav */
#mobile-nav {
display: none;
flex-direction: column;
gap: var(--space-3);
padding-bottom: var(--space-4);
border-top: 1px solid var(--border-primary);
margin-top: var(--space-4);
padding-top: var(--space-4);
}
@media (min-width: 768px) {
#mobile-nav {
display: none !important;
}
}
#mobile-nav.active {
display: flex;
}
#mobile-nav a {
padding: var(--space-2) 0;
color: var(--text-primary);
}
/* Footer */
footer {
background: var(--bg-primary);
border-top: 1px solid var(--border-primary);
padding: var(--space-8) 0;
}
footer .container {
display: flex;
flex-direction: column;
gap: var(--space-6);
}
footer .footer-top {
display: flex;
flex-direction: column;
align-items: center;
gap: var(--space-4);
}
@media (min-width: 768px) {
footer .footer-top {
flex-direction: row;
justify-content: space-between;
}
}
footer .footer-bottom {
border-top: 1px solid var(--border-primary);
padding-top: var(--space-4);
text-align: center;
}
footer p {
font-size: var(--text-sm);
color: var(--text-secondary);
margin: 0;
}
footer .trademark {
font-size: var(--text-xs);
color: var(--text-tertiary);
margin-top: var(--space-2);
max-width: 60rem;
margin-inline: auto;
}
footer .links {
display: flex;
align-items: center;
flex-wrap: wrap;
justify-content: center;
gap: var(--space-4);
}
@media (min-width: 768px) {
footer .links {
gap: var(--space-6);
}
}
footer a {
font-size: var(--text-sm);
color: var(--text-secondary);
transition: color var(--transition-base);
}
footer a:hover {
color: var(--text-primary);
}
/* Cards */
.card { background: var(--color-card-bg);
border: 1px solid var(--border-primary-light);
border: 1px solid var(--border-primary);
border-radius: var(--radius-lg);
backdrop-filter: blur(4px);
transition: all var(--transition-base);
}
/* Buttons styled contextually where they appear */
/* Badges */
.badge {
display: inline-flex;
align-items: center;
padding: var(--space-1) var(--space-2);
font-size: var(--text-xs);
font-weight: var(--font-medium);
border-radius: var(--radius-full);
border: 1px solid;
}
/* Lifecycle badges (AIP-95) */
.lifecycle-incubation {
background: color-mix(in srgb, var(--color-amber-500) 15%, transparent);
color: var(--color-amber-500);
color: light-dark(var(--color-amber-600), var(--color-amber-400));
border-color: color-mix(in srgb, var(--color-amber-500) 40%, transparent);
}
.lifecycle-deprecated {
background: color-mix(in srgb, var(--color-gray-500) 15%, transparent);
color: var(--color-gray-500);
color: light-dark(var(--color-gray-500), var(--color-gray-400));
border-color: color-mix(in srgb, var(--color-gray-500) 40%, transparent);
}
/* Hero Section */
#hero {
position: relative;
padding: var(--space-20) 0;
overflow: hidden;
text-align: center;
background: linear-gradient(135deg, #f0f9ff 0%, #e0f2fe 50%, #f0fdfa 100%);
}
@media (prefers-color-scheme: dark) {
#hero {
background: var(--bg-primary-dark);
}
}
:root[style*="color-scheme: light"] #hero {
background: linear-gradient(135deg, #f0f9ff 0%, #e0f2fe 50%, #f0fdfa 100%);
}
:root[style*="color-scheme: dark"] #hero {
background: var(--bg-primary-dark);
}
#hero .gradient {
position: absolute;
inset: 0;
background: linear-gradient(to bottom, color-mix(in srgb, var(--color-cyan-500) 10%, transparent), transparent);
pointer-events: none;
}
@media (prefers-color-scheme: dark) {
#hero .gradient {
background: linear-gradient(to bottom, rgba(15, 23, 42, 0.5), transparent);
}
}
:root[style*="color-scheme: light"] #hero .gradient {
background: linear-gradient(to bottom, color-mix(in srgb, var(--color-cyan-500) 10%, transparent), transparent);
}
:root[style*="color-scheme: dark"] #hero .gradient {
background: linear-gradient(to bottom, rgba(15, 23, 42, 0.5), transparent);
}
#hero .particles {
position: absolute;
inset: 0;
overflow: hidden;
pointer-events: none;
}
#hero .particle {
position: absolute;
width: 24rem;
height: 24rem;
border-radius: var(--radius-full);
filter: blur(64px);
animation: pulse-slow 3s cubic-bezier(0.4, 0, 0.6, 1) infinite;
}
@keyframes pulse-slow {
0%, 100% { opacity: 1; }
50% { opacity: 0.5; }
}
#hero .particle:nth-child(1) {
top: 25%;
left: 25%;
background: color-mix(in srgb, var(--color-cyan-500) 15%, transparent);
}
@media (prefers-color-scheme: dark) {
#hero .particle:nth-child(1) {
background: color-mix(in srgb, var(--color-cyan-500) 5%, transparent);
}
}
:root[style*="color-scheme: light"] #hero .particle:nth-child(1) {
background: color-mix(in srgb, var(--color-cyan-500) 15%, transparent);
}
:root[style*="color-scheme: dark"] #hero .particle:nth-child(1) {
background: color-mix(in srgb, var(--color-cyan-500) 5%, transparent);
}
#hero .particle:nth-child(2) {
bottom: 25%;
right: 25%;
background: color-mix(in srgb, var(--color-indigo-500) 15%, transparent);
animation-delay: 1.5s;
}
@media (prefers-color-scheme: dark) {
#hero .particle:nth-child(2) {
background: color-mix(in srgb, var(--color-indigo-500) 5%, transparent);
}
}
:root[style*="color-scheme: light"] #hero .particle:nth-child(2) {
background: color-mix(in srgb, var(--color-indigo-500) 15%, transparent);
}
:root[style*="color-scheme: dark"] #hero .particle:nth-child(2) {
background: color-mix(in srgb, var(--color-indigo-500) 5%, transparent);
}
#hero .container {
position: relative;
max-width: 48rem;
}
#hero .badge {
display: inline-flex;
align-items: center;
gap: var(--space-2);
padding: var(--space-1) var(--space-3);
background: var(--color-widget-bg);
border: 1px solid var(--border-primary);
border-radius: var(--radius-full);
font-size: var(--text-sm);
color: var(--text-secondary);
margin-bottom: var(--space-6);
}
#hero .badge .dot {
width: 0.5rem;
height: 0.5rem;
background: var(--color-cyan-400);
border-radius: var(--radius-full);
animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
}
@keyframes pulse {
0%, 100% { opacity: 1; }
50% { opacity: 0.5; }
}
#hero h1 {
font-size: 2.25rem;
font-weight: var(--font-bold);
color: var(--text-primary);
margin-bottom: var(--space-6);
line-height: var(--leading-none);
}
@media (min-width: 640px) {
#hero h1 {
font-size: 3rem;
}
}
@media (min-width: 1024px) {
#hero h1 {
font-size: 3.75rem;
}
}
#hero h1 .highlight {
background: linear-gradient(to right, var(--color-cyan-400), var(--color-cyan-600));
-webkit-background-clip: text;
background-clip: text;
-webkit-text-fill-color: transparent;
}
#hero .subtitle {
font-size: var(--text-lg);
color: var(--text-secondary);
margin-bottom: var(--space-8);
max-width: 32rem;
margin-left: auto;
margin-right: auto;
}
/* Hero Search */
#hero .search {
display: none;
width: 100%;
max-width: 36rem;
margin: 0 auto 2rem;
gap: var(--space-3);
padding: 1rem 1.25rem;
background: var(--color-widget-bg);
border-color: var(--color-gray-300);
border-color: var(--border-secondary);
border-radius: var(--radius-xl);
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.05);
box-shadow: light-dark(0 4px 6px -1px rgba(0, 0, 0, 0.05), none);
}
.js #hero .search {
display: flex;
}
#hero .search:hover {
border-color: var(--color-cyan-600);
border-color: var(--color-border-focus);
box-shadow: 0 4px 12px -2px rgba(6, 182, 212, 0.2);
box-shadow: light-dark(0 4px 12px -2px rgba(6, 182, 212, 0.2), none);
}
#hero .search:hover svg {
color: var(--color-cyan-400);
}
#hero .search svg {
width: 1.25rem;
height: 1.25rem;
}
#hero .search > span:not(.shortcuts) {
flex: 1;
text-align: left;
}
#hero .search .shortcuts {
display: flex;
gap: var(--space-1);
}
/* Stats Section */
#stats {
padding: var(--space-12) 0;
background: linear-gradient(180deg, var(--bg-primary-light) 0%, var(--bg-secondary-light) 100%);
border-block: 1px solid var(--border-primary);
}
/* light-dark() doesn't work for gradient, so we have to use media selectors and explicit color-scheme */
@media (prefers-color-scheme: dark) {
#stats {
background: rgb(from var(--color-navy-800) r g b / 0.3);
}
}
/* Need explicit light mode to override media query when user manually selects light */
:root[style*="color-scheme: light"] #stats {
background: linear-gradient(180deg, var(--bg-primary-light) 0%, var(--bg-secondary-light) 100%);
}
:root[style*="color-scheme: dark"] #stats {
background: rgb(from var(--color-navy-800) r g b / 0.3);
}
#stats dl {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: var(--space-8);
}
@media (min-width: 768px) {
#stats dl {
grid-template-columns: repeat(4, 1fr);
}
}
#stats dl > div {
text-align: center;
}
#stats dt {
font-size: var(--text-3xl);
font-weight: var(--font-bold);
color: var(--accent-primary);
margin-bottom: var(--space-1);
}
#stats dd {
font-size: var(--text-sm);
color: var(--text-secondary);
}
/* Provider Cards - Reusable */
.provider-card,
#featured-providers .provider {
display: flex;
gap: var(--space-4);
padding: var(--space-5);
background: var(--color-card-bg);
border: 1px solid var(--border-primary-light);
border: 1px solid var(--border-primary);
border-radius: var(--radius-lg);
backdrop-filter: blur(4px);
transition: all var(--transition-base);
cursor: pointer;
position: relative;
text-decoration: none;
color: inherit;
}
.provider-card:hover,
#featured-providers .provider:hover {
border-color: var(--color-card-border-hover);
background: var(--color-card-bg-hover);
box-shadow: 0 10px 40px -10px rgba(6, 182, 212, 0.15);
box-shadow: 0 10px 40px -10px light-dark(rgba(6, 182, 212, 0.15), rgba(6, 182, 212, 0.1));
}
.provider-card .logo,
#featured-providers .logo {
flex-shrink: 0;
width: 3rem;
height: 3rem;
display: flex;
align-items: center;
justify-content: center;
background: var(--bg-secondary);
border-radius: var(--radius-lg);
overflow: hidden;
}
.provider-card .logo img,
#featured-providers .logo img {
width: 100%;
height: 100%;
object-fit: contain;
}
.provider-card .logo .initial,
#featured-providers .logo .initial {
font-size: var(--text-xl);
font-weight: var(--font-bold);
color: var(--color-cyan-400);
}
.provider-card .details,
#featured-providers .details {
flex: 1;
min-width: 0;
}
.provider-card .title-row,
#featured-providers .title-row {
display: flex;
align-items: center;
gap: var(--space-2);
margin-bottom: var(--space-1);
}
.provider-card h3,
#featured-providers h3 {
font-size: var(--text-lg);
font-weight: var(--font-semibold);
color: var(--text-primary);
margin: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.provider-card .package,
#featured-providers .package {
font-family: var(--font-mono);
font-size: var(--text-sm);
color: var(--text-muted);
margin: 0 0 var(--space-2) 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.provider-card .description,
#featured-providers .description {
font-size: var(--text-sm);
color: var(--text-secondary);
margin: 0 0 var(--space-4) 0;
line-height: var(--leading-relaxed);
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
}
.provider-card .modules,
#featured-providers .modules {
display: flex;
align-items: center;
gap: var(--space-3);
margin-bottom: var(--space-3);
}
.provider-card .modules .count,
#featured-providers .modules .count {
font-size: var(--text-sm);
font-weight: var(--font-semibold);
color: var(--text-primary);
flex-shrink: 0;
min-width: var(--space-24);
}
.provider-card .modules .breakdown,
#featured-providers .modules .breakdown {
display: flex;
flex: 1;
height: var(--space-2-5);
border-radius: var(--radius-full);
overflow: visible;
background: var(--bg-secondary);
position: relative;
}
.provider-card .modules .breakdown > div,
#featured-providers .modules .breakdown > div {
position: relative;
cursor: default;
transition: filter var(--transition-fast);
}
.provider-card .modules .breakdown > div:first-child,
#featured-providers .modules .breakdown > div:first-child {
border-radius: var(--radius-full) 0 0 var(--radius-full);
}
.provider-card .modules .breakdown > div:last-child,
#featured-providers .modules .breakdown > div:last-child {
border-radius: 0 var(--radius-full) var(--radius-full) 0;
}
.provider-card .modules .breakdown > div:only-child,
#featured-providers .modules .breakdown > div:only-child {
border-radius: var(--radius-full);
}
.provider-card .modules .breakdown > div:hover,
#featured-providers .modules .breakdown > div:hover {
filter: brightness(1.25);
}
.provider-card .modules .breakdown > div::after,
#featured-providers .modules .breakdown > div::after {
content: attr(data-tooltip);
position: absolute;
bottom: calc(100% + var(--space-2));
left: 50%;
transform: translateX(-50%);
padding: var(--space-1) var(--space-3);
font-size: var(--text-xs);
font-weight: var(--font-semibold);
white-space: nowrap;
border-radius: var(--radius-md);
background: var(--bg-tertiary);
border: 1px solid var(--border-primary);
color: var(--text-primary);
opacity: 0;
visibility: hidden;
transition: opacity var(--transition-fast), visibility var(--transition-fast);
z-index: 10;
pointer-events: none;
}
.provider-card .modules .breakdown > div:hover::after,
#featured-providers .modules .breakdown > div:hover::after {
opacity: 1;
visibility: visible;
}
.provider-card .modules .operator { background: var(--color-operator); }
.provider-card .modules .hook { background: var(--color-hook); }
.provider-card .modules .sensor { background: var(--color-sensor); }
.provider-card .modules .trigger { background: var(--color-trigger); }
.provider-card .modules .transfer { background: var(--color-transfer); }
.provider-card .modules .executor { background: var(--color-executor); }
.provider-card .modules .notifier { background: var(--color-notifier); }
.provider-card .modules .secret { background: var(--color-secret); }
.provider-card .modules .logging { background: var(--color-logging); }
.provider-card .modules .bundle { background: var(--color-bundle); }
.provider-card .modules .decorator { background: var(--color-decorator); }
.provider-card .meta,
#featured-providers .meta {
display: flex;
align-items: center;
gap: var(--space-4);
font-size: var(--text-sm);
}
.provider-card .downloads,
#featured-providers .downloads {
display: flex;
align-items: center;
gap: var(--space-2);
color: var(--text-secondary);
}
.provider-card .downloads .icon,
#featured-providers .downloads .icon {
width: 1rem;
height: 1rem;
}
.provider-card .versions,
#featured-providers .versions {
display: flex;
align-items: center;
gap: 0.375rem;
margin-left: auto;
}
.provider-card .version,
#featured-providers .version {
padding: 0.125rem 0.375rem;
background: var(--color-gray-100);
background: light-dark(var(--color-gray-100), var(--color-navy-700));
border: 1px solid var(--color-gray-300);
border-color: light-dark(var(--color-gray-300), var(--color-navy-600));
border-radius: var(--radius);
font-size: var(--text-xs);
font-weight: var(--font-medium);
color: var(--color-gray-500);
color: light-dark(var(--color-gray-500), var(--color-gray-400));
}
.provider-card .more,
#featured-providers .more {
font-size: var(--text-xs);
color: var(--text-muted);
}
.provider-card .chevron,
#featured-providers .chevron {
flex-shrink: 0;
width: var(--space-5);
height: var(--space-5);
color: var(--text-muted);
align-self: center;
transition: all var(--transition-base);
}
.provider-card:hover .chevron,
#featured-providers .provider:hover .chevron {
color: var(--accent-primary);
transform: translateX(var(--space-1));
}
/* Providers Listing Page */
.providers-page {
padding: var(--space-16) 0;
background: var(--bg-primary);
}
.providers-page .page-header {
text-align: left;
margin-bottom: var(--space-8);
}
.providers-page .page-header h1 {
font-size: var(--text-3xl);
font-weight: var(--font-bold);
color: var(--text-primary);
margin-bottom: var(--space-2);
}
.providers-page .page-header p {
color: var(--text-secondary);
}
/* Filters */
.filters {
display: none;
flex-direction: column;
gap: var(--space-4);
margin-bottom: var(--space-8);
padding: 0;
background: transparent;
border: none;
border-radius: 0;
}
.js .filters {
display: flex;
}
@media (min-width: 768px) {
.filters {
flex-direction: row;
align-items: center;
}
}
.search-wrapper {
position: relative;
flex: 1;
min-width: 0;
}
.search-wrapper .search-icon {
position: absolute;
left: var(--space-3);
top: 50%;
transform: translateY(-50%);
width: 1.25rem;
height: 1.25rem;
color: var(--text-muted);
pointer-events: none;
}
.search-wrapper input {
width: 100%;
padding: var(--space-3) var(--space-3) var(--space-3) 2.5rem;
background: var(--bg-primary-light);
background: light-dark(var(--bg-primary-light), var(--color-navy-800));
border: 1px solid var(--border-primary-light);
border: 1px solid light-dark(var(--border-primary-light), var(--color-navy-600));
border-radius: var(--radius-lg);
color: var(--text-primary);
font-size: var(--text-base);
transition: all var(--transition-base);
}
.search-wrapper input:focus {
outline: none;
border-color: var(--color-cyan-400);
}
.search-wrapper input::placeholder {
color: var(--text-muted);
}
.filter-group {
display: flex;
align-items: center;
gap: var(--space-2);
flex-shrink: 0;
}
.filter-group label {
font-size: var(--text-sm);
font-weight: var(--font-medium);
color: var(--text-secondary);
white-space: nowrap;
}
.lifecycle-buttons {
display: flex;
gap: var(--space-1);
background: var(--color-gray-100);
background: light-dark(var(--color-gray-100), var(--color-navy-800));
border: 1px solid var(--color-gray-300);
border: 1px solid light-dark(var(--color-gray-300), var(--color-navy-600));
border-radius: var(--radius-lg);
padding: var(--space-1);
outline: none;
}
.lifecycle-btn {
padding: var(--space-2) var(--space-3);
border-radius: var(--radius-md);
font-size: var(--text-sm);
font-weight: var(--font-medium);
color: var(--text-secondary);
background: transparent;
border: none;
outline: none;
transition: all var(--transition-base);
cursor: pointer;
}
.lifecycle-btn:hover {
color: var(--text-primary);
background: var(--bg-secondary);
}
.lifecycle-btn:focus-visible {
outline: 2px solid var(--color-cyan-500);
outline-offset: 2px;
}
.lifecycle-btn.active {
background: var(--color-cyan-500);
color: var(--color-navy-900);
font-weight: var(--font-medium);
}
.filter-group select {
padding: var(--space-2) var(--space-3);
background: var(--bg-primary-light);
background: light-dark(var(--bg-primary-light), var(--color-navy-800));
border: 1px solid var(--border-primary-light);
border: 1px solid light-dark(var(--border-primary-light), var(--color-navy-600));
border-radius: var(--radius-lg);
color: var(--text-primary);
font-size: var(--text-sm);
cursor: pointer;
transition: all var(--transition-base);
}
.filter-group select:focus {
outline: none;
border-color: var(--color-cyan-400);
}
/* Provider Grid */
.provider-grid {
list-style: none;
padding: 0;
margin: 0;
display: grid;
gap: var(--space-4);
grid-template-columns: 1fr;
}
@media (min-width: 768px) {
.provider-grid {
grid-template-columns: repeat(2, 1fr);
}
}
.provider-item {
display: flex;
}
.provider-item .provider-card {
flex: 1;
}
/* Empty State */
.empty-state {
text-align: center;
padding: var(--space-20) var(--space-4);
}
.empty-state .empty-icon {
width: 4rem;
height: 4rem;
margin: 0 auto var(--space-4);
color: var(--text-muted);
}
.empty-state h3 {
font-size: var(--text-xl);
font-weight: var(--font-semibold);
color: var(--text-primary);
margin-bottom: var(--space-2);
}
.empty-state p {
font-size: var(--text-base);
color: var(--text-secondary);
}
/* Featured / New Provider Sections */
#featured-providers,
#new-providers {
padding: var(--space-20) 0;
background: var(--bg-secondary-light);
background: light-dark(var(--bg-secondary-light), transparent);
}
#featured-providers header,
#new-providers header {
display: flex;
justify-content: space-between;
align-items: flex-start;
margin-bottom: var(--space-8);
}
#featured-providers h2,
#new-providers h2 {
font-size: var(--text-3xl);
font-weight: var(--font-bold);
color: var(--text-primary);
margin-bottom: var(--space-2);
}
#featured-providers header p,
#new-providers header p {
color: var(--text-secondary);
font-size: var(--text-base);
}
#featured-providers .view-all,
#new-providers .view-all {
display: inline-flex;
align-items: center;
gap: var(--space-2);
padding: var(--space-2) var(--space-4);
background: var(--color-gray-100);
background: light-dark(var(--color-gray-100), rgba(15, 23, 42, 0.5));
border: 1px solid var(--color-gray-200);
border: 1px solid var(--border-primary);
border-radius: var(--radius-lg);
color: var(--text-primary);
font-size: var(--text-sm);
font-weight: var(--font-medium);
text-decoration: none;
transition: all var(--transition-base);
}
#featured-providers .view-all:hover,
#new-providers .view-all:hover {
border-color: var(--color-gray-300);
border-color: light-dark(var(--color-gray-300), rgba(6, 182, 212, 0.5));
background: var(--color-gray-200);
background: light-dark(var(--color-gray-200), rgba(15, 23, 42, 0.8));
}
#featured-providers .view-all .icon,
#new-providers .view-all .icon {
width: 1rem;
height: 1rem;
}
#featured-providers .providers,
#new-providers .providers {
list-style: none;
padding: 0;
margin: 0;
display: grid;
gap: var(--space-6);
grid-template-columns: 1fr;
}
@media (min-width: 768px) {
#featured-providers .providers,
#new-providers .providers {
grid-template-columns: repeat(2, 1fr);
}
}
.version-badge {
padding: var(--space-1) var(--space-2);
font-size: var(--text-xs);
font-weight: var(--font-medium);
background: var(--bg-tertiary);
color: var(--text-secondary);
border: 1px solid var(--border-primary);
border-radius: var(--radius);
}
/* Section Headers */
.section-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: var(--space-8);
}
/* Quick filter buttons */
#hero .popular-providers {
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: center;
gap: var(--space-2);
}
#hero .popular-providers .label {
font-size: var(--text-sm);
color: var(--text-muted);
}
#hero .popular-providers a {
padding: var(--space-2) var(--space-4);
background: var(--color-gray-100);
background: light-dark(var(--color-gray-100), var(--bg-tertiary-dark));
border: 1px solid var(--color-gray-200);
border: 1px solid var(--border-primary);
border-radius: var(--radius-lg);
font-size: 0.875rem;
color: var(--color-navy-800);
color: var(--text-primary);
transition: all var(--transition-base);
}
#hero .popular-providers a:hover {
background: var(--color-gray-200);
background: light-dark(var(--color-gray-200), var(--color-navy-600));
border-color: var(--color-gray-300);
border-color: light-dark(var(--color-gray-300), var(--color-navy-500));
}
/* (legacy #newly-added removed — replaced by #new-providers) */
.new-modules {
list-style: none;
padding: 0;
margin: 0;
display: grid;
grid-template-columns: 1fr;
gap: var(--space-4);
}
@media (min-width: 768px) {
.new-modules {
grid-template-columns: repeat(2, 1fr);
}
}
a.new-module {
display: flex;
gap: var(--space-3);
padding: var(--space-4);
text-decoration: none;
color: inherit;
}
.new-module .type-icon {
flex-shrink: 0;
}
.new-module h4 {
font-size: var(--text-base);
font-weight: var(--font-semibold);
color: var(--text-primary);
margin: 0 0 var(--space-1);
}
.new-module .provider-label {
font-size: var(--text-xs);
color: var(--text-muted);
}
.new-module p {
font-size: var(--text-sm);
color: var(--text-secondary);
margin: var(--space-2) 0 0;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
}
/* Categories Section */
#categories {
padding: var(--space-20) 0;
}
#categories header {
text-align: center;
margin-bottom: var(--space-12);
}
#categories h2 {
font-size: var(--text-2xl);
font-weight: var(--font-bold);
color: var(--text-primary);
margin-bottom: var(--space-2);
}
#categories header p {
color: var(--text-secondary);
}
#categories ul {
list-style: none;
padding: 0;
margin: 0;
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: var(--space-4);
font-size: var(--text-sm);
color: var(--text-muted);
}
@media (min-width: 768px) {
#categories ul {
grid-template-columns: repeat(4, 1fr);
}
}
#categories .category {
padding: var(--space-6);
text-align: center; background: var(--color-card-bg);
border: 1px solid var(--border-primary-light);
border: 1px solid var(--border-primary);
border-radius: var(--radius-lg);
backdrop-filter: blur(4px);
transition: all var(--transition-base);
cursor: pointer;
text-decoration: none;
display: block;
}
#categories .category:hover { border-color: var(--color-card-border-hover);
background: var(--color-card-bg-hover);
box-shadow: 0 10px 40px -10px rgba(6, 182, 212, 0.15);
box-shadow: 0 10px 40px -10px light-dark(rgba(6, 182, 212, 0.15), rgba(6, 182, 212, 0.1));
}
#categories .icon {
width: 3rem;
height: 3rem;
margin: 0 auto var(--space-4);
border-radius: var(--radius-xl);
display: flex;
align-items: center;
justify-content: center;
}
#categories .icon svg {
width: 1.5rem;
height: 1.5rem;
}
#categories .category.databases .icon {
background: rgba(59, 130, 246, 0.2);
color: var(--color-blue-400);
}
#categories .category.cloud .icon {
background: rgba(6, 182, 212, 0.2);
color: var(--color-cyan-400);
}
#categories .category.ml .icon {
background: rgba(168, 85, 247, 0.2);
color: var(--color-purple-400);
}
#categories .category.data-processing .icon {
background: rgba(34, 197, 94, 0.2);
color: var(--color-green-400);
}
#categories h3 {
font-size: var(--text-base);
font-weight: var(--font-semibold);
color: var(--text-primary);
margin-bottom: var(--space-1);
}
/* Install Widget Section */
.install {
padding: var(--space-16) 0;
background: linear-gradient(to right, rgba(6, 182, 212, 0.1), rgba(99, 102, 241, 0.1));
border-top: 1px solid var(--border-primary);
}
.install .container {
max-width: 56rem;
text-align: center;
}
.install header {
margin-bottom: var(--space-8);
}
.install h2 {
font-size: var(--text-2xl);
font-weight: var(--font-bold);
color: var(--text-primary);
margin-bottom: var(--space-4);
}
.install header p {
color: var(--text-secondary);
}
.install .command-box {
display: flex;
align-items: stretch;
background: var(--bg-tertiary-light);
background: light-dark(var(--bg-tertiary-light), var(--color-navy-900));
border: 1px solid var(--border-primary);
border-radius: var(--radius-xl);
padding: 0;
text-align: left;
overflow: hidden;
max-width: 32rem;
margin: 0 auto;
}
.install .command-box code {
flex: 1;
font-size: var(--text-sm);
font-family: var(--font-mono);
color: var(--color-gray-800);
color: light-dark(var(--color-gray-800), var(--color-gray-300));
padding: 0.5rem 0.5rem 0.5rem 1rem;
display: flex;
align-items: center;
}
/* Main content area */
main {
flex: 1;
}
/* Explore Page */
.explore-page {
padding: var(--space-16) 0;
background: var(--bg-surface-alt);
min-height: calc(100vh - var(--header-height, 0));
}
.explore-page .page-header {
text-align: center;
margin-bottom: var(--space-12);
}
.explore-page .page-header h1 {
font-size: var(--text-3xl);
font-weight: var(--font-bold);
color: var(--text-primary);
margin-bottom: var(--space-4);
}
.explore-page .page-header p {
font-size: var(--text-lg);
color: var(--text-secondary);
}
/* Category Grid */
.category-grid {
display: grid;
grid-template-columns: 1fr;
gap: var(--space-6);
margin-bottom: var(--space-16);
}
@media (min-width: 768px) {
.category-grid {
grid-template-columns: repeat(2, 1fr);
}
}
@media (min-width: 1024px) {
.category-grid {
grid-template-columns: repeat(3, 1fr);
}
}
/* Category Card */
.category-card {
padding: var(--space-6);
background: #ffffff;
background: light-dark(#ffffff, var(--color-card-bg));
border: 1px solid var(--border-primary);
border-radius: var(--radius-xl);
transition: all var(--transition-base);
}
.category-card:hover {
border-color: var(--color-card-border-hover);
background: var(--color-card-bg-hover);
box-shadow: 0 10px 40px -10px rgba(6, 182, 212, 0.15);
box-shadow: 0 10px 40px -10px light-dark(rgba(6, 182, 212, 0.15), rgba(6, 182, 212, 0.1));
}
.category-header {
display: flex;
align-items: center;
gap: var(--space-3);
margin-bottom: var(--space-4);
}
.category-header > div {
line-height: 1.2;
}
.category-icon {
width: 2.5rem;
height: 2.5rem;
border-radius: var(--radius-lg);
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
}
.category-icon svg {
width: 1.5rem;
height: 1.5rem;
}
.category-card h2 {
font-size: var(--text-base);
font-weight: var(--font-semibold);
color: var(--text-primary);
margin: 0;
}
.provider-count {
font-size: var(--text-xs);
color: var(--text-muted);
margin: 0;
line-height: 1.5;
}
.category-description {
font-size: var(--text-sm);
color: var(--text-secondary);
margin-bottom: var(--space-4);
}
/* Category Color Variants */
.category-card.color-cyan .category-icon {
background: rgba(6, 182, 212, 0.2);
color: var(--color-cyan-400);
}
.category-card.color-blue .category-icon {
background: rgba(59, 130, 246, 0.2);
color: var(--color-blue-400);
}
.category-card.color-purple .category-icon {
background: rgba(168, 85, 247, 0.2);
color: var(--color-purple-400);
}
.category-card.color-green .category-icon {
background: rgba(34, 197, 94, 0.2);
color: var(--color-green-400);
}
.category-card.color-amber .category-icon {
background: rgba(251, 191, 36, 0.2);
color: var(--color-amber-400);
}
.category-card.color-rose .category-icon {
background: rgba(244, 63, 94, 0.2);
color: var(--color-rose-400);
}
/* Category-specific border colors */
.category-card.color-cyan {
border-color: rgba(6, 182, 212, 0.3);
border-color: light-dark(rgba(6, 182, 212, 0.3), rgba(6, 182, 212, 0.2));
}
.category-card.color-blue {
border-color: rgba(59, 130, 246, 0.3);
border-color: light-dark(rgba(59, 130, 246, 0.3), rgba(59, 130, 246, 0.2));
}
.category-card.color-purple {
border-color: rgba(168, 85, 247, 0.3);
border-color: light-dark(rgba(168, 85, 247, 0.3), rgba(168, 85, 247, 0.2));
}
.category-card.color-green {
border-color: rgba(34, 197, 94, 0.3);
border-color: light-dark(rgba(34, 197, 94, 0.3), rgba(34, 197, 94, 0.2));
}
.category-card.color-amber {
border-color: rgba(251, 191, 36, 0.3);
border-color: light-dark(rgba(251, 191, 36, 0.3), rgba(251, 191, 36, 0.2));
}
.category-card.color-rose {
border-color: rgba(244, 63, 94, 0.3);
border-color: light-dark(rgba(244, 63, 94, 0.3), rgba(244, 63, 94, 0.2));
}
/* Category-specific badge colors */
.category-card.color-cyan .provider-badge {
background: rgba(6, 182, 212, 0.2);
color: var(--color-cyan-600);
color: light-dark(var(--color-cyan-600), var(--color-cyan-400));
}
.category-card.color-blue .provider-badge {
background: rgba(59, 130, 246, 0.2);
color: var(--color-blue-600);
color: light-dark(var(--color-blue-600), var(--color-blue-400));
}
.category-card.color-purple .provider-badge {
background: rgba(168, 85, 247, 0.2);
color: var(--color-purple-600);
color: light-dark(var(--color-purple-600), var(--color-purple-400));
}
.category-card.color-green .provider-badge {
background: rgba(34, 197, 94, 0.2);
color: var(--color-green-600);
color: light-dark(var(--color-green-600), var(--color-green-400));
}
.category-card.color-amber .provider-badge {
background: rgba(251, 191, 36, 0.2);
color: var(--color-amber-600);
color: light-dark(var(--color-amber-600), var(--color-amber-400));
}
.category-card.color-rose .provider-badge {
background: rgba(244, 63, 94, 0.2);
color: var(--color-rose-600);
color: light-dark(var(--color-rose-600), var(--color-rose-400));
}
/* Provider Badges */
.provider-badges {
display: flex;
flex-wrap: wrap;
gap: var(--space-2);
margin-bottom: var(--space-4);
}
.provider-badge {
display: flex;
align-items: center;
gap: 0.375rem;
padding: 0.25rem 0.625rem;
background: var(--bg-tertiary);
border: 1px solid transparent;
border-radius: var(--radius-lg);
font-size: var(--text-sm);
color: var(--text-secondary);
transition: all var(--transition-base);
text-decoration: none;
}
.provider-badge:hover {
background: var(--color-card-bg-hover);
border-color: var(--color-card-border-hover);
color: var(--text-primary);
}
.provider-badge img {
width: 1rem;
height: 1rem;
border-radius: var(--radius);
}
/* Category and Section Continuation Links */
.category-card > a,
.featured-section > a {
display: inline-flex;
align-items: center;
gap: var(--space-1);
font-size: var(--text-sm);
color: var(--text-secondary);
transition: color var(--transition-base);
text-decoration: none;
}
.category-card > a:hover,
.featured-section > a:hover {
color: var(--color-cyan-400);
}
.category-card > a svg,
.featured-section > a svg {
width: 1rem;
height: 1rem;
}
/* Featured Sections */
.featured-sections {
display: grid;
grid-template-columns: 1fr;
gap: var(--space-8);
margin-bottom: var(--space-16);
}
@media (min-width: 1024px) {
.featured-sections {
grid-template-columns: repeat(2, 1fr);
}
}
.featured-section {
min-width: 0;
}
.featured-section .section-header {
display: flex;
align-items: center;
gap: var(--space-3);
margin-bottom: var(--space-6);
}
.featured-section h2 {
font-size: var(--text-xl);
font-weight: var(--font-bold);
color: var(--text-primary);
}
.lifecycle-badge {
padding: var(--space-1) var(--space-3);
font-size: var(--text-xs);
font-weight: var(--font-medium);
border-radius: var(--radius-lg);
}
.lifecycle-badge.lifecycle-stable {
background: rgba(6, 182, 212, 0.15);
background: light-dark(rgba(6, 182, 212, 0.15), rgba(6, 182, 212, 0.1));
color: var(--color-cyan-400);
}
.lifecycle-badge.lifecycle-incubation {
background: color-mix(in srgb, var(--color-amber-500) 15%, transparent);
color: light-dark(var(--color-amber-600), var(--color-amber-400));
}
.lifecycle-badge.lifecycle-deprecated {
background: var(--bg-tertiary);
color: var(--text-secondary);
}
/* Provider List */
.provider-list {
display: flex;
flex-direction: column;
gap: var(--space-3);
margin-bottom: var(--space-4);
}
.provider-row {
display: flex;
align-items: center;
gap: var(--space-4);
padding: var(--space-4);
background: var(--color-card-bg);
border: 1px solid var(--border-primary);
border-radius: var(--radius-lg);
transition: all var(--transition-base);
text-decoration: none;
}
.provider-row:hover {
border-color: var(--color-card-border-hover);
background: var(--color-card-bg-hover);
}
.provider-logo {
width: 2.5rem;
height: 2.5rem;
border-radius: var(--radius);
flex-shrink: 0;
display: flex;
align-items: center;
justify-content: center;
background: var(--bg-tertiary);
}
.provider-logo img {
width: 2rem;
height: 2rem;
object-fit: contain;
}
.provider-logo .initial {
font-size: var(--text-lg);
font-weight: var(--font-semibold);
color: var(--color-cyan-400);
}
.provider-info {
flex: 1;
min-width: 0;
overflow: hidden;
}
.provider-name {
font-size: var(--text-base);
font-weight: var(--font-semibold);
color: var(--text-primary);
margin-bottom: var(--space-1);
}
.provider-desc {
font-size: var(--text-xs);
color: var(--text-secondary);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
max-width: 100%;
display: block;
}
.module-count {
font-size: var(--text-sm);
color: var(--text-muted);
white-space: nowrap;
}
/* Quick Links */
.quick-links {
text-align: center;
padding: var(--space-12) 0;
}
.quick-links p {
font-size: var(--text-lg);
color: var(--text-secondary);
margin-bottom: var(--space-6);
}
.link-buttons {
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: center;
gap: var(--space-4);
}
/* Quick Links Actions */
.quick-links button,
.quick-links a {
display: inline-flex;
align-items: center;
gap: var(--space-2);
padding: var(--space-3) var(--space-6);
border-radius: var(--radius-lg);
font-size: var(--text-base);
font-weight: var(--font-medium);
transition: all var(--transition-base);
text-decoration: none;
border: 1px solid transparent;
cursor: pointer;
}
.quick-links button {
background: var(--color-cyan-500);
color: white;
}
.quick-links button:hover {
background: var(--color-cyan-600);
}
.quick-links button svg {
width: 1.25rem;
height: 1.25rem;
}
.quick-links a {
background: var(--bg-tertiary);
color: var(--text-primary);
border-color: var(--border-primary);
}
.quick-links a:hover {
background: var(--color-card-bg-hover);
border-color: var(--color-card-border-hover);
}
/* Statistics Page */
.statistics-page {
padding: var(--space-16) 0;
background: var(--bg-surface-alt);
min-height: calc(100vh - var(--header-height, 0));
}
.statistics-page .page-header {
text-align: center;
margin-bottom: var(--space-12);
}
.statistics-page .page-header h1 {
font-size: var(--text-3xl);
font-weight: var(--font-bold);
color: var(--text-primary);
margin-bottom: var(--space-4);
}
.statistics-page .page-header p {
font-size: var(--text-lg);
color: var(--text-secondary);
}
/* Stats Overview */
.stats-overview {
margin-bottom: var(--space-12);
}
.stats-overview dl {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: var(--space-4);
}
@media (min-width: 768px) {
.stats-overview dl {
grid-template-columns: repeat(4, 1fr);
}
}
.stats-overview dl > div {
padding: var(--space-6);
background: var(--color-card-bg);
border: 1px solid var(--border-primary);
border-radius: var(--radius-lg);
text-align: center;
transition: all var(--transition-base);
}
.stats-overview dl > div:hover {
border-color: var(--color-card-border-hover);
background: var(--color-card-bg-hover);
}
.stats-overview dt {
font-size: var(--text-4xl);
font-weight: var(--font-bold);
color: var(--accent-primary);
margin-bottom: var(--space-2);
display: block;
}
.stats-overview dd {
font-size: var(--text-sm);
font-weight: var(--font-medium);
color: var(--text-secondary);
margin: 0;
}
/* Module Breakdown */
.module-breakdown {
margin-bottom: var(--space-12);
}
.module-breakdown header {
margin-bottom: var(--space-6);
}
.module-breakdown h2 {
font-size: var(--text-xl);
font-weight: var(--font-semibold);
color: var(--text-primary);
}
.breakdown-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: var(--space-4);
}
@media (min-width: 640px) {
.breakdown-grid {
grid-template-columns: repeat(3, 1fr);
}
}
@media (min-width: 768px) {
.breakdown-grid {
grid-template-columns: repeat(5, 1fr);
}
}
.module-type {
padding: var(--space-5);
background: var(--color-card-bg);
border: 1px solid var(--border-primary);
border-radius: var(--radius-lg);
transition: all var(--transition-base);
}
.module-type:hover {
border-color: var(--color-card-border-hover);
background: var(--color-card-bg-hover);
}
.type-header {
display: flex;
align-items: center;
gap: var(--space-3);
margin-bottom: var(--space-3);
}
.type-icon {
width: 2.5rem;
height: 2.5rem;
border-radius: var(--radius-lg);
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
}
.type-icon span {
font-size: var(--text-lg);
font-weight: var(--font-bold);
}
.type-icon.operator {
background: rgba(34, 197, 94, 0.2);
color: var(--color-green-400);
}
.type-icon.hook {
background: rgba(59, 130, 246, 0.2);
color: var(--color-blue-400);
}
.type-icon.sensor {
background: rgba(245, 158, 11, 0.2);
color: var(--color-amber-400);
}
.type-icon.trigger {
background: rgba(168, 85, 247, 0.2);
color: var(--color-purple-400);
}
.type-icon.transfer {
background: rgba(236, 72, 153, 0.2);
color: var(--color-pink-400);
}
.type-icon.executor {
background: rgba(249, 115, 22, 0.2);
color: var(--color-executor);
}
.type-icon.notifier {
background: rgba(99, 102, 241, 0.2);
color: var(--color-notifier);
}
.type-icon.secret {
background: rgba(244, 63, 94, 0.2);
color: var(--color-secret);
}
.type-icon.logging {
background: rgba(20, 184, 166, 0.2);
color: var(--color-logging);
}
.type-icon.bundle {
background: rgba(14, 165, 233, 0.2);
color: var(--color-bundle);
}
.type-icon.decorator {
background: rgba(217, 70, 239, 0.2);
color: var(--color-decorator);
}
.type-count {
font-size: var(--text-2xl);
font-weight: var(--font-bold);
color: var(--text-primary);
}
.type-label {
font-size: var(--text-sm);
font-weight: var(--font-medium);
color: var(--text-secondary);
margin-bottom: var(--space-3);
}
.share-bar {
width: 100%;
height: 0.5rem;
border-radius: var(--radius-full);
margin-bottom: var(--space-2);
appearance: none;
-webkit-appearance: none;
-moz-appearance: none;
border: none;
background: var(--bg-secondary);
}
.share-bar::-webkit-meter-bar {
background: var(--bg-secondary);
border-radius: var(--radius-full);
border: none;
}
.share-bar::-webkit-meter-optimum-value {
background: var(--meter-color, var(--color-gray-500));
border-radius: var(--radius-full);
transition: width var(--transition-base);
}
.share-bar::-moz-meter-bar {
background: var(--meter-color, var(--color-gray-500));
border-radius: var(--radius-full);
border: none;
}
.share-bar.operator {
--meter-color: var(--color-operator);
}
.share-bar.hook {
--meter-color: var(--color-hook);
}
.share-bar.sensor {
--meter-color: var(--color-sensor);
}
.share-bar.trigger {
--meter-color: var(--color-trigger);
}
.share-bar.transfer {
--meter-color: var(--color-transfer);
}
.share-bar.executor {
--meter-color: var(--color-executor);
}
.share-bar.notifier {
--meter-color: var(--color-notifier);
}
.share-bar.secret {
--meter-color: var(--color-secret);
}
.share-bar.logging {
--meter-color: var(--color-logging);
}
.share-bar.bundle {
--meter-color: var(--color-bundle);
}
.share-bar.decorator {
--meter-color: var(--color-decorator);
}
.share-label {
font-size: var(--text-xs);
color: var(--text-muted);
}
/* Two Column Section */
.stats-columns {
display: grid;
grid-template-columns: 1fr;
gap: var(--space-8);
margin-bottom: var(--space-12);
}
@media (min-width: 768px) {
.stats-columns {
grid-template-columns: repeat(2, 1fr);
}
}
/* Tier Distribution */
.lifecycle-distribution {
padding: var(--space-6);
}
.lifecycle-distribution header {
margin-bottom: var(--space-6);
}
.lifecycle-distribution h2 {
font-size: var(--text-xl);
font-weight: var(--font-semibold);
color: var(--text-primary);
}
.lifecycle-stats {
display: flex;
flex-direction: column;
gap: var(--space-4);
}
.lifecycle-stat {
display: flex;
flex-direction: column;
gap: var(--space-2);
}
.lifecycle-info {
display: flex;
justify-content: space-between;
align-items: center;
}
.lifecycle-name {
font-weight: var(--font-medium);
text-transform: capitalize;
}
.lifecycle-name.lifecycle-stable {
color: var(--color-cyan-400);
}
.lifecycle-name.lifecycle-incubation {
color: light-dark(var(--color-amber-600), var(--color-amber-400));
}
.lifecycle-name.lifecycle-deprecated {
color: var(--text-secondary);
}
.lifecycle-count {
font-size: var(--text-sm);
color: var(--text-secondary);
}
.lifecycle-bar {
width: 100%;
height: 0.75rem;
border-radius: var(--radius-full);
appearance: none;
-webkit-appearance: none;
-moz-appearance: none;
border: none;
background: var(--bg-secondary);
}
.lifecycle-bar::-webkit-meter-bar {
background: var(--bg-secondary);
border-radius: var(--radius-full);
border: none;
}
.lifecycle-bar::-webkit-meter-optimum-value {
background: var(--meter-color, var(--color-gray-500));
border-radius: var(--radius-full);
transition: width var(--transition-base);
}
.lifecycle-bar::-moz-meter-bar {
background: var(--meter-color, var(--color-gray-500));
border-radius: var(--radius-full);
border: none;
}
.lifecycle-bar.lifecycle-stable {
--meter-color: var(--color-cyan-500);
}
.lifecycle-bar.lifecycle-incubation {
--meter-color: var(--color-amber-500);
}
.lifecycle-bar.lifecycle-deprecated {
--meter-color: var(--color-gray-500);
}
/* Quick Access */
.quick-access {
padding: var(--space-6);
}
.quick-access header {
margin-bottom: var(--space-6);
}
.quick-access h2 {
font-size: var(--text-xl);
font-weight: var(--font-semibold);
color: var(--text-primary);
}
.access-links {
display: flex;
flex-direction: column;
gap: var(--space-3);
}
.access-link {
display: flex;
align-items: center;
justify-content: space-between;
padding: var(--space-3);
background: var(--bg-tertiary);
border-radius: var(--radius-lg);
color: var(--text-primary);
text-decoration: none;
transition: all var(--transition-base);
}
.access-link:hover {
background: var(--bg-secondary);
}
.access-link:hover .chevron {
color: var(--color-cyan-400);
transform: translateX(0.25rem);
}
.access-link .chevron {
width: 1.25rem;
height: 1.25rem;
color: var(--text-muted);
transition: all var(--transition-base);
}
/* Provider Ranking */
.provider-ranking {
margin-bottom: var(--space-12);
}
.provider-ranking header {
margin-bottom: var(--space-6);
}
.provider-ranking h2 {
font-size: var(--text-xl);
font-weight: var(--font-semibold);
color: var(--text-primary);
}
.ranking-tabs {
display: flex;
gap: var(--space-2);
}
.ranking-tab {
padding: var(--space-2) var(--space-4);
font-size: var(--text-sm);
font-weight: var(--font-medium);
color: var(--text-secondary);
background: transparent;
border: 1px solid var(--border-primary);
border-radius: var(--radius);
cursor: pointer;
transition: all var(--transition-base);
}
.ranking-tab:hover {
color: var(--text-primary);
border-color: var(--text-muted);
}
.ranking-tab.active {
color: var(--color-cyan-400);
border-color: var(--color-cyan-400);
background: color-mix(in srgb, var(--color-cyan-400) 10%, transparent);
}
.ranking-panel[hidden] {
display: none;
}
.downloads-column {
text-align: right;
}
.downloads-count {
text-align: right;
font-weight: var(--font-medium);
font-variant-numeric: tabular-nums;
color: var(--text-primary);
}
.ranking-table {
width: 100%;
border-collapse: collapse;
}
.ranking-header {
background: var(--bg-tertiary);
}
.ranking-header th {
padding: var(--space-3) var(--space-4);
font-size: var(--text-sm);
font-weight: var(--font-semibold);
color: var(--text-secondary);
text-align: left;
}
.ranking-header .module-column,
.ranking-header .total-column {
text-align: center;
}
.ranking-header .full-label {
display: none;
}
@media (min-width: 640px) {
.ranking-header .full-label {
display: inline;
}
.ranking-header .abbr-label {
display: none;
}
}
.ranking-row {
border-top: 1px solid var(--border-primary);
transition: background-color var(--transition-base);
}
.ranking-row:hover {
background: var(--bg-secondary);
}
.ranking-row td {
padding: var(--space-3) var(--space-4);
}
.rank-cell {
color: var(--text-muted);
}
.provider-cell {
min-width: 200px;
}
.provider-link {
display: flex;
align-items: center;
gap: var(--space-2);
color: var(--text-primary);
text-decoration: none;
transition: color var(--transition-base);
}
.provider-link:hover {
color: var(--color-cyan-400);
}
.provider-link .provider-logo {
width: 2rem;
height: 2rem;
border-radius: var(--radius);
background: var(--bg-tertiary);
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
}
.provider-link .provider-logo img {
width: 1.5rem;
height: 1.5rem;
object-fit: contain;
}
.provider-link .initial {
font-size: var(--text-sm);
font-weight: var(--font-bold);
color: var(--color-cyan-400);
}
.provider-link .provider-name {
font-weight: var(--font-medium);
}
.module-count {
text-align: center;
font-weight: var(--font-medium);
}
.module-count.operator {
color: var(--color-green-400);
}
.module-count.hook {
color: var(--color-blue-400);
}
.module-count.sensor {
color: var(--color-amber-400);
}
.module-count.trigger {
color: var(--color-purple-400);
}
.module-count.transfer {
color: var(--color-pink-400);
}
.total-count {
text-align: center;
font-weight: var(--font-bold);
color: var(--color-cyan-400);
}
/* ========================================
Provider Detail Page
======================================== */
.provider-detail-page .container {
padding-top: var(--space-8);
}
/* Breadcrumb */
.breadcrumb {
display: flex;
align-items: center;
gap: var(--space-2);
margin-bottom: var(--space-6);
font-size: var(--text-sm);
color: var(--text-secondary);
}
.breadcrumb a {
color: var(--text-secondary);
transition: color var(--transition-base);
}
.breadcrumb a:hover {
color: var(--text-primary);
}
.breadcrumb svg {
width: 1rem;
height: 1rem;
color: var(--text-muted);
}
.breadcrumb span:last-child {
color: var(--text-primary);
}
/* Provider Detail Page - Header */
.provider-detail-page header {
padding: var(--space-6);
margin-bottom: var(--space-8);
}
.provider-detail-page header .top {
display: flex;
align-items: flex-start;
gap: var(--space-4);
margin-bottom: var(--space-6);
}
.provider-detail-page header .logo {
width: 4rem;
height: 4rem;
border-radius: var(--radius-xl);
background: var(--bg-tertiary);
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
overflow: hidden;
}
.provider-detail-page header .logo img {
width: 3.5rem;
height: 3.5rem;
object-fit: contain;
}
.provider-detail-page header .logo .initial {
font-size: var(--text-2xl);
font-weight: var(--font-bold);
color: var(--accent-primary);
}
.provider-detail-page header .details {
flex: 1;
}
.provider-detail-page header .title-row {
display: flex;
align-items: center;
gap: var(--space-3);
margin-bottom: var(--space-2);
}
.provider-detail-page header .title-row h1 {
font-size: var(--text-2xl);
font-weight: var(--font-bold);
color: var(--text-primary);
}
.provider-detail-page header .package-name {
font-size: var(--text-sm);
color: var(--text-muted);
font-family: var(--font-mono);
margin-bottom: var(--space-2);
}
.provider-detail-page header .description {
color: var(--text-secondary);
max-width: 48rem;
}
.provider-detail-page header .version-badges {
display: flex;
align-items: center;
gap: var(--space-2);
margin-top: var(--space-3);
}
.provider-detail-page header .version-label {
font-size: var(--text-sm);
color: var(--text-secondary);
}
.provider-detail-page header .version-badge {
padding: 0.125rem var(--space-2);
font-size: var(--text-xs);
font-weight: var(--font-medium);
background: rgb(from var(--color-green-500) r g b / 0.2);
color: var(--color-green-400);
border-radius: var(--radius-sm);
border: 1px solid rgb(from var(--color-green-500) r g b / 0.3);
}
/* Stats */
/* Header Footer */
.provider-detail-page header .footer {
display: flex;
flex-direction: column;
gap: var(--space-4);
padding-top: var(--space-4);
border-top: 1px solid var(--border-primary);
}
@media (min-width: 640px) {
.provider-detail-page header .footer {
flex-direction: row;
align-items: center;
justify-content: space-between;
}
}
.provider-detail-page header .downloads {
text-align: center;
}
.provider-detail-page header .downloads .count {
font-size: var(--text-2xl);
font-weight: var(--font-bold);
color: var(--text-primary);
}
.provider-detail-page header .downloads .label {
font-size: var(--text-xs);
color: var(--text-secondary);
}
.provider-detail-page header .actions {
display: flex;
align-items: center;
gap: var(--space-3);
}
.btn-primary,
.btn-secondary {
display: inline-flex;
align-items: center;
gap: var(--space-2);
padding: var(--space-2) var(--space-4);
font-size: var(--text-sm);
font-weight: var(--font-medium);
border-radius: var(--radius-lg);
transition: all var(--transition-base);
text-decoration: none;
}
.btn-primary {
background: var(--accent-primary);
color: var(--color-navy-900);
}
.btn-primary:hover {
background: var(--color-cyan-300);
}
.btn-primary svg {
width: 1rem;
height: 1rem;
}
.btn-secondary {
background: transparent;
color: var(--text-primary);
border: 1px solid var(--border-primary);
}
.btn-secondary:hover {
background: var(--bg-tertiary);
border-color: var(--border-secondary);
}
.btn-secondary svg {
width: 1rem;
height: 1rem;
}
/* Install */
.provider-detail-page .install {
display: flex;
flex-direction: column;
gap: var(--space-4);
padding: var(--space-4);
margin-bottom: var(--space-6);
}
@media (min-width: 640px) {
.provider-detail-page .install {
flex-direction: row;
align-items: center;
}
}
.provider-detail-page .install-label {
font-size: var(--text-sm);
font-weight: var(--font-semibold);
color: var(--text-secondary);
flex-shrink: 0;
}
.provider-detail-page .install .command {
display: flex;
align-items: stretch;
background: var(--bg-tertiary-light);
background: light-dark(var(--bg-tertiary-light), var(--color-navy-900));
border-radius: var(--radius-lg);
padding: 0;
min-width: 0;
overflow: hidden;
flex: 1;
}
.provider-detail-page .install .command code {
flex: 1;
font-size: var(--text-sm);
font-family: var(--font-mono);
color: var(--text-primary);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
padding: var(--space-2) var(--space-2) var(--space-2) var(--space-4);
display: flex;
align-items: center;
}
.install .copy {
flex-shrink: 0;
padding: var(--space-2) var(--space-3);
background: transparent;
border: none;
color: var(--text-secondary);
cursor: pointer;
transition: all var(--transition-base);
display: flex;
align-items: center;
}
.install .copy:hover {
background: var(--border-primary-light);
background: light-dark(var(--color-gray-200), var(--bg-tertiary));
color: var(--accent-primary);
}
.install .copy svg {
width: 1rem;
height: 1rem;
}
/* Install Options (extras/version dropdowns) */
.provider-detail-page .install-options {
display: flex;
align-items: center;
gap: var(--space-3);
flex-shrink: 0;
flex-wrap: wrap;
}
.provider-detail-page .install-option {
display: flex;
align-items: center;
gap: var(--space-2);
}
.provider-detail-page .install-option label {
font-size: var(--text-sm);
color: var(--text-secondary);
white-space: nowrap;
}
.provider-detail-page .install-option select {
padding: var(--space-2) var(--space-3);
background: var(--bg-tertiary);
border: 1px solid var(--border-primary);
border-radius: var(--radius-lg);
color: var(--text-primary);
font-size: var(--text-sm);
cursor: pointer;
}
.provider-detail-page .install-option #extras-select {
border-color: rgb(from var(--color-sensor) r g b / 0.5);
color: var(--color-sensor);
}
.provider-detail-page .install-option #version-select {
border-color: rgb(from var(--accent-primary) r g b / 0.5);
color: var(--accent-primary);
font-weight: var(--font-medium);
}
/* Extra Dependencies Info Box */
.version-banner {
display: flex;
align-items: center;
gap: var(--space-2);
padding: var(--space-3);
margin-bottom: var(--space-6);
background: rgba(245, 158, 11, 0.1);
background: rgb(from var(--color-warning, #f59e0b) r g b / 0.1);
border: 1px solid rgba(245, 158, 11, 0.25);
border-color: rgb(from var(--color-warning, #f59e0b) r g b / 0.25);
border-radius: var(--radius-md, 0.5rem);
font-size: var(--text-sm);
color: var(--text-secondary);
}
.version-banner > svg {
width: 1.25rem;
height: 1.25rem;
flex-shrink: 0;
color: var(--color-warning, #f59e0b);
}
.version-banner a {
color: var(--accent-primary);
text-decoration: underline;
}
.no-modules-banner {
display: flex;
align-items: flex-start;
gap: var(--space-4);
padding: var(--space-6);
margin-bottom: var(--space-6);
background: var(--bg-secondary);
border: 1px solid var(--border-primary);
}
.no-modules-banner > svg {
width: 1.5rem;
height: 1.5rem;
flex-shrink: 0;
color: var(--text-muted);
margin-top: 0.125rem;
}
.no-modules-banner h3 {
font-size: var(--text-base);
font-weight: var(--font-semibold);
color: var(--text-primary);
margin-bottom: var(--space-1);
}
.no-modules-banner p {
font-size: var(--text-sm);
color: var(--text-secondary);
line-height: 1.5;
}
.extra-deps-info {
display: flex;
align-items: flex-start;
gap: var(--space-2);
padding: var(--space-3);
margin-bottom: var(--space-6);
background: rgb(from var(--color-sensor) r g b / 0.1);
border-color: rgb(from var(--color-sensor) r g b / 0.2);
}
.extra-deps-info[hidden] {
display: none;
}
.extra-deps-info > svg {
width: 1rem;
height: 1rem;
flex-shrink: 0;
margin-top: 0.125rem;
color: var(--color-sensor);
}
.extra-deps-info strong {
font-size: var(--text-sm);
color: var(--color-sensor);
}
.extra-deps-info p {
font-size: var(--text-sm);
color: var(--text-secondary);
margin: var(--space-1) 0 0;
}
/* Module Type Tabs */
.module-tabs {
display: flex;
flex-wrap: wrap;
gap: var(--space-2);
margin-bottom: var(--space-6);
}
.module-tab {
display: inline-flex;
align-items: center;
gap: 0.375rem;
padding: var(--space-2) var(--space-4);
border-radius: var(--radius-lg);
font-size: var(--text-sm);
font-weight: var(--font-medium);
background: var(--bg-tertiary);
color: var(--text-secondary);
border: 1px solid var(--border-primary);
cursor: pointer;
transition: all var(--transition-base);
}
.module-tab:hover {
color: var(--text-primary);
border-color: var(--border-secondary);
}
.module-tab.active {
background: rgb(from var(--accent-primary) r g b / 0.2);
color: var(--accent-primary);
border-color: rgb(from var(--accent-primary) r g b / 0.3);
}
.tab-icon {
display: inline-flex;
align-items: center;
justify-content: center;
width: 1.25rem;
height: 1.25rem;
border-radius: var(--radius-sm);
font-size: var(--text-xs);
font-weight: var(--font-bold);
}
.tab-icon.operator { background: rgb(from var(--color-operator) r g b / 0.2); color: var(--color-operator); }
.tab-icon.hook { background: rgb(from var(--color-hook) r g b / 0.2); color: var(--color-hook); }
.tab-icon.sensor { background: rgb(from var(--color-sensor) r g b / 0.2); color: var(--color-sensor); }
.tab-icon.trigger { background: rgb(from var(--color-trigger) r g b / 0.2); color: var(--color-trigger); }
.tab-icon.transfer { background: rgb(from var(--color-transfer) r g b / 0.2); color: var(--color-transfer); }
.tab-icon.notifier { background: rgb(from var(--color-notifier) r g b / 0.2); color: var(--color-notifier); }
.tab-icon.secret { background: rgb(from var(--color-secret) r g b / 0.2); color: var(--color-secret); }
.tab-icon.logging { background: rgb(from var(--color-logging) r g b / 0.2); color: var(--color-logging); }
.tab-icon.executor { background: rgb(from var(--color-executor) r g b / 0.2); color: var(--color-executor); }
.tab-icon.bundle { background: rgb(from var(--color-bundle) r g b / 0.2); color: var(--color-bundle); }
.tab-icon.decorator { background: rgb(from var(--color-decorator) r g b / 0.2); color: var(--color-decorator); }
/* Modules Layout (sidebar + content) */
.modules-layout {
display: grid;
grid-template-columns: 1fr;
gap: var(--space-8);
}
@media (min-width: 1024px) {
.modules-layout {
grid-template-columns: 15rem 1fr;
}
}
/* Sidebar */
.modules-sidebar {
display: flex;
flex-direction: column;
gap: var(--space-4);
}
.sidebar-section {
padding: var(--space-4);
}
.sidebar-section h3 {
font-size: var(--text-sm);
font-weight: var(--font-semibold);
color: var(--text-primary);
margin-bottom: var(--space-3);
}
.category-nav {
display: flex;
flex-direction: column;
gap: var(--space-1);
}
.category-btn {
display: flex;
align-items: center;
justify-content: space-between;
width: 100%;
padding: var(--space-2) var(--space-3);
font-size: var(--text-sm);
border-radius: var(--radius-lg);
background: transparent;
color: var(--text-secondary);
border: none;
cursor: pointer;
transition: all var(--transition-base);
text-align: left;
}
.category-btn:hover {
background: var(--bg-tertiary);
color: var(--text-primary);
}
.category-btn.active {
background: rgb(from var(--accent-primary) r g b / 0.1);
color: var(--accent-primary);
border: 1px solid rgb(from var(--accent-primary) r g b / 0.3);
}
.category-btn .count {
font-size: var(--text-xs);
}
.related-nav {
display: flex;
flex-direction: column;
gap: var(--space-2);
}
.related-nav a {
display: block;
padding: var(--space-2) var(--space-3);
font-size: var(--text-sm);
color: var(--text-secondary);
border-radius: var(--radius-lg);
transition: all var(--transition-base);
text-decoration: none;
}
.related-nav a:hover {
color: var(--text-primary);
background: var(--bg-tertiary);
}
/* Modules section header */
.modules-header {
display: flex;
align-items: center;
justify-content: space-between;
gap: var(--space-4);
margin-bottom: var(--space-4);
}
.module-search-wrapper {
max-width: 16rem;
}
/* Modules */
.provider-detail-page .modules {
margin-bottom: var(--space-12);
}
.provider-detail-page .modules h2 {
font-size: var(--text-xl);
font-weight: var(--font-bold);
color: var(--text-primary);
margin: 0;
}
.provider-detail-page .modules .grid {
display: grid;
grid-template-columns: 1fr;
gap: var(--space-3);
}
.provider-detail-page .modules .module {
padding: var(--space-4);
display: flex;
gap: var(--space-3);
}
.provider-detail-page .modules .module .icon {
width: 2rem;
height: 2rem;
border-radius: var(--radius-lg);
display: flex;
align-items: center;
justify-content: center;
font-size: var(--text-sm);
font-weight: var(--font-bold);
flex-shrink: 0;
}
.provider-detail-page .modules .module .icon.operator {
background: rgb(from var(--color-operator) r g b / 0.2);
color: var(--color-operator);
border: 1px solid rgb(from var(--color-operator) r g b / 0.3);
}
.provider-detail-page .modules .module .icon.hook {
background: rgb(from var(--color-hook) r g b / 0.2);
color: var(--color-hook);
border: 1px solid rgb(from var(--color-hook) r g b / 0.3);
}
.provider-detail-page .modules .module .icon.sensor {
background: rgb(from var(--color-sensor) r g b / 0.2);
color: var(--color-sensor);
border: 1px solid rgb(from var(--color-sensor) r g b / 0.3);
}
.provider-detail-page .modules .module .icon.trigger {
background: rgb(from var(--color-trigger) r g b / 0.2);
color: var(--color-trigger);
border: 1px solid rgb(from var(--color-trigger) r g b / 0.3);
}
.provider-detail-page .modules .module .icon.transfer {
background: rgb(from var(--color-transfer) r g b / 0.2);
color: var(--color-transfer);
border: 1px solid rgb(from var(--color-transfer) r g b / 0.3);
}
.provider-detail-page .modules .module .icon.bundle {
background: rgb(from var(--color-bundle) r g b / 0.2);
color: var(--color-bundle);
border: 1px solid rgb(from var(--color-bundle) r g b / 0.3);
}
.provider-detail-page .modules .module .content {
flex: 1;
min-width: 0;
}
.provider-detail-page .modules .module .content h3 {
font-size: var(--text-base);
font-weight: var(--font-semibold);
color: var(--text-primary);
margin-bottom: var(--space-1);
}
.provider-detail-page .modules .module .content p {
font-size: var(--text-sm);
color: var(--text-secondary);
margin-bottom: var(--space-3);
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
}
.provider-detail-page .modules .module .content .path {
display: block;
font-size: var(--text-xs);
font-family: var(--font-mono);
color: var(--color-gray-800);
color: light-dark(var(--color-gray-800), var(--color-gray-200));
background: var(--color-gray-100);
background: light-dark(var(--color-gray-100), var(--color-navy-800));
border: 1px solid var(--color-gray-300);
border: 1px solid light-dark(var(--color-gray-300), var(--color-gray-700));
padding: var(--space-1) var(--space-2);
border-radius: var(--radius-sm);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
/* Import path + copy button row */
.provider-detail-page .import-row {
display: flex;
align-items: center;
gap: 0.5rem;
margin-top: var(--space-2);
}
.provider-detail-page .import-row code.path {
flex: 1;
min-width: 0;
margin-top: 0;
}
/* Module Actions (View Docs, Source) */
.provider-detail-page .module-actions {
display: flex;
align-items: center;
gap: var(--space-3);
margin-top: var(--space-3);
}
.provider-detail-page .module-actions .docs-link,
.provider-detail-page .module-actions .source-link {
display: inline-flex;
align-items: center;
gap: 0.25rem;
font-size: var(--text-xs);
text-decoration: none;
transition: color var(--transition-base);
}
.provider-detail-page .module-actions .docs-link {
color: var(--accent-primary);
}
.provider-detail-page .module-actions .docs-link:hover {
color: var(--color-cyan-300);
}
.provider-detail-page .module-actions .source-link {
color: var(--text-muted);
}
.provider-detail-page .module-actions .source-link:hover {
color: var(--text-primary);
}
.provider-detail-page .module-actions svg {
width: 0.75rem;
height: 0.75rem;
}
.provider-detail-page .copy-import {
display: inline-flex;
align-items: center;
padding: 0.375rem;
background: var(--bg-tertiary);
border: 1px solid var(--color-gray-400);
border: 1px solid light-dark(var(--color-gray-400), var(--color-gray-600));
border-radius: var(--radius-sm);
color: var(--text-muted);
cursor: pointer;
transition: all var(--transition-base);
}
.provider-detail-page .copy-import:hover {
background: var(--color-gray-200);
background: light-dark(var(--color-gray-200), var(--color-gray-700));
color: var(--accent-primary);
border-color: var(--accent-primary);
}
.provider-detail-page .copy-import.copied {
color: var(--color-green-400);
border-color: var(--color-green-400);
}
.provider-detail-page .copy-import svg {
width: 0.875rem;
height: 0.875rem;
}
/* Module Highlight */
.provider-detail-page .module.highlighted {
outline: 2px solid var(--accent-primary);
outline-offset: 2px;
}
/* Technical */
.provider-detail-page .technical {
padding: var(--space-5);
margin-bottom: var(--space-6);
}
.provider-detail-page .technical > div {
display: grid;
grid-template-columns: 1fr;
gap: var(--space-6);
}
@media (min-width: 768px) {
.provider-detail-page .technical > div {
grid-template-columns: repeat(3, 1fr);
}
}
.provider-detail-page .technical h3 {
font-size: var(--text-sm);
font-weight: var(--font-semibold);
color: var(--text-primary);
margin-bottom: var(--space-3);
display: flex;
align-items: center;
gap: var(--space-2);
}
.provider-detail-page .technical h3 svg {
width: 1rem;
height: 1rem;
}
.provider-detail-page .technical .airflow-compat h3 svg {
color: var(--color-cyan-400);
}
.provider-detail-page .technical .python-version h3 svg {
color: var(--color-blue-400);
}
.provider-detail-page .technical .dependencies h3 svg {
color: var(--color-purple-400);
}
.provider-detail-page .technical code {
font-size: var(--text-sm);
font-family: var(--font-mono);
color: var(--accent-primary);
background: var(--bg-tertiary);
padding: var(--space-1) var(--space-2);
border-radius: var(--radius-sm);
display: inline-block;
}
.provider-detail-page .technical span {
font-size: var(--text-sm);
color: var(--text-secondary);
}
/* Dependencies */
.provider-detail-page .technical .dependencies details {
cursor: pointer;
margin-top: var(--space-2);
display: flex;
flex-direction: column;
gap: var(--space-1);
max-height: 12rem;
overflow-y: auto;
}
.provider-detail-page .technical .dependencies summary {
font-size: var(--text-xs);
color: var(--text-secondary);
list-style: none;
display: flex;
align-items: center;
gap: var(--space-1);
cursor: pointer;
transition: color var(--transition-base);
}
.provider-detail-page .technical .dependencies summary:hover {
color: var(--accent-primary);
}
.provider-detail-page .technical .dependencies summary svg {
width: 0.75rem;
height: 0.75rem;
transition: transform var(--transition-base);
}
.provider-detail-page .technical .dependencies details[open] summary svg {
transform: rotate(90deg);
}
.provider-detail-page .technical .dependencies summary .hide-label {
display: none;
}
.provider-detail-page .technical .dependencies details[open] summary .show-label {
display: none;
}
.provider-detail-page .technical .dependencies details[open] summary .hide-label {
display: inline;
}
.provider-detail-page .technical .dependencies details code {
font-size: var(--text-xs);
color: var(--color-purple-400);
background: rgb(from var(--color-purple-500) r g b / 0.1);
}
/* Connection Builder Card */
.provider-detail-page .connections-card {
padding: var(--space-5);
margin-bottom: var(--space-6);
}
.provider-detail-page .connections-card > h3 {
font-size: var(--text-sm);
font-weight: var(--font-semibold);
color: var(--text-primary);
margin-bottom: var(--space-3);
display: flex;
align-items: center;
gap: var(--space-2);
}
.provider-detail-page .connections-card > h3 svg {
width: 1rem;
height: 1rem;
color: var(--color-green-400);
}
.provider-detail-page .connections-card .no-connections {
font-size: var(--text-sm);
color: var(--text-secondary);
}
/* Chip grid */
.provider-detail-page .connections-card .conn-chips {
display: flex;
flex-wrap: wrap;
gap: var(--space-2);
}
.provider-detail-page .connections-card .conn-chip {
display: inline-flex;
align-items: center;
gap: var(--space-1);
padding: var(--space-1) var(--space-3);
font-size: var(--text-sm);
font-family: var(--font-mono);
color: var(--color-green-400);
background: rgb(from var(--color-green-500) r g b / 0.05);
border: 1px solid rgb(from var(--color-green-500) r g b / 0.2);
border-radius: var(--radius-full);
cursor: pointer;
transition: all var(--transition-base);
}
.provider-detail-page .connections-card .conn-chip:hover {
background: rgb(from var(--color-green-500) r g b / 0.1);
border-color: rgb(from var(--color-green-500) r g b / 0.4);
}
.provider-detail-page .connections-card .conn-chip.active {
background: rgb(from var(--color-green-500) r g b / 0.15);
border-color: var(--color-green-400);
}
/* Shared builder panel */
.provider-detail-page .connections-card .conn-builder-panel {
margin-top: var(--space-3);
border: 1px solid var(--border-primary);
border-radius: var(--radius-lg);
overflow: hidden;
}
.provider-detail-page .connections-card .conn-builder-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: var(--space-2) var(--space-3);
background: rgb(from var(--color-green-500) r g b / 0.05);
border-bottom: 1px solid var(--border-primary);
}
.provider-detail-page .connections-card .conn-builder-title {
font-size: var(--text-sm);
font-family: var(--font-mono);
font-weight: var(--font-semibold);
color: var(--color-green-400);
}
.provider-detail-page .connections-card .conn-builder-docs {
font-size: var(--text-xs);
font-weight: var(--font-semibold);
color: var(--accent-primary);
text-decoration: none;
display: inline-flex;
align-items: center;
gap: var(--space-1);
padding: var(--space-1) var(--space-2);
margin: var(--space-2) var(--space-3) 0;
border: 1px solid var(--border-primary);
border-radius: var(--radius-md);
transition: all var(--transition-base);
}
.provider-detail-page .connections-card .conn-builder-docs:hover {
background: var(--bg-tertiary);
border-color: var(--accent-primary);
}
.provider-detail-page .connections-card .conn-builder-docs svg {
width: 0.875rem;
height: 0.875rem;
}
.provider-detail-page .connections-card .conn-builder-docs .external-icon {
width: 0.75rem;
height: 0.75rem;
opacity: 0.6;
}
.provider-detail-page .connections-card .conn-builder-close {
background: none;
border: none;
color: var(--text-muted);
cursor: pointer;
padding: var(--space-1);
border-radius: var(--radius-md);
display: flex;
transition: color var(--transition-base);
}
.provider-detail-page .connections-card .conn-builder-close:hover {
color: var(--text-primary);
}
.provider-detail-page .connections-card .conn-builder-close svg {
width: 1rem;
height: 1rem;
}
/* Form fields */
.provider-detail-page .connections-card .conn-form {
padding: var(--space-3) var(--space-3) var(--space-4);
display: flex;
flex-direction: column;
gap: var(--space-3);
}
.provider-detail-page .connections-card .conn-field {
display: flex;
flex-direction: column;
gap: var(--space-1);
}
.provider-detail-page .connections-card .conn-field > label {
font-size: var(--text-xs);
font-weight: var(--font-semibold);
color: var(--text-secondary);
}
.provider-detail-page .connections-card .conn-field .field-sensitive {
font-size: 0.625rem;
font-weight: var(--font-normal);
color: var(--color-amber-400);
background: rgb(from var(--color-amber-500) r g b / 0.1);
border: 1px solid rgb(from var(--color-amber-500) r g b / 0.2);
padding: 0 var(--space-1);
border-radius: var(--radius-sm);
vertical-align: middle;
margin-left: var(--space-1);
}
.provider-detail-page .connections-card .conn-field input[type="text"],
.provider-detail-page .connections-card .conn-field input[type="password"],
.provider-detail-page .connections-card .conn-field input[type="number"],
.provider-detail-page .connections-card .conn-field textarea,
.provider-detail-page .connections-card .conn-field select {
font-size: var(--text-sm);
font-family: var(--font-mono);
padding: var(--space-2);
border: 1px solid var(--border-primary);
border-radius: var(--radius-md);
background: var(--color-input-bg);
color: var(--text-primary);
transition: border-color var(--transition-base);
width: 100%;
box-sizing: border-box;
}
.provider-detail-page .connections-card .conn-field input:focus,
.provider-detail-page .connections-card .conn-field textarea:focus,
.provider-detail-page .connections-card .conn-field select:focus {
outline: none;
border-color: var(--color-border-focus);
}
.provider-detail-page .connections-card .conn-field textarea {
resize: vertical;
min-height: 3rem;
}
.provider-detail-page .connections-card .conn-field .field-help {
font-size: var(--text-xs);
color: var(--text-muted);
}
.provider-detail-page .connections-card .conn-checkbox {
font-size: var(--text-sm);
color: var(--text-primary);
display: flex;
align-items: center;
gap: var(--space-2);
cursor: pointer;
font-weight: var(--font-normal);
}
.provider-detail-page .connections-card .conn-checkbox input[type="checkbox"] {
width: auto;
accent-color: var(--color-green-400);
}
/* Export panel */
.provider-detail-page .connections-card .conn-export {
margin-top: var(--space-2);
border-top: 1px solid var(--border-primary);
padding-top: var(--space-3);
}
.provider-detail-page .connections-card .conn-export-tabs {
display: flex;
gap: var(--space-1);
margin-bottom: var(--space-2);
}
.provider-detail-page .connections-card .conn-export-tab {
padding: var(--space-1) var(--space-3);
font-size: var(--text-xs);
font-weight: var(--font-semibold);
color: var(--text-muted);
background: none;
border: none;
border-radius: var(--radius-lg);
cursor: pointer;
transition: all var(--transition-base);
}
.provider-detail-page .connections-card .conn-export-tab:hover {
color: var(--text-secondary);
}
.provider-detail-page .connections-card .conn-export-tab.active {
background: var(--bg-tertiary);
color: var(--color-green-400);
}
.provider-detail-page .connections-card .conn-export-output {
position: relative;
background: var(--bg-tertiary-light);
background: light-dark(var(--bg-tertiary-light), var(--color-navy-900));
border-radius: var(--radius-lg);
overflow: hidden;
}
.provider-detail-page .connections-card .conn-export-output pre {
font-size: var(--text-xs);
font-family: var(--font-mono);
color: var(--text-primary);
padding: var(--space-3);
padding-right: var(--space-10);
margin: 0;
white-space: pre-wrap;
word-break: break-all;
max-height: 12rem;
overflow-y: auto;
background: none;
display: block;
border-radius: 0;
}
.provider-detail-page .connections-card .conn-copy-btn {
position: absolute;
top: var(--space-2);
right: var(--space-2);
background: none;
border: none;
color: var(--text-muted);
cursor: pointer;
padding: var(--space-1);
border-radius: var(--radius-md);
transition: all var(--transition-base);
display: flex;
align-items: center;
justify-content: center;
}
.provider-detail-page .connections-card .conn-copy-btn:hover {
color: var(--text-primary);
background: var(--bg-tertiary);
}
.provider-detail-page .connections-card .conn-copy-btn svg {
width: 1rem;
height: 1rem;
}
/* Search Modal */
#search-modal {
display: none;
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
z-index: 9999;
background: rgba(0, 0, 0, 0.5);
backdrop-filter: blur(4px);
padding: 10vh 1rem 1rem 1rem;
}
#search-modal.active {
display: flex;
align-items: flex-start;
justify-content: center;
}
#search-modal .modal-container {
width: 100%;
max-width: 48rem;
background: var(--bg-primary);
border: 1px solid var(--border-primary);
border-radius: var(--radius-xl);
box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.3), 0 10px 10px -5px rgba(0, 0, 0, 0.2);
overflow: hidden;
display: flex;
flex-direction: column;
max-height: 80vh;
}
#search-modal header {
display: flex;
align-items: center;
gap: var(--space-3);
padding: var(--space-4);
border-bottom: 1px solid var(--border-primary);
}
#search-modal header svg {
width: 1.25rem;
height: 1.25rem;
color: var(--text-muted);
flex-shrink: 0;
}
#search-input {
flex: 1;
background: transparent;
border: none;
outline: none;
color: var(--text-primary);
font-size: var(--text-lg);
font-family: inherit;
}
#search-input::placeholder {
color: var(--text-muted);
}
#search-close {
background: transparent;
border: none;
padding: var(--space-1);
border-radius: var(--radius-full);
cursor: pointer;
color: var(--text-muted);
transition: all var(--transition-base);
display: flex;
align-items: center;
justify-content: center;
}
#search-close:hover {
background: var(--bg-tertiary);
color: var(--text-primary);
}
#search-close svg {
width: 1.25rem;
height: 1.25rem;
}
#search-modal nav {
display: flex;
gap: var(--space-2);
padding: var(--space-3) var(--space-4);
border-bottom: 1px solid var(--border-primary);
}
#search-modal nav button {
padding: var(--space-1) var(--space-3);
font-size: var(--text-sm);
font-weight: var(--font-medium);
border-radius: var(--radius-full);
border: none;
background: transparent;
color: var(--text-secondary);
cursor: pointer;
transition: all var(--transition-base);
display: flex;
align-items: center;
gap: var(--space-1);
}
#search-modal nav button:hover {
background: var(--bg-tertiary);
color: var(--text-primary);
}
#search-modal nav button.active {
background: rgb(from var(--color-cyan-500) r g b / 0.2);
color: var(--color-cyan-400);
border: 1px solid rgb(from var(--color-cyan-500) r g b / 0.3);
}
#search-modal nav button .count {
font-size: var(--text-xs);
padding: 0.125rem var(--space-1);
border-radius: var(--radius-full);
background: var(--bg-tertiary);
}
#search-modal nav button.active .count {
background: rgb(from var(--color-cyan-500) r g b / 0.3);
}
#search-results {
flex: 1;
overflow-y: auto;
padding: var(--space-2) 0;
}
#search-results > div {
padding: var(--space-8) var(--space-4);
text-align: center;
color: var(--text-muted);
}
#search-results > div svg {
width: 3rem;
height: 3rem;
margin: 0 auto var(--space-3);
color: var(--text-muted);
}
#search-results > div p {
font-size: var(--text-lg);
margin: 0;
}
#search-results a {
display: flex;
align-items: center;
gap: var(--space-3);
padding: var(--space-3) var(--space-4);
text-decoration: none;
color: inherit;
transition: background-color var(--transition-base);
border-bottom: 1px solid var(--border-primary);
}
#search-results a:last-child {
border-bottom: none;
}
#search-results a:hover,
#search-results a.selected {
background: rgb(from var(--color-cyan-500) r g b / 0.1);
}
#search-results a > span:first-child {
width: 2rem;
height: 2rem;
border-radius: var(--radius-lg);
display: flex;
align-items: center;
justify-content: center;
font-size: var(--text-sm);
font-weight: var(--font-bold);
flex-shrink: 0;
background: rgb(from var(--color-cyan-500) r g b / 0.2);
color: var(--color-cyan-400);
border: 1px solid rgb(from var(--color-cyan-500) r g b / 0.3);
}
#search-results a > div {
flex: 1;
min-width: 0;
}
#search-results a > div > div:first-child {
font-weight: var(--font-medium);
color: var(--text-primary);
margin-bottom: 0.25rem;
display: flex;
align-items: center;
gap: var(--space-2);
}
#search-results .badge {
padding: 0.125rem var(--space-2);
font-size: var(--text-xs);
font-weight: var(--font-medium);
border-radius: var(--radius);
text-transform: lowercase;
}
#search-results .badge.operator {
background: rgb(from var(--color-operator) r g b / 0.2);
color: var(--color-operator);
border: 1px solid rgb(from var(--color-operator) r g b / 0.3);
}
#search-results .badge.hook {
background: rgb(from var(--color-hook) r g b / 0.2);
color: var(--color-hook);
border: 1px solid rgb(from var(--color-hook) r g b / 0.3);
}
#search-results .badge.sensor {
background: rgb(from var(--color-sensor) r g b / 0.2);
color: var(--color-sensor);
border: 1px solid rgb(from var(--color-sensor) r g b / 0.3);
}
#search-results .badge.trigger {
background: rgb(from var(--color-trigger) r g b / 0.2);
color: var(--color-trigger);
border: 1px solid rgb(from var(--color-trigger) r g b / 0.3);
}
#search-results .badge.transfer {
background: rgb(from var(--color-transfer) r g b / 0.2);
color: var(--color-transfer);
border: 1px solid rgb(from var(--color-transfer) r g b / 0.3);
}
#search-results .badge.bundle {
background: rgb(from var(--color-bundle) r g b / 0.2);
color: var(--color-bundle);
border: 1px solid rgb(from var(--color-bundle) r g b / 0.3);
}
#search-results .badge.notifier {
background: rgb(from var(--color-notifier) r g b / 0.2);
color: var(--color-notifier);
border: 1px solid rgb(from var(--color-notifier) r g b / 0.3);
}
#search-results .provider > span:first-child {
background: rgb(from var(--color-cyan-500) r g b / 0.2);
color: var(--color-cyan-400);
border-color: rgb(from var(--color-cyan-500) r g b / 0.3);
}
#search-results .operator > span:first-child {
background: rgb(from var(--color-operator) r g b / 0.2);
color: var(--color-operator);
border-color: rgb(from var(--color-operator) r g b / 0.3);
}
#search-results .hook > span:first-child {
background: rgb(from var(--color-hook) r g b / 0.2);
color: var(--color-hook);
border-color: rgb(from var(--color-hook) r g b / 0.3);
}
#search-results .sensor > span:first-child {
background: rgb(from var(--color-sensor) r g b / 0.2);
color: var(--color-sensor);
border-color: rgb(from var(--color-sensor) r g b / 0.3);
}
#search-results .trigger > span:first-child {
background: rgb(from var(--color-trigger) r g b / 0.2);
color: var(--color-trigger);
border-color: rgb(from var(--color-trigger) r g b / 0.3);
}
#search-results .transfer > span:first-child {
background: rgb(from var(--color-transfer) r g b / 0.2);
color: var(--color-transfer);
border-color: rgb(from var(--color-transfer) r g b / 0.3);
}
#search-results .bundle > span:first-child {
background: rgb(from var(--color-bundle) r g b / 0.2);
color: var(--color-bundle);
border-color: rgb(from var(--color-bundle) r g b / 0.3);
}
#search-results .notifier > span:first-child {
background: rgb(from var(--color-notifier) r g b / 0.2);
color: var(--color-notifier);
border-color: rgb(from var(--color-notifier) r g b / 0.3);
}
#search-results a > div > div:last-child {
font-size: var(--text-sm);
color: var(--text-secondary);
display: flex;
gap: var(--space-2);
align-items: center;
}
#search-results a > div > div:last-child svg {
flex-shrink: 0;
}
#search-results a > div > div:last-child > span {
display: flex;
align-items: center;
gap: 0.25rem;
}
#search-results a > div > div:last-child > span:last-child {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
#search-results a > svg:last-child {
width: 1rem;
height: 1rem;
color: var(--color-cyan-400);
flex-shrink: 0;
}
#search-modal footer {
display: flex;
align-items: center;
gap: var(--space-4);
padding: var(--space-3) var(--space-4);
border-top: 1px solid var(--border-primary);
font-size: var(--text-xs);
color: var(--text-muted);
}
#search-modal footer > span {
display: flex;
align-items: center;
gap: 0.25rem;
}
#search-modal footer kbd {
padding: 0.125rem 0.375rem;
background: var(--bg-tertiary);
border: 1px solid var(--border-primary);
border-radius: var(--radius);
font-family: var(--font-mono);
font-size: var(--text-xs);
}
/* Skip to content link */
.skip-link {
position: absolute;
top: -100%;
left: var(--space-4);
padding: var(--space-2) var(--space-4);
background: var(--accent-primary);
color: #fff;
border-radius: var(--radius-md);
z-index: 10000;
font-weight: var(--font-semibold);
text-decoration: none;
}
.skip-link:focus {
top: var(--space-2);
}
/* Screen reader only */
.sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border-width: 0;
}
/* Global focus-visible styles */
:focus-visible {
outline: 2px solid var(--color-cyan-500);
outline-offset: 2px;
}
/* Reduced motion */
@media (prefers-reduced-motion: reduce) {
*,
*::before,
*::after {
animation-duration: 0.01ms !important;
transition-duration: 0.01ms !important;
}
}
/* 404 Page */
.error-page {
text-align: center;
padding: var(--space-24) var(--space-4);
}
.error-page h1 {
font-size: var(--text-6xl);
font-weight: var(--font-bold);
color: var(--text-muted);
margin-bottom: var(--space-4);
}
.error-page p {
font-size: var(--text-lg);
color: var(--text-secondary);
margin-bottom: var(--space-8);
}
.error-links {
display: flex;
gap: var(--space-4);
justify-content: center;
flex-wrap: wrap;
}
.error-links a {
padding: var(--space-2-5) var(--space-5);
background: var(--accent-primary);
color: #fff;
border-radius: var(--radius-lg);
text-decoration: none;
font-weight: var(--font-medium);
}
.error-links a:hover {
opacity: 0.9;
}
/* API Explorer (swagger-ui inside site layout) */
.api-explorer-page .swagger-ui .topbar,
.api-explorer-page .swagger-ui .scheme-container { display: none; }
.api-explorer-page .swagger-ui .info { margin: var(--space-4) 0; }
.api-explorer-page { padding-bottom: var(--space-8); }