import { Component, createEffect, createMemo, onCleanup, onMount, useContext, } from "solid-js"; import LufraiLogo from "~icons/custom/lufrai-logo"; import AppIcon from "~icons/custom/icon"; import ExternalLinkIcon from "~icons/carbon/launch"; import WarningIcon from "~icons/carbon/warning-alt-filled"; import LaunchIcon from "~icons/carbon/edit"; import DonationIcon from "~icons/carbon/favorite-filled"; import WatermarkIcon from "~icons/carbon/bullhorn"; import Modal, { ModalCloseButton } from "./Modal"; import { LocalStoreContext } from "~/stores"; import createAccordion from "./Accordion"; import typer from "typer-js"; import "typer-js/dist/typer.min.css"; import { getDisplayDate, getHost, shuffle } from "~/util"; import { capitalize } from "froebel"; export const description = "Räppli ist eine freie Web App zur Erstellung von Schweizerischen Rechnungen inklusive QR-Code. Erfasse deine Rechnungspositionen und erhalte unmittelbar eine druckbare Rechnung."; const WelcomeModal: Component = (props) => { const [localState, setLocalState, localStateMounted] = useContext(LocalStoreContext)!; const [AcordionItem] = createAccordion(); let subtitleEl: HTMLSpanElement = undefined!; const isOpen = createMemo(() => { return localStateMounted() && localState.showWelcome; }); onMount(function () { let adjectives = [ "Schweizerischen", "anständigen", "umfassenden", "erfrischenden", "erfreulichen", "sauberen", "übersichtlichen", ]; let nouns = ["Rechnung", "Auftragsbestätigung", "Offerte"]; let combinations: [string, string][] = []; for (const adjective of adjectives) { for (const noun of nouns) { combinations.push([adjective, noun]); } } const firstCombination = combinations.splice(0, 1)[0]; combinations = shuffle(combinations); combinations.unshift(firstCombination!); let typerInstance = typer(subtitleEl, { min: 60, max: 160 }); let lastAdjective = ""; let lastNoun = ""; for (const [adjective, noun] of combinations) { const first = lastAdjective === ""; if (lastAdjective === adjective) { typerInstance.back(lastNoun.length, 80).continue(noun); } else { const method = first ? "line" : "continue"; typerInstance .back("all", 65) [method]( `${adjective} ${noun}`, first ? { min: 60, max: 70 } : undefined ); } typerInstance.pause(first ? 4181 : 6765); lastNoun = noun; lastAdjective = adjective; } typerInstance.back("all", 50).repeat(Infinity); let halted = false; createEffect(function () { if (!isOpen()) { halted = typerInstance.halt() === undefined; } else { try { // typer-js has some weird logic how it handles halt / resume. Essentially if halt wasn't executed before of resume, resume breaks completely halted && typerInstance.resume(); } catch (err) { if ((err as TypeError).message != "u.resume is not a function") { console.dir(err); } } halted = false; } }); onCleanup(function () { typerInstance.kill(); }); }); const ShareonLink: Component<{ provider: string; via?: string }> = ( props ) => ( ); return (

Einleitung

{description}

Wieso ist Räppli komplett{" "} kostenlos?

Consectetur id magna labore commodo exercitation laboris est laboris consectetur irure minim. Officia anim tempor adipisicing irure labore tempor reprehenderit culpa consequat ea esse exercitation. Consectetur labore velit nulla excepteur eiusmod sit fugiat do proident. Ex non consectetur mollit dolor dolore Lorem ut et incididunt pariatur sunt deserunt tempor magna ullamco.

Was ist Lufrai?

Quis occaecat pariatur laborum do ad esse. Mollit excepteur duis nulla proident nostrud tempor ad ullamco. Amet id magna aute esse tempor incididunt pariatur veniam ipsum qui. Sunt laboris in laborum reprehenderit qui sint consectetur nostrud excepteur proident proident laboris qui dolor ea. Reprehenderit tempor elit consequat dolore quis ad voluptate consequat. Eiusmod ad quis dolore dolore ea ipsum commodo eu aliquip veniam. Consequat pariatur est do sint nisi duis enim tempor occaecat elit non.

Open Source

Quis occaecat pariatur laborum do ad esse. Mollit excepteur duis nulla proident nostrud tempor ad ullamco. Amet id magna aute esse tempor incididunt pariatur veniam ipsum qui. Sunt laboris in laborum reprehenderit qui sint consectetur nostrud excepteur proident proident laboris qui dolor ea. Reprehenderit tempor elit consequat dolore quis ad voluptate consequat. Eiusmod ad quis dolore dolore ea ipsum commodo eu aliquip veniam. Consequat pariatur est do sint nisi duis enim tempor occaecat elit non.

Git-Repository

Das Projekt unterstützen

Irure laboris quis consequat enim tempor dolor. Esse velit occaecat dolore aute cillum pariatur reprehenderit irure duis eu nulla pariatur fugiat consectetur ipsum. Commodo ad aliquip nulla non incididunt. Officia veniam cillum cillum. Velit ex aliquip mollit deserunt nostrud id amet voluptate ea duis cupidatat officia culpa consequat enim. Voluptate anim fugiat anim et elit aute cupidatat. Duis aliquip laboris adipisicing dolore elit voluptate proident occaecat excepteur culpa exercitation velit. Veniam esse quis voluptate aliquip culpa. Aute cupidatat sunt amet ad fugiat id elit. Officia proident ea deserunt quis anim elit cupidatat pariatur. Aliqua dolore ad eiusmod qui eu ea enim qui enim incididunt aute irure tempor fugiat sunt. Consequat magna culpa Lorem nostrud cillum eu cillum adipisicing eu aute duis excepteur. In anim mollit amet elit ex.

Spende

Mitwirkung

Häufig gestellte Fragen

test test 3. Ich habe einen Anpassungswunsch!
Kann die App bitte gratis angepasst werden? } alignCenter={false} > test
4. Wie können Aufwand-Schätzungen gemacht werden?
Was hat es mit Agile auf sich?
} alignCenter={false} > test test 6. Können Fliesstexte formatiert werden?
Was ist Markdown?
} alignCenter={false} > test 7. Kann Räppli lokal installiert werden?
} alignCenter={false} > test 8. Wie präzise wurden die SIX QR-Rechnung Vorgaben umgesetzt? } alignCenter={false} > test
Bitte verwende einen Laptop oder Computer!
Version: {__APP_VERSION__} {getDisplayDate(new Date(__BUILD_TIME__))}
); }; export default WelcomeModal;