sixseconds-modules 3.0.3 → 3.0.6

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/index.d.ts CHANGED
@@ -1,9 +1,9 @@
1
1
  export { default as IMAGES } from './assets/images';
2
2
  export { default as SVG } from './assets/svg';
3
- export { Header, Logo } from './components/header';
3
+ export { ChangePasswordDialog, DangerDialog, ViewProfileDialog } from './components/dialogs';
4
+ export { BackArrow, Warning } from './components/elements';
4
5
  export { PreviousLoginBanner } from './components/features';
5
- export { DangerDialog, ChangePasswordDialog, ViewProfileDialog } from './components/dialogs';
6
- export { Warning, BackArrow } from './components/elements';
7
- export { FILTER_DATE_FORMAT, MAIN_DATE_FORMAT, MAIN_TIME_FORMAT, SSO_ROUTES, STORAGE_VALUES } from './constants';
6
+ export { Header, Logo } from './components/header';
7
+ export { APP_NAMES, FILTER_DATE_FORMAT, MAIN_DATE_FORMAT, MAIN_TIME_FORMAT, SSO_ROUTES, STORAGE_VALUES, } from './constants';
8
8
  export { CookiesUtil } from './utils';
9
- export type { IHeaderProps, IUserDataProps, IInterFaceLang, IState } from './components/header/types';
9
+ export type { IHeaderProps, IInterFaceLang, IState, IUserDataProps } from './components/header/types';
package/dist/index.es.js CHANGED
@@ -556,150 +556,6 @@ const ResetPasswordValidationUtil = (t) => object().shape({
556
556
  newPassword: commonUtil(t).password.required(t(COMMON_VALIDATION_MASSAGE.password)),
557
557
  passwordConfirmation: commonUtil(t).confirmPass
558
558
  });
559
- if (env.VITE_MODULES_SSO_BACKEND_BASE_URL === void 0) {
560
- throw new Error("env is not set");
561
- }
562
- function createAxiosInstance(baseUrl) {
563
- return axios.create({
564
- baseURL: urlcat(baseUrl, "/api/"),
565
- headers: {
566
- "Content-Type": "application/json"
567
- },
568
- withCredentials: true
569
- });
570
- }
571
- async function req(config) {
572
- const baseUrl = env.VITE_MODULES_SSO_BACKEND_BASE_URL;
573
- const axiosInstance = createAxiosInstance(baseUrl);
574
- try {
575
- const response = await axiosInstance.request({ ...config });
576
- return {
577
- remote: SERVER_STATUS.success,
578
- data: response?.data?.data
579
- };
580
- } catch (error) {
581
- if (error.response) {
582
- const axiosError = error;
583
- const errorMessage = axiosError.response?.data?.message || ALERT_MESSAGES.fallbackError;
584
- const errorCode = axiosError.response?.status;
585
- const errorData = axiosError.response?.data?.data || null;
586
- return {
587
- status: errorCode,
588
- remote: SERVER_STATUS.failure,
589
- error: {
590
- message: errorMessage,
591
- data: errorData
592
- }
593
- };
594
- }
595
- throw error;
596
- }
597
- }
598
- const transformNotifications = (itm) => {
599
- return {
600
- id: itm.id,
601
- title: itm.title,
602
- date: formatDateUtil(itm.created_at),
603
- type: itm.message_type,
604
- status: itm.app_access,
605
- source: itm.app_access
606
- };
607
- };
608
- const transformMenuBuilderData = (itm) => {
609
- return {
610
- label: itm.name,
611
- value: itm.route,
612
- target: itm.target,
613
- id: itm.id,
614
- order: itm.order,
615
- children: itm.children?.length ? itm.children.map((data) => transformMenuBuilderData(data)) : []
616
- };
617
- };
618
- async function getDropDownMenuApi(params) {
619
- const res = await req({
620
- url: urlcat("menu/menus", params),
621
- method: "GET"
622
- });
623
- if (res.remote === SERVER_STATUS.success) {
624
- return {
625
- remote: SERVER_STATUS.success,
626
- data: res?.data?.map(transformMenuBuilderData)
627
- };
628
- }
629
- return res;
630
- }
631
- async function notificationApi(data) {
632
- const res = await req({
633
- url: urlcat("/notification/index", data),
634
- method: "GET"
635
- });
636
- if (res.remote === SERVER_STATUS.success) {
637
- return {
638
- remote: SERVER_STATUS.success,
639
- data: res?.data?.pager
640
- };
641
- }
642
- return res;
643
- }
644
- async function changeUserPasswordApi(payload) {
645
- const res = await req({
646
- url: `/auth/change-password`,
647
- method: "POST",
648
- data: payload
649
- });
650
- if (res.remote === SERVER_STATUS.success) {
651
- return {
652
- remote: SERVER_STATUS.success,
653
- data: res?.data?.pager
654
- };
655
- }
656
- return res;
657
- }
658
- async function autoLoginApi(id, userDetails) {
659
- const response = await req({
660
- url: urlcat("/auto-authenticate/:id", { id }),
661
- method: "POST"
662
- });
663
- if (response.remote === "success") {
664
- return response;
665
- }
666
- return response;
667
- }
668
- const useFormikWithDefaultsProps = (props) => {
669
- return useFormik({
670
- validateOnChange: false,
671
- validateOnBlur: false,
672
- ...props
673
- });
674
- };
675
- function useMediaQuery(query) {
676
- const getMatch = () => typeof window !== "undefined" ? window.matchMedia(query).matches : false;
677
- const [matches, setMatches] = useState(getMatch);
678
- useEffect(() => {
679
- if (typeof window === "undefined") return;
680
- const mql = window.matchMedia(query);
681
- const onChange = () => setMatches(mql.matches);
682
- onChange();
683
- mql.addEventListener("change", onChange);
684
- return () => mql.removeEventListener("change", onChange);
685
- }, [query]);
686
- return matches;
687
- }
688
- function useClickAway(ref, onAway, active = true) {
689
- useEffect(() => {
690
- if (!active || typeof document === "undefined") return;
691
- const handler = (e) => {
692
- const el = ref.current;
693
- if (el && !el.contains(e.target)) onAway();
694
- };
695
- document.addEventListener("mousedown", handler);
696
- document.addEventListener("touchstart", handler);
697
- return () => {
698
- document.removeEventListener("mousedown", handler);
699
- document.removeEventListener("touchstart", handler);
700
- };
701
- }, [ref, onAway, active]);
702
- }
703
559
  function Btn({
704
560
  variant = "ghost",
705
561
  btnTitle,
@@ -799,6 +655,41 @@ function LabeledInput({ label, required, type = "text", wrapClassName, className
799
655
  ] })
800
656
  ] });
801
657
  }
658
+ const useFormikWithDefaultsProps = (props) => {
659
+ return useFormik({
660
+ validateOnChange: false,
661
+ validateOnBlur: false,
662
+ ...props
663
+ });
664
+ };
665
+ function useMediaQuery(query) {
666
+ const getMatch = () => typeof window !== "undefined" ? window.matchMedia(query).matches : false;
667
+ const [matches, setMatches] = useState(getMatch);
668
+ useEffect(() => {
669
+ if (typeof window === "undefined") return;
670
+ const mql = window.matchMedia(query);
671
+ const onChange = () => setMatches(mql.matches);
672
+ onChange();
673
+ mql.addEventListener("change", onChange);
674
+ return () => mql.removeEventListener("change", onChange);
675
+ }, [query]);
676
+ return matches;
677
+ }
678
+ function useClickAway(ref, onAway, active = true) {
679
+ useEffect(() => {
680
+ if (!active || typeof document === "undefined") return;
681
+ const handler = (e) => {
682
+ const el = ref.current;
683
+ if (el && !el.contains(e.target)) onAway();
684
+ };
685
+ document.addEventListener("mousedown", handler);
686
+ document.addEventListener("touchstart", handler);
687
+ return () => {
688
+ document.removeEventListener("mousedown", handler);
689
+ document.removeEventListener("touchstart", handler);
690
+ };
691
+ }, [ref, onAway, active]);
692
+ }
802
693
  function Dropdown({ onClose, className, style, children }) {
803
694
  const ref = useRef(null);
804
695
  useClickAway(ref, onClose);
@@ -925,6 +816,115 @@ function ViewProfileDialog({ userData, setInitialState, isOpen }) {
925
816
  ] })
926
817
  ] }) }) });
927
818
  }
