feat: docker compose maybe

This commit is contained in:
2023-11-13 16:10:04 -05:00
parent 180b261e40
commit b625ccd8d6
8031 changed files with 2182966 additions and 0 deletions

View File

@ -0,0 +1,5 @@
declare namespace svelteHTML {
interface HTMLAttributes {
'on:copyComplete'?: () => void;
}
}

View File

@ -0,0 +1,10 @@
type ClipboardArgs = string | {
element: string;
} | {
input: string;
};
export declare function clipboard(node: HTMLElement, args: ClipboardArgs): {
update(newArgs: ClipboardArgs): void;
destroy(): void;
} | undefined;
export {};

View File

@ -0,0 +1,64 @@
export function clipboard(node, args) {
if (!window.isSecureContext) {
console.error('Clipboard action failed: app not running in secure context, see: https://developer.mozilla.org/en-US/docs/Web/API/Clipboard');
return;
}
const fireCopyCompleteEvent = () => {
node.dispatchEvent(new CustomEvent('copyComplete'));
};
const onClick = () => {
// Handle `data-clipboard` target based on object key
if (typeof args === 'object') {
// Element Inner HTML
if ('element' in args) {
const element = document.querySelector(`[data-clipboard="${args.element}"]`);
if (!element)
throw new Error(`Missing HTMLElement with an attribute of [data-clipboard="${args.element}"]`);
copyToClipboard(element.innerHTML, 'text/html').then(fireCopyCompleteEvent);
return;
}
// Form Input Value
if ('input' in args) {
const input = document.querySelector(`[data-clipboard="${args.input}"]`);
if (!input)
throw new Error(`Missing HTMLInputElement with an attribute of [data-clipboard="${args.input}"]`);
copyToClipboard(input.value).then(fireCopyCompleteEvent);
return;
}
}
// Handle everything else.
copyToClipboard(args).then(fireCopyCompleteEvent);
};
// Event Listener
node.addEventListener('click', onClick);
// Lifecycle
return {
update(newArgs) {
args = newArgs;
},
destroy() {
node.removeEventListener('click', onClick);
}
};
}
// Shared copy method
async function copyToClipboard(data, mimeType = 'text/plain') {
if (navigator.clipboard.write) {
await navigator.clipboard.write([
new ClipboardItem({
[mimeType]: new Blob([data], {
type: mimeType
}),
['text/plain']: new Blob([data], {
type: 'text/plain'
})
})
]);
}
else {
// fallback since .writeText has wider browser support
await new Promise((resolve) => {
resolve(navigator.clipboard.writeText(String(data)));
});
}
}

View File

@ -0,0 +1,6 @@
type Filters = ['Apollo', 'BlueNight', 'Emerald', 'GreenFall', 'Noir', 'NoirLight', 'Rustic', 'Summer84', 'XPro'];
type FilterName = `#${Filters[number]}` | (string & {});
export declare function filter(node: HTMLElement, filterName: FilterName): {
update(newArgs: FilterName): void;
} | undefined;
export {};

View File

@ -0,0 +1,16 @@
// Action: Filter
export function filter(node, filterName) {
// Return if no filterName provided
if (filterName === undefined)
return;
const applyFilter = () => {
node.setAttribute('style', `filter: url("${filterName}")`);
};
applyFilter();
return {
update(newArgs) {
filterName = newArgs;
applyFilter();
}
};
}

View File

@ -0,0 +1,13 @@
<!-- Apollo: `filter: url(#Apollo)` -->
<svg id="svg-filter-apollo" class="filter absolute -left-full w-0 h-0">
<filter id="Apollo" filterUnits="objectBoundingBox" primitiveUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feColorMatrix
values="0.8 0.6 -0.4 0.1 0,
0 1.2 0.05 0 0,
0 -1 3 0.02 0,
0 0 0 50 0"
result="final"
in="SourceGraphic"
/>
</filter>
</svg>

After

Width:  |  Height:  |  Size: 402 B

View File

