Compare commits

...

No commits in common. "master" and "pages" have entirely different histories.

58 changed files with 60 additions and 3917 deletions

View File

@ -1,13 +0,0 @@
.DS_Store
node_modules
/build
/.svelte-kit
/package
.env
.env.*
!.env.example
# Ignore files for PNPM, NPM and YARN
pnpm-lock.yaml
package-lock.json
yarn.lock

View File

@ -1,31 +0,0 @@
/** @type { import("eslint").Linter.Config } */
module.exports = {
root: true,
extends: [
'eslint:recommended',
'plugin:@typescript-eslint/recommended',
'plugin:svelte/recommended',
'prettier'
],
parser: '@typescript-eslint/parser',
plugins: ['@typescript-eslint'],
parserOptions: {
sourceType: 'module',
ecmaVersion: 2020,
extraFileExtensions: ['.svelte']
},
env: {
browser: true,
es2017: true,
node: true
},
overrides: [
{
files: ['*.svelte'],
parser: 'svelte-eslint-parser',
parserOptions: {
parser: '@typescript-eslint/parser'
}
}
]
};

View File

@ -1,34 +0,0 @@
name: Build & Deploy
on:
push:
pull_request:
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v3
with:
version: 8
- name: Install Node.js
uses: actions/setup-node@v4
with:
cache: pnpm
node-version: 20
- name: Install dependencies
run: pnpm install
- name: Vite
run: pnpm build
- name: Deploy
uses: peaceiris/actions-gh-pages@v4
if: github.ref == 'refs/heads/master'
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./build
force_orphan: true
publish_branch: pages

10
.gitignore vendored
View File

@ -1,10 +0,0 @@
.DS_Store
node_modules
/build
/.svelte-kit
/package
.env
.env.*
!.env.example
vite.config.js.timestamp-*
vite.config.ts.timestamp-*

0
.nojekyll Normal file
View File

1
.npmrc
View File

@ -1 +0,0 @@
engine-strict=true

View File

@ -1,4 +0,0 @@
# Ignore files for PNPM, NPM and YARN
pnpm-lock.yaml
package-lock.json
yarn.lock

View File

@ -1,8 +0,0 @@
{
"useTabs": true,
"singleQuote": true,
"trailingComma": "none",
"printWidth": 100,
"plugins": ["prettier-plugin-svelte"],
"overrides": [{ "files": "*.svelte", "options": { "parser": "svelte" } }]
}

118
.vscode/settings.json vendored
View File

@ -1,118 +0,0 @@
{
"prettier.documentSelectors": ["**/*.svelte"],
"tailwindCSS.classAttributes": [
"class",
"accent",
"active",
"animIndeterminate",
"aspectRatio",
"background",
"badge",
"bgBackdrop",
"bgDark",
"bgDrawer",
"bgLight",
"blur",
"border",
"button",
"buttonAction",
"buttonBack",
"buttonClasses",
"buttonComplete",
"buttonDismiss",
"buttonNeutral",
"buttonNext",
"buttonPositive",
"buttonTextCancel",
"buttonTextConfirm",
"buttonTextFirst",
"buttonTextLast",
"buttonTextNext",
"buttonTextPrevious",
"buttonTextSubmit",
"caretClosed",
"caretOpen",
"chips",
"color",
"controlSeparator",
"controlVariant",
"cursor",
"display",
"element",
"fill",
"fillDark",
"fillLight",
"flex",
"flexDirection",
"gap",
"gridColumns",
"height",
"hover",
"inactive",
"indent",
"justify",
"meter",
"padding",
"position",
"regionAnchor",
"regionBackdrop",
"regionBody",
"regionCaption",
"regionCaret",
"regionCell",
"regionChildren",
"regionChipList",
"regionChipWrapper",
"regionCone",
"regionContent",
"regionControl",
"regionDefault",
"regionDrawer",
"regionFoot",
"regionFootCell",
"regionFooter",
"regionHead",
"regionHeadCell",
"regionHeader",
"regionIcon",
"regionInput",
"regionInterface",
"regionInterfaceText",
"regionLabel",
"regionLead",
"regionLegend",
"regionList",
"regionListItem",
"regionNavigation",
"regionPage",
"regionPanel",
"regionRowHeadline",
"regionRowMain",
"regionSummary",
"regionSymbol",
"regionTab",
"regionTrail",
"ring",
"rounded",
"select",
"shadow",
"slotDefault",
"slotFooter",
"slotHeader",
"slotLead",
"slotMessage",
"slotMeta",
"slotPageContent",
"slotPageFooter",
"slotPageHeader",
"slotSidebarLeft",
"slotSidebarRight",
"slotTrail",
"spacing",
"text",
"track",
"transition",
"width",
"zIndex"
]
}

1
404.html Normal file
View File

@ -0,0 +1 @@
<!doctype html> <html class=dark lang=en> <head> <title>Froth Pages</title> <meta charset=utf-8> <link href=/favicon.png rel=icon> <meta content="width=device-width" name=viewport> <link href=/_app/immutable/entry/start.D-zEssk8.js rel=modulepreload> <link href=/_app/immutable/chunks/entry.CDaYBwFn.js rel=modulepreload> <link href=/_app/immutable/chunks/scheduler.BMKC9Qcs.js rel=modulepreload> <link href=/_app/immutable/chunks/index.Cfk6EvZr.js rel=modulepreload> <link href=/_app/immutable/entry/app.liZPI5cI.js rel=modulepreload> <link href=/_app/immutable/chunks/index.CivusM5b.js rel=modulepreload> </head> <body data-sveltekit-preload-data=hover data-theme=froth-noire> <div class="h-full overflow-hidden" style=display:contents> <script>{__sveltekit_1sa6hch={base:""};const t=document.currentScript.parentElement;Promise.all([import("/_app/immutable/entry/start.D-zEssk8.js"),import("/_app/immutable/entry/app.liZPI5cI.js")]).then((([e,a])=>{e.start(a,t)}))}</script> </div>

View File

