redesign the homepage
Build & Deploy / Build & Push Docker Image (push) Failing after 47s
Build & Deploy / Deploy to VPS (push) Has been skipped
Test / API Unit Tests (push) Failing after 5m4s
Test / Marketplace Unit Tests (push) Failing after 4m55s
Test / Admin Unit Tests (push) Successful in 9m37s
Test / Dashboard Unit Tests (push) Successful in 9m37s
Test / API Integration Tests (push) Successful in 9m54s
Build & Deploy / Build & Push Docker Image (push) Failing after 47s
Build & Deploy / Deploy to VPS (push) Has been skipped
Test / API Unit Tests (push) Failing after 5m4s
Test / Marketplace Unit Tests (push) Failing after 4m55s
Test / Admin Unit Tests (push) Successful in 9m37s
Test / Dashboard Unit Tests (push) Successful in 9m37s
Test / API Integration Tests (push) Successful in 9m54s
This commit is contained in:
@@ -0,0 +1,18 @@
|
||||
.nav ol {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: var(--space-2);
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
list-style: none;
|
||||
}
|
||||
.nav li {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: var(--space-2);
|
||||
color: var(--text-secondary);
|
||||
font-size: var(--type-label-size);
|
||||
}
|
||||
.separator {
|
||||
color: var(--text-subdued);
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
import { ActionLink } from '@/components/actions/ActionLink';
|
||||
import { Icon } from '@/components/foundation/Icon';
|
||||
import styles from './Breadcrumbs.module.css';
|
||||
|
||||
export interface BreadcrumbItem {
|
||||
label: string;
|
||||
href?: string;
|
||||
}
|
||||
|
||||
export function Breadcrumbs({ label, items }: { label: string; items: BreadcrumbItem[] }) {
|
||||
return (
|
||||
<nav aria-label={label} className={styles.nav}>
|
||||
<ol>
|
||||
{items.map((item, index) => {
|
||||
const current = index === items.length - 1;
|
||||
return (
|
||||
<li key={`${item.label}-${index}`}>
|
||||
{index > 0 ? (
|
||||
<Icon
|
||||
name="chevron-forward"
|
||||
size="sm"
|
||||
directionBehavior="mirror"
|
||||
className={styles.separator}
|
||||
/>
|
||||
) : null}
|
||||
{item.href && !current ? (
|
||||
<ActionLink href={item.href} variant="inline">
|
||||
{item.label}
|
||||
</ActionLink>
|
||||
) : (
|
||||
<span aria-current={current ? 'page' : undefined}>{item.label}</span>
|
||||
)}
|
||||
</li>
|
||||
);
|
||||
})}
|
||||
</ol>
|
||||
</nav>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
.group h2 {
|
||||
margin: 0;
|
||||
font-size: var(--type-body-size);
|
||||
}
|
||||
.group ul {
|
||||
display: grid;
|
||||
gap: var(--space-2);
|
||||
margin: var(--space-3) 0 0;
|
||||
padding: 0;
|
||||
list-style: none;
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
import { ActionLink } from '@/components/actions/ActionLink';
|
||||
import styles from './FooterLinkGroup.module.css';
|
||||
|
||||
export interface FooterLinkItem {
|
||||
id: string;
|
||||
label: string;
|
||||
href?: string;
|
||||
disabledReason?: string;
|
||||
}
|
||||
|
||||
export function FooterLinkGroup({ title, links }: { title: string; links: FooterLinkItem[] }) {
|
||||
return (
|
||||
<section className={styles.group}>
|
||||
<h2>{title}</h2>
|
||||
<ul>
|
||||
{links.map((link) => (
|
||||
<li key={link.id}>
|
||||
<ActionLink
|
||||
href={link.href ?? '/'}
|
||||
variant="muted"
|
||||
{...(link.disabledReason ? { disabledReason: link.disabledReason } : {})}
|
||||
>
|
||||
{link.label}
|
||||
</ActionLink>
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
</section>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
.nav {
|
||||
overflow-x: auto;
|
||||
border-block-end: 1px solid var(--border-standard);
|
||||
}
|
||||
.nav ul {
|
||||
display: flex;
|
||||
inline-size: max-content;
|
||||
min-inline-size: 100%;
|
||||
gap: var(--space-6);
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
list-style: none;
|
||||
}
|
||||
.nav a {
|
||||
border-block-end: 3px solid transparent;
|
||||
}
|
||||
.nav a[aria-current='location'] {
|
||||
border-block-end-color: var(--interactive-primary);
|
||||
color: var(--text-primary);
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
import { ActionLink } from '@/components/actions/ActionLink';
|
||||
import styles from './SectionNavigation.module.css';
|
||||
|
||||
export interface SectionNavigationItem {
|
||||
id: string;
|
||||
label: string;
|
||||
href: string;
|
||||
current?: boolean;
|
||||
}
|
||||
|
||||
export function SectionNavigation({
|
||||
label,
|
||||
items,
|
||||
}: {
|
||||
label: string;
|
||||
items: SectionNavigationItem[];
|
||||
}) {
|
||||
return (
|
||||
<nav aria-label={label} className={styles.nav}>
|
||||
<ul>
|
||||
{items.map((item) => (
|
||||
<li key={item.id}>
|
||||
<ActionLink
|
||||
href={item.href}
|
||||
variant="navigation"
|
||||
aria-current={item.current ? 'location' : undefined}
|
||||
>
|
||||
{item.label}
|
||||
</ActionLink>
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
</nav>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user