simo 5 órája
szülő
commit
582f38ffe0
8 módosított fájl, 649 hozzáadás és 551 törlés
  1. 1 0
      beaker
  2. 1 1
      example-config.ini
  3. BIN
      static/favicon.gif
  4. 521 438
      static/main.css
  5. 25 19
      templates/home.html
  6. 42 33
      templates/images.html
  7. 1 1
      templates/opensearch.xml
  8. 58 59
      templates/results.html

+ 1 - 0
beaker

@@ -0,0 +1 @@
+Subproject commit 38aa54bb91597bd15ecd1dca1da6194c80249039

+ 1 - 1
example-config.ini

@@ -1,7 +1,7 @@
 [server]
 host = 0.0.0.0
 port = 8087
-domain = https://search.example.com
+domain = https://search.simo.ng
 
 [proxy]
 # Single proxy (comment out to use list_file instead)

BIN
static/favicon.gif


+ 521 - 438
static/main.css

@@ -1,554 +1,637 @@
+/* OmniSearch - Windows 98 theme
+   - No external assets required
+   - Classic 3D bevel controls, gray workspace, teal titlebars
+   - Works for: home, results, images
+*/
+
 :root {
-    --bg-main: #ffffff;
-    --bg-card: #f8f9fa;
-    --border: #e0e0e0;
-    --text-primary: #1a1a1a;
-    --text-secondary: #5f6368;
-    --text-muted: #757575;
-    --accent: #202124;
-    --accent-glow: rgba(0,0,0,0.05);
+    /* Win98-ish palette */
+    --w98-face: #c0c0c0;
+    --w98-face-2: #dfdfdf;
+    --w98-shadow: #808080;
+    --w98-dkshadow: #000000;
+    --w98-hilight: #ffffff;
+    --w98-text: #000000;
+    --w98-blue: #000080;
+    --w98-teal: #008080;
+
+    /* Link colors reminiscent of old browsers */
+    --w98-link: #0000ee;
+    --w98-visited: #551a8b;
+
+    /* Layout */
+    --content-max: none;
+    --content-pad: 16px;
+
+    /* Focus */
+    --focus-ring: 1px dotted #000000;
 }
+
 @media (prefers-color-scheme: dark) {
+    /* Keep the Win98 look even if the user prefers dark mode */
     :root {
-        --bg-main: #121212;
-        --bg-card: #1e1e1e;
-        --border: #333333;
-        --text-primary: #ffffff;
-        --text-secondary: #a0a0a0;
-        --text-muted: #d1d1d1;
-        --accent: #e2e2e2;
-        --accent-glow: rgba(255,255,255,0.1);
+        color-scheme: light;
     }
 }
 
