File size: 1,481 Bytes
0ad74ed |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
import { onDestroy } from "svelte";
import { writable } from "svelte/store";
const sizes = {
sm: "(min-width: 640px)",
md: "(min-width: 768px)",
lg: "(min-width: 1024px)",
xl: "(min-width: 1280px)",
"2xl": "(min-width: 1536px)"
} as const;
const _default = {
sm: false,
md: false,
lg: false,
xl: false,
"2xl": false
};
export const media_query = () => {
const { subscribe, update } = writable(_default);
const listeners: {
[key: string]: [MediaQueryList, (ev: MediaQueryListEvent) => any];
} = {};
const onChange = (key: string) => () =>
update((s) => ({ ...s, [key]: !!listeners[key][0].matches }));
if (typeof window !== "undefined") {
for (const key in sizes) {
const mql = window.matchMedia(sizes[key as keyof typeof sizes]);
const listener = onChange(key);
mql.addEventListener("change", listener);
listeners[key] = [mql, listener];
}
onDestroy(() => {
for (const key in listeners) {
const [_mql, _listener] = listeners[key];
_mql.removeEventListener("change", _listener);
}
});
}
return { subscribe };
};
import slugify from "@sindresorhus/slugify";
export function make_slug_processor() {
const seen_slugs = new Map();
return function (name: string) {
const slug = slugify(name, { separator: "-", lowercase: true });
let count = seen_slugs.get(slug);
if (count) {
seen_slugs.set(slug, count + 1);
return `${slug}-${count + 1}`;
} else {
seen_slugs.set(slug, 1);
return slug;
}
};
}
|