[ini]
This commit is contained in:
parent
3602cd9cc4
commit
7cbd0cef3a
19 changed files with 15783 additions and 1 deletions
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
|||
/temp/
|
||||
/build/
|
141
data/main.json
Normal file
141
data/main.json
Normal file
|
@ -0,0 +1,141 @@
|
|||
{
|
||||
"problems": {
|
||||
"title": "Probleme",
|
||||
"list": [
|
||||
"leichtfertige Digitalisierung",
|
||||
"fehlende einheitliche Standards",
|
||||
"Mangel an Geld und Personal",
|
||||
"behäbige Politik",
|
||||
"mangelnde/fehlende Schulung von zuständigem Personal",
|
||||
"Föderalismus?"
|
||||
]
|
||||
},
|
||||
"goals": {
|
||||
"title": "Ziele",
|
||||
"list": [
|
||||
"Sicherheit (Verfügbarkeit, Vertraulichkeit, Integrität)",
|
||||
"Freiheit",
|
||||
"digitale Souveränität",
|
||||
"Nachhaltigkeit",
|
||||
"niedrige Kosten"
|
||||
],
|
||||
"explanation": "Das kennst du sicher auch: Irgendwas funktioniert nicht richtig, oder wenn nur so halb. Niemand kümmert sich drum und außer dir scheint das Problem auch nicht als solches wahrgenommen zu werden. Klarer Fall: Du hast Digitaliserungsstau!"
|
||||
},
|
||||
"realization": {
|
||||
"pool": {
|
||||
"vorbetrachtung": {
|
||||
"title": "Vorbetrachtung",
|
||||
"text": [
|
||||
"Was tun? Das wollte schon Lenin wissen.",
|
||||
"Um auf möglichst wenig Widerstand zu stoßen, empfiehlt es sich im Vorherein Mitstreitende zu finden. In aller Regel sind dass Personen im näheren Umfeld, in Organisationstrukturen der Basis und natürlich dort, wo die Digitalisierung an sich stattfinden soll. Erkläre das Problem und sammle erste Eindrücke!",
|
||||
"Falls sich vor Ort keine Kooperations-Bereitschaft erkennen lässt: Beginne auf möglichst hoher Ebene (Vorstände, Räte) deine Ideen anzubringen! Vielleicht hatten Andere schon ähnliche Gedanken oder sind zumindest bereit dich mit deinem Projekt zu unterstützen. Die [LAG Netzpolitik](https://www.dielinke-sachsen.de/partei/parteistruktur/weitere-strukturen/lag-netzpolitik/) steht gern beratend zur Seite."
|
||||
],
|
||||
"tldr": [
|
||||
"umhören und austauschen",
|
||||
"aufklären und sensibilisieren"
|
||||
],
|
||||
"example": [
|
||||
"Alex aus dem Ortsverband Buxtehude ist genervt, weil sie immer Termine verpasst. Diese werden nur über die WhatsApp-Gruppe des Ortsverbandes bekannt gegeben und da Alex kein WhatsApp nutzt, bekommt sie davon nichts mit.",
|
||||
"Alex weiß, dass Markus aus der Ortsgruppe auch kein WhatsApp nutzt und fragt, ob ihn das auch frustiert. Beim der nächsten Versammlung der Ortsgruppe sprechen beide den Sachverhalt und das damit verbundene Problem an und mahnen eine andere Lösung an."
|
||||
]
|
||||
},
|
||||
"bestandsaufnahme_und_vernetzung": {
|
||||
"title": "Bestandsaufnahme und Vernetzung",
|
||||
"text": [
|
||||
"Aller Anfang ist schwer. Darum ist es nötig sich ersteinmal ein Bild von den Umständen zu machen. Wer nicht nur die Symptome bekämpfen möchte, muss das Übel an der root (wurzel) packen. Frag einfach mal nach wie Andere, ähnlich gelagerte (übergeordnete, parallele, untergeordnete) Strukturen, mit einer Situation wie deiner umgehen oder umgegangen sind.",
|
||||
"Gibt es vielleicht eine Lösung im Ortsverbands nebenan? Ist das Problem in der Vergangenheit schon mal aufgetretten?",
|
||||
"Falls es Anlaufstellen gibt, frag dort nach! Wenn nicht, schlag vor eine solche einzurichten! Bestenfalls reicht das schon, jemand kommt auf dich zu und löst dein Problem."
|
||||
],
|
||||
"tldr": [
|
||||
"erkundigen, was es schon gibt",
|
||||
"Mitglieder mit Fachwissen bzw. Erfahrung konsultieren",
|
||||
"Unterstützung suchen und mit anderen zusammentun",
|
||||
"veranlassen, dass Stellen entstehen (falls nötig)"
|
||||
],
|
||||
"example": [
|
||||
"Bei der Buxtehudener Ortsgruppen-Versammlung sagt Tina, dass der Verband im Nachbarort Donnerheim das Problem auch hatte und mittlerweile irgend eine Lösung dafür gefunden hat. Tina will am nächsten Tag mit Georg aus dem OV Donnerheim telefonieren und ihn dazu befragen.",
|
||||
"Am darauf folgenden Tag erklärt Georg, dass sie das Problem erstmal nur provisorisch gelöst haben. Im Gespräch kommen die beiden auf den Nenner, dass es ein digitaler Kalender eine bessere Lösung für alle wäre.",
|
||||
"Georg tritt darauf hin mit dem Landesverband in Kontakt und fragt an, ob dafür eine Lösung verfügbar ist."
|
||||
]
|
||||
},
|
||||
"konzeptausarbeitung": {
|
||||
"title": "Konzept-Ausarbeitung",
|
||||
"text": [
|
||||
"Tja hat wohl nicht geklappt. Dann also auf die harte Tour.",
|
||||
"Zuallererst sollte bekannt sein mit welchem Aufwand überhaupt an der Beseitigung des Problem gearbeitet werden kann. Wenn du alles allein schultern musst, übernimm dich nicht!",
|
||||
"Falls es Lösungen gibt, wie realistisch können diese auf deine Situation angewandt werden? Nimm dir nicht zu viel auf einmal vor, plane nicht zu feingliedrig oder ausschweifend, aber plane!",
|
||||
"Welches Ziel soll in welchem Zeitraum erreicht werden und wer ist dafür zuständig - setz dir Meilensteine!",
|
||||
"Sei dir bewusst: Nur weil du meinst dein Problem hinreichend gründlich lösen zu können, heißt das noch lange nicht, dass das Andere auch so sehen. Wenn durch die Digitaliserung zwar der Aufwand aber eben auch der Nutzen sinkt, wäre es klug dies vorher zu kommunizieren. Stell dir vor wie sich jene fühlen, für die deine Lösung neue Probleme verursacht!",
|
||||
"Vorher darüber nachzudenken was wirklich getan werden muss, und was darüber hinaus getan werden kann hilft solche Nebenwirkungen abzufedern. Schreib diese Überlegungen auf! Dokumentiere das Für und Wider, und vor allem, bleib auf den ersten Blick unkonventionell anmutenden Lösungen gegenüber offen!"
|
||||
],
|
||||
"tldr": [
|
||||
"Ziele formulieren",
|
||||
"Sachzwänge und Bedarfe ermitteln",
|
||||
"verfügbare Lösungen suchen und vergleichen",
|
||||
"Schritte/Meilensteine herausstellen",
|
||||
"Ergebnisse festhalten"
|
||||
],
|
||||
"example": [
|
||||
"==TODO=="
|
||||
]
|
||||
},
|
||||
"mittelbeschaffung": {
|
||||
"title": "Mittelbeschaffung",
|
||||
"text": [
|
||||
"Ja, so eine open source Software benötigt vielleicht den einen oder anderen Klick mehr als das kommerziele Pendant. Doch was auf dem ersten Blick wie ein Nachteil aussieht kann auf lange Sicht ein Vorteil sein.",
|
||||
"Mittelbeschaffung betrifft nicht nur jenes Gerät, das an die Steckdose angeschlossen wird, sondern vielmehr das Programm bzw. die Software, welche es uns ermöglicht, das Gerät zu etwas Nützlichem zu gebrauchen, z.B. eine Office-Suite",
|
||||
"Neugeräte werden Standardmässig mit 24 Monaten gesetzlicher Gewährleistung ausgegeben. Bei gebrauchten Artikel gelten immernoch 12 Monate. Dies ist zu unterscheiden von einer Garantie die der Hersteller 'von sich aus' auf seine Ware gewährt (z.B. Akkutausch bis 12 Monate nach erhalten/ Displaytausch bis 36 Monate). Teilweise sind derartige Garantien erst nach Registrierung aktiviert. Falls die gewährte Garantie für die angestrebte Aufgabe zu kurz oder nicht umfänglich genug erscheint, lassen sich für gewöhnlich Garantierverlängerungen bzw. Zusatzversicherung dazukaufen. Hier sollte vorher abgewogen werden ob ein Abo-Modell oder eine Einmalzahlung 'günstiger' ist. Grundsätzlich sind längere Garantiezeit ein Zeichen von stabileren Produkten. Die reine Garantiezeit sollte aber nicht das ausschlaggebende Argument für die Anschaffung sein.",
|
||||
"==TODO== Stichpunkte"
|
||||
],
|
||||
"tldr": [
|
||||
"Beschaffungsparameter berücksichtigen",
|
||||
"nicht zu groß dimensionieren aber auch nicht zu knapp",
|
||||
"auf Garantie/Gewährleistung achten",
|
||||
"auf Erweiterbarkeit achten"
|
||||
],
|
||||
"example": [
|
||||
"- Neues Notebook"
|
||||
]
|
||||
},
|
||||
"einrichtung_und_inbetriebnahme": {
|
||||
"title": "Einrichtung und Inbetriebnahme",
|
||||
"text": [
|
||||
"Die besten Komponenten nützen nichts, wenn sie am Ende nicht wie gewollt zusammenspielen. Bestenfalls sieht man die ganze Arbeit, die da hineingesteckt worden ist, nicht, doch normalerweise geht beim ersten Start eben nicht alles glatt. Am besten erstmal testen. Sind alle Kabel verbunden? Wurde die Software richtig konfiguriert? Gibt es irgendeinen Schritt der übersehen wurde? Für gewöhnlich sind es Kleinigkeiten, auf die eine Einzelperson im Zweifelsfall nicht achtet. Darum mindestens zu zweit schauen ob alles an Platz und Stelle ist. Ihr findet das Problem nicht? Es ist sehr wahrscheinlich das genau diese Problem schonmal aufgetretten ist. Online findet sich sicher eine Antwort. Oder fragt bei der LAG eures Vertrauens nach!",
|
||||
"==TODO== Stichpunkte"
|
||||
],
|
||||
"tldr": [
|
||||
"Testen",
|
||||
"bei Anfall von Daten: regelmäßige Sicherungen einrichten",
|
||||
"bei Diensten: Monitoring einrichten",
|
||||
"Erläuterungen zur Benutzung bereitstellen"
|
||||
],
|
||||
"example": [
|
||||
"==TODO=="
|
||||
]
|
||||
},
|
||||
"wartung_und_betreuung": {
|
||||
"title": "Wartung und Betreuung",
|
||||
"text": [
|
||||
"Motivation: Im Brandfall löscht die Feuerwehr. In der IT die IT-Beauftragten. Im Gegensatz zur Feuerbekämpfung, lässt sich die Problembekämpfung in der IT jedoch nicht einfach auf rein freiwilliger Basis stemmen.",
|
||||
"Dafür sollten eigens Personen (vorzugsweise Mitglieder) gefunden/ernannt/eingeteilt werden, die die Systeme aktualisieren, am Laufen halten, kontrollieren, usw., ähnlich einem Hausmeister, nur eben für IT",
|
||||
"Da diese Personen jedoch in den allermeisten Fällen Administratoren-Rechte bzw. erhöhte Zugriffsrechte für ihre Arbeit benötigen, sollte eine gewisse Vertrauensbasis vorhanden sein, die nicht durch bloße sechswöchige Mitgliedschaft gebildet wurde."
|
||||
],
|
||||
"tldr": [
|
||||
"Verantwortliche einteilen",
|
||||
"Nutzern Hilfe anbieten"
|
||||
],
|
||||
"example": [
|
||||
"==TODO=="
|
||||
]
|
||||
}
|
||||
},
|
||||
"order": [
|
||||
"vorbetrachtung",
|
||||
"bestandsaufnahme_und_vernetzung",
|
||||
"konzeptausarbeitung",
|
||||
"mittelbeschaffung",
|
||||
"einrichtung_und_inbetriebnahme",
|
||||
"wartung_und_betreuung"
|
||||
]
|
||||
}
|
||||
}
|
26
ivaldi.json
Normal file
26
ivaldi.json
Normal file
|
@ -0,0 +1,26 @@
|
|||
{
|
||||
"name": "leitfaden-digitalisierung",
|
||||
"libs": [
|
||||
{
|
||||
"kind": "plankton",
|
||||
"data": {
|
||||
"modules": [
|
||||
"call",
|
||||
"log",
|
||||
"cache",
|
||||
"file",
|
||||
"json",
|
||||
"string",
|
||||
"markdown",
|
||||
"cache",
|
||||
"args"
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"sources": [
|
||||
"helpers.ts",
|
||||
"main.ts"
|
||||
]
|
||||
}
|
||||
|
2440
libs/plankton/plankton.d.ts
vendored
Normal file
2440
libs/plankton/plankton.d.ts
vendored
Normal file
File diff suppressed because it is too large
Load diff
7209
libs/plankton/plankton.js
Normal file
7209
libs/plankton/plankton.js
Normal file
File diff suppressed because it is too large
Load diff
127
source/helpers.ts
Normal file
127
source/helpers.ts
Normal file
|
@ -0,0 +1,127 @@
|
|||
|
||||
namespace leitfaden
|
||||
{
|
||||
|
||||
/**
|
||||
*/
|
||||
export async function promise_all_stable(
|
||||
promises : Array<Promise<any>>
|
||||
) : Promise<Array<any>>
|
||||
{
|
||||
const result : Array<any> = [];
|
||||
for (const promise of promises) {
|
||||
result.push(await promise);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*/
|
||||
let template_cache : lib_plankton.cache.type_subject<string>;
|
||||
|
||||
|
||||
/**
|
||||
*/
|
||||
export async function render(
|
||||
template_name : string,
|
||||
arguments_ : Record<string, string>
|
||||
) : Promise<string>
|
||||
{
|
||||
const template_content : string = await lib_plankton.cache.get<string>(
|
||||
template_cache,
|
||||
template_name,
|
||||
null,
|
||||
() => lib_plankton.file.read(
|
||||
lib_plankton.string.coin(
|
||||
"templates/{{name}}.html.tpl",
|
||||
{
|
||||
"name": template_name,
|
||||
}
|
||||
)
|
||||
)
|
||||
);
|
||||
return lib_plankton.string.coin(
|
||||
template_content,
|
||||
arguments_
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*/
|
||||
export async function templates_init(
|
||||
): Promise<void>
|
||||
{
|
||||
template_cache = await lib_plankton.cache.make();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*/
|
||||
let tabs_count : int = 0;
|
||||
|
||||
|
||||
/**
|
||||
*/
|
||||
export function tabs(
|
||||
sections : Array<
|
||||
{
|
||||
name : string;
|
||||
title : string;
|
||||
content : string;
|
||||
}
|
||||
>
|
||||
) : Promise<string>
|
||||
{
|
||||
tabs_count += 1;
|
||||
const identifier : string = tabs_count.toFixed(0).padStart(4, "0");
|
||||
return render(
|
||||
"tabs",
|
||||
{
|
||||
"id": lib_plankton.string.coin(
|
||||
"tabs-{{identifier}}",
|
||||
{
|
||||
"identifier": identifier,
|
||||
}
|
||||
),
|
||||
"head": (
|
||||
sections
|
||||
.map(
|
||||
(section, index) => lib_plankton.string.coin(
|
||||
"<button class=\"tabs-head-entry\" onClick=\"tab_select('{{identifier}}',{{index}})\">{{title}}</buttom>",
|
||||
{
|
||||
"identifier": identifier,
|
||||
"index": index.toFixed(0),
|
||||
"title": section.title,
|
||||
}
|
||||
)
|
||||
)
|
||||
.join("\n")
|
||||
),
|
||||
"body": (
|
||||
sections
|
||||
.map(
|
||||
(section, index) => lib_plankton.string.coin(
|
||||
"<div class=\"tabs-body-entry\" id=\"tabs-body-entry-{{identifier}}-{{index}}\">{{content}}</div>",
|
||||
{
|
||||
"identifier": identifier,
|
||||
"index": index.toFixed(0),
|
||||
"content": section.content,
|
||||
}
|
||||
)
|
||||
)
|
||||
.join("\n")
|
||||
),
|
||||
"script": lib_plankton.string.coin(
|
||||
"tab_select('{{identifier}}',0);",
|
||||
{
|
||||
"identifier": identifier,
|
||||
}
|
||||
),
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
|
212
source/main.ts
Normal file
212
source/main.ts
Normal file
|
@ -0,0 +1,212 @@
|
|||
|
||||
namespace leitfaden
|
||||
{
|
||||
|
||||
/**
|
||||
*/
|
||||
type type_realization_entry = {
|
||||
title : string;
|
||||
text : Array<string>;
|
||||
tldr : Array<string>;
|
||||
example : Array<string>;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
*/
|
||||
type type_data = {
|
||||
problems : {
|
||||
title : string;
|
||||
list : Array<string>;
|
||||
};
|
||||
goals : {
|
||||
title : string;
|
||||
list : Array<string>;
|
||||
explanation : string;
|
||||
};
|
||||
realization : {
|
||||
pool : Record<string, type_realization_entry>;
|
||||
order : Array<string>;
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
*/
|
||||
export async function main(
|
||||
args_raw : Array<string>
|
||||
) : Promise<void>
|
||||
{
|
||||
// args
|
||||
const arg_handler : lib_plankton.args.class_handler = new lib_plankton.args.class_handler(
|
||||
{
|
||||
"data_path": lib_plankton.args.class_argument.volatile({
|
||||
"indicators_long": ["data-path"],
|
||||
"indicators_short": ["d"],
|
||||
"type": lib_plankton.args.enum_type.string,
|
||||
"mode": lib_plankton.args.enum_mode.replace,
|
||||
"default": "data.json",
|
||||
"info": "path to data file",
|
||||
"name": "data-path",
|
||||
}),
|
||||
"verbosity": lib_plankton.args.class_argument.volatile({
|
||||
"indicators_long": ["verbosity"],
|
||||
"indicators_short": ["v"],
|
||||
"type": lib_plankton.args.enum_type.string,
|
||||
"mode": lib_plankton.args.enum_mode.replace,
|
||||
"default": "notice",
|
||||
"info": "error | warning | notice | info | debug",
|
||||
"name": "verbosity",
|
||||
}),
|
||||
"help": lib_plankton.args.class_argument.volatile({
|
||||
"indicators_long": ["help"],
|
||||
"indicators_short": ["h"],
|
||||
"type": lib_plankton.args.enum_type.boolean,
|
||||
"mode": lib_plankton.args.enum_mode.replace,
|
||||
"default": false,
|
||||
"info": "alias for action 'help'",
|
||||
"name": "help",
|
||||
}),
|
||||
}
|
||||
);
|
||||
const args : Record<string, any> = arg_handler.read(
|
||||
lib_plankton.args.enum_environment.cli,
|
||||
args_raw.join(" ")
|
||||
);
|
||||
|
||||
// init
|
||||
lib_plankton.log.set_main_logger(
|
||||
[
|
||||
{
|
||||
"kind": "filtered",
|
||||
"data": {
|
||||
"core": {
|
||||
"kind": "std",
|
||||
"data": {
|
||||
"target": "stderr",
|
||||
"format": {
|
||||
"kind": "human_readable",
|
||||
"data": {
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"predicate": [
|
||||
[
|
||||
{
|
||||
"item": {
|
||||
"kind": "level",
|
||||
"data": {
|
||||
"threshold": args.verbosity,
|
||||
}
|
||||
},
|
||||
},
|
||||
]
|
||||
],
|
||||
}
|
||||
},
|
||||
]
|
||||
);
|
||||
await leitfaden.templates_init();
|
||||
const data : type_data = lib_plankton.json.decode(
|
||||
await lib_plankton.file.read(args.data_path)
|
||||
);
|
||||
const style : string = await lib_plankton.file.read("style.css");
|
||||
|
||||
// exec
|
||||
const output : string = await leitfaden.render(
|
||||
"main",
|
||||
{
|
||||
"style": style,
|
||||
"problems": await leitfaden.render(
|
||||
"problems",
|
||||
{
|
||||
"title": data.problems.title,
|
||||
"list": data.problems.list.map(
|
||||
entry => lib_plankton.string.coin(
|
||||
"<li>{{entry}}</li>",
|
||||
{
|
||||
"entry": entry,
|
||||
}
|
||||
)
|
||||
).join("\n"),
|
||||
}
|
||||
),
|
||||
"goals": await leitfaden.render(
|
||||
"goals",
|
||||
{
|
||||
"title": data.goals.title,
|
||||
"list": data.goals.list.map(
|
||||
entry => lib_plankton.string.coin(
|
||||
"<li>{{entry}}</li>",
|
||||
{
|
||||
"entry": entry,
|
||||
}
|
||||
)
|
||||
).join("\n"),
|
||||
"explanation": data.goals.explanation,
|
||||
}
|
||||
),
|
||||
"realization": await leitfaden.render(
|
||||
"realization",
|
||||
{
|
||||
"title": "Umsetzung",
|
||||
"entries": await leitfaden.tabs(
|
||||
(await leitfaden.promise_all_stable(
|
||||
data.realization.order
|
||||
.map(
|
||||
async (name) => {
|
||||
const realization : type_realization_entry = data.realization.pool[name];
|
||||
return Promise.resolve({
|
||||
"name": name,
|
||||
"title": realization.title,
|
||||
"content": await leitfaden.render(
|
||||
"realization-entry",
|
||||
{
|
||||
"title": realization.title,
|
||||
"text": realization.text.map(
|
||||
x => lib_plankton.string.coin(
|
||||
"<p>{{content}}</p>",
|
||||
{
|
||||
"content": x,
|
||||
}
|
||||
)
|
||||
).join("\n"),
|
||||
"tldr": realization.tldr.map(
|
||||
x => lib_plankton.string.coin(
|
||||
"<li>{{content}}</li>",
|
||||
{
|
||||
"content": x,
|
||||
}
|
||||
)
|
||||
).join("\n"),
|
||||
"example": realization.example.map(
|
||||
x => lib_plankton.string.coin(
|
||||
"<p>{{content}}</p>",
|
||||
{
|
||||
"content": x,
|
||||
}
|
||||
)
|
||||
).join("\n"),
|
||||
}
|
||||
)
|
||||
});
|
||||
}
|
||||
)
|
||||
))
|
||||
),
|
||||
}
|
||||
),
|
||||
}
|
||||
);
|
||||
process.stdout.write(output);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
(
|
||||
leitfaden.main(process.argv.slice(2))
|
||||
.then(() => {})
|
||||
.catch((error) => {process.stderr.write(String(error)); process.exit(1);})
|
||||
);
|
||||
|
60
source/style.css
Normal file
60
source/style.css
Normal file
|
@ -0,0 +1,60 @@
|
|||
html
|
||||
{
|
||||
background-color: hsl(150,0%,0%);
|
||||
color: hsl(150,0%,100%);
|
||||
|
||||
font-family: sans-serif;
|
||||
}
|
||||
|
||||
body
|
||||
{
|
||||
max-width: 960px;
|
||||
margin: auto;
|
||||
padding: 16px;
|
||||
|
||||
background-color: hsl(150,0%,12.5%);
|
||||
color: hsl(150,0%,87.5%);
|
||||
}
|
||||
|
||||
.tabs-head-entry
|
||||
{
|
||||
border: none;
|
||||
outline: none;
|
||||
cursor: pointer;
|
||||
padding: 8px;
|
||||
margin: 1px;
|
||||
transition: 0.25s;
|
||||
}
|
||||
|
||||
.tabs-body
|
||||
{
|
||||
display: block;
|
||||
}
|
||||
|
||||
.tabs-body > *:not(.tabs-active)
|
||||
{
|
||||
display: none;
|
||||
}
|
||||
|
||||
.realization-entry-tldr
|
||||
{
|
||||
margin: 8px;
|
||||
padding: 16px;
|
||||
|
||||
background-color: hsl(210,50%,25%);
|
||||
color: hsl(150,0%,100%);
|
||||
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.realization-entry-example
|
||||
{
|
||||
margin: 8px;
|
||||
padding: 16px;
|
||||
|
||||
background-color: hsl(150,50%,25%);
|
||||
color: hsl(150,0%,100%);
|
||||
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
8
source/templates/goals.html.tpl
Normal file
8
source/templates/goals.html.tpl
Normal file
|
@ -0,0 +1,8 @@
|
|||
<section>
|
||||
<h2>{{title}}</h2>
|
||||
<ul>
|
||||
{{list}}
|
||||
</ul>
|
||||
<p>{{explanation}}</p>
|
||||
</section>
|
||||
|
31
source/templates/main.html.tpl
Normal file
31
source/templates/main.html.tpl
Normal file
|
@ -0,0 +1,31 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
||||
<style>
|
||||
{{style}}
|
||||
</style>
|
||||
<script>
|
||||
function tab_select(identifier, index)
|
||||
{
|
||||
document.querySelectorAll("#tabs-" + identifier + " .tabs-body-entry").forEach(
|
||||
element => {
|
||||
element.classList.toggle("tabs-active", false);
|
||||
}
|
||||
);
|
||||
{
|
||||
const selector = ("#tabs-body-entry-" + identifier + "-" + index.toFixed(0));
|
||||
const element = document.querySelector(selector);
|
||||
if (element !== null) element.classList.toggle("tabs-active", true);
|
||||
}
|
||||
}
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
{{problems}}
|
||||
{{goals}}
|
||||
{{realization}}
|
||||
</body>
|
||||
</html>
|
||||
|
7
source/templates/problems.html.tpl
Normal file
7
source/templates/problems.html.tpl
Normal file
|
@ -0,0 +1,7 @@
|
|||
<section>
|
||||
<h2>{{title}}</h2>
|
||||
<ul>
|
||||
{{list}}
|
||||
</ul>
|
||||
</section>
|
||||
|
17
source/templates/realization-entry.html.tpl
Normal file
17
source/templates/realization-entry.html.tpl
Normal file
|
@ -0,0 +1,17 @@
|
|||
<section class="realization-entry">
|
||||
<h3>{{title}}</h3>
|
||||
<div class="realization-entry-text">
|
||||
{{text}}
|
||||
</div>
|
||||
<div class="realization-entry-tldr">
|
||||
<h4>TL;DR</h4>
|
||||
<ul>
|
||||
{{tldr}}
|
||||
</ul>
|
||||
</div>
|
||||
<div class="realization-entry-example">
|
||||
<h4>Beispiel</h4>
|
||||
{{example}}
|
||||
</div>
|
||||
</section>
|
||||
|
5
source/templates/realization.html.tpl
Normal file
5
source/templates/realization.html.tpl
Normal file
|
@ -0,0 +1,5 @@
|
|||
<section>
|
||||
<h2>{{title}}</h2>
|
||||
{{entries}}
|
||||
</section>
|
||||
|
11
source/templates/tabs.html.tpl
Normal file
11
source/templates/tabs.html.tpl
Normal file
|
@ -0,0 +1,11 @@
|
|||
<div class="tabs" id="{{id}}">
|
||||
<div class="tabs-head">
|
||||
{{head}}
|
||||
</div>
|
||||
<div class="tabs-body">
|
||||
{{body}}
|
||||
</div>
|
||||
<script>
|
||||
{{script}}
|
||||
</script>
|
||||
</div>
|
15
tools/build
Normal file → Executable file
15
tools/build
Normal file → Executable file
|
@ -1,4 +1,17 @@
|
|||
#!/usr/bin/env sh
|
||||
|
||||
echo "not done yet :/"
|
||||
## core
|
||||
mkdir -p build
|
||||
tools/ivaldi build
|
||||
|
||||
## templates
|
||||
mkdir -p build/templates
|
||||
cp -r -u source/templates/* build/templates/
|
||||
|
||||
## style
|
||||
mkdir -p build
|
||||
cp -u source/style.css build/
|
||||
|
||||
## node modules
|
||||
# cd build && npm install nodemailer ; cd -
|
||||
|
||||
|
|
4
tools/clear
Executable file
4
tools/clear
Executable file
|
@ -0,0 +1,4 @@
|
|||
#!/usr/bin/env sh
|
||||
|
||||
tools/ivaldi clear $@
|
||||
|
5461
tools/ivaldi
Executable file
5461
tools/ivaldi
Executable file
File diff suppressed because it is too large
Load diff
4
tools/update-ivaldi
Executable file
4
tools/update-ivaldi
Executable file
|
@ -0,0 +1,4 @@
|
|||
#!/usr/bin/env sh
|
||||
|
||||
cp -u -v ../../../eigene/ivaldi/build/ivaldi tools/ivaldi
|
||||
|
4
tools/update-libs
Executable file
4
tools/update-libs
Executable file
|
@ -0,0 +1,4 @@
|
|||
#!/usr/bin/env sh
|
||||
|
||||
tools/ivaldi fetch $@
|
||||
|
Loading…
Add table
Reference in a new issue