From 3f370389aa220a3bbba208a578aa688f0ddd7100 Mon Sep 17 00:00:00 2001 From: spinline Date: Tue, 10 Feb 2026 00:12:08 +0300 Subject: [PATCH] fix: SSE auth by capturing store context before async block and redirect to setup when needed --- frontend/public/tailwind.css | 686 +++++++++++++++++++---------------- frontend/src/app.rs | 19 +- 2 files changed, 391 insertions(+), 314 deletions(-) diff --git a/frontend/public/tailwind.css b/frontend/public/tailwind.css index 623eb0d..8090226 100644 --- a/frontend/public/tailwind.css +++ b/frontend/public/tailwind.css @@ -8,26 +8,25 @@ --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; --color-black: #000; - --color-white: #fff; --spacing: 0.25rem; --container-xs: 20rem; --container-sm: 24rem; + --container-md: 28rem; --text-xs: 0.75rem; --text-xs--line-height: calc(1 / 0.75); --text-sm: 0.875rem; --text-sm--line-height: calc(1.25 / 0.875); --text-lg: 1.125rem; --text-lg--line-height: calc(1.75 / 1.125); + --text-2xl: 1.5rem; + --text-2xl--line-height: calc(2 / 1.5); --font-weight-normal: 400; --font-weight-medium: 500; - --font-weight-semibold: 600; --font-weight-bold: 700; --tracking-wider: 0.05em; --leading-tight: 1.25; - --radius-md: 0.375rem; --radius-lg: 0.5rem; --radius-2xl: 1rem; - --blur-sm: 8px; --default-transition-duration: 150ms; --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); --default-font-family: var(--font-sans); @@ -740,11 +739,67 @@ mask-image: url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E"); } } - .\!visible { - visibility: visible !important; + .pointer-events-none { + pointer-events: none; } - .visible { - visibility: visible; + .list { + @layer daisyui.l1.l2.l3 { + display: flex; + flex-direction: column; + font-size: 0.875rem; + .list-row { + --list-grid-cols: minmax(0, auto) 1fr; + position: relative; + display: grid; + grid-auto-flow: column; + gap: calc(0.25rem * 4); + border-radius: var(--radius-box); + padding: calc(0.25rem * 4); + word-break: break-word; + grid-template-columns: var(--list-grid-cols); + } + & > :not(:last-child) { + &.list-row, .list-row { + &:after { + content: ""; + border-bottom: var(--border) solid; + inset-inline: var(--radius-box); + position: absolute; + bottom: calc(0.25rem * 0); + border-color: var(--color-base-content); + @supports (color: color-mix(in lab, red, red)) { + border-color: color-mix(in oklab, var(--color-base-content) 5%, transparent); + } + } + } + } + } + @layer daisyui.l1.l2 { + .list-row { + &:has(.list-col-grow:nth-child(1)) { + --list-grid-cols: 1fr; + } + &:has(.list-col-grow:nth-child(2)) { + --list-grid-cols: minmax(0, auto) 1fr; + } + &:has(.list-col-grow:nth-child(3)) { + --list-grid-cols: minmax(0, auto) minmax(0, auto) 1fr; + } + &:has(.list-col-grow:nth-child(4)) { + --list-grid-cols: minmax(0, auto) minmax(0, auto) minmax(0, auto) 1fr; + } + &:has(.list-col-grow:nth-child(5)) { + --list-grid-cols: minmax(0, auto) minmax(0, auto) minmax(0, auto) minmax(0, auto) 1fr; + } + &:has(.list-col-grow:nth-child(6)) { + --list-grid-cols: minmax(0, auto) minmax(0, auto) minmax(0, auto) minmax(0, auto) + minmax(0, auto) 1fr; + } + > :not(.list-col-wrap) { + grid-row-start: 1; + } + } + } } .toast { @layer daisyui.l1.l2.l3 { @@ -767,141 +822,6 @@ } } } - .toggle { - @layer daisyui.l1.l2.l3 { - border: var(--border) solid currentColor; - color: var(--input-color); - position: relative; - display: inline-grid; - flex-shrink: 0; - cursor: pointer; - appearance: none; - place-content: center; - vertical-align: middle; - webkit-user-select: none; - user-select: none; - grid-template-columns: 0fr 1fr 1fr; - --radius-selector-max: calc( - var(--radius-selector) + var(--radius-selector) + var(--radius-selector) - ); - border-radius: calc( var(--radius-selector) + min(var(--toggle-p), var(--radius-selector-max)) + min(var(--border), var(--radius-selector-max)) ); - padding: var(--toggle-p); - box-shadow: 0 1px currentColor inset; - @supports (color: color-mix(in lab, red, red)) { - box-shadow: 0 1px color-mix(in oklab, currentColor calc(var(--depth) * 10%), #0000) inset; - } - transition: color 0.3s, grid-template-columns 0.2s; - --input-color: var(--color-base-content); - @supports (color: color-mix(in lab, red, red)) { - --input-color: color-mix(in oklab, var(--color-base-content) 50%, #0000); - } - --toggle-p: calc(var(--size) * 0.125); - --size: calc(var(--size-selector, 0.25rem) * 6); - width: calc((var(--size) * 2) - (var(--border) + var(--toggle-p)) * 2); - height: var(--size); - > * { - z-index: 1; - grid-column: span 1 / span 1; - grid-column-start: 2; - grid-row-start: 1; - height: 100%; - cursor: pointer; - appearance: none; - background-color: transparent; - padding: calc(0.25rem * 0.5); - transition: opacity 0.2s, rotate 0.4s; - border: none; - &:focus { - --tw-outline-style: none; - outline-style: none; - @media (forced-colors: active) { - outline: 2px solid transparent; - outline-offset: 2px; - } - } - &:nth-child(2) { - color: var(--color-base-100); - rotate: 0deg; - } - &:nth-child(3) { - color: var(--color-base-100); - opacity: 0%; - rotate: -15deg; - } - } - &:has(:checked) { - > :nth-child(2) { - opacity: 0%; - rotate: 15deg; - } - > :nth-child(3) { - opacity: 100%; - rotate: 0deg; - } - } - &:before { - position: relative; - inset-inline-start: calc(0.25rem * 0); - grid-column-start: 2; - grid-row-start: 1; - aspect-ratio: 1 / 1; - height: 100%; - border-radius: var(--radius-selector); - background-color: currentcolor; - translate: 0; - --tw-content: ""; - content: var(--tw-content); - transition: background-color 0.1s, translate 0.2s, inset-inline-start 0.2s; - box-shadow: 0 -1px oklch(0% 0 0 / calc(var(--depth) * 0.1)) inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * 0.1)) inset, 0 1px currentColor; - @supports (color: color-mix(in lab, red, red)) { - box-shadow: 0 -1px oklch(0% 0 0 / calc(var(--depth) * 0.1)) inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * 0.1)) inset, 0 1px color-mix(in oklab, currentColor calc(var(--depth) * 10%), #0000); - } - background-size: auto, calc(var(--noise) * 100%); - background-image: none, var(--fx-noise); - } - @media (forced-colors: active) { - &:before { - outline-style: var(--tw-outline-style); - outline-width: 1px; - outline-offset: calc(1px * -1); - } - } - @media print { - &:before { - outline: 0.25rem solid; - outline-offset: -1rem; - } - } - &:focus-visible, &:has(:focus-visible) { - outline: 2px solid currentColor; - outline-offset: 2px; - } - &:checked, &[aria-checked="true"], &:has(> input:checked) { - grid-template-columns: 1fr 1fr 0fr; - background-color: var(--color-base-100); - --input-color: var(--color-base-content); - &:before { - background-color: currentcolor; - } - @starting-style { - &:before { - opacity: 0; - } - } - } - &:indeterminate { - grid-template-columns: 0.5fr 1fr 0.5fr; - } - &:disabled { - cursor: not-allowed; - opacity: 30%; - &:before { - background-color: transparent; - border: var(--border) solid currentColor; - } - } - } - } .input { @layer daisyui.l1.l2.l3 { cursor: text; @@ -1090,6 +1010,23 @@ } } } + .avatar { + @layer daisyui.l1.l2.l3 { + position: relative; + display: inline-flex; + vertical-align: middle; + & > div { + display: block; + aspect-ratio: 1 / 1; + overflow: hidden; + } + img { + height: 100%; + width: 100%; + object-fit: cover; + } + } + } .checkbox { @layer daisyui.l1.l2.l3 { border: var(--border) solid var(--input-color, var(--color-base-content)); @@ -1318,9 +1255,6 @@ .static { position: static; } - .inset-0 { - inset: calc(var(--spacing) * 0); - } .toast-end { @layer daisyui.l1.l2 { inset-inline-start: auto; @@ -1328,6 +1262,44 @@ --toast-x: 0; } } + .dropdown-end { + @layer daisyui.l1.l2 { + --anchor-h: span-left; + :where(.dropdown-content) { + inset-inline-end: calc(0.25rem * 0); + translate: 0 0; + [dir="rtl"] & { + translate: 0 0; + } + } + &.dropdown-left { + --anchor-h: left; + --anchor-v: span-top; + .dropdown-content { + top: auto; + bottom: calc(0.25rem * 0); + } + } + &.dropdown-right { + --anchor-h: right; + --anchor-v: span-top; + .dropdown-content { + top: auto; + bottom: calc(0.25rem * 0); + } + } + } + } + .dropdown-top { + @layer daisyui.l1.l2 { + --anchor-v: top; + .dropdown-content { + top: auto; + bottom: 100%; + transform-origin: bottom; + } + } + } .toast-bottom { @layer daisyui.l1.l2 { top: auto; @@ -1335,18 +1307,18 @@ --toast-y: 0; } } - .top-full { - top: 100%; + .top-1\/2 { + top: calc(1/2 * 100%); } .right-0 { right: calc(var(--spacing) * 0); } + .right-2 { + right: calc(var(--spacing) * 2); + } .bottom-0 { bottom: calc(var(--spacing) * 0); } - .bottom-full { - bottom: 100%; - } .left-0 { left: calc(var(--spacing) * 0); } @@ -1367,18 +1339,12 @@ .z-10 { z-index: 10; } - .z-40 { - z-index: 40; - } .z-\[99\] { z-index: 99; } .z-\[100\] { z-index: 100; } - .z-\[200\] { - z-index: 200; - } .modal-box { @layer daisyui.l1.l2.l3 { grid-column-start: 1; @@ -1512,8 +1478,8 @@ } } } - .my-0 { - margin-block: calc(var(--spacing) * 0); + .my-0\.5 { + margin-block: calc(var(--spacing) * 0.5); } .label { @layer daisyui.l1.l2.l3 { @@ -1577,6 +1543,9 @@ .mt-2 { margin-top: calc(var(--spacing) * 2); } + .mt-6 { + margin-top: calc(var(--spacing) * 6); + } .mb-2 { margin-bottom: calc(var(--spacing) * 2); } @@ -1668,6 +1637,13 @@ } } } + .navbar-center { + @layer daisyui.l1.l2.l3 { + display: inline-flex; + align-items: center; + flex-shrink: 0; + } + } .alert { border-width: var(--border); border-color: var(--alert-border-color, var(--color-base-200)); @@ -1700,6 +1676,15 @@ } } } + .card-title { + @layer daisyui.l1.l2.l3 { + display: flex; + align-items: center; + gap: calc(0.25rem * 2); + font-size: var(--cardtitle-fs, 1.125rem); + font-weight: 600; + } + } .join { display: inline-flex; align-items: stretch; @@ -1783,9 +1768,6 @@ .inline-block { display: inline-block; } - .inline-flex { - display: inline-flex; - } .table { display: table; } @@ -1806,6 +1788,14 @@ } } } + .btn-circle { + @layer daisyui.l1.l2 { + border-radius: calc(infinity * 1px); + padding-inline: calc(0.25rem * 0); + width: var(--size); + height: var(--size); + } + } .btn-square { @layer daisyui.l1.l2 { padding-inline: calc(0.25rem * 0); @@ -1831,15 +1821,15 @@ .h-10 { height: calc(var(--spacing) * 10); } + .h-16 { + height: calc(var(--spacing) * 16); + } .h-auto { height: auto; } .h-full { height: 100%; } - .h-px { - height: 1px; - } .h-screen { height: 100vh; } @@ -1852,8 +1842,16 @@ .min-h-14 { min-height: calc(var(--spacing) * 14); } - .min-h-full { - min-height: 100%; + .min-h-\[100dvh\] { + min-height: 100dvh; + } + .min-h-screen { + min-height: 100vh; + } + .loading-lg { + @layer daisyui.l1.l2 { + width: calc(var(--size-selector, 0.25rem) * 7); + } } .w-4 { width: calc(var(--spacing) * 4); @@ -1864,9 +1862,21 @@ .w-6 { width: calc(var(--spacing) * 6); } + .w-8 { + width: calc(var(--spacing) * 8); + } + .w-10 { + width: calc(var(--spacing) * 10); + } + .w-16 { + width: calc(var(--spacing) * 16); + } .w-24 { width: calc(var(--spacing) * 24); } + .w-32 { + width: calc(var(--spacing) * 32); + } .w-40 { width: calc(var(--spacing) * 40); } @@ -1885,15 +1895,15 @@ .max-w-full { max-width: 100%; } + .max-w-md { + max-width: var(--container-md); + } .max-w-sm { max-width: var(--container-sm); } .max-w-xs { max-width: var(--container-xs); } - .min-w-0 { - min-width: calc(var(--spacing) * 0); - } .min-w-\[200px\] { min-width: 200px; } @@ -1903,20 +1913,45 @@ .shrink-0 { flex-shrink: 0; } + .-translate-y-1\/2 { + --tw-translate-y: calc(calc(1/2 * 100%) * -1); + translate: var(--tw-translate-x) var(--tw-translate-y); + } .transform { transform: var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,); } + .link { + @layer daisyui.l1.l2.l3 { + cursor: pointer; + text-decoration-line: underline; + &:focus { + --tw-outline-style: none; + outline-style: none; + @media (forced-colors: active) { + outline: 2px solid transparent; + outline-offset: 2px; + } + } + &:focus-visible { + outline: 2px solid currentColor; + outline-offset: 2px; + } + } + } .cursor-default { cursor: default; } .cursor-pointer { cursor: pointer; } + .list-none { + list-style-type: none; + } .grid-cols-1 { grid-template-columns: repeat(1, minmax(0, 1fr)); } - .grid-cols-3 { - grid-template-columns: repeat(3, minmax(0, 1fr)); + .grid-cols-4 { + grid-template-columns: repeat(4, minmax(0, 1fr)); } .flex-col { flex-direction: column; @@ -1927,9 +1962,6 @@ .items-center { align-items: center; } - .items-end { - align-items: flex-end; - } .items-start { align-items: flex-start; } @@ -1939,8 +1971,11 @@ .justify-center { justify-content: center; } - .justify-end { - justify-content: flex-end; + .justify-start { + justify-content: flex-start; + } + .gap-0\.5 { + gap: calc(var(--spacing) * 0.5); } .gap-1 { gap: calc(var(--spacing) * 1); @@ -1954,6 +1989,13 @@ .gap-4 { gap: calc(var(--spacing) * 4); } + .space-y-4 { + :where(& > :not(:last-child)) { + --tw-space-y-reverse: 0; + margin-block-start: calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse)); + margin-block-end: calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse))); + } + } .truncate { overflow: hidden; text-overflow: ellipsis; @@ -1968,18 +2010,20 @@ .overflow-y-auto { overflow-y: auto; } + .rounded-2xl { + border-radius: var(--radius-2xl); + } .rounded-box { border-radius: var(--radius-box); } .rounded-box { border-radius: var(--radius-box); } - .rounded-md { - border-radius: var(--radius-md); + .rounded-full { + border-radius: calc(infinity * 1px); } - .rounded-t-2xl { - border-top-left-radius: var(--radius-2xl); - border-top-right-radius: var(--radius-2xl); + .rounded-lg { + border-radius: var(--radius-lg); } .border { border-style: var(--tw-border-style); @@ -1997,14 +2041,6 @@ border-bottom-style: var(--tw-border-style); border-bottom-width: 1px; } - .border-l { - border-left-style: var(--tw-border-style); - border-left-width: 1px; - } - .border-l-0 { - border-left-style: var(--tw-border-style); - border-left-width: 0px; - } .badge-ghost { @layer daisyui.l1.l2 { border-color: var(--color-base-200); @@ -2039,18 +2075,6 @@ .border-base-300 { border-color: var(--color-base-300); } - .border-base-content\/20 { - border-color: var(--color-base-content); - @supports (color: color-mix(in lab, red, red)) { - border-color: color-mix(in oklab, var(--color-base-content) 20%, transparent); - } - } - .border-white\/5 { - border-color: color-mix(in srgb, #fff 5%, transparent); - @supports (color: color-mix(in lab, red, red)) { - border-color: color-mix(in oklab, var(--color-white) 5%, transparent); - } - } .bg-base-100 { background-color: var(--color-base-100); } @@ -2063,6 +2087,15 @@ .bg-base-200 { background-color: var(--color-base-200); } + .bg-base-200\/50 { + background-color: var(--color-base-200); + @supports (color: color-mix(in lab, red, red)) { + background-color: color-mix(in oklab, var(--color-base-200) 50%, transparent); + } + } + .bg-neutral { + background-color: var(--color-neutral); + } .bg-primary { background-color: var(--color-primary); } @@ -2080,9 +2113,18 @@ .stroke-current { stroke: currentcolor; } + .checkbox-sm { + @layer daisyui.l1.l2 { + padding: 0.1875rem; + --size: calc(var(--size-selector, 0.25rem) * 5); + } + } .p-0 { padding: calc(var(--spacing) * 0); } + .p-1 { + padding: calc(var(--spacing) * 1); + } .p-2 { padding: calc(var(--spacing) * 2); } @@ -2092,9 +2134,6 @@ .p-4 { padding: calc(var(--spacing) * 4); } - .p-6 { - padding: calc(var(--spacing) * 6); - } .menu-title { @layer daisyui.l1.l2.l3 { padding-inline: calc(0.25rem * 3); @@ -2168,6 +2207,10 @@ .font-mono { font-family: var(--font-mono); } + .text-2xl { + font-size: var(--text-2xl); + line-height: var(--tw-leading, var(--text-2xl--line-height)); + } .text-lg { font-size: var(--text-lg); line-height: var(--tw-leading, var(--text-lg--line-height)); @@ -2180,9 +2223,6 @@ font-size: var(--text-xs); line-height: var(--tw-leading, var(--text-xs--line-height)); } - .text-\[9px\] { - font-size: 9px; - } .text-\[10px\] { font-size: 10px; } @@ -2205,10 +2245,6 @@ --tw-font-weight: var(--font-weight-normal); font-weight: var(--font-weight-normal); } - .font-semibold { - --tw-font-weight: var(--font-weight-semibold); - font-weight: var(--font-weight-semibold); - } .tracking-wider { --tw-tracking: var(--tracking-wider); letter-spacing: var(--tracking-wider); @@ -2244,6 +2280,12 @@ --alert-color: var(--color-warning); } } + .checkbox-primary { + @layer daisyui.l1.l2 { + color: var(--color-primary-content); + --input-color: var(--color-primary); + } + } .progress-primary { @layer daisyui.l1.l2 { color: var(--color-primary); @@ -2254,9 +2296,6 @@ color: var(--color-success); } } - .text-base-content { - color: var(--color-base-content); - } .text-base-content\/50 { color: var(--color-base-content); @supports (color: color-mix(in lab, red, red)) { @@ -2278,9 +2317,15 @@ .text-error { color: var(--color-error); } + .text-neutral-content { + color: var(--color-neutral-content); + } .text-primary { color: var(--color-primary); } + .text-primary-content { + color: var(--color-primary-content); + } .text-success { color: var(--color-success); } @@ -2296,9 +2341,6 @@ .opacity-0 { opacity: 0%; } - .opacity-10 { - opacity: 10%; - } .opacity-50 { opacity: 50%; } @@ -2315,6 +2357,14 @@ --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1)); box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); } + .shadow-lg { + --tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / 0.1)); + box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); + } + .shadow-md { + --tw-shadow: 0 4px 6px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 2px 4px -2px var(--tw-shadow-color, rgb(0 0 0 / 0.1)); + box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); + } .shadow-sm { --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1)); box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); @@ -2323,10 +2373,24 @@ --tw-shadow: 0 20px 25px -5px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 8px 10px -6px var(--tw-shadow-color, rgb(0 0 0 / 0.1)); box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); } - .ring-0 { - --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor); + .ring { + --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor); box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); } + .ring-2 { + --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor); + box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); + } + .ring-primary { + --tw-ring-color: var(--color-primary); + } + .ring-offset-1 { + --tw-ring-offset-width: 1px; + --tw-ring-offset-shadow: var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + } + .ring-offset-base-100 { + --tw-ring-offset-color: var(--color-base-100); + } .btn-ghost { @layer daisyui.l1 { &:not(.btn-active, :hover, :active:focus, :focus-visible, input:checked:not(.filter .btn)) { @@ -2359,11 +2423,6 @@ -webkit-backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,); backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,); } - .backdrop-blur-sm { - --tw-backdrop-blur: blur(var(--blur-sm)); - -webkit-backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,); - backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,); - } .transition-all { transition-property: all; transition-timing-function: var(--tw-ease, var(--default-transition-timing-function)); @@ -2374,26 +2433,10 @@ transition-timing-function: var(--tw-ease, var(--default-transition-timing-function)); transition-duration: var(--tw-duration, var(--default-transition-duration)); } - .transition-transform { - transition-property: transform, translate, scale, rotate; - transition-timing-function: var(--tw-ease, var(--default-transition-timing-function)); - transition-duration: var(--tw-duration, var(--default-transition-duration)); - } - .transition-none { - transition-property: none; - } - .duration-0 { - --tw-duration: 0ms; - transition-duration: 0ms; - } .duration-100 { --tw-duration: 100ms; transition-duration: 100ms; } - .duration-200 { - --tw-duration: 200ms; - transition-duration: 200ms; - } .btn-sm { @layer daisyui.l1.l2 { --fontsize: 0.75rem; @@ -2438,10 +2481,17 @@ --btn-fg: var(--color-primary-content); } } + .outline-none { + --tw-outline-style: none; + outline-style: none; + } .select-none { -webkit-user-select: none; user-select: none; } + .ring-inset { + --tw-ring-inset: inset; + } .group-hover\:opacity-50 { &:is(:where(.group):hover *) { @media (hover: hover) { @@ -2449,13 +2499,6 @@ } } } - .hover\:bg-accent { - &:hover { - @media (hover: hover) { - background-color: var(--color-accent); - } - } - } .hover\:bg-base-300 { &:hover { @media (hover: hover) { @@ -2463,6 +2506,13 @@ } } } + .hover\:bg-error { + &:hover { + @media (hover: hover) { + background-color: var(--color-error); + } + } + } .hover\:bg-error\/10 { &:hover { @media (hover: hover) { @@ -2473,13 +2523,17 @@ } } } - .hover\:bg-primary\/90 { + .hover\:bg-primary { &:hover { @media (hover: hover) { background-color: var(--color-primary); - @supports (color: color-mix(in lab, red, red)) { - background-color: color-mix(in oklab, var(--color-primary) 90%, transparent); - } + } + } + } + .hover\:text-error-content { + &:hover { + @media (hover: hover) { + color: var(--color-error-content); } } } @@ -2490,63 +2544,37 @@ } } } + .hover\:text-primary-content { + &:hover { + @media (hover: hover) { + color: var(--color-primary-content); + } + } + } + .hover\:shadow-primary\/20 { + &:hover { + @media (hover: hover) { + --tw-shadow-color: var(--color-primary); + @supports (color: color-mix(in lab, red, red)) { + --tw-shadow-color: color-mix(in oklab, color-mix(in oklab, var(--color-primary) 20%, transparent) var(--tw-shadow-alpha), transparent); + } + } + } + } .focus\:outline-none { &:focus { --tw-outline-style: none; outline-style: none; } } - .focus-visible\:ring-2 { - &:focus-visible { - --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor); - box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); + .sm\:hidden { + @media (width >= 40rem) { + display: none; } } - .focus-visible\:ring-offset-2 { - &:focus-visible { - --tw-ring-offset-width: 2px; - --tw-ring-offset-shadow: var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); - } - } - .focus-visible\:outline-none { - &:focus-visible { - --tw-outline-style: none; - outline-style: none; - } - } - .active\:scale-\[0\.99\] { - &:active { - scale: 0.99; - } - } - .active\:bg-error { - &:active { - background-color: var(--color-error); - } - } - .active\:bg-primary { - &:active { - background-color: var(--color-primary); - } - } - .active\:text-error-content { - &:active { - color: var(--color-error-content); - } - } - .active\:text-primary-content { - &:active { - color: var(--color-primary-content); - } - } - .disabled\:pointer-events-none { - &:disabled { - pointer-events: none; - } - } - .disabled\:opacity-50 { - &:disabled { - opacity: 50%; + .sm\:inline { + @media (width >= 40rem) { + display: inline; } } .sm\:modal-middle { @@ -2568,29 +2596,38 @@ } } } - .sm\:p-4 { - @media (width >= 40rem) { - padding: calc(var(--spacing) * 4); - } - } .md\:block { @media (width >= 48rem) { display: block; } } + .md\:flex { + @media (width >= 48rem) { + display: flex; + } + } .md\:hidden { @media (width >= 48rem) { display: none; } } - .md\:items-center { + .md\:h-5 { @media (width >= 48rem) { - align-items: center; + height: calc(var(--spacing) * 5); } } - .md\:rounded-lg { + .md\:w-5 { @media (width >= 48rem) { - border-radius: var(--radius-lg); + width: calc(var(--spacing) * 5); + } + } + .md\:btn-md { + @media (width >= 48rem) { + @layer daisyui.l1.l2 { + --fontsize: 0.875rem; + --btn-p: 1rem; + --size: calc(var(--size-field, 0.25rem) * 10); + } } } .lg\:drawer-open { @@ -2649,6 +2686,11 @@ display: none; } } + .\[\&\:\:-webkit-details-marker\]\:hidden { + &::-webkit-details-marker { + display: none; + } + } } @layer base { html, body { @@ -3111,6 +3153,21 @@ translate: 0 -100%; } } +@property --tw-translate-x { + syntax: "*"; + inherits: false; + initial-value: 0; +} +@property --tw-translate-y { + syntax: "*"; + inherits: false; + initial-value: 0; +} +@property --tw-translate-z { + syntax: "*"; + inherits: false; + initial-value: 0; +} @property --tw-rotate-x { syntax: "*"; inherits: false; @@ -3131,6 +3188,11 @@ syntax: "*"; inherits: false; } +@property --tw-space-y-reverse { + syntax: "*"; + inherits: false; + initial-value: 0; +} @property --tw-border-style { syntax: "*"; inherits: false; @@ -3309,11 +3371,15 @@ @layer properties { @supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))) { *, ::before, ::after, ::backdrop { + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-translate-z: 0; --tw-rotate-x: initial; --tw-rotate-y: initial; --tw-rotate-z: initial; --tw-skew-x: initial; --tw-skew-y: initial; + --tw-space-y-reverse: 0; --tw-border-style: solid; --tw-leading: initial; --tw-font-weight: initial; diff --git a/frontend/src/app.rs b/frontend/src/app.rs index d9b9033..606e277 100644 --- a/frontend/src/app.rs +++ b/frontend/src/app.rs @@ -12,9 +12,11 @@ use leptos_router::hooks::use_navigate; #[component] pub fn App() -> impl IntoView { crate::store::provide_torrent_store(); + let store = use_context::(); let is_loading = signal(true); let is_authenticated = signal(false); + let needs_setup = signal(false); Effect::new(move |_| { spawn_local(async move { @@ -26,6 +28,7 @@ pub fn App() -> impl IntoView { Ok(status) => { if !status.completed { log::info!("Setup not completed"); + needs_setup.1.set(true); is_loading.1.set(false); return; } @@ -40,8 +43,8 @@ pub fn App() -> impl IntoView { log::info!("Authenticated!"); if let Ok(user_info) = api::auth::get_user().await { - if let Some(store) = use_context::() { - store.user.set(Some(user_info.username)); + if let Some(s) = store { + s.user.set(Some(user_info.username)); } } @@ -77,9 +80,13 @@ pub fn App() -> impl IntoView { "404 Not Found" }> impl IntoView {