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 +26 -13
- package/dist/src/components/container/highlight.d.ts +4 -0
- package/dist/src/components/container/highlight.js +4 -0
- package/dist/src/components/index.d.ts +2 -1
- package/dist/src/components/index.js +3 -1
- package/dist/src/components/navbar/navbar.d.ts +5 -4
- package/dist/src/components/navbar/navbar.js +18 -8
- package/dist/src/components/navbar/navbarDropdown.js +2 -2
- package/dist/src/components/navbar/navbarItem.js +1 -1
- package/dist/src/components/toggle/language.d.ts +1 -1
- package/dist/src/components/toggle/language.js +1 -1
- package/package.json +14 -14
- package/src/components/container/highlight.tsx +3 -0
- package/src/components/index.ts +4 -1
- package/src/components/navbar/navbar.tsx +43 -21
- package/src/components/navbar/navbarDropdown.tsx +2 -2
- package/src/components/navbar/navbarItem.tsx +1 -1
- package/src/components/toggle/language.tsx +2 -2
package/dist/globals.css
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! tailwindcss v4.1.
|
|
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
|
|
516
|
-
max-width:
|
|
525
|
+
.max-w-140 {
|
|
526
|
+
max-width: calc(var(--spacing) * 140);
|
|
517
527
|
}
|
|
518
|
-
.max-w
|
|
519
|
-
max-width:
|
|
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
|
|
1227
|
+
.before\:h-2\.5 {
|
|
1215
1228
|
&::before {
|
|
1216
1229
|
content: var(--tw-content);
|
|
1217
|
-
height:
|
|
1230
|
+
height: calc(var(--spacing) * 2.5);
|
|
1218
1231
|
}
|
|
1219
1232
|
}
|
|
1220
|
-
.before\:w
|
|
1233
|
+
.before\:w-2\.5 {
|
|
1221
1234
|
&::before {
|
|
1222
1235
|
content: var(--tw-content);
|
|
1223
|
-
width:
|
|
1236
|
+
width: calc(var(--spacing) * 2.5);
|
|
1224
1237
|
}
|
|
1225
1238
|
}
|
|
1226
1239
|
.before\:-translate-x-1\/2 {
|
|
@@ -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
|
|
4
|
+
lang?: Language;
|
|
5
5
|
disableLanguageToggle?: boolean;
|
|
6
6
|
onlyLogo?: boolean;
|
|
7
|
-
theme
|
|
7
|
+
theme?: string;
|
|
8
8
|
disableThemeToggle?: boolean;
|
|
9
|
-
token
|
|
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,
|
|
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,
|
|
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-
|
|
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({
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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-
|
|
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-
|
|
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
|
|
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-
|
|
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
|
}
|
|
@@ -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.
|
|
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.
|
|
40
|
-
"@next/eslint-plugin-next": "16.0.
|
|
41
|
-
"@stylistic/eslint-plugin": "^5.
|
|
42
|
-
"@tailwindcss/postcss": "^4.1.
|
|
43
|
-
"@types/node": "^24.
|
|
44
|
-
"@types/react": "19.2.
|
|
45
|
-
"eslint": "^9.
|
|
46
|
-
"glob": "^
|
|
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.
|
|
48
|
+
"tailwindcss": "^4.1.17",
|
|
49
49
|
"ts-node": "^10.9.2",
|
|
50
|
-
"typescript": "^5.9.
|
|
51
|
-
"typescript-eslint": "^8.
|
|
50
|
+
"typescript": "^5.9.3",
|
|
51
|
+
"typescript-eslint": "^8.48.0"
|
|
52
52
|
},
|
|
53
53
|
"dependencies": {
|
|
54
|
-
"lucide-react": "^0.
|
|
55
|
-
"next": "16.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
|
}
|
package/src/components/index.ts
CHANGED
|
@@ -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
|
|
22
|
+
lang?: Language
|
|
22
23
|
disableLanguageToggle?: boolean
|
|
23
24
|
onlyLogo?: boolean
|
|
24
|
-
theme
|
|
25
|
+
theme?: string
|
|
25
26
|
disableThemeToggle?: boolean
|
|
26
|
-
token
|
|
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-
|
|
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
|
|
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-
|
|
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({
|
|
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
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
e
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
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-
|
|
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-
|
|
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
|
|
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-
|
|
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
|
|
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()
|