@sensorario/sg-components 0.0.105 → 0.0.106
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/auth/index.d.ts +10 -0
- package/dist/components/AuthPage/AuthPage.d.ts +11 -0
- package/dist/components/AuthPage/AuthPage.stories.d.ts +8 -0
- package/dist/components/LoginPrompt/LoginPrompt.d.ts +13 -0
- package/dist/components/LoginPrompt/LoginPrompt.stories.d.ts +8 -0
- package/dist/components/RegisterForm/RegisterForm.d.ts +9 -0
- package/dist/components/VersionNumber/VersionNumber.d.ts +8 -0
- package/dist/components/VersionNumber/VersionNumber.stories.d.ts +5 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.es.js +221 -83
- package/dist/sg-components.css +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare const ACCESS_TOKEN_COOKIE = "simonegentili.com-access-token";
|
|
2
|
+
/** `domain` and `secure` only where the browser honors them: otherwise it drops the whole cookie (e.g. http://localhost). */
|
|
3
|
+
export declare const cookieScope: () => string;
|
|
4
|
+
export declare const writeCookie: (name: string, value: string, maxAgeSeconds: number, sameSite?: "strict" | "lax") => void;
|
|
5
|
+
/** The JWT shared by every .simonegentili.com app, or null when logged out. */
|
|
6
|
+
export declare const getAccessToken: (cookieName?: string) => string | null;
|
|
7
|
+
export declare const setAccessToken: (token: string, maxAgeSeconds?: number, cookieName?: string) => void;
|
|
8
|
+
export declare const clearAccessToken: (cookieName?: string) => void;
|
|
9
|
+
/** Reads one claim of the token payload without verifying it (the API does that). Default: the username. */
|
|
10
|
+
export declare const getTokenClaim: (token?: string | null, claim?: string) => string | null;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
import './AuthPage.css';
|
|
3
|
+
interface AuthPageProps {
|
|
4
|
+
title: ReactNode;
|
|
5
|
+
children?: ReactNode;
|
|
6
|
+
/** Links under the card, e.g. back to the home page (router-specific, so the app passes it). */
|
|
7
|
+
footer?: ReactNode;
|
|
8
|
+
className?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare const AuthPage: ({ title, children, footer, className }: AuthPageProps) => import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
export default AuthPage;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react-vite';
|
|
2
|
+
import { AuthPage } from './AuthPage';
|
|
3
|
+
declare const meta: Meta<typeof AuthPage>;
|
|
4
|
+
export default meta;
|
|
5
|
+
type Story = StoryObj<typeof AuthPage>;
|
|
6
|
+
export declare const Register: Story;
|
|
7
|
+
export declare const RegisterError: Story;
|
|
8
|
+
export declare const Registered: Story;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
import './LoginPrompt.css';
|
|
3
|
+
interface LoginPromptProps {
|
|
4
|
+
/** What logging in unlocks, e.g. "Accedi per vedere le sessioni." */
|
|
5
|
+
children?: ReactNode;
|
|
6
|
+
/** Shows a login button, e.g. `() => headerRef.current?.openLoginModal()`. */
|
|
7
|
+
onLogin?: () => void;
|
|
8
|
+
/** Extra content under the button, e.g. a link to the registration page. */
|
|
9
|
+
footer?: ReactNode;
|
|
10
|
+
className?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare const LoginPrompt: ({ children, onLogin, footer, className }: LoginPromptProps) => import("react/jsx-runtime").JSX.Element;
|
|
13
|
+
export default LoginPrompt;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react-vite';
|
|
2
|
+
import { LoginPrompt } from './LoginPrompt';
|
|
3
|
+
declare const meta: Meta<typeof LoginPrompt>;
|
|
4
|
+
export default meta;
|
|
5
|
+
type Story = StoryObj<typeof LoginPrompt>;
|
|
6
|
+
export declare const TextOnly: Story;
|
|
7
|
+
export declare const WithButton: Story;
|
|
8
|
+
export declare const WithRegisterLink: Story;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import './RegisterForm.css';
|
|
2
|
+
interface RegisterFormProps {
|
|
3
|
+
/** Calls the app's register endpoint; a thrown Error's message is shown to the user. */
|
|
4
|
+
onRegister: (email: string) => Promise<void>;
|
|
5
|
+
/** Called after a successful registration instead of showing the "check your email" message, e.g. to navigate. */
|
|
6
|
+
onRegistered?: (email: string) => void;
|
|
7
|
+
}
|
|
8
|
+
export declare const RegisterForm: ({ onRegister, onRegistered }: RegisterFormProps) => import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
export default RegisterForm;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import './VersionNumber.css';
|
|
2
|
+
interface VersionNumberProps {
|
|
3
|
+
/** Usually the app's own __APP_VERSION__, defined in its vite.config. */
|
|
4
|
+
version: string;
|
|
5
|
+
className?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare const VersionNumber: ({ version, className }: VersionNumberProps) => import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
export default VersionNumber;
|
package/dist/index.d.ts
CHANGED
|
@@ -31,3 +31,8 @@ export * from './components/Select/Select';
|
|
|
31
31
|
export * from './components/FormField/FormField';
|
|
32
32
|
export * from './components/Tabs/Tabs';
|
|
33
33
|
import './components/Table/Table.css';
|
|
34
|
+
export * from './components/VersionNumber/VersionNumber';
|
|
35
|
+
export * from './components/LoginPrompt/LoginPrompt';
|
|
36
|
+
export * from './components/AuthPage/AuthPage';
|
|
37
|
+
export * from './components/RegisterForm/RegisterForm';
|
|
38
|
+
export { ACCESS_TOKEN_COOKIE, getAccessToken, setAccessToken, clearAccessToken, getTokenClaim } from './auth';
|
package/dist/index.es.js
CHANGED
|
@@ -357,7 +357,19 @@ var w = ({ privacyPolicyHref: e = "https://simonegentili.com/privacy" }) => {
|
|
|
357
357
|
onNavigate: e,
|
|
358
358
|
title: "Simone Gentili - senior web developer, tech author and chess enthusiast",
|
|
359
359
|
homePageKey: "home"
|
|
360
|
-
}), k = {
|
|
360
|
+
}), k = "simonegentili.com-access-token", ee = (e) => document.cookie.split("; ").find((t) => t.startsWith(`${e}=`))?.slice(e.length + 1) || null, te = () => (window.location.hostname.endsWith("simonegentili.com") ? "; domain=.simonegentili.com" : "") + (window.location.protocol === "https:" ? "; secure" : ""), A = (e, t, n, r = "strict") => {
|
|
361
|
+
document.cookie = `${e}=${t}; path=/; max-age=${n}; samesite=${r}${te()}`;
|
|
362
|
+
}, j = (e = k) => ee(e), ne = (e, t = 168 * 3600, n = k) => A(n, e, t), re = (e = k) => {
|
|
363
|
+
A(e, "", 0), document.cookie = `${e}=; path=/; max-age=0`;
|
|
364
|
+
}, M = (e = j(), t = "sub") => {
|
|
365
|
+
if (!e) return null;
|
|
366
|
+
try {
|
|
367
|
+
let n = JSON.parse(atob(e.split(".")[1].replace(/-/g, "+").replace(/_/g, "/")));
|
|
368
|
+
return typeof n[t] == "string" ? n[t] : null;
|
|
369
|
+
} catch {
|
|
370
|
+
return null;
|
|
371
|
+
}
|
|
372
|
+
}, ie = {
|
|
361
373
|
auth: {
|
|
362
374
|
login: "Accedi",
|
|
363
375
|
logout: "Esci",
|
|
@@ -394,8 +406,18 @@ var w = ({ privacyPolicyHref: e = "https://simonegentili.com/privacy" }) => {
|
|
|
394
406
|
confirm: {
|
|
395
407
|
confirm: "Conferma",
|
|
396
408
|
cancel: "Annulla"
|
|
409
|
+
},
|
|
410
|
+
version: { label: "Versione" },
|
|
411
|
+
loginPrompt: { message: "Accedi per continuare." },
|
|
412
|
+
register: {
|
|
413
|
+
title: "Registrati",
|
|
414
|
+
email: "Email",
|
|
415
|
+
placeholder: "La tua email",
|
|
416
|
+
submit: "Registrati",
|
|
417
|
+
sending: "Invio…",
|
|
418
|
+
sent: "Controlla la tua email: ti abbiamo inviato un link per completare la registrazione."
|
|
397
419
|
}
|
|
398
|
-
},
|
|
420
|
+
}, ae = {
|
|
399
421
|
auth: {
|
|
400
422
|
login: "Log in",
|
|
401
423
|
logout: "Log out",
|
|
@@ -432,8 +454,18 @@ var w = ({ privacyPolicyHref: e = "https://simonegentili.com/privacy" }) => {
|
|
|
432
454
|
confirm: {
|
|
433
455
|
confirm: "Confirm",
|
|
434
456
|
cancel: "Cancel"
|
|
457
|
+
},
|
|
458
|
+
version: { label: "Version" },
|
|
459
|
+
loginPrompt: { message: "Log in to continue." },
|
|
460
|
+
register: {
|
|
461
|
+
title: "Sign up",
|
|
462
|
+
email: "Email",
|
|
463
|
+
placeholder: "Your email",
|
|
464
|
+
submit: "Sign up",
|
|
465
|
+
sending: "Sending…",
|
|
466
|
+
sent: "Check your email: we sent you a link to complete your registration."
|
|
435
467
|
}
|
|
436
|
-
},
|
|
468
|
+
}, oe = {
|
|
437
469
|
auth: {
|
|
438
470
|
login: "Se connecter",
|
|
439
471
|
logout: "Se déconnecter",
|
|
@@ -470,8 +502,18 @@ var w = ({ privacyPolicyHref: e = "https://simonegentili.com/privacy" }) => {
|
|
|
470
502
|
confirm: {
|
|
471
503
|
confirm: "Confirmer",
|
|
472
504
|
cancel: "Annuler"
|
|
505
|
+
},
|
|
506
|
+
version: { label: "Version" },
|
|
507
|
+
loginPrompt: { message: "Connectez-vous pour continuer." },
|
|
508
|
+
register: {
|
|
509
|
+
title: "S’inscrire",
|
|
510
|
+
email: "E-mail",
|
|
511
|
+
placeholder: "Votre e-mail",
|
|
512
|
+
submit: "S’inscrire",
|
|
513
|
+
sending: "Envoi…",
|
|
514
|
+
sent: "Consultez votre e-mail : nous vous avons envoyé un lien pour terminer l’inscription."
|
|
473
515
|
}
|
|
474
|
-
},
|
|
516
|
+
}, se = {
|
|
475
517
|
auth: {
|
|
476
518
|
login: "Anmelden",
|
|
477
519
|
logout: "Abmelden",
|
|
@@ -508,8 +550,18 @@ var w = ({ privacyPolicyHref: e = "https://simonegentili.com/privacy" }) => {
|
|
|
508
550
|
confirm: {
|
|
509
551
|
confirm: "Bestätigen",
|
|
510
552
|
cancel: "Abbrechen"
|
|
553
|
+
},
|
|
554
|
+
version: { label: "Version" },
|
|
555
|
+
loginPrompt: { message: "Melde dich an, um fortzufahren." },
|
|
556
|
+
register: {
|
|
557
|
+
title: "Registrieren",
|
|
558
|
+
email: "E-Mail",
|
|
559
|
+
placeholder: "Deine E-Mail",
|
|
560
|
+
submit: "Registrieren",
|
|
561
|
+
sending: "Wird gesendet…",
|
|
562
|
+
sent: "Prüfe deine E-Mails: Wir haben dir einen Link zum Abschließen der Registrierung geschickt."
|
|
511
563
|
}
|
|
512
|
-
},
|
|
564
|
+
}, ce = {
|
|
513
565
|
auth: {
|
|
514
566
|
login: "Iniciar sesión",
|
|
515
567
|
logout: "Cerrar sesión",
|
|
@@ -546,8 +598,18 @@ var w = ({ privacyPolicyHref: e = "https://simonegentili.com/privacy" }) => {
|
|
|
546
598
|
confirm: {
|
|
547
599
|
confirm: "Confirmar",
|
|
548
600
|
cancel: "Cancelar"
|
|
601
|
+
},
|
|
602
|
+
version: { label: "Versión" },
|
|
603
|
+
loginPrompt: { message: "Inicia sesión para continuar." },
|
|
604
|
+
register: {
|
|
605
|
+
title: "Registrarse",
|
|
606
|
+
email: "Correo electrónico",
|
|
607
|
+
placeholder: "Tu correo electrónico",
|
|
608
|
+
submit: "Registrarse",
|
|
609
|
+
sending: "Enviando…",
|
|
610
|
+
sent: "Revisa tu correo: te hemos enviado un enlace para completar el registro."
|
|
549
611
|
}
|
|
550
|
-
},
|
|
612
|
+
}, le = {
|
|
551
613
|
auth: {
|
|
552
614
|
login: "ログイン",
|
|
553
615
|
logout: "ログアウト",
|
|
@@ -584,57 +646,64 @@ var w = ({ privacyPolicyHref: e = "https://simonegentili.com/privacy" }) => {
|
|
|
584
646
|
confirm: {
|
|
585
647
|
confirm: "確認",
|
|
586
648
|
cancel: "キャンセル"
|
|
649
|
+
},
|
|
650
|
+
version: { label: "バージョン" },
|
|
651
|
+
loginPrompt: { message: "続行するにはログインしてください。" },
|
|
652
|
+
register: {
|
|
653
|
+
title: "新規登録",
|
|
654
|
+
email: "メールアドレス",
|
|
655
|
+
placeholder: "メールアドレス",
|
|
656
|
+
submit: "登録する",
|
|
657
|
+
sending: "送信中…",
|
|
658
|
+
sent: "メールを確認してください。登録を完了するためのリンクを送信しました。"
|
|
587
659
|
}
|
|
588
|
-
},
|
|
660
|
+
}, N = [
|
|
589
661
|
"it",
|
|
590
662
|
"en",
|
|
591
663
|
"fr",
|
|
592
664
|
"de",
|
|
593
665
|
"es",
|
|
594
666
|
"ja"
|
|
595
|
-
],
|
|
667
|
+
], P = {
|
|
596
668
|
it: "Italiano",
|
|
597
669
|
en: "English",
|
|
598
670
|
fr: "Français",
|
|
599
671
|
de: "Deutsch",
|
|
600
672
|
es: "Español",
|
|
601
673
|
ja: "日本語"
|
|
602
|
-
},
|
|
603
|
-
let e = document.cookie.split("; ").find((e) => e.startsWith(`${
|
|
604
|
-
return
|
|
605
|
-
},
|
|
606
|
-
|
|
607
|
-
document.cookie = `${N}=${e}; path=/; max-age=31536000; samesite=lax${t}`;
|
|
608
|
-
}, L = h.createInstance();
|
|
609
|
-
L.init({
|
|
674
|
+
}, F = "sg-language", I = "it", ue = (e) => !!e && N.includes(e), L = () => {
|
|
675
|
+
let e = document.cookie.split("; ").find((e) => e.startsWith(`${F}=`))?.slice(12);
|
|
676
|
+
return ue(e) ? e : null;
|
|
677
|
+
}, de = (e) => A(F, e, 31536e3, "lax"), R = h.createInstance();
|
|
678
|
+
R.init({
|
|
610
679
|
resources: {
|
|
611
|
-
it: { sg:
|
|
612
|
-
en: { sg:
|
|
613
|
-
fr: { sg:
|
|
614
|
-
de: { sg:
|
|
615
|
-
es: { sg:
|
|
616
|
-
ja: { sg:
|
|
680
|
+
it: { sg: ie },
|
|
681
|
+
en: { sg: ae },
|
|
682
|
+
fr: { sg: oe },
|
|
683
|
+
de: { sg: se },
|
|
684
|
+
es: { sg: ce },
|
|
685
|
+
ja: { sg: le }
|
|
617
686
|
},
|
|
618
|
-
lng:
|
|
619
|
-
fallbackLng:
|
|
620
|
-
supportedLngs: [...
|
|
687
|
+
lng: L() ?? I,
|
|
688
|
+
fallbackLng: I,
|
|
689
|
+
supportedLngs: [...N],
|
|
621
690
|
ns: ["sg", "translation"],
|
|
622
691
|
defaultNS: "translation",
|
|
623
692
|
initAsync: !1,
|
|
624
693
|
interpolation: { escapeValue: !1 }
|
|
625
|
-
}),
|
|
626
|
-
var
|
|
627
|
-
for (let [t, n] of Object.entries(e))
|
|
628
|
-
return p(
|
|
629
|
-
},
|
|
630
|
-
let t =
|
|
631
|
-
return e.filter((e) => t.startsWith(
|
|
632
|
-
},
|
|
633
|
-
let { t: n } = m("sg", { i18n:
|
|
694
|
+
}), R.on("languageChanged", de);
|
|
695
|
+
var fe = ({ resources: e }) => {
|
|
696
|
+
for (let [t, n] of Object.entries(e)) R.addResourceBundle(t, "translation", n, !0, !0);
|
|
697
|
+
return p(R), R;
|
|
698
|
+
}, z = "https://api.simonegentili.com/heimdall", B = (e) => e.endsWith("/") ? e : `${e}/`, pe = (e) => {
|
|
699
|
+
let t = B(window.location.origin + window.location.pathname);
|
|
700
|
+
return e.filter((e) => t.startsWith(B(e.url))).sort((e, t) => t.url.length - e.url.length)[0] ?? null;
|
|
701
|
+
}, V = ({ token: e, heimdallUrl: t = z }) => {
|
|
702
|
+
let { t: n } = m("sg", { i18n: R }), [r, i] = l(null), [o, s] = l(!1), [c, p] = l(!1);
|
|
634
703
|
a(() => {
|
|
635
704
|
e && fetch(`${t}/access`, { headers: { Authorization: `Bearer ${e}` } }).then((e) => e.ok ? e.json() : Promise.reject(e.status)).then((t) => i({
|
|
636
705
|
token: e,
|
|
637
|
-
app:
|
|
706
|
+
app: pe(t.apps)
|
|
638
707
|
})).catch(() => i({
|
|
639
708
|
token: e,
|
|
640
709
|
app: null
|
|
@@ -688,8 +757,8 @@ var ae = ({ resources: e }) => {
|
|
|
688
757
|
] })]
|
|
689
758
|
})
|
|
690
759
|
});
|
|
691
|
-
},
|
|
692
|
-
let { t: r } = m("sg", { i18n:
|
|
760
|
+
}, H = "https://api.simonegentili.com/heimdall/launcher", U = ({ appsUrl: e = H, label: t, token: n = null }) => {
|
|
761
|
+
let { t: r } = m("sg", { i18n: R }), i = t ?? r("launcher.label"), [o, s] = l(!1), [u, p] = l(null), h = u?.token === n ? u.apps : null, [g, v] = l(!1), y = c(null);
|
|
693
762
|
return a(() => {
|
|
694
763
|
!o || h !== null || fetch(e, n ? { headers: { Authorization: `Bearer ${n}` } } : void 0).then((e) => e.ok ? e.json() : Promise.reject(e.status)).then((e) => p({
|
|
695
764
|
token: n,
|
|
@@ -769,7 +838,7 @@ var ae = ({ resources: e }) => {
|
|
|
769
838
|
})
|
|
770
839
|
})]
|
|
771
840
|
});
|
|
772
|
-
},
|
|
841
|
+
}, W = ({ src: e, name: t, size: n = 32, className: r }) => {
|
|
773
842
|
let i = ["sg-avatar", r].filter(Boolean).join(" "), a = { "--avatar-size": `${n}px` };
|
|
774
843
|
return e ? /* @__PURE__ */ d("img", {
|
|
775
844
|
className: i,
|
|
@@ -783,8 +852,8 @@ var ae = ({ resources: e }) => {
|
|
|
783
852
|
"aria-label": t ?? void 0,
|
|
784
853
|
children: t?.trim().charAt(0).toUpperCase() || "?"
|
|
785
854
|
});
|
|
786
|
-
},
|
|
787
|
-
let { t: r } = m("sg", { i18n:
|
|
855
|
+
}, G = ({ isLoggedIn: e, handleLogin: t, handleLogout: n }) => {
|
|
856
|
+
let { t: r } = m("sg", { i18n: R });
|
|
788
857
|
return /* @__PURE__ */ d(u, { children: e ? /* @__PURE__ */ d("button", {
|
|
789
858
|
onClick: n,
|
|
790
859
|
className: "sg-authenticator-button",
|
|
@@ -794,14 +863,14 @@ var ae = ({ resources: e }) => {
|
|
|
794
863
|
className: "sg-authenticator-button",
|
|
795
864
|
children: r("auth.login")
|
|
796
865
|
}) });
|
|
797
|
-
},
|
|
798
|
-
let { t: h } = m("sg", { i18n:
|
|
866
|
+
}, me = 220, K = ({ open: t, onClose: n, title: r, icon: i, children: o, buttons: s, footer: c, closeLabel: u, className: p }) => {
|
|
867
|
+
let { t: h } = m("sg", { i18n: R }), [g, _] = l(!1), [y, b] = l({
|
|
799
868
|
x: 0,
|
|
800
869
|
y: 0
|
|
801
870
|
}), x = e.useRef(null), [S, C] = l(!1), w = (e) => {
|
|
802
871
|
g || (_(!0), setTimeout(() => {
|
|
803
872
|
_(!1), e();
|
|
804
|
-
},
|
|
873
|
+
}, me));
|
|
805
874
|
};
|
|
806
875
|
a(() => {
|
|
807
876
|
if (!t) return;
|
|
@@ -926,8 +995,8 @@ var ae = ({ resources: e }) => {
|
|
|
926
995
|
...i
|
|
927
996
|
})]
|
|
928
997
|
});
|
|
929
|
-
},
|
|
930
|
-
let { t: r } = m("sg", { i18n:
|
|
998
|
+
}, he = ({ open: e, onClose: t, onLogin: n }) => {
|
|
999
|
+
let { t: r } = m("sg", { i18n: R }), [i, a] = l(""), [o, s] = l("");
|
|
931
1000
|
return /* @__PURE__ */ d(K, {
|
|
932
1001
|
open: e,
|
|
933
1002
|
onClose: t,
|
|
@@ -956,19 +1025,10 @@ var ae = ({ resources: e }) => {
|
|
|
956
1025
|
]
|
|
957
1026
|
})
|
|
958
1027
|
});
|
|
959
|
-
},
|
|
960
|
-
let t = document.cookie.split("; ").find((t) => t.startsWith(`${e}=`));
|
|
961
|
-
return t ? t.slice(e.length + 1) : null;
|
|
962
|
-
}, ue = (e, t) => {
|
|
963
|
-
try {
|
|
964
|
-
return JSON.parse(atob(e.split(".")[1].replace(/-/g, "+").replace(/_/g, "/")))[t] ?? null;
|
|
965
|
-
} catch {
|
|
966
|
-
return null;
|
|
967
|
-
}
|
|
968
|
-
}, Z = r(({ title: e = "Quadrato", homePageKey: t = "home", onNavigate: n, cookieName: r = ce, username: i = null, usernameJwtField: o = "sub", onLogin: c, onLogout: p, onUserAuthenticated: m, appsUrl: h, heimdallUrl: g = R }, _) => {
|
|
1028
|
+
}, Y = "sg-avatar-change", X = (e) => j(e) !== null, Z = r(({ title: e = "Quadrato", homePageKey: t = "home", onNavigate: n, cookieName: r = k, username: i = null, usernameJwtField: o = "sub", onLogin: c, onLogout: p, onUserAuthenticated: m, appsUrl: h, heimdallUrl: g = z }, _) => {
|
|
969
1029
|
let [v, y] = l(() => X(r)), [b, x] = l(!1);
|
|
970
1030
|
s(_, () => ({ openLoginModal: () => x(!0) }));
|
|
971
|
-
let S = v ?
|
|
1031
|
+
let S = v ? j(r) : null, C = i ?? M(S, o), [w, T] = l(null), E = S && w?.token === S ? w.src : null;
|
|
972
1032
|
return a(() => {
|
|
973
1033
|
if (!S) return;
|
|
974
1034
|
let e = !1;
|
|
@@ -995,18 +1055,18 @@ var ae = ({ resources: e }) => {
|
|
|
995
1055
|
title: e,
|
|
996
1056
|
homePageKey: t,
|
|
997
1057
|
className: "quadrato-header",
|
|
998
|
-
children: [/* @__PURE__ */ d(
|
|
1058
|
+
children: [/* @__PURE__ */ d(U, {
|
|
999
1059
|
appsUrl: h,
|
|
1000
1060
|
token: S
|
|
1001
1061
|
}), /* @__PURE__ */ f("div", {
|
|
1002
1062
|
className: "quadrato-header-auth",
|
|
1003
1063
|
children: [
|
|
1004
|
-
v && E && /* @__PURE__ */ d(
|
|
1064
|
+
v && E && /* @__PURE__ */ d(W, { src: E }),
|
|
1005
1065
|
v && C && /* @__PURE__ */ d("span", {
|
|
1006
1066
|
className: "quadrato-header-username",
|
|
1007
1067
|
children: C
|
|
1008
1068
|
}),
|
|
1009
|
-
/* @__PURE__ */ d(
|
|
1069
|
+
/* @__PURE__ */ d(G, {
|
|
1010
1070
|
isLoggedIn: v,
|
|
1011
1071
|
handleLogin: () => x(!0),
|
|
1012
1072
|
handleLogout: () => {
|
|
@@ -1018,11 +1078,11 @@ var ae = ({ resources: e }) => {
|
|
|
1018
1078
|
]
|
|
1019
1079
|
})]
|
|
1020
1080
|
}),
|
|
1021
|
-
/* @__PURE__ */ d(
|
|
1081
|
+
/* @__PURE__ */ d(V, {
|
|
1022
1082
|
token: S,
|
|
1023
1083
|
heimdallUrl: g
|
|
1024
1084
|
}),
|
|
1025
|
-
/* @__PURE__ */ d(
|
|
1085
|
+
/* @__PURE__ */ d(he, {
|
|
1026
1086
|
open: b,
|
|
1027
1087
|
onClose: () => x(!1),
|
|
1028
1088
|
onLogin: async (e, t) => {
|
|
@@ -1036,8 +1096,8 @@ var ae = ({ resources: e }) => {
|
|
|
1036
1096
|
Z.displayName = "QuadratoHeader";
|
|
1037
1097
|
//#endregion
|
|
1038
1098
|
//#region src/components/SetPasswordModal/SetPasswordModal.tsx
|
|
1039
|
-
var
|
|
1040
|
-
let { t: r } = m("sg", { i18n:
|
|
1099
|
+
var ge = ({ open: e, onClose: t, onSubmit: n }) => {
|
|
1100
|
+
let { t: r } = m("sg", { i18n: R }), [i, a] = l(""), [o, s] = l(""), [c, u] = l("");
|
|
1041
1101
|
return /* @__PURE__ */ d(K, {
|
|
1042
1102
|
open: e,
|
|
1043
1103
|
onClose: t,
|
|
@@ -1079,7 +1139,7 @@ var de = ({ open: e, onClose: t, onSubmit: n }) => {
|
|
|
1079
1139
|
]
|
|
1080
1140
|
})
|
|
1081
1141
|
});
|
|
1082
|
-
},
|
|
1142
|
+
}, _e = ({ value: e, onChange: t, swatches: n }) => {
|
|
1083
1143
|
let [r, i] = l(!1), o = c(null);
|
|
1084
1144
|
return a(() => {
|
|
1085
1145
|
if (!r) return;
|
|
@@ -1128,7 +1188,7 @@ var de = ({ open: e, onClose: t, onSubmit: n }) => {
|
|
|
1128
1188
|
})]
|
|
1129
1189
|
})]
|
|
1130
1190
|
});
|
|
1131
|
-
}, Q = (e) => e.split(",")[0].replace(/'/g, ""),
|
|
1191
|
+
}, Q = (e) => e.split(",")[0].replace(/'/g, ""), ve = ({ value: e, onChange: t, options: n }) => {
|
|
1132
1192
|
let [r, i] = l(!1), o = c(null);
|
|
1133
1193
|
return a(() => {
|
|
1134
1194
|
if (!r) return;
|
|
@@ -1168,7 +1228,7 @@ var de = ({ open: e, onClose: t, onSubmit: n }) => {
|
|
|
1168
1228
|
}) }, n))
|
|
1169
1229
|
})]
|
|
1170
1230
|
});
|
|
1171
|
-
},
|
|
1231
|
+
}, ye = ({ checked: e, onChange: t, label: n, icons: r, layout: i = "inline" }) => /* @__PURE__ */ f("label", {
|
|
1172
1232
|
className: i === "row" ? "sg-toggle sg-toggle--row" : "sg-toggle",
|
|
1173
1233
|
children: [
|
|
1174
1234
|
/* @__PURE__ */ d("input", {
|
|
@@ -1190,19 +1250,19 @@ var de = ({ open: e, onClose: t, onSubmit: n }) => {
|
|
|
1190
1250
|
children: r
|
|
1191
1251
|
})
|
|
1192
1252
|
]
|
|
1193
|
-
}),
|
|
1194
|
-
let { t, i18n: n } = m("sg", { i18n:
|
|
1253
|
+
}), be = ({ className: e }) => {
|
|
1254
|
+
let { t, i18n: n } = m("sg", { i18n: R });
|
|
1195
1255
|
return /* @__PURE__ */ d("select", {
|
|
1196
1256
|
className: ["sg-language-switcher", e].filter(Boolean).join(" "),
|
|
1197
1257
|
value: n.resolvedLanguage,
|
|
1198
1258
|
onChange: (e) => n.changeLanguage(e.target.value),
|
|
1199
1259
|
"aria-label": t("languageSwitcher.label"),
|
|
1200
|
-
children:
|
|
1260
|
+
children: N.map((e) => /* @__PURE__ */ d("option", {
|
|
1201
1261
|
value: e,
|
|
1202
|
-
children:
|
|
1262
|
+
children: P[e]
|
|
1203
1263
|
}, e))
|
|
1204
1264
|
});
|
|
1205
|
-
},
|
|
1265
|
+
}, xe = ({ value: e, max: t = 100, label: n, ariaLabel: r, tone: i = "accent", size: a = "md", className: o }) => {
|
|
1206
1266
|
let s = t > 0 ? Math.min(100, Math.max(0, e / t * 100)) : 0;
|
|
1207
1267
|
return /* @__PURE__ */ f("div", {
|
|
1208
1268
|
className: [
|
|
@@ -1227,8 +1287,8 @@ var de = ({ open: e, onClose: t, onSubmit: n }) => {
|
|
|
1227
1287
|
children: n
|
|
1228
1288
|
})]
|
|
1229
1289
|
});
|
|
1230
|
-
},
|
|
1231
|
-
let { t: i } = m("sg", { i18n:
|
|
1290
|
+
}, $ = ({ kind: e = "info", boxed: t = !1, children: n, className: r }) => {
|
|
1291
|
+
let { t: i } = m("sg", { i18n: R });
|
|
1232
1292
|
return /* @__PURE__ */ f("p", {
|
|
1233
1293
|
className: [
|
|
1234
1294
|
"sg-status",
|
|
@@ -1242,7 +1302,7 @@ var de = ({ open: e, onClose: t, onSubmit: n }) => {
|
|
|
1242
1302
|
"aria-hidden": "true"
|
|
1243
1303
|
}), n ?? (e === "loading" ? i("status.loading") : null)]
|
|
1244
1304
|
});
|
|
1245
|
-
},
|
|
1305
|
+
}, Se = ({ header: e, actions: t, children: r, variant: i = "default", interactive: a = !1, as: o = "div", href: s, className: c }) => n(o, {
|
|
1246
1306
|
className: [
|
|
1247
1307
|
"sg-card",
|
|
1248
1308
|
`sg-card--${i}`,
|
|
@@ -1256,8 +1316,8 @@ var de = ({ open: e, onClose: t, onSubmit: n }) => {
|
|
|
1256
1316
|
}), r, t && /* @__PURE__ */ d("div", {
|
|
1257
1317
|
className: "sg-card-actions",
|
|
1258
1318
|
children: t
|
|
1259
|
-
})),
|
|
1260
|
-
let { t: s } = m("sg", { i18n:
|
|
1319
|
+
})), Ce = ({ children: e, tone: t = "neutral", onClick: n, selected: r = !1, onRemove: i, removeLabel: a, className: o }) => {
|
|
1320
|
+
let { t: s } = m("sg", { i18n: R });
|
|
1261
1321
|
return /* @__PURE__ */ f("span", {
|
|
1262
1322
|
className: [
|
|
1263
1323
|
"sg-badge",
|
|
@@ -1279,8 +1339,8 @@ var de = ({ open: e, onClose: t, onSubmit: n }) => {
|
|
|
1279
1339
|
children: "×"
|
|
1280
1340
|
})]
|
|
1281
1341
|
});
|
|
1282
|
-
},
|
|
1283
|
-
let { t: l } = m("sg", { i18n:
|
|
1342
|
+
}, we = ({ open: e, title: t, children: n, onConfirm: r, onCancel: i, confirmLabel: a, cancelLabel: o, danger: s = !1, icon: c }) => {
|
|
1343
|
+
let { t: l } = m("sg", { i18n: R });
|
|
1284
1344
|
return /* @__PURE__ */ d(K, {
|
|
1285
1345
|
open: e,
|
|
1286
1346
|
onClose: i,
|
|
@@ -1301,7 +1361,7 @@ var de = ({ open: e, onClose: t, onSubmit: n }) => {
|
|
|
1301
1361
|
children: n
|
|
1302
1362
|
})
|
|
1303
1363
|
});
|
|
1304
|
-
},
|
|
1364
|
+
}, Te = ({ invalid: e, className: t, rows: n = 3, ...r }) => /* @__PURE__ */ d("textarea", {
|
|
1305
1365
|
rows: n,
|
|
1306
1366
|
className: [
|
|
1307
1367
|
"input-field",
|
|
@@ -1310,7 +1370,7 @@ var de = ({ open: e, onClose: t, onSubmit: n }) => {
|
|
|
1310
1370
|
t
|
|
1311
1371
|
].filter(Boolean).join(" "),
|
|
1312
1372
|
...r
|
|
1313
|
-
}),
|
|
1373
|
+
}), Ee = ({ invalid: e, className: t, children: n, ...r }) => /* @__PURE__ */ d("select", {
|
|
1314
1374
|
className: [
|
|
1315
1375
|
"input-field",
|
|
1316
1376
|
"sg-select",
|
|
@@ -1319,7 +1379,7 @@ var de = ({ open: e, onClose: t, onSubmit: n }) => {
|
|
|
1319
1379
|
].filter(Boolean).join(" "),
|
|
1320
1380
|
...r,
|
|
1321
1381
|
children: n
|
|
1322
|
-
}),
|
|
1382
|
+
}), De = ({ label: e, children: n, hint: r, error: a, className: s }) => {
|
|
1323
1383
|
let c = o(), l = i(n) ? n : null, u = l?.props.id ?? c, p = `${u}-note`, m = a ?? r;
|
|
1324
1384
|
return /* @__PURE__ */ f("div", {
|
|
1325
1385
|
className: ["sg-field", s].filter(Boolean).join(" "),
|
|
@@ -1342,7 +1402,7 @@ var de = ({ open: e, onClose: t, onSubmit: n }) => {
|
|
|
1342
1402
|
})
|
|
1343
1403
|
]
|
|
1344
1404
|
});
|
|
1345
|
-
},
|
|
1405
|
+
}, Oe = ({ items: e, value: t, onChange: n, variant: r = "underline", ariaLabel: i, className: a }) => {
|
|
1346
1406
|
let o = c(null);
|
|
1347
1407
|
return /* @__PURE__ */ d("div", {
|
|
1348
1408
|
ref: o,
|
|
@@ -1372,6 +1432,84 @@ var de = ({ open: e, onClose: t, onSubmit: n }) => {
|
|
|
1372
1432
|
}, e.value);
|
|
1373
1433
|
})
|
|
1374
1434
|
});
|
|
1435
|
+
}, ke = ({ version: e, className: t }) => {
|
|
1436
|
+
let { t: n } = m("sg", { i18n: R });
|
|
1437
|
+
return /* @__PURE__ */ f("p", {
|
|
1438
|
+
className: ["sg-version", t].filter(Boolean).join(" "),
|
|
1439
|
+
children: [
|
|
1440
|
+
n("version.label"),
|
|
1441
|
+
" v",
|
|
1442
|
+
e
|
|
1443
|
+
]
|
|
1444
|
+
});
|
|
1445
|
+
}, Ae = ({ children: e, onLogin: t, footer: n, className: r }) => {
|
|
1446
|
+
let { t: i } = m("sg", { i18n: R });
|
|
1447
|
+
return /* @__PURE__ */ f("div", {
|
|
1448
|
+
className: ["sg-login-prompt", r].filter(Boolean).join(" "),
|
|
1449
|
+
children: [
|
|
1450
|
+
/* @__PURE__ */ d("p", {
|
|
1451
|
+
className: "sg-login-prompt-message",
|
|
1452
|
+
children: e ?? i("loginPrompt.message")
|
|
1453
|
+
}),
|
|
1454
|
+
t && /* @__PURE__ */ d(v, {
|
|
1455
|
+
label: i("auth.login"),
|
|
1456
|
+
onClick: t
|
|
1457
|
+
}),
|
|
1458
|
+
n && /* @__PURE__ */ d("div", {
|
|
1459
|
+
className: "sg-login-prompt-footer",
|
|
1460
|
+
children: n
|
|
1461
|
+
})
|
|
1462
|
+
]
|
|
1463
|
+
});
|
|
1464
|
+
}, je = ({ title: e, children: t, footer: n, className: r }) => /* @__PURE__ */ f("div", {
|
|
1465
|
+
className: ["sg-auth-page", r].filter(Boolean).join(" "),
|
|
1466
|
+
children: [/* @__PURE__ */ f("div", {
|
|
1467
|
+
className: "sg-auth-page-card",
|
|
1468
|
+
children: [/* @__PURE__ */ d("h1", {
|
|
1469
|
+
className: "sg-auth-page-title",
|
|
1470
|
+
children: e
|
|
1471
|
+
}), t]
|
|
1472
|
+
}), n && /* @__PURE__ */ d("div", {
|
|
1473
|
+
className: "sg-auth-page-footer",
|
|
1474
|
+
children: n
|
|
1475
|
+
})]
|
|
1476
|
+
}), Me = ({ onRegister: e, onRegistered: t }) => {
|
|
1477
|
+
let { t: n } = m("sg", { i18n: R }), [r, i] = l(""), [a, o] = l(!1), [s, c] = l(!1), [u, p] = l(null);
|
|
1478
|
+
return s ? /* @__PURE__ */ d($, {
|
|
1479
|
+
boxed: !0,
|
|
1480
|
+
children: n("register.sent")
|
|
1481
|
+
}) : /* @__PURE__ */ f("form", {
|
|
1482
|
+
className: "sg-register-form",
|
|
1483
|
+
onSubmit: async (n) => {
|
|
1484
|
+
n.preventDefault();
|
|
1485
|
+
let i = r.trim();
|
|
1486
|
+
o(!0), p(null);
|
|
1487
|
+
try {
|
|
1488
|
+
await e(i), t ? t(i) : c(!0);
|
|
1489
|
+
} catch (e) {
|
|
1490
|
+
p(e instanceof Error ? e.message : String(e));
|
|
1491
|
+
} finally {
|
|
1492
|
+
o(!1);
|
|
1493
|
+
}
|
|
1494
|
+
},
|
|
1495
|
+
children: [/* @__PURE__ */ d(De, {
|
|
1496
|
+
label: n("register.email"),
|
|
1497
|
+
error: u ?? void 0,
|
|
1498
|
+
children: /* @__PURE__ */ d("input", {
|
|
1499
|
+
className: "input-field",
|
|
1500
|
+
type: "email",
|
|
1501
|
+
autoComplete: "email",
|
|
1502
|
+
placeholder: n("register.placeholder"),
|
|
1503
|
+
value: r,
|
|
1504
|
+
onChange: (e) => i(e.target.value),
|
|
1505
|
+
required: !0
|
|
1506
|
+
})
|
|
1507
|
+
}), /* @__PURE__ */ d(v, {
|
|
1508
|
+
type: "submit",
|
|
1509
|
+
label: n(a ? "register.sending" : "register.submit"),
|
|
1510
|
+
disabled: a || r.trim() === ""
|
|
1511
|
+
})]
|
|
1512
|
+
});
|
|
1375
1513
|
};
|
|
1376
1514
|
//#endregion
|
|
1377
|
-
export { Y as AVATAR_CHANGE_EVENT,
|
|
1515
|
+
export { k as ACCESS_TOKEN_COOKIE, Y as AVATAR_CHANGE_EVENT, V as AppAccessGate, U as AppLauncher, je as AuthPage, G as Authenticator, W as Avatar, Ce as Badge, v as Button, Se as Card, _e as ColorPicker, we as ConfirmModal, w as CookieConsent, H as DEFAULT_APPS_URL, z as DEFAULT_HEIMDALL_URL, ve as FontPicker, y as Footer, De as FormField, D as Header, _ as Icon, q as Input, F as LANGUAGE_COOKIE, P as LANGUAGE_NAMES, be as LanguageSwitcher, Ae as LoginPrompt, K as Modal, J as PasswordInput, xe as ProgressBar, Z as QuadratoHeader, Me as RegisterForm, E as SGFooter, O as SGHeader, N as SUPPORTED_LANGUAGES, Ee as Select, ge as SetPasswordModal, $ as StatusMessage, Oe as Tabs, Te as Textarea, ye as Toggle, ke as VersionNumber, re as clearAccessToken, fe as createI18n, j as getAccessToken, M as getTokenClaim, L as readLanguageCookie, ne as setAccessToken, R as sgI18n };
|
package/dist/sg-components.css
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
.custom-button{border-radius:var(--button-radius);background:var(--button-bg);color:var(--button-color);cursor:pointer;font-size:var(--primary-font);font-weight:600;font-family:var(--font-family);box-shadow:var(--button-shadow);transition:background .15s var(--button-ease-standard), transform var(--button-ease-bounce) .2s;border:none;padding:8px 20px}.custom-button:hover:not(:disabled){background:var(--button-bg-hover);transform:translateY(-1px)}.custom-button:active:not(:disabled){transform:scale(.97)}.custom-button:disabled{opacity:.6;cursor:default}.custom-button--secondary{--button-bg:var(--sg-surface);--button-bg-hover:var(--sg-surface-hover);--button-color:var(--sg-text);--button-shadow:none;border:1px solid var(--sg-border)}.custom-button--danger{--button-bg:var(--sg-danger);--button-bg-hover:var(--sg-danger);--button-color:var(--sg-on-accent)}.custom-button--danger:hover:not(:disabled){filter:brightness(.92)}.custom-button-with-icon{align-items:center;gap:8px;display:inline-flex}.custom-button-label-visually-hidden{clip:rect(0, 0, 0, 0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.sg-icon{vertical-align:middle;flex-shrink:0;display:inline-block}.footer{background-color:var(--primary-bg);border-top:1px solid var(--primary-border);font-family:var(--font-family);color:var(--sg-text-secondary);justify-content:space-between;align-items:center;width:100%;padding:16px 32px;font-size:14px;display:flex;position:fixed;bottom:0;left:0}.footer a{color:var(--sg-link);text-decoration:none}.footer a:hover{text-decoration:underline}.cookie-consent{background-color:var(--primary-bg);border-top:1px solid var(--primary-border);font-family:var(--font-family);color:var(--sg-text-secondary);z-index:1000;box-sizing:border-box;flex-wrap:wrap;justify-content:center;align-items:center;gap:16px;width:100%;padding:16px 32px;font-size:14px;display:flex;position:fixed;bottom:0;left:0}.cookie-consent-text{flex:320px;margin:0}.cookie-consent a{color:var(--sg-link);text-decoration:none}.cookie-consent a:hover{text-decoration:underline}.cookie-consent-accept{flex:none}.logo-text{font-size:var(--font-size-h1);font-family:var(--font-family);margin:0;font-weight:400}.header{background-color:var(--sg-surface);width:100%;color:var(--sg-text);border-bottom:1px solid var(--sg-border-subtle);box-shadow:var(--sg-shadow-1);z-index:100;font-size:var(--font-size);position:sticky;top:0}.header-container{justify-content:flex-start;align-items:center;max-width:1200px;margin:0 auto;padding:16px;display:flex}.header-actions{align-items:center;gap:12px;margin-left:auto;display:flex}.logo{cursor:pointer;color:var(--sg-text);font-size:24px;font-weight:700;transition:color .2s}.logo:hover{color:var(--accent)}.logo-full{display:inline}.logo-short{display:none}@media (width<=768px){.header-container{padding:12px 16px}.logo{font-size:var(--font-size)}.logo-full{display:none}.logo-short{display:inline}}@media (width<=480px){.header-container{padding:8px 12px}.logo{font-size:var(--font-size)}}.sg-access-gate{z-index:998;box-sizing:border-box;background:var(--primary-bg);font-family:var(--font-family);justify-content:center;align-items:center;padding:16px;display:flex;position:fixed;inset:0}.sg-access-gate-card{border:1px solid var(--primary-border);border-radius:calc(var(--radius) * 3);background:var(--modal-bg);max-width:420px;box-shadow:var(--shadow-2);color:var(--sg-text);text-align:center;padding:24px}.sg-access-gate-card h2{font-size:var(--font-size-h1);color:var(--modal-title-color);margin:0 0 12px}.sg-access-gate-card p{color:var(--ink-muted);margin:0 0 16px}.sg-access-gate-card .sg-access-gate-error{color:var(--sg-danger)}.sg-app-launcher{font-family:var(--font-family);position:relative}.sg-app-launcher-toggle{width:40px;height:40px;color:var(--ink-muted);cursor:pointer;background:0 0;border:none;border-radius:50%;justify-content:center;align-items:center;padding:0;display:inline-flex}.sg-app-launcher-toggle:hover,.sg-app-launcher-toggle[aria-expanded=true]{background:var(--primary-hover-bg)}.sg-app-launcher-panel{z-index:1000;box-sizing:border-box;border:1px solid var(--primary-border);border-radius:calc(var(--radius) * 3);background:var(--modal-bg);width:320px;max-width:calc(100vw - 24px);max-height:70vh;color:var(--sg-text);box-shadow:var(--shadow-2);padding:12px;position:absolute;top:calc(100% + 8px);right:0;overflow-y:auto}.sg-app-launcher-grid{grid-template-columns:repeat(3,minmax(0,1fr));gap:4px;margin:0;padding:0;list-style:none;display:grid}.sg-app-launcher-app{border-radius:var(--radius);color:inherit;flex-direction:column;align-items:center;gap:6px;padding:12px 4px;text-decoration:none;display:flex}.sg-app-launcher-app:hover,.sg-app-launcher-app:focus-visible{background:var(--primary-hover-bg)}.sg-app-launcher-app.current{background:var(--accent-soft)}.sg-app-launcher-tile{border-radius:var(--radius);background:var(--accent);width:40px;height:40px;color:var(--sg-on-accent);justify-content:center;align-items:center;font-size:18px;font-weight:600;display:flex}.sg-app-launcher-name{text-overflow:ellipsis;white-space:nowrap;max-width:100%;font-size:13px;overflow:hidden}.sg-app-launcher-message{color:var(--ink-muted);margin:0;padding:8px;font-size:13px}.sg-app-launcher-tile{position:relative}.sg-app-launcher-app.locked .sg-app-launcher-tile{background:var(--ink-muted)}.sg-app-launcher-app.locked .sg-app-launcher-name{color:var(--ink-muted)}.sg-app-launcher-lock{border:2px solid var(--modal-bg);background:var(--modal-title-color);width:20px;height:20px;color:var(--modal-bg);border-radius:50%;justify-content:center;align-items:center;display:flex;position:absolute;bottom:-6px;right:-6px}.sg-visually-hidden{clip:rect(0 0 0 0);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}.sg-avatar{--avatar-size:32px;--avatar-bg:var(--sg-accent);--avatar-color:var(--sg-on-accent);box-sizing:border-box;width:var(--avatar-size);height:var(--avatar-size);object-fit:cover;background:var(--avatar-bg);color:var(--avatar-color);box-shadow:var(--sg-shadow-1);font-family:var(--font-family);font-size:calc(var(--avatar-size) * .42);-webkit-user-select:none;user-select:none;border-radius:50%;flex:none;justify-content:center;align-items:center;font-weight:600;display:inline-flex}.sg-authenticator-button{font-size:.9rem;font-family:var(--font-family);border:1px solid var(--primary-border);border-radius:var(--radius);background:var(--primary-bg);color:var(--sg-text);cursor:pointer;padding:.4rem 1rem;transition:background .15s,border-color .15s}.sg-authenticator-button:hover{background:var(--primary-hover-bg);border-color:var(--ink-muted)}.modal-overlay{background:var(--modal-overlay);z-index:1000;justify-content:center;align-items:center;width:100vw;height:100vh;animation:.25s ease-out sg-modal-overlay-fade-in;display:flex;position:fixed;top:0;left:0}.modal-overlay.modal-overlay-closing{animation:.22s ease-in forwards sg-modal-overlay-fade-out}.modal-content{--drag-x:0px;--drag-y:0px;background:var(--modal-bg);border-radius:var(--primary-radius);font-size:var(--primary-font);min-width:320px;max-width:calc(100vw - 40px);max-height:90vh;color:var(--sg-text);box-shadow:var(--sg-shadow-3);transform:translate(var(--drag-x), var(--drag-y));flex-direction:column;animation:.3s ease-out sg-modal-slide-in;display:flex;overflow:hidden}.modal-content.modal-content-closing{animation:.22s ease-in forwards sg-modal-slide-out}@keyframes sg-modal-overlay-fade-in{0%{opacity:0}to{opacity:1}}@keyframes sg-modal-overlay-fade-out{0%{opacity:1}to{opacity:0}}@keyframes sg-modal-slide-in{0%{transform:translate(var(--drag-x), calc(var(--drag-y) - 24px)) scale(.97);opacity:0}to{transform:translate(var(--drag-x), var(--drag-y)) scale(1);opacity:1}}@keyframes sg-modal-slide-out{0%{transform:translate(var(--drag-x), var(--drag-y)) scale(1);opacity:1}to{transform:translate(var(--drag-x), calc(var(--drag-y) - 24px)) scale(.97);opacity:0}}.modal-header{background:var(--primary-bg);border-top-left-radius:var(--primary-radius);border-top-right-radius:var(--primary-radius);cursor:grab;touch-action:none;flex:none;align-items:center;gap:8px;padding:16px;display:flex}.modal-header-dragging{cursor:grabbing;-webkit-user-select:none;user-select:none}.modal-icon{color:var(--modal-title-color);display:inline-flex}.modal-title{color:var(--modal-title-color);font-family:var(--font-family);font-size:var(--primary-font);flex:1;margin:0}.modal-close{cursor:pointer;color:var(--modal-title-color);background:0 0;border:none;padding:4px 8px;font-size:20px;line-height:1}.modal-close:disabled{cursor:default;opacity:.6}.modal-children{font-family:var(--font-family);padding:16px;overflow-y:auto}.modal-footer{border-top:1px solid var(--primary-border);flex-wrap:wrap;flex:none;justify-content:flex-end;gap:8px;padding:12px 16px;display:flex}.input-label{font-weight:500;font-size:var(--primary-font);margin-bottom:4px;display:block}.login-modal-form{font-family:var(--font-family);font-size:var(--primary-font);flex-direction:column;gap:16px;display:flex}.header.quadrato-header{z-index:999}.quadrato-header-auth{align-items:center;gap:12px;display:flex}.quadrato-header-username{font-size:var(--font-size);color:var(--sg-text);transition:color .2s}.quadrato-header-username:hover{color:var(--accent)}form{font-family:var(--font-family)}.set-password-modal-form{font-family:var(--font-family);font-size:var(--primary-font);flex-direction:column;gap:16px;display:flex}.set-password-modal-error{color:var(--sg-danger);font-size:var(--primary-font);margin:0}.sg-color-picker{font-family:var(--font-family);position:relative}.sg-color-picker-toggle{border-radius:var(--input-radius);border:1px solid var(--input-border);background:var(--input-bg);width:100%;color:inherit;cursor:pointer;justify-content:space-between;align-items:center;gap:8px;padding:6px 8px;font-family:inherit;font-size:13px;display:flex}.sg-color-picker-toggle-label{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.sg-color-picker-swatch{border:1px solid var(--sg-border-subtle);border-radius:4px;flex:none;width:18px;height:18px}.sg-color-picker-popover{z-index:30;background:var(--input-bg);border:1px solid var(--input-border);border-radius:var(--input-radius);box-shadow:var(--shadow-1);width:170px;padding:10px;position:absolute;top:calc(100% + 4px);left:0}.sg-color-picker-grid{grid-template-columns:repeat(6,1fr);gap:6px;display:grid}.sg-color-picker-swatch-button{border:1px solid var(--sg-border-subtle);cursor:pointer;border-radius:4px;width:20px;height:20px;padding:0}.sg-color-picker-swatch-button.active{border:2px solid var(--accent)}.sg-color-picker-custom{border-top:1px solid var(--input-border);color:var(--ink-muted);cursor:pointer;justify-content:space-between;align-items:center;gap:8px;margin-top:8px;padding-top:8px;font-size:11px;display:flex}.sg-color-picker-custom input[type=color]{cursor:pointer;border:none;width:26px;height:20px;padding:0}.sg-font-picker{font-family:var(--font-family);position:relative}.sg-font-picker-toggle{border-radius:var(--input-radius);border:1px solid var(--input-border);background:var(--input-bg);width:100%;color:inherit;cursor:pointer;justify-content:space-between;align-items:center;gap:8px;padding:6px 8px;font-size:13px;display:flex}.sg-font-picker-toggle-label{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.sg-font-picker-toggle-caret{opacity:.5;flex:none;font-size:10px}.sg-font-picker-list{background:var(--input-bg);border:1px solid var(--input-border);border-radius:var(--input-radius);max-height:260px;box-shadow:var(--shadow-1);z-index:30;margin:0;padding:4px 0;list-style:none;position:absolute;top:calc(100% + 4px);left:0;right:0;overflow-y:auto}.sg-font-picker-option{text-align:left;width:100%;color:inherit;cursor:pointer;background:0 0;border:none;padding:8px 10px;font-size:15px;display:block}.sg-font-picker-option.active{background:var(--accent-soft)}.sg-toggle{cursor:pointer;-webkit-user-select:none;user-select:none;font-family:var(--font-family);align-items:center;gap:6px;display:flex}.sg-toggle-input{opacity:0;width:1px;height:1px;position:absolute}.sg-toggle-track{background:var(--input-border);border-radius:999px;flex:none;width:34px;height:20px;transition:background .15s cubic-bezier(.4,0,.2,1);position:relative}.sg-toggle-input:checked+.sg-toggle-track{background:var(--accent)}.sg-toggle-thumb{background:var(--input-bg);width:16px;height:16px;box-shadow:var(--shadow-1);border-radius:50%;transition:left .15s cubic-bezier(.4,0,.2,1);position:absolute;top:2px;left:2px}.sg-toggle-input:checked+.sg-toggle-track .sg-toggle-thumb{left:16px}.sg-toggle-input:focus-visible+.sg-toggle-track{outline:2px solid var(--accent-strong);outline-offset:2px}.sg-toggle-label{color:var(--ink-muted);white-space:nowrap;font-size:13px}.sg-toggle-icons{align-items:center;gap:4px;display:inline-flex}.sg-toggle--row{gap:12px;width:100%;margin:8px 0}.sg-toggle--row .sg-toggle-label{color:var(--sg-text);font-size:var(--primary-font);white-space:normal;flex:1;order:-2}.sg-toggle--row .sg-toggle-icons{order:-1}.sg-language-switcher{border:1px solid var(--input-border);border-radius:var(--input-radius);background:var(--input-bg);color:var(--sg-text);font-family:var(--font-family);font-size:var(--primary-font);cursor:pointer;padding:4px 8px}.sg-progress{--progress-height:8px;--progress-track:var(--sg-surface-hover);--progress-fill:var(--sg-accent);font-family:var(--font-family);align-items:center;gap:12px;display:flex}.sg-progress--sm{--progress-height:6px}.sg-progress--success{--progress-fill:var(--sg-success)}.sg-progress--danger{--progress-fill:var(--sg-danger)}.sg-progress-track{height:var(--progress-height);background:var(--progress-track);border-radius:999px;flex:1;overflow:hidden}.sg-progress-fill{background:var(--progress-fill);height:100%;transition:width .2s var(--button-ease-standard);border-radius:999px}.sg-progress-label{color:var(--sg-text-muted);white-space:nowrap;font-size:12px}.sg-status{--status-color:var(--sg-text-muted);--status-bg:var(--sg-surface-muted);color:var(--status-color);font-family:var(--font-family);font-size:var(--primary-font);align-items:center;gap:8px;margin:0;display:flex}.sg-status--error{--status-color:var(--sg-danger);--status-bg:var(--sg-danger-soft)}.sg-status--boxed{border-radius:var(--radius);background:var(--status-bg);padding:8px 12px}.sg-status-spinner{border:2px solid var(--sg-border);border-top-color:var(--sg-accent);border-radius:50%;flex:none;width:14px;height:14px;animation:.8s linear infinite sg-status-spin}@keyframes sg-status-spin{to{transform:rotate(360deg)}}@media (prefers-reduced-motion:reduce){.sg-status-spinner{animation-duration:2.4s}}.sg-card{--card-bg:var(--sg-surface);--card-border:var(--sg-border-subtle);--card-radius:calc(var(--radius) * 2);--card-shadow:var(--sg-shadow-1);--card-shadow-hover:var(--sg-shadow-2);--card-padding:16px;box-sizing:border-box;padding:var(--card-padding);border:1px solid var(--card-border);border-radius:var(--card-radius);background:var(--card-bg);box-shadow:var(--card-shadow);color:var(--sg-text);font-family:var(--font-family);text-align:left;text-decoration:none;display:block}.sg-card--mini{--card-padding:8px 12px}.sg-card--interactive{cursor:pointer;transition:box-shadow .18s var(--button-ease-standard), transform .2s var(--button-ease-bounce), border-color .18s var(--button-ease-standard)}.sg-card--interactive:hover,.sg-card--interactive:focus-visible{box-shadow:var(--card-shadow-hover);border-color:var(--sg-accent);transform:translateY(-2px)}.sg-card-header{justify-content:space-between;align-items:flex-start;gap:12px;margin-bottom:8px;display:flex}.sg-card-actions{flex-wrap:wrap;gap:8px 16px;margin-top:12px;display:flex}.sg-card-actions a{color:var(--sg-link)}.sg-badge{--badge-bg:var(--sg-surface-muted);--badge-border:var(--sg-border);--badge-color:var(--sg-text);border:1px solid var(--badge-border);background:var(--badge-bg);color:var(--badge-color);font-family:var(--font-family);white-space:nowrap;border-radius:999px;align-items:center;gap:4px;padding:3px 10px;font-size:13px;line-height:1.3;display:inline-flex}.sg-badge--accent,.sg-badge--selected{--badge-bg:var(--sg-accent-soft);--badge-border:var(--sg-accent);--badge-color:var(--sg-accent-strong)}.sg-badge--success{--badge-bg:var(--sg-success-soft);--badge-border:var(--sg-success);--badge-color:var(--sg-success)}.sg-badge--danger{--badge-bg:var(--sg-danger-soft);--badge-border:var(--sg-danger);--badge-color:var(--sg-danger)}.sg-badge:has(.sg-badge-toggle){transition:transform .2s var(--button-ease-bounce);padding:0}.sg-badge:has(.sg-badge-toggle):hover{transform:translateY(-1px)}.sg-badge-toggle{border-radius:inherit;color:inherit;font:inherit;cursor:pointer;background:0 0;border:none;padding:3px 10px}.sg-badge:has(.sg-badge-remove){padding-right:3px}.sg-badge-remove{width:20px;height:20px;color:inherit;cursor:pointer;background:0 0;border:none;border-radius:50%;justify-content:center;align-items:center;padding:0;font-size:15px;line-height:1;display:inline-flex}.sg-badge-remove:hover{background:var(--sg-surface-hover)}.sg-confirm-message{max-width:420px;color:var(--sg-text);line-height:1.5}.sg-confirm-message>p{margin:0}.sg-textarea{resize:vertical;font-family:inherit;line-height:1.4}.sg-select{cursor:pointer;font-family:inherit}.input-wrapper{margin-bottom:16px}.input-label{font-weight:500;font-family:var(--font-family);font-size:var(--primary-font);margin-bottom:4px;display:block}.input-field{box-sizing:border-box;border-radius:var(--radius);border-style:solid;border-width:1px;border-color:var(--input-border);background-color:var(--input-bg);width:100%;color:var(--sg-text);font-size:var(--primary-font);padding:8px}.input-field--invalid{background-color:var(--sg-danger-soft);border-color:var(--sg-danger)}.sg-field{font-family:var(--font-family);flex-direction:column;gap:4px;margin-bottom:16px;display:flex}.sg-field .input-label,.sg-field .input-wrapper{margin-bottom:0}.sg-field-hint,.sg-field-error{margin:0;font-size:12px}.sg-field-hint{color:var(--sg-text-muted)}.sg-field-error{color:var(--sg-danger)}.sg-tabs{--tabs-gap:4px;gap:var(--tabs-gap);font-family:var(--font-family);-webkit-overflow-scrolling:touch;display:flex;overflow-x:auto}.sg-tab{color:var(--sg-text-muted);font:inherit;font-size:var(--primary-font);white-space:nowrap;cursor:pointer;transition:background .15s var(--button-ease-standard), color .15s var(--button-ease-standard);background:0 0;border:none;flex:none;padding:8px 16px}.sg-tab:disabled{opacity:.5;cursor:default}.sg-tab:focus-visible{outline:2px solid var(--sg-accent-strong);outline-offset:2px}.sg-tabs--underline{--tabs-gap:8px;border-bottom:1px solid var(--sg-border)}.sg-tabs--underline .sg-tab{border-bottom:2px solid #0000;margin-bottom:-1px}.sg-tabs--underline .sg-tab:hover:not(:disabled){color:var(--sg-text)}.sg-tabs--underline .sg-tab--active{border-bottom-color:var(--sg-accent-strong);color:var(--sg-accent-strong);font-weight:600}.sg-tabs--pills .sg-tab{background:var(--sg-surface-muted);color:var(--sg-text);border-radius:999px}.sg-tabs--pills .sg-tab:hover:not(:disabled):not(.sg-tab--active){background:var(--sg-surface-hover)}.sg-tabs--pills .sg-tab--active{background:var(--sg-accent);color:var(--sg-on-accent);box-shadow:var(--sg-shadow-1)}.sg-tabs--segmented{border:1px solid var(--sg-border);background:var(--sg-surface-muted);border-radius:999px;padding:4px}.sg-tabs--segmented .sg-tab{color:var(--sg-accent-strong);border-radius:999px;flex:1;padding:6px 16px;font-weight:600}.sg-tabs--segmented .sg-tab:hover:not(:disabled):not(.sg-tab--active){background:var(--sg-accent-soft)}.sg-tabs--segmented .sg-tab--active{background:var(--sg-accent);color:var(--sg-on-accent)}:root{--sg-color-white:#fff;--sg-color-black:#000;--sg-color-gray-50:#f5f5f5;--sg-color-gray-100:#e1e5e9;--sg-color-gray-150:#e0e0e0;--sg-color-gray-200:#e6e6e6;--sg-color-gray-300:#ccc;--sg-color-gray-350:#bdbdbd;--sg-color-gray-400:#9aa3b5;--sg-color-gray-500:#647089;--sg-color-gray-600:#555;--sg-color-gray-650:#444;--sg-color-gray-700:#333;--sg-color-gray-750:#2a2a2a;--sg-color-gray-800:#222;--sg-color-gray-900:#1a1a1a;--sg-color-blue-50:#e2e7f8;--sg-color-blue-300:#86aefc;--sg-color-blue-400:#6f9cf7;--sg-color-blue-500:#5480e6;--sg-color-blue-600:#3d5fc4;--sg-color-blue-700:#2e4aa0;--sg-color-sky-500:#1ea7fd;--sg-color-green-50:#e8f5e9;--sg-color-green-400:#66bb6a;--sg-color-green-700:#2e7d32;--sg-color-red-50:#ffe5e5;--sg-color-red-400:#e57373;--sg-color-red-600:#c0392b;--sg-bg:var(--sg-color-white);--sg-surface:var(--sg-color-white);--sg-surface-muted:var(--sg-color-gray-50);--sg-surface-hover:var(--sg-color-gray-150);--sg-border:var(--sg-color-gray-300);--sg-border-subtle:var(--sg-color-gray-100);--sg-text:var(--sg-color-gray-700);--sg-text-heading:var(--sg-color-gray-800);--sg-text-secondary:var(--sg-color-gray-600);--sg-text-muted:var(--sg-color-gray-500);--sg-accent:var(--sg-color-blue-600);--sg-accent-strong:var(--sg-color-blue-700);--sg-accent-soft:var(--sg-color-blue-50);--sg-on-accent:var(--sg-color-white);--sg-action:var(--sg-color-blue-400);--sg-action-hover:var(--sg-color-blue-500);--sg-link:var(--sg-color-sky-500);--sg-success:var(--sg-color-green-700);--sg-success-soft:var(--sg-color-green-50);--sg-danger:var(--sg-color-red-600);--sg-danger-soft:var(--sg-color-red-50);--sg-overlay:#0000004d;--sg-shadow-1:0 1px 2px #0f172a14, 0 1px 3px #0f172a0f;--sg-shadow-2:0 4px 12px #0f172a1f;--sg-shadow-3:0 2px 16px #00000026;--sg-action-shadow:0 1px 2px #5480e61f, 0 1px 3px #5480e61a;--unit:3px;--radius:calc(var(--unit) * 2);--font-size:14px;--font-family:Arial, sans-serif;--font-size-h1:calc(var(--font-size) * 1.5);--primary-bg:var(--sg-surface-muted);--primary-border:var(--sg-border);--primary-radius:var(--radius);--primary-font:var(--font-size);--primary-hover-bg:var(--sg-surface-hover);--modal-bg:var(--sg-surface);--modal-overlay:var(--sg-overlay);--modal-title-color:var(--sg-text-heading);--input-bg:var(--sg-surface);--input-border:var(--sg-border);--input-radius:var(--radius);--input-font:1rem;--button-bg:var(--sg-action);--button-bg-hover:var(--sg-action-hover);--button-color:var(--sg-on-accent);--button-radius:999px;--button-shadow:var(--sg-action-shadow);--button-ease-standard:cubic-bezier(.4, 0, .2, 1);--button-ease-bounce:cubic-bezier(.34, 1.56, .64, 1);--accent:var(--sg-accent);--accent-strong:var(--sg-accent-strong);--accent-soft:var(--sg-accent-soft);--ink-muted:var(--sg-text-muted);--shadow-1:var(--sg-shadow-1);--shadow-2:var(--sg-shadow-2)}:root[data-theme=dark]{--sg-bg:var(--sg-color-gray-900);--sg-surface:var(--sg-color-gray-800);--sg-surface-muted:var(--sg-color-gray-750);--sg-surface-hover:var(--sg-color-gray-700);--sg-border:var(--sg-color-gray-600);--sg-border-subtle:var(--sg-color-gray-650);--sg-text:var(--sg-color-gray-200);--sg-text-heading:var(--sg-color-white);--sg-text-secondary:var(--sg-color-gray-350);--sg-text-muted:var(--sg-color-gray-400);--sg-accent:var(--sg-color-blue-400);--sg-accent-strong:var(--sg-color-blue-300);--sg-accent-soft:#6f9cf72e;--sg-action-hover:var(--sg-color-blue-300);--sg-link:var(--sg-color-blue-300);--sg-success:var(--sg-color-green-400);--sg-success-soft:#66bb6a26;--sg-danger:var(--sg-color-red-400);--sg-danger-soft:#e5737326;--sg-overlay:#0009;--sg-shadow-1:0 1px 2px #0000004d, 0 1px 3px #0000003d;--sg-shadow-2:0 4px 12px #0006;--sg-shadow-3:0 2px 16px #00000080}.sg-table-scroll{-webkit-overflow-scrolling:touch;overflow-x:auto}.sg-table{--table-border:var(--sg-border-subtle);--table-head-bg:var(--sg-surface-muted);--table-row-hover:var(--sg-surface-muted);--table-cell-padding:8px 12px;border-collapse:collapse;width:100%;color:var(--sg-text);font-family:var(--font-family);font-size:var(--primary-font)}.sg-table th,.sg-table td{padding:var(--table-cell-padding);border-bottom:1px solid var(--table-border);text-align:left;vertical-align:top}.sg-table th{background:var(--table-head-bg);color:var(--sg-text-secondary);text-transform:uppercase;letter-spacing:.03em;white-space:nowrap;font-size:12px;font-weight:600}.sg-table tbody tr:hover{background:var(--table-row-hover)}.sg-table .sg-table-num{text-align:right;font-variant-numeric:tabular-nums}
|
|
1
|
+
.custom-button{border-radius:var(--button-radius);background:var(--button-bg);color:var(--button-color);cursor:pointer;font-size:var(--primary-font);font-weight:600;font-family:var(--font-family);box-shadow:var(--button-shadow);transition:background .15s var(--button-ease-standard), transform var(--button-ease-bounce) .2s;border:none;padding:8px 20px}.custom-button:hover:not(:disabled){background:var(--button-bg-hover);transform:translateY(-1px)}.custom-button:active:not(:disabled){transform:scale(.97)}.custom-button:disabled{opacity:.6;cursor:default}.custom-button--secondary{--button-bg:var(--sg-surface);--button-bg-hover:var(--sg-surface-hover);--button-color:var(--sg-text);--button-shadow:none;border:1px solid var(--sg-border)}.custom-button--danger{--button-bg:var(--sg-danger);--button-bg-hover:var(--sg-danger);--button-color:var(--sg-on-accent)}.custom-button--danger:hover:not(:disabled){filter:brightness(.92)}.custom-button-with-icon{align-items:center;gap:8px;display:inline-flex}.custom-button-label-visually-hidden{clip:rect(0, 0, 0, 0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.sg-icon{vertical-align:middle;flex-shrink:0;display:inline-block}.footer{background-color:var(--primary-bg);border-top:1px solid var(--primary-border);font-family:var(--font-family);color:var(--sg-text-secondary);justify-content:space-between;align-items:center;width:100%;padding:16px 32px;font-size:14px;display:flex;position:fixed;bottom:0;left:0}.footer a{color:var(--sg-link);text-decoration:none}.footer a:hover{text-decoration:underline}.cookie-consent{background-color:var(--primary-bg);border-top:1px solid var(--primary-border);font-family:var(--font-family);color:var(--sg-text-secondary);z-index:1000;box-sizing:border-box;flex-wrap:wrap;justify-content:center;align-items:center;gap:16px;width:100%;padding:16px 32px;font-size:14px;display:flex;position:fixed;bottom:0;left:0}.cookie-consent-text{flex:320px;margin:0}.cookie-consent a{color:var(--sg-link);text-decoration:none}.cookie-consent a:hover{text-decoration:underline}.cookie-consent-accept{flex:none}.logo-text{font-size:var(--font-size-h1);font-family:var(--font-family);margin:0;font-weight:400}.header{background-color:var(--sg-surface);width:100%;color:var(--sg-text);border-bottom:1px solid var(--sg-border-subtle);box-shadow:var(--sg-shadow-1);z-index:100;font-size:var(--font-size);position:sticky;top:0}.header-container{justify-content:flex-start;align-items:center;max-width:1200px;margin:0 auto;padding:16px;display:flex}.header-actions{align-items:center;gap:12px;margin-left:auto;display:flex}.logo{cursor:pointer;color:var(--sg-text);font-size:24px;font-weight:700;transition:color .2s}.logo:hover{color:var(--accent)}.logo-full{display:inline}.logo-short{display:none}@media (width<=768px){.header-container{padding:12px 16px}.logo{font-size:var(--font-size)}.logo-full{display:none}.logo-short{display:inline}}@media (width<=480px){.header-container{padding:8px 12px}.logo{font-size:var(--font-size)}}.sg-access-gate{z-index:998;box-sizing:border-box;background:var(--primary-bg);font-family:var(--font-family);justify-content:center;align-items:center;padding:16px;display:flex;position:fixed;inset:0}.sg-access-gate-card{border:1px solid var(--primary-border);border-radius:calc(var(--radius) * 3);background:var(--modal-bg);max-width:420px;box-shadow:var(--shadow-2);color:var(--sg-text);text-align:center;padding:24px}.sg-access-gate-card h2{font-size:var(--font-size-h1);color:var(--modal-title-color);margin:0 0 12px}.sg-access-gate-card p{color:var(--ink-muted);margin:0 0 16px}.sg-access-gate-card .sg-access-gate-error{color:var(--sg-danger)}.sg-app-launcher{font-family:var(--font-family);position:relative}.sg-app-launcher-toggle{width:40px;height:40px;color:var(--ink-muted);cursor:pointer;background:0 0;border:none;border-radius:50%;justify-content:center;align-items:center;padding:0;display:inline-flex}.sg-app-launcher-toggle:hover,.sg-app-launcher-toggle[aria-expanded=true]{background:var(--primary-hover-bg)}.sg-app-launcher-panel{z-index:1000;box-sizing:border-box;border:1px solid var(--primary-border);border-radius:calc(var(--radius) * 3);background:var(--modal-bg);width:320px;max-width:calc(100vw - 24px);max-height:70vh;color:var(--sg-text);box-shadow:var(--shadow-2);padding:12px;position:absolute;top:calc(100% + 8px);right:0;overflow-y:auto}.sg-app-launcher-grid{grid-template-columns:repeat(3,minmax(0,1fr));gap:4px;margin:0;padding:0;list-style:none;display:grid}.sg-app-launcher-app{border-radius:var(--radius);color:inherit;flex-direction:column;align-items:center;gap:6px;padding:12px 4px;text-decoration:none;display:flex}.sg-app-launcher-app:hover,.sg-app-launcher-app:focus-visible{background:var(--primary-hover-bg)}.sg-app-launcher-app.current{background:var(--accent-soft)}.sg-app-launcher-tile{border-radius:var(--radius);background:var(--accent);width:40px;height:40px;color:var(--sg-on-accent);justify-content:center;align-items:center;font-size:18px;font-weight:600;display:flex}.sg-app-launcher-name{text-overflow:ellipsis;white-space:nowrap;max-width:100%;font-size:13px;overflow:hidden}.sg-app-launcher-message{color:var(--ink-muted);margin:0;padding:8px;font-size:13px}.sg-app-launcher-tile{position:relative}.sg-app-launcher-app.locked .sg-app-launcher-tile{background:var(--ink-muted)}.sg-app-launcher-app.locked .sg-app-launcher-name{color:var(--ink-muted)}.sg-app-launcher-lock{border:2px solid var(--modal-bg);background:var(--modal-title-color);width:20px;height:20px;color:var(--modal-bg);border-radius:50%;justify-content:center;align-items:center;display:flex;position:absolute;bottom:-6px;right:-6px}.sg-visually-hidden{clip:rect(0 0 0 0);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}.sg-avatar{--avatar-size:32px;--avatar-bg:var(--sg-accent);--avatar-color:var(--sg-on-accent);box-sizing:border-box;width:var(--avatar-size);height:var(--avatar-size);object-fit:cover;background:var(--avatar-bg);color:var(--avatar-color);box-shadow:var(--sg-shadow-1);font-family:var(--font-family);font-size:calc(var(--avatar-size) * .42);-webkit-user-select:none;user-select:none;border-radius:50%;flex:none;justify-content:center;align-items:center;font-weight:600;display:inline-flex}.sg-authenticator-button{font-size:.9rem;font-family:var(--font-family);border:1px solid var(--primary-border);border-radius:var(--radius);background:var(--primary-bg);color:var(--sg-text);cursor:pointer;padding:.4rem 1rem;transition:background .15s,border-color .15s}.sg-authenticator-button:hover{background:var(--primary-hover-bg);border-color:var(--ink-muted)}.modal-overlay{background:var(--modal-overlay);z-index:1000;justify-content:center;align-items:center;width:100vw;height:100vh;animation:.25s ease-out sg-modal-overlay-fade-in;display:flex;position:fixed;top:0;left:0}.modal-overlay.modal-overlay-closing{animation:.22s ease-in forwards sg-modal-overlay-fade-out}.modal-content{--drag-x:0px;--drag-y:0px;background:var(--modal-bg);border-radius:var(--primary-radius);font-size:var(--primary-font);min-width:320px;max-width:calc(100vw - 40px);max-height:90vh;color:var(--sg-text);box-shadow:var(--sg-shadow-3);transform:translate(var(--drag-x), var(--drag-y));flex-direction:column;animation:.3s ease-out sg-modal-slide-in;display:flex;overflow:hidden}.modal-content.modal-content-closing{animation:.22s ease-in forwards sg-modal-slide-out}@keyframes sg-modal-overlay-fade-in{0%{opacity:0}to{opacity:1}}@keyframes sg-modal-overlay-fade-out{0%{opacity:1}to{opacity:0}}@keyframes sg-modal-slide-in{0%{transform:translate(var(--drag-x), calc(var(--drag-y) - 24px)) scale(.97);opacity:0}to{transform:translate(var(--drag-x), var(--drag-y)) scale(1);opacity:1}}@keyframes sg-modal-slide-out{0%{transform:translate(var(--drag-x), var(--drag-y)) scale(1);opacity:1}to{transform:translate(var(--drag-x), calc(var(--drag-y) - 24px)) scale(.97);opacity:0}}.modal-header{background:var(--primary-bg);border-top-left-radius:var(--primary-radius);border-top-right-radius:var(--primary-radius);cursor:grab;touch-action:none;flex:none;align-items:center;gap:8px;padding:16px;display:flex}.modal-header-dragging{cursor:grabbing;-webkit-user-select:none;user-select:none}.modal-icon{color:var(--modal-title-color);display:inline-flex}.modal-title{color:var(--modal-title-color);font-family:var(--font-family);font-size:var(--primary-font);flex:1;margin:0}.modal-close{cursor:pointer;color:var(--modal-title-color);background:0 0;border:none;padding:4px 8px;font-size:20px;line-height:1}.modal-close:disabled{cursor:default;opacity:.6}.modal-children{font-family:var(--font-family);padding:16px;overflow-y:auto}.modal-footer{border-top:1px solid var(--primary-border);flex-wrap:wrap;flex:none;justify-content:flex-end;gap:8px;padding:12px 16px;display:flex}.input-label{font-weight:500;font-size:var(--primary-font);margin-bottom:4px;display:block}.login-modal-form{font-family:var(--font-family);font-size:var(--primary-font);flex-direction:column;gap:16px;display:flex}.header.quadrato-header{z-index:999}.quadrato-header-auth{align-items:center;gap:12px;display:flex}.quadrato-header-username{font-size:var(--font-size);color:var(--sg-text);transition:color .2s}.quadrato-header-username:hover{color:var(--accent)}form{font-family:var(--font-family)}.set-password-modal-form{font-family:var(--font-family);font-size:var(--primary-font);flex-direction:column;gap:16px;display:flex}.set-password-modal-error{color:var(--sg-danger);font-size:var(--primary-font);margin:0}.sg-color-picker{font-family:var(--font-family);position:relative}.sg-color-picker-toggle{border-radius:var(--input-radius);border:1px solid var(--input-border);background:var(--input-bg);width:100%;color:inherit;cursor:pointer;justify-content:space-between;align-items:center;gap:8px;padding:6px 8px;font-family:inherit;font-size:13px;display:flex}.sg-color-picker-toggle-label{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.sg-color-picker-swatch{border:1px solid var(--sg-border-subtle);border-radius:4px;flex:none;width:18px;height:18px}.sg-color-picker-popover{z-index:30;background:var(--input-bg);border:1px solid var(--input-border);border-radius:var(--input-radius);box-shadow:var(--shadow-1);width:170px;padding:10px;position:absolute;top:calc(100% + 4px);left:0}.sg-color-picker-grid{grid-template-columns:repeat(6,1fr);gap:6px;display:grid}.sg-color-picker-swatch-button{border:1px solid var(--sg-border-subtle);cursor:pointer;border-radius:4px;width:20px;height:20px;padding:0}.sg-color-picker-swatch-button.active{border:2px solid var(--accent)}.sg-color-picker-custom{border-top:1px solid var(--input-border);color:var(--ink-muted);cursor:pointer;justify-content:space-between;align-items:center;gap:8px;margin-top:8px;padding-top:8px;font-size:11px;display:flex}.sg-color-picker-custom input[type=color]{cursor:pointer;border:none;width:26px;height:20px;padding:0}.sg-font-picker{font-family:var(--font-family);position:relative}.sg-font-picker-toggle{border-radius:var(--input-radius);border:1px solid var(--input-border);background:var(--input-bg);width:100%;color:inherit;cursor:pointer;justify-content:space-between;align-items:center;gap:8px;padding:6px 8px;font-size:13px;display:flex}.sg-font-picker-toggle-label{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.sg-font-picker-toggle-caret{opacity:.5;flex:none;font-size:10px}.sg-font-picker-list{background:var(--input-bg);border:1px solid var(--input-border);border-radius:var(--input-radius);max-height:260px;box-shadow:var(--shadow-1);z-index:30;margin:0;padding:4px 0;list-style:none;position:absolute;top:calc(100% + 4px);left:0;right:0;overflow-y:auto}.sg-font-picker-option{text-align:left;width:100%;color:inherit;cursor:pointer;background:0 0;border:none;padding:8px 10px;font-size:15px;display:block}.sg-font-picker-option.active{background:var(--accent-soft)}.sg-toggle{cursor:pointer;-webkit-user-select:none;user-select:none;font-family:var(--font-family);align-items:center;gap:6px;display:flex}.sg-toggle-input{opacity:0;width:1px;height:1px;position:absolute}.sg-toggle-track{background:var(--input-border);border-radius:999px;flex:none;width:34px;height:20px;transition:background .15s cubic-bezier(.4,0,.2,1);position:relative}.sg-toggle-input:checked+.sg-toggle-track{background:var(--accent)}.sg-toggle-thumb{background:var(--input-bg);width:16px;height:16px;box-shadow:var(--shadow-1);border-radius:50%;transition:left .15s cubic-bezier(.4,0,.2,1);position:absolute;top:2px;left:2px}.sg-toggle-input:checked+.sg-toggle-track .sg-toggle-thumb{left:16px}.sg-toggle-input:focus-visible+.sg-toggle-track{outline:2px solid var(--accent-strong);outline-offset:2px}.sg-toggle-label{color:var(--ink-muted);white-space:nowrap;font-size:13px}.sg-toggle-icons{align-items:center;gap:4px;display:inline-flex}.sg-toggle--row{gap:12px;width:100%;margin:8px 0}.sg-toggle--row .sg-toggle-label{color:var(--sg-text);font-size:var(--primary-font);white-space:normal;flex:1;order:-2}.sg-toggle--row .sg-toggle-icons{order:-1}.sg-language-switcher{border:1px solid var(--input-border);border-radius:var(--input-radius);background:var(--input-bg);color:var(--sg-text);font-family:var(--font-family);font-size:var(--primary-font);cursor:pointer;padding:4px 8px}.sg-progress{--progress-height:8px;--progress-track:var(--sg-surface-hover);--progress-fill:var(--sg-accent);font-family:var(--font-family);align-items:center;gap:12px;display:flex}.sg-progress--sm{--progress-height:6px}.sg-progress--success{--progress-fill:var(--sg-success)}.sg-progress--danger{--progress-fill:var(--sg-danger)}.sg-progress-track{height:var(--progress-height);background:var(--progress-track);border-radius:999px;flex:1;overflow:hidden}.sg-progress-fill{background:var(--progress-fill);height:100%;transition:width .2s var(--button-ease-standard);border-radius:999px}.sg-progress-label{color:var(--sg-text-muted);white-space:nowrap;font-size:12px}.sg-status{--status-color:var(--sg-text-muted);--status-bg:var(--sg-surface-muted);color:var(--status-color);font-family:var(--font-family);font-size:var(--primary-font);align-items:center;gap:8px;margin:0;display:flex}.sg-status--error{--status-color:var(--sg-danger);--status-bg:var(--sg-danger-soft)}.sg-status--boxed{border-radius:var(--radius);background:var(--status-bg);padding:8px 12px}.sg-status-spinner{border:2px solid var(--sg-border);border-top-color:var(--sg-accent);border-radius:50%;flex:none;width:14px;height:14px;animation:.8s linear infinite sg-status-spin}@keyframes sg-status-spin{to{transform:rotate(360deg)}}@media (prefers-reduced-motion:reduce){.sg-status-spinner{animation-duration:2.4s}}.sg-card{--card-bg:var(--sg-surface);--card-border:var(--sg-border-subtle);--card-radius:calc(var(--radius) * 2);--card-shadow:var(--sg-shadow-1);--card-shadow-hover:var(--sg-shadow-2);--card-padding:16px;box-sizing:border-box;padding:var(--card-padding);border:1px solid var(--card-border);border-radius:var(--card-radius);background:var(--card-bg);box-shadow:var(--card-shadow);color:var(--sg-text);font-family:var(--font-family);text-align:left;text-decoration:none;display:block}.sg-card--mini{--card-padding:8px 12px}.sg-card--interactive{cursor:pointer;transition:box-shadow .18s var(--button-ease-standard), transform .2s var(--button-ease-bounce), border-color .18s var(--button-ease-standard)}.sg-card--interactive:hover,.sg-card--interactive:focus-visible{box-shadow:var(--card-shadow-hover);border-color:var(--sg-accent);transform:translateY(-2px)}.sg-card-header{justify-content:space-between;align-items:flex-start;gap:12px;margin-bottom:8px;display:flex}.sg-card-actions{flex-wrap:wrap;gap:8px 16px;margin-top:12px;display:flex}.sg-card-actions a{color:var(--sg-link)}.sg-badge{--badge-bg:var(--sg-surface-muted);--badge-border:var(--sg-border);--badge-color:var(--sg-text);border:1px solid var(--badge-border);background:var(--badge-bg);color:var(--badge-color);font-family:var(--font-family);white-space:nowrap;border-radius:999px;align-items:center;gap:4px;padding:3px 10px;font-size:13px;line-height:1.3;display:inline-flex}.sg-badge--accent,.sg-badge--selected{--badge-bg:var(--sg-accent-soft);--badge-border:var(--sg-accent);--badge-color:var(--sg-accent-strong)}.sg-badge--success{--badge-bg:var(--sg-success-soft);--badge-border:var(--sg-success);--badge-color:var(--sg-success)}.sg-badge--danger{--badge-bg:var(--sg-danger-soft);--badge-border:var(--sg-danger);--badge-color:var(--sg-danger)}.sg-badge:has(.sg-badge-toggle){transition:transform .2s var(--button-ease-bounce);padding:0}.sg-badge:has(.sg-badge-toggle):hover{transform:translateY(-1px)}.sg-badge-toggle{border-radius:inherit;color:inherit;font:inherit;cursor:pointer;background:0 0;border:none;padding:3px 10px}.sg-badge:has(.sg-badge-remove){padding-right:3px}.sg-badge-remove{width:20px;height:20px;color:inherit;cursor:pointer;background:0 0;border:none;border-radius:50%;justify-content:center;align-items:center;padding:0;font-size:15px;line-height:1;display:inline-flex}.sg-badge-remove:hover{background:var(--sg-surface-hover)}.sg-confirm-message{max-width:420px;color:var(--sg-text);line-height:1.5}.sg-confirm-message>p{margin:0}.sg-textarea{resize:vertical;font-family:inherit;line-height:1.4}.sg-select{cursor:pointer;font-family:inherit}.input-wrapper{margin-bottom:16px}.input-label{font-weight:500;font-family:var(--font-family);font-size:var(--primary-font);margin-bottom:4px;display:block}.input-field{box-sizing:border-box;border-radius:var(--radius);border-style:solid;border-width:1px;border-color:var(--input-border);background-color:var(--input-bg);width:100%;color:var(--sg-text);font-size:var(--primary-font);padding:8px}.input-field--invalid,.input-field[aria-invalid=true]{background-color:var(--sg-danger-soft);border-color:var(--sg-danger)}.sg-field{font-family:var(--font-family);flex-direction:column;gap:4px;margin-bottom:16px;display:flex}.sg-field .input-label,.sg-field .input-wrapper{margin-bottom:0}.sg-field-hint,.sg-field-error{margin:0;font-size:12px}.sg-field-hint{color:var(--sg-text-muted)}.sg-field-error{color:var(--sg-danger)}.sg-tabs{--tabs-gap:4px;gap:var(--tabs-gap);font-family:var(--font-family);-webkit-overflow-scrolling:touch;display:flex;overflow-x:auto}.sg-tab{color:var(--sg-text-muted);font:inherit;font-size:var(--primary-font);white-space:nowrap;cursor:pointer;transition:background .15s var(--button-ease-standard), color .15s var(--button-ease-standard);background:0 0;border:none;flex:none;padding:8px 16px}.sg-tab:disabled{opacity:.5;cursor:default}.sg-tab:focus-visible{outline:2px solid var(--sg-accent-strong);outline-offset:2px}.sg-tabs--underline{--tabs-gap:8px;border-bottom:1px solid var(--sg-border)}.sg-tabs--underline .sg-tab{border-bottom:2px solid #0000;margin-bottom:-1px}.sg-tabs--underline .sg-tab:hover:not(:disabled){color:var(--sg-text)}.sg-tabs--underline .sg-tab--active{border-bottom-color:var(--sg-accent-strong);color:var(--sg-accent-strong);font-weight:600}.sg-tabs--pills .sg-tab{background:var(--sg-surface-muted);color:var(--sg-text);border-radius:999px}.sg-tabs--pills .sg-tab:hover:not(:disabled):not(.sg-tab--active){background:var(--sg-surface-hover)}.sg-tabs--pills .sg-tab--active{background:var(--sg-accent);color:var(--sg-on-accent);box-shadow:var(--sg-shadow-1)}.sg-tabs--segmented{border:1px solid var(--sg-border);background:var(--sg-surface-muted);border-radius:999px;padding:4px}.sg-tabs--segmented .sg-tab{color:var(--sg-accent-strong);border-radius:999px;flex:1;padding:6px 16px;font-weight:600}.sg-tabs--segmented .sg-tab:hover:not(:disabled):not(.sg-tab--active){background:var(--sg-accent-soft)}.sg-tabs--segmented .sg-tab--active{background:var(--sg-accent);color:var(--sg-on-accent)}.sg-table-scroll{-webkit-overflow-scrolling:touch;overflow-x:auto}.sg-table{--table-border:var(--sg-border-subtle);--table-head-bg:var(--sg-surface-muted);--table-row-hover:var(--sg-surface-muted);--table-cell-padding:8px 12px;border-collapse:collapse;width:100%;color:var(--sg-text);font-family:var(--font-family);font-size:var(--primary-font)}.sg-table th,.sg-table td{padding:var(--table-cell-padding);border-bottom:1px solid var(--table-border);text-align:left;vertical-align:top}.sg-table th{background:var(--table-head-bg);color:var(--sg-text-secondary);text-transform:uppercase;letter-spacing:.03em;white-space:nowrap;font-size:12px;font-weight:600}.sg-table tbody tr:hover{background:var(--table-row-hover)}.sg-table .sg-table-num{text-align:right;font-variant-numeric:tabular-nums}.sg-version{color:var(--sg-text-muted);font-family:var(--font-family);text-align:center;margin:16px 0 0;font-size:12px}.sg-login-prompt{color:var(--sg-text-muted);font-family:var(--font-family);text-align:center;flex-direction:column;align-items:center;gap:16px;padding:48px 16px;display:flex}.sg-login-prompt-message{max-width:420px;font-size:var(--primary-font);margin:0;line-height:1.5}.sg-login-prompt-footer{font-size:13px}.sg-login-prompt-footer a{color:var(--sg-link)}.sg-auth-page{box-sizing:border-box;font-family:var(--font-family);flex-direction:column;align-items:center;gap:16px;padding:48px 16px;display:flex}.sg-auth-page-card{box-sizing:border-box;border:1px solid var(--sg-border-subtle);border-radius:calc(var(--radius) * 2);background:var(--sg-surface);width:100%;max-width:400px;box-shadow:var(--sg-shadow-1);color:var(--sg-text);padding:24px}.sg-auth-page-card p{margin:0 0 12px;line-height:1.5}.sg-auth-page-title{color:var(--sg-text-heading);font-size:var(--font-size-h1);margin:0 0 16px}.sg-auth-page-footer{font-size:13px}.sg-auth-page-footer a{color:var(--sg-link)}:root{--sg-color-white:#fff;--sg-color-black:#000;--sg-color-gray-50:#f5f5f5;--sg-color-gray-100:#e1e5e9;--sg-color-gray-150:#e0e0e0;--sg-color-gray-200:#e6e6e6;--sg-color-gray-300:#ccc;--sg-color-gray-350:#bdbdbd;--sg-color-gray-400:#9aa3b5;--sg-color-gray-500:#647089;--sg-color-gray-600:#555;--sg-color-gray-650:#444;--sg-color-gray-700:#333;--sg-color-gray-750:#2a2a2a;--sg-color-gray-800:#222;--sg-color-gray-900:#1a1a1a;--sg-color-blue-50:#e2e7f8;--sg-color-blue-300:#86aefc;--sg-color-blue-400:#6f9cf7;--sg-color-blue-500:#5480e6;--sg-color-blue-600:#3d5fc4;--sg-color-blue-700:#2e4aa0;--sg-color-sky-500:#1ea7fd;--sg-color-green-50:#e8f5e9;--sg-color-green-400:#66bb6a;--sg-color-green-700:#2e7d32;--sg-color-red-50:#ffe5e5;--sg-color-red-400:#e57373;--sg-color-red-600:#c0392b;--sg-bg:var(--sg-color-white);--sg-surface:var(--sg-color-white);--sg-surface-muted:var(--sg-color-gray-50);--sg-surface-hover:var(--sg-color-gray-150);--sg-border:var(--sg-color-gray-300);--sg-border-subtle:var(--sg-color-gray-100);--sg-text:var(--sg-color-gray-700);--sg-text-heading:var(--sg-color-gray-800);--sg-text-secondary:var(--sg-color-gray-600);--sg-text-muted:var(--sg-color-gray-500);--sg-accent:var(--sg-color-blue-600);--sg-accent-strong:var(--sg-color-blue-700);--sg-accent-soft:var(--sg-color-blue-50);--sg-on-accent:var(--sg-color-white);--sg-action:var(--sg-color-blue-400);--sg-action-hover:var(--sg-color-blue-500);--sg-link:var(--sg-color-sky-500);--sg-success:var(--sg-color-green-700);--sg-success-soft:var(--sg-color-green-50);--sg-danger:var(--sg-color-red-600);--sg-danger-soft:var(--sg-color-red-50);--sg-overlay:#0000004d;--sg-shadow-1:0 1px 2px #0f172a14, 0 1px 3px #0f172a0f;--sg-shadow-2:0 4px 12px #0f172a1f;--sg-shadow-3:0 2px 16px #00000026;--sg-action-shadow:0 1px 2px #5480e61f, 0 1px 3px #5480e61a;--unit:3px;--radius:calc(var(--unit) * 2);--font-size:14px;--font-family:Arial, sans-serif;--font-size-h1:calc(var(--font-size) * 1.5);--primary-bg:var(--sg-surface-muted);--primary-border:var(--sg-border);--primary-radius:var(--radius);--primary-font:var(--font-size);--primary-hover-bg:var(--sg-surface-hover);--modal-bg:var(--sg-surface);--modal-overlay:var(--sg-overlay);--modal-title-color:var(--sg-text-heading);--input-bg:var(--sg-surface);--input-border:var(--sg-border);--input-radius:var(--radius);--input-font:1rem;--button-bg:var(--sg-action);--button-bg-hover:var(--sg-action-hover);--button-color:var(--sg-on-accent);--button-radius:999px;--button-shadow:var(--sg-action-shadow);--button-ease-standard:cubic-bezier(.4, 0, .2, 1);--button-ease-bounce:cubic-bezier(.34, 1.56, .64, 1);--accent:var(--sg-accent);--accent-strong:var(--sg-accent-strong);--accent-soft:var(--sg-accent-soft);--ink-muted:var(--sg-text-muted);--shadow-1:var(--sg-shadow-1);--shadow-2:var(--sg-shadow-2)}:root[data-theme=dark]{--sg-bg:var(--sg-color-gray-900);--sg-surface:var(--sg-color-gray-800);--sg-surface-muted:var(--sg-color-gray-750);--sg-surface-hover:var(--sg-color-gray-700);--sg-border:var(--sg-color-gray-600);--sg-border-subtle:var(--sg-color-gray-650);--sg-text:var(--sg-color-gray-200);--sg-text-heading:var(--sg-color-white);--sg-text-secondary:var(--sg-color-gray-350);--sg-text-muted:var(--sg-color-gray-400);--sg-accent:var(--sg-color-blue-400);--sg-accent-strong:var(--sg-color-blue-300);--sg-accent-soft:#6f9cf72e;--sg-action-hover:var(--sg-color-blue-300);--sg-link:var(--sg-color-blue-300);--sg-success:var(--sg-color-green-400);--sg-success-soft:#66bb6a26;--sg-danger:var(--sg-color-red-400);--sg-danger-soft:#e5737326;--sg-overlay:#0009;--sg-shadow-1:0 1px 2px #0000004d, 0 1px 3px #0000003d;--sg-shadow-2:0 4px 12px #0006;--sg-shadow-3:0 2px 16px #00000080}.sg-register-form{flex-direction:column;display:flex}.sg-register-form .custom-button{width:100%}
|
|
2
2
|
/*$vite$:1*/
|