diff --git a/public/desktop.css b/public/desktop.css new file mode 100644 index 0000000..f4b05fe --- /dev/null +++ b/public/desktop.css @@ -0,0 +1,118 @@ +:root { + --md3-primary: #2962FF; /* Blue 800 */ + --md3-primary-container: #82B1FF; /* Light Blue */ +} + +/* Desktop Dark Mode — Material 3 Expressive Style */ +body { + font-family: "Roboto", "Segoe UI", sans-serif; + background-color: #121212; + color: #E3E3E3; + margin: 0; + padding: 0; +} + +.container { + max-width: 800px; + margin: 60px auto; + background: #1E1E1E; + padding: 40px; + border-radius: 24px; + box-shadow: 0 4px 20px rgba(0,0,0,0.4); + border: 1px solid rgba(255, 255, 255, 0.05); + transition: background-color 0.3s ease; +} + +h1 { + font-size: 2.4em; + margin-bottom: 32px; + text-align: center; + color: #FFFFFF; + font-weight: 500; +} + +.button-group { + display: flex; + justify-content: center; + gap: 20px; + margin-bottom: 36px; +} + +button { + background-color: var(--md3-primary); + color: white; + border: none; + padding: 14px 28px; + font-size: 1.1em; + border-radius: 28px; + cursor: pointer; + font-weight: 500; + box-shadow: 0 2px 4px rgba(0,0,0,0.3); + transition: background-color 0.25s ease, box-shadow 0.25s ease, transform 0.15s ease; +} + +button:hover { + background-color: var(--md3-primary-container); + box-shadow: 0 4px 10px rgba(0,0,0,0.4); + transform: translateY(-2px); +} + +.status-container { + text-align: center; + font-size: 1.3em; +} + +.status-text.green { + color: #4CAF50; + font-weight: 600; +} + +.status-text.red { + color: #FF6D60; + font-weight: 600; +} + +/* Material 3 Spinner */ +.spinner { + display: none; + width: 48px; + height: 48px; + margin: 20px auto 0; + animation: spinner-rotate 2s linear infinite; + transform-origin: 50% 50%; +} + +.spinner.visible { + display: block; +} + +.spinner .path { + stroke: var(--md3-primary); + stroke-linecap: round; + stroke-dasharray: 90, 150; + stroke-dashoffset: 0; + animation: spinner-dash 1.5s ease-in-out infinite; +} + +/* Rotation animation on the whole SVG */ +@keyframes spinner-rotate { + 100% { + transform: rotate(360deg); + } +} + +/* Stroke dash animation on the circle */ +@keyframes spinner-dash { + 0% { + stroke-dasharray: 1, 150; + stroke-dashoffset: 0; + } + 50% { + stroke-dasharray: 90, 150; + stroke-dashoffset: -35; + } + 100% { + stroke-dasharray: 90, 150; + stroke-dashoffset: -124; + } +} diff --git a/public/mobile.css b/public/mobile.css new file mode 100644 index 0000000..0debcbc --- /dev/null +++ b/public/mobile.css @@ -0,0 +1,119 @@ +:root { + --md3-primary: #2962FF; /* Blue 800 */ + --md3-primary-container: #82B1FF; /* Light Blue */ +} + +/* Mobile Dark Mode — Material 3 Expressive Style */ +body { + font-family: "Roboto", "Segoe UI", sans-serif; + background-color: #121212; + color: #E3E3E3; + margin: 0; + padding: 0; + text-align: center; +} + +.container { + padding: 20px; + background-color: #1E1E1E; + border-radius: 24px; + margin: 12px; + box-shadow: 0 4px 16px rgba(0,0,0,0.4); + border: 1px solid rgba(255, 255, 255, 0.05); +} + +h1 { + font-size: 2em; + margin-bottom: 28px; + font-weight: 500; + color: #FFFFFF; +} + +.button-group { + display: flex; + flex-direction: column; + gap: 18px; +} + +button { + background-color: var(--md3-primary); + color: white; + border: none; + padding: 18px; + font-size: 1.3em; + border-radius: 30px; + cursor: pointer; + font-weight: 500; + box-shadow: 0 2px 6px rgba(0,0,0,0.3); + transition: background-color 0.25s ease, box-shadow 0.25s ease, transform 0.15s ease; +} + +button:active { + transform: scale(0.97); + background-color: var(--md3-primary-container); +} + +.status-container { + margin-top: 28px; + font-size: 1.2em; +} + +.status-text { + display: block; + margin-top: 10px; +} + +.status-text.green { + color: #4CAF50; + font-weight: 600; +} + +.status-text.red { + color: #FF6D60; + font-weight: 600; +} + +/* Material 3 Spinner */ +.spinner { + display: none; + width: 64px; + height: 64px; + margin: 24px auto 0; + animation: spinner-rotate 2s linear infinite; + transform-origin: 50% 50%; +} + +.spinner.visible { + display: block; +} + +.spinner .path { + stroke: var(--md3-primary); + stroke-linecap: round; + stroke-dasharray: 90, 150; + stroke-dashoffset: 0; + animation: spinner-dash 1.5s ease-in-out infinite; +} + +/* Rotation animation on the whole SVG */ +@keyframes spinner-rotate { + 100% { + transform: rotate(360deg); + } +} + +/* Stroke dash animation on the circle */ +@keyframes spinner-dash { + 0% { + stroke-dasharray: 1, 150; + stroke-dashoffset: 0; + } + 50% { + stroke-dasharray: 90, 150; + stroke-dashoffset: -35; + } + 100% { + stroke-dasharray: 90, 150; + stroke-dashoffset: -124; + } +}