diff --git a/frontend/app/assets/css/shared.scss b/frontend/app/assets/css/shared.scss index e7ff614..42f2d05 100644 --- a/frontend/app/assets/css/shared.scss +++ b/frontend/app/assets/css/shared.scss @@ -1,17 +1,13 @@ -// Shared TUI transition mixin -@mixin tui-transition($steps: 2) { - transition: all 0.1s steps($steps, end); -} +/* Global rules shared across pages/components (imported once via nuxt.config css). */ -// Box-drawing content string for borders (top/bottom frame lines) -$box-line-top: "═══════════════════"; - -/* Global rules - no-sprite pages hide the undertable sprite area */ -.no-sprite .undertable-wrapper { +/* Pages that opt out of the header sprite hide the TableHeader undertable area. + Selector is prefixed with the element type so it always outranks TableHeader's + scoped `.undertable-wrapper { display: flex }` regardless of stylesheet order. */ +div.no-sprite .undertable-wrapper { display: none; } -// Dropdown transition keyframes (used by LanguageSelector and ThemeSelector) +/* Dropdown transition (used by LanguageSelector and ThemeSelector). */ .dropdown-enter-active, .dropdown-leave-active { transition: opacity 0.2s ease, transform 0.2s ease; } @@ -19,14 +15,3 @@ $box-line-top: "═══════════════════"; opacity: 0; transform: translateY(-8px); } - -// Dropdown button shared styles -.tui-dropdown-button { - background: var(--color-background-fore); - color: var(--color-text); - font-size: 1em; - border: 1px solid var(--color-border-color); - padding: 8px 12px; - border-radius: 0; - cursor: pointer; -} diff --git a/frontend/app/components/parts/site_options/LanguageSelector.vue b/frontend/app/components/parts/site_options/LanguageSelector.vue index e39d0d3..815a7c1 100644 --- a/frontend/app/components/parts/site_options/LanguageSelector.vue +++ b/frontend/app/components/parts/site_options/LanguageSelector.vue @@ -79,14 +79,6 @@ border: 1px solid var(--color-border-color); background-color: var(--color-selected); } } -/* Dropdown transitions */ -.dropdown-enter-active, .dropdown-leave-active { - transition: opacity 0.2s ease, transform 0.2s ease; -} -.dropdown-enter-from, .dropdown-leave-to { - opacity: 0; - transform: translateY(-8px); -} .dropdown { z-index: 10; diff --git a/frontend/app/components/parts/site_options/ThemeSelector.vue b/frontend/app/components/parts/site_options/ThemeSelector.vue index e2e709e..8d6886f 100644 --- a/frontend/app/components/parts/site_options/ThemeSelector.vue +++ b/frontend/app/components/parts/site_options/ThemeSelector.vue @@ -157,15 +157,6 @@ border: 1px solid var(--color-border-color); margin-right: 15px; } -/* Dropdown transitions */ -.dropdown-enter-active, .dropdown-leave-active { - transition: opacity 0.2s ease, transform 0.2s ease; -} -.dropdown-enter-from, .dropdown-leave-to { - opacity: 0; - transform: translateY(-8px); -} - /* Dropdown */ .dropdown { z-index: 10; @@ -234,16 +225,6 @@ border: 1px solid var(--color-border-color); } } -.two-columns { - display: flex; - flex-grow: 1; - flex-direction: row; -} - -.section { - flex-grow: 1; -} - .stacked { flex-direction: column; } diff --git a/frontend/app/pages/admin/login.vue b/frontend/app/pages/admin/login.vue index 24f4354..ef4329f 100644 --- a/frontend/app/pages/admin/login.vue +++ b/frontend/app/pages/admin/login.vue @@ -187,9 +187,3 @@ const onSubmit = async () => { } } - - diff --git a/frontend/app/pages/art/[slug].vue b/frontend/app/pages/art/[slug].vue index 2f41720..0479aa4 100644 --- a/frontend/app/pages/art/[slug].vue +++ b/frontend/app/pages/art/[slug].vue @@ -87,8 +87,4 @@ useSeo({ font-size: 1.4rem; } } - -.no-sprite .undertable-wrapper { - display: none; -} \ No newline at end of file diff --git a/frontend/app/pages/art/index.vue b/frontend/app/pages/art/index.vue index a804fe3..2f49b7b 100644 --- a/frontend/app/pages/art/index.vue +++ b/frontend/app/pages/art/index.vue @@ -265,9 +265,3 @@ const displayedArt = computed(() => { } } - - diff --git a/frontend/app/pages/blog/[slug].vue b/frontend/app/pages/blog/[slug].vue index 2bb115d..b73beb8 100644 --- a/frontend/app/pages/blog/[slug].vue +++ b/frontend/app/pages/blog/[slug].vue @@ -91,8 +91,4 @@ useSeo({ font-size: 1.4rem; } } - -.no-sprite .undertable-wrapper { - display: none; -} \ No newline at end of file diff --git a/frontend/app/pages/blog/index.vue b/frontend/app/pages/blog/index.vue index 8c98714..f703c61 100644 --- a/frontend/app/pages/blog/index.vue +++ b/frontend/app/pages/blog/index.vue @@ -193,9 +193,3 @@ const displayedPosts = computed(() => { } } - - diff --git a/frontend/app/pages/contact/index.vue b/frontend/app/pages/contact/index.vue index 6dceafe..2358f34 100644 --- a/frontend/app/pages/contact/index.vue +++ b/frontend/app/pages/contact/index.vue @@ -73,9 +73,3 @@ h1 { } } - - diff --git a/frontend/app/pages/index.vue b/frontend/app/pages/index.vue index 32ded21..7869aec 100644 --- a/frontend/app/pages/index.vue +++ b/frontend/app/pages/index.vue @@ -320,10 +320,6 @@ const sectionTargets = { margin-bottom: 0; } - .tui-frame:last-child { - margin-bottom: 0; - } - @media screen and (min-width: 1200px) { margin-top: 290px; } @@ -440,18 +436,6 @@ const sectionTargets = { } } -.project-card-corner { - position: absolute; - width: 14px; - height: 14px; - border-color: #cfcfcf; - - &.tl { top: -1px; left: -1px; border-top: 2px solid; border-left: 2px solid; } - &.tr { top: -1px; right: -1px; border-top: 2px solid; border-right: 2px solid; } - &.bl { bottom: -1px; left: -1px; border-bottom: 2px solid; border-left: 2px solid; } - &.br { bottom: -1px; right: -1px; border-bottom: 2px solid; border-right: 2px solid; } -} - .project-title { font-family: 'Hurmit', monospace; color: inherit; @@ -501,137 +485,6 @@ const sectionTargets = { letter-spacing: 0.5px; } -.stats-section { - margin-top: 32px; -} - -.stats-grid { - display: grid; - grid-template-columns: repeat(3, 1fr); - gap: 10px; -} - -.stat-card { - position: relative; - background: var(--color-background-fore); - border: 2px solid var(--color-border-color); - box-shadow: - inset 1px -1px 0px 0px rgba(0,0,0,0.3), - 4px -4px 0px 0px var(--color-container-shadow); - padding: 0; - display: flex; - flex-direction: column; - align-items: center; - text-align: center; - gap: 0; - overflow: hidden; - transition: all 0.1s steps(2, end); - - &:hover { - border-color: var(--color-link); - box-shadow: - inset 1px -1px 0px 0px rgba(0,0,0,0.3), - 4px -4px 0px 0px var(--color-link); - } - - .stat-card-corner { - position: absolute; - width: 12px; - height: 12px; - border-color: #cfcfcf; - - &.tl { top: -1px; left: -1px; border-top: 2px solid; border-left: 2px solid; } - &.tr { top: -1px; right: -1px; border-top: 2px solid; border-right: 2px solid; } - &.bl { bottom: -1px; left: -1px; border-bottom: 2px solid; border-left: 2px solid; } - &.br { bottom: -1px; right: -1px; border-bottom: 2px solid; border-right: 2px solid; } - } -} - -.stat-card-frame-top { - position: absolute; - top: -2px; - left: 14px; - right: 14px; - height: 0; - color: var(--color-border-color); - font-family: 'Hurmit', monospace; - font-size: 0; - line-height: 0; - white-space: nowrap; - - &::before { - content: "═════"; - } -} - -.stat-card-frame-bottom { - position: absolute; - bottom: -2px; - left: 14px; - right: 14px; - height: 0; - color: var(--color-border-color); - font-family: 'Hurmit', monospace; - font-size: 0; - line-height: 0; - white-space: nowrap; - - &::before { - content: "═════"; - } -} - -.stat-card-header { - background-color: var(--color-link); - color: var(--color-background-fore); - padding: 3px 12px; - font-family: 'Hurmit', monospace; - font-size: 0.55rem; - letter-spacing: 2px; - text-transform: uppercase; - width: 100%; - text-align: center; - box-shadow: inset 0 -2px 0px 0px rgba(0,0,0,0.3); -} - -.stat-card-content { - padding: 16px 10px; - display: flex; - flex-direction: column; - align-items: center; - text-align: center; - gap: 8px; - width: 100%; -} - -.stat-pixel-art { - width: 36px; - height: 36px; - margin-bottom: 2px; - fill: var(--color-link); - filter: drop-shadow(0 0 4px var(--color-link)); - image-rendering: pixelated; -} - -.stat-number { - font-family: 'Hurmit', monospace; - font-size: 1.6rem; - color: var(--color-link); - text-shadow: 0 0 8px var(--color-link), 0 0 4px var(--color-link); - font-weight: bold; - letter-spacing: 2px; -} - -.stat-label { - font-family: 'Hurmit', monospace; - color: var(--color-text); - font-size: 0.65rem; - line-height: 1.35; - text-transform: uppercase; - letter-spacing: 0.5px; - opacity: 0.8; -} - .tui-list { list-style: none; margin: 0; @@ -765,16 +618,7 @@ const sectionTargets = { pointer-events: none; } -@keyframes blink-cursor { - 0%, 50% { opacity: 1; } - 51%, 100% { opacity: 0; } -} - @media (max-width: 900px) { - .stats-grid { - grid-template-columns: repeat(2, 1fr); - } - .grid { grid-template-columns: repeat(2, minmax(200px, 1fr)); } @@ -811,33 +655,6 @@ const sectionTargets = { font-size: 0.82rem; } - .stats-grid { - grid-template-columns: repeat(2, 1fr); - gap: 8px; - } - - .stat-card-header { - padding: 2px 8px; - font-size: 0.5rem; - } - - .stat-card-content { - padding: 12px 6px; - } - - .stat-number { - font-size: 1.4rem; - } - - .stat-label { - font-size: 0.6rem; - } - - .stat-pixel-art { - width: 28px; - height: 28px; - } - .grid { grid-template-columns: 1fr; padding: 16px 0; @@ -849,10 +666,6 @@ const sectionTargets = { } @media (max-width: 400px) { - .stats-grid { - grid-template-columns: 1fr; - } - .section-title { font-size: 1rem; padding-left: 0; diff --git a/frontend/app/pages/projects/hibolia/order.vue b/frontend/app/pages/projects/hibolia/order.vue index 99f9f75..59bb5fb 100644 --- a/frontend/app/pages/projects/hibolia/order.vue +++ b/frontend/app/pages/projects/hibolia/order.vue @@ -581,9 +581,3 @@ const onSubmit = async () => { } } - - diff --git a/frontend/app/pages/projects/hibolia/thanks.vue b/frontend/app/pages/projects/hibolia/thanks.vue index ef5652e..f535269 100644 --- a/frontend/app/pages/projects/hibolia/thanks.vue +++ b/frontend/app/pages/projects/hibolia/thanks.vue @@ -113,9 +113,3 @@ const localePath = useLocalePath(); filter: blur(10px); } - - diff --git a/frontend/app/pages/projects/index.vue b/frontend/app/pages/projects/index.vue index 0298448..36f0cfd 100644 --- a/frontend/app/pages/projects/index.vue +++ b/frontend/app/pages/projects/index.vue @@ -267,9 +267,3 @@ function navigateToProject(project) { } } - - diff --git a/frontend/nuxt.config.ts b/frontend/nuxt.config.ts index 99cc284..56c72b5 100644 --- a/frontend/nuxt.config.ts +++ b/frontend/nuxt.config.ts @@ -8,7 +8,8 @@ export default defineNuxtConfig({ css: [ '~/assets/css/colors.scss', '~/assets/css/fonts.scss', - '~/assets/css/main.scss' + '~/assets/css/main.scss', + '~/assets/css/shared.scss' ], runtimeConfig: {