mirror of
https://github.com/blitzkit/blitzkit.git
synced 2026-10-24 20:19:49 +02:00
feat: tool banners
This commit is contained in:
1 parent
1a18058228
commit
a7f93698a6
10 files changed
+161
-6
No files matched your search
@@ -0,0 +1,3 @@
|
|||||||
|
<svg width="30" height="52" viewBox="0 0 30 52" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M13.8564 44V52H0V36L13.8564 44ZM30 52H16.1436V44L30 36V52ZM28.8564 18V34L15 42L1.14355 34V18L15 10L28.8564 18ZM13.8564 8L0 16V0H13.8564V8ZM30 16L16.1436 8V0H30V16Z" fill="#EEEEF0"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 294 B |
@@ -12,7 +12,7 @@
|
|||||||
background-size: cover;
|
background-size: cover;
|
||||||
background-position: center;
|
background-position: center;
|
||||||
|
|
||||||
box-shadow: var(--shadow-interactive), var(--shadow-subtle);
|
box-shadow: var(--shadow-interactive), var(--shadow-aggressive);
|
||||||
}
|
}
|
||||||
|
|
||||||
.avatar-label {
|
.avatar-label {
|
||||||
|
|||||||
@@ -24,6 +24,13 @@ import "@fontsource-variable/roboto-flex";
|
|||||||
--font-size-minor: 0.75rem;
|
--font-size-minor: 0.75rem;
|
||||||
--font-size-major: 1.25rem;
|
--font-size-major: 1.25rem;
|
||||||
|
|
||||||
|
--font-size-heading-1: 3rem;
|
||||||
|
--font-size-heading-2: 2rem;
|
||||||
|
--font-size-heading-3: 1.5rem;
|
||||||
|
--font-size-heading-4: 1.25rem;
|
||||||
|
--font-size-heading-5: 1rem;
|
||||||
|
--font-size-heading-6: 0.75rem;
|
||||||
|
|
||||||
--font-family-regular: "Roboto Flex Variable", sans-serif;
|
--font-family-regular: "Roboto Flex Variable", sans-serif;
|
||||||
--font-family-mono: "JetBrains Mono Variable", monospace;
|
--font-family-mono: "JetBrains Mono Variable", monospace;
|
||||||
|
|
||||||
@@ -64,9 +71,11 @@ import "@fontsource-variable/roboto-flex";
|
|||||||
var(--shadow-interactive-shine), var(--shadow-interactive-shadow),
|
var(--shadow-interactive-shine), var(--shadow-interactive-shadow),
|
||||||
var(--shadow-interactive-background);
|
var(--shadow-interactive-background);
|
||||||
|
|
||||||
--shadow-subtle: var(--space-1) var(--space-1) var(--space-4)
|
--shadow-aggressive: var(--space-1) var(--space-1) var(--space-4)
|
||||||
var(--black-a11);
|
var(--black-a11);
|
||||||
|
--shadow-subtle: 0 var(--space-1) var(--space-3) var(--black-a5);
|
||||||
|
|
||||||
--blur-glass: blur(4rem);
|
--blur-glass: blur(4rem);
|
||||||
|
--blur-tint: blur(16rem);
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
.heading {
|
||||||
|
&[data-size="1"] {
|
||||||
|
font-size: var(--font-size-heading-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
&[data-size="2"] {
|
||||||
|
font-size: var(--font-size-heading-2);
|
||||||
|
}
|
||||||
|
|
||||||
|
&[data-size="3"] {
|
||||||
|
font-size: var(--font-size-heading-3);
|
||||||
|
}
|
||||||
|
|
||||||
|
&[data-size="4"] {
|
||||||
|
font-size: var(--font-size-heading-4);
|
||||||
|
}
|
||||||
|
|
||||||
|
&[data-size="5"] {
|
||||||
|
font-size: var(--font-size-heading-5);
|
||||||
|
}
|
||||||
|
|
||||||
|
&[data-size="6"] {
|
||||||
|
font-size: var(--font-size-heading-6);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
import { classNames } from "../../core/ui/classNames";
|
||||||
|
import { Text, type TextProps } from "../Text";
|
||||||
|
import "./index.css";
|
||||||
|
|
||||||
|
export interface HeadingProps extends Omit<TextProps, "size"> {
|
||||||
|
size?: `${1 | 2 | 3 | 4 | 5 | 6}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function Heading({
|
||||||
|
className,
|
||||||
|
weight,
|
||||||
|
size = "1",
|
||||||
|
...props
|
||||||
|
}: HeadingProps) {
|
||||||
|
return (
|
||||||
|
<Text
|
||||||
|
{...props}
|
||||||
|
weight={weight ?? "medium"}
|
||||||
|
className={classNames("heading", className)}
|
||||||
|
data-size={size}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -20,8 +20,8 @@ const { locale } = Astro.props;
|
|||||||
justify-content: center;
|
justify-content: center;
|
||||||
|
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
backdrop-filter: var(--blur-glass);
|
backdrop-filter: var(--blur-glass) brightness(25%);
|
||||||
background-color: var(--black-a5);
|
box-shadow: var(--shadow-subtle);
|
||||||
|
|
||||||
.content {
|
.content {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
|
|||||||
@@ -0,0 +1,81 @@
|
|||||||
|
---
|
||||||
|
import { api } from "../core/api/dynamic";
|
||||||
|
import type { Tool } from "../core/tools/tools";
|
||||||
|
import { Heading } from "./Heading";
|
||||||
|
import { Text } from "./Text";
|
||||||
|
|
||||||
|
interface Props {
|
||||||
|
locale: string;
|
||||||
|
tool: Tool;
|
||||||
|
}
|
||||||
|
|
||||||
|
const { tool, locale } = Astro.props;
|
||||||
|
const strings = await api.strings(locale);
|
||||||
|
const toolStrings = strings.tools[tool.id as keyof typeof strings.tools];
|
||||||
|
---
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.tool-hero {
|
||||||
|
background-size: cover;
|
||||||
|
|
||||||
|
.content {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
padding: var(--space-5) var(--space-4);
|
||||||
|
box-sizing: border-box;
|
||||||
|
|
||||||
|
backdrop-filter: var(--blur-tint);
|
||||||
|
|
||||||
|
.centered {
|
||||||
|
flex: 1;
|
||||||
|
max-width: var(--page-width);
|
||||||
|
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pattern {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
|
||||||
|
background-image: url(/assets/patterns/avatars.svg);
|
||||||
|
mask-image: linear-gradient(
|
||||||
|
90deg,
|
||||||
|
transparent 25%,
|
||||||
|
var(--black-a1),
|
||||||
|
transparent
|
||||||
|
);
|
||||||
|
mask-repeat: no-repeat;
|
||||||
|
mask-size: cover;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<div
|
||||||
|
class="tool-hero"
|
||||||
|
style={{
|
||||||
|
backgroundImage: `url(/assets/tools/${tool.id}.webp)`,
|
||||||
|
backgroundPosition: tool.background_position ?? "top",
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<div class="content">
|
||||||
|
<div class="pattern"></div>
|
||||||
|
|
||||||
|
<div class="centered">
|
||||||
|
<Heading weight="medium" size="2">
|
||||||
|
{toolStrings.name}
|
||||||
|
</Heading>
|
||||||
|
<Text>
|
||||||
|
{toolStrings.slogan}
|
||||||
|
</Text>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
@@ -8,6 +8,8 @@ export interface Tool {
|
|||||||
significant?: boolean;
|
significant?: boolean;
|
||||||
disabled?: boolean;
|
disabled?: boolean;
|
||||||
href?: string;
|
href?: string;
|
||||||
|
|
||||||
|
background_position: "top" | "center" | "bottom";
|
||||||
}
|
}
|
||||||
|
|
||||||
export const tools: Record<string, Tool> = {
|
export const tools: Record<string, Tool> = {
|
||||||
@@ -16,11 +18,15 @@ export const tools: Record<string, Tool> = {
|
|||||||
strings: "tankopedia",
|
strings: "tankopedia",
|
||||||
button: "purple",
|
button: "purple",
|
||||||
significant: true,
|
significant: true,
|
||||||
|
|
||||||
|
background_position: "top",
|
||||||
},
|
},
|
||||||
|
|
||||||
avatars: {
|
avatars: {
|
||||||
id: "avatars",
|
id: "avatars",
|
||||||
button: "gold",
|
button: "gold",
|
||||||
|
|
||||||
|
background_position: "bottom",
|
||||||
},
|
},
|
||||||
|
|
||||||
backgrounds: {
|
backgrounds: {
|
||||||
|
|||||||
@@ -16,12 +16,14 @@ interface Props {
|
|||||||
const { accent, noNavbar, locale } = Astro.props;
|
const { accent, noNavbar, locale } = Astro.props;
|
||||||
---
|
---
|
||||||
|
|
||||||
<html>
|
<html lang={locale}>
|
||||||
<head>
|
<head>
|
||||||
<BaseMeta />
|
<BaseMeta />
|
||||||
|
|
||||||
<ColorScale color="mauve" />
|
<ColorScale color="mauve" />
|
||||||
|
<ColorScale color="mauve" alpha />
|
||||||
<ColorAlias color="mauve" alias="gray" />
|
<ColorAlias color="mauve" alias="gray" />
|
||||||
|
<ColorAlias color="mauve" alpha alias="gray" />
|
||||||
|
|
||||||
<ColorScale color="black" alpha />
|
<ColorScale color="black" alpha />
|
||||||
<ColorScale color="white" alpha />
|
<ColorScale color="white" alpha />
|
||||||
@@ -36,7 +38,6 @@ const { accent, noNavbar, locale } = Astro.props;
|
|||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
min-height: 100dvh;
|
min-height: 100dvh;
|
||||||
gap: var(--space-4);
|
|
||||||
|
|
||||||
background-color: var(--gray-1);
|
background-color: var(--gray-1);
|
||||||
color: var(--gray-12);
|
color: var(--gray-12);
|
||||||
@@ -47,6 +48,7 @@ const { accent, noNavbar, locale } = Astro.props;
|
|||||||
flex: 1;
|
flex: 1;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
gap: var(--space-5);
|
gap: var(--space-5);
|
||||||
|
padding: var(--space-4) 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
@@ -57,6 +59,8 @@ const { accent, noNavbar, locale } = Astro.props;
|
|||||||
<body class="dark">
|
<body class="dark">
|
||||||
{!noNavbar && <Navbar {locale} />}
|
{!noNavbar && <Navbar {locale} />}
|
||||||
|
|
||||||
|
<slot name="pre-app" />
|
||||||
|
|
||||||
<div class="app">
|
<div class="app">
|
||||||
<slot />
|
<slot />
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
---
|
---
|
||||||
import Section from "../../../components/Section.astro";
|
import Section from "../../../components/Section.astro";
|
||||||
|
import ToolBanner from "../../../components/ToolBanner.astro";
|
||||||
|
import { tools } from "../../../core/tools/tools";
|
||||||
import BaseLayout from "../../../layouts/BaseLayout.astro";
|
import BaseLayout from "../../../layouts/BaseLayout.astro";
|
||||||
import { Page } from "./_index";
|
import { Page } from "./_index";
|
||||||
|
|
||||||
@@ -17,6 +19,8 @@ const { locale } = Astro.props;
|
|||||||
</style>
|
</style>
|
||||||
|
|
||||||
<BaseLayout {locale} accent="gold">
|
<BaseLayout {locale} accent="gold">
|
||||||
|
<ToolBanner {locale} tool={tools.avatars} slot="pre-app" />
|
||||||
|
|
||||||
<Section>
|
<Section>
|
||||||
<Page {locale} client:only="react">
|
<Page {locale} client:only="react">
|
||||||
<Page {locale} skeleton slot="fallback" />
|
<Page {locale} skeleton slot="fallback" />
|
||||||
|
|||||||
Reference in new issue
Block a user