* refactor(auth): replace dashboard sessions with stateless tokens * feat(auth): harden session issuance and distributed enforcement * fix(proxy): preserve trusted proxy compatibility defaults * refactor: address dashboard auth review feedback * refactor: remove classic frontend and flatten web app
145 lines
3.4 KiB
TypeScript
145 lines
3.4 KiB
TypeScript
/*
|
|
Copyright (C) 2023-2026 QuantumNous
|
|
|
|
This program is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU Affero General Public License as
|
|
published by the Free Software Foundation, either version 3 of the
|
|
License, or (at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU Affero General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Affero General Public License
|
|
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
For commercial licensing, please contact support@quantumnous.com
|
|
*/
|
|
import { mergeProps } from '@base-ui/react/merge-props'
|
|
import { useRender } from '@base-ui/react/use-render'
|
|
import {
|
|
ArrowRight01Icon,
|
|
MoreHorizontalCircle01Icon,
|
|
} from '@hugeicons/core-free-icons'
|
|
import { HugeiconsIcon } from '@hugeicons/react'
|
|
import * as React from 'react'
|
|
|
|
import { cn } from '@/lib/utils'
|
|
|
|
function Breadcrumb({ className, ...props }: React.ComponentProps<'nav'>) {
|
|
return (
|
|
<nav
|
|
aria-label='breadcrumb'
|
|
data-slot='breadcrumb'
|
|
className={cn(className)}
|
|
{...props}
|
|
/>
|
|
)
|
|
}
|
|
|
|
function BreadcrumbList({ className, ...props }: React.ComponentProps<'ol'>) {
|
|
return (
|
|
<ol
|
|
data-slot='breadcrumb-list'
|
|
className={cn(
|
|
'text-muted-foreground flex flex-wrap items-center gap-1.5 text-sm wrap-break-word',
|
|
className
|
|
)}
|
|
{...props}
|
|
/>
|
|
)
|
|
}
|
|
|
|
function BreadcrumbItem({ className, ...props }: React.ComponentProps<'li'>) {
|
|
return (
|
|
<li
|
|
data-slot='breadcrumb-item'
|
|
className={cn('inline-flex items-center gap-1', className)}
|
|
{...props}
|
|
/>
|
|
)
|
|
}
|
|
|
|
function BreadcrumbLink({
|
|
className,
|
|
render,
|
|
...props
|
|
}: useRender.ComponentProps<'a'>) {
|
|
return useRender({
|
|
defaultTagName: 'a',
|
|
props: mergeProps<'a'>(
|
|
{
|
|
className: cn('transition-colors hover:text-foreground', className),
|
|
},
|
|
props
|
|
),
|
|
render,
|
|
state: {
|
|
slot: 'breadcrumb-link',
|
|
},
|
|
})
|
|
}
|
|
|
|
function BreadcrumbPage({ className, ...props }: React.ComponentProps<'span'>) {
|
|
return (
|
|
<span
|
|
data-slot='breadcrumb-page'
|
|
role='link'
|
|
aria-disabled='true'
|
|
aria-current='page'
|
|
className={cn('text-foreground font-normal', className)}
|
|
{...props}
|
|
/>
|
|
)
|
|
}
|
|
|
|
function BreadcrumbSeparator({
|
|
children,
|
|
className,
|
|
...props
|
|
}: React.ComponentProps<'li'>) {
|
|
return (
|
|
<li
|
|
data-slot='breadcrumb-separator'
|
|
role='presentation'
|
|
aria-hidden='true'
|
|
className={cn('[&>svg]:size-3.5', className)}
|
|
{...props}
|
|
>
|
|
{children ?? <HugeiconsIcon icon={ArrowRight01Icon} strokeWidth={2} />}
|
|
</li>
|
|
)
|
|
}
|
|
|
|
function BreadcrumbEllipsis({
|
|
className,
|
|
...props
|
|
}: React.ComponentProps<'span'>) {
|
|
return (
|
|
<span
|
|
data-slot='breadcrumb-ellipsis'
|
|
role='presentation'
|
|
aria-hidden='true'
|
|
className={cn(
|
|
'flex size-5 items-center justify-center [&>svg]:size-4',
|
|
className
|
|
)}
|
|
{...props}
|
|
>
|
|
<HugeiconsIcon icon={MoreHorizontalCircle01Icon} strokeWidth={2} />
|
|
<span className='sr-only'>More</span>
|
|
</span>
|
|
)
|
|
}
|
|
|
|
export {
|
|
Breadcrumb,
|
|
BreadcrumbList,
|
|
BreadcrumbItem,
|
|
BreadcrumbLink,
|
|
BreadcrumbPage,
|
|
BreadcrumbSeparator,
|
|
BreadcrumbEllipsis,
|
|
}
|