mirror of
https://github.com/saicaca/fuwari.git
synced 2026-01-11 23:02:53 +01:00
tailwindcss poc 1
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
import sitemap from "@astrojs/sitemap";
|
import sitemap from "@astrojs/sitemap";
|
||||||
import svelte from "@astrojs/svelte";
|
import svelte from "@astrojs/svelte";
|
||||||
import tailwind from "@astrojs/tailwind";
|
|
||||||
import swup from "@swup/astro";
|
import swup from "@swup/astro";
|
||||||
|
import tailwindcss from "@tailwindcss/vite";
|
||||||
import icon from "astro-icon";
|
import icon from "astro-icon";
|
||||||
import { defineConfig } from "astro/config";
|
import { defineConfig } from "astro/config";
|
||||||
import rehypeAutolinkHeadings from "rehype-autolink-headings";
|
import rehypeAutolinkHeadings from "rehype-autolink-headings";
|
||||||
@@ -24,9 +24,6 @@ export default defineConfig({
|
|||||||
base: "/",
|
base: "/",
|
||||||
trailingSlash: "always",
|
trailingSlash: "always",
|
||||||
integrations: [
|
integrations: [
|
||||||
tailwind({
|
|
||||||
nesting: true,
|
|
||||||
}),
|
|
||||||
swup({
|
swup({
|
||||||
theme: false,
|
theme: false,
|
||||||
animationClass: "transition-swup-", // see https://swup.js.org/options/#animationselector
|
animationClass: "transition-swup-", // see https://swup.js.org/options/#animationselector
|
||||||
@@ -104,6 +101,7 @@ export default defineConfig({
|
|||||||
],
|
],
|
||||||
},
|
},
|
||||||
vite: {
|
vite: {
|
||||||
|
plugins: [tailwindcss()],
|
||||||
build: {
|
build: {
|
||||||
rollupOptions: {
|
rollupOptions: {
|
||||||
onwarn(warning, warn) {
|
onwarn(warning, warn) {
|
||||||
|
|||||||
@@ -19,7 +19,6 @@
|
|||||||
"@astrojs/rss": "^4.0.11",
|
"@astrojs/rss": "^4.0.11",
|
||||||
"@astrojs/sitemap": "^3.3.1",
|
"@astrojs/sitemap": "^3.3.1",
|
||||||
"@astrojs/svelte": "7.0.11",
|
"@astrojs/svelte": "7.0.11",
|
||||||
"@astrojs/tailwind": "^6.0.2",
|
|
||||||
"@fontsource-variable/jetbrains-mono": "^5.2.5",
|
"@fontsource-variable/jetbrains-mono": "^5.2.5",
|
||||||
"@fontsource/roboto": "^5.2.5",
|
"@fontsource/roboto": "^5.2.5",
|
||||||
"@iconify-json/fa6-brands": "^1.2.5",
|
"@iconify-json/fa6-brands": "^1.2.5",
|
||||||
@@ -28,7 +27,9 @@
|
|||||||
"@iconify-json/material-symbols": "^1.2.20",
|
"@iconify-json/material-symbols": "^1.2.20",
|
||||||
"@iconify/svelte": "^4.2.0",
|
"@iconify/svelte": "^4.2.0",
|
||||||
"@swup/astro": "^1.6.0",
|
"@swup/astro": "^1.6.0",
|
||||||
|
"@tailwindcss/postcss": "^4.1.4",
|
||||||
"@tailwindcss/typography": "^0.5.16",
|
"@tailwindcss/typography": "^0.5.16",
|
||||||
|
"@tailwindcss/vite": "^4.1.4",
|
||||||
"astro": "5.7.5",
|
"astro": "5.7.5",
|
||||||
"astro-icon": "^1.1.5",
|
"astro-icon": "^1.1.5",
|
||||||
"hastscript": "^9.0.1",
|
"hastscript": "^9.0.1",
|
||||||
@@ -52,7 +53,7 @@
|
|||||||
"sharp": "^0.34.1",
|
"sharp": "^0.34.1",
|
||||||
"stylus": "^0.64.0",
|
"stylus": "^0.64.0",
|
||||||
"svelte": "^5.28.2",
|
"svelte": "^5.28.2",
|
||||||
"tailwindcss": "^3.4.17",
|
"tailwindcss": "^4.1.4",
|
||||||
"typescript": "^5.8.3",
|
"typescript": "^5.8.3",
|
||||||
"unist-util-visit": "^5.0.0"
|
"unist-util-visit": "^5.0.0"
|
||||||
},
|
},
|
||||||
|
|||||||
591
pnpm-lock.yaml
generated
591
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
@@ -1,11 +0,0 @@
|
|||||||
import postcssImport from 'postcss-import';
|
|
||||||
import postcssNesting from 'tailwindcss/nesting/index.js';
|
|
||||||
import tailwindcss from 'tailwindcss';
|
|
||||||
|
|
||||||
export default {
|
|
||||||
plugins: {
|
|
||||||
'postcss-import': postcssImport, // to combine multiple css files
|
|
||||||
'tailwindcss/nesting': postcssNesting,
|
|
||||||
tailwindcss: tailwindcss,
|
|
||||||
}
|
|
||||||
};
|
|
||||||
@@ -79,7 +79,7 @@ function formatTag(tag: string[]) {
|
|||||||
{group.posts.map(post => (
|
{group.posts.map(post => (
|
||||||
<a href={getPostUrlBySlug(post.slug)}
|
<a href={getPostUrlBySlug(post.slug)}
|
||||||
aria-label={post.data.title}
|
aria-label={post.data.title}
|
||||||
class="group btn-plain !block h-10 w-full rounded-lg hover:text-[initial]"
|
class="group btn-plain block! h-10 w-full rounded-lg hover:text-[initial]"
|
||||||
>
|
>
|
||||||
<div class="flex flex-row justify-start items-center h-full">
|
<div class="flex flex-row justify-start items-center h-full">
|
||||||
<!-- date -->
|
<!-- date -->
|
||||||
@@ -100,13 +100,13 @@ function formatTag(tag: string[]) {
|
|||||||
<!-- post title -->
|
<!-- post title -->
|
||||||
<div class="w-[70%] md:max-w-[65%] md:w-[65%] text-left font-bold
|
<div class="w-[70%] md:max-w-[65%] md:w-[65%] text-left font-bold
|
||||||
group-hover:translate-x-1 transition-all group-hover:text-[var(--primary)]
|
group-hover:translate-x-1 transition-all group-hover:text-[var(--primary)]
|
||||||
text-75 pr-8 whitespace-nowrap overflow-ellipsis overflow-hidden"
|
text-75 pr-8 whitespace-nowrap text-ellipsis overflow-hidden"
|
||||||
>
|
>
|
||||||
{post.data.title}
|
{post.data.title}
|
||||||
</div>
|
</div>
|
||||||
<!-- tag list -->
|
<!-- tag list -->
|
||||||
<div class="hidden md:block md:w-[15%] text-left text-sm transition
|
<div class="hidden md:block md:w-[15%] text-left text-sm transition
|
||||||
whitespace-nowrap overflow-ellipsis overflow-hidden
|
whitespace-nowrap text-ellipsis overflow-hidden
|
||||||
text-30"
|
text-30"
|
||||||
>{formatTag(post.data.tags)}</div>
|
>{formatTag(post.data.tags)}</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -73,21 +73,21 @@ function hidePanel() {
|
|||||||
|
|
||||||
<div id="light-dark-panel" class="hidden lg:block absolute transition float-panel-closed top-11 -right-2 pt-5" >
|
<div id="light-dark-panel" class="hidden lg:block absolute transition float-panel-closed top-11 -right-2 pt-5" >
|
||||||
<div class="card-base float-panel p-2">
|
<div class="card-base float-panel p-2">
|
||||||
<button class="flex transition whitespace-nowrap items-center !justify-start w-full btn-plain scale-animation rounded-lg h-9 px-3 font-medium active:scale-95 mb-0.5"
|
<button class="flex transition whitespace-nowrap items-center justify-start! w-full btn-plain scale-animation rounded-lg h-9 px-3 font-medium active:scale-95 mb-0.5"
|
||||||
class:current-theme-btn={mode === LIGHT_MODE}
|
class:current-theme-btn={mode === LIGHT_MODE}
|
||||||
onclick={() => switchScheme(LIGHT_MODE)}
|
onclick={() => switchScheme(LIGHT_MODE)}
|
||||||
>
|
>
|
||||||
<Icon icon="material-symbols:wb-sunny-outline-rounded" class="text-[1.25rem] mr-3"></Icon>
|
<Icon icon="material-symbols:wb-sunny-outline-rounded" class="text-[1.25rem] mr-3"></Icon>
|
||||||
{i18n(I18nKey.lightMode)}
|
{i18n(I18nKey.lightMode)}
|
||||||
</button>
|
</button>
|
||||||
<button class="flex transition whitespace-nowrap items-center !justify-start w-full btn-plain scale-animation rounded-lg h-9 px-3 font-medium active:scale-95 mb-0.5"
|
<button class="flex transition whitespace-nowrap items-center justify-start! w-full btn-plain scale-animation rounded-lg h-9 px-3 font-medium active:scale-95 mb-0.5"
|
||||||
class:current-theme-btn={mode === DARK_MODE}
|
class:current-theme-btn={mode === DARK_MODE}
|
||||||
onclick={() => switchScheme(DARK_MODE)}
|
onclick={() => switchScheme(DARK_MODE)}
|
||||||
>
|
>
|
||||||
<Icon icon="material-symbols:dark-mode-outline-rounded" class="text-[1.25rem] mr-3"></Icon>
|
<Icon icon="material-symbols:dark-mode-outline-rounded" class="text-[1.25rem] mr-3"></Icon>
|
||||||
{i18n(I18nKey.darkMode)}
|
{i18n(I18nKey.darkMode)}
|
||||||
</button>
|
</button>
|
||||||
<button class="flex transition whitespace-nowrap items-center !justify-start w-full btn-plain scale-animation rounded-lg h-9 px-3 font-medium active:scale-95"
|
<button class="flex transition whitespace-nowrap items-center justify-start! w-full btn-plain scale-animation rounded-lg h-9 px-3 font-medium active:scale-95"
|
||||||
class:current-theme-btn={mode === AUTO_MODE}
|
class:current-theme-btn={mode === AUTO_MODE}
|
||||||
onclick={() => switchScheme(AUTO_MODE)}
|
onclick={() => switchScheme(AUTO_MODE)}
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ let links: NavBarLink[] = navBarConfig.links.map(
|
|||||||
<div class="absolute h-8 left-0 right-0 -top-8 bg-[var(--card-bg)] transition"></div> <!-- used for onload animation -->
|
<div class="absolute h-8 left-0 right-0 -top-8 bg-[var(--card-bg)] transition"></div> <!-- used for onload animation -->
|
||||||
<div class:list={[
|
<div class:list={[
|
||||||
className,
|
className,
|
||||||
"card-base !overflow-visible max-w-[var(--page-width)] h-[4.5rem] !rounded-t-none mx-auto flex items-center justify-between px-4"]}>
|
"card-base overflow-visible! max-w-[var(--page-width)] h-[4.5rem] rounded-t-none! mx-auto flex items-center justify-between px-4"]}>
|
||||||
<a href={url('/')} class="btn-plain scale-animation rounded-lg h-[3.25rem] px-5 font-bold active:scale-95">
|
<a href={url('/')} class="btn-plain scale-animation rounded-lg h-[3.25rem] px-5 font-bold active:scale-95">
|
||||||
<div class="flex flex-row text-[var(--primary)] items-center text-md">
|
<div class="flex flex-row text-[var(--primary)] items-center text-md">
|
||||||
<Icon name="material-symbols:home-outline-rounded" class="text-[1.75rem] mb-1 mr-2" />
|
<Icon name="material-symbols:home-outline-rounded" class="text-[1.75rem] mb-1 mr-2" />
|
||||||
@@ -51,7 +51,7 @@ let links: NavBarLink[] = navBarConfig.links.map(
|
|||||||
</button>
|
</button>
|
||||||
)}
|
)}
|
||||||
<LightDarkSwitch client:only="svelte"></LightDarkSwitch>
|
<LightDarkSwitch client:only="svelte"></LightDarkSwitch>
|
||||||
<button aria-label="Menu" name="Nav Menu" class="btn-plain scale-animation rounded-lg w-11 h-11 active:scale-90 md:!hidden" id="nav-menu-switch">
|
<button aria-label="Menu" name="Nav Menu" class="btn-plain scale-animation rounded-lg w-11 h-11 active:scale-90 md:hidden!" id="nav-menu-switch">
|
||||||
<Icon name="material-symbols:menu-rounded" class="text-[1.25rem]"></Icon>
|
<Icon name="material-symbols:menu-rounded" class="text-[1.25rem]"></Icon>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -52,8 +52,8 @@ const { remarkPluginFrontmatter } = await entry.render();
|
|||||||
before:absolute before:top-[35px] before:left-[18px] before:hidden md:before:block
|
before:absolute before:top-[35px] before:left-[18px] before:hidden md:before:block
|
||||||
">
|
">
|
||||||
{title}
|
{title}
|
||||||
<Icon class="inline text-[2rem] text-[var(--primary)] md:hidden translate-y-0.5 absolute" name="material-symbols:chevron-right-rounded" ></Icon>
|
<Icon class="inline text-[2rem] text-[var(--primary)] md:hidden translate-y-1/2 absolute" name="material-symbols:chevron-right-rounded" ></Icon>
|
||||||
<Icon class="text-[var(--primary)] text-[2rem] transition hidden md:inline absolute translate-y-0.5 opacity-0 group-hover:opacity-100 -translate-x-1 group-hover:translate-x-0" name="material-symbols:chevron-right-rounded"></Icon>
|
<Icon class="text-[var(--primary)] text-[2rem] transition hidden md:inline absolute translate-y-1/2 opacity-0 group-hover:opacity-100 -translate-x-1 group-hover:translate-x-0" name="material-symbols:chevron-right-rounded"></Icon>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<!-- metadata -->
|
<!-- metadata -->
|
||||||
|
|||||||
@@ -106,7 +106,7 @@ $: search(keywordMobile, false);
|
|||||||
|
|
||||||
<!-- toggle btn for phone/tablet view -->
|
<!-- toggle btn for phone/tablet view -->
|
||||||
<button on:click={togglePanel} aria-label="Search Panel" id="search-switch"
|
<button on:click={togglePanel} aria-label="Search Panel" id="search-switch"
|
||||||
class="btn-plain scale-animation lg:!hidden rounded-lg w-11 h-11 active:scale-90">
|
class="btn-plain scale-animation lg:hidden! rounded-lg w-11 h-11 active:scale-90">
|
||||||
<Icon icon="material-symbols:search" class="text-[1.25rem]"></Icon>
|
<Icon icon="material-symbols:search" class="text-[1.25rem]"></Icon>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ const { badge, url, label } = Astro.props;
|
|||||||
}
|
}
|
||||||
>
|
>
|
||||||
<div class="flex items-center justify-between relative mr-2">
|
<div class="flex items-center justify-between relative mr-2">
|
||||||
<div class="overflow-hidden text-left whitespace-nowrap overflow-ellipsis ">
|
<div class="overflow-hidden text-left whitespace-nowrap text-ellipsis ">
|
||||||
<slot></slot>
|
<slot></slot>
|
||||||
</div>
|
</div>
|
||||||
{ badge !== undefined && badge !== null && badge !== '' &&
|
{ badge !== undefined && badge !== null && badge !== '' &&
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ interface Props {
|
|||||||
}
|
}
|
||||||
const className = Astro.props.class;
|
const className = Astro.props.class;
|
||||||
---
|
---
|
||||||
<div data-pagefind-body class=`prose dark:prose-invert prose-base !max-w-none custom-md ${className}`>
|
<div data-pagefind-body class=`prose dark:prose-invert prose-base max-w-none! custom-md ${className}`>
|
||||||
<!--<div class="prose dark:prose-invert max-w-none custom-md">-->
|
<!--<div class="prose dark:prose-invert max-w-none custom-md">-->
|
||||||
<!--<div class="max-w-none custom-md">-->
|
<!--<div class="max-w-none custom-md">-->
|
||||||
<slot/>
|
<slot/>
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ $: if (hue || hue === 0) {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="w-full h-6 px-1 bg-[oklch(0.80_0.10_0)] dark:bg-[oklch(0.70_0.10_0)] rounded select-none">
|
<div class="w-full h-6 px-1 bg-[oklch(0.80_0.10_0)] dark:bg-[oklch(0.70_0.10_0)] rounded-sm select-none">
|
||||||
<input aria-label={i18n(I18nKey.themeColor)} type="range" min="0" max="360" bind:value={hue}
|
<input aria-label={i18n(I18nKey.themeColor)} type="range" min="0" max="360" bind:value={hue}
|
||||||
class="slider" id="colorSlider" step="5" style="width: 100%">
|
class="slider" id="colorSlider" step="5" style="width: 100%">
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ const maxLevel = siteConfig.toc.depth;
|
|||||||
>
|
>
|
||||||
{heading.depth == minDepth && heading1Count++}
|
{heading.depth == minDepth && heading1Count++}
|
||||||
{heading.depth == minDepth + 1 && <div class="transition w-2 h-2 rounded-[0.1875rem] bg-[var(--toc-badge-bg)]"></div>}
|
{heading.depth == minDepth + 1 && <div class="transition w-2 h-2 rounded-[0.1875rem] bg-[var(--toc-badge-bg)]"></div>}
|
||||||
{heading.depth == minDepth + 2 && <div class="transition w-1.5 h-1.5 rounded-sm bg-black/5 dark:bg-white/10"></div>}
|
{heading.depth == minDepth + 2 && <div class="transition w-1.5 h-1.5 rounded-xs bg-black/5 dark:bg-white/10"></div>}
|
||||||
</div>
|
</div>
|
||||||
<div class:list={["transition text-sm", {
|
<div class:list={["transition text-sm", {
|
||||||
"text-50": heading.depth == minDepth || heading.depth == minDepth + 1,
|
"text-50": heading.depth == minDepth || heading.depth == minDepth + 1,
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ import { defaultFavicons } from "../constants/icon";
|
|||||||
import type { Favicon } from "../types/config";
|
import type { Favicon } from "../types/config";
|
||||||
import { url, pathsEqual } from "../utils/url-utils";
|
import { url, pathsEqual } from "../utils/url-utils";
|
||||||
import "katex/dist/katex.css";
|
import "katex/dist/katex.css";
|
||||||
|
import "../styles/main.css";
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
title?: string;
|
title?: string;
|
||||||
@@ -164,34 +165,6 @@ const bannerOffset =
|
|||||||
'banner-height-home': `${BANNER_HEIGHT_HOME}vh`,
|
'banner-height-home': `${BANNER_HEIGHT_HOME}vh`,
|
||||||
'banner-height': `${BANNER_HEIGHT}vh`,
|
'banner-height': `${BANNER_HEIGHT}vh`,
|
||||||
}}>
|
}}>
|
||||||
@tailwind components;
|
|
||||||
@layer components {
|
|
||||||
.enable-banner.is-home #banner-wrapper {
|
|
||||||
@apply h-[var(--banner-height-home)] translate-y-[var(--banner-height-extend)]
|
|
||||||
}
|
|
||||||
.enable-banner #banner-wrapper {
|
|
||||||
@apply h-[var(--banner-height-home)]
|
|
||||||
}
|
|
||||||
|
|
||||||
.enable-banner.is-home #banner {
|
|
||||||
@apply h-[var(--banner-height-home)] translate-y-0
|
|
||||||
}
|
|
||||||
.enable-banner #banner {
|
|
||||||
@apply h-[var(--banner-height-home)] translate-y-[var(--bannerOffset)]
|
|
||||||
}
|
|
||||||
.enable-banner.is-home #main-grid {
|
|
||||||
@apply translate-y-[var(--banner-height-extend)];
|
|
||||||
}
|
|
||||||
.enable-banner #top-row {
|
|
||||||
@apply h-[calc(var(--banner-height-home)_-_4.5rem)] transition-all duration-300
|
|
||||||
}
|
|
||||||
.enable-banner.is-home #sidebar-sticky {
|
|
||||||
@apply top-[calc(1rem_-_var(--banner-height-extend))]
|
|
||||||
}
|
|
||||||
.navbar-hidden {
|
|
||||||
@apply opacity-0 -translate-y-16
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
@@ -212,50 +185,6 @@ import {
|
|||||||
} from "../constants/constants";
|
} from "../constants/constants";
|
||||||
import { siteConfig } from '../config';
|
import { siteConfig } from '../config';
|
||||||
|
|
||||||
/* Preload fonts */
|
|
||||||
// (async function() {
|
|
||||||
// try {
|
|
||||||
// await Promise.all([
|
|
||||||
// document.fonts.load("400 1em Roboto"),
|
|
||||||
// document.fonts.load("700 1em Roboto"),
|
|
||||||
// ]);
|
|
||||||
// document.body.classList.remove("hidden");
|
|
||||||
// } catch (error) {
|
|
||||||
// console.log("Failed to load fonts:", error);
|
|
||||||
// }
|
|
||||||
// })();
|
|
||||||
|
|
||||||
/* TODO This is a temporary solution for style flicker issue when the transition is activated */
|
|
||||||
/* issue link: https://github.com/withastro/astro/issues/8711, the solution get from here too */
|
|
||||||
/* update: fixed in Astro 3.2.4 */
|
|
||||||
/*
|
|
||||||
function disableAnimation() {
|
|
||||||
const css = document.createElement('style')
|
|
||||||
css.appendChild(
|
|
||||||
document.createTextNode(
|
|
||||||
`*{
|
|
||||||
-webkit-transition:none!important;
|
|
||||||
-moz-transition:none!important;
|
|
||||||
-o-transition:none!important;
|
|
||||||
-ms-transition:none!important;
|
|
||||||
transition:none!important
|
|
||||||
}`
|
|
||||||
)
|
|
||||||
)
|
|
||||||
document.head.appendChild(css)
|
|
||||||
|
|
||||||
return () => {
|
|
||||||
// Force restyle
|
|
||||||
;(() => window.getComputedStyle(document.body))()
|
|
||||||
|
|
||||||
// Wait for next tick before removing
|
|
||||||
setTimeout(() => {
|
|
||||||
document.head.removeChild(css)
|
|
||||||
}, 1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
const bannerEnabled = !!document.getElementById('banner-wrapper')
|
const bannerEnabled = !!document.getElementById('banner-wrapper')
|
||||||
|
|
||||||
function setClickOutsideToClose(panel: string, ignores: string[]) {
|
function setClickOutsideToClose(panel: string, ignores: string[]) {
|
||||||
|
|||||||
@@ -112,9 +112,9 @@ const jsonLd = {
|
|||||||
<div class="flex flex-col md:flex-row justify-between mb-4 gap-4 overflow-hidden w-full">
|
<div class="flex flex-col md:flex-row justify-between mb-4 gap-4 overflow-hidden w-full">
|
||||||
<a href={entry.data.nextSlug ? getPostUrlBySlug(entry.data.nextSlug) : "#"}
|
<a href={entry.data.nextSlug ? getPostUrlBySlug(entry.data.nextSlug) : "#"}
|
||||||
class:list={["w-full font-bold overflow-hidden active:scale-95", {"pointer-events-none": !entry.data.nextSlug}]}>
|
class:list={["w-full font-bold overflow-hidden active:scale-95", {"pointer-events-none": !entry.data.nextSlug}]}>
|
||||||
{entry.data.nextSlug && <div class="btn-card rounded-2xl w-full h-[3.75rem] max-w-full px-4 flex items-center !justify-start gap-4" >
|
{entry.data.nextSlug && <div class="btn-card rounded-2xl w-full h-[3.75rem] max-w-full px-4 flex items-center justify-start! gap-4" >
|
||||||
<Icon name="material-symbols:chevron-left-rounded" class="text-[2rem] text-[var(--primary)]" />
|
<Icon name="material-symbols:chevron-left-rounded" class="text-[2rem] text-[var(--primary)]" />
|
||||||
<div class="overflow-hidden transition overflow-ellipsis whitespace-nowrap max-w-[calc(100%_-_3rem)] text-black/75 dark:text-white/75">
|
<div class="overflow-hidden transition text-ellipsis whitespace-nowrap max-w-[calc(100%_-_3rem)] text-black/75 dark:text-white/75">
|
||||||
{entry.data.nextTitle}
|
{entry.data.nextTitle}
|
||||||
</div>
|
</div>
|
||||||
</div>}
|
</div>}
|
||||||
@@ -122,8 +122,8 @@ const jsonLd = {
|
|||||||
|
|
||||||
<a href={entry.data.prevSlug ? getPostUrlBySlug(entry.data.prevSlug) : "#"}
|
<a href={entry.data.prevSlug ? getPostUrlBySlug(entry.data.prevSlug) : "#"}
|
||||||
class:list={["w-full font-bold overflow-hidden active:scale-95", {"pointer-events-none": !entry.data.prevSlug}]}>
|
class:list={["w-full font-bold overflow-hidden active:scale-95", {"pointer-events-none": !entry.data.prevSlug}]}>
|
||||||
{entry.data.prevSlug && <div class="btn-card rounded-2xl w-full h-[3.75rem] max-w-full px-4 flex items-center !justify-end gap-4">
|
{entry.data.prevSlug && <div class="btn-card rounded-2xl w-full h-[3.75rem] max-w-full px-4 flex items-center justify-end! gap-4">
|
||||||
<div class="overflow-hidden transition overflow-ellipsis whitespace-nowrap max-w-[calc(100%_-_3rem)] text-black/75 dark:text-white/75">
|
<div class="overflow-hidden transition text-ellipsis whitespace-nowrap max-w-[calc(100%_-_3rem)] text-black/75 dark:text-white/75">
|
||||||
{entry.data.prevTitle}
|
{entry.data.prevTitle}
|
||||||
</div>
|
</div>
|
||||||
<Icon name="material-symbols:chevron-right-rounded" class="text-[2rem] text-[var(--primary)]" />
|
<Icon name="material-symbols:chevron-right-rounded" class="text-[2rem] text-[var(--primary)]" />
|
||||||
|
|||||||
@@ -1,131 +1,204 @@
|
|||||||
@tailwind components;
|
@import "tailwindcss";
|
||||||
|
@import "./markdown.css";
|
||||||
|
@import "./transition.css";
|
||||||
|
@import "./scrollbar.css";
|
||||||
|
@import "./photoswipe.css";
|
||||||
|
|
||||||
|
@plugin '@tailwindcss/typography';
|
||||||
|
|
||||||
|
@custom-variant dark (&:is(.dark *));
|
||||||
|
|
||||||
|
@theme {
|
||||||
|
--font-sans:
|
||||||
|
Roboto, sans-serif, ui-sans-serif, system-ui, sans-serif,
|
||||||
|
'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
|
||||||
|
}
|
||||||
|
|
||||||
|
@utility card-base {
|
||||||
|
@apply rounded-[var(--radius-large)] overflow-hidden bg-[var(--card-bg)] transition;
|
||||||
|
}
|
||||||
|
|
||||||
|
@utility card-shadow {
|
||||||
|
@apply drop-shadow-[0_2px_4px_rgba(0,0,0,0.005)];
|
||||||
|
}
|
||||||
|
|
||||||
|
@utility expand-animation {
|
||||||
|
@apply relative before:ease-out before:transition active:bg-none hover:before:bg-[var(--btn-plain-bg-hover)] active:before:bg-[var(--btn-plain-bg-active)] z-0
|
||||||
|
before:absolute before:rounded-[inherit] before:inset-0 before:scale-[0.85] hover:before:scale-100 before:-z-10;
|
||||||
|
}
|
||||||
|
|
||||||
|
@utility link {
|
||||||
|
@apply transition rounded-md p-1 -m-1 expand-animation;
|
||||||
|
}
|
||||||
|
|
||||||
|
@utility link-lg {
|
||||||
|
@apply transition rounded-md p-1.5 -m-1.5 expand-animation;
|
||||||
|
}
|
||||||
|
|
||||||
|
@utility float-panel {
|
||||||
|
@apply top-[5.25rem] rounded-[var(--radius-large)] overflow-hidden bg-[var(--float-panel-bg)] transition shadow-xl dark:shadow-none;
|
||||||
|
}
|
||||||
|
|
||||||
|
@utility float-panel-closed {
|
||||||
|
@apply -translate-y-1 opacity-0 pointer-events-none;
|
||||||
|
}
|
||||||
|
|
||||||
|
@utility search-panel {
|
||||||
|
& mark {
|
||||||
|
@apply bg-transparent text-[var(--primary)];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@utility btn-card {
|
||||||
|
@apply transition flex items-center justify-center bg-[var(--card-bg)] hover:bg-[var(--btn-card-bg-hover)]
|
||||||
|
active:bg-[var(--btn-card-bg-active)];
|
||||||
|
&.disabled {
|
||||||
|
@apply pointer-events-none text-black/10 dark:text-white/10;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@utility disabled {
|
||||||
|
&.btn-card {
|
||||||
|
@apply pointer-events-none text-black/10 dark:text-white/10;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@utility btn-plain {
|
||||||
|
@apply transition relative flex items-center justify-center bg-none
|
||||||
|
text-black/75 hover:text-[var(--primary)] dark:text-white/75 dark:hover:text-[var(--primary)];
|
||||||
|
&:not(.scale-animation) {
|
||||||
|
@apply hover:bg-[var(--btn-plain-bg-hover)] active:bg-[var(--btn-plain-bg-active)];
|
||||||
|
}
|
||||||
|
&.scale-animation {
|
||||||
|
@apply expand-animation;
|
||||||
|
&.current-theme-btn {
|
||||||
|
@apply before:scale-100 before:opacity-100 before:bg-[var(--btn-plain-bg-hover)] text-[var(--primary)];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@utility btn-regular {
|
||||||
|
@apply transition flex items-center justify-center bg-[var(--btn-regular-bg)] hover:bg-[var(--btn-regular-bg-hover)] active:bg-[var(--btn-regular-bg-active)]
|
||||||
|
text-[var(--btn-content)] dark:text-white/75;
|
||||||
|
}
|
||||||
|
|
||||||
|
@utility link-underline {
|
||||||
|
@apply transition underline decoration-2 decoration-dashed decoration-[var(--link-underline)]
|
||||||
|
hover:decoration-[var(--link-hover)] active:decoration-[var(--link-active)] underline-offset-[0.25rem];
|
||||||
|
}
|
||||||
|
|
||||||
|
@utility toc-hide {
|
||||||
|
@apply opacity-0 pointer-events-none;
|
||||||
|
}
|
||||||
|
|
||||||
|
@utility toc-not-ready {
|
||||||
|
@apply opacity-0 pointer-events-none;
|
||||||
|
}
|
||||||
|
|
||||||
|
@utility hide-scrollbar {
|
||||||
|
scrollbar-width: none;
|
||||||
|
-ms-overflow-style: none;
|
||||||
|
&::-webkit-scrollbar {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@utility text-90 {
|
||||||
|
@apply text-black/90 dark:text-white/90;
|
||||||
|
}
|
||||||
|
|
||||||
|
@utility text-75 {
|
||||||
|
@apply text-black/75 dark:text-white/75;
|
||||||
|
}
|
||||||
|
|
||||||
|
@utility text-50 {
|
||||||
|
@apply text-black/50 dark:text-white/50;
|
||||||
|
}
|
||||||
|
|
||||||
|
@utility text-30 {
|
||||||
|
@apply text-black/30 dark:text-white/30;
|
||||||
|
}
|
||||||
|
|
||||||
|
@utility text-25 {
|
||||||
|
@apply text-black/25 dark:text-white/25;
|
||||||
|
}
|
||||||
|
|
||||||
|
@utility meta-icon {
|
||||||
|
@apply w-8 h-8 transition rounded-md flex items-center justify-center bg-[var(--btn-regular-bg)]
|
||||||
|
text-[var(--btn-content)] mr-2;
|
||||||
|
}
|
||||||
|
|
||||||
|
@utility with-divider {
|
||||||
|
@apply before:content-['/'] before:ml-1.5 before:mr-1.5 before:text-[var(--meta-divider)] before:text-sm
|
||||||
|
before:font-medium first-of-type:before:hidden before:transition;
|
||||||
|
}
|
||||||
|
|
||||||
|
@utility btn-regular-dark {
|
||||||
|
@apply flex items-center justify-center
|
||||||
|
bg-[oklch(0.45_0.01_var(--hue))] hover:bg-[oklch(0.50_0.01_var(--hue))] active:bg-[oklch(0.55_0.01_var(--hue))]
|
||||||
|
dark:bg-[oklch(0.30_0.02_var(--hue))] dark:hover:bg-[oklch(0.35_0.03_var(--hue))] dark:active:bg-[oklch(0.40_0.03_var(--hue))];
|
||||||
|
&.success {
|
||||||
|
@apply bg-[oklch(0.75_0.14_var(--hue))] dark:bg-[oklch(0.75_0.14_var(--hue))];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@utility success {
|
||||||
|
&.btn-regular-dark {
|
||||||
|
@apply bg-[oklch(0.75_0.14_var(--hue))] dark:bg-[oklch(0.75_0.14_var(--hue))];
|
||||||
|
}
|
||||||
|
&.copy-btn .copy-icon {
|
||||||
|
@apply opacity-0 fill-[var(--deep-text)];
|
||||||
|
}
|
||||||
|
&.copy-btn .success-icon {
|
||||||
|
@apply opacity-100;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@utility copy-btn-icon {
|
||||||
|
@apply absolute top-1/2 left-1/2 transition -translate-x-1/2 -translate-y-1/2;
|
||||||
|
}
|
||||||
|
|
||||||
|
@utility copy-btn {
|
||||||
|
& .copy-icon {
|
||||||
|
@apply opacity-100 fill-white dark:fill-white/75;
|
||||||
|
}
|
||||||
|
&.success .copy-icon {
|
||||||
|
@apply opacity-0 fill-[var(--deep-text)];
|
||||||
|
}
|
||||||
|
& .success-icon {
|
||||||
|
@apply opacity-0;
|
||||||
|
}
|
||||||
|
&.success .success-icon {
|
||||||
|
@apply opacity-100;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@utility copy-icon {
|
||||||
|
.copy-btn & {
|
||||||
|
@apply opacity-100 fill-white dark:fill-white/75;
|
||||||
|
}
|
||||||
|
.copy-btn.success & {
|
||||||
|
@apply opacity-0 fill-[var(--deep-text)];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@utility success-icon {
|
||||||
|
.copy-btn & {
|
||||||
|
@apply opacity-0;
|
||||||
|
}
|
||||||
|
.copy-btn.success & {
|
||||||
|
@apply opacity-100;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@layer components {
|
@layer components {
|
||||||
.card-base {
|
|
||||||
@apply rounded-[var(--radius-large)] overflow-hidden bg-[var(--card-bg)] transition;
|
|
||||||
}
|
|
||||||
h1, h2, h3, h4, h5, h6, p, a, span, li, ul, ol, blockquote, code, pre, table, th, td, strong {
|
h1, h2, h3, h4, h5, h6, p, a, span, li, ul, ol, blockquote, code, pre, table, th, td, strong {
|
||||||
@apply transition;
|
@apply transition;
|
||||||
}
|
}
|
||||||
.card-shadow {
|
|
||||||
@apply drop-shadow-[0_2px_4px_rgba(0,0,0,0.005)]
|
|
||||||
}
|
|
||||||
.expand-animation {
|
|
||||||
@apply relative before:ease-out before:transition active:bg-none hover:before:bg-[var(--btn-plain-bg-hover)] active:before:bg-[var(--btn-plain-bg-active)] z-0
|
|
||||||
before:absolute before:rounded-[inherit] before:inset-0 before:scale-[0.85] hover:before:scale-100 before:-z-10
|
|
||||||
}
|
|
||||||
.link {
|
|
||||||
@apply transition rounded-md p-1 -m-1 expand-animation;
|
|
||||||
}
|
|
||||||
.link-lg {
|
|
||||||
@apply transition rounded-md p-1.5 -m-1.5 expand-animation;
|
|
||||||
}
|
|
||||||
.float-panel {
|
|
||||||
@apply top-[5.25rem] rounded-[var(--radius-large)] overflow-hidden bg-[var(--float-panel-bg)] transition shadow-xl dark:shadow-none
|
|
||||||
}
|
|
||||||
.float-panel-closed {
|
|
||||||
@apply -translate-y-1 opacity-0 pointer-events-none
|
|
||||||
}
|
|
||||||
.search-panel mark {
|
|
||||||
@apply bg-transparent text-[var(--primary)]
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-card {
|
|
||||||
@apply transition flex items-center justify-center bg-[var(--card-bg)] hover:bg-[var(--btn-card-bg-hover)]
|
|
||||||
active:bg-[var(--btn-card-bg-active)]
|
|
||||||
}
|
|
||||||
.btn-card.disabled {
|
|
||||||
@apply pointer-events-none text-black/10 dark:text-white/10
|
|
||||||
}
|
|
||||||
.btn-plain {
|
|
||||||
@apply transition relative flex items-center justify-center bg-none
|
|
||||||
text-black/75 hover:text-[var(--primary)] dark:text-white/75 dark:hover:text-[var(--primary)];
|
|
||||||
&:not(.scale-animation) {
|
|
||||||
@apply hover:bg-[var(--btn-plain-bg-hover)] active:bg-[var(--btn-plain-bg-active)]
|
|
||||||
}
|
|
||||||
&.scale-animation {
|
|
||||||
@apply expand-animation;
|
|
||||||
&.current-theme-btn {
|
|
||||||
@apply before:scale-100 before:opacity-100 before:bg-[var(--btn-plain-bg-hover)] text-[var(--primary)]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.btn-regular {
|
|
||||||
@apply transition flex items-center justify-center bg-[var(--btn-regular-bg)] hover:bg-[var(--btn-regular-bg-hover)] active:bg-[var(--btn-regular-bg-active)]
|
|
||||||
text-[var(--btn-content)] dark:text-white/75
|
|
||||||
}
|
|
||||||
|
|
||||||
.link-underline {
|
|
||||||
@apply transition underline decoration-2 decoration-dashed decoration-[var(--link-underline)]
|
|
||||||
hover:decoration-[var(--link-hover)] active:decoration-[var(--link-active)] underline-offset-[0.25rem]
|
|
||||||
}
|
|
||||||
|
|
||||||
.toc-hide,
|
|
||||||
.toc-not-ready {
|
|
||||||
@apply opacity-0 pointer-events-none
|
|
||||||
}
|
|
||||||
|
|
||||||
#toc-inner-wrapper {
|
#toc-inner-wrapper {
|
||||||
mask-image: linear-gradient(to bottom, transparent 0%, black 2rem, black calc(100% - 2rem), transparent 100%);
|
mask-image: linear-gradient(to bottom, transparent 0%, black 2rem, black calc(100% - 2rem), transparent 100%);
|
||||||
}
|
}
|
||||||
|
|
||||||
.hide-scrollbar {
|
|
||||||
scrollbar-width: none;
|
|
||||||
-ms-overflow-style: none;
|
|
||||||
}
|
|
||||||
.hide-scrollbar::-webkit-scrollbar {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.text-90 {
|
|
||||||
@apply text-black/90 dark:text-white/90
|
|
||||||
}
|
|
||||||
.text-75 {
|
|
||||||
@apply text-black/75 dark:text-white/75
|
|
||||||
}
|
|
||||||
.text-50 {
|
|
||||||
@apply text-black/50 dark:text-white/50
|
|
||||||
}
|
|
||||||
.text-30 {
|
|
||||||
@apply text-black/30 dark:text-white/30
|
|
||||||
}
|
|
||||||
.text-25 {
|
|
||||||
@apply text-black/25 dark:text-white/25
|
|
||||||
}
|
|
||||||
|
|
||||||
.meta-icon {
|
|
||||||
@apply w-8 h-8 transition rounded-md flex items-center justify-center bg-[var(--btn-regular-bg)]
|
|
||||||
text-[var(--btn-content)] mr-2
|
|
||||||
}
|
|
||||||
.with-divider {
|
|
||||||
@apply before:content-['/'] before:ml-1.5 before:mr-1.5 before:text-[var(--meta-divider)] before:text-sm
|
|
||||||
before:font-medium before:first-of-type:hidden before:transition
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-regular-dark {
|
|
||||||
@apply flex items-center justify-center
|
|
||||||
bg-[oklch(0.45_0.01_var(--hue))] hover:bg-[oklch(0.50_0.01_var(--hue))] active:bg-[oklch(0.55_0.01_var(--hue))]
|
|
||||||
dark:bg-[oklch(0.30_0.02_var(--hue))] dark:hover:bg-[oklch(0.35_0.03_var(--hue))] dark:active:bg-[oklch(0.40_0.03_var(--hue))]
|
|
||||||
}
|
|
||||||
.btn-regular-dark.success {
|
|
||||||
@apply bg-[oklch(0.75_0.14_var(--hue))] dark:bg-[oklch(0.75_0.14_var(--hue))]
|
|
||||||
}
|
|
||||||
|
|
||||||
.copy-btn-icon {
|
|
||||||
@apply absolute top-1/2 left-1/2 transition -translate-x-1/2 -translate-y-1/2
|
|
||||||
}
|
|
||||||
.copy-btn .copy-icon {
|
|
||||||
@apply opacity-100 fill-white dark:fill-white/75
|
|
||||||
}
|
|
||||||
.copy-btn.success .copy-icon {
|
|
||||||
@apply opacity-0 fill-[var(--deep-text)]
|
|
||||||
}
|
|
||||||
.copy-btn .success-icon {
|
|
||||||
@apply opacity-0
|
|
||||||
}
|
|
||||||
.copy-btn.success .success-icon {
|
|
||||||
@apply opacity-100
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.custom-md img, #post-cover img {
|
.custom-md img, #post-cover img {
|
||||||
@@ -155,3 +228,29 @@
|
|||||||
.collapsed {
|
.collapsed {
|
||||||
height: var(--collapsedHeight);
|
height: var(--collapsedHeight);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.enable-banner.is-home #banner-wrapper {
|
||||||
|
@apply h-[var(--banner-height-home)] translate-y-[var(--banner-height-extend)]
|
||||||
|
}
|
||||||
|
.enable-banner #banner-wrapper {
|
||||||
|
@apply h-[var(--banner-height-home)]
|
||||||
|
}
|
||||||
|
|
||||||
|
.enable-banner.is-home #banner {
|
||||||
|
@apply h-[var(--banner-height-home)] translate-none
|
||||||
|
}
|
||||||
|
.enable-banner #banner {
|
||||||
|
@apply h-[var(--banner-height-home)] translate-y-[var(--bannerOffset)]
|
||||||
|
}
|
||||||
|
.enable-banner.is-home #main-grid {
|
||||||
|
@apply translate-y-[var(--banner-height-extend)];
|
||||||
|
}
|
||||||
|
.enable-banner #top-row {
|
||||||
|
@apply h-[calc(var(--banner-height-home)_-_4.5rem)] transition-all duration-300
|
||||||
|
}
|
||||||
|
.enable-banner.is-home #sidebar-sticky {
|
||||||
|
@apply top-[calc(1rem_-_var(--banner-height-extend))]
|
||||||
|
}
|
||||||
|
.navbar-hidden {
|
||||||
|
@apply opacity-0 -translate-y-4
|
||||||
|
}
|
||||||
@@ -5,16 +5,16 @@
|
|||||||
|
|
||||||
h1, h2, h3, h4, h5, h6 {
|
h1, h2, h3, h4, h5, h6 {
|
||||||
.anchor {
|
.anchor {
|
||||||
@apply transition -m-0.5 ml-[0.2ch] p-0.5 select-none opacity-0 no-underline !important;
|
@apply transition -m-0.5 ml-[0.2ch] p-0.5 select-none opacity-0 no-underline;
|
||||||
|
|
||||||
.anchor-icon {
|
.anchor-icon {
|
||||||
@apply mx-[0.45ch] !important;
|
@apply mx-[0.45ch];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
.anchor {
|
.anchor {
|
||||||
@apply opacity-100 !important;
|
@apply opacity-100;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -59,7 +59,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
pre {
|
pre {
|
||||||
@apply bg-[var(--codeblock-bg)] !important;
|
@apply bg-[var(--codeblock-bg)];
|
||||||
@apply rounded-xl px-5;
|
@apply rounded-xl px-5;
|
||||||
|
|
||||||
code {
|
code {
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
.pswp__button {
|
.pswp__button {
|
||||||
@apply transition bg-black/40 hover:bg-black/50 active:bg-black/60 flex items-center justify-center mr-0 w-12 h-12 !important;
|
@apply transition bg-black/40 hover:bg-black/50 active:bg-black/60 flex items-center justify-center mr-0 w-12 h-12;
|
||||||
}
|
}
|
||||||
.pswp__button--zoom, .pswp__button--close {
|
.pswp__button--zoom, .pswp__button--close {
|
||||||
@apply mt-4 rounded-xl active:scale-90 !important;
|
@apply mt-4 rounded-xl active:scale-90;
|
||||||
}
|
}
|
||||||
.pswp__button--zoom {
|
.pswp__button--zoom {
|
||||||
@apply mr-2.5 !important;
|
@apply mr-2.5;
|
||||||
}
|
}
|
||||||
.pswp__button--close {
|
.pswp__button--close {
|
||||||
@apply mr-4 !important;
|
@apply mr-4;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,14 +0,0 @@
|
|||||||
/** @type {import('tailwindcss').Config} */
|
|
||||||
const defaultTheme = require("tailwindcss/defaultTheme")
|
|
||||||
module.exports = {
|
|
||||||
content: ["./src/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue,mjs}"],
|
|
||||||
darkMode: "class", // allows toggling dark mode manually
|
|
||||||
theme: {
|
|
||||||
extend: {
|
|
||||||
fontFamily: {
|
|
||||||
sans: ["Roboto", "sans-serif", ...defaultTheme.fontFamily.sans],
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
plugins: [require("@tailwindcss/typography")],
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user