-*, *::before, *::after {
+*,
+*::before,
+*::after {
     box-sizing: border-box;
 }
 
+html,
 body {
-    background-color:var(--bg-main);
-    color:var(--text-primary);
-    font-family:system-ui,-apple-system,sans-serif;
-    margin:0;
-    padding:0;
+    height: 100%;
+}
+
+body {
+    margin: 0;
+    padding: 0;
+    background: var(--w98-face);
+    color: var(--w98-text);
+    font-family: "MS Sans Serif", Tahoma, Verdana, Arial, sans-serif;
+    font-size: 14px;
+    line-height: 1.35;
     -webkit-tap-highlight-color: transparent;
 }
 
 img[src=""] {
-  display: none;
+    display: none;
 }
 
-.view-home {
-    display: flex;
-    justify-content: center;
-    align-items: center;
-    min-height: 100vh;
-    padding: 20px;
-    background: radial-gradient(circle at top right, var(--bg-card) 0%, var(--bg-main) 100%);
+/* ---------- Utilities: Win98 Bevels ---------- */
+
+.w98-bevel {
+    background: var(--w98-face);
+    border-top: 2px solid var(--w98-hilight);
+    border-left: 2px solid var(--w98-hilight);
+    border-right: 2px solid var(--w98-shadow);
+    border-bottom: 2px solid var(--w98-shadow);
 }
 
-.view-home .container {
-    width: 100%;
-    max-width: 580px;
-    margin: 0 auto; 
-    text-align: center;
+.w98-sunken {
+    background: var(--w98-face-2);
+    border-top: 2px solid var(--w98-shadow);
+    border-left: 2px solid var(--w98-shadow);
+    border-right: 2px solid var(--w98-hilight);
+    border-bottom: 2px solid var(--w98-hilight);
+}
+
+.w98-inset {
+    background: var(--w98-hilight);
+    border: 1px solid var(--w98-dkshadow);
+    box-shadow:
+        inset 1px 1px 0 var(--w98-shadow),
+        inset -1px -1px 0 var(--w98-hilight);
+}
+
+.w98-titlebar {
+    background: var(--w98-blue);
+    color: var(--w98-hilight);
+    padding: 6px 10px;
+    font-weight: 700;
+    letter-spacing: 0.2px;
     display: flex;
-    flex-direction: column;
+    align-items: center;
+    justify-content: space-between;
+    user-select: none;
 }
 
-.view-home .hero-logo {
-    font-size:4.5rem;
-    margin-bottom:30px;
-    letter-spacing:-3px;
-    font-weight:800;
+/* Visually classic “window” container */
+.w98-window {
+    background: var(--w98-face);
+    border-top: 2px solid var(--w98-hilight);
+    border-left: 2px solid var(--w98-hilight);
+    border-right: 2px solid var(--w98-dkshadow);
+    border-bottom: 2px solid var(--w98-dkshadow);
+    box-shadow:
+        1px 1px 0 var(--w98-shadow),
+        2px 2px 0 var(--w98-shadow);
 }
-.view-home .search-input-wrapper {
-    width: 100%;
-    margin-bottom: 24px;
+
+/* ---------- Links ---------- */
+
+a {
+    color: var(--w98-link);
+    text-decoration: underline;
 }
 
-.view-home .search-box {
-    font-size:1.1rem;
-    padding:16px 28px;
-    box-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06);
+a:visited {
+    color: var(--w98-visited);
 }
 
-.view-home .buttons {
-    display:flex;
-    gap:12px;
-    justify-content:center;
-}
-.view-home button {
-    padding:10px 24px;
-    border-radius:8px;
-    font-weight:600;
-    font-size:0.9rem;
-    cursor:pointer;
-    transition:all 0.2s;
-    border:1px solid transparent;
-    touch-action:manipulation;
-}
-.view-home .btn-primary {
-    background:var(--accent);
-    color:var(--bg-main);
-}
-.view-home .btn-primary:hover {
-    filter:brightness(1.1);
-    transform:translateY(-1px);
+a:hover {
+    filter: contrast(110%);
 }
-.view-home .btn-secondary {
-    background:var(--bg-card);
-    color:var(--text-primary);
-    border-color:var(--border);
+
+a:focus {
+    outline: var(--focus-ring);
+    outline-offset: 2px;
 }
-.view-home .btn-secondary:hover {
-    background:var(--border);
-    border-color:var(--text-secondary);
+
+/* ---------- Form controls (classic) ---------- */
+
+input[type="text"],
+input[type="search"],
+.search-box {
+    font-family: inherit;
+    font-size: 14px;
+    color: var(--w98-text);
+
+    background: var(--w98-hilight);
+    border: 1px solid var(--w98-dkshadow);
+    box-shadow:
+        inset 1px 1px 0 var(--w98-shadow),
+        inset -1px -1px 0 var(--w98-hilight);
+
+    border-radius: 0;
+    padding: 6px 8px;
+    width: 100%;
 }
-header {
-    display:flex;
-    align-items:center;
-    gap:20px;
-    padding:15px 60px;
-    border-bottom:1px solid var(--border);
-    background:var(--bg-main);
+
+.search-box::placeholder {
+    color: #505050;
 }
-.search-form {
-    flex-grow:1;
-    max-width:600px;
+
+.search-box:focus {
+    outline: var(--focus-ring);
+    outline-offset: 0;
 }
-h1 {
-    font-size:1.5rem;
-    margin:0;
-    letter-spacing:-1px;
-    white-space:nowrap;
+
+/* Buttons: raised with pressed active state */
+button,
+.pagination-btn,
+.overlay-btn {
+    font-family: inherit;
+    font-size: 14px;
+    color: var(--w98-text);
+
+    background: var(--w98-face);
+    border-top: 2px solid var(--w98-hilight);
+    border-left: 2px solid var(--w98-hilight);
+    border-right: 2px solid var(--w98-shadow);
+    border-bottom: 2px solid var(--w98-shadow);
+
+    border-radius: 0;
+    padding: 6px 12px;
+    cursor: pointer;
+    text-decoration: none;
+    display: inline-flex;
+    align-items: center;
+    justify-content: center;
+    gap: 6px;
+
+    touch-action: manipulation;
 }
-h1 span {
-    color:var(--accent);
+
+button:hover,
+.pagination-btn:hover,
+.overlay-btn:hover {
+    filter: brightness(1.02);
 }
-.search-box {
-    width: 100%;
-    padding: 12px 24px;
-    border-radius: 99px;
-    border: 1px solid var(--border);
-    background: var(--bg-card);
-    color: var(--text-primary);
-    outline: none;
-    transition: border-color 0.2s, box-shadow 0.2s;
+
+button:active,
+.pagination-btn:active,
+.overlay-btn:active {
+    border-top: 2px solid var(--w98-shadow);
+    border-left: 2px solid var(--w98-shadow);
+    border-right: 2px solid var(--w98-hilight);
+    border-bottom: 2px solid var(--w98-hilight);
+    padding: 7px 11px 5px 13px; /* tiny pressed illusion */
 }
 
-.search-box:focus {
-    border-color:var(--accent);
-    box-shadow:0 0 0 4px var(--accent-glow);
+button:focus,
+.pagination-btn:focus,
+.overlay-btn:focus {
+    outline: var(--focus-ring);
+    outline-offset: 2px;
 }
-.nav-tabs {
-    padding:0 60px;
-    border-bottom:1px solid var(--border);
-    background:var(--bg-main);
+
+/* Preserve existing semantic classes from templates */
+.view-home .btn-primary,
+.view-home .btn-secondary {
+    /* Same in Win98, just classic raised buttons */
+    font-weight: 700;
 }
-.nav-container {
-    display:flex;
-    gap:30px;
-    max-width:1200px;
+
+.view-home a {
+    text-decoration: none;
 }
-.nav-tabs a {
-    padding:14px 0;
-    color:var(--text-secondary);
-    text-decoration:none;
-    font-size:0.9rem;
-    font-weight:500;
-    border-bottom:2px solid transparent;
-    transition:color 0.2s;
-    touch-action: manipulation;
+
+/* ---------- Page chrome ---------- */
+
+header {
+    /* Turn the header into a classic “window” titlebar row + form row feel */
+    padding: 10px 12px;
+    background: var(--w98-face);
+    border-bottom: 1px solid var(--w98-shadow);
+    display: flex;
+    align-items: center;
+    gap: 12px;
 }
-.nav-tabs a:hover {
-    color:var(--text-primary);
+
+h1 {
+    margin: 0;
+    font-size: 18px;
+    font-weight: 700;
+    letter-spacing: 0;
+    white-space: nowrap;
 }
-.nav-tabs a.active {
-    color:var(--accent);
-    border-bottom-color:var(--accent);
+
+h1 span {
+    color: var(--w98-blue);
 }
-.image-results-container {
-    padding:30px 60px;
+
+/* Search form in header */
+.search-form {
+    flex: 1;
+    max-width: 680px;
 }
-.image-grid {
-    display:grid;
-    grid-template-columns:repeat(auto-fill,minmax(240px,1fr));
-    gap:24px;
-    max-width:1600px;
-    margin:0 auto;
+
+/* ---------- Home view (centered "dialog") ---------- */
+
+.view-home {
+    min-height: 100vh;
+    padding: 22px;
+    display: grid;
+    place-items: center;
+    background: var(--w98-teal); /* desktop-like backdrop */
 }
-.image-card {
-    background:var(--bg-card);
-    border-radius:12px;
-    overflow:hidden;
-    border:1px solid var(--border);
-    transition:transform 0.2s ease,border-color 0.2s;
+
+.view-home .container {
+    width: 100%;
+    max-width: 560px;
+    padding: 0;
 }
-.image-card:hover {
-    transform:translateY(-4px);
-    border-color:var(--accent);
+
+/* Make the home “card” look like a window */
+.view-home .container {
+    background: var(--w98-face);
+    border-top: 2px solid var(--w98-hilight);
+    border-left: 2px solid var(--w98-hilight);
+    border-right: 2px solid var(--w98-dkshadow);
+    border-bottom: 2px solid var(--w98-dkshadow);
+    box-shadow:
+        1px 1px 0 var(--w98-shadow),
+        2px 2px 0 var(--w98-shadow);
+    padding: 0;
 }
-.image-wrapper {
-    position:relative;
-    aspect-ratio:4/3;
-    background:#000;
-    overflow:hidden;
+
+/* Fake titlebar via hero logo area */
+.view-home .hero-logo {
+    margin: 0;
+    padding: 8px 10px;
+    background: var(--w98-blue);
+    color: var(--w98-hilight);
+    font-size: 18px;
+    font-weight: 700;
+    letter-spacing: 0.2px;
+    text-align: left;
 }
-.image-wrapper img {
-    width:100%;
-    height:100%;
-    object-fit:cover;
-    display:block;
-    transition:opacity 0.3s;
+
+/* Ensure the <span> inside logo doesn't change titlebar legibility */
+.view-home .hero-logo span {
+    color: var(--w98-hilight);
 }
-.image-overlay {
-    position: absolute;
-    inset: 0;
-    background: rgba(0, 0, 0, 0.4);
-    display: flex;
-    align-items: center;
-    justify-content: center;
-    opacity: 0;
-    transition: opacity 0.2s;
-    pointer-events: none;
+
+/* Body of the window */
+.home-search-form {
+    padding: 14px 12px 12px 12px;
 }
-.image-card:hover .image-overlay {
-    opacity:1;
-    pointer-events: auto;
+
+.view-home .search-input-wrapper {
+    margin-bottom: 12px;
 }
-.overlay-buttons {
-    display:flex;
-    flex-direction:column;
-    gap:10px;
-    width:70%;
+
+.view-home .search-box {
+    box-shadow:
+        inset 1px 1px 0 var(--w98-shadow),
+        inset -1px -1px 0 var(--w98-hilight);
+    padding: 6px 8px;
 }
-.overlay-btn {
-    padding:8px 16px;
-    border-radius:20px;
-    font-size:0.8rem;
-    font-weight:700;
-    text-decoration:none;
-    text-align:center;
-    transition:filter 0.2s;
-    touch-action: manipulation;
+
+.view-home .buttons {
+    display: flex;
+    gap: 10px;
+    justify-content: flex-start;
 }
-.overlay-btn:hover {
-    filter:brightness(1.1);
+
+.view-home .buttons a {
+    display: inline-flex;
 }
-.overlay-btn.primary {
-    background:var(--accent);
-    color:var(--bg-main);
+
+/* ---------- Nav tabs -> classic flat toolbar links ---------- */
+
+.nav-tabs {
+    background: var(--w98-face);
+    border-bottom: 1px solid var(--w98-shadow);
+    padding: 6px 12px;
 }
-.overlay-btn.secondary {
-    background:rgba(255,255,255,0.1);
-    color:white;
-    backdrop-filter:blur(4px);
-    border:1px solid rgba(255,255,255,0.2);
+
+.nav-container {
+    max-width: var(--content-max);
+    margin: 0;
+    display: flex;
+    gap: 10px;
+    align-items: center;
 }
-.image-info {
-    padding:12px;
+
+.nav-tabs a {
+    color: var(--w98-text);
+    text-decoration: none;
+    padding: 4px 10px;
+    border: 1px solid transparent;
 }
-.image-caption {
-    display:block;
-    font-size:0.85rem;
-    color:var(--text-primary);
-    white-space:nowrap;
-    overflow:hidden;
-    text-overflow:ellipsis;
-    margin-bottom:4px;
+
+.nav-tabs a:hover {
+    border-top: 1px solid var(--w98-hilight);
+    border-left: 1px solid var(--w98-hilight);
+    border-right: 1px solid var(--w98-shadow);
+    border-bottom: 1px solid var(--w98-shadow);
+    background: var(--w98-face);
 }
-.image-source {
-    display:block;
-    font-size:0.75rem;
-    color:var(--text-secondary);
-    white-space:nowrap;
-    overflow:hidden;
-    text-overflow:ellipsis;
+
+.nav-tabs a.active {
+    background: var(--w98-face-2);
+    border-top: 1px solid var(--w98-shadow);
+    border-left: 1px solid var(--w98-shadow);
+    border-right: 1px solid var(--w98-hilight);
+    border-bottom: 1px solid var(--w98-hilight);
+    font-weight: 700;
 }
+
+/* ---------- Results layout ---------- */
+
 .content-layout {
-    display:grid;
-    grid-template-columns:140px minmax(0,700px) 450px;
-    gap:60px;
-    padding:30px 60px;
+    max-width: var(--content-max);
+    margin: 0;
+    padding: var(--content-pad);
+    display: grid;
+    grid-template-columns: minmax(0, 2.8fr) minmax(320px, 1.1fr);
+    gap: 16px;
+}
+
+/* Left spacer not used in full-width layout */
+.sidebar-spacer {
+    display: none;
 }
+
 .results-container {
-    grid-column:2;
+    min-width: 0;
 }
+
 .result {
-    margin-bottom:32px;
+    padding: 10px 12px;
+    margin-bottom: 12px;
+    background: var(--w98-face);
+    border-top: 2px solid var(--w98-hilight);
+    border-left: 2px solid var(--w98-hilight);
+    border-right: 2px solid var(--w98-shadow);
+    border-bottom: 2px solid var(--w98-shadow);
 }
+
 .result a {
-    color:var(--accent);
-    text-decoration:none;
-    font-size:1.25rem;
-    display:inline-block;
-    margin-bottom:4px;
+    font-size: 16px;
+    font-weight: 700;
+    display: inline-block;
+    margin: 4px 0 3px 0;
+    color: var(--w98-link);
 }
+
 .url {
-    color:var(--text-secondary);
-    font-size:0.85rem;
-    display:block;
-    margin-bottom:4px;
+    color: #004000;
+    font-size: 12px;
+    display: block;
+    overflow-wrap: anywhere;
 }
+
 .desc {
-    color:var(--text-muted);
-    line-height:1.6;
-    margin:0;
+    margin: 0;
+    color: var(--w98-text);
+}
+
+/* ---------- Infobox sidebar (right “window”) ---------- */
+
+.infobox-sidebar {
+    min-width: 0;
 }
+
 .infobox {
-    grid-column:3;
-    background:var(--bg-card);
-    border:1px solid var(--border);
-    border-radius:12px;
-    align-self:start;
-    margin-bottom: 10px;
+    background: var(--w98-face);
+    border-top: 2px solid var(--w98-hilight);
+    border-left: 2px solid var(--w98-hilight);
+    border-right: 2px solid var(--w98-dkshadow);
+    border-bottom: 2px solid var(--w98-dkshadow);
+    box-shadow: 1px 1px 0 var(--w98-shadow);
+    margin-bottom: 12px;
 }
+
 .infobox-header {
-    padding:20px;
-    border-bottom:1px solid var(--border);
+    background: var(--w98-blue);
+    color: var(--w98-hilight);
+    padding: 8px 10px;
+    border-bottom: 1px solid var(--w98-dkshadow);
 }
+
 .infobox-title {
-    font-size:1.5rem;
-    font-weight:600;
-    margin:0;
-} .infobox-content {
+    margin: 0;
+    font-size: 14px;
+    font-weight: 700;
+}
+
+.infobox-main {
+    display: flex;
+    gap: 10px;
+    padding: 10px;
+}
+
+.infobox-image {
+    width: 96px;
+    height: 96px;
+    min-width: 96px;
+    object-fit: cover;
+
+    background: var(--w98-hilight);
+    border: 1px solid var(--w98-dkshadow);
+    box-shadow:
+        inset 1px 1px 0 var(--w98-shadow),
+        inset -1px -1px 0 var(--w98-hilight);
+}
+
+.infobox-content {
     display: flex;
     flex-direction: column;
-    gap: 12px;
+    gap: 8px;
+    min-width: 0;
+}
+
+.infobox-summary {
+    margin: 0;
+    font-size: 13px;
+    color: var(--w98-text);
 }
 
 .read-more {
-    color: var(--accent);
-    font-weight: bold;
-    text-decoration: none;
-    font-size: 0.9rem;
     align-self: flex-start;
+    font-weight: 700;
+    text-decoration: underline;
+    color: var(--w98-link);
 }
 
-.read-more:hover {
-    text-decoration: underline;
-} .infobox-main {
-    display:flex;
-    gap:15px;
-    padding:20px;
+/* ---------- Pagination ---------- */
+
+.pagination {
+    display: flex;
+    gap: 10px;
+    align-items: center;
+    padding: 10px 0 0 0;
+    justify-content: flex-start;
 }
-.infobox-image {
-    width:120px;
-    height:120px;
-    min-width:120px;
-    border-radius:8px;
-    border:1px solid var(--border);
-    object-fit:cover;
+
+.pagination-current {
+    color: var(--w98-text);
+    font-size: 13px;
+    padding: 2px 6px;
+    background: var(--w98-face-2);
+    border-top: 1px solid var(--w98-shadow);
+    border-left: 1px solid var(--w98-shadow);
+    border-right: 1px solid var(--w98-hilight);
+    border-bottom: 1px solid var(--w98-hilight);
 }
-.infobox-summary {
+
+/* ---------- Images view ---------- */
+
+.image-results-container {
+    max-width: var(--content-max);
+    margin: 0 auto;
+    padding: var(--content-pad);
+}
+
+.image-grid {
+    display: grid;
+    grid-template-columns: repeat(auto-fill, minmax(170px, 1fr));
+    gap: 12px;
+}
+
+.image-card {
+    background: var(--w98-face);
+    border-top: 2px solid var(--w98-hilight);
+    border-left: 2px solid var(--w98-hilight);
+    border-right: 2px solid var(--w98-shadow);
+    border-bottom: 2px solid var(--w98-shadow);
+    overflow: hidden;
+}
+
+.image-wrapper {
+    position: relative;
+    background: #000;
+    aspect-ratio: 4 / 3;
+    overflow: hidden;
+}
+
+.image-wrapper img {
+    width: 100%;
+    height: 100%;
+    object-fit: cover;
     display: block;
-    font-size:0.95rem;
-    line-height:1.5;
-    color:var(--text-muted);
-    margin:0;
 }
 
-.pagination {
+/* Overlay: Win98-ish tooltip panel instead of modern blur */
+.image-overlay {
+    position: absolute;
+    inset: 0;
+    background: rgba(192, 192, 192, 0.92);
+    opacity: 0;
+    transition: opacity 0.12s linear;
+    display: grid;
+    place-items: center;
+}
+
+.image-card:hover .image-overlay {
+    opacity: 1;
+}
+
+.overlay-buttons {
     display: flex;
-    justify-content: center;
-    align-items: center;
-    gap: 16px;
-    margin-top: 40px;
-    padding-bottom: 40px;
+    flex-direction: column;
+    gap: 8px;
+    width: 78%;
 }
 
-.pagination-btn {
-    background: var(--bg-card);
-    color: var(--text-primary);
-    border: 1px solid var(--border);
-    padding: 8px 16px;
-    border-radius: 8px;
-    text-decoration: none;
-    font-size: 0.9rem;
-    font-weight: 600;
-    transition: all 0.2s;
-    touch-action: manipulation;
+.overlay-btn {
+    width: 100%;
+    font-weight: 700;
+    color: var(--w98-text);
 }
 
-.pagination-btn:hover {
-    background: var(--border);
-    border-color: var(--text-secondary);
+.overlay-btn.primary,
+.overlay-btn.secondary {
+    /* identical classic button look */
+    background: var(--w98-face);
 }
 
-.pagination-current {
-    color: var(--text-secondary);
-    font-size: 0.9rem;
+.image-info {
+    padding: 8px 10px;
+    background: var(--w98-face);
+    border-top: 1px solid var(--w98-shadow);
+}
+
+.image-caption {
+    display: block;
+    font-size: 12px;
+    font-weight: 700;
+    white-space: nowrap;
+    overflow: hidden;
+    text-overflow: ellipsis;
 }
 
-@media (max-width:1200px) {
+.image-source {
+    display: block;
+    font-size: 12px;
+    color: #404040;
+    white-space: nowrap;
+    overflow: hidden;
+    text-overflow: ellipsis;
+}
+
+/* ---------- Responsive ---------- */
+
+@media (max-width: 1100px) {
     .content-layout {
-        grid-template-columns:1fr;
-        padding:20px 30px;
-        gap:20px;
-    }
-    .results-container,.infobox-sidebar {
-        grid-column:1;
-        max-width:100%;
+        grid-template-columns: 1fr;
     }
     .infobox-sidebar {
-        order:-1;
-    }
-    .nav-tabs,.image-results-container {
-        padding:0 30px;
-    }
-    header {
-        padding:15px 30px;
+        order: -1;
     }
 }
 
-@media (max-width:768px) {
+@media (max-width: 768px) {
     header {
-        flex-direction:column;
-        gap:12px;
-        padding:12px 16px;
-        text-align:center;
-    }
-    h1 {
-        font-size:1.3rem;
+        flex-direction: column;
+        align-items: stretch;
     }
     .search-form {
-        width:100%;
-        max-width:100%;
-    }
-    .search-form .search-box {
-        width:100%;
-    }
-    .nav-tabs {
-        overflow-x:auto;
-        -webkit-overflow-scrolling:touch;
-        padding:0 16px;
-    }
-    .nav-container {
-        gap:24px;
-        min-width:max-content;
-    }
-    .nav-tabs a {
-        padding:12px 0;
-        font-size:0.95rem;
-    }
-    .content-layout {
-        padding:16px;
-        gap:16px;
-    }
-    .result {
-        margin-bottom:24px;
-    }
-    .result a {
-        font-size:1.1rem;
-        word-break:break-word;
-    }
-    .url {
-        font-size:0.8rem;
-        word-break:break-all;
-    }
-    .desc {
-        font-size:0.9rem;
-    }
-    .infobox {
-        margin-bottom:16px;
-    }
-    .infobox-header {
-        padding:16px;
-    }
-    .infobox-title {
-        font-size:1.2rem;
-    }
-    .infobox-main {
-        flex-direction:column;
-        padding:16px;
-        gap:12px;
-    }
-    .infobox-image {
-        width:100%;
-        height:auto;
-        min-width:unset;
-        max-width:200px;
-    }
-    .image-results-container {
-        padding:16px;
-    }
-    .pagination {
-        flex-wrap:wrap;
-        gap:8px;
-        padding:0 8px;
-    }
-    .pagination-btn {
-        padding:10px 14px;
-        font-size:0.85rem;
+        max-width: none;
     }
     .view-home {
-        display: flex;
-        justify-content: center;
-        align-items: center;
-        transform: translateY(-5vh);
-        padding:20px 16px;
-        min-height: 100vh;
-    }
-    .view-home .container {
-        padding:0;
-        width:100%;
-        max-width:580px;
-    }
-    .view-home .hero-logo {
-        font-size:3rem;
-        margin-bottom:24px;
-    }
-    .view-home .search-input-wrapper {
-        margin-bottom:16px;
-    }
-    .view-home .search-box {
-        width:100%;
-        font-size:1rem;
-        padding:14px 20px;
+        padding: 14px;
     }
     .view-home .buttons {
-        gap:10px;
-    }
-    .view-home button {
-        padding:12px 20px;
-    }
-}
-
-@media (max-width:600px) {
-    header {
-        padding:12px 12px;
-    }
-    .search-box {
-        font-size:0.95rem;
-    }
-    .view-home .search-box {
-        width:100%;
+        justify-content: stretch;
+        flex-direction: column;
     }
-    .view-home {
-        padding:20px 16px;
+    .view-home .buttons button,
+    .view-home .buttons a {
+        width: 100%;
     }
     .image-grid {
-        grid-template-columns:repeat(auto-fill,minmax(140px,1fr));
-        gap:10px;
-    }
-    .image-card {
-        border-radius:8px;
-    }
-    .image-info {
-        padding:8px 10px;
-    }
-    .image-caption {
-        font-size:0.8rem;
+        grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
     }
-    .image-source {
-        font-size:0.7rem;
-    }
-    .overlay-buttons {
-        width:80%;
-    }
-    .overlay-btn {
-        padding:6px 12px;
-        font-size:0.75rem;
+}
+
+@media (prefers-reduced-motion: reduce) {
+    * {
+        transition: none !important;
     }
 }

+ 25 - 19
templates/home.html

@@ -1,29 +1,36 @@
-<!DOCTYPE html>
+<!doctype html>
 <html lang="en">
-    
     <head>
-        <meta charset="UTF-8">
-        <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=5.0">
-        <title>
-            OmniSearch
-        </title>
-        <link rel="stylesheet" href="static/main.css">
-	<link rel="icon" type="image/x-icon" href="/static/favicon.ico">
-        <link rel="search" 
-        type="application/opensearchdescription+xml" 
-        title="OmniSearch" href="/opensearch.xml">
+        <meta charset="UTF-8" />
+        <meta
+            name="viewport"
+            content="width=device-width, initial-scale=1.0, maximum-scale=5.0"
+        />
+        <title>Simo Search</title>
+        <link rel="stylesheet" href="/static/main.css" />
+        <link rel="icon" type="image/x-icon" href="/static/favicon.gif" />
+        <link
+            rel="search"
+            type="application/opensearchdescription+xml"
+            title="Simo Search"
+            href="/opensearch.xml"
+        />
     </head>
-    
+
     <body>
         <div class="view-home">
             <div class="container">
-                <h1 class="hero-logo">
-                    Omni<span>Search</span>
-                </h1>
+                <h1 class="hero-logo">Simo <span>Search</span></h1>
                 <form action="/search" class="home-search-form">
                     <div class="search-input-wrapper">
-                        <input name="q" type="text" class="search-box" placeholder="Search the web..."
-                        autofocus autocomplete="off">
+                        <input
+                            name="q"
+                            type="text"
+                            class="search-box"
+                            placeholder="Search the web..."
+                            autofocus
+                            autocomplete="off"
+                        />
                     </div>
                     <div class="buttons">
                         <button type="submit" class="btn-primary">
@@ -39,5 +46,4 @@
             </div>
         </div>
     </body>
-
 </html>

+ 42 - 33
templates/images.html

@@ -1,34 +1,34 @@
-<!DOCTYPE html>
+<!doctype html>
 <html lang="en">
-    
     <head>
-        <meta charset="UTF-8">
-        <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=5.0">
-        <title>
-            OmniSearch Images - {{query}}
-        </title>
-	<link rel="icon" type="image/x-icon" href="/static/favicon.ico">
-        <link rel="stylesheet" href="static/main.css">
+        <meta charset="UTF-8" />
+        <meta
+            name="viewport"
+            content="width=device-width, initial-scale=1.0, maximum-scale=5.0"
+        />
+        <title>Simo Search Images - {{query}}</title>
+        <link rel="icon" type="image/x-icon" href="/static/favicon.gif" />
+        <link rel="stylesheet" href="static/main.css" />
     </head>
-    
+
     <body class="images-view">
         <header>
-            <h1>
-                Omni<span>Search</span>
-            </h1>
+            <h1>Simo <span>Search</span></h1>
             <form action="/images" method="GET" class="search-form">
-                <input name="q" autocomplete="off"="text" class="search-box" placeholder="Search for images..."
-                value="{{query}}">
+                <input
+                    name="q"
+                    autocomplete="off"
+                    ="text"
+                    class="search-box"
+                    placeholder="Search for images..."
+                    value="{{query}}"
+                />
             </form>
         </header>
         <nav class="nav-tabs">
             <div class="nav-container">
-                <a href="/search?q={{query}}">
-                    All
-                </a>
-                <a href="/images?q={{query}}" class="active">
-                    Images
-                </a>
+                <a href="/search?q={{query}}"> All </a>
+                <a href="/images?q={{query}}" class="active"> Images </a>
             </div>
         </nav>
         <main class="image-results-container">
@@ -36,39 +36,48 @@
                 {{for img in images}}
                 <div class="image-card">
                     <div class="image-wrapper">
-                        <img src="{{img[0]}}" alt="{{img[1]}}" loading="lazy">
+                        <img src="{{img[0]}}" alt="{{img[1]}}" loading="lazy" />
                         <div class="image-overlay">
                             <div class="overlay-buttons">
-                                <a href="{{img[3]}}" target="_blank" class="overlay-btn primary">
+                                <a
+                                    href="{{img[3]}}"
+                                    target="_blank"
+                                    class="overlay-btn primary"
+                                >
                                     View Image
                                 </a>
-                                <a href="{{img[2]}}" target="_blank" class="overlay-btn secondary">
+                                <a
+                                    href="{{img[2]}}"
+                                    target="_blank"
+                                    class="overlay-btn secondary"
+                                >
                                     Visit Site
                                 </a>
                             </div>
                         </div>
                     </div>
                     <div class="image-info">
-                        <span class="image-caption">
-                            {{img[1]}}
-                        </span>
-                        <span class="image-source">
-                            {{img[2]}}
-                        </span>
+                        <span class="image-caption"> {{img[1]}} </span>
+                        <span class="image-source"> {{img[2]}} </span>
                     </div>
                 </div>
                 {{endfor}}
             </div>
             <nav class="pagination">
-                <a class="pagination-btn prev" href="/images?q={{query}}&p={{prev_page}}">
+                <a
+                    class="pagination-btn prev"
+                    href="/images?q={{query}}&p={{prev_page}}"
+                >
                     &larr; Page {{prev_page}}
                 </a>
                 <span class="pagination-current">Page {{page}}</span>
-                <a class="pagination-btn next" href="/images?q={{query}}&p={{next_page}}">
+                <a
+                    class="pagination-btn next"
+                    href="/images?q={{query}}&p={{next_page}}"
+                >
                     Page {{next_page}} &rarr;
                 </a>
             </nav>
         </main>
     </body>
-
 </html>

+ 1 - 1
templates/opensearch.xml

@@ -2,7 +2,7 @@
 <OpenSearchDescription
 	xmlns="http://a9.com/-/spec/opensearch/1.1/"
 	xmlns:moz="http://www.mozilla.org/2006/browser/search/">
-	<ShortName>OmniSearch</ShortName>
+	<ShortName>Simo Search</ShortName>
 	<Description>Lightweight metasearch engine</Description>
 	<Url type="text/html" method="get" template="{{domain}}/search?q={searchTerms}"/>
 	<InputEncoding>UTF-8</InputEncoding>

+ 58 - 59
templates/results.html

@@ -1,91 +1,90 @@
-<!DOCTYPE html>
+<!doctype html>
 <html lang="en">
-    
     <head>
-        <meta charset="UTF-8">
-        <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=5.0">
-        <title>
-            OmniSearch - {{query}}
-        </title>
-        <link rel="stylesheet" href="static/main.css">
-	<link rel="icon" type="image/x-icon" href="/static/favicon.ico">
-        <link rel="search" 
-        type="application/opensearchdescription+xml" 
-        title="OmniSearch" href="/opensearch.xml">
+        <meta charset="UTF-8" />
+        <meta
+            name="viewport"
+            content="width=device-width, initial-scale=1.0, maximum-scale=5.0"
+        />
+        <title>Simo Search - {{query}}</title>
+        <link rel="stylesheet" href="/static/main.css" />
+        <link rel="icon" type="image/x-icon" href="/static/favicon.gif" />
+        <link
+            rel="search"
+            type="application/opensearchdescription+xml"
+            title="Simo Search"
+            href="/opensearch.xml"
+        />
     </head>
-    
+
     <body class="results-view">
         <header>
-            <h1>
-                Omni<span>Search</span>
-            </h1>
+            <h1>Simo<span>Search</span></h1>
             <form action="/search" method="GET" class="search-form">
-                <input name="q" type="text" class="search-box" autocomplete="off" placeholder="Search the web..."
-                value="{{query}}">
+                <input
+                    name="q"
+                    type="text"
+                    class="search-box"
+                    autocomplete="off"
+                    placeholder="Search the web..."
+                    value="{{query}}"
+                />
             </form>
         </header>
         <nav class="nav-tabs">
             <div class="nav-container">
-                <a href="/search?q={{query}}" class="active">
-                    All
-                </a>
-                <a href="/images?q={{query}}">
-                    Images
-                </a>
+                <a href="/search?q={{query}}" class="active"> All </a>
+                <a href="/images?q={{query}}"> Images </a>
             </div>
         </nav>
         <div class="content-layout">
-            <aside class="sidebar-spacer">
-            </aside>
             <main class="results-container">
                 {{for result in results}}
                 <div class="result">
-                    <span class="url">
-                        {{result[1]}}
-                    </span>
-                    <a href="{{result[0]}}">
-                        {{result[2]}}
-                    </a>
-                    <p class="desc">
-                        {{result[3]}}
-                    </p>
+                    <span class="url"> {{result[1]}} </span>
+                    <a href="{{result[0]}}"> {{result[2]}} </a>
+                    <p class="desc">{{result[3]}}</p>
                 </div>
                 {{endfor}}
 
                 <nav class="pagination">
-                    <a class="pagination-btn prev" href="/search?q={{query}}&p={{prev_page}}">
+                    <a
+                        class="pagination-btn prev"
+                        href="/search?q={{query}}&p={{prev_page}}"
+                    >
                         &larr; Page {{prev_page}}
                     </a>
                     <span class="pagination-current">Page {{page}}</span>
-                    <a class="pagination-btn next" href="/search?q={{query}}&p={{next_page}}">
+                    <a
+                        class="pagination-btn next"
+                        href="/search?q={{query}}&p={{next_page}}"
+                    >
                         Page {{next_page}} &rarr;
                     </a>
                 </nav>
             </main>
             <aside class="infobox-sidebar">
-            {{if exists infoboxes}}
-              {{for info in infoboxes}}
-                 <section class="infobox">
-                     <div class="infobox-header">
-                         <h2 class="infobox-title">
-                             {{info[0]}}
-                         </h2>
-                     </div>
-                     <div class="infobox-main">
-                         <img src="{{info[1]}}" alt="{{info[0]}}" class="infobox-image">
-                         <div class="infobox-content"> <p class="infobox-summary">
-                                 {{info[2]|safe}}
-                             </p>
-                             <a class="read-more" href="{{info[3]}}">
-                                 Read More
-                             </a>
-                         </div>
-                     </div>
-                 </section>
-                 {{endfor}}
-               {{endif}}
+                {{if exists infoboxes}} {{for info in infoboxes}}
+                <section class="infobox">
+                    <div class="infobox-header">
+                        <h2 class="infobox-title">{{info[0]}}</h2>
+                    </div>
+                    <div class="infobox-main">
+                        <img
+                            src="{{info[1]}}"
+                            alt="{{info[0]}}"
+                            class="infobox-image"
+                        />
+                        <div class="infobox-content">
+                            <p class="infobox-summary">{{info[2]|safe}}</p>
+                            <a class="read-more" href="{{info[3]}}">
+                                Read More
+                            </a>
+                        </div>
+                    </div>
+                </section>
+                {{endfor}} {{endif}}
             </aside>
         </div>
     </body>
-
 </html>