feature/sidebar #8

Merged
ilia merged 50 commits from feature/sidebar into main 2026-01-03 10:56:23 +00:00
39 changed files with 189 additions and 47 deletions
Showing only changes of commit 4ba02b5933 - Show all commits

View File

@@ -1,4 +1,7 @@
import { expect, test } from '@playwright/test'; import {
expect,
test,
} from '@playwright/test';
test('home page has expected h1', async ({ page }) => { test('home page has expected h1', async ({ page }) => {
await page.goto('/'); await page.goto('/');

View File

@@ -1,5 +1,9 @@
declare module '*.svelte' { declare module '*.svelte' {
import type { ComponentProps as SvelteComponentProps, ComponentType, Snippet } from 'svelte'; import type {
ComponentProps as SvelteComponentProps,
ComponentType,
Snippet,
} from 'svelte';
import type { HTMLAttributes } from 'svelte/elements'; import type { HTMLAttributes } from 'svelte/elements';
interface Component { interface Component {

View File

@@ -1,4 +1,8 @@
export type { FontCategory, FontProvider, FontSubset } from './model/font'; export type {
FontCategory,
FontProvider,
FontSubset,
} from './model/font';
export type { export type {
FontshareApiModel, FontshareApiModel,
FontshareDesigner, FontshareDesigner,
@@ -10,4 +14,9 @@ export type {
FontshareTag, FontshareTag,
FontshareWeight, FontshareWeight,
} from './model/fontshare_fonts'; } from './model/fontshare_fonts';
export type { FontFiles, FontItem, FontVariant, GoogleFontsApiModel } from './model/google_fonts'; export type {
FontFiles,
FontItem,
FontVariant,
GoogleFontsApiModel,
} from './model/google_fonts';

View File

@@ -2,4 +2,8 @@ import { FONT_CATEGORIES } from './model/state';
import { categoryFilterStore } from './store/categoryFilterStore'; import { categoryFilterStore } from './store/categoryFilterStore';
import CategoryFilter from './ui/CategoryFilter.svelte'; import CategoryFilter from './ui/CategoryFilter.svelte';
export { CategoryFilter, categoryFilterStore, FONT_CATEGORIES }; export {
CategoryFilter,
categoryFilterStore,
FONT_CATEGORIES,
};

View File

@@ -1,5 +1,8 @@
<script lang="ts" module> <script lang="ts" module>
import { tv, type VariantProps } from 'tailwind-variants'; import {
type VariantProps,
tv,
} from 'tailwind-variants';
export const badgeVariants = tv({ export const badgeVariants = tv({
base: base:
@@ -24,7 +27,10 @@ export type BadgeVariant = VariantProps<typeof badgeVariants>['variant'];
</script> </script>
<script lang="ts"> <script lang="ts">
import { cn, type WithElementRef } from '$shared/shadcn/utils/shadcn-utils.js'; import {
type WithElementRef,
cn,
} from '$shared/shadcn/utils/shadcn-utils.js';
import type { HTMLAnchorAttributes } from 'svelte/elements'; import type { HTMLAnchorAttributes } from 'svelte/elements';
let { let {

View File

@@ -1,2 +1,5 @@
export { default as Badge } from './badge.svelte'; export { default as Badge } from './badge.svelte';
export { type BadgeVariant, badgeVariants } from './badge.svelte'; export {
type BadgeVariant,
badgeVariants,
} from './badge.svelte';

View File

@@ -1,7 +1,16 @@
<script lang="ts" module> <script lang="ts" module>
import { cn, type WithElementRef } from '$shared/shadcn/utils/shadcn-utils.js'; import {
import type { HTMLAnchorAttributes, HTMLButtonAttributes } from 'svelte/elements'; type WithElementRef,
import { tv, type VariantProps } from 'tailwind-variants'; cn,
} from '$shared/shadcn/utils/shadcn-utils.js';
import type {
HTMLAnchorAttributes,
HTMLButtonAttributes,
} from 'svelte/elements';
import {
type VariantProps,
tv,
} from 'tailwind-variants';
export const buttonVariants = tv({ export const buttonVariants = tv({
base: base:

View File

@@ -1,5 +1,8 @@
<script lang="ts"> <script lang="ts">
import { cn, type WithoutChildrenOrChild } from '$shared/shadcn/utils/shadcn-utils.js'; import {
type WithoutChildrenOrChild,
cn,
} from '$shared/shadcn/utils/shadcn-utils.js';
import CheckIcon from '@lucide/svelte/icons/check'; import CheckIcon from '@lucide/svelte/icons/check';
import MinusIcon from '@lucide/svelte/icons/minus'; import MinusIcon from '@lucide/svelte/icons/minus';
import { Checkbox as CheckboxPrimitive } from 'bits-ui'; import { Checkbox as CheckboxPrimitive } from 'bits-ui';

View File

@@ -1,5 +1,8 @@
<script lang="ts"> <script lang="ts">
import { cn, type WithoutChildrenOrChild } from '$shared/shadcn/utils/shadcn-utils.js'; import {
type WithoutChildrenOrChild,
cn,
} from '$shared/shadcn/utils/shadcn-utils.js';
import XIcon from '@lucide/svelte/icons/x'; import XIcon from '@lucide/svelte/icons/x';
import { Dialog as DialogPrimitive } from 'bits-ui'; import { Dialog as DialogPrimitive } from 'bits-ui';
import type { Snippet } from 'svelte'; import type { Snippet } from 'svelte';

View File

@@ -1,5 +1,8 @@
<script lang="ts"> <script lang="ts">
import { cn, type WithElementRef } from '$shared/shadcn/utils/shadcn-utils.js'; import {
type WithElementRef,
cn,
} from '$shared/shadcn/utils/shadcn-utils.js';
import type { HTMLAttributes } from 'svelte/elements'; import type { HTMLAttributes } from 'svelte/elements';
let { let {

View File

@@ -1,5 +1,8 @@
<script lang="ts"> <script lang="ts">
import { cn, type WithElementRef } from '$shared/shadcn/utils/shadcn-utils.js'; import {
type WithElementRef,
cn,
} from '$shared/shadcn/utils/shadcn-utils.js';
import type { HTMLAttributes } from 'svelte/elements'; import type { HTMLAttributes } from 'svelte/elements';
let { let {

View File

@@ -1,6 +1,12 @@
<script lang="ts"> <script lang="ts">
import { cn, type WithElementRef } from '$shared/shadcn/utils/shadcn-utils.js'; import {
import type { HTMLInputAttributes, HTMLInputTypeAttribute } from 'svelte/elements'; type WithElementRef,
cn,
} from '$shared/shadcn/utils/shadcn-utils.js';
import type {
HTMLInputAttributes,
HTMLInputTypeAttribute,
} from 'svelte/elements';
type InputType = Exclude<HTMLInputTypeAttribute, 'file'>; type InputType = Exclude<HTMLInputTypeAttribute, 'file'>;

View File

@@ -1,5 +1,8 @@
<script lang="ts" module> <script lang="ts" module>
import { tv, type VariantProps } from 'tailwind-variants'; import {
type VariantProps,
tv,
} from 'tailwind-variants';
export const sheetVariants = tv({ export const sheetVariants = tv({
base: base:
'bg-background data-[state=open]:animate-in data-[state=closed]:animate-out fixed z-50 flex flex-col gap-4 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500', 'bg-background data-[state=open]:animate-in data-[state=closed]:animate-out fixed z-50 flex flex-col gap-4 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500',
@@ -23,7 +26,10 @@ export type Side = VariantProps<typeof sheetVariants>['side'];
</script> </script>
<script lang="ts"> <script lang="ts">
import { cn, type WithoutChildrenOrChild } from '$shared/shadcn/utils/shadcn-utils.js'; import {
type WithoutChildrenOrChild,
cn,
} from '$shared/shadcn/utils/shadcn-utils.js';
import XIcon from '@lucide/svelte/icons/x'; import XIcon from '@lucide/svelte/icons/x';
import { Dialog as SheetPrimitive } from 'bits-ui'; import { Dialog as SheetPrimitive } from 'bits-ui';
import type { Snippet } from 'svelte'; import type { Snippet } from 'svelte';

View File

@@ -1,5 +1,8 @@
<script lang="ts"> <script lang="ts">
import { cn, type WithElementRef } from '$shared/shadcn/utils/shadcn-utils.js'; import {
type WithElementRef,
cn,
} from '$shared/shadcn/utils/shadcn-utils.js';
import type { HTMLAttributes } from 'svelte/elements'; import type { HTMLAttributes } from 'svelte/elements';
let { let {

View File

@@ -1,5 +1,8 @@
<script lang="ts"> <script lang="ts">
import { cn, type WithElementRef } from '$shared/shadcn/utils/shadcn-utils.js'; import {
type WithElementRef,
cn,
} from '$shared/shadcn/utils/shadcn-utils.js';
import type { HTMLAttributes } from 'svelte/elements'; import type { HTMLAttributes } from 'svelte/elements';
let { let {

View File

@@ -1,5 +1,8 @@
import { IsMobile } from '$shared/shadcn/hooks/is-mobile.svelte.js'; import { IsMobile } from '$shared/shadcn/hooks/is-mobile.svelte.js';
import { getContext, setContext } from 'svelte'; import {
getContext,
setContext,
} from 'svelte';
import { SIDEBAR_KEYBOARD_SHORTCUT } from './constants.js'; import { SIDEBAR_KEYBOARD_SHORTCUT } from './constants.js';
type Getter<T> = () => T; type Getter<T> = () => T;

View File

@@ -1,5 +1,8 @@
<script lang="ts"> <script lang="ts">
import { cn, type WithElementRef } from '$shared/shadcn/utils/shadcn-utils.js'; import {
type WithElementRef,
cn,
} from '$shared/shadcn/utils/shadcn-utils.js';
import type { HTMLAttributes } from 'svelte/elements'; import type { HTMLAttributes } from 'svelte/elements';
let { let {

View File

@@ -1,5 +1,8 @@
<script lang="ts"> <script lang="ts">
import { cn, type WithElementRef } from '$shared/shadcn/utils/shadcn-utils.js'; import {
type WithElementRef,
cn,
} from '$shared/shadcn/utils/shadcn-utils.js';
import type { HTMLAttributes } from 'svelte/elements'; import type { HTMLAttributes } from 'svelte/elements';
let { let {

View File

@@ -1,5 +1,8 @@
<script lang="ts"> <script lang="ts">
import { cn, type WithElementRef } from '$shared/shadcn/utils/shadcn-utils.js'; import {
type WithElementRef,
cn,
} from '$shared/shadcn/utils/shadcn-utils.js';
import type { Snippet } from 'svelte'; import type { Snippet } from 'svelte';
import type { HTMLButtonAttributes } from 'svelte/elements'; import type { HTMLButtonAttributes } from 'svelte/elements';

View File

@@ -1,5 +1,8 @@
<script lang="ts"> <script lang="ts">
import { cn, type WithElementRef } from '$shared/shadcn/utils/shadcn-utils.js'; import {
type WithElementRef,
cn,
} from '$shared/shadcn/utils/shadcn-utils.js';
import type { HTMLAttributes } from 'svelte/elements'; import type { HTMLAttributes } from 'svelte/elements';
let { let {

View File

@@ -1,5 +1,8 @@
<script lang="ts"> <script lang="ts">
import { cn, type WithElementRef } from '$shared/shadcn/utils/shadcn-utils.js'; import {
type WithElementRef,
cn,
} from '$shared/shadcn/utils/shadcn-utils.js';
import type { Snippet } from 'svelte'; import type { Snippet } from 'svelte';
import type { HTMLAttributes } from 'svelte/elements'; import type { HTMLAttributes } from 'svelte/elements';

View File

@@ -1,5 +1,8 @@
<script lang="ts"> <script lang="ts">
import { cn, type WithElementRef } from '$shared/shadcn/utils/shadcn-utils.js'; import {
type WithElementRef,
cn,
} from '$shared/shadcn/utils/shadcn-utils.js';
import type { HTMLAttributes } from 'svelte/elements'; import type { HTMLAttributes } from 'svelte/elements';
let { let {

View File

@@ -1,5 +1,8 @@
<script lang="ts"> <script lang="ts">
import { cn, type WithElementRef } from '$shared/shadcn/utils/shadcn-utils.js'; import {
type WithElementRef,
cn,
} from '$shared/shadcn/utils/shadcn-utils.js';
import type { HTMLAttributes } from 'svelte/elements'; import type { HTMLAttributes } from 'svelte/elements';
let { let {

View File

@@ -1,5 +1,8 @@
<script lang="ts"> <script lang="ts">
import { cn, type WithElementRef } from '$shared/shadcn/utils/shadcn-utils.js'; import {
type WithElementRef,
cn,
} from '$shared/shadcn/utils/shadcn-utils.js';
import type { HTMLAttributes } from 'svelte/elements'; import type { HTMLAttributes } from 'svelte/elements';
let { let {

View File

@@ -1,5 +1,8 @@
<script lang="ts"> <script lang="ts">
import { cn, type WithElementRef } from '$shared/shadcn/utils/shadcn-utils.js'; import {
type WithElementRef,
cn,
} from '$shared/shadcn/utils/shadcn-utils.js';
import type { Snippet } from 'svelte'; import type { Snippet } from 'svelte';
import type { HTMLButtonAttributes } from 'svelte/elements'; import type { HTMLButtonAttributes } from 'svelte/elements';

View File

@@ -1,5 +1,8 @@
<script lang="ts"> <script lang="ts">
import { cn, type WithElementRef } from '$shared/shadcn/utils/shadcn-utils.js'; import {
type WithElementRef,
cn,
} from '$shared/shadcn/utils/shadcn-utils.js';
import type { HTMLAttributes } from 'svelte/elements'; import type { HTMLAttributes } from 'svelte/elements';
let { let {

View File

@@ -1,5 +1,8 @@
<script lang="ts" module> <script lang="ts" module>
import { tv, type VariantProps } from 'tailwind-variants'; import {
type VariantProps,
tv,
} from 'tailwind-variants';
export const sidebarMenuButtonVariants = tv({ export const sidebarMenuButtonVariants = tv({
base: base:
@@ -31,12 +34,15 @@ export type SidebarMenuButtonSize = VariantProps<typeof sidebarMenuButtonVariant
<script lang="ts"> <script lang="ts">
import * as Tooltip from '$shared/shadcn/ui/tooltip/index.js'; import * as Tooltip from '$shared/shadcn/ui/tooltip/index.js';
import { import {
cn,
type WithElementRef, type WithElementRef,
type WithoutChildrenOrChild, type WithoutChildrenOrChild,
cn,
} from '$shared/shadcn/utils/shadcn-utils.js'; } from '$shared/shadcn/utils/shadcn-utils.js';
import { mergeProps } from 'bits-ui'; import { mergeProps } from 'bits-ui';
import type { ComponentProps, Snippet } from 'svelte'; import type {
ComponentProps,
Snippet,
} from 'svelte';
import type { HTMLAttributes } from 'svelte/elements'; import type { HTMLAttributes } from 'svelte/elements';
import { useSidebar } from './context.svelte.js'; import { useSidebar } from './context.svelte.js';

View File

@@ -1,5 +1,8 @@
<script lang="ts"> <script lang="ts">
import { cn, type WithElementRef } from '$shared/shadcn/utils/shadcn-utils.js'; import {
type WithElementRef,
cn,
} from '$shared/shadcn/utils/shadcn-utils.js';
import type { HTMLAttributes } from 'svelte/elements'; import type { HTMLAttributes } from 'svelte/elements';
let { let {

View File

@@ -1,6 +1,9 @@
<script lang="ts"> <script lang="ts">
import { Skeleton } from '$shared/shadcn/ui/skeleton/index.js'; import { Skeleton } from '$shared/shadcn/ui/skeleton/index.js';
import { cn, type WithElementRef } from '$shared/shadcn/utils/shadcn-utils.js'; import {
type WithElementRef,
cn,
} from '$shared/shadcn/utils/shadcn-utils.js';
import type { HTMLAttributes } from 'svelte/elements'; import type { HTMLAttributes } from 'svelte/elements';
let { let {

View File

@@ -1,5 +1,8 @@
<script lang="ts"> <script lang="ts">
import { cn, type WithElementRef } from '$shared/shadcn/utils/shadcn-utils.js'; import {
type WithElementRef,
cn,
} from '$shared/shadcn/utils/shadcn-utils.js';
import type { Snippet } from 'svelte'; import type { Snippet } from 'svelte';
import type { HTMLAnchorAttributes } from 'svelte/elements'; import type { HTMLAnchorAttributes } from 'svelte/elements';

View File

@@ -1,5 +1,8 @@
<script lang="ts"> <script lang="ts">
import { cn, type WithElementRef } from '$shared/shadcn/utils/shadcn-utils.js'; import {
type WithElementRef,
cn,
} from '$shared/shadcn/utils/shadcn-utils.js';
import type { HTMLAttributes } from 'svelte/elements'; import type { HTMLAttributes } from 'svelte/elements';
let { let {

View File

@@ -1,5 +1,8 @@
<script lang="ts"> <script lang="ts">
import { cn, type WithElementRef } from '$shared/shadcn/utils/shadcn-utils.js'; import {
type WithElementRef,
cn,
} from '$shared/shadcn/utils/shadcn-utils.js';
import type { HTMLAttributes } from 'svelte/elements'; import type { HTMLAttributes } from 'svelte/elements';
let { let {

View File

@@ -1,5 +1,8 @@
<script lang="ts"> <script lang="ts">
import { cn, type WithElementRef } from '$shared/shadcn/utils/shadcn-utils.js'; import {
type WithElementRef,
cn,
} from '$shared/shadcn/utils/shadcn-utils.js';
import type { HTMLAttributes } from 'svelte/elements'; import type { HTMLAttributes } from 'svelte/elements';
let { let {

View File

@@ -1,6 +1,9 @@
<script lang="ts"> <script lang="ts">
import * as Tooltip from '$shared/shadcn/ui/tooltip/index.js'; import * as Tooltip from '$shared/shadcn/ui/tooltip/index.js';
import { cn, type WithElementRef } from '$shared/shadcn/utils/shadcn-utils.js'; import {
type WithElementRef,
cn,
} from '$shared/shadcn/utils/shadcn-utils.js';
import type { HTMLAttributes } from 'svelte/elements'; import type { HTMLAttributes } from 'svelte/elements';
import { import {
SIDEBAR_COOKIE_MAX_AGE, SIDEBAR_COOKIE_MAX_AGE,

View File

@@ -1,5 +1,8 @@
<script lang="ts"> <script lang="ts">
import { cn, type WithElementRef } from '$shared/shadcn/utils/shadcn-utils.js'; import {
type WithElementRef,
cn,
} from '$shared/shadcn/utils/shadcn-utils.js';
import type { HTMLAttributes } from 'svelte/elements'; import type { HTMLAttributes } from 'svelte/elements';
import { useSidebar } from './context.svelte.js'; import { useSidebar } from './context.svelte.js';

View File

@@ -1,6 +1,9 @@
<script lang="ts"> <script lang="ts">
import * as Sheet from '$shared/shadcn/ui/sheet/index.js'; import * as Sheet from '$shared/shadcn/ui/sheet/index.js';
import { cn, type WithElementRef } from '$shared/shadcn/utils/shadcn-utils.js'; import {
type WithElementRef,
cn,
} from '$shared/shadcn/utils/shadcn-utils.js';
import type { HTMLAttributes } from 'svelte/elements'; import type { HTMLAttributes } from 'svelte/elements';
import { SIDEBAR_WIDTH_MOBILE } from './constants.js'; import { SIDEBAR_WIDTH_MOBILE } from './constants.js';
import { useSidebar } from './context.svelte.js'; import { useSidebar } from './context.svelte.js';

View File

@@ -1,8 +1,8 @@
<script lang="ts"> <script lang="ts">
import { import {
cn,
type WithElementRef, type WithElementRef,
type WithoutChildren, type WithoutChildren,
cn,
} from '$shared/shadcn/utils/shadcn-utils.js'; } from '$shared/shadcn/utils/shadcn-utils.js';
import type { HTMLAttributes } from 'svelte/elements'; import type { HTMLAttributes } from 'svelte/elements';

View File

@@ -1,4 +1,7 @@
import { type ClassValue, clsx } from 'clsx'; import {
type ClassValue,
clsx,
} from 'clsx';
import { twMerge } from 'tailwind-merge'; import { twMerge } from 'tailwind-merge';
/** /**

View File

@@ -1,4 +1,9 @@
import { derived, type Readable, type Writable, writable } from 'svelte/store'; import {
type Readable,
type Writable,
derived,
writable,
} from 'svelte/store';
export interface Category { export interface Category {
/** /**