@layer components { /* * Search command-palette dialog. * * Builds on the core dialog base (app-shell.css → dialog, dialog > article) * and the shared tier system (app-dialog.css → app-dialog-lg). * Only search-specific overrides live here. */ /* ── Dialog positioning: top-aligned instead of centered ─────────────── */ dialog[data-app-search-dialog] { align-items: flex-start; padding-top: clamp(2rem, 10vh, 8rem); } /* ── Article: flex column so body scrolls, header/footer stay fixed ──── */ .app-search-dialog { display: flex; flex-direction: column; overflow: hidden; } /* ── Header: search input row ────────────────────────────────────────── */ .app-search-dialog-header { display: flex; align-items: center; gap: 0.5rem; } .app-search-dialog-header h2 { margin: 0; } .app-search-dialog-form { display: flex; align-items: center; gap: 0.5rem; flex: 1; margin: 0; } .app-search-dialog-icon { color: var(--app-muted-color); font-size: var(--text-base); flex-shrink: 0; } .app-search-dialog-input { flex: 1; border: none; background: transparent; font-size: var(--text-base); color: var(--app-color); outline: none; padding: 0.25rem 0; margin: 0; height: auto; box-shadow: none; } .app-search-dialog-input:focus { box-shadow: none; border-color: transparent; } .app-search-dialog-shortcut { border: 1px solid var(--app-border); border-radius: 4px; background: var(--app-card-background-color); color: var(--app-muted-color); font-size: var(--text-xs); line-height: var(--leading-none); padding: 0.15rem 0.35rem; pointer-events: none; flex-shrink: 0; } .app-search-dialog-header .close { flex-shrink: 0; } /* ── Body: scrollable area between header and footer ─────────────────── */ .app-search-dialog-body { flex: 1; overflow-y: auto; overscroll-behavior: contain; } /* ── Empty / loading / error states ──────────────────────────────────── */ .app-search-dialog-empty-state, .app-search-dialog-loading, .app-search-dialog-error { padding: 1.5rem 1rem; text-align: center; color: var(--app-muted-color); font-size: var(--text-sm); } .app-search-dialog-empty-state p, .app-search-dialog-loading p, .app-search-dialog-error p { margin: 0 0 0.25rem; } .app-search-dialog-empty-state small { display: block; } /* ── Results list ────────────────────────────────────────────────────── */ .app-search-dialog-results { list-style: none; padding: 0; margin: 0; } /* ── Category group ──────────────────────────────────────────────────── */ .app-search-dialog-category { list-style: none; margin-bottom: 1rem; } .app-search-dialog-category-heading { display: flex; align-items: center; gap: 0.5rem; font-size: var(--text-xs); font-weight: var(--font-semibold); color: var(--app-muted-color); text-transform: uppercase; letter-spacing: var(--tracking-wide); margin-bottom: 5px; } .app-search-dialog-category-heading .bi { font-size: var(--text-sm); } .app-search-dialog-category-count { margin-left: auto; font-size: 10px; /* icon-font metric — intentional px */ padding: 1px 4px; min-width: 18px; text-align: center; border-radius: 999px; background: var(--app-accordion-border-color); display: inline-flex; justify-content: center; align-items: center; height: 18px; } /* ── Individual result items ─────────────────────────────────────────── */ .app-search-dialog-category-items { list-style: none; padding: 0; margin: 0; flex-direction: column; gap: 5px; } .app-search-dialog-item { border-radius: var(--app-border-radius); transition: background var(--app-transition); cursor: pointer; list-style: none; } .app-search-dialog-item a { display: block; color: var(--app-color); text-decoration: none; font-size: var(--text-sm); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; border-radius: var(--app-border-radius); } .app-search-dialog-item:hover, .app-search-dialog-item-active { background: color-mix(in srgb, var(--app-contrast) 8%, transparent); } .app-search-dialog-item-active a { color: var(--app-primary); } /* ── Category "view all" link ────────────────────────────────────────── */ .app-search-dialog-category-view-all { font-size: var(--text-xs); color: var(--app-primary); text-decoration: none; } .app-search-dialog-category-view-all:hover { text-decoration: underline; } /* ── Footer ──────────────────────────────────────────────────────────── */ .app-search-dialog-footer { justify-content: space-between; font-size: var(--text-xs); color: var(--app-muted-color); } .app-search-dialog-view-all { color: var(--app-primary); text-decoration: none; font-weight: var(--font-medium); } .app-search-dialog-view-all:hover { text-decoration: underline; } /* ── Mobile ──────────────────────────────────────────────────────────── */ @media (max-width: 576px) { dialog[data-app-search-dialog] { padding-top: 1rem; } } /* ── Full search results page (Grid.js) ──────────────────────────────── */ .search-result-row { display: flex; gap: 12px; align-items: flex-start; } .search-result-title-container { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; } .search-result-avatar, .search-result-avatar-placeholder { width: 40px; height: 40px; border-radius: 10px; border: 1px solid var(--app-border); background: var(--app-card-background-color); display: inline-flex; align-items: center; justify-content: center; color: var(--app-muted-color); flex-shrink: 0; object-fit: cover; } .search-result-title { font-weight: var(--font-semibold); text-decoration: none; } .search-result-desc { margin: 0; color: var(--app-muted-color); font-size: var(--text-sm); } .search-result-type { color: var(--app-muted-color); font-weight: var(--font-semibold); } }