uibee 2.3.1 → 2.3.3

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/globals.css CHANGED
@@ -1,4 +1,4 @@
1
- /*! tailwindcss v4.1.13 | MIT License | https://tailwindcss.com */
1
+ /*! tailwindcss v4.1.17 | MIT License | https://tailwindcss.com */
2
2
  @layer properties;
3
3
  @layer theme, base, components, utilities;
4
4
  @layer theme {
@@ -359,6 +359,16 @@
359
359
  .mx-auto {
360
360
  margin-inline: auto;
361
361
  }
362
+ .highlighted-section {
363
+ line-height: 1.8rem;
364
+ border-left: .3rem solid var(--color-login);
365
+ max-width: 50rem;
366
+ margin-top: 1.2rem;
367
+ margin-bottom: 1.2rem;
368
+ padding: .5rem 0 .5rem 1rem;
369
+ font-size: 1.2rem;
370
+ font-weight: 500;
371
+ }
362
372
  .-mt-0\.5 {
363
373
  margin-top: calc(var(--spacing) * -0.5);
364
374
  }
@@ -512,11 +522,11 @@
512
522
  .max-w-6xl {
513
523
  max-width: var(--container-6xl);
514
524
  }
515
- .max-w-\[35rem\] {
516
- max-width: 35rem;
525
+ .max-w-140 {
526
+ max-width: calc(var(--spacing) * 140);
517
527
  }
518
- .max-w-\[50rem\] {
519
- max-width: 50rem;
528
+ .max-w-200 {
529
+ max-width: calc(var(--spacing) * 200);
520
530
  }
521
531
  .max-w-md {
522
532
  max-width: var(--container-md);
@@ -533,6 +543,9 @@
533
543
  .flex-shrink-0 {
534
544
  flex-shrink: 0;
535
545
  }
546
+ .shrink-0 {
547
+ flex-shrink: 0;
548
+ }
536
549
  .origin-\[0\] {
537
550
  transform-origin: 0;
538
551
  }
@@ -1041,6 +1054,10 @@
1041
1054
  --tw-duration: 500ms;
1042
1055
  transition-duration: 500ms;
1043
1056
  }
1057
+ .duration-600 {
1058
+ --tw-duration: 600ms;
1059
+ transition-duration: 600ms;
1060
+ }
1044
1061
  .duration-1000 {
1045
1062
  --tw-duration: 1000ms;
1046
1063
  transition-duration: 1000ms;
@@ -1049,10 +1066,6 @@
1049
1066
  --tw-duration: 400ms;
1050
1067
  transition-duration: 400ms;
1051
1068
  }
1052
- .duration-\[600ms\] {
1053
- --tw-duration: 600ms;
1054
- transition-duration: 600ms;
1055
- }
1056
1069
  .ease-in-out {
1057
1070
  --tw-ease: var(--ease-in-out);
1058
1071
  transition-timing-function: var(--ease-in-out);
@@ -1211,16 +1224,16 @@
1211
1224
  left: calc(1/2 * 100%);
1212
1225
  }
1213
1226
  }
1214
- .before\:h-\[10px\] {
1227
+ .before\:h-2\.5 {
1215
1228
  &::before {
1216
1229
  content: var(--tw-content);
1217
- height: 10px;
1230
+ height: calc(var(--spacing) * 2.5);
1218
1231
  }
1219
1232
  }
1220
- .before\:w-\[10px\] {
1233
+ .before\:w-2\.5 {
1221
1234
  &::before {
1222
1235
  content: var(--tw-content);
1223
- width: 10px;
1236
+ width: calc(var(--spacing) * 2.5);
1224
1237
  }
1225
1238
  }
1226
1239
  .before\:-translate-x-1\/2 {
@@ -0,0 +1,4 @@
1
+ export default function Highlight({ children, className }: {
2
+ children: React.ReactNode;
3
+ className?: string;
4
+ }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,4 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ export default function Highlight({ children, className }) {
3
+ return _jsx("div", { className: `highlighted-section ${className ?? ''}`, children: children });
4
+ }
@@ -10,7 +10,8 @@ export { default as LanguageToggle } from './toggle/language';
10
10
  export { default as Navbar } from './navbar/navbar';
11
11
  export { default as NavItem } from './navbar/navbarItem';
12
12
  export { default as NavDropdown } from './navbar/navbarDropdown';
13
+ export { default as PageContainer } from './container/page';
14
+ export { default as Highlight } from './container/highlight';
13
15
  export { default as VersionTag } from './version/version';
14
16
  export { default as LoginPage } from './login/loginPage';
15
17
  export { default as Toaster, addToast } from './toast/toaster';
16
- export { default as PageContainer } from './container/page';
@@ -14,8 +14,10 @@ export { default as LanguageToggle } from './toggle/language';
14
14
  export { default as Navbar } from './navbar/navbar';
15
15
  export { default as NavItem } from './navbar/navbarItem';
16
16
  export { default as NavDropdown } from './navbar/navbarDropdown';
17
+ // Containers
18
+ export { default as PageContainer } from './container/page';
19
+ export { default as Highlight } from './container/highlight';
17
20
  // Other components
18
21
  export { default as VersionTag } from './version/version';
19
22
  export { default as LoginPage } from './login/loginPage';
20
23
  export { default as Toaster, addToast } from './toast/toaster';
21
- export { default as PageContainer } from './container/page';
@@ -1,13 +1,14 @@
1
1
  import React from 'react';
2
2
  import { Language } from 'uibee/components';
3
3
  export type NavbarProps = {
4
- lang: Language;
4
+ lang?: Language;
5
5
  disableLanguageToggle?: boolean;
6
6
  onlyLogo?: boolean;
7
- theme: string;
7
+ theme?: string;
8
8
  disableThemeToggle?: boolean;
9
- token: string | null;
9
+ token?: string | null;
10
10
  disableAuthButton?: boolean;
11
+ profileURL?: string;
11
12
  children: React.ReactNode;
12
13
  };
13
- export default function Navbar({ lang, onlyLogo, token, children, disableLanguageToggle, disableThemeToggle, disableAuthButton }: NavbarProps): import("react/jsx-runtime").JSX.Element;
14
+ export default function Navbar({ lang, onlyLogo, children, disableLanguageToggle, disableThemeToggle, disableAuthButton, profileURL }: NavbarProps): import("react/jsx-runtime").JSX.Element;
@@ -5,15 +5,16 @@ import Link from 'next/link';
5
5
  import LogoSmall from '../logo/logoSmall';
6
6
  import LanguageToggle from '../toggle/language';
7
7
  import ThemeToggle from '../toggle/theme';
8
+ import { getCookie } from 'uibee/utils';
8
9
  import { LogOut } from 'lucide-react';
9
10
  function hamburgerStyle(isOpen, isSecond) {
10
11
  return `bg-login-50 h-0.5 absolute w-8 transition-all duration-[400ms] left-2 ${isOpen
11
12
  ? `top-6 ${isSecond ? 'rotate-45' : '-rotate-45'}`
12
13
  : isSecond ? 'top-7' : 'top-4'}`;
13
14
  }
14
- export default function Navbar({ lang, onlyLogo, token, children, disableLanguageToggle, disableThemeToggle, disableAuthButton }) {
15
+ export default function Navbar({ lang, onlyLogo, children, disableLanguageToggle, disableThemeToggle, disableAuthButton, profileURL }) {
15
16
  const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false);
16
- return (_jsx("div", { className: `${isMobileMenuOpen ? 'bg-[#181818f0]' : 'bg-[#18181899]'} backdrop-blur-xl fixed top-0 z-900 w-full`, children: _jsxs("div", { className: `flex w-full max-w-6xl m-auto p-2 transition duration-500 800px:justify-between 800px:p-4 ${isMobileMenuOpen ? 'h-screen bg-login-900/20 800px:h-20' : ''}`, children: [_jsx("div", { className: 'block h-12 p-1 800px:p-0', children: _jsx(Link, { href: '/', onClick: () => setIsMobileMenuOpen(false), children: _jsx(LogoSmall, {}) }) }), onlyLogo ? null : (_jsxs(_Fragment, { children: [_jsx("nav", { className: 'hidden 800px:flex 800px:justify-between 800px:items-center 800px:w-fill max-w-[50rem]', children: children }), _jsxs("nav", { className: 'flex w-[calc(100vw-8rem)] justify-end h-12 800px:w-fit', children: [!disableThemeToggle && _jsx(ThemeToggle, {}), !disableLanguageToggle && _jsx(LanguageToggle, { language: lang }), !disableAuthButton && _jsx(AuthButton, { token: token })] }), _jsxs("button", { className: 'w-12 h-12 relative cursor-pointer bg-none border-none 800px:hidden', onClick: () => setIsMobileMenuOpen(!isMobileMenuOpen), children: [_jsx("div", { className: hamburgerStyle(isMobileMenuOpen) }), _jsx("div", { className: hamburgerStyle(isMobileMenuOpen, true) })] }), _jsx("nav", { className: `fixed top-16 w-[calc(100%-2rem)] max-w-[35rem] mx-auto left-0 right-0 800px:hidden
17
+ return (_jsx("div", { className: `${isMobileMenuOpen ? 'bg-[#181818f0]' : 'bg-[#18181899]'} backdrop-blur-xl fixed top-0 z-900 w-full`, children: _jsxs("div", { className: `flex w-full max-w-6xl m-auto p-2 transition duration-500 800px:justify-between 800px:p-4 ${isMobileMenuOpen ? 'h-screen bg-login-900/20 800px:h-20' : ''}`, children: [_jsx("div", { className: 'block h-12 p-1 800px:p-0', children: _jsx(Link, { href: '/', onClick: () => setIsMobileMenuOpen(false), children: _jsx(LogoSmall, {}) }) }), onlyLogo ? null : (_jsxs(_Fragment, { children: [_jsx("nav", { className: 'hidden 800px:flex 800px:justify-between 800px:items-center 800px:w-fill max-w-200', children: children }), _jsxs("nav", { className: 'flex w-[calc(100vw-8rem)] justify-end h-12 800px:w-fit', children: [!disableThemeToggle && _jsx(ThemeToggle, {}), !disableLanguageToggle && _jsx(LanguageToggle, { language: lang }), !disableAuthButton && _jsx(AuthButton, { profileURL: profileURL })] }), _jsxs("button", { className: 'w-12 h-12 relative cursor-pointer bg-none border-none 800px:hidden', onClick: () => setIsMobileMenuOpen(!isMobileMenuOpen), children: [_jsx("div", { className: hamburgerStyle(isMobileMenuOpen) }), _jsx("div", { className: hamburgerStyle(isMobileMenuOpen, true) })] }), _jsx("nav", { className: `fixed top-16 w-[calc(100%-2rem)] max-w-140 mx-auto left-0 right-0 800px:hidden
17
18
  transition-all duration-500 ease-in-out overflow-hidden
18
19
  ${isMobileMenuOpen ? 'max-h-[calc(100vh-4rem)] opacity-100' : 'max-h-0 opacity-0'}`, onClick: () => setIsMobileMenuOpen(false), children: React.Children.map(children, (child, index) => (_jsx("div", { className: `transition-all duration-500 ease-out ${isMobileMenuOpen
19
20
  ? 'opacity-100 transform translate-y-0'
@@ -21,13 +22,22 @@ export default function Navbar({ lang, onlyLogo, token, children, disableLanguag
21
22
  transitionDelay: isMobileMenuOpen ? `${index * 80}ms` : '0ms'
22
23
  }, children: child }, index))) })] }))] }) }));
23
24
  }
24
- function AuthButton({ token }) {
25
- return (_jsx("div", { className: 'rounded-[0.3rem] hover:bg-[#6464641a] h-12 w-12', children: token ? (_jsx(Link, { href: '/api/logout', prefetch: false, onClick: (e) => {
26
- e.preventDefault();
27
- window.location.href = '/api/logout';
28
- }, className: 'grid items-center justify-center h-full w-full', children: _jsx(LogOut, { size: 24 }) })) : (_jsx(Link, { href: '/api/login', className: 'grid items-center justify-center h-full w-full', children: _jsx("div", { className: `relative w-[30px] h-5
25
+ function AuthButton({ profileURL }) {
26
+ const token = getCookie('access_token');
27
+ return (_jsx("div", { className: 'rounded-[0.3rem] hover:bg-[#6464641a] h-12 w-12', children: token ? (_jsxs(_Fragment, { children: [_jsx(Link, { href: '/api/logout', prefetch: false, onClick: (e) => {
28
+ e.preventDefault();
29
+ window.location.href = '/api/logout';
30
+ }, className: 'grid items-center justify-center h-full w-full', children: _jsx(LogOut, { size: 24 }) }), profileURL &&
31
+ _jsx(Link, { href: profileURL, className: 'grid items-center justify-center h-full w-full', children: _jsx("div", { className: `relative w-[30px] h-5
32
+ before:content-[""] before:absolute before:top-0 before:left-1/2 before:-translate-x-1/2
33
+ before:w-2.5 before:h-2.5 before:border-2 before:border-login-50
34
+ before:rounded-full before:bg-transparent
35
+ after:content-[""] after:absolute after:bottom-0 after:left-1/2 after:-translate-x-1/2
36
+ after:w-[18px] after:h-2 after:border-2 after:border-login-50
37
+ after:rounded-t-[22px] after:border-b-0 after:bg-transparent
38
+ ` }) })] })) : (_jsx(Link, { href: '/api/login', className: 'grid items-center justify-center h-full w-full', children: _jsx("div", { className: `relative w-[30px] h-5
29
39
  before:content-[""] before:absolute before:top-0 before:left-1/2 before:-translate-x-1/2
30
- before:w-[10px] before:h-[10px] before:border-2 before:border-login-50
40
+ before:w-2.5 before:h-2.5 before:border-2 before:border-login-50
31
41
  before:rounded-full before:bg-transparent
32
42
  after:content-[""] after:absolute after:bottom-0 after:left-1/2 after:-translate-x-1/2
33
43
  after:w-[18px] after:h-2 after:border-2 after:border-login-50
@@ -13,8 +13,8 @@ export default function NavDropdown({ children, title }) {
13
13
  e.stopPropagation();
14
14
  setIsMobileDropdownOpen(!isMobileDropdownOpen);
15
15
  }, children: _jsxs("li", { className: `list-none no-underline text-2xl leading-6 overflow-hidden
16
- w-full pl-4 pr-4 rounded-[0.3rem] transition-all duration-[600ms]
17
- flex items-center gap-2 opacity-100 min-h-16 py-5 `, children: [_jsx("span", { children: title }), _jsx(ChevronDown, { className: `w-6 h-6 transition-transform duration-400 flex-shrink-0
16
+ w-full pl-4 pr-4 rounded-[0.3rem] transition-all duration-600
17
+ flex items-center gap-2 opacity-100 min-h-16 py-5 `, children: [_jsx("span", { children: title }), _jsx(ChevronDown, { className: `w-6 h-6 transition-transform duration-400 shrink-0
18
18
  ${isMobileDropdownOpen ? 'rotate-180' : ''}` })] }) }), _jsx("div", { className: `list-none no-underline text-xl px-6 ${isMobileDropdownOpen ? 'pb-4' : ''}`, children: React.Children.map(children, (child, index) => (_jsx("div", { className: `leading-6 transition-all duration-500 group dropdown
19
19
  ${isMobileDropdownOpen ? 'h-11 opacity-100' : 'h-0 opacity-0'}
20
20
  `, children: child }, index))) })] })] }));
@@ -7,6 +7,6 @@ export default function NavItem({ href, children, external = false, target, rel,
7
7
  const linkProps = { href, target, rel, title };
8
8
  return (_jsxs(_Fragment, { children: [_jsx(Link, { ...linkProps, className: 'hidden 800px:flex', children: _jsxs("li", { className: `${commonStyling} text-base leading-4 p-3 font-bold transition-colors link-corner-hover
9
9
  group-[.dropdown]:p-2.5 group-[.dropdown]:pr-3 group-[.dropdown]:pl-1`, children: [icon, children, external && _jsx(ArrowUpRight, { className: 'w-6 h-6 stroke-login' })] }) }), _jsx(Link, { ...linkProps, className: '800px:hidden', children: _jsxs("li", { className: `${commonStyling} text-2xl leading-6 overflow-hidden w-auto pl-4 rounded-[0.3rem] transition-all
10
- duration-[600ms] opacity-100 h-16 py-5 group-[.dropdown]:p-0 group-[.dropdown]:text-lg group-[.dropdown]:h-auto
10
+ duration-600 opacity-100 h-16 py-5 group-[.dropdown]:p-0 group-[.dropdown]:text-lg group-[.dropdown]:h-auto
11
11
  group-[.dropdown]:py-2.5 group-[.dropdown]:pl-4`, children: [children, external && _jsx(ArrowUpRight, { className: 'w-6 h-6 stroke-login' })] }) })] }));
12
12
  }
@@ -1,4 +1,4 @@
1
1
  import { Language } from 'uibee/components';
2
2
  export default function LanguageToggle({ language }: {
3
- language: Language;
3
+ language?: Language;
4
4
  }): import("react/jsx-runtime").JSX.Element;
@@ -5,7 +5,7 @@ import { getCookie, setCookie } from '../../utils/cookies/cookies';
5
5
  import { useRouter } from 'next/navigation';
6
6
  import { Globe } from 'lucide-react';
7
7
  export default function LanguageToggle({ language }) {
8
- const [lang, setLang] = useState(language);
8
+ const [lang, setLang] = useState(language || 'en');
9
9
  const [jump, setJump] = useState(false);
10
10
  const router = useRouter();
11
11
  useEffect(() => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "uibee",
3
- "version": "2.3.1",
3
+ "version": "2.3.3",
4
4
  "description": "Shared components, functions and hooks for reuse across Login projects",
5
5
  "homepage": "https://github.com/Login-Linjeforening-for-IT/uibee#readme",
6
6
  "bugs": {
@@ -36,23 +36,23 @@
36
36
  "react": "^19.1.1"
37
37
  },
38
38
  "devDependencies": {
39
- "@eslint/eslintrc": "^3.3.1",
40
- "@next/eslint-plugin-next": "16.0.0",
41
- "@stylistic/eslint-plugin": "^5.4.0",
42
- "@tailwindcss/postcss": "^4.1.13",
43
- "@types/node": "^24.5.2",
44
- "@types/react": "19.2.2",
45
- "eslint": "^9.36.0",
46
- "glob": "^11.0.3",
39
+ "@eslint/eslintrc": "^3.3.3",
40
+ "@next/eslint-plugin-next": "16.0.6",
41
+ "@stylistic/eslint-plugin": "^5.6.1",
42
+ "@tailwindcss/postcss": "^4.1.17",
43
+ "@types/node": "^24.10.1",
44
+ "@types/react": "19.2.7",
45
+ "eslint": "^9.39.1",
46
+ "glob": "^13.0.0",
47
47
  "postcss": "^8.5.6",
48
- "tailwindcss": "^4.1.13",
48
+ "tailwindcss": "^4.1.17",
49
49
  "ts-node": "^10.9.2",
50
- "typescript": "^5.9.2",
51
- "typescript-eslint": "^8.44.1"
50
+ "typescript": "^5.9.3",
51
+ "typescript-eslint": "^8.48.0"
52
52
  },
53
53
  "dependencies": {
54
- "lucide-react": "^0.544.0",
55
- "next": "16.0.0",
54
+ "lucide-react": "^0.555.0",
55
+ "next": "16.0.6",
56
56
  "react": "19.2.0",
57
57
  "react-dom": "19.2.0"
58
58
  }
@@ -0,0 +1,3 @@
1
+ export default function Highlight({ children, className }: { children: React.ReactNode, className?: string }) {
2
+ return <div className={`highlighted-section ${className ?? ''}`}>{children}</div>
3
+ }
@@ -18,8 +18,11 @@ export { default as Navbar } from './navbar/navbar'
18
18
  export { default as NavItem } from './navbar/navbarItem'
19
19
  export { default as NavDropdown } from './navbar/navbarDropdown'
20
20
 
21
+ // Containers
22
+ export { default as PageContainer} from './container/page'
23
+ export { default as Highlight } from './container/highlight'
24
+
21
25
  // Other components
22
26
  export { default as VersionTag } from './version/version'
23
27
  export { default as LoginPage } from './login/loginPage'
24
28
  export { default as Toaster, addToast } from './toast/toaster'
25
- export { default as PageContainer} from './container/page'
@@ -5,6 +5,7 @@ import Link from 'next/link'
5
5
  import LogoSmall from '@components/logo/logoSmall'
6
6
  import LanguageToggle from '@components/toggle/language'
7
7
  import ThemeToggle from '@components/toggle/theme'
8
+ import { getCookie } from 'uibee/utils'
8
9
  import { Language } from 'uibee/components'
9
10
  import { LogOut } from 'lucide-react'
10
11
 
@@ -18,24 +19,25 @@ function hamburgerStyle (isOpen: boolean, isSecond?: boolean) {
18
19
  }
19
20
 
20
21
  export type NavbarProps = {
21
- lang: Language
22
+ lang?: Language
22
23
  disableLanguageToggle?: boolean
23
24
  onlyLogo?: boolean
24
- theme: string
25
+ theme?: string
25
26
  disableThemeToggle?: boolean
26
- token: string | null
27
+ token?: string | null
27
28
  disableAuthButton?: boolean
29
+ profileURL?: string
28
30
  children: React.ReactNode
29
31
  }
30
32
 
31
33
  export default function Navbar({
32
34
  lang,
33
35
  onlyLogo,
34
- token,
35
36
  children,
36
37
  disableLanguageToggle,
37
38
  disableThemeToggle,
38
- disableAuthButton
39
+ disableAuthButton,
40
+ profileURL
39
41
  }: NavbarProps) {
40
42
  const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false)
41
43
 
@@ -57,7 +59,7 @@ export default function Navbar({
57
59
  {onlyLogo ? null : (
58
60
  <>
59
61
  {/* Desktop Navigation */}
60
- <nav className='hidden 800px:flex 800px:justify-between 800px:items-center 800px:w-fill max-w-[50rem]'>
62
+ <nav className='hidden 800px:flex 800px:justify-between 800px:items-center 800px:w-fill max-w-200'>
61
63
  {children}
62
64
  </nav>
63
65
 
@@ -65,7 +67,7 @@ export default function Navbar({
65
67
  <nav className='flex w-[calc(100vw-8rem)] justify-end h-12 800px:w-fit'>
66
68
  {!disableThemeToggle && <ThemeToggle />}
67
69
  {!disableLanguageToggle && <LanguageToggle language={lang} />}
68
- {!disableAuthButton && <AuthButton token={token} />}
70
+ {!disableAuthButton && <AuthButton profileURL={profileURL} />}
69
71
  </nav>
70
72
 
71
73
  {/* Mobile Menu Button */}
@@ -78,7 +80,7 @@ export default function Navbar({
78
80
  </button>
79
81
 
80
82
  {/* Mobile Navigation */}
81
- <nav className={`fixed top-16 w-[calc(100%-2rem)] max-w-[35rem] mx-auto left-0 right-0 800px:hidden
83
+ <nav className={`fixed top-16 w-[calc(100%-2rem)] max-w-140 mx-auto left-0 right-0 800px:hidden
82
84
  transition-all duration-500 ease-in-out overflow-hidden
83
85
  ${isMobileMenuOpen ? 'max-h-[calc(100vh-4rem)] opacity-100' : 'max-h-0 opacity-0'}`}
84
86
  onClick={() => setIsMobileMenuOpen(false)}>
@@ -105,21 +107,41 @@ export default function Navbar({
105
107
  )
106
108
  }
107
109
 
108
- function AuthButton({ token }: { token: string | null }) {
110
+ function AuthButton({ profileURL }: { profileURL?: string }) {
111
+ const token = getCookie('access_token')
112
+
109
113
  return (
110
114
  <div className='rounded-[0.3rem] hover:bg-[#6464641a] h-12 w-12'>
111
115
  {token ? (
112
- <Link
113
- href='/api/logout'
114
- prefetch={false}
115
- onClick={(e) => {
116
- e.preventDefault()
117
- window.location.href = '/api/logout'
118
- }}
119
- className='grid items-center justify-center h-full w-full'
120
- >
121
- <LogOut size={24} />
122
- </Link>
116
+ <>
117
+ <Link
118
+ href='/api/logout'
119
+ prefetch={false}
120
+ onClick={(e) => {
121
+ e.preventDefault()
122
+ window.location.href = '/api/logout'
123
+ }}
124
+ className='grid items-center justify-center h-full w-full'
125
+ >
126
+ <LogOut size={24} />
127
+ </Link>
128
+ {profileURL &&
129
+ <Link
130
+ href={profileURL}
131
+ className='grid items-center justify-center h-full w-full'
132
+ >
133
+ <div className={`relative w-[30px] h-5
134
+ before:content-[""] before:absolute before:top-0 before:left-1/2 before:-translate-x-1/2
135
+ before:w-2.5 before:h-2.5 before:border-2 before:border-login-50
136
+ before:rounded-full before:bg-transparent
137
+ after:content-[""] after:absolute after:bottom-0 after:left-1/2 after:-translate-x-1/2
138
+ after:w-[18px] after:h-2 after:border-2 after:border-login-50
139
+ after:rounded-t-[22px] after:border-b-0 after:bg-transparent
140
+ `}
141
+ />
142
+ </Link>
143
+ }
144
+ </>
123
145
  ) : (
124
146
  <Link
125
147
  href='/api/login'
@@ -127,7 +149,7 @@ function AuthButton({ token }: { token: string | null }) {
127
149
  >
128
150
  <div className={`relative w-[30px] h-5
129
151
  before:content-[""] before:absolute before:top-0 before:left-1/2 before:-translate-x-1/2
130
- before:w-[10px] before:h-[10px] before:border-2 before:border-login-50
152
+ before:w-2.5 before:h-2.5 before:border-2 before:border-login-50
131
153
  before:rounded-full before:bg-transparent
132
154
  after:content-[""] after:absolute after:bottom-0 after:left-1/2 after:-translate-x-1/2
133
155
  after:w-[18px] after:h-2 after:border-2 after:border-login-50
@@ -53,11 +53,11 @@ export default function NavDropdown({ children, title }: NavDropdownProps) {
53
53
  }}
54
54
  >
55
55
  <li className={`list-none no-underline text-2xl leading-6 overflow-hidden
56
- w-full pl-4 pr-4 rounded-[0.3rem] transition-all duration-[600ms]
56
+ w-full pl-4 pr-4 rounded-[0.3rem] transition-all duration-600
57
57
  flex items-center gap-2 opacity-100 min-h-16 py-5 `}
58
58
  >
59
59
  <span>{title}</span>
60
- <ChevronDown className={`w-6 h-6 transition-transform duration-400 flex-shrink-0
60
+ <ChevronDown className={`w-6 h-6 transition-transform duration-400 shrink-0
61
61
  ${isMobileDropdownOpen ? 'rotate-180' : ''}`}
62
62
  />
63
63
  </li>
@@ -35,7 +35,7 @@ export default function NavItem({ href, children, external = false, target, rel,
35
35
  {/* Mobile version */}
36
36
  <Link {...linkProps} className='800px:hidden'>
37
37
  <li className={`${commonStyling} text-2xl leading-6 overflow-hidden w-auto pl-4 rounded-[0.3rem] transition-all
38
- duration-[600ms] opacity-100 h-16 py-5 group-[.dropdown]:p-0 group-[.dropdown]:text-lg group-[.dropdown]:h-auto
38
+ duration-600 opacity-100 h-16 py-5 group-[.dropdown]:p-0 group-[.dropdown]:text-lg group-[.dropdown]:h-auto
39
39
  group-[.dropdown]:py-2.5 group-[.dropdown]:pl-4`
40
40
  }>
41
41
  {children}
@@ -6,8 +6,8 @@ import { useRouter } from 'next/navigation'
6
6
  import { Language } from 'uibee/components'
7
7
  import { Globe } from 'lucide-react'
8
8
 
9
- export default function LanguageToggle({language}: {language: Language}) {
10
- const [lang, setLang] = useState<Language>(language)
9
+ export default function LanguageToggle({language}: {language?: Language}) {
10
+ const [lang, setLang] = useState<Language>(language || 'en')
11
11
  const [jump, setJump] = useState(false)
12
12
 
13
13
  const router = useRouter()