Skip to content

Instantly share code, notes, and snippets.

@PezzerDev
PezzerDev / .prettierrc
Last active April 28, 2024 04:15
Prettier config #config #template
{
"bracketSameLine": true,
"printWidth": 80,
"singleQuote": true,
"tabWidth": 2,
"trailingComma": "all",
"useTabs": true
}
@PezzerDev
PezzerDev / firebase.ts
Last active April 29, 2024 14:15
Typesafe Firestore collection #firebase #firestore #typescript
// A generic Firestore converter that provides type inference
export const genericConverter = <T>() => ({
toFirestore: (data: PartialWithFieldValue<T>) => data ?? {},
fromFirestore: (snap: QueryDocumentSnapshot) => snap.data() as T,
});
// A wrapper of collection() that uses a generic converter to provide type inference
export const typedCollection = <T>(db: Firestore, name: string) =>
collection(db, name).withConverter<T>(genericConverter<T>());
@PezzerDev
PezzerDev / click-outside.ts
Created April 30, 2024 22:06
Click Outside directive #svelte #typescript #directive
export default function clickOutside(node: HTMLElement) {
const handleClick = (event: MouseEvent) => {
if (!node.contains(event.target as Node)) {
node.dispatchEvent(new CustomEvent('outsideclick'));
}
};
// The node has been mounted to the DOM
window.addEventListener('click', handleClick);
@PezzerDev
PezzerDev / stop-propagation.ts
Created April 30, 2024 22:11
Sop Propagation directive #svelte #typescript #directive
export default function stopPropagation(fn: (e: Event) => void) {
return function (this: (e: Event) => void, event: Event) {
event.stopPropagation();
fn.call(this, event);
};
}
@PezzerDev
PezzerDev / tailwind-transition.ts
Created April 30, 2024 22:12
Svelte/Tailwind transition directive #svelte #tailwind #animation #transition #directive
import { linear } from 'svelte/easing';
type TickFunc = (t: number) => number | void;
export interface TailwindTransitionOptions {
delay?: number;
easing?: (t: number) => number;
base?: string;
from?: string;
to?: string;
@PezzerDev
PezzerDev / prevent-default.ts
Last active May 6, 2024 20:46
Prevent Default directive #svelte #typescript #directive
export default function preventDefault<T extends Event>(fn: (e: T) => void | Promise<void>) {
return function (this: (e: T) => void, event: T) {
event.preventDefault();
fn.call(this, event);
};
}
@PezzerDev
PezzerDev / tailwind.config.cjs
Last active May 2, 2024 16:43
Tailwind paper shadow #tailwind #css #material-design
module.exports = {
theme: {
extend: {
boxShadow: {
'paper-xs': '0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24)',
'paper-sm': '0 2px 4px rgba(0,0,0,0.14), 0 2px 4px rgba(0,0,0,0.24)',
paper: '0 3px 6px rgba(0,0,0,0.16), 0 3px 6px rgba(0,0,0,0.23)',
'paper-md': '0 10px 20px rgba(0,0,0,0.19), 0 6px 6px rgba(0,0,0,0.23)',
'paper-lg': '0 14px 28px rgba(0,0,0,0.25), 0 10px 10px rgba(0,0,0,0.22)',
'paper-xl': '0 19px 38px rgba(0,0,0,0.30), 0 15px 12px rgba(0,0,0,0.22)',
@PezzerDev
PezzerDev / breakpoint-indicator.svelte
Created May 2, 2024 17:36
Breakpoint indicator #svelte #tailwind #breakpoints
<script lang="ts">
import { dev } from '$app/environment';
let hide = $state(false);
</script>
{#if dev}
<aside
ondblclick={() => (hide = true)}
class:!hidden={hide}
@PezzerDev
PezzerDev / to-state.svelte.ts
Created May 3, 2024 02:19
Svelte 5 Store to State #svelte #store #typescript
// !! This is yet untested
import type { Writable } from 'svelte/store';
export const toState = <T>(store: Writable<T>, initial: T | null = null) => {
let value = $state<T | null>(initial);
const stateful = {
get: () => value,
set: (newValue: T) => {
store.set(newValue);
@PezzerDev
PezzerDev / error.ts
Last active March 12, 2025 16:47
Typescript Error class #typescript
type ErrorName = 'Unknown Error' | 'Initialization Error';
export class ProjectError extends Error {
name: ErrorName;
data?: Record<string, unknown>;
constructor({ name, message, data }: { name: ErrorName; message: string; data?: Record<string, unknown> }) {
super();
this.name = name;
this.message = message;