819
+ if (env.VITE_MODULES_SSO_BACKEND_BASE_URL === void 0) {
820
+ throw new Error("env is not set");
821
+ }
822
+ function createAxiosInstance(baseUrl) {
823
+ return axios.create({
824
+ baseURL: urlcat(baseUrl, "/api/"),
825
+ headers: {
826
+ "Content-Type": "application/json"
827
+ },
828
+ withCredentials: true
829
+ });
830
+ }
831
+ async function req(config) {
832
+ const baseUrl = env.VITE_MODULES_SSO_BACKEND_BASE_URL;
833
+ const axiosInstance = createAxiosInstance(baseUrl);
834
+ try {
835
+ const response = await axiosInstance.request({ ...config });
836
+ return {
837
+ remote: SERVER_STATUS.success,
838
+ data: response?.data?.data
839
+ };
840
+ } catch (error) {
841
+ if (error.response) {
842
+ const axiosError = error;
843
+ const errorMessage = axiosError.response?.data?.message || ALERT_MESSAGES.fallbackError;
844
+ const errorCode = axiosError.response?.status;
845
+ const errorData = axiosError.response?.data?.data || null;
846
+ return {
847
+ status: errorCode,
848
+ remote: SERVER_STATUS.failure,
849
+ error: {
850
+ message: errorMessage,
851
+ data: errorData
852
+ }
853
+ };
854
+ }
855
+ throw error;
856
+ }
857
+ }
858
+ const transformNotifications = (itm) => {
859
+ return {
860
+ id: itm.id,
861
+ title: itm.title,
862
+ date: formatDateUtil(itm.created_at),
863
+ type: itm.message_type,
864
+ status: itm.app_access,
865
+ source: itm.app_access
866
+ };
867
+ };
868
+ const transformMenuBuilderData = (itm) => {
869
+ return {
870
+ label: itm.name,
871
+ value: itm.route,
872
+ target: itm.target,
873
+ id: itm.id,
874
+ order: itm.order,
875
+ children: itm.children?.length ? itm.children.map((data) => transformMenuBuilderData(data)) : []
876
+ };
877
+ };
878
+ async function getDropDownMenuApi(params) {
879
+ const res = await req({
880
+ url: urlcat("menu/menus", params),
881
+ method: "GET"
882
+ });
883
+ if (res.remote === SERVER_STATUS.success) {
884
+ return {
885
+ remote: SERVER_STATUS.success,
886
+ data: res?.data?.map(transformMenuBuilderData)
887
+ };
888
+ }
889
+ return res;
890
+ }
891
+ async function notificationApi(data) {
892
+ const res = await req({
893
+ url: urlcat("/notification/index", data),
894
+ method: "GET"
895
+ });
896
+ if (res.remote === SERVER_STATUS.success) {
897
+ return {
898
+ remote: SERVER_STATUS.success,
899
+ data: res?.data?.pager
900
+ };
901
+ }
902
+ return res;
903
+ }
904
+ async function changeUserPasswordApi(payload) {
905
+ const res = await req({
906
+ url: `/auth/change-password`,
907
+ method: "POST",
908
+ data: payload
909
+ });
910
+ if (res.remote === SERVER_STATUS.success) {
911
+ return {
912
+ remote: SERVER_STATUS.success,
913
+ data: res?.data?.pager
914
+ };
915
+ }
916
+ return res;
917
+ }
918
+ async function autoLoginApi(id, userDetails) {
919
+ const response = await req({
920
+ url: urlcat("/auto-authenticate/:id", { id }),
921
+ method: "POST"
922
+ });
923
+ if (response.remote === "success") {
924
+ return response;
925
+ }
926
+ return response;
927
+ }
928
928
  function FormikErrorMsg({ fieldName, formik }) {
929
929
  const error = getIn(formik.errors, fieldName);
930
930
  useEffect(() => {
@@ -989,6 +989,47 @@ function ChangePasswordDialog({ isOpen, email, t: t2, setInitialState }) {
989
989
  ] })
990
990
  ] }) }) });
991
991
  }
992
+ function BackArrow({ style, isBack = true, title = "Back" }) {
993
+ const handleBack = () => {
994
+ if (isBack) window.history.back();
995
+ };
996
+ return /* @__PURE__ */ jsx("span", { className: "ssh-back", style, onClick: handleBack, title, children: /* @__PURE__ */ jsx(SVG.LeftArrow, {}) });
997
+ }
998
+ function Warning({ message }) {
999
+ return /* @__PURE__ */ jsxs("div", { className: "ssh-scope ssh-warning", children: [
1000
+ /* @__PURE__ */ jsx(SVG.Warning, {}),
1001
+ /* @__PURE__ */ jsx("span", { className: "ssh-warning__text", children: message })
1002
+ ] });
1003
+ }
1004
+ function PreviousLoginBanner({ t: t2, router, style }) {
1005
+ const prev = CookiesUtil.get(STORAGE_VALUES.previousLoginBanner) || {};
1006
+ CookiesUtil.set(STORAGE_VALUES.previousLoginBanner, prev);
1007
+ const handleAutoLogin = async () => {
1008
+ try {
1009
+ const res = await autoLoginApi(prev?.id);
1010
+ if (res.remote === "success") {
1011
+ CookiesUtil.remove(STORAGE_VALUES.previousLoginBanner);
1012
+ if (router) {
1013
+ router.reload();
1014
+ router.replace(ROUTES.home);
1015
+ } else {
1016
+ window.location.reload();
1017
+ window.location.href = ROUTES.home;
1018
+ }
1019
+ }
1020
+ } catch {
1021
+ toast.error(t2(ALERT_MESSAGES.fallbackError));
1022
+ }
1023
+ };
1024
+ if (!prev.id || !prev.isAllowToAccess) return null;
1025
+ return /* @__PURE__ */ jsxs("div", { className: "ssh-scope ssh-banner", style, children: [
1026
+ "Go back to",
1027
+ " ",
1028
+ /* @__PURE__ */ jsx("strong", { className: "ssh-banner__link", onClick: handleAutoLogin, children: prev.name || prev.email || prev.id }),
1029
+ " ",
1030
+ "Profile"
1031
+ ] });
1032
+ }
992
1033
  function AppMenus({ menuItems, setInitialState, t: t2, appName, router }) {
993
1034
  const handleRedirection2 = (name, link, type) => {
994
1035
  if (router && name === APP_NAMES.sso && type === "tab") {
@@ -1001,38 +1042,38 @@ function AppMenus({ menuItems, setInitialState, t: t2, appName, router }) {
1001
1042
  window.open(`${link}?source=${name}`, "_blank");
1002
1043
  }
1003
1044
  };
1004
- return /* @__PURE__ */ jsx(
1005
- Dropdown,
1045
+ return /* @__PURE__ */ jsx(Dropdown, { onClose: () => handleCloseUtil(setInitialState), className: "ssh-apps ssh-scroll", children: /* @__PURE__ */ jsx("div", { className: "ssh-apps__grid", children: menuItems?.map((item, index) => /* @__PURE__ */ jsxs(
1046
+ "button",
1006
1047
  {
1007
- onClose: () => handleCloseUtil(setInitialState),
1008
- className: "ssh-scroll",
1009
- style: { maxHeight: 450, minWidth: 320 },
1010
- children: /* @__PURE__ */ jsx("div", { className: "ssh-apps__grid", children: menuItems?.map((item, index) => /* @__PURE__ */ jsxs(
1011
- "button",
1012
- {
1013
- type: "button",
1014
- className: "ssh-apps__item",
1015
- onClick: () => handleRedirection2(appName, item.link, item.type),
1016
- children: [
1017
- /* @__PURE__ */ jsx("img", { className: "ssh-apps__icon", src: item.icon, alt: item.name }),
1018
- /* @__PURE__ */ jsx("span", { className: "ssh-apps__label", children: t2(item.name) })
1019
- ]
1020
- },
1021
- index
1022
- )) })
1023
- }
1024
- );
1048
+ type: "button",
1049
+ className: "ssh-apps__item",
1050
+ onClick: () => handleRedirection2(appName, item.link, item.type),
1051
+ children: [
1052
+ /* @__PURE__ */ jsx("img", { className: "ssh-apps__icon", src: item.icon, alt: item.name }),
1053
+ /* @__PURE__ */ jsx("span", { className: "ssh-apps__label", children: t2(item.name) })
1054
+ ]
1055
+ },
1056
+ index
1057
+ )) }) });
1025
1058
  }
1026
1059
  function Language({ interFaceLangList, updateInterfaceLang, selectedInterFaceLang, setInitialState, t: t2 }) {
1027
1060
  const onPick = (lang) => {
1028
1061
  updateInterfaceLang?.(lang);
1029
1062
  setInitialState((p) => ({ ...p, toggles: { ...p.toggles, lang: false } }));
1030
1063
  };
1031
- return /* @__PURE__ */ jsx(Dropdown, { onClose: () => handleCloseUtil(setInitialState), className: "ssh-lang", children: /* @__PURE__ */ jsx("ul", { className: "ssh-lang__list ssh-scroll", children: interFaceLangList?.length ? interFaceLangList.map((lang, i) => /* @__PURE__ */ jsxs("li", { className: "ssh-lang__item", onClick: () => onPick(lang), children: [
1032
- /* @__PURE__ */ jsx("img", { className: "ssh-lang__flag", src: lang?.flag || IMAGES.DefaultLang, alt: lang?.label }),
1033
- /* @__PURE__ */ jsx("span", { className: "ssh-lang__label", children: t2(lang?.label) }),
1034
- selectedInterFaceLang?.value === lang?.value && /* @__PURE__ */ jsx(CheckIcon, { className: "ssh-lang__check" })
1035
- ] }, i)) : /* @__PURE__ */ jsx("span", { className: "ssh-lang__label", children: t2(ALERT_MESSAGES.dataNoFount) }) }) });
1064
+ return /* @__PURE__ */ jsx(Dropdown, { onClose: () => handleCloseUtil(setInitialState), className: "ssh-lang", children: /* @__PURE__ */ jsx("ul", { className: "ssh-lang__list ssh-scroll", children: interFaceLangList?.length ? interFaceLangList.map((lang, i) => /* @__PURE__ */ jsxs(
1065
+ "li",
1066
+ {
1067
+ className: `ssh-lang__item${selectedInterFaceLang?.value === lang?.value ? " ssh-lang__item--active" : ""}`,
1068
+ onClick: () => onPick(lang),
1069
+ children: [
1070
+ /* @__PURE__ */ jsx("img", { className: "ssh-lang__flag", src: lang?.flag || IMAGES.DefaultLang, alt: lang?.label }),
1071
+ /* @__PURE__ */ jsx("span", { className: "ssh-lang__label", children: t2(lang?.label) }),
1072
+ selectedInterFaceLang?.value === lang?.value && /* @__PURE__ */ jsx(CheckIcon, { className: "ssh-lang__check" })
1073
+ ]
1074
+ },
1075
+ i
1076
+ )) : /* @__PURE__ */ jsx("span", { className: "ssh-lang__label", children: t2(ALERT_MESSAGES.dataNoFount) }) }) });
1036
1077
  }