@ -0,0 +1,23 @@
/** @typedef {typeof __propDef.props} ApolloProps */
/** @typedef {typeof __propDef.events} ApolloEvents */
/** @typedef {typeof __propDef.slots} ApolloSlots */
export default class Apollo extends SvelteComponentTyped<{
[x: string]: never;
}, {
[evt: string]: CustomEvent<any>;
}, {}> {
}
export type ApolloProps = typeof __propDef.props;
export type ApolloEvents = typeof __propDef.events;
export type ApolloSlots = typeof __propDef.slots;
import { SvelteComponentTyped } from "svelte";
declare const __propDef: {
props: {
[x: string]: never;
};
events: {
[evt: string]: CustomEvent<any>;
};
slots: {};
};
export {};

View File

@ -0,0 +1,12 @@
<!-- BlueNight: `filter: url(#BlueNight)` -->
<svg id="svg-filter-bluenight" class="filter absolute -left-full w-0 h-0">
<filter id="BlueNight" filterUnits="objectBoundingBox" primitiveUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feColorMatrix
type="matrix"
values="1.000 0.000 0.000 0.000 0.000
0.000 1.000 0.000 0.000 0.05
0.000 0.000 1.000 0.000 0.400
0.000 0.000 0.000 1.000 0.000"
/>
</filter>
</svg>

After

Width:  |  Height:  |  Size: 496 B

View File

@ -0,0 +1,23 @@
/** @typedef {typeof __propDef.props} BlueNightProps */
/** @typedef {typeof __propDef.events} BlueNightEvents */
/** @typedef {typeof __propDef.slots} BlueNightSlots */
export default class BlueNight extends SvelteComponentTyped<{
[x: string]: never;
}, {
[evt: string]: CustomEvent<any>;
}, {}> {
}
export type BlueNightProps = typeof __propDef.props;
export type BlueNightEvents = typeof __propDef.events;
export type BlueNightSlots = typeof __propDef.slots;
import { SvelteComponentTyped } from "svelte";
declare const __propDef: {
props: {
[x: string]: never;
};
events: {
[evt: string]: CustomEvent<any>;
};
slots: {};
};
export {};

View File

@ -0,0 +1,23 @@
<!-- Emerald: `filter: url(#Emerald)` -->
<svg id="svg-filter-emerald" class="filter absolute -left-full w-0 h-0">
<filter id="Emerald" filterUnits="objectBoundingBox" primitiveUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<!-- RGB, RGB, RGB, Opacity -->
<feColorMatrix
type="matrix"
in="SourceGraphic"
result="colormatrix"
values="
.16 .185 .129 0 0
.16 .185 .129 0 0
.16 .185 .129 0 0
0 0 0 0.33 0"
/>
<feComponentTransfer in="colormatrix" result="componentTransfer">
<feFuncR type="table" tableValues="0.03 0.9" />
<feFuncG type="table" tableValues="0.57 1" />
<feFuncB type="table" tableValues="0.49 0.53" />
<feFuncA type="table" tableValues="0 1" />
</feComponentTransfer>
<feBlend mode="normal" in="componentTransfer" in2="SourceGraphic" result="blend" />
</filter>
</svg>

After

Width:  |  Height:  |  Size: 879 B

View File

@ -0,0 +1,23 @@
/** @typedef {typeof __propDef.props} EmeraldProps */
/** @typedef {typeof __propDef.events} EmeraldEvents */
/** @typedef {typeof __propDef.slots} EmeraldSlots */
export default class Emerald extends SvelteComponentTyped<{
[x: string]: never;
}, {
[evt: string]: CustomEvent<any>;
}, {}> {
}
export type EmeraldProps = typeof __propDef.props;
export type EmeraldEvents = typeof __propDef.events;
export type EmeraldSlots = typeof __propDef.slots;
import { SvelteComponentTyped } from "svelte";
declare const __propDef: {
props: {
[x: string]: never;
};
events: {
[evt: string]: CustomEvent<any>;
};
slots: {};
};
export {};