@ -1,38 +0,0 @@
# create-svelte
Everything you need to build a Svelte project, powered by [`create-svelte`](https://github.com/sveltejs/kit/tree/main/packages/create-svelte).
## Creating a project
If you're seeing this, you've probably already done this step. Congrats!
```bash
# create a new project in the current directory
npm create svelte@latest
# create a new project in my-app
npm create svelte@latest my-app
```
## Developing
Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server:
```bash
npm run dev
# or start the server and open the app in a new browser tab
npm run dev -- --open
```
## Building
To create a production version of your app:
```bash
npm run build
```
You can preview the production build with `npm run preview`.
> To deploy your app, you may need to install an [adapter](https://kit.svelte.dev/docs/adapters) for your target environment.

1
_app/env.js Normal file
View File

@ -0,0 +1 @@
export const env={}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
.anim-indeterminate.svelte-12wvf64{transform-origin:0% 50%;animation:svelte-12wvf64-anim-indeterminate 2s infinite linear}@keyframes svelte-12wvf64-anim-indeterminate{0%{transform:translate(0) scaleX(0)}40%{transform:translate(0) scaleX(.4)}to{transform:translate(100%) scaleX(.5)}}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,2 @@
import{w as S,r as h}from"./index.Cfk6EvZr.js";import{x as M}from"./scheduler.BMKC9Qcs.js";const d={};function p(e){return e==="local"?localStorage:sessionStorage}function u(e,n,a){const o=JSON,l="local";function f(s,i){p(l).setItem(s,o.stringify(i))}if(!d[e]){const s=S(n,t=>{const r=p(l).getItem(e);r&&t(o.parse(r));{const g=c=>{c.key===e&&t(c.newValue?o.parse(c.newValue):null)};return window.addEventListener("storage",g),()=>window.removeEventListener("storage",g)}}),{subscribe:i,set:m}=s;d[e]={set(t){f(e,t),m(t)},update(t){const r=t(M(s));f(e,r),m(r)},subscribe:i}}return d[e]}u("modeOsPrefers",!1);u("modeUserPrefers",void 0);u("modeCurrent",!1);const w="(prefers-reduced-motion: reduce)";function v(){return window.matchMedia(w).matches}const E=h(v(),e=>{{const n=o=>{e(o.matches)},a=window.matchMedia(w);return a.addEventListener("change",n),()=>{a.removeEventListener("change",n)}}});export{E as p};
//# sourceMappingURL=ProgressBar.svelte_svelte_type_style_lang.MplOcq4z.js.map

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,2 @@
import{n as b,s as l}from"./scheduler.BMKC9Qcs.js";const n=[];function h(e,o){return{subscribe:p(e,o).subscribe}}function p(e,o=b){let r;const i=new Set;function u(t){if(l(e,t)&&(e=t,r)){const c=!n.length;for(const s of i)s[1](),n.push(s,e);if(c){for(let s=0;s<n.length;s+=2)n[s][0](n[s+1]);n.length=0}}}function f(t){u(t(e))}function a(t,c=b){const s=[t,c];return i.add(s),i.size===1&&(r=o(u,f)||b),t(e),()=>{i.delete(s),i.size===0&&r&&(r(),r=null)}}return{set:u,update:f,subscribe:a}}export{h as r,p as w};
//# sourceMappingURL=index.Cfk6EvZr.js.map

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,5 @@
var Q=Object.defineProperty;var T=(t,e,n)=>e in t?Q(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n;var I=(t,e,n)=>(T(t,typeof e!="symbol"?e+"":e,n),n);import{n as w,H as W,f as L,I as X,J as v,K as R,L as k,M as Y,N as U,O as z,b as q,P as G,Q as Z,R as tt,S as et,T as A,U as nt,V as it,W as st,X as rt,Y as at}from"./scheduler.BMKC9Qcs.js";const V=typeof window<"u";let B=V?()=>window.performance.now():()=>Date.now(),N=V?t=>requestAnimationFrame(t):w;const p=new Set;function D(t){p.forEach(e=>{e.c(t)||(p.delete(e),e.f())}),p.size!==0&&N(D)}function F(t){let e;return p.size===0&&N(D),{promise:new Promise(n=>{p.add(e={c:t,f:n})}),abort(){p.delete(e)}}}const O=new Map;let b=0;function ot(t){let e=5381,n=t.length;for(;n--;)e=(e<<5)-e^t.charCodeAt(n);return e>>>0}function ft(t,e){const n={stylesheet:X(e),rules:{}};return O.set(t,n),n}function H(t,e,n,i,r,a,u,l=0){const d=16.666/i;let s=`{
`;for(let g=0;g<=1;g+=d){const m=e+(n-e)*a(g);s+=g*100+`%{${u(m,1-m)}}
`}const f=s+`100% {${u(n,1-n)}}
}`,o=`__svelte_${ot(f)}_${l}`,_=W(t),{stylesheet:c,rules:$}=O.get(_)||ft(_,t);$[o]||($[o]=!0,c.insertRule(`@keyframes ${o} ${f}`,c.cssRules.length));const h=t.style.animation||"";return t.style.animation=`${h?`${h}, `:""}${o} ${i}ms linear ${r}ms 1 both`,b+=1,o}function M(t,e){const n=(t.style.animation||"").split(", "),i=n.filter(e?a=>a.indexOf(e)<0:a=>a.indexOf("__svelte")===-1),r=n.length-i.length;r&&(t.style.animation=i.join(", "),b-=r,b||ut())}function ut(){N(()=>{b||(O.forEach(t=>{const{ownerNode:e}=t.stylesheet;e&&L(e)}),O.clear())})}let x;function J(){return x||(x=Promise.resolve(),x.then(()=>{x=null})),x}function P(t,e,n){t.dispatchEvent(Y(`${e?"intro":"outro"}${n}`))}const E=new Set;let y;function gt(){y={r:0,c:[],p:y}}function yt(){y.r||v(y.c),y=y.p}function ct(t,e){t&&t.i&&(E.delete(t),t.i(e))}function pt(t,e,n,i){if(t&&t.o){if(E.has(t))return;E.add(t),y.c.push(()=>{E.delete(t),i&&(n&&t.d(1),i())}),t.o(e)}else i&&i()}const K={duration:0};function wt(t,e,n){const i={direction:"in"};let r=e(t,n,i),a=!1,u,l,d=0;function s(){u&&M(t,u)}function f(){const{delay:_=0,duration:c=300,easing:$=U,tick:h=w,css:g}=r||K;g&&(u=H(t,0,1,c,_,$,g,d++)),h(0,1);const m=B()+_,S=m+c;l&&l.abort(),a=!0,k(()=>P(t,!0,"start")),l=F(C=>{if(a){if(C>=S)return h(1,0),P(t,!0,"end"),s(),a=!1;if(C>=m){const j=$((C-m)/c);h(j,1-j)}}return a})}let o=!1;return{start(){o||(o=!0,M(t),R(r)?(r=r(i),J().then(f)):f())},invalidate(){o=!1},end(){a&&(s(),a=!1)}}}function xt(t,e,n){const i={direction:"out"};let r=e(t,n,i),a=!0,u;const l=y;l.r+=1;let d;function s(){const{delay:f=0,duration:o=300,easing:_=U,tick:c=w,css:$}=r||K;$&&(u=H(t,1,0,o,f,_,$));const h=B()+f,g=h+o;k(()=>P(t,!1,"start")),"inert"in t&&(d=t.inert,t.inert=!0),F(m=>{if(a){if(m>=g)return c(0,1),P(t,!1,"end"),--l.r||v(l.c),!1;if(m>=h){const S=_((m-h)/o);c(1-S,S)}}return a})}return R(r)?J().then(()=>{r=r(i),s()}):s(),{end(f){f&&"inert"in t&&(t.inert=d),f&&r.tick&&r.tick(1,0),a&&(u&&M(t,u),a=!1)}}}function vt(t){t&&t.c()}function St(t,e){t&&t.l(e)}function lt(t,e,n){const{fragment:i,after_update:r}=t.$$;i&&i.m(e,n),k(()=>{const a=t.$$.on_mount.map(nt).filter(R);t.$$.on_destroy?t.$$.on_destroy.push(...a):v(a),t.$$.on_mount=[]}),r.forEach(k)}function dt(t,e){const n=t.$$;n.fragment!==null&&(tt(n.after_update),v(n.on_destroy),n.fragment&&n.fragment.d(e),n.on_destroy=n.fragment=null,n.ctx=[])}function _t(t,e){t.$$.dirty[0]===-1&&(it.push(t),st(),t.$$.dirty.fill(0)),t.$$.dirty[e/31|0]|=1<<e%31}function Et(t,e,n,i,r,a,u=null,l=[-1]){const d=et;A(t);const s=t.$$={fragment:null,ctx:[],props:a,update:w,not_equal:r,bound:z(),on_mount:[],on_destroy:[],on_disconnect:[],before_update:[],after_update:[],context:new Map(e.context||(d?d.$$.context:[])),callbacks:z(),dirty:l,skip_bound:!1,root:e.target||d.$$.root};u&&u(s.root);let f=!1;if(s.ctx=n?n(t,e.props||{},(o,_,...c)=>{const $=c.length?c[0]:_;return s.ctx&&r(s.ctx[o],s.ctx[o]=$)&&(!s.skip_bound&&s.bound[o]&&s.bound[o]($),f&&_t(t,o)),_}):[],s.update(),f=!0,v(s.before_update),s.fragment=i?i(s.ctx):!1,e.target){if(e.hydrate){rt();const o=q(e.target);s.fragment&&s.fragment.l(o),o.forEach(L)}else s.fragment&&s.fragment.c();e.intro&&ct(t.$$.fragment),lt(t,e.target,e.anchor),at(),G()}A(d)}class kt{constructor(){I(this,"$$");I(this,"$$set")}$destroy(){dt(this,1),this.$destroy=w}$on(e,n){if(!R(n))return w;const i=this.$$.callbacks[e]||(this.$$.callbacks[e]=[]);return i.push(n),()=>{const r=i.indexOf(n);r!==-1&&i.splice(r,1)}}$set(e){this.$$set&&!Z(e)&&(this.$$.skip_bound=!0,this.$$set(e),this.$$.skip_bound=!1)}}const $t="4";typeof window<"u"&&(window.__svelte||(window.__svelte={v:new Set})).v.add($t);export{kt as S,ct as a,vt as b,yt as c,St as d,dt as e,wt as f,gt as g,xt as h,Et as i,lt as m,pt as t};
//# sourceMappingURL=index.CivusM5b.js.map

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
{"version":3,"mappings":";ozCAAaA,GAAW,2BC+CC,IAAAC,EAAAC,KAAa,CAAC,qCAAmCA,EAAM,2JAAvD,GAAAC,EAAA,GAAAF,OAAAC,KAAa,CAAC,yLAAmCA,EAAM,uKAJvD,IAAAD,EAAAC,KAAa,CAAC,qCAAmCA,EAAM,wLAAvD,GAAAC,EAAA,GAAAF,OAAAC,KAAa,CAAC,yLAAmCA,EAAM,yLACtD,IAAAD,EAAAC,KAAa,CAAC,qCAAmCA,EAAM,2JAAvD,GAAAC,EAAA,GAAAF,OAAAC,KAAa,CAAC,0LAAmCA,EAAM,qKAQ1EA,EAAS,IAAAE,EAAAF,CAAA,0cADfG,EAIKC,EAAAC,EAAAC,CAAA,yBAHCN,EAAS,wHACZA,EAAK,gBAALA,EAAK,wCAALA,EAAK,oFAXJ,OAAAA,KAAa,CAAC,kCAQdA,EAAO,IAAAO,EAAAP,CAAA,wRAAPA,EAAO,2KA3CA,OAAAQ,CAAM,EAAAC,GACN,KAAAC,CAAI,EAAAD,GAEJ,aAAAE,CAAY,EAAAF,GACZ,WAAAG,EAAU,IAAAH,GACV,KAAAI,CAAI,EAAAJ,EACJ,QAAAK,EAAS,IAAI,EAAAL,EACb,QAAAM,EAAS,IAAI,EAAAN,EAOxBO,EAAYR,EAAO,KAAK,MAAM,EAE1B,IAAAS,EAAU,GACVC,EAAY,GACZC,EAAQ,KAEZC,EAAO,KACA,MAAAC,EAAcb,EAAO,KAAK,UAAS,KACpCS,IACHK,EAAA,EAAAJ,EAAY,EAAI,EAChBK,EAAI,EAAG,KAAI,KACVD,EAAA,EAAAH,EAAQ,SAAS,OAAS,eAAe,OAK5C,OAAAG,EAAA,EAAAL,EAAU,EAAI,EACPI,6CAM6CT,EAAW,CAAC,EAAAY,oDADbZ,EAAW,CAAC,EAAAY,oDAIZZ,EAAW,CAAC,EAAAY,8RA3B7DhB,EAAO,KAAK,IAAIE,CAAI,mKClBZ,MAACe,GAAQ,CACpB,UAAM,OAAO,wBAAW,oDACxB,UAAM,OAAO,wBAAW,gDACxB,IAAMC,EAAA,WAAO,wBAAW,EAAC,+CAC1B,EAEaC,GAAe,CAAG,EAElBC,GAAa,CACxB,IAAK,CAAC,CAAC,CACN,EAEUC,GAAQ,CACpB,YAAc,CAAC,CAAE,MAAAC,CAAO,IAAK,CAAE,QAAQ,MAAMA,CAAK,GAElD,QAAU,IAAM,EACjB","names":["matchers","switch_value","ctx","dirty","create_if_block_1","insert_hydration","target","div","anchor","create_if_block","stores","$$props","page","constructors","components","form","data_0","data_1","afterUpdate","mounted","navigated","title","onMount","unsubscribe","$$invalidate","tick","$$value","nodes","__vitePreload","server_loads","dictionary","hooks","error"],"ignoreList":[],"sources":["../../../../../generated/client-optimized/matchers.js","../../../../../generated/root.svelte","../../../../../generated/client-optimized/app.js"],"sourcesContent":["export const matchers = {};","<!-- This file is generated by @sveltejs/kit — do not edit it! -->\n\n<script>\n\timport { setContext, afterUpdate, onMount, tick } from 'svelte';\n\timport { browser } from '$app/environment';\n\n\t// stores\n\texport let stores;\n\texport let page;\n\t\n\texport let constructors;\n\texport let components = [];\n\texport let form;\n\texport let data_0 = null;\n\texport let data_1 = null;\n\n\tif (!browser) {\n\t\tsetContext('__svelte__', stores);\n\t}\n\n\t$: stores.page.set(page);\n\tafterUpdate(stores.page.notify);\n\n\tlet mounted = false;\n\tlet navigated = false;\n\tlet title = null;\n\n\tonMount(() => {\n\t\tconst unsubscribe = stores.page.subscribe(() => {\n\t\t\tif (mounted) {\n\t\t\t\tnavigated = true;\n\t\t\t\ttick().then(() => {\n\t\t\t\t\ttitle = document.title || 'untitled page';\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\tmounted = true;\n\t\treturn unsubscribe;\n\t});\n</script>\n\n{#if constructors[1]}\n\t<svelte:component this={constructors[0]} bind:this={components[0]} data={data_0}>\n\t\t<svelte:component this={constructors[1]} bind:this={components[1]} data={data_1} {form} />\n\t</svelte:component>\n{:else}\n\t<svelte:component this={constructors[0]} bind:this={components[0]} data={data_0} {form} />\n{/if}\n\n{#if mounted}\n\t<div id=\"svelte-announcer\" aria-live=\"assertive\" aria-atomic=\"true\" style=\"position: absolute; left: 0; top: 0; clip: rect(0 0 0 0); clip-path: inset(50%); overflow: hidden; white-space: nowrap; width: 1px; height: 1px\">\n\t\t{#if navigated}\n\t\t\t{title}\n\t\t{/if}\n\t</div>\n{/if}","export { matchers } from './matchers.js';\n\nexport const nodes = [\n\t() => import('./nodes/0'),\n\t() => import('./nodes/1'),\n\t() => import('./nodes/2')\n];\n\nexport const server_loads = [];\n\nexport const dictionary = {\n\t\t\"/\": [2]\n\t};\n\nexport const hooks = {\n\thandleError: (({ error }) => { console.error(error) }),\n\n\treroute: (() => {})\n};\n\nexport { default as root } from '../root.svelte';"],"file":"_app/immutable/entry/app.liZPI5cI.js"}

View File

@ -0,0 +1,2 @@
import{a as t}from"../chunks/entry.CDaYBwFn.js";export{t as start};
//# sourceMappingURL=start.D-zEssk8.js.map

View File

@ -0,0 +1 @@
{"version":3,"file":"start.D-zEssk8.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,2 @@
import{s as k,e as d,a as $,c as p,b as h,g as C,d as E,f as i,h as f,i as m,j as b,n as x,k as S,t as v,l as y}from"../chunks/scheduler.BMKC9Qcs.js";import{S as q,i as A}from"../chunks/index.CivusM5b.js";import{s as T}from"../chunks/entry.CDaYBwFn.js";const j=()=>{const r=T;return{page:{subscribe:r.page.subscribe},navigating:{subscribe:r.navigating.subscribe},updated:r.updated}},w={subscribe(r){return j().page.subscribe(r)}};function D(r){let e;return{c(){e=v("An unexpected error occurred.")},l(t){e=y(t,"An unexpected error occurred.")},m(t,o){m(t,e,o)},d(t){t&&i(e)}}}function H(r){let e;return{c(){e=v("The page you are trying to look for could not be found.")},l(t){e=y(t,"The page you are trying to look for could not be found.")},m(t,o){m(t,e,o)},d(t){t&&i(e)}}}function I(r){let e,t,o="404",l,c;function _(s,n){return s[0].status===404?H:D}let u=_(r),a=u(r);return{c(){e=d("div"),t=d("h1"),t.textContent=o,l=$(),c=d("p"),a.c(),this.h()},l(s){e=p(s,"DIV",{class:!0});var n=h(e);t=p(n,"H1",{class:!0,"data-svelte-h":!0}),C(t)!=="svelte-13aqgc6"&&(t.textContent=o),l=E(n),c=p(n,"P",{class:!0});var g=h(c);a.l(g),g.forEach(i),n.forEach(i),this.h()},h(){f(t,"class","text-4xl font-bold mt-8"),f(c,"class","py-4 text-xl"),f(e,"class","mx-auto max-w-page text-center")},m(s,n){m(s,e,n),b(e,t),b(e,l),b(e,c),a.m(c,null)},p(s,[n]){u!==(u=_(s))&&(a.d(1),a=u(s),a&&(a.c(),a.m(c,null)))},i:x,o:x,d(s){s&&i(e),a.d()}}}function P(r,e,t){let o;return S(r,w,l=>t(0,o=l)),[o]}let F=class extends q{constructor(e){super(),A(this,e,P,I,k,{})}};export{F as component};
//# sourceMappingURL=1.BbzVPmQE.js.map

View File

@ -0,0 +1 @@
{"version":3,"file":"1.BbzVPmQE.js","sources":["../../../../../../node_modules/.pnpm/@sveltejs+kit@2.5.8_@sveltejs+vite-plugin-svelte@3.1.0_svelte@4.2.17_vite@5.2.11/node_modules/@sveltejs/kit/src/runtime/app/stores.js","../../../../../../src/routes/+error.svelte"],"sourcesContent":["import { getContext } from 'svelte';\nimport { BROWSER } from 'esm-env';\nimport { stores as browser_stores } from '../client/client.js';\n\n/**\n * A function that returns all of the contextual stores. On the server, this must be called during component initialization.\n * Only use this if you need to defer store subscription until after the component has mounted, for some reason.\n */\nexport const getStores = () => {\n\tconst stores = BROWSER ? browser_stores : getContext('__svelte__');\n\n\treturn {\n\t\t/** @type {typeof page} */\n\t\tpage: {\n\t\t\tsubscribe: stores.page.subscribe\n\t\t},\n\t\t/** @type {typeof navigating} */\n\t\tnavigating: {\n\t\t\tsubscribe: stores.navigating.subscribe\n\t\t},\n\t\t/** @type {typeof updated} */\n\t\tupdated: stores.updated\n\t};\n};\n\n/**\n * A readable store whose value contains page data.\n *\n * On the server, this store can only be subscribed to during component initialization. In the browser, it can be subscribed to at any time.\n *\n * @type {import('svelte/store').Readable<import('@sveltejs/kit').Page>}\n */\nexport const page = {\n\tsubscribe(fn) {\n\t\tconst store = __SVELTEKIT_DEV__ ? get_store('page') : getStores().page;\n\t\treturn store.subscribe(fn);\n\t}\n};\n\n/**\n * A readable store.\n * When navigating starts, its value is a `Navigation` object with `from`, `to`, `type` and (if `type === 'popstate'`) `delta` properties.\n * When navigating finishes, its value reverts to `null`.\n *\n * On the server, this store can only be subscribed to during component initialization. In the browser, it can be subscribed to at any time.\n * @type {import('svelte/store').Readable<import('@sveltejs/kit').Navigation | null>}\n */\nexport const navigating = {\n\tsubscribe(fn) {\n\t\tconst store = __SVELTEKIT_DEV__ ? get_store('navigating') : getStores().navigating;\n\t\treturn store.subscribe(fn);\n\t}\n};\n\n/**\n * A readable store whose initial value is `false`. If [`version.pollInterval`](https://kit.svelte.dev/docs/configuration#version) is a non-zero value, SvelteKit will poll for new versions of the app and update the store value to `true` when it detects one. `updated.check()` will force an immediate check, regardless of polling.\n *\n * On the server, this store can only be subscribed to during component initialization. In the browser, it can be subscribed to at any time.\n * @type {import('svelte/store').Readable<boolean> & { check(): Promise<boolean> }}\n */\nexport const updated = {\n\tsubscribe(fn) {\n\t\tconst store = __SVELTEKIT_DEV__ ? get_store('updated') : getStores().updated;\n\n\t\tif (BROWSER) {\n\t\t\tupdated.check = store.check;\n\t\t}\n\n\t\treturn store.subscribe(fn);\n\t},\n\tcheck: () => {\n\t\tthrow new Error(\n\t\t\tBROWSER\n\t\t\t\t? 'Cannot check updated store before subscribing'\n\t\t\t\t: 'Can only check updated store in browser'\n\t\t);\n\t}\n};\n\n/**\n * @template {keyof ReturnType<typeof getStores>} Name\n * @param {Name} name\n * @returns {ReturnType<typeof getStores>[Name]}\n */\nfunction get_store(name) {\n\ttry {\n\t\treturn getStores()[name];\n\t} catch (e) {\n\t\tthrow new Error(\n\t\t\t`Cannot subscribe to '${name}' store on the server outside of a Svelte component, as it is bound to the current request via component context. This prevents state from leaking between users.` +\n\t\t\t\t'For more information, see https://kit.svelte.dev/docs/state-management#avoid-shared-state-on-the-server'\n\t\t);\n\t}\n}\n","<script lang=\"ts\">\n\timport { page } from '$app/stores';\n</script>\n\n<div class=\"mx-auto max-w-page text-center\">\n\t<h1 class=\"text-4xl font-bold mt-8\">404</h1>\n\t<p class=\"py-4 text-xl\">\n\t\t{#if $page.status === 404}\n\t\t\tThe page you are trying to look for could not be found.\n\t\t{:else}\n\t\t\tAn unexpected error occurred.\n\t\t{/if}\n\t</p>\n</div>\n"],"names":["getStores","stores","browser_stores","page","fn","ctx","create_if_block","insert_hydration","target","div","anchor","append_hydration","h1","p"],"mappings":"6PAQO,MAAMA,EAAY,IAAM,CAC9B,MAAMC,EAAmBC,EAElB,MAAA,CAEN,KAAM,CACL,UAAWD,EAAO,KAAK,SACxB,EAEA,WAAY,CACX,UAAWA,EAAO,WAAW,SAC9B,EAEA,QAASA,EAAO,OAAA,CAElB,EASaE,EAAO,CACnB,UAAUC,EAAI,CAEN,OAD+CJ,EAAY,EAAA,KACrD,UAAUI,CAAE,CAC1B,CACD,qCC5BQ,+BAEN,cAFM,+BAEN,sEAJyB,yDAEzB,cAFyB,yDAEzB,4FAFKC,EAAK,CAAA,EAAC,SAAW,IAAGC,kbAH3BC,EASKC,EAAAC,EAAAC,CAAA,EARJC,EAA2CF,EAAAG,CAAA,SAC3CD,EAMGF,EAAAI,CAAA","x_google_ignoreList":[0]}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

1
_app/version.json Normal file
View File

@ -0,0 +1 @@
{"version":"1715641342752"}

View File

Before

Width:  |  Height:  |  Size: 647 KiB

After

Width:  |  Height:  |  Size: 647 KiB

View File

@ -1,101 +0,0 @@
import type { CustomThemeConfig } from '@skeletonlabs/tw-plugin';
export const frothNoire: CustomThemeConfig = {
name: 'froth-noire',
properties: {
// =~= Theme Properties =~=
'--theme-font-family-base': `system-ui`,
'--theme-font-family-heading': `system-ui`,
'--theme-font-color-base': '0 0 0',
'--theme-font-color-dark': '255 255 255',
'--theme-rounded-base': '4px',
'--theme-rounded-container': '4px',
'--theme-border-base': '1px',
// =~= Theme On-X Colors =~=
'--on-primary': '0 0 0',
'--on-secondary': '0 0 0',
'--on-tertiary': '0 0 0',
'--on-success': '0 0 0',
'--on-warning': '0 0 0',
'--on-error': '0 0 0',
'--on-surface': '255 255 255',
// =~= Theme Colors =~=
// primary | #A0A0A0
'--color-primary-50': '241 241 241', // #f1f1f1
'--color-primary-100': '236 236 236', // #ececec
'--color-primary-200': '231 231 231', // #e7e7e7
'--color-primary-300': '217 217 217', // #d9d9d9
'--color-primary-400': '189 189 189', // #bdbdbd
'--color-primary-500': '160 160 160', // #A0A0A0
'--color-primary-600': '144 144 144', // #909090
'--color-primary-700': '120 120 120', // #787878
'--color-primary-800': '96 96 96', // #606060
'--color-primary-900': '78 78 78', // #4e4e4e
// secondary | #bcbcbc
'--color-secondary-50': '245 245 245', // #f5f5f5
'--color-secondary-100': '242 242 242', // #f2f2f2
'--color-secondary-200': '238 238 238', // #eeeeee
'--color-secondary-300': '228 228 228', // #e4e4e4
'--color-secondary-400': '208 208 208', // #d0d0d0
'--color-secondary-500': '188 188 188', // #bcbcbc
'--color-secondary-600': '169 169 169', // #a9a9a9
'--color-secondary-700': '141 141 141', // #8d8d8d
'--color-secondary-800': '113 113 113', // #717171
'--color-secondary-900': '92 92 92', // #5c5c5c
// tertiary | #c0c0c0
'--color-tertiary-50': '246 246 246', // #f6f6f6
'--color-tertiary-100': '242 242 242', // #f2f2f2
'--color-tertiary-200': '239 239 239', // #efefef
'--color-tertiary-300': '230 230 230', // #e6e6e6
'--color-tertiary-400': '211 211 211', // #d3d3d3
'--color-tertiary-500': '192 192 192', // #c0c0c0
'--color-tertiary-600': '173 173 173', // #adadad
'--color-tertiary-700': '144 144 144', // #909090
'--color-tertiary-800': '115 115 115', // #737373
'--color-tertiary-900': '94 94 94', // #5e5e5e
// success | #12984f
'--color-success-50': '219 240 229', // #dbf0e5
'--color-success-100': '208 234 220', // #d0eadc
'--color-success-200': '196 229 211', // #c4e5d3
'--color-success-300': '160 214 185', // #a0d6b9
'--color-success-400': '89 183 132', // #59b784
'--color-success-500': '18 152 79', // #12984f
'--color-success-600': '16 137 71', // #108947
'--color-success-700': '14 114 59', // #0e723b
'--color-success-800': '11 91 47', // #0b5b2f
'--color-success-900': '9 74 39', // #094a27
// warning | #ffff0b
'--color-warning-50': '255 255 218', // #ffffda
'--color-warning-100': '255 255 206', // #ffffce
'--color-warning-200': '255 255 194', // #ffffc2
'--color-warning-300': '255 255 157', // #ffff9d
'--color-warning-400': '255 255 84', // #ffff54
'--color-warning-500': '255 255 11', // #ffff0b
'--color-warning-600': '230 230 10', // #e6e60a
'--color-warning-700': '191 191 8', // #bfbf08
'--color-warning-800': '153 153 7', // #999907
'--color-warning-900': '125 125 5', // #7d7d05
// error | #EA3000
'--color-error-50': '252 224 217', // #fce0d9
'--color-error-100': '251 214 204', // #fbd6cc
'--color-error-200': '250 203 191', // #facbbf
'--color-error-300': '247 172 153', // #f7ac99
'--color-error-400': '240 110 77', // #f06e4d
'--color-error-500': '234 48 0', // #EA3000
'--color-error-600': '211 43 0', // #d32b00
'--color-error-700': '176 36 0', // #b02400
'--color-error-800': '140 29 0', // #8c1d00
'--color-error-900': '115 24 0', // #731800
// surface | #262626
'--color-surface-50': '222 222 222', // #dedede
'--color-surface-100': '212 212 212', // #d4d4d4
'--color-surface-200': '201 201 201', // #c9c9c9
'--color-surface-300': '168 168 168', // #a8a8a8
'--color-surface-400': '103 103 103', // #676767
'--color-surface-500': '38 38 38', // #262626
'--color-surface-600': '34 34 34', // #222222
'--color-surface-700': '29 29 29', // #1d1d1d
'--color-surface-800': '23 23 23', // #171717
'--color-surface-900': '19 19 19' // #131313
}
};

2
index.html Normal file
View File

@ -0,0 +1,2 @@
<!doctype html> <html class=dark lang=en> <head> <title>Froth Pages</title> <meta charset=utf-8> <link href=./favicon.png rel=icon> <meta content="width=device-width" name=viewport> <link href=./_app/immutable/assets/0.BK0e5ymq.css rel=stylesheet> <link href=./_app/immutable/assets/ProgressBar.Cirlo5Z8.css rel=stylesheet> <link href=./_app/immutable/entry/start.D-zEssk8.js rel=modulepreload> <link href=./_app/immutable/chunks/entry.CDaYBwFn.js rel=modulepreload> <link href=./_app/immutable/chunks/scheduler.BMKC9Qcs.js rel=modulepreload> <link href=./_app/immutable/chunks/index.Cfk6EvZr.js rel=modulepreload> <link href=./_app/immutable/entry/app.liZPI5cI.js rel=modulepreload> <link href=./_app/immutable/chunks/index.CivusM5b.js rel=modulepreload> <link href=./_app/immutable/nodes/0.CSfd0-ok.js rel=modulepreload> <link href=./_app/immutable/chunks/ProgressBar.svelte_svelte_type_style_lang.MplOcq4z.js rel=modulepreload> <link href=./_app/immutable/nodes/2.C9LKif5l.js rel=modulepreload> </head> <body data-sveltekit-preload-data=hover data-theme=froth-noire> <div class="overflow-hidden h-full" style=display:contents> <div class="flex flex-col h-full overflow-hidden w-full" data-testid=app-shell id=appShell> <header class="z-10 flex-none" id=shell-header> <div class="flex flex-col app-bar bg-surface-100-800-token p-4 space-y-4" data-testid=app-bar aria-label="" aria-labelledby="" role=toolbar> <div class="items-center app-bar-row-main gap-4 grid grid-cols-3"> <div class="flex items-center flex-none app-bar-slot-lead justify-between"><strong class="text-xl uppercase" data-svelte-h=svelte-qj9wju><a href=/ >Froth Pages</a></strong></div> <div class="flex-auto app-bar-slot-default place-self-center"><noscript data-svelte-h=svelte-1wo7yrt><strong>Hey, you! This page is interactive and currently requires JavaScript!</strong> <br> Want a non-JS version? Bother <a href=https://matrix.to/#/@samme:schizo.cafe class=anchor>Sam</a> about it!</noscript></div> <div class="flex items-center flex-none app-bar-slot-trail place-content-end space-x-4"><a href=https://git.froth.zone/sam/static-pages class=anchor data-svelte-h=svelte-1x2v8no>Source Code</a></div></div> </div> </header> <div class="flex h-full overflow-hidden w-full flex-auto"> <div class="flex flex-col flex-1 overflow-x-hidden" id=page style=scrollbar-gutter:auto> <main class=flex-auto id=page-content> <div class="p-4 container md:text-center mx-auto text-left"><div class="pb-24 pt-32 relative space-y-6 z-[1]"><div class="font-bold text-4xl tracking-tight">Host <span class=text-tertiary-500 data-svelte-h=svelte-oana9b>static websites</span> with Froth Pages!</div> <p class="max-w-lg md:mx-auto opacity-90">It's quick, easy, free & fast - just put your project's homepage, developer blog or web experiment into a Git repository at <a href=https://git.froth.zone class=anchor>Froth Git</a> and we'll do the rest.</p> <br> <div class="flex flex-col gap-3 md:block md:space-x-3 md:w-6/12 mx-auto"><div class="space-y-4 stepper" data-testid=stepper> <div class=stepper-content> <div class="space-y-4 step" data-testid=step> <header class="font-bold step-header text-2xl">1 - Make a repository</header> <div class="space-y-4 step-content"><div class=space-y-2 data-svelte-h=svelte-1scoj80><p>Create a public repository named <code class=code>pages</code> to make the site available on the main subdomain.</p> <hr></div> <p data-svelte-h=svelte-14hmija>Or, create a branch named <code class=code>pages</code> in any public repository.</p> <p data-svelte-h=svelte-90vtyv><code class=code>git switch --orphan pages</code><br><code class=code>git rm --cached -r .</code></p> <div class="overflow-hidden shadow shadow bg-neutral-900/90 codeblock rounded-container-token text-sm text-white" data-testid=codeblock> <header class="flex items-center justify-between codeblock-header p-2 pl-4 text-white/50 text-xs uppercase"> <span class=codeblock-language>terminal</span> <button class="!text-white btn btn-sm codeblock-btn variant-soft" type=button>Copy</button></header> <pre class="p-4 break-all codeblock-pre pt-1 whitespace-pre-wrap"><code class="codeblock-code language-shell lineNumbers"><span class=line></span> git switch --orphan pages
<span class=line></span> git rm --cached -r .</code></pre></div></div> </div> </div></div></div></div></div></main> </div> </div> </div> <script>{__sveltekit_1sa6hch={base:new URL(".",location).pathname.slice(0,-1)};const t=document.currentScript.parentElement,e=[null,null];Promise.all([import("./_app/immutable/entry/start.D-zEssk8.js"),import("./_app/immutable/entry/app.liZPI5cI.js")]).then((([l,a])=>{l.start(a,t,{node_ids:[0,2],data:e,form:null,error:null})}))}</script> </div>

View File

@ -1,46 +0,0 @@
{
"name": "static-pages",
"version": "0.0.1",
"private": true,
"scripts": {
"dev": "vite dev",
"build": "vite build",
"preview": "vite preview",
"check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
"check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
"lint": "prettier --check . && eslint .",
"format": "prettier --write ."
},
"devDependencies": {
"@skeletonlabs/skeleton": "2.10.0",
"@skeletonlabs/tw-plugin": "0.4.0",
"@sveltejs/adapter-auto": "^3.0.0",
"@sveltejs/adapter-static": "^3.0.1",
"@sveltejs/enhanced-img": "^0.2.0",
"@sveltejs/kit": "^2.5.4",
"@sveltejs/vite-plugin-svelte": "^3.0.0",
"@tailwindcss/forms": "^0.5.7",
"@tailwindcss/typography": "0.5.13",
"@types/eslint": "^8.56.6",
"@types/html-minifier-terser": "^7.0.2",
"@types/node": "20.12.11",
"@typescript-eslint/eslint-plugin": "^7.4.0",
"@typescript-eslint/parser": "^7.4.0",
"autoprefixer": "10.4.19",
"eslint": "^9.0.0",
"eslint-config-prettier": "^9.1.0",
"eslint-plugin-svelte": "^2.35.1",
"html-minifier-terser": "^7.2.0",
"postcss": "8.4.38",
"prettier": "^3.1.1",
"prettier-plugin-svelte": "^3.1.2",
"svelte": "^4.2.7",
"svelte-check": "^3.6.8",
"tailwindcss": "3.4.3",
"tslib": "^2.4.1",
"typescript": "^5.4.3",
"vite": "^5.2.6",
"vite-plugin-tailwind-purgecss": "0.3.3"
},
"type": "module"
}

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +0,0 @@
module.exports = {
plugins: {
tailwindcss: {},
autoprefixer: {}
}
};

View File

@ -1,5 +0,0 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": ["config:recommended", ":pinSkipCi", ":enableVulnerabilityAlerts", ":semanticCommits"],
"automerge": true
}

9
src/app.d.ts vendored
View File

@ -1,9 +0,0 @@
// See https://kit.svelte.dev/docs/types#app
// for information about these interfaces
// and what to do when importing types
declare namespace App {
// interface Locals {}
// interface PageData {}
// interface Error {}
// interface Platform {}
}

View File

@ -1,13 +0,0 @@
<!doctype html>
<html lang="en" class="dark">
<head>
<title>Froth Pages</title>
<meta charset="utf-8" />
<link rel="icon" href="%sveltekit.assets%/favicon.png" />
<meta name="viewport" content="width=device-width" />
%sveltekit.head%
</head>
<body data-sveltekit-preload-data="hover" data-theme="froth-noire">
<div style="display: contents" class="h-full overflow-hidden">%sveltekit.body%</div>
</body>
</html>

View File

@ -1,9 +0,0 @@
@tailwind base;
@tailwind components;
@tailwind utilities;
@tailwind variants;
html,
body {
@apply h-full overflow-hidden;
}

View File

@ -1,35 +0,0 @@
import { minify } from 'html-minifier-terser';
import { building } from '$app/environment';
const minification_options = {
collapseBooleanAttributes: true,
collapseWhitespace: true,
conservativeCollapse: true,
decodeEntities: true,
html5: true,
ignoreCustomComments: [/^#/],
minifyCSS: true,
minifyJS: true,
removeAttributeQuotes: true,
removeComments: true,
removeOptionalTags: true,
removeRedundantAttributes: true,
removeScriptTypeAttributes: true,
removeStyleLinkTypeAttributes: true,
sortAttributes: true,
sortClassName: true
};
/** @type {import('@sveltejs/kit').Handle} */
export async function handle({ event, resolve }) {
let page = '';
return resolve(event, {
transformPageChunk: ({ html, done }) => {
page += html;
if (done) {
return building ? minify(page, minification_options) : page;
}
}
});
}

View File

@ -1,8 +0,0 @@
// place files you want to import through the `$lib` alias in this folder.
export const gitDomain = 'git.froth.zone';
export const gitName = 'Froth Git';
export const pagesDomain = 'pages.git.froth.zone';
export const pagesName = 'Froth Pages';
export const ipv4 = '150.136.112.69';
export const ipv6 = '2603:c020:4004:62ee:d84c:2488:5bdb:99c1';

View File

@ -1,148 +0,0 @@
<script lang="ts">
import { browser } from '$app/environment';
import { gitDomain, ipv4, ipv6, pagesDomain } from '$lib';
import { Accordion, AccordionItem, CodeBlock, Step, Stepper } from '@skeletonlabs/skeleton';
let username = '';
let repository = '';
let branch = '';
$: navDomain = `https://${username}.${pagesDomain}${!repository ? '' : `/${repository}`}${!branch ? '' : `/@${branch}`}`;
$: dnsDomain = `${!branch ? '' : `${branch}.`}${!repository ? '' : `${repository}.`}${username}.${pagesDomain}`;
function codebergDocs() {
if (browser) {
window.open('https://docs.codeberg.org/codeberg-pages/', '_blank');
}
}
</script>
<Stepper
on:complete={codebergDocs}
buttonCompleteLabel="Open Documentation"
buttonComplete="variant-filled-success"
>
<Step>
<svelte:fragment slot="navigation">
<a href="https://{gitDomain}/repo/create" target="_blank" class="btn variant-filled-secondary"
>Create a repository!</a
>
</svelte:fragment>
<svelte:fragment slot="header">1 - Make a repository</svelte:fragment>
<div class="space-y-2">
<p>
Create a public repository named <code class="code">pages</code> to make the site available on
the main subdomain.
</p>
<hr />
</div>
<p>Or, create a branch named <code class="code">pages</code> in any public repository.</p>
<p>
<code class="code">git switch --orphan pages</code><br /><code class="code"
>git rm --cached -r .</code
>
</p>
<CodeBlock
buttonCopied="Copied!"
lineNumbers={true}
language="shell"
code={`git switch --orphan pages
git rm --cached -r .`}
></CodeBlock>
</Step>
<Step>
<svelte:fragment slot="header">2 - Add your files</svelte:fragment>
<p>Push your static content. HTML, CSS, fonts, images or anything else.</p>
</Step>
<Step>
<svelte:fragment slot="header">3 - You're Done!</svelte:fragment>
<div class="space-y-4">
<p>Access your new website with this link:</p>
<code class="code">https://USERNAME.{pagesDomain}[/REPOSITORY][/@BRANCH]</code>
<p>or, use this handy form that can navigate for you!</p>
<div class="space-y-1">
<div class="input-group input-group-divider grid-cols-4">
<input
bind:value={username}
class="input variant-form-material {username ? '' : 'input-error'}"
title="Username"
type="text"
placeholder="Username (required)"
required
/>
<div class="input-group-shim">.{pagesDomain}/</div>
<input
bind:value={repository}
class="input variant-form-material"
title="Repository"
type="text"
placeholder="Repository"
/>
<input
bind:value={branch}
class="input variant-form-material"
title="Branch"
type="text"
placeholder="Branch"
/>
</div>
<a href={navDomain} class="btn variant-filled-secondary">Take me there!</a>
</div>
<hr />
<div>
<h3 class="h3">What about custom domains?</h3>
<p>
To use custom domains, create a <code class="code">.domains</code> in the root of your repository
with the domain name you would like to use.
</p>
<br />
<p>Then, add a DNS record for that domain:</p>
<em>(note): use the above form to auto-generate your DNS records!</em>
<Accordion autocollapse>
<AccordionItem open>
<svelte:fragment slot="summary">CNAME (Prefered)</svelte:fragment>
<svelte:fragment slot="content">
<code class="code">CNAME [[branch.]repo.]user.{pagesDomain}.</code>
<CodeBlock buttonCopied="Copied!" language="dns" code={`CNAME ${dnsDomain}.`}
></CodeBlock>
</svelte:fragment>
</AccordionItem>
<AccordionItem>
<svelte:fragment slot="summary">ALIAS (If available)</svelte:fragment>
<svelte:fragment slot="content">
<p>For apex domains where CNAME does not work.</p>
<p>
<code class="code">ALIAS {pagesDomain}.</code><br /><code class="code"
>TXT $[[branch.]repo.]user.{pagesDomain}</code
>
</p>
<CodeBlock
buttonCopied="Copied!"
language="dns"
code={`ALIAS ${pagesDomain}.
TXT ${dnsDomain}`}
></CodeBlock>
</svelte:fragment>
</AccordionItem>
<AccordionItem>
<svelte:fragment slot="summary">A/AAAA (Old reliable)</svelte:fragment>
<svelte:fragment slot="content">
<p>If CNAME will not work and ALIAS is not available</p>
<p>
<code class="code">A {ipv4}</code><br /><code class="code">AAAA {ipv6}</code><br
/><code class="code">TXT $[[branch.]repo.]user.{pagesDomain}</code>
</p>
<CodeBlock
buttonCopied="Copied!"
language="dns"
code={`A ${ipv4}
AAAA ${ipv6}
TXT ${dnsDomain}`}
></CodeBlock>
</svelte:fragment>
</AccordionItem>
</Accordion>
</div>
</div>
</Step>
</Stepper>

View File

@ -1,14 +0,0 @@
<script lang="ts">
import { page } from '$app/stores';
</script>
<div class="mx-auto max-w-page text-center">
<h1 class="text-4xl font-bold mt-8">404</h1>
<p class="py-4 text-xl">
{#if $page.status === 404}
The page you are trying to look for could not be found.
{:else}
An unexpected error occurred.
{/if}
</p>
</div>

View File

@ -1,28 +0,0 @@
<script lang="ts">
import '../app.postcss';
import { AppShell, AppBar } from '@skeletonlabs/skeleton';
</script>
<!-- App Shell -->
<AppShell>
<svelte:fragment slot="header">
<!-- App Bar -->
<AppBar gridColumns="grid-cols-3" slotDefault="place-self-center" slotTrail="place-content-end">
<svelte:fragment slot="lead"
><strong class="text-xl uppercase"><a href="/">Froth Pages</a></strong></svelte:fragment
>
<noscript
><strong>Hey, you! This page is interactive and currently requires JavaScript!</strong>
<br />
Want a non-JS version? Bother
<a class="anchor" href="https://matrix.to/#/@samme:schizo.cafe">Sam</a> about it!</noscript
>
<svelte:fragment slot="trail"
><a class="anchor" href="https://git.froth.zone/sam/static-pages">Source Code</a
></svelte:fragment
>
</AppBar>
</svelte:fragment>
<!-- Page Route Content -->
<slot />
</AppShell>

View File

@ -1 +0,0 @@
export const prerender = true;

View File

@ -1,21 +0,0 @@
<script lang="ts">
import { gitDomain, gitName, pagesName } from '$lib';
import Instructions from '$lib/instructions.svelte';
</script>
<div class="container mx-auto text-left p-4 md:text-center">
<div class="relative z-[1] space-y-6 pt-32 pb-24">
<div class="font-bold text-4xl tracking-tight">
Host <span class="text-tertiary-500">static websites</span> with {pagesName}!
</div>
<p class="max-w-lg opacity-90 md:mx-auto">
It's quick, easy, free & fast - just put your project's homepage, developer blog or web
experiment into a Git repository at <a class="anchor" href="https://{gitDomain}">{gitName}</a>
and we'll do the rest.
</p>
<br />
<div class="flex flex-col gap-3 md:space-x-3 md:block mx-auto md:w-6/12">
<Instructions />
</div>
</div>
</div>

View File

@ -1,20 +0,0 @@
import adapter from '@sveltejs/adapter-static';
import { vitePreprocess } from '@sveltejs/vite-plugin-svelte';
/** @type {import('@sveltejs/kit').Config} */
const config = {
extensions: ['.svelte'],
// Consult https://kit.svelte.dev/docs/integrations#preprocessors
// for more information about preprocessors
preprocess: [vitePreprocess()],
kit: {
// adapter-auto only supports some environments, see https://kit.svelte.dev/docs/adapter-auto for a list.
// If your environment is not supported or you settled on a specific environment, switch out the adapter.
// See https://kit.svelte.dev/docs/adapters for more information about adapters.
adapter: adapter({
fallback: '404.html'
})
}
};
export default config;

View File

@ -1,32 +0,0 @@
import { join } from 'path';
import type { Config } from 'tailwindcss';
import forms from '@tailwindcss/forms';
import typography from '@tailwindcss/typography';
import { skeleton } from '@skeletonlabs/tw-plugin';
import { frothNoire } from './froth-noire-skeleton';
export default {
darkMode: 'class',
content: [
'./src/**/*.{html,js,svelte,ts}',
join(require.resolve('@skeletonlabs/skeleton'), '../**/*.{html,js,svelte,ts}')
],
theme: {
extend: {}
},
plugins: [
forms,
typography,
skeleton({
themes: {
preset: [
{
name: 'skeleton',
enhancements: true
}
],
custom: [frothNoire]
}
})
]
} satisfies Config;

View File

@ -1,18 +0,0 @@
{
"extends": "./.svelte-kit/tsconfig.json",
"compilerOptions": {
"allowJs": true,
"checkJs": true,
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"resolveJsonModule": true,
"skipLibCheck": true,
"sourceMap": true,
"strict": true,
"moduleResolution": "bundler"
}
// Path aliases are handled by https://kit.svelte.dev/docs/configuration#alias
//
// If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes
// from the referenced tsconfig.json - TypeScript does not merge them in
}

View File

@ -1,13 +0,0 @@
import { purgeCss } from 'vite-plugin-tailwind-purgecss';
import { sveltekit } from '@sveltejs/kit/vite';
import { defineConfig } from 'vite';
export default defineConfig({
build: {
sourcemap: true
},
css: {
devSourcemap: true
},
plugins: [sveltekit(), purgeCss()]
});