1037
1078
  function Logo({ style }) {
1038
1079
  const base2 = env.VITE_MODULES_SSO_FRONTEND_BASE_URL || "";
@@ -1389,48 +1430,8 @@ function Header({
1389
1430
  /* @__PURE__ */ jsx(ViewProfileDialog, { isOpen: state.toggles.viewProfile, userData, setInitialState: setState })
1390
1431
  ] });
1391
1432
  }
1392
- function PreviousLoginBanner({ t: t2, router, style }) {
1393
- const prev = CookiesUtil.get(STORAGE_VALUES.previousLoginBanner) || {};
1394
- CookiesUtil.set(STORAGE_VALUES.previousLoginBanner, prev);
1395
- const handleAutoLogin = async () => {
1396
- try {
1397
- const res = await autoLoginApi(prev?.id);
1398
- if (res.remote === "success") {
1399
- CookiesUtil.remove(STORAGE_VALUES.previousLoginBanner);
1400
- if (router) {
1401
- router.reload();
1402
- router.replace(ROUTES.home);
1403
- } else {
1404
- window.location.reload();
1405
- window.location.href = ROUTES.home;
1406
- }
1407
- }
1408
- } catch {
1409
- toast.error(t2(ALERT_MESSAGES.fallbackError));
1410
- }
1411
- };
1412
- if (!prev.id || !prev.isAllowToAccess) return null;
1413
- return /* @__PURE__ */ jsxs("div", { className: "ssh-scope ssh-banner", style, children: [
1414
- "Go back to",
1415
- " ",
1416
- /* @__PURE__ */ jsx("strong", { className: "ssh-banner__link", onClick: handleAutoLogin, children: prev.name || prev.email || prev.id }),
1417
- " ",
1418
- "Profile"
1419
- ] });
1420
- }
1421
- function BackArrow({ style, isBack = true, title = "Back" }) {
1422
- const handleBack = () => {
1423
- if (isBack) window.history.back();
1424
- };
1425
- return /* @__PURE__ */ jsx("span", { className: "ssh-back", style, onClick: handleBack, title, children: /* @__PURE__ */ jsx(SVG.LeftArrow, {}) });
1426
- }
1427
- function Warning({ message }) {
1428
- return /* @__PURE__ */ jsxs("div", { className: "ssh-scope ssh-warning", children: [
1429
- /* @__PURE__ */ jsx(SVG.Warning, {}),
1430
- /* @__PURE__ */ jsx("span", { className: "ssh-warning__text", children: message })
1431
- ] });
1432
- }
1433
1433
  export {
1434
+ APP_NAMES,
1434
1435
  BackArrow,
1435
1436
  ChangePasswordDialog,
1436
1437
  CookiesUtil,
@@ -1454,7 +1455,7 @@ export {
1454
1455
  try {
1455
1456
  if (typeof document != "undefined") {
1456
1457
  var elementStyle = document.createElement("style");
1457
- elementStyle.appendChild(document.createTextNode('@import url("https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&display=swap");\n\n/* ==========================================================================\n SixSeconds Header — raw, namespaced CSS.\n\n Isolation strategy (no MUI, no Shadow DOM):\n - Every class is prefixed `ssh-`, so the host app can never accidentally\n target our elements and our rules can never target the host\'s.\n - `.ssh-scope` (placed on every top-level rendered node) does `all: initial`,\n which resets the INHERITED properties (font, color, line-height, …) that\n would otherwise cascade in from the host — giving our tree a clean baseline.\n Because `.ssh-scope` is a class (0,1,0) it beats a host `div`/element rule\n (0,0,x), so it wins without `!important`.\n - Component rules use single `.ssh-*` classes (0,1,0), which beat any host\n GLOBAL element selector (`button`, `a`, `ul li`, … all 0,0,x) — so host\n resets/normalizes cannot restyle our controls. We set every property we\n care about explicitly, so nothing is left to the host.\n ========================================================================== */\n\n/* ---- scope / boundary reset ------------------------------------------------ */\n.ssh-scope {\n all: initial;\n box-sizing: border-box;\n display: block;\n font-family:\n "Inter",\n system-ui,\n -apple-system,\n "Segoe UI",\n Roboto,\n Helvetica,\n Arial,\n sans-serif;\n font-size: 14px;\n line-height: 1.5;\n color: #1a1c1e;\n text-align: left;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n.ssh-scope *,\n.ssh-scope *::before,\n.ssh-scope *::after {\n box-sizing: border-box;\n}\n.ssh-scope img,\n.ssh-scope svg {\n max-width: 100%;\n}\n.ssh-scope a {\n color: inherit;\n text-decoration: none;\n}\n.ssh-scope button {\n font-family: inherit;\n}\n\n/* colour + token helpers (kept literal so there is no theme dependency) */\n:root {\n --ssh-brand: #0073b1;\n --ssh-brand-strong: #007fc0;\n --ssh-ink: #1a1c1e;\n --ssh-muted: #5f6368;\n --ssh-line: #e0e0e0;\n --ssh-line-soft: #f1f3f4;\n --ssh-surface: #fff;\n --ssh-hover: #f8f9fa;\n --ssh-danger: #d32f2f;\n}\n\n/* ---- header bar ------------------------------------------------------------ */\n.ssh-header {\n position: fixed;\n top: 0;\n right: 0;\n left: 0;\n height: 64px;\n width: 100%;\n background: var(--ssh-surface);\n color: var(--ssh-ink);\n border-bottom: 1px solid var(--ssh-line);\n z-index: 1000;\n display: flex;\n align-items: center;\n}\n.ssh-header__inner {\n width: 100%;\n max-width: 100%;\n padding: 0 24px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n}\n.ssh-header__left,\n.ssh-header__center,\n.ssh-header__right {\n display: flex;\n align-items: center;\n}\n.ssh-header__left {\n gap: 8px;\n}\n.ssh-header__right {\n gap: 4px;\n margin: 10px 0;\n}\n.ssh-header__actions {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n}\n\n/* ---- logo ------------------------------------------------------------------ */\n.ssh-logo {\n display: flex;\n align-items: center;\n cursor: pointer;\n}\n.ssh-logo--full {\n width: 200px;\n max-width: 200px;\n}\n.ssh-logo--full svg,\n.ssh-logo--small svg {\n height: 40px;\n width: auto;\n}\n.ssh-logo--small {\n display: none;\n}\n\n/* ---- primitives: buttons --------------------------------------------------- */\n.ssh-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n font-family: inherit;\n font-size: 14px;\n font-weight: 500;\n line-height: 1.2;\n padding: 10px 16px;\n border: 1px solid transparent;\n border-radius: 8px;\n background: transparent;\n color: var(--ssh-ink);\n cursor: pointer;\n text-transform: none;\n transition:\n background 0.2s ease,\n color 0.2s ease,\n border-color 0.2s ease;\n -webkit-appearance: none;\n appearance: none;\n}\n.ssh-btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n.ssh-btn--primary {\n background: var(--ssh-brand);\n color: #fff;\n border-color: var(--ssh-brand);\n}\n.ssh-btn--primary:hover:not(:disabled) {\n background: #005a8b;\n border-color: #005a8b;\n}\n.ssh-btn--outline {\n background: transparent;\n color: var(--ssh-muted);\n border-color: var(--ssh-line);\n}\n.ssh-btn--outline:hover:not(:disabled) {\n color: var(--ssh-brand);\n border-color: var(--ssh-brand);\n background: rgba(0, 115, 177, 0.04);\n}\n.ssh-btn--danger {\n background: var(--ssh-danger);\n color: #fff;\n border-color: var(--ssh-danger);\n}\n.ssh-btn--danger:hover:not(:disabled) {\n background: #b71c1c;\n border-color: #b71c1c;\n}\n.ssh-btn--ghost {\n background: transparent;\n color: var(--ssh-muted);\n}\n.ssh-btn--ghost:hover:not(:disabled) {\n background: rgba(0, 115, 177, 0.04);\n}\n.ssh-btn--block {\n width: 100%;\n}\n\n/* ---- primitives: icon trigger --------------------------------------------- */\n.ssh-icon-trigger {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 5px;\n padding: 6px;\n border: 0;\n background: transparent;\n border-radius: 8px;\n cursor: pointer;\n color: #808080;\n transition: background 0.2s ease;\n}\n.ssh-icon-trigger:hover {\n background: var(--ssh-hover);\n}\n.ssh-icon-trigger svg {\n width: 32px;\n height: 32px;\n color: currentColor;\n}\n\n/* ---- primitives: avatar ---------------------------------------------------- */\n.ssh-avatar {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n border-radius: 50%;\n overflow: hidden;\n background: #ccc;\n color: var(--ssh-ink);\n font-weight: 600;\n font-size: 14px;\n flex-shrink: 0;\n}\n.ssh-avatar img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n}\n\n/* ---- primitives: badge ----------------------------------------------------- */\n.ssh-badge {\n position: relative;\n display: inline-flex;\n}\n.ssh-badge__count {\n position: absolute;\n top: -4px;\n right: -6px;\n min-width: 18px;\n height: 18px;\n padding: 0 5px;\n border-radius: 9px;\n background: var(--ssh-danger);\n color: #fff;\n font-size: 11px;\n font-weight: 600;\n line-height: 18px;\n text-align: center;\n}\n\n/* ---- primitives: dropdown panel ------------------------------------------- */\n.ssh-dropdown {\n position: absolute;\n top: 60px;\n right: 0;\n background: var(--ssh-surface);\n border: 1px solid var(--ssh-line);\n border-radius: 12px;\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);\n z-index: 1100;\n padding: 16px;\n}\n.ssh-dropdown--profile {\n width: 280px;\n padding: 0;\n overflow: hidden;\n}\n[dir="rtl"] .ssh-dropdown {\n right: auto;\n left: 0;\n}\n\n/* custom scrollbar for scrollable panels */\n.ssh-scroll {\n overflow-y: auto;\n overflow-x: hidden;\n}\n.ssh-scroll::-webkit-scrollbar {\n width: 6px;\n}\n.ssh-scroll::-webkit-scrollbar-track {\n background: #f1f1f1;\n border-radius: 10px;\n}\n.ssh-scroll::-webkit-scrollbar-thumb {\n background: #ccc;\n border-radius: 10px;\n}\n.ssh-scroll::-webkit-scrollbar-thumb:hover {\n background: #bbb;\n}\n\n/* ---- desktop nav menu ------------------------------------------------------ */\n.ssh-nav {\n display: flex;\n}\n.ssh-menu {\n display: flex;\n list-style: none;\n margin: 0;\n padding: 0;\n}\n.ssh-menu__item {\n position: relative;\n display: flex;\n align-items: center;\n height: 100%;\n padding: 0 16px;\n}\n.ssh-menu__link {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 8px 4px;\n font-size: 14px;\n font-weight: 500;\n color: #2a2a2a;\n transition: color 0.2s ease;\n}\n.ssh-menu__link:hover {\n color: var(--ssh-brand);\n}\n.ssh-menu__caret {\n width: 14px;\n height: 14px;\n transition: transform 0.2s ease;\n}\n.ssh-menu__item:hover .ssh-menu__caret {\n transform: rotate(180deg);\n}\n.ssh-submenu {\n position: absolute;\n top: 150%;\n left: 0;\n width: 220px;\n background: #fff;\n border: 1px solid #e2e8f0;\n border-top: 3px solid var(--ssh-brand);\n border-radius: 4px;\n box-shadow:\n 0 12px 48px rgba(0, 0, 0, 0.12),\n 0 4px 16px rgba(0, 0, 0, 0.08);\n list-style: none;\n margin: 0;\n padding: 8px 0;\n opacity: 0;\n visibility: hidden;\n transform: translateY(12px);\n transition:\n opacity 0.25s cubic-bezier(0.4, 0, 0.2, 1),\n transform 0.25s cubic-bezier(0.4, 0, 0.2, 1),\n visibility 0.25s;\n z-index: 1000;\n}\n.ssh-menu__item:hover .ssh-submenu {\n opacity: 1;\n visibility: visible;\n transform: translateY(0);\n}\n.ssh-submenu li {\n list-style: none;\n}\n.ssh-submenu__link {\n display: block;\n padding: 12px 28px;\n font-size: 14px;\n font-weight: 400;\n line-height: 1.4;\n color: #2a2a2a;\n white-space: normal;\n transition: all 0.2s ease;\n}\n.ssh-submenu__link:hover {\n background: #f0f7fb;\n color: var(--ssh-brand);\n padding-left: 32px;\n}\n\n/* ---- mobile nav menu ------------------------------------------------------- */\n.ssh-mobile-menu {\n position: fixed;\n left: 0;\n top: 64px;\n width: 100%;\n height: 95vh;\n background: #fff;\n box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05);\n padding: 8px 20px 12px;\n overflow-y: auto;\n}\n.ssh-mobile-menu__link {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n margin-bottom: 4px;\n font-size: 16px;\n font-weight: 600;\n color: #1a1c1e;\n border-bottom: 1px solid var(--ssh-line-soft);\n}\n.ssh-mobile-submenu {\n list-style: none;\n margin: 0;\n padding-left: 15px;\n background: #fbfbfc;\n}\n.ssh-mobile-submenu__link {\n display: block;\n padding: 12px 32px;\n font-size: 14px;\n font-weight: 400;\n color: #4a4d50;\n}\n\n/* ---- app menu grid --------------------------------------------------------- */\n.ssh-apps {\n padding: 16px;\n background: #fff;\n max-height: 450px;\n min-width: 320px;\n}\n.ssh-apps__grid {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 16px;\n}\n.ssh-apps__item {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: flex-start;\n gap: 8px;\n padding: 12px 8px;\n border: 0;\n border-radius: 12px;\n background: transparent;\n cursor: pointer;\n text-align: center;\n transition: background 0.2s ease;\n}\n.ssh-apps__item:hover {\n background: var(--ssh-hover);\n}\n.ssh-apps__icon {\n width: 40px;\n height: 40px;\n object-fit: contain;\n}\n.ssh-apps__label {\n font-size: 13px;\n font-weight: 500;\n line-height: 1.2;\n color: var(--ssh-ink);\n word-break: break-word;\n}\n\n/* ---- language dropdown ----------------------------------------------------- */\n.ssh-lang-trigger {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 5px;\n padding: 4px;\n border: 0;\n background: transparent;\n color: #777;\n cursor: pointer;\n}\n.ssh-lang-trigger__flag {\n width: 40px;\n height: auto;\n aspect-ratio: 3 / 2;\n object-fit: cover;\n}\n.ssh-lang {\n max-width: 333px;\n min-width: 333px;\n}\n.ssh-lang__list {\n list-style: none;\n margin: 0;\n padding: 0 16px 0 0;\n max-height: 300px;\n}\n.ssh-lang__item {\n display: flex;\n align-items: center;\n gap: 16px;\n padding: 12px 0;\n border-bottom: 1px solid var(--ssh-line-soft);\n cursor: pointer;\n transition: background 0.2s ease;\n}\n.ssh-lang__item:last-child {\n border-bottom: 0;\n}\n.ssh-lang__item:hover {\n background: var(--ssh-hover);\n}\n.ssh-lang__flag {\n width: 40px;\n height: 26px;\n aspect-ratio: 3 / 2;\n object-fit: cover;\n flex-shrink: 0;\n}\n.ssh-lang__label {\n font-size: 16px;\n font-weight: 500;\n margin: 0;\n}\n.ssh-lang__check {\n width: 24px;\n height: 24px;\n color: var(--ssh-brand-strong);\n margin-left: auto;\n}\n\n/* ---- notification dropdown ------------------------------------------------- */\n.ssh-notif {\n min-width: 420px;\n max-width: 460px;\n}\n.ssh-notif__tabs {\n display: flex;\n border-bottom: 1px solid var(--ssh-line);\n margin-bottom: 16px;\n}\n.ssh-notif__tab {\n padding: 8px 20px;\n border: 0;\n border-bottom: 2px solid transparent;\n background: transparent;\n font-size: 14px;\n font-weight: 400;\n color: var(--ssh-muted);\n text-transform: capitalize;\n cursor: pointer;\n white-space: nowrap;\n}\n.ssh-notif__tab:hover {\n background: rgba(0, 115, 177, 0.04);\n}\n.ssh-notif__tab--active {\n font-weight: 600;\n color: var(--ssh-brand);\n border-bottom-color: var(--ssh-brand);\n}\n.ssh-notif__title {\n font-size: 16px;\n font-weight: 500;\n color: #000;\n margin: 4px 0;\n}\n.ssh-notif__list {\n max-height: 300px;\n padding-right: 5px;\n}\n.ssh-notif__item {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n padding: 16px;\n cursor: pointer;\n}\n.ssh-notif__item:hover {\n background: var(--ssh-hover);\n}\n.ssh-notif__body {\n flex: 1;\n}\n.ssh-notif__name {\n font-size: 16px;\n font-weight: 500;\n color: #000;\n margin: 0;\n}\n.ssh-notif__meta {\n font-size: 14px;\n color: #666;\n}\n.ssh-notif__link {\n color: rgb(25, 118, 210);\n margin-left: 5px;\n cursor: pointer;\n}\n.ssh-notif__empty,\n.ssh-notif__loader {\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 12px;\n color: #000;\n}\n\n/* ---- user profile menu ----------------------------------------------------- */\n.ssh-profile {\n position: relative;\n}\n.ssh-profile__trigger {\n display: flex;\n align-items: center;\n gap: 2px;\n border: 0;\n background: transparent;\n cursor: pointer;\n}\n.ssh-profile__head {\n display: flex;\n align-items: center;\n gap: 16px;\n padding: 16px;\n background: var(--ssh-hover);\n border-bottom: 1px solid var(--ssh-line-soft);\n}\n.ssh-profile__avatar {\n width: 65px;\n height: 65px;\n border: 2px solid #fff;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n font-size: 22px;\n}\n.ssh-profile__id {\n flex: 1;\n min-width: 0;\n}\n.ssh-profile__name {\n font-size: 15px;\n font-weight: 600;\n color: var(--ssh-ink);\n margin: 0;\n}\n.ssh-profile__email {\n font-size: 13px;\n color: var(--ssh-muted);\n margin: 2px 0 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.ssh-profile__role {\n font-size: 11px;\n font-weight: 700;\n color: var(--ssh-brand);\n text-transform: uppercase;\n margin-top: 2px;\n}\n.ssh-profile__menu {\n list-style: none;\n margin: 0;\n padding: 8px 0;\n}\n.ssh-profile__item {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px;\n cursor: pointer;\n color: var(--ssh-ink);\n transition:\n background 0.2s ease,\n color 0.2s ease;\n}\n.ssh-profile__item:hover {\n background: var(--ssh-hover);\n color: var(--ssh-brand);\n}\n.ssh-profile__item--danger {\n border-top: 1px solid var(--ssh-line-soft);\n}\n.ssh-profile__item--danger:hover {\n color: var(--ssh-danger);\n}\n.ssh-profile__item-icon {\n width: 25px;\n height: 25px;\n color: currentColor;\n flex-shrink: 0;\n}\n.ssh-profile__item-label {\n font-size: 14px;\n font-weight: 400;\n margin: 0;\n}\n\n/* ---- dialog ---------------------------------------------------------------- */\n.ssh-dialog-overlay {\n position: fixed;\n inset: 0;\n z-index: 1300;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 16px;\n background: rgba(0, 0, 0, 0.5);\n}\n.ssh-dialog {\n width: 100%;\n max-height: calc(100vh - 64px);\n overflow-y: auto;\n background: #fff;\n border-radius: 16px;\n box-shadow: 0 12px 32px rgba(0, 0, 0, 0.12);\n}\n.ssh-dialog--xs {\n max-width: 400px;\n}\n.ssh-dialog--sm {\n max-width: 600px;\n}\n.ssh-dialog--md {\n max-width: 900px;\n}\n.ssh-dialog__close-row {\n display: flex;\n justify-content: flex-end;\n padding: 12px;\n}\n.ssh-dialog__close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 34px;\n height: 34px;\n border: 0;\n border-radius: 50%;\n background: #f5f5f5;\n color: var(--ssh-muted);\n cursor: pointer;\n}\n.ssh-dialog__close:hover {\n background: #eee;\n color: #111;\n}\n.ssh-dialog__close svg {\n width: 18px;\n height: 18px;\n}\n\n/* danger / confirm dialog */\n.ssh-danger {\n padding: 24px;\n}\n.ssh-danger__icon {\n color: var(--ssh-danger);\n width: 48px;\n height: 48px;\n}\n.ssh-danger__title {\n font-size: 20px;\n font-weight: 600;\n color: var(--ssh-ink);\n margin: 16px 0 0;\n}\n.ssh-danger__desc {\n font-size: 15px;\n font-weight: 400;\n color: var(--ssh-muted);\n margin: 8px 0 0;\n}\n.ssh-danger__actions {\n display: flex;\n align-items: center;\n gap: 16px;\n margin-top: 24px;\n}\n\n/* ---- form field ------------------------------------------------------------ */\n.ssh-field {\n display: block;\n}\n.ssh-field__label {\n display: block;\n padding: 13px 0 4px 1px;\n font-size: 14px;\n font-weight: 500;\n color: #333;\n line-height: normal;\n}\n.ssh-field__req {\n color: var(--ssh-danger);\n margin-left: 2px;\n}\n.ssh-input-wrap {\n position: relative;\n display: flex;\n align-items: center;\n}\n.ssh-input {\n width: 100%;\n height: 40px;\n padding: 0 14px;\n font-family: inherit;\n font-size: 14px;\n color: var(--ssh-ink);\n background: #fff;\n border: 1px solid var(--ssh-line);\n border-radius: 20px;\n outline: none;\n transition:\n border-color 0.2s ease,\n box-shadow 0.2s ease;\n}\n.ssh-input::placeholder {\n color: #9aa0a6;\n}\n.ssh-input:focus {\n border-color: var(--ssh-brand);\n box-shadow: 0 0 0 3px rgba(0, 115, 177, 0.12);\n}\n.ssh-input:disabled {\n background: #e9e6e6;\n}\n.ssh-input--has-toggle {\n padding-right: 42px;\n}\n.ssh-input__toggle {\n position: absolute;\n right: 12px;\n display: inline-flex;\n align-items: center;\n border: 0;\n background: transparent;\n cursor: pointer;\n color: gray;\n}\n.ssh-input__toggle svg {\n width: 18px;\n height: 18px;\n}\n\n/* ---- view profile dialog --------------------------------------------------- */\n.ssh-vp {\n padding: 0 24px 40px;\n}\n.ssh-vp__grid {\n display: grid;\n grid-template-columns: 5fr 7fr;\n gap: 48px;\n margin-top: 12px;\n}\n.ssh-vp__avatar {\n width: 150px;\n height: 150px;\n border: 4px solid var(--ssh-brand);\n box-shadow: 0 8px 24px rgba(0, 115, 177, 0.15);\n margin-bottom: 32px;\n font-size: 44px;\n}\n.ssh-vp__side {\n display: flex;\n flex-direction: column;\n gap: 20px;\n margin-left: 16px;\n}\n.ssh-vp__section-label {\n font-size: 14px;\n font-weight: 700;\n color: var(--ssh-ink);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin: 0 0 12px;\n}\n.ssh-vp__row {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n.ssh-vp__value {\n font-size: 15px;\n color: var(--ssh-muted);\n}\n.ssh-vp__chips {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}\n.ssh-chip {\n display: inline-flex;\n align-items: center;\n height: 30px;\n padding: 0 12px;\n border: 1px solid var(--ssh-line);\n border-radius: 6px;\n font-size: 13px;\n font-weight: 500;\n color: var(--ssh-ink);\n}\n.ssh-vp__name {\n font-size: 28px;\n font-weight: 700;\n color: var(--ssh-ink);\n margin: 0;\n}\n.ssh-vp__title {\n font-size: 16px;\n color: var(--ssh-brand);\n font-weight: 600;\n margin: 4px 0 16px;\n}\n.ssh-vp__bio {\n font-size: 15px;\n line-height: 1.7;\n color: var(--ssh-muted);\n}\n.ssh-vp__divider {\n height: 1px;\n background: var(--ssh-line-soft);\n border: 0;\n margin: 20px 0;\n}\n.ssh-vp__link {\n color: var(--ssh-brand);\n font-weight: 500;\n cursor: pointer;\n}\n.ssh-vp__socials {\n display: flex;\n gap: 12px;\n margin-top: 4px;\n}\n.ssh-vp__social {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 42px;\n height: 42px;\n border-radius: 10px;\n background: var(--ssh-brand);\n color: #fff;\n transition:\n background 0.2s ease,\n transform 0.2s ease;\n}\n.ssh-vp__social:hover {\n background: #005a8b;\n transform: translateY(-2px);\n}\n.ssh-vp__social svg {\n width: 18px;\n height: 18px;\n}\n.ssh-vp__facts {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 20px;\n background: #f9fafb;\n border: 1px solid var(--ssh-line-soft);\n border-radius: 12px;\n margin: 24px 0;\n}\n.ssh-vp__fact {\n display: flex;\n gap: 12px;\n}\n.ssh-vp__fact-label {\n font-weight: 600;\n color: var(--ssh-ink);\n min-width: 80px;\n font-size: 15px;\n}\n.ssh-vp__section {\n margin-bottom: 20px;\n}\n\n/* ---- change password (dialog body) ---------------------------------------- */\n.ssh-cp {\n padding: 0 24px 32px;\n}\n.ssh-cp__title {\n font-size: 22px;\n font-weight: 700;\n color: var(--ssh-ink);\n margin: 0 0 20px;\n}\n.ssh-cp__card {\n padding: 24px;\n background: #fff;\n border: 1px solid var(--ssh-line-soft);\n border-radius: 12px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.03);\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n/* ---- previous-login banner ------------------------------------------------- */\n.ssh-banner {\n width: 100%;\n padding: 6px 12px;\n margin-top: 64px;\n background: var(--ssh-brand-strong);\n color: #fff;\n text-align: center;\n font-size: 14px;\n text-transform: capitalize;\n}\n.ssh-banner__link {\n cursor: pointer;\n text-decoration: underline;\n font-weight: 600;\n}\n\n/* ---- misc elements --------------------------------------------------------- */\n.ssh-warning {\n display: flex;\n gap: 8px;\n margin-top: 16px;\n}\n.ssh-warning__text {\n font-size: 14px;\n color: var(--ssh-muted);\n}\n.ssh-error-msg {\n display: block;\n color: var(--ssh-danger);\n font-size: 13px;\n font-weight: 600;\n margin-top: 4px;\n}\n.ssh-back {\n display: inline-flex;\n align-items: center;\n justify-content: flex-start;\n margin-right: 8px;\n cursor: pointer;\n}\n.ssh-spin {\n animation: ssh-spin 0.8s linear infinite;\n}\n@keyframes ssh-spin {\n to {\n transform: rotate(360deg);\n }\n}\n\n/* ---- responsive ------------------------------------------------------------ */\n@media (max-width: 1324px) {\n .ssh-nav--desktop {\n display: none;\n }\n}\n@media (min-width: 1325px) {\n .ssh-hamburger {\n display: none;\n }\n}\n@media (max-width: 600px) {\n .ssh-header__inner {\n padding: 0 12px;\n }\n .ssh-logo--full {\n display: none;\n }\n .ssh-logo--small {\n display: flex;\n }\n .ssh-notif,\n .ssh-lang {\n min-width: 280px;\n max-width: 90vw;\n }\n .ssh-dropdown--profile {\n width: 280px;\n }\n .ssh-vp__grid {\n grid-template-columns: 1fr;\n gap: 24px;\n }\n .ssh-icon-trigger svg {\n width: 26px;\n height: 26px;\n }\n}'));
1458
+ elementStyle.appendChild(document.createTextNode('@import url("https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&display=swap");\n\n/* ==========================================================================\n SixSeconds Header — raw, namespaced CSS.\n\n Isolation strategy (no MUI, no Shadow DOM):\n - Every class is prefixed `ssh-`, so the host app can never accidentally\n target our elements and our rules can never target the host\'s.\n - `.ssh-scope` (placed on every top-level rendered node) does `all: initial`,\n which resets the INHERITED properties (font, color, line-height, …) that\n would otherwise cascade in from the host — giving our tree a clean baseline.\n Because `.ssh-scope` is a class (0,1,0) it beats a host `div`/element rule\n (0,0,x), so it wins without `!important`.\n - Component rules use single `.ssh-*` classes (0,1,0), which beat any host\n GLOBAL element selector (`button`, `a`, `ul li`, … all 0,0,x) — so host\n resets/normalizes cannot restyle our controls. We set every property we\n care about explicitly, so nothing is left to the host.\n ========================================================================== */\n\n/* ---- scope / boundary reset ------------------------------------------------ */\n.ssh-scope {\n all: initial;\n box-sizing: border-box;\n display: block;\n font-family:\n "Inter",\n system-ui,\n -apple-system,\n "Segoe UI",\n Roboto,\n Helvetica,\n Arial,\n sans-serif;\n font-size: 14px;\n line-height: 1.5;\n color: #1a1c1e;\n text-align: left;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n.ssh-scope *,\n.ssh-scope *::before,\n.ssh-scope *::after {\n box-sizing: border-box;\n}\n.ssh-scope img,\n.ssh-scope svg {\n max-width: 100%;\n}\n.ssh-scope a {\n color: inherit;\n text-decoration: none;\n}\n.ssh-scope button {\n font-family: inherit;\n}\n\n/* colour + token helpers (kept literal so there is no theme dependency) */\n:root {\n --ssh-brand: #0073b1;\n --ssh-brand-strong: #007fc0;\n --ssh-brand-soft: rgba(0, 115, 177, 0.08);\n --ssh-ink: #1a1c1e;\n --ssh-muted: #5f6368;\n --ssh-line: #e0e0e0;\n --ssh-line-soft: #f1f3f4;\n --ssh-surface: #fff;\n --ssh-hover: #f8f9fa;\n --ssh-danger: #d32f2f;\n --ssh-danger-soft: rgba(211, 47, 47, 0.08);\n /* layered elevation for panels + dialogs */\n --ssh-shadow-panel: 0 2px 4px rgba(16, 24, 40, 0.04), 0 12px 32px -8px rgba(16, 24, 40, 0.16);\n --ssh-shadow-dialog: 0 4px 8px rgba(16, 24, 40, 0.06), 0 24px 56px -12px rgba(16, 24, 40, 0.28);\n --ssh-radius: 14px;\n --ssh-ease: cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n/* ---- motion primitives ----------------------------------------------------- */\n@keyframes ssh-fade-in {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n@keyframes ssh-pop-in {\n from {\n opacity: 0;\n transform: translateY(-8px) scale(0.97);\n }\n to {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n}\n@keyframes ssh-dialog-in {\n from {\n opacity: 0;\n transform: translateY(12px) scale(0.98);\n }\n to {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n}\n@media (prefers-reduced-motion: reduce) {\n .ssh-scope *,\n .ssh-dialog-overlay,\n .ssh-dialog,\n .ssh-dropdown {\n animation-duration: 0.001ms !important;\n animation-iteration-count: 1 !important;\n transition-duration: 0.001ms !important;\n }\n}\n\n/* ---- header bar ------------------------------------------------------------ */\n.ssh-header {\n position: fixed;\n top: 0;\n right: 0;\n left: 0;\n height: 64px;\n width: 100%;\n background: var(--ssh-surface);\n color: var(--ssh-ink);\n border-bottom: 1px solid var(--ssh-line);\n z-index: 1000;\n display: flex;\n align-items: center;\n}\n.ssh-header__inner {\n width: 100%;\n max-width: 100%;\n padding: 0 24px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n}\n.ssh-header__left,\n.ssh-header__center,\n.ssh-header__right {\n display: flex;\n align-items: center;\n}\n.ssh-header__left {\n gap: 8px;\n}\n.ssh-header__right {\n gap: 4px;\n margin: 10px 0;\n}\n.ssh-header__actions {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n}\n\n/* ---- logo ------------------------------------------------------------------ */\n.ssh-logo {\n display: flex;\n align-items: center;\n cursor: pointer;\n}\n.ssh-logo--full {\n width: 200px;\n max-width: 200px;\n}\n.ssh-logo--full svg,\n.ssh-logo--small svg {\n height: 40px;\n width: auto;\n}\n.ssh-logo--small {\n display: none;\n}\n\n/* ---- primitives: buttons --------------------------------------------------- */\n.ssh-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n font-family: inherit;\n font-size: 14px;\n font-weight: 500;\n line-height: 1.2;\n padding: 10px 16px;\n border: 1px solid transparent;\n border-radius: 8px;\n background: transparent;\n color: var(--ssh-ink);\n cursor: pointer;\n text-transform: none;\n transition:\n background 0.2s ease,\n color 0.2s ease,\n border-color 0.2s ease;\n -webkit-appearance: none;\n appearance: none;\n}\n.ssh-btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n.ssh-btn--primary {\n background: var(--ssh-brand);\n color: #fff;\n border-color: var(--ssh-brand);\n}\n.ssh-btn--primary:hover:not(:disabled) {\n background: #005a8b;\n border-color: #005a8b;\n}\n.ssh-btn--outline {\n background: transparent;\n color: var(--ssh-muted);\n border-color: var(--ssh-line);\n}\n.ssh-btn--outline:hover:not(:disabled) {\n color: var(--ssh-brand);\n border-color: var(--ssh-brand);\n background: rgba(0, 115, 177, 0.04);\n}\n.ssh-btn--danger {\n background: var(--ssh-danger);\n color: #fff;\n border-color: var(--ssh-danger);\n}\n.ssh-btn--danger:hover:not(:disabled) {\n background: #b71c1c;\n border-color: #b71c1c;\n}\n.ssh-btn--ghost {\n background: transparent;\n color: var(--ssh-muted);\n}\n.ssh-btn--ghost:hover:not(:disabled) {\n background: rgba(0, 115, 177, 0.04);\n}\n.ssh-btn--block {\n width: 100%;\n}\n\n/* ---- primitives: icon trigger --------------------------------------------- */\n.ssh-icon-trigger {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 5px;\n padding: 6px;\n border: 0;\n background: transparent;\n border-radius: 8px;\n cursor: pointer;\n color: #808080;\n transition: background 0.2s ease;\n}\n.ssh-icon-trigger:hover {\n background: var(--ssh-hover);\n}\n.ssh-icon-trigger svg {\n width: 32px;\n height: 32px;\n color: currentColor;\n}\n\n/* ---- primitives: avatar ---------------------------------------------------- */\n.ssh-avatar {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n border-radius: 50%;\n overflow: hidden;\n background: #ccc;\n color: var(--ssh-ink);\n font-weight: 600;\n font-size: 14px;\n flex-shrink: 0;\n}\n.ssh-avatar img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n}\n\n/* ---- primitives: badge ----------------------------------------------------- */\n.ssh-badge {\n position: relative;\n display: inline-flex;\n}\n.ssh-badge__count {\n position: absolute;\n top: -4px;\n right: -6px;\n min-width: 18px;\n height: 18px;\n padding: 0 5px;\n border-radius: 9px;\n background: var(--ssh-danger);\n color: #fff;\n font-size: 11px;\n font-weight: 600;\n line-height: 18px;\n text-align: center;\n}\n\n/* ---- primitives: dropdown panel ------------------------------------------- */\n.ssh-dropdown {\n position: absolute;\n top: 60px;\n right: 0;\n background: var(--ssh-surface);\n border: 1px solid var(--ssh-line-soft);\n border-radius: var(--ssh-radius);\n box-shadow: var(--ssh-shadow-panel);\n z-index: 1100;\n padding: 16px;\n transform-origin: top right;\n animation: ssh-pop-in 0.22s var(--ssh-ease);\n}\n[dir="rtl"] .ssh-dropdown {\n transform-origin: top left;\n}\n.ssh-dropdown--profile {\n width: 280px;\n padding: 0;\n overflow: hidden;\n}\n[dir="rtl"] .ssh-dropdown {\n right: auto;\n left: 0;\n}\n\n/* custom scrollbar for scrollable panels */\n.ssh-scroll {\n overflow-y: auto;\n overflow-x: hidden;\n}\n.ssh-scroll::-webkit-scrollbar {\n width: 6px;\n}\n.ssh-scroll::-webkit-scrollbar-track {\n background: #f1f1f1;\n border-radius: 10px;\n}\n.ssh-scroll::-webkit-scrollbar-thumb {\n background: #ccc;\n border-radius: 10px;\n}\n.ssh-scroll::-webkit-scrollbar-thumb:hover {\n background: #bbb;\n}\n\n/* ---- desktop nav menu ------------------------------------------------------ */\n.ssh-nav {\n display: flex;\n}\n.ssh-menu {\n display: flex;\n list-style: none;\n margin: 0;\n padding: 0;\n}\n.ssh-menu__item {\n position: relative;\n display: flex;\n align-items: center;\n height: 100%;\n padding: 0 16px;\n}\n.ssh-menu__link {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 8px 4px;\n font-size: 14px;\n font-weight: 500;\n color: #2a2a2a;\n transition: color 0.2s ease;\n}\n.ssh-menu__link:hover {\n color: var(--ssh-brand);\n}\n.ssh-menu__caret {\n width: 14px;\n height: 14px;\n transition: transform 0.2s ease;\n}\n.ssh-menu__item:hover .ssh-menu__caret {\n transform: rotate(180deg);\n}\n.ssh-submenu {\n position: absolute;\n top: 150%;\n left: 0;\n width: 220px;\n background: #fff;\n border: 1px solid #e2e8f0;\n border-top: 3px solid var(--ssh-brand);\n border-radius: 4px;\n box-shadow:\n 0 12px 48px rgba(0, 0, 0, 0.12),\n 0 4px 16px rgba(0, 0, 0, 0.08);\n list-style: none;\n margin: 0;\n padding: 8px 0;\n opacity: 0;\n visibility: hidden;\n transform: translateY(12px);\n transition:\n opacity 0.25s cubic-bezier(0.4, 0, 0.2, 1),\n transform 0.25s cubic-bezier(0.4, 0, 0.2, 1),\n visibility 0.25s;\n z-index: 1000;\n}\n.ssh-menu__item:hover .ssh-submenu {\n opacity: 1;\n visibility: visible;\n transform: translateY(0);\n}\n.ssh-submenu li {\n list-style: none;\n}\n.ssh-submenu__link {\n display: block;\n padding: 12px 28px;\n font-size: 14px;\n font-weight: 400;\n line-height: 1.4;\n color: #2a2a2a;\n white-space: normal;\n transition: all 0.2s ease;\n}\n.ssh-submenu__link:hover {\n background: #f0f7fb;\n color: var(--ssh-brand);\n padding-left: 32px;\n}\n\n/* ---- mobile nav menu ------------------------------------------------------- */\n.ssh-mobile-menu {\n position: fixed;\n left: 0;\n top: 64px;\n width: 100%;\n height: 95vh;\n background: #fff;\n box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05);\n padding: 8px 20px 12px;\n overflow-y: auto;\n}\n.ssh-mobile-menu__link {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n margin-bottom: 4px;\n font-size: 16px;\n font-weight: 600;\n color: #1a1c1e;\n border-bottom: 1px solid var(--ssh-line-soft);\n}\n.ssh-mobile-submenu {\n list-style: none;\n margin: 0;\n padding-left: 15px;\n background: #fbfbfc;\n}\n.ssh-mobile-submenu__link {\n display: block;\n padding: 12px 32px;\n font-size: 14px;\n font-weight: 400;\n color: #4a4d50;\n}\n\n/* ---- app menu grid --------------------------------------------------------- */\n.ssh-apps {\n padding: 16px;\n background: #fff;\n max-height: 450px;\n min-width: 480px;\n}\n.ssh-apps__grid {\n display: grid;\n grid-template-columns: repeat(3, minmax(0, 1fr));\n gap: 10px;\n}\n.ssh-apps__item {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: flex-start;\n gap: 10px;\n padding: 16px 10px;\n min-width: 0;\n border: 1px solid transparent;\n border-radius: 12px;\n background: transparent;\n cursor: pointer;\n text-align: center;\n transition:\n background 0.2s ease,\n border-color 0.2s ease,\n box-shadow 0.2s ease,\n transform 0.2s var(--ssh-ease);\n}\n.ssh-apps__item:hover {\n background: var(--ssh-surface);\n border-color: var(--ssh-line-soft);\n box-shadow: var(--ssh-shadow-panel);\n transform: translateY(-3px);\n}\n.ssh-apps__icon {\n width: 40px;\n height: 40px;\n object-fit: contain;\n transition: transform 0.2s var(--ssh-ease);\n}\n.ssh-apps__item:hover .ssh-apps__icon {\n transform: scale(1.08);\n}\n.ssh-apps__label {\n font-size: 13px;\n font-weight: 500;\n line-height: 1.3;\n color: var(--ssh-ink);\n /* wrap only between whole words — never split a word mid-character */\n word-break: normal;\n overflow-wrap: normal;\n hyphens: none;\n}\n\n/* ---- language dropdown ----------------------------------------------------- */\n.ssh-lang-trigger {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 5px;\n padding: 4px;\n border: 0;\n background: transparent;\n color: #777;\n cursor: pointer;\n}\n.ssh-lang-trigger__flag {\n width: 40px;\n height: auto;\n aspect-ratio: 3 / 2;\n object-fit: cover;\n}\n.ssh-lang {\n max-width: 333px;\n min-width: 333px;\n padding: 8px;\n}\n.ssh-lang__list {\n list-style: none;\n margin: 0;\n padding: 0 4px 0 0;\n max-height: 320px;\n}\n.ssh-lang__item {\n display: flex;\n align-items: center;\n gap: 14px;\n padding: 10px 12px;\n border-radius: 10px;\n cursor: pointer;\n transition:\n background 0.18s ease,\n color 0.18s ease;\n}\n.ssh-lang__item:hover {\n background: var(--ssh-brand-soft);\n}\n.ssh-lang__item:hover .ssh-lang__label {\n color: var(--ssh-brand);\n}\n.ssh-lang__item--active {\n background: var(--ssh-brand-soft);\n}\n.ssh-lang__item--active .ssh-lang__label {\n color: var(--ssh-brand);\n font-weight: 600;\n}\n.ssh-lang__flag {\n width: 40px;\n height: 26px;\n aspect-ratio: 3 / 2;\n object-fit: cover;\n border-radius: 4px;\n box-shadow: 0 0 0 1px var(--ssh-line-soft);\n flex-shrink: 0;\n}\n.ssh-lang__label {\n font-size: 15px;\n font-weight: 500;\n margin: 0;\n transition: color 0.18s ease;\n}\n.ssh-lang__check {\n width: 22px;\n height: 22px;\n color: var(--ssh-brand-strong);\n margin-left: auto;\n}\n\n/* ---- notification dropdown ------------------------------------------------- */\n.ssh-notif {\n min-width: 420px;\n max-width: 460px;\n}\n.ssh-notif__tabs {\n display: flex;\n border-bottom: 1px solid var(--ssh-line);\n margin-bottom: 16px;\n}\n.ssh-notif__tab {\n padding: 8px 20px;\n border: 0;\n border-bottom: 2px solid transparent;\n background: transparent;\n font-size: 14px;\n font-weight: 400;\n color: var(--ssh-muted);\n text-transform: capitalize;\n cursor: pointer;\n white-space: nowrap;\n}\n.ssh-notif__tab:hover {\n background: rgba(0, 115, 177, 0.04);\n}\n.ssh-notif__tab--active {\n font-weight: 600;\n color: var(--ssh-brand);\n border-bottom-color: var(--ssh-brand);\n}\n.ssh-notif__title {\n font-size: 16px;\n font-weight: 500;\n color: #000;\n margin: 4px 0;\n}\n.ssh-notif__list {\n max-height: 300px;\n padding-right: 5px;\n}\n.ssh-notif__item {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n padding: 16px;\n cursor: pointer;\n}\n.ssh-notif__item:hover {\n background: var(--ssh-hover);\n}\n.ssh-notif__body {\n flex: 1;\n}\n.ssh-notif__name {\n font-size: 16px;\n font-weight: 500;\n color: #000;\n margin: 0;\n}\n.ssh-notif__meta {\n font-size: 14px;\n color: #666;\n}\n.ssh-notif__link {\n color: rgb(25, 118, 210);\n margin-left: 5px;\n cursor: pointer;\n}\n.ssh-notif__empty,\n.ssh-notif__loader {\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 12px;\n color: #000;\n}\n\n/* ---- user profile menu ----------------------------------------------------- */\n.ssh-profile {\n position: relative;\n}\n.ssh-profile__trigger {\n display: flex;\n align-items: center;\n gap: 2px;\n border: 0;\n background: transparent;\n cursor: pointer;\n}\n.ssh-profile__head {\n display: flex;\n align-items: center;\n gap: 16px;\n padding: 20px 16px;\n background: linear-gradient(135deg, rgba(0, 115, 177, 0.1), rgba(0, 127, 192, 0.02));\n border-bottom: 1px solid var(--ssh-line-soft);\n}\n.ssh-profile__avatar {\n width: 64px;\n height: 64px;\n border: 3px solid #fff;\n box-shadow:\n 0 0 0 1px var(--ssh-line-soft),\n 0 4px 12px rgba(0, 115, 177, 0.2);\n font-size: 22px;\n}\n.ssh-profile__id {\n flex: 1;\n min-width: 0;\n}\n.ssh-profile__name {\n font-size: 15px;\n font-weight: 600;\n color: var(--ssh-ink);\n margin: 0;\n}\n.ssh-profile__email {\n font-size: 13px;\n color: var(--ssh-muted);\n margin: 2px 0 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.ssh-profile__role {\n font-size: 11px;\n font-weight: 700;\n color: var(--ssh-brand);\n text-transform: uppercase;\n margin-top: 2px;\n}\n.ssh-profile__menu {\n list-style: none;\n margin: 0;\n padding: 8px;\n}\n.ssh-profile__item {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 11px 12px;\n border-radius: 10px;\n cursor: pointer;\n color: var(--ssh-ink);\n transition:\n background 0.18s ease,\n color 0.18s ease;\n}\n.ssh-profile__item:hover {\n background: var(--ssh-brand-soft);\n color: var(--ssh-brand);\n}\n.ssh-profile__item--danger {\n margin-top: 6px;\n position: relative;\n}\n.ssh-profile__item--danger::before {\n content: "";\n position: absolute;\n top: -3px;\n left: 12px;\n right: 12px;\n height: 1px;\n background: var(--ssh-line-soft);\n}\n.ssh-profile__item--danger:hover {\n background: var(--ssh-danger-soft);\n color: var(--ssh-danger);\n}\n.ssh-profile__item-icon {\n width: 25px;\n height: 25px;\n color: currentColor;\n flex-shrink: 0;\n}\n.ssh-profile__item-label {\n font-size: 14px;\n font-weight: 400;\n margin: 0;\n}\n\n/* ---- dialog ---------------------------------------------------------------- */\n.ssh-dialog-overlay {\n position: fixed;\n inset: 0;\n z-index: 1300;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 16px;\n background: rgba(16, 24, 40, 0.5);\n -webkit-backdrop-filter: blur(4px);\n backdrop-filter: blur(4px);\n animation: ssh-fade-in 0.2s ease;\n}\n.ssh-dialog {\n position: relative;\n width: 100%;\n max-height: calc(100vh - 64px);\n overflow-y: auto;\n background: #fff;\n border-radius: 18px;\n box-shadow: var(--ssh-shadow-dialog);\n animation: ssh-dialog-in 0.28s var(--ssh-ease);\n}\n.ssh-dialog--xs {\n max-width: 400px;\n}\n.ssh-dialog--sm {\n max-width: 600px;\n}\n.ssh-dialog--md {\n max-width: 900px;\n}\n.ssh-dialog__close-row {\n position: sticky;\n top: 0;\n display: flex;\n justify-content: flex-end;\n padding: 12px;\n z-index: 1;\n}\n.ssh-dialog__close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 34px;\n height: 34px;\n border: 0;\n border-radius: 50%;\n background: #f2f4f7;\n color: var(--ssh-muted);\n cursor: pointer;\n transition:\n background 0.18s ease,\n color 0.18s ease,\n transform 0.18s ease;\n}\n.ssh-dialog__close:hover {\n background: #e4e7ec;\n color: #111;\n transform: rotate(90deg);\n}\n.ssh-dialog__close svg {\n width: 18px;\n height: 18px;\n}\n\n/* danger / confirm dialog */\n.ssh-danger {\n padding: 8px 28px 28px;\n text-align: center;\n}\n.ssh-danger__icon {\n color: var(--ssh-danger);\n width: 40px;\n height: 40px;\n padding: 14px;\n border-radius: 50%;\n background: var(--ssh-danger-soft);\n box-sizing: content-box;\n}\n.ssh-danger__title {\n font-size: 20px;\n font-weight: 600;\n color: var(--ssh-ink);\n margin: 16px 0 0;\n}\n.ssh-danger__desc {\n font-size: 15px;\n font-weight: 400;\n color: var(--ssh-muted);\n margin: 8px 0 0;\n}\n.ssh-danger__actions {\n display: flex;\n align-items: center;\n gap: 16px;\n margin-top: 24px;\n}\n\n/* ---- form field ------------------------------------------------------------ */\n.ssh-field {\n display: block;\n}\n.ssh-field__label {\n display: block;\n padding: 13px 0 4px 1px;\n font-size: 14px;\n font-weight: 500;\n color: #333;\n line-height: normal;\n}\n.ssh-field__req {\n color: var(--ssh-danger);\n margin-left: 2px;\n}\n.ssh-input-wrap {\n position: relative;\n display: flex;\n align-items: center;\n}\n.ssh-input {\n width: 100%;\n height: 40px;\n padding: 0 14px;\n font-family: inherit;\n font-size: 14px;\n color: var(--ssh-ink);\n background: #fff;\n border: 1px solid var(--ssh-line);\n border-radius: 20px;\n outline: none;\n transition:\n border-color 0.2s ease,\n box-shadow 0.2s ease;\n}\n.ssh-input::placeholder {\n color: #9aa0a6;\n}\n.ssh-input:focus {\n border-color: var(--ssh-brand);\n box-shadow: 0 0 0 3px rgba(0, 115, 177, 0.12);\n}\n.ssh-input:disabled {\n background: #e9e6e6;\n}\n.ssh-input--has-toggle {\n padding-right: 42px;\n}\n.ssh-input__toggle {\n position: absolute;\n right: 12px;\n display: inline-flex;\n align-items: center;\n border: 0;\n background: transparent;\n cursor: pointer;\n color: gray;\n}\n.ssh-input__toggle svg {\n width: 18px;\n height: 18px;\n}\n\n/* ---- view profile dialog --------------------------------------------------- */\n.ssh-vp {\n padding: 0 24px 40px;\n}\n.ssh-vp__grid {\n display: grid;\n grid-template-columns: 5fr 7fr;\n gap: 48px;\n margin-top: 12px;\n}\n.ssh-vp__avatar {\n width: 150px;\n height: 150px;\n border: 4px solid var(--ssh-brand);\n box-shadow: 0 8px 24px rgba(0, 115, 177, 0.15);\n margin-bottom: 32px;\n font-size: 44px;\n}\n.ssh-vp__side {\n display: flex;\n flex-direction: column;\n gap: 20px;\n margin-left: 16px;\n}\n.ssh-vp__section-label {\n font-size: 14px;\n font-weight: 700;\n color: var(--ssh-ink);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin: 0 0 12px;\n}\n.ssh-vp__row {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n.ssh-vp__value {\n font-size: 15px;\n color: var(--ssh-muted);\n}\n.ssh-vp__chips {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}\n.ssh-chip {\n display: inline-flex;\n align-items: center;\n height: 30px;\n padding: 0 12px;\n border: 1px solid var(--ssh-line);\n border-radius: 6px;\n font-size: 13px;\n font-weight: 500;\n color: var(--ssh-ink);\n}\n.ssh-vp__name {\n font-size: 28px;\n font-weight: 700;\n color: var(--ssh-ink);\n margin: 0;\n}\n.ssh-vp__title {\n font-size: 16px;\n color: var(--ssh-brand);\n font-weight: 600;\n margin: 4px 0 16px;\n}\n.ssh-vp__bio {\n font-size: 15px;\n line-height: 1.7;\n color: var(--ssh-muted);\n}\n.ssh-vp__divider {\n height: 1px;\n background: var(--ssh-line-soft);\n border: 0;\n margin: 20px 0;\n}\n.ssh-vp__link {\n color: var(--ssh-brand);\n font-weight: 500;\n cursor: pointer;\n}\n.ssh-vp__socials {\n display: flex;\n gap: 12px;\n margin-top: 4px;\n}\n.ssh-vp__social {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 42px;\n height: 42px;\n border-radius: 10px;\n background: var(--ssh-brand);\n color: #fff;\n transition:\n background 0.2s ease,\n transform 0.2s ease;\n}\n.ssh-vp__social:hover {\n background: #005a8b;\n transform: translateY(-2px);\n}\n.ssh-vp__social svg {\n width: 18px;\n height: 18px;\n}\n.ssh-vp__facts {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 20px;\n background: #f9fafb;\n border: 1px solid var(--ssh-line-soft);\n border-radius: 12px;\n margin: 24px 0;\n}\n.ssh-vp__fact {\n display: flex;\n gap: 12px;\n}\n.ssh-vp__fact-label {\n font-weight: 600;\n color: var(--ssh-ink);\n min-width: 80px;\n font-size: 15px;\n}\n.ssh-vp__section {\n margin-bottom: 20px;\n}\n\n/* ---- change password (dialog body) ---------------------------------------- */\n.ssh-cp {\n padding: 0 24px 32px;\n}\n.ssh-cp__title {\n font-size: 22px;\n font-weight: 700;\n color: var(--ssh-ink);\n margin: 0 0 20px;\n}\n.ssh-cp__card {\n padding: 24px;\n background: #fff;\n border: 1px solid var(--ssh-line-soft);\n border-radius: 12px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.03);\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n/* ---- previous-login banner ------------------------------------------------- */\n.ssh-banner {\n width: 100%;\n padding: 6px 12px;\n margin-top: 64px;\n background: var(--ssh-brand-strong);\n color: #fff;\n text-align: center;\n font-size: 14px;\n text-transform: capitalize;\n}\n.ssh-banner__link {\n cursor: pointer;\n text-decoration: underline;\n font-weight: 600;\n}\n\n/* ---- misc elements --------------------------------------------------------- */\n.ssh-warning {\n display: flex;\n gap: 8px;\n margin-top: 16px;\n}\n.ssh-warning__text {\n font-size: 14px;\n color: var(--ssh-muted);\n}\n.ssh-error-msg {\n display: block;\n color: var(--ssh-danger);\n font-size: 13px;\n font-weight: 600;\n margin-top: 4px;\n}\n.ssh-back {\n display: inline-flex;\n align-items: center;\n justify-content: flex-start;\n margin-right: 8px;\n cursor: pointer;\n}\n.ssh-spin {\n animation: ssh-spin 0.8s linear infinite;\n}\n@keyframes ssh-spin {\n to {\n transform: rotate(360deg);\n }\n}\n\n/* ---- responsive ------------------------------------------------------------ */\n@media (max-width: 1324px) {\n .ssh-nav--desktop {\n display: none;\n }\n}\n@media (min-width: 1325px) {\n .ssh-hamburger {\n display: none;\n }\n}\n@media (max-width: 600px) {\n .ssh-header__inner {\n padding: 0 12px;\n }\n .ssh-logo--full {\n display: none;\n }\n .ssh-logo--small {\n display: flex;\n }\n .ssh-notif,\n .ssh-lang {\n min-width: 280px;\n max-width: 90vw;\n }\n .ssh-apps {\n min-width: 300px;\n max-width: 92vw;\n }\n .ssh-dropdown--profile {\n width: 280px;\n }\n .ssh-vp__grid {\n grid-template-columns: 1fr;\n gap: 24px;\n }\n .ssh-icon-trigger svg {\n width: 26px;\n height: 26px;\n }\n}'));
1458
1459
  document.head.appendChild(elementStyle);
1459
1460
  }
1460
1461
  } catch (e) {