View File

@ -0,0 +1,27 @@
<!-- GreenFall: `filter: url(#GreenFall)` -->
<svg id="svg-filter-greenfall" class="filter absolute -left-full w-0 h-0">
<filter
id="GreenFall"
x="-20%"
y="-20%"
width="140%"
height="140%"
filterUnits="objectBoundingBox"
primitiveUnits="userSpaceOnUse"
color-interpolation-filters="linearRGB"
>
<feColorMatrix
type="matrix"
values="0.5 -0.4 0.3332 0 0
0 0.4 0.3 0 0
0 0 0.5 0 0
0 0 0 500 -20"
x="0%"
y="0%"
width="100%"
height="100%"
in="SourceGraphic"
result="colormatrix"
/>
</filter>
</svg>

After

Width:  |  Height:  |  Size: 556 B

View File

@ -0,0 +1,23 @@
/** @typedef {typeof __propDef.props} GreenFallProps */
/** @typedef {typeof __propDef.events} GreenFallEvents */
/** @typedef {typeof __propDef.slots} GreenFallSlots */
export default class GreenFall extends SvelteComponentTyped<{
[x: string]: never;
}, {
[evt: string]: CustomEvent<any>;
}, {}> {
}
export type GreenFallProps = typeof __propDef.props;
export type GreenFallEvents = typeof __propDef.events;
export type GreenFallSlots = typeof __propDef.slots;
import { SvelteComponentTyped } from "svelte";
declare const __propDef: {
props: {
[x: string]: never;
};
events: {
[evt: string]: CustomEvent<any>;
};
slots: {};
};
export {};

View File

@ -0,0 +1,17 @@
<!-- Noir: `filter: url(#Noir)` -->
<svg id="svg-filter-noir" class="filter absolute -left-full w-0 h-0">
<filter
id="Noir"
x="-20%"
y="-20%"
width="140%"
height="140%"
filterUnits="objectBoundingBox"
primitiveUnits="userSpaceOnUse"
color-interpolation-filters="linearRGB"
>
<feColorMatrix type="saturate" values="0" x="0%" y="0%" width="100%" height="100%" in="SourceGraphic" result="colormatrix1" />
<feBlend mode="lighten" x="0%" y="0%" width="100%" height="100%" in="colormatrix1" in2="colormatrix1" result="blend" />
<feBlend mode="multiply" x="0%" y="0%" width="100%" height="100%" in="colormatrix1" in2="diffuseLighting" result="blend1" />
</filter>
</svg>

After

Width:  |  Height:  |  Size: 689 B

View File

@ -0,0 +1,23 @@
/** @typedef {typeof __propDef.props} NoirProps */
/** @typedef {typeof __propDef.events} NoirEvents */
/** @typedef {typeof __propDef.slots} NoirSlots */
export default class Noir extends SvelteComponentTyped<{
[x: string]: never;
}, {
[evt: string]: CustomEvent<any>;
}, {}> {
}
export type NoirProps = typeof __propDef.props;
export type NoirEvents = typeof __propDef.events;
export type NoirSlots = typeof __propDef.slots;
import { SvelteComponentTyped } from "svelte";
declare const __propDef: {
props: {
[x: string]: never;
};
events: {
[evt: string]: CustomEvent<any>;
};
slots: {};
};
export {};

View File

@ -0,0 +1,19 @@
<!-- NoirLight: `filter: url(#NoirLight)` -->
<svg id="svg-filter-noirlight" class="filter absolute -left-full w-0 h-0">
<filter
id="NoirLight"
x="-20%"
y="-20%"
width="140%"
height="140%"
filterUnits="objectBoundingBox"
primitiveUnits="userSpaceOnUse"
color-interpolation-filters="linearRGB"
>
<feColorMatrix type="saturate" values="0" x="0%" y="0%" width="100%" height="100%" in="SourceGraphic" result="colormatrix2" />
<feBlend mode="saturation" x="0%" y="0%" width="100%" height="100%" in="SourceGraphic" in2="colormatrix2" result="blend2" />
<feBlend mode="screen" x="0%" y="0%" width="100%" height="100%" in="colormatrix2" in2="blend2" result="blend3" />
<feColorMatrix type="luminanceToAlpha" x="0%" y="0%" width="100%" height="100%" in="blend3" result="colormatrix3" />
<feBlend mode="exclusion" x="0%" y="0%" width="100%" height="100%" in="blend3" in2="colormatrix3" result="blend5" />
</filter>
</svg>

