|
1 |
| -<script> |
| 1 | +<script lang="ts"> |
2 | 2 | // From https://gist.github.com/WarningImHack3r/375c559c5ee120408f9df2390ec2747a
|
3 | 3 | // Inspired by https://gist.github.com/Sh4yy/0300299ae60af4910bcb341703946330
|
| 4 | + import { slide } from "svelte/transition"; |
| 5 | + import tailwindConfig from "/tailwind.config"; |
| 6 | + import resolveConfig from "tailwindcss/resolveConfig"; |
| 7 | +
|
| 8 | + const fullConfig = resolveConfig(tailwindConfig); |
| 9 | + const screens = Object.keys(fullConfig.theme.screens) |
| 10 | + .map(screen => ({ |
| 11 | + name: screen, |
| 12 | + size: parseInt(fullConfig.theme.screens[screen].replace("px", "")) |
| 13 | + })) |
| 14 | + .sort((a, b) => a.size - b.size); |
| 15 | + let matchingScreen: (typeof screens)[number] | undefined; |
| 16 | + $: matchingScreen = screens.findLast(screen => screen.size <= width); |
| 17 | +
|
4 | 18 | let width = 0;
|
5 | 19 | let height = 0;
|
| 20 | +
|
| 21 | + let showAllScreens = false; |
6 | 22 | </script>
|
7 | 23 |
|
8 | 24 | <svelte:window bind:innerWidth={width} bind:innerHeight={height} />
|
9 | 25 |
|
10 | 26 | <div
|
11 |
| - class="fixed bottom-5 left-5 z-50 flex items-center space-x-2 rounded-full border border-gray-500 bg-black px-2.5 py-1 font-mono text-xs font-medium text-white shadow-lg shadow-black/50" |
| 27 | + class="font-mono text-xs font-medium text-white *:fixed *:border *:border-gray-500 *:bg-black *:px-2.5 *:py-1 *:shadow-lg *:shadow-black/50" |
12 | 28 | >
|
13 |
| - <span> |
14 |
| - {width.toLocaleString()} x {height.toLocaleString()} |
15 |
| - </span> |
16 |
| - <div class="h-4 w-px bg-gray-800" /> |
17 |
| - <span class="sm:hidden">XS</span> |
18 |
| - <span class="hidden sm:max-md:inline">SM</span> |
19 |
| - <span class="hidden md:max-lg:inline">MD</span> |
20 |
| - <span class="hidden lg:max-xl:inline">LG</span> |
21 |
| - <span class="hidden xl:max-2xl:inline">XL</span> |
22 |
| - <span class="max-2xl:hidden">2XL</span> |
| 29 | + <div class="bottom-5 left-5 z-50 flex items-center rounded-full !pr-1"> |
| 30 | + <span> |
| 31 | + {width.toLocaleString()} x {height.toLocaleString()} |
| 32 | + </span> |
| 33 | + {#if matchingScreen} |
| 34 | + <div class="ml-1.5 mr-1 h-4 w-px bg-gray-800"></div> |
| 35 | + <button |
| 36 | + type="button" |
| 37 | + class="inline rounded-l-sm rounded-r-full px-1 hover:bg-neutral-500 active:bg-neutral-600" |
| 38 | + on:click={() => (showAllScreens = !showAllScreens)} |
| 39 | + > |
| 40 | + {matchingScreen.name.toUpperCase()} |
| 41 | + </button> |
| 42 | + {/if} |
| 43 | + </div> |
| 44 | + {#if showAllScreens} |
| 45 | + <div class="bottom-12 left-5 z-40 rounded-xl duration-300" transition:slide> |
| 46 | + {#each screens as screen} |
| 47 | + <div class="flex justify-between gap-8"> |
| 48 | + <span>{screen.name.toUpperCase()}</span> |
| 49 | + <span class="text-neutral-400">{screen.size.toLocaleString()}px</span> |
| 50 | + </div> |
| 51 | + {/each} |
| 52 | + </div> |
| 53 | + {/if} |
23 | 54 | </div>
|
0 commit comments