From 1499e46a0fdd84ab4fdaeae8c5b4dacbc6c8dd2c Mon Sep 17 00:00:00 2001 From: synzr Date: Mon, 1 Dec 2025 19:13:42 +0500 Subject: [PATCH] feat(components/tiles): better small icon --- src/lib/components/tiles/Tile.svelte | 109 +++++++++++------- src/lib/components/tiles/TileSmallIcon.svelte | 10 ++ .../tiles/pages/TileImagePage.svelte | 7 +- .../tiles/pages/TileTextPage.svelte | 28 +++-- src/routes/(tiles)/+page.svelte | 32 ++++- 5 files changed, 120 insertions(+), 66 deletions(-) create mode 100644 src/lib/components/tiles/TileSmallIcon.svelte diff --git a/src/lib/components/tiles/Tile.svelte b/src/lib/components/tiles/Tile.svelte index e69fd83..4f78b5f 100644 --- a/src/lib/components/tiles/Tile.svelte +++ b/src/lib/components/tiles/Tile.svelte @@ -8,6 +8,7 @@ Metro-like tile. Must be in a group to display correctly. import randomNumber from "$lib/utils/random-number"; import { cva } from "class-variance-authority"; import { onDestroy, onMount } from "svelte"; + import TileIconPage from "./pages/TileIconPage.svelte"; /** * Max angle value. @@ -68,6 +69,8 @@ Metro-like tile. Must be in a group to display correctly. icon, column, children, + link = "#", + enabled = true, }: { /** * Size. @@ -89,6 +92,16 @@ Metro-like tile. Must be in a group to display correctly. */ icon: string; + /** + * Link. + */ + link?: string; + + /** + * Is tile enabled? + */ + enabled?: boolean; + /** * Pages. */ @@ -98,30 +111,34 @@ Metro-like tile. Must be in a group to display correctly. /** * Tile style. **/ - const style = cva( - [ - "relative", - "bg-(--tile-color)", - "perspective-distant", - "active:scale-95", - "active:transform-gpu", - "active:transform-3d", - "active:rotate-x-(--tile-rotate-x)", - "active:rotate-y-(--tile-rotate-y)", - "duration-75", - "ease-in-out", - ], - { - variants: { - size: { - small: ["row-span-1", "col-span-1"], - medium: ["row-span-2", "col-span-2"], - wide: ["row-span-2", "col-span-4"], - large: ["row-span-4", "col-span-4"], - }, + const style = cva(["relative", "bg-(--tile-color)/80"], { + variants: { + size: { + small: ["row-span-1", "col-span-1"], + medium: ["row-span-2", "col-span-2"], + wide: ["row-span-2", "col-span-4"], + large: ["row-span-4", "col-span-4"], + }, + enabled: { + false: ["grayscale", "opacity-50"], + true: [ + "active:scale-95", + "perspective-distant", + "active:transform-gpu", + "active:transform-3d", + "active:rotate-x-(--tile-rotate-x)", + "active:rotate-y-(--tile-rotate-y)", + "duration-75", + "ease-in-out", + ], }, }, - ); + }); + + /** + * Is tile active? + */ + const active = link !== "#" && enabled && children !== null; /** * Icon size. @@ -235,7 +252,7 @@ Metro-like tile. Must be in a group to display correctly. @@ -254,25 +271,31 @@ Metro-like tile. Must be in a group to display correctly. class="w-full h-full overflow-y-hidden scroll-smooth duration-150" bind:this={pages} > - {@render children()} + {#if active} + {@render children()} + {:else} + + {/if} - -
+ {#if active} + +
+ {/if}
diff --git a/src/lib/components/tiles/TileSmallIcon.svelte b/src/lib/components/tiles/TileSmallIcon.svelte new file mode 100644 index 0000000..96f7f0f --- /dev/null +++ b/src/lib/components/tiles/TileSmallIcon.svelte @@ -0,0 +1,10 @@ + + +
diff --git a/src/lib/components/tiles/pages/TileImagePage.svelte b/src/lib/components/tiles/pages/TileImagePage.svelte index 2712b7d..446a4af 100644 --- a/src/lib/components/tiles/pages/TileImagePage.svelte +++ b/src/lib/components/tiles/pages/TileImagePage.svelte @@ -5,6 +5,8 @@ Image page for a tile. Must be in a tile to display correctly. --> -
-

{title}

+
+
+

{title}

- {#if subtitle} -

{subtitle}

- {/if} + {#if subtitle} +

{subtitle}

+ {/if} - {#if text} -

{text}

- {/if} + {#if text} +

{text}

+ {/if} +
-
+
diff --git a/src/routes/(tiles)/+page.svelte b/src/routes/(tiles)/+page.svelte index ca3beb1..99109b1 100644 --- a/src/routes/(tiles)/+page.svelte +++ b/src/routes/(tiles)/+page.svelte @@ -12,22 +12,46 @@ - + - + - + - +