After

Width:  |  Height:  |  Size: 941 B

View File

@ -0,0 +1,23 @@
/** @typedef {typeof __propDef.props} NoirLightProps */
/** @typedef {typeof __propDef.events} NoirLightEvents */
/** @typedef {typeof __propDef.slots} NoirLightSlots */
export default class NoirLight extends SvelteComponentTyped<{
[x: string]: never;
}, {
[evt: string]: CustomEvent<any>;
}, {}> {
}
export type NoirLightProps = typeof __propDef.props;
export type NoirLightEvents = typeof __propDef.events;
export type NoirLightSlots = typeof __propDef.slots;
import { SvelteComponentTyped } from "svelte";
declare const __propDef: {
props: {
[x: string]: never;
};
events: {
[evt: string]: CustomEvent<any>;
};
slots: {};
};
export {};

View File

@ -0,0 +1,14 @@
<!-- Rustic: `filter: url(#Rustic)` -->
<svg id="svg-filter-rustic" class="filter absolute -left-full w-0 h-0">
<filter id="Rustic" filterUnits="objectBoundingBox" primitiveUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feColorMatrix
type="matrix"
in="SourceGraphic"
result="colormatrix"
values="0.39215686274509803 0.39215686274509803 0.39215686274509803 0 0
0.3333333333333333 0.3333333333333333 0.3333333333333333 0 0
0.30980392156862746 0.30980392156862746 0.30980392156862746 0 0
0 0 0 1 0"
/>
</filter>
</svg>

After

Width:  |  Height:  |  Size: 569 B

View File

@ -0,0 +1,23 @@
/** @typedef {typeof __propDef.props} RusticProps */
/** @typedef {typeof __propDef.events} RusticEvents */
/** @typedef {typeof __propDef.slots} RusticSlots */
export default class Rustic extends SvelteComponentTyped<{
[x: string]: never;
}, {
[evt: string]: CustomEvent<any>;
}, {}> {
}
export type RusticProps = typeof __propDef.props;
export type RusticEvents = typeof __propDef.events;
export type RusticSlots = typeof __propDef.slots;
import { SvelteComponentTyped } from "svelte";
declare const __propDef: {
props: {
[x: string]: never;
};
events: {
[evt: string]: CustomEvent<any>;
};
slots: {};
};
export {};

View File

@ -0,0 +1,12 @@
<!-- Summer84: `filter: url(#Summer84)` -->
<svg id="svg-filter-summer84" class="filter absolute -left-full w-0 h-0">
<filter id="Summer84" filterUnits="objectBoundingBox" primitiveUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feColorMatrix
type="matrix"
values="1.300 0.200 0.000 0.000 0.000
0.300 0.600 0.200 0.000 0.000
0.200 1.000 0.200 0.000 0.000
0.000 0.000 0.000 1.000 0.000"
/>
</filter>
</svg>

After

Width:  |  Height:  |  Size: 448 B

View File

@ -0,0 +1,23 @@
/** @typedef {typeof __propDef.props} Summer84Props */
/** @typedef {typeof __propDef.events} Summer84Events */
/** @typedef {typeof __propDef.slots} Summer84Slots */
export default class Summer84 extends SvelteComponentTyped<{
[x: string]: never;
}, {
[evt: string]: CustomEvent<any>;
}, {}> {
}
export type Summer84Props = typeof __propDef.props;
export type Summer84Events = typeof __propDef.events;
export type Summer84Slots = typeof __propDef.slots;
import { SvelteComponentTyped } from "svelte";
declare const __propDef: {
props: {
[x: string]: never;
};
events: {
[evt: string]: CustomEvent<any>;
};
slots: {};
};
export {};

View File

@ -0,0 +1,12 @@
<!-- XPro: `filter: url(#XPro)` -->
<svg id="svg-filter-xpro" class="filter absolute -left-full w-0 h-0">
<filter id="XPro" filterUnits="objectBoundingBox" primitiveUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feColorMatrix
type="matrix"
values="1.70 -0.20 0.00 0.00 0.00
0.10 0.800 0.30 0.00 0.00
0.20 0.300 0.50 0.00 0.00
0.00 0.00 0.00 1.00 0.00"
/>
</filter>
</svg>

After

Width:  |  Height:  |  Size: 460 B

View File

@ -0,0 +1,23 @@
/** @typedef {typeof __propDef.props} XProProps */
/** @typedef {typeof __propDef.events} XProEvents */
/** @typedef {typeof __propDef.slots} XProSlots */
export default class XPro extends SvelteComponentTyped<{
[x: string]: never;
}, {
[evt: string]: CustomEvent<any>;
}, {}> {
}
export type XProProps = typeof __propDef.props;
export type XProEvents = typeof __propDef.events;
export type XProSlots = typeof __propDef.slots;
import { SvelteComponentTyped } from "svelte";
declare const __propDef: {
props: {
[x: string]: never;
};
events: {
[evt: string]: CustomEvent<any>;
};
slots: {};
};
export {};

View File

@ -0,0 +1,4 @@
export declare function focusTrap(node: HTMLElement, enabled: boolean): {
update(newArgs: boolean): void;
destroy(): void;
};

View File

@ -0,0 +1,65 @@
// Action: Focus Trap
export function focusTrap(node, enabled) {
const elemWhitelist = 'a[href]:not([tabindex="-1"]), button:not([tabindex="-1"]), input:not([tabindex="-1"]), textarea:not([tabindex="-1"]), select:not([tabindex="-1"]), details:not([tabindex="-1"]), [tabindex]:not([tabindex="-1"])';
let elemFirst;
let elemLast;
// When the first element is selected, shift+tab pressed, jump to the last selectable item.
function onFirstElemKeydown(e) {
if (e.shiftKey && e.code === 'Tab') {
e.preventDefault();
elemLast.focus();
}
}
// When the last item selected, tab pressed, jump to the first selectable item.
function onLastElemKeydown(e) {
if (!e.shiftKey && e.code === 'Tab') {
e.preventDefault();
elemFirst.focus();
}
}
const onScanElements = (fromObserver) => {
if (enabled === false)
return;
// Gather all focusable elements
const focusableElems = Array.from(node.querySelectorAll(elemWhitelist));
if (focusableElems.length) {
// Set first/last focusable elements
elemFirst = focusableElems[0];
elemLast = focusableElems[focusableElems.length - 1];
// Auto-focus first focusable element only when not called from observer
if (!fromObserver)
elemFirst.focus();
// Listen for keydown on first & last element
elemFirst.addEventListener('keydown', onFirstElemKeydown);
elemLast.addEventListener('keydown', onLastElemKeydown);
}
};
onScanElements(false);
function onCleanUp() {
if (elemFirst)
elemFirst.removeEventListener('keydown', onFirstElemKeydown);
if (elemLast)
elemLast.removeEventListener('keydown', onLastElemKeydown);
}
// When children of node are changed (added or removed)
const onObservationChange = (mutationRecords, observer) => {
if (mutationRecords.length) {
onCleanUp();
onScanElements(true);
}
return observer;
};
const observer = new MutationObserver(onObservationChange);
observer.observe(node, { childList: true, subtree: true });
// Lifecycle
return {
update(newArgs) {
enabled = newArgs;
newArgs ? onScanElements(false) : onCleanUp();
},
destroy() {
onCleanUp();
observer.disconnect();
}
};
}