Dart backend update and upgrade, visual overhaul, additionally some Ñyqy updates that were meant for master branch #1

Merged
phundrak merged 38 commits from develop into master 2020-05-05 11:44:27 +00:00
16 changed files with 337 additions and 1921 deletions
Showing only changes of commit 37d735cfdd - Show all commits

View File

@ -9,6 +9,7 @@ environment:
dependencies:
js: '^0.6.1+1'
html: '^0.14.0+3'
dev_dependencies:
build_runner: ^1.8.0

View File

@ -1,75 +0,0 @@
/*
Copyright (C) 2019-2020 Lucien Cartier-Tilet
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
$bg: #2c3e50;
$darkerbg: #34495e;
$textcolor: #ecf0f1;
$tablecolor: #263646;
html {
background-color: $darkerbg;
}
thead {
tr {
@extend html;
}
}
.tooltiptext {
@extend html;
}
.tooltiptext::after {
border-color: $darkerbg transparent transparent transparent;
}
body {
color: $textcolor;
}
.title {
@extend body;
}
a {
@extend body;
}
th {
border: 1px solid $tablecolor;
}
td {
@extend th;
}
pre {
@extend th;
}
table {
border: 2px solid $tablecolor;
}
#content {
background-color: $bg;
}
#postamble{
background-color: $bg;
}

View File

@ -1,765 +0,0 @@
.org-bold {
/* bold */
font-weight: bold;
}
.org-bold-italic {
/* bold-italic */
font-weight: bold;
font-style: italic;
}
.org-buffer-menu-buffer {
/* buffer-menu-buffer */
font-weight: bold;
}
.org-builtin {
/* font-lock-builtin-face */
color: #7a378b;
}
.org-button {
/* button */
text-decoration: underline;
}
.org-calendar-today {
/* calendar-today */
text-decoration: underline;
}
.org-change-log-acknowledgement {
/* change-log-acknowledgement */
color: #b22222;
}
.org-change-log-conditionals {
/* change-log-conditionals */
color: #a0522d;
}
.org-change-log-date {
/* change-log-date */
color: #8b2252;
}
.org-change-log-email {
/* change-log-email */
color: #a0522d;
}
.org-change-log-file {
/* change-log-file */
color: #0000ff;
}
.org-change-log-function {
/* change-log-function */
color: #a0522d;
}
.org-change-log-list {
/* change-log-list */
color: #a020f0;
}
.org-change-log-name {
/* change-log-name */
color: #008b8b;
}
.org-comint-highlight-input {
/* comint-highlight-input */
font-weight: bold;
}
.org-comint-highlight-prompt {
/* comint-highlight-prompt */
color: #00008b;
}
.org-comment {
/* font-lock-comment-face */
color: #999988;
font-style: italic;
}
.org-comment-delimiter {
/* font-lock-comment-delimiter-face */
color: #999988;
font-style: italic;
}
.org-completions-annotations {
/* completions-annotations */
font-style: italic;
}
.org-completions-common-part {
/* completions-common-part */
color: #000000;
background-color: #ffffff;
}
.org-completions-first-difference {
/* completions-first-difference */
font-weight: bold;
}
.org-constant {
/* font-lock-constant-face */
color: #008b8b;
}
.org-diary {
/* diary */
color: #ff0000;
}
.org-diff-context {
/* diff-context */
color: #7f7f7f;
}
.org-diff-file-header {
/* diff-file-header */
background-color: #b3b3b3;
font-weight: bold;
}
.org-diff-function {
/* diff-function */
background-color: #cccccc;
}
.org-diff-header {
/* diff-header */
background-color: #cccccc;
}
.org-diff-hunk-header {
/* diff-hunk-header */
background-color: #cccccc;
}
.org-diff-index {
/* diff-index */
background-color: #b3b3b3;
font-weight: bold;
}
.org-diff-nonexistent {
/* diff-nonexistent */
background-color: #b3b3b3;
font-weight: bold;
}
.org-diff-refine-change {
/* diff-refine-change */
background-color: #d9d9d9;
}
.org-dired-directory {
/* dired-directory */
color: #0000ff;
}
.org-dired-flagged {
/* dired-flagged */
color: #ff0000;
font-weight: bold;
}
.org-dired-header {
/* dired-header */
color: #228b22;
}
.org-dired-ignored {
/* dired-ignored */
color: #7f7f7f;
}
.org-dired-mark {
/* dired-mark */
color: #008b8b;
}
.org-dired-marked {
/* dired-marked */
color: #ff0000;
font-weight: bold;
}
.org-dired-perm-write {
/* dired-perm-write */
color: #b22222;
}
.org-dired-symlink {
/* dired-symlink */
color: #a020f0;
}
.org-dired-warning {
/* dired-warning */
color: #ff0000;
font-weight: bold;
}
.org-doc {
/* font-lock-doc-face */
color: #8b2252;
}
.org-escape-glyph {
/* escape-glyph */
color: #a52a2a;
}
.org-file-name-shadow {
/* file-name-shadow */
color: #7f7f7f;
}
.org-flyspell-duplicate {
/* flyspell-duplicate */
color: #cdad00;
font-weight: bold;
text-decoration: underline;
}
.org-flyspell-incorrect {
/* flyspell-incorrect */
color: #ff4500;
font-weight: bold;
text-decoration: underline;
}
.org-fringe {
/* fringe */
background-color: #f2f2f2;
}
.org-function-name {
/* font-lock-function-name-face */
color: teal;
}
.org-header-line {
/* header-line */
color: #333333;
background-color: #e5e5e5;
}
.org-help-argument-name {
/* help-argument-name */
font-style: italic;
}
.org-highlight {
/* highlight */
background-color: #b4eeb4;
}
.org-holiday {
/* holiday */
background-color: #ffc0cb;
}
.org-isearch {
/* isearch */
color: #b0e2ff;
background-color: #cd00cd;
}
.org-isearch-fail {
/* isearch-fail */
background-color: #ffc1c1;
}
.org-italic {
/* italic */
font-style: italic;
}
.org-keyword {
/* font-lock-keyword-face */
color: #0086b3;
}
.org-lazy-highlight {
/* lazy-highlight */
background-color: #afeeee;
}
.org-link {
/* link */
color: #0000ff;
text-decoration: underline;
}
.org-link-visited {
/* link-visited */
color: #8b008b;
text-decoration: underline;
}
.org-log-edit-header {
/* log-edit-header */
color: #a020f0;
}
.org-log-edit-summary {
/* log-edit-summary */
color: #0000ff;
}
.org-log-edit-unknown-header {
/* log-edit-unknown-header */
color: #b22222;
}
.org-match {
/* match */
background-color: #ffff00;
}
.org-next-error {
/* next-error */
background-color: #eedc82;
}
.org-nobreak-space {
/* nobreak-space */
color: #a52a2a;
text-decoration: underline;
}
.org-org-archived {
/* org-archived */
color: #7f7f7f;
}
.org-org-block {
/* org-block */
color: #7f7f7f;
}
.org-org-block-begin-line {
/* org-block-begin-line */
color: #b22222;
}
.org-org-block-end-line {
/* org-block-end-line */
color: #b22222;
}
.org-org-checkbox {
/* org-checkbox */
font-weight: bold;
}
.org-org-checkbox-statistics-done {
/* org-checkbox-statistics-done */
color: #228b22;
font-weight: bold;
}
.org-org-checkbox-statistics-todo {
/* org-checkbox-statistics-todo */
color: #ff0000;
font-weight: bold;
}
.org-org-clock-overlay {
/* org-clock-overlay */
background-color: #ffff00;
}
.org-org-code {
/* org-code */
color: #7f7f7f;
}
.org-org-column {
/* org-column */
background-color: #e5e5e5;
}
.org-org-column-title {
/* org-column-title */
background-color: #e5e5e5;
font-weight: bold;
text-decoration: underline;
}
.org-org-date {
/* org-date */
color: #a020f0;
text-decoration: underline;
}
.org-org-document-info {
/* org-document-info */
color: #191970;
}
.org-org-document-info-keyword {
/* org-document-info-keyword */
color: #7f7f7f;
}
.org-org-document-title {
/* org-document-title */
color: #191970;
font-size: 144%;
font-weight: bold;
}
.org-org-done {
/* org-done */
color: #228b22;
font-weight: bold;
}
.org-org-drawer {
/* org-drawer */
color: #0000ff;
}
.org-org-ellipsis {
/* org-ellipsis */
color: #b8860b;
text-decoration: underline;
}
.org-org-footnote {
/* org-footnote */
color: #a020f0;
text-decoration: underline;
}
.org-org-formula {
/* org-formula */
color: #b22222;
}
.org-org-headline-done {
/* org-headline-done */
color: #bc8f8f;
}
.org-org-hide {
/* org-hide */
color: #ffffff;
}
.org-org-latex-and-export-specials {
/* org-latex-and-export-specials */
color: #8b4513;
}
.org-org-level-1 {
/* org-level-1 */
color: #0000ff;
}
.org-org-level-2 {
/* org-level-2 */
color: #a0522d;
}
.org-org-level-3 {
/* org-level-3 */
color: #a020f0;
}
.org-org-level-4 {
/* org-level-4 */
color: #b22222;
}
.org-org-level-5 {
/* org-level-5 */
color: #228b22;
}
.org-org-level-6 {
/* org-level-6 */
color: #008b8b;
}
.org-org-level-7 {
/* org-level-7 */
color: #7a378b;
}
.org-org-level-8 {
/* org-level-8 */
color: #8b2252;
}
.org-org-link {
/* org-link */
color: #0000ff;
text-decoration: underline;
}
.org-org-meta-line {
/* org-meta-line */
color: #b22222;
}
.org-org-mode-line-clock {
/* org-mode-line-clock */
color: #000000;
background-color: #bfbfbf;
}
.org-org-mode-line-clock-overrun {
/* org-mode-line-clock-overrun */
color: #000000;
background-color: #ff0000;
}
.org-org-quote {
/* org-quote */
color: #7f7f7f;
}
.org-org-scheduled {
/* org-scheduled */
color: #006400;
}
.org-org-scheduled-previously {
/* org-scheduled-previously */
color: #b22222;
}
.org-org-scheduled-today {
/* org-scheduled-today */
color: #006400;
}
.org-org-sexp-date {
/* org-sexp-date */
color: #a020f0;
}
.org-org-special-keyword {
/* org-special-keyword */
color: #a020f0;
}
.org-org-table {
/* org-table */
color: #0000ff;
}
.org-org-tag {
/* org-tag */
font-weight: bold;
}
.org-org-target {
/* org-target */
text-decoration: underline;
}
.org-org-time-grid {
/* org-time-grid */
color: #b8860b;
}
.org-org-todo {
/* org-todo */
color: #ff0000;
font-weight: bold;
}
.org-org-upcoming-deadline {
/* org-upcoming-deadline */
color: #b22222;
}
.org-org-verbatim {
/* org-verbatim */
color: #7f7f7f;
}
.org-org-verse {
/* org-verse */
color: #7f7f7f;
}
.org-org-warning {
/* org-warning */
color: #ff0000;
font-weight: bold;
}
.org-outline-1 {
/* outline-1 */
color: #0000ff;
}
.org-outline-2 {
/* outline-2 */
color: #a0522d;
}
.org-outline-3 {
/* outline-3 */
color: #a020f0;
}
.org-outline-4 {
/* outline-4 */
color: #b22222;
}
.org-outline-5 {
/* outline-5 */
color: #228b22;
}
.org-outline-6 {
/* outline-6 */
color: #008b8b;
}
.org-outline-7 {
/* outline-7 */
color: #7a378b;
}
.org-outline-8 {
/* outline-8 */
color: #8b2252;
}
.org-preprocessor {
/* font-lock-preprocessor-face */
color: #7a378b;
}
.org-query-replace {
/* query-replace */
color: #b0e2ff;
background-color: #cd00cd;
}
.org-regexp-grouping-backslash {
/* font-lock-regexp-grouping-backslash */
font-weight: bold;
}
.org-regexp-grouping-construct {
/* font-lock-regexp-grouping-construct */
font-weight: bold;
}
.org-region {
/* region */
background-color: #eedc82;
}
.org-secondary-selection {
/* secondary-selection */
background-color: #ffff00;
}
.org-shadow {
/* shadow */
color: #7f7f7f;
}
.org-show-paren-match {
/* show-paren-match */
background-color: #40e0d0;
}
.org-show-paren-mismatch {
/* show-paren-mismatch */
color: #ffffff;
background-color: #a020f0;
}
.org-string {
/* font-lock-string-face */
color: #dd1144;
}
.org-tool-bar {
/* tool-bar */
color: #000000;
background-color: #bfbfbf;
}
.org-tooltip {
/* tooltip */
color: #000000;
background-color: #ffffe0;
}
.org-trailing-whitespace {
/* trailing-whitespace */
background-color: #ff0000;
}
.org-type {
/* font-lock-type-face */
color: #228b22;
}
.org-underline {
/* underline */
text-decoration: underline;
}
.org-variable-name {
/* font-lock-variable-name-face */
color: teal;
}
.org-warning {
/* font-lock-warning-face */
color: #ff0000;
font-weight: bold;
}
.org-widget-button {
/* widget-button */
font-weight: bold;
}
.org-widget-button-pressed {
/* widget-button-pressed */
color: #ff0000;
}
.org-widget-documentation {
/* widget-documentation */
color: #006400;
}
.org-widget-field {
/* widget-field */
background-color: #d9d9d9;
}
.org-widget-inactive {
/* widget-inactive */
color: #7f7f7f;
}
.org-widget-single-line-field {
/* widget-single-line-field */
background-color: #d9d9d9;
}
/*# sourceMappingURL=htmlize.css.map */

View File

@ -1,620 +0,0 @@
.org-bold {
font-weight: 700;
}
.org-bold-italic {
font-weight: 700;
font-style: italic;
}
.org-buffer-menu-buffer {
font-weight: 700;
}
.org-builtin {
color: #7a378b;
}
.org-button {
text-decoration: underline;
}
.org-calendar-today {
text-decoration: underline;
}
.org-change-log-acknowledgement {
color: #b22222;
}
.org-change-log-conditionals {
color: sienna;
}
.org-change-log-date {
color: #8b2252;
}
.org-change-log-email {
color: sienna;
}
.org-change-log-file {
color: #00f;
}
.org-change-log-function {
color: sienna;
}
.org-change-log-list {
color: #a020f0;
}
.org-change-log-name {
color: #008b8b;
}
.org-comint-highlight-input {
font-weight: 700;
}
.org-comint-highlight-prompt {
color: #00008b;
}
.org-comment {
color: #998;
font-style: italic;
}
.org-comment-delimiter {
color: #998;
font-style: italic;
}
.org-completions-annotations {
font-style: italic;
}
.org-completions-common-part {
color: #000;
background-color: #fff;
}
.org-completions-first-difference {
font-weight: 700;
}
.org-constant {
color: #008b8b;
}
.org-diary {
color: red;
}
.org-diff-context {
color: #7f7f7f;
}
.org-diff-file-header {
background-color: #b3b3b3;
font-weight: 700;
}
.org-diff-function {
background-color: #ccc;
}
.org-diff-header {
background-color: #ccc;
}
.org-diff-hunk-header {
background-color: #ccc;
}
.org-diff-index {
background-color: #b3b3b3;
font-weight: 700;
}
.org-diff-nonexistent {
background-color: #b3b3b3;
font-weight: 700;
}
.org-diff-refine-change {
background-color: #d9d9d9;
}
.org-dired-directory {
color: #00f;
}
.org-dired-flagged {
color: red;
font-weight: 700;
}
.org-dired-header {
color: #228b22;
}
.org-dired-ignored {
color: #7f7f7f;
}
.org-dired-mark {
color: #008b8b;
}
.org-dired-marked {
color: red;
font-weight: 700;
}
.org-dired-perm-write {
color: #b22222;
}
.org-dired-symlink {
color: #a020f0;
}
.org-dired-warning {
color: red;
font-weight: 700;
}
.org-doc {
color: #8b2252;
}
.org-escape-glyph {
color: brown;
}
.org-file-name-shadow {
color: #7f7f7f;
}
.org-flyspell-duplicate {
color: #cdad00;
font-weight: 700;
text-decoration: underline;
}
.org-flyspell-incorrect {
color: #ff4500;
font-weight: 700;
text-decoration: underline;
}
.org-fringe {
background-color: #f2f2f2;
}
.org-function-name {
color: teal;
}
.org-header-line {
color: #333;
background-color: #e5e5e5;
}
.org-help-argument-name {
font-style: italic;
}
.org-highlight {
background-color: #b4eeb4;
}
.org-holiday {
background-color: pink;
}
.org-isearch {
color: #b0e2ff;
background-color: #cd00cd;
}
.org-isearch-fail {
background-color: #ffc1c1;
}
.org-italic {
font-style: italic;
}
.org-keyword {
color: #0086b3;
}
.org-lazy-highlight {
background-color: #afeeee;
}
.org-link {
color: #00f;
text-decoration: underline;
}
.org-link-visited {
color: #8b008b;
text-decoration: underline;
}
.org-log-edit-header {
color: #a020f0;
}
.org-log-edit-summary {
color: #00f;
}
.org-log-edit-unknown-header {
color: #b22222;
}
.org-match {
background-color: #ff0;
}
.org-next-error {
background-color: #eedc82;
}
.org-nobreak-space {
color: brown;
text-decoration: underline;
}
.org-org-archived {
color: #7f7f7f;
}
.org-org-block {
color: #7f7f7f;
}
.org-org-block-begin-line {
color: #b22222;
}
.org-org-block-end-line {
color: #b22222;
}
.org-org-checkbox {
font-weight: 700;
}
.org-org-checkbox-statistics-done {
color: #228b22;
font-weight: 700;
}
.org-org-checkbox-statistics-todo {
color: red;
font-weight: 700;
}
.org-org-clock-overlay {
background-color: #ff0;
}
.org-org-code {
color: #7f7f7f;
}
.org-org-column {
background-color: #e5e5e5;
}
.org-org-column-title {
background-color: #e5e5e5;
font-weight: 700;
text-decoration: underline;
}
.org-org-date {
color: #a020f0;
text-decoration: underline;
}
.org-org-document-info {
color: #191970;
}
.org-org-document-info-keyword {
color: #7f7f7f;
}
.org-org-document-title {
color: #191970;
font-size: 144%;
font-weight: 700;
}
.org-org-done {
color: #228b22;
font-weight: 700;
}
.org-org-drawer {
color: #00f;
}
.org-org-ellipsis {
color: #b8860b;
text-decoration: underline;
}
.org-org-footnote {
color: #a020f0;
text-decoration: underline;
}
.org-org-formula {
color: #b22222;
}
.org-org-headline-done {
color: #bc8f8f;
}
.org-org-hide {
color: #fff;
}
.org-org-latex-and-export-specials {
color: #8b4513;
}
.org-org-level-1 {
color: #00f;
}
.org-org-level-2 {
color: sienna;
}
.org-org-level-3 {
color: #a020f0;
}
.org-org-level-4 {
color: #b22222;
}
.org-org-level-5 {
color: #228b22;
}
.org-org-level-6 {
color: #008b8b;
}
.org-org-level-7 {
color: #7a378b;
}
.org-org-level-8 {
color: #8b2252;
}
.org-org-link {
color: #00f;
text-decoration: underline;
}
.org-org-meta-line {
color: #b22222;
}
.org-org-mode-line-clock {
color: #000;
background-color: #bfbfbf;
}
.org-org-mode-line-clock-overrun {
color: #000;
background-color: red;
}
.org-org-quote {
color: #7f7f7f;
}
.org-org-scheduled {
color: #006400;
}
.org-org-scheduled-previously {
color: #b22222;
}
.org-org-scheduled-today {
color: #006400;
}
.org-org-sexp-date {
color: #a020f0;
}
.org-org-special-keyword {
color: #a020f0;
}
.org-org-table {
color: #00f;
}
.org-org-tag {
font-weight: 700;
}
.org-org-target {
text-decoration: underline;
}
.org-org-time-grid {
color: #b8860b;
}
.org-org-todo {
color: red;
font-weight: 700;
}
.org-org-upcoming-deadline {
color: #b22222;
}
.org-org-verbatim {
color: #7f7f7f;
}
.org-org-verse {
color: #7f7f7f;
}
.org-org-warning {
color: red;
font-weight: 700;
}
.org-outline-1 {
color: #00f;
}
.org-outline-2 {
color: sienna;
}
.org-outline-3 {
color: #a020f0;
}
.org-outline-4 {
color: #b22222;
}
.org-outline-5 {
color: #228b22;
}
.org-outline-6 {
color: #008b8b;
}
.org-outline-7 {
color: #7a378b;
}
.org-outline-8 {
color: #8b2252;
}
.org-preprocessor {
color: #7a378b;
}
.org-query-replace {
color: #b0e2ff;
background-color: #cd00cd;
}
.org-regexp-grouping-backslash {
font-weight: 700;
}
.org-regexp-grouping-construct {
font-weight: 700;
}
.org-region {
background-color: #eedc82;
}
.org-secondary-selection {
background-color: #ff0;
}
.org-shadow {
color: #7f7f7f;
}
.org-show-paren-match {
background-color: #40e0d0;
}
.org-show-paren-mismatch {
color: #fff;
background-color: #a020f0;
}
.org-string {
color: #d14;
}
.org-tool-bar {
color: #000;
background-color: #bfbfbf;
}
.org-tooltip {
color: #000;
background-color: #ffffe0;
}
.org-trailing-whitespace {
background-color: red;
}
.org-type {
color: #228b22;
}
.org-underline {
text-decoration: underline;
}
.org-variable-name {
color: teal;
}
.org-warning {
color: red;
font-weight: 700;
}
.org-widget-button {
font-weight: 700;
}
.org-widget-button-pressed {
color: red;
}
.org-widget-documentation {
color: #006400;
}
.org-widget-field {
background-color: #d9d9d9;
}
.org-widget-inactive {
color: #7f7f7f;
}
.org-widget-single-line-field {
background-color: #d9d9d9;
}
/*# sourceMappingURL=htmlize.min.css.map */

View File

@ -1,74 +0,0 @@
/*
Copyright (C) 2019-2020 Lucien Cartier-Tilet
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
$bg: #eee;
$darkerbg: #ddd;
$textcolor: #444;
html {
background-color: $bg;
}
thead {
tr {
@extend html;
}
}
.tooltiptext {
@extend html;
}
.tooltiptext::after {
border-color: $darkerbg transparent transparent transparent;
}
body {
color: $textcolor;
}
.title {
@extend body;
}
a {
@extend body;
}
th {
border: 1px solid $textcolor;
}
td {
@extend th;
}
pre {
@extend th;
}
table {
border: 2px solid $textcolor;
}
#content {
background-color: $darkerbg;
}
#postamble{
@extend #content;
}

View File

@ -1,240 +0,0 @@
/*
Copyright (C) 2019-2020 Lucien Cartier-Tilet
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic|Roboto+Slab:400,700|Inconsolata:400,700);
@font-face {
font-family: "DoulosSIL";
font-display: swap;
src: url("https://langue.phundrak.com/fonts/DoulosSIL-R.woff");
}
@font-face {
font-family: "Noto Sans Runes";
font-display: swap;
src: url("../fonts/NotoSansRunic-Regular.ttf");
}
@font-face {
font-family: "Helvetica Neue";
font-display: swap;
src: url("../fonts/HelveticaNeue.ttf");
}
body {
font-family: "Noto Sans Runes", "DoulosSIL", "Lato", "proxima-nova", "Helvetica Neue", Arial, sans-serif;
font-weight: normal;
overflow-x: hidden;
font-size: 105%;
height: 100%;
margin: 10px;
}
#postamble {
text-align: center;
margin-bottom: 20px;
}
#content {
max-width: 1100px;
margin: 20px auto;
padding: 20px;
box-shadow: 5px 5px 7px rgba(1, 1, 1, .6);
}
hr {
display: block;
margin-top: 0.5em;
margin-bottom: 0.5em;
margin-left: auto;
margin-right: auto;
border-style: inset;
border-width: 1px;
}
.outline-2 {
margin: 0 2px;
padding: 0 10px;
}
.outline-text-2 {
@extend .outline-2;
margin-bottom: 20px;
}
.outline-4 {
@extend .outline-2;
}
.outline-text-4 {
@extend .outline-text-2;
}
.outline-5 {
@extend .outline-2;
}
.outline-text-5 {
@extend .outline-text-2;
}
.outline-6 {
@extend .outline-2;
}
.outline-text-6 {
@extend .outline-text-2;
}
h1 {
@extend legend;
font-size: 4em;
box-shadow: inset 0 -50px 0 #1abc9c;
}
h2 {
@extend legend;
font-size: 150%;
box-shadow: inset 0 -20px 0 #16a085;
}
h3 {
@extend legend;
font-size: 125%;
box-shadow: inset 0 -16px 0 #27ae60;
}
h4 {
@extend legend;
font-size: 115%;
box-shadow: inset 0 -15px 0 #e67e22;
}
h5 {
@extend legend;
font-size: 110%;
box-shadow: inset 0 -14px 0 #9b59b6;
}
h4,
h5 {
font-weight: 300;
}
p {
text-align: justify;
}
$linkColor: #9b59b6;
a {
text-decoration: none;
box-shadow: inset 0 -3px 0 $linkColor;
transition: all .3s ease-out;
}
a:hover {
box-shadow: inset 0 -21px 0 $linkColor;
transition: all .3s ease-in;
}
a[href^="img/"],
a[href^="img/"]:hover {
box-shadow: 0 0;
}
.figure {
display: block;
overflow-x: auto;
p {
margin: 0 0;
}
}
.largetable {
display: block;
overflow-x: auto;
}
img {
margin: auto;
}
legend {
font-family: "Roboto Slab", "ff-tisa-web-pro", "Georgia", Arial, sans-serif;
font-weight: 700;
display: inline-block;
}
table {
margin: auto;
border-collapse: collapse;
}
th,
td {
padding: 10px;
}
.vertical {
writing-mode: vertical-rl;
text-align: right;
}
pre {
box-shadow: 3px 3px 3px rgba(1, 1, 1, .6);
}
/* scrollbar *****************************************************************/
/* width */
::-webkit-scrollbar {
width: 5px;
height: 5px;
}
/* Track */
::-webkit-scrollbar-track {
border-radius: 10px;
}
/* Handle */
::-webkit-scrollbar-thumb {
background: #7f8c8d;
border-radius: 10px;
}
/* Theme switcher ************************************************************/
.themeBtn {
position: fixed;
bottom: 25px;
right: 25px;
padding-top:10px;
height: 40px;
width: 50px;
border-radius: 25px;
background-color: #1e5b50;
text-align: center;
box-shadow: 3px 3px 6px rgba(1, 1, 1, .6);
cursor: pointer;
.fas {
font-size: 30px;
}
}

View File

@ -1,68 +0,0 @@
/*
Copyright (C) 2019-2020 Lucien Cartier-Tilet
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
.tooltip {
position: relative;
display: inline-block;
border-bottom: 1px dotted #1e5b50;
.tooltiptext {
visibility: hidden;
width: 120px;
text-align: center;
padding: 5px 0;
border-radius: 6px;
/* position the tooltip text */
position: absolute;
z-index: 1;
bottom: 125;
left: 50%;
margin-left: -60%;
/* Fade in tooltip */
opacity: 0;
transition: opacity 0.3s;
}
.tooltiptext::after {
content: "";
top: 100%;
margin-left: -5%;
border-width: 5px;
border-style: solid;
transition: opacity 0.2s;
}
}
.tooltip:hover {
.tooltiptext {
visibility: visible;
opacity: 1;
}
}
.tooltiptext {
padding: 7px !important;
}
.largetable {
$tablepadding: 40px;
padding-top: $tablepadding !important;
padding-bottom: $tablepadding !important;
}

View File

@ -1,11 +0,0 @@
@JS()
library cookie;
import 'package:js/js.dart';
@JS()
class Cookies {
// external factory Cookie();
external static String get(String name);
external static void set(String name, String value);
}

View File

@ -1,66 +1,5 @@
@JS()
library main;
import 'dart:html';
import 'package:js/js.dart';
import './cookie.dart';
import './reorganize_html.dart' show reorganizeHtml;
void main() {
reorganizeHtml();
createThemeSwitcher();
themeSwitch(isThemeDark());
querySelector('.themeBtn').onClick.listen(themeSwitchMouse);
}
String cookieThemeName = 'theme';
void createThemeSwitcher() {
// set the correct CSS depending on the cookie, dark is enabled by default
var isDark = isThemeDark();
// Set the correct symbol in the theme switcher button
querySelector('body').append(DivElement()..className = 'themeBtn');
querySelector('.themeBtn')
.children
.add(Element.tag('i')..className = 'fas fa-' + (isDark ? 'sun' : 'moon'));
}
bool isThemeDark() {
if (Cookies.get(cookieThemeName) == 'light') {
return false;
}
Cookies.set(cookieThemeName, 'dark');
return true;
}
void reorganizeHtml() {
// Add a <hr> element after the content div
querySelector('#content').appendHtml('<hr>');
// Move the postamble in the content div
querySelector('#content').append(querySelector('#postamble'));
for (var table in querySelectorAll('table')) {
var largetable = DivElement();
largetable.className = 'largetable';
table.before(largetable);
largetable.children.add(table);
}
}
bool setTheme(bool dark) {
Cookies.set(cookieThemeName, (dark ? 'dark' : 'light'));
return !dark;
}
void themeSwitch(bool isDark) {
querySelector('.fas').className = 'fas fa-' + (isDark ? 'sun' : 'moon');
querySelector('#theme').attributes['href'] =
'https://langue.phundrak.com/css/' + (isDark ? 'dark' : 'light') + '.css';
}
void themeSwitchMouse(MouseEvent event) {
bool isDark = setTheme(!isThemeDark());
themeSwitch(isDark);
}

View File

@ -0,0 +1,38 @@
import 'dart:html' show HttpRequest;
import 'package:html/parser.dart' show parse;
// Get the sitemap content
Future<String> getSitemap() async {
const path = 'sitemap.html';
try {
return await HttpRequest.getString(path);
} catch (e) {
print('Couldnt open $path');
}
return 'Error';
}
// This function returns a Map which contains all links to languages detected
// from the sitemap.
Future<Map<String, String>> parseSitemap() async {
var links = <String, String>{};
await getSitemap().then((String content) {
final sitemap = parse(content).getElementsByClassName('org-ul')[0].children;
for (var elem in sitemap) {
// TODO: make this recursive so prefixes in nested folders can be added to
// each other
if (elem.innerHtml.startsWith('<a')) {
elem = elem.firstChild;
final text = elem.firstChild.text;
final url = elem.attributes['href'];
if (!url.contains('index')) {
links[url] = text;
}
} else {
print('Sitemap folder:\n${elem.innerHtml}');
}
}
});
return links;
}

View File

@ -0,0 +1,174 @@
import 'dart:html';
import './parse_sitemap.dart' show parseSitemap;
// Returns the title of the current webpage
String getPageTitle() {
return querySelector('title').text;
}
class Navbar {
Navbar() {
navbar = Element.ul()..classes.add('navbar-nav');
}
// Inserts the element in a <li class='nav-item'></li>
void addElement(final Element elem, [List<String> classes, String id]) {
var wrapper = Element.li()
..classes.add('nav-item')
..append(elem);
if (classes != null) {
for (var c in classes) {
wrapper.classes.add(c);
}
}
if (id != null) () => wrapper.attributes['id'] = id;
navbar.append(wrapper);
}
Future<Element> makeNavbar() async {
addElement(Element.a()
..attributes['href']
..innerText = 'Accueil');
}
Future<void> addLanguages() async {
var languages = Element.ul()..classes.add('dropdown');
await parseSitemap().then((final sitemap) => {
sitemap.forEach((url, name) {
final link = Element.a()
..attributes['href'] = url
..innerText = name;
final linkLi = Element.li()
..classes.add('dropdown-item')
..insertAdjacentElement('afterBegin', link);
languages.insertAdjacentElement('beforeEnd', linkLi);
})
});
final langLink = Element.a()
..attributes['href'] = '#'
..innerText = 'Langues';
addElement(langLink, ['has-dropdown'], 'langList');
querySelector('#langList').insertAdjacentElement('beforeEnd', languages);
}
Element navbar;
}
Future<Element> addLanguages(Element navbar) async {
// Languages
var languages = Element.ul()..classes.add('dropdown');
await parseSitemap().then((final sitemap) => {
sitemap.forEach((url, name) {
final link = Element.a()
..attributes['href'] = url
..innerText = name;
final linkLi = Element.li()
..classes.add('dropdown-item')
..insertAdjacentElement('afterBegin', link);
languages.insertAdjacentElement('beforeEnd', linkLi);
})
});
navbar.append(Element.li()
..append(Element.a()
..attributes['href'] = '#'
..innerText = 'Langues')
..classes.add('nav-item')
..classes.add('has-dropdown')
..insertAdjacentElement('beforeEnd', languages));
return navbar;
}
// Add a navbar atop of the HTML body, containing two buttons:
// - One back to home
// - A dropdown to each language detected in the sitemap
Future<Element> makeNavbar() async {
var _navbar = Navbar();
// Home
var navbar_content = Element.ul()..classes.add('navbar-nav');
navbar_content.append(Element.li()
..classes.add('nav-item')
..insertAdjacentElement(
'afterBegin',
Element.a()
..attributes['href'] = '/'
..innerText = 'Accueil'));
// Add languages
// navbar_content.append(Element.html('''
// '''));
navbar_content = await addLanguages(navbar_content);
// Page title
navbar_content.append(Element.li()
..classes.add('nav-item')
..innerText = getPageTitle());
// Share icon
// Add dropdown for sharing on multiple platforms
navbar_content = addIcon(navbar_content, ['fas', 'fa-share-alt'], 'shareBtn');
// Theme changer
// Add dropdown for theming
// navbar_content = addIcon(navbar_content, ['fas', 'fa-sun'], 'themeBtn');
navbar_content.append(Element.html('''
<li class="nav-item has-dropdown">
<a href="#"><i class="fas fa-sun" id="themeBtn"></i></a>
<ul class="dropdown" id="theme-dropdown">
<li class="dropdown-item"><i class="fas fa-sun"></i> Clair</li>
<li class="dropdown-item"><i class="fas fa-moon"></i> Sombre</li>
</ul>
</li>'''));
// Navbar content added to navbar
final navbar = Element.nav()
..classes.add('navbar')
..append(navbar_content);
return navbar;
}
Element addIcon(Element navbar, List<String> classes, String id) {
var elem = Element.tag('i')..attributes['id'] = id;
for (var c in classes) {
elem.classes.add(c);
}
navbar.append(Element.li()..append(elem));
return navbar;
}
Future<void> wrapTables() async {
for (var table in querySelectorAll('table')) {
var largetable = DivElement()..className = 'largetable';
table.before(largetable);
largetable.children.add(table);
}
}
Future<void> makeHeader() async {
querySelector('body')
.insertAdjacentElement('afterBegin', Element.tag('header'));
querySelector('header').append(querySelector('h1'));
querySelector('header').append(querySelector('.subtitle'));
}
Future<void> reorganizeHtml() async {
await makeHeader();
await wrapTables();
await makeNavbar().then((navbar) {
querySelector('body').insertAdjacentElement('afterBegin', navbar);
});
querySelector('body')
..classes.add('light')
// Add a <hr> element after the content div
..appendHtml('<hr>')
// Move the postamble in the content div
..append(querySelector('#postamble'));
}

View File

@ -30,15 +30,11 @@
#+HTML_HEAD_EXTRA: <meta name="twitter:card" content="summary" />
#+HTML_HEAD_EXTRA: <meta name="twitter:site" content="@phundrak" />
#+HTML_HEAD_EXTRA: <meta name="twitter:creator" content="@phundrak" />
#+HTML_HEAD_EXTRA: <link rel="stylesheet" href="./css/main.css"/>
#+HTML_HEAD_EXTRA: <link rel="stylesheet" href="./css/htmlize.min.css"/>
#+HTML_HEAD_EXTRA: <link rel="stylesheet" id="theme" href="./css/dark.css"/>
#+HTML_HEAD_EXTRA: <link rel="stylesheet" href="./style/style.css"/>
#+HTML_HEAD_EXTRA: <link rel="shortcut icon" href="https://cdn.phundrak.com/img/mahakala-128x128.png" type="img/png" media="screen" />
#+HTML_HEAD_EXTRA: <link rel="shortcut icon" href="https://cdn.phundrak.com/img/favicon.ico" type="image/x-icon" media="screen" />
#+HTML_HEAD_EXTRA: <script defer src="https://cdn.jsdelivr.net/npm/js-cookie@2/src/js.cookie.min.js"></script>
#+HTML_HEAD_EXTRA: <script defer src="dart/main.dart.js"></script>
#+HTML_HEAD_EXTRA: <script defer src="https://kit.fontawesome.com/4d42d0c8c5.js"></script>
#+INFOJS_OPT: view:info home:https://langue.phundrak.com toc:t
# ### MACROS ###################################################################
#+MACRO: newline @@latex:\hspace{0pt}\\@@ @@html:<br>@@

View File

@ -1,6 +1,5 @@
# -*- org-confirm-babel-evaluate: nil -*-
#+TITLE: Langues construites de Pundrak
#+INFOJS_OPT: view:showall toc:1
#+HTML_HEAD: <meta name="description" content="Collection de documents et pages webs de linguistique et de langues construites de Pundrak" />
#+HTML_HEAD: <meta property="og:title" content="Langues construites de Pundrak" />
#+HTML_HEAD: <meta property="og:description" content="Collection de documents et pages webs de linguistique et de langues construites de Pundrak" />

2
web/style/style.css Normal file
View File

@ -0,0 +1,2 @@
@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic|Roboto+Slab:400,700|Inconsolata:400,700);@font-face{font-family:"DoulosSIL";font-display:swap;src:url("https://langue.phundrak.com/fonts/DoulosSIL-R.woff")}@font-face{font-family:"Noto Sans Runes";font-display:swap;src:url("../fonts/NotoSansRunic-Regular.ttf")}@font-face{font-family:"Helvetica Neue";font-display:swap;src:url("../fonts/HelveticaNeue.ttf")}body{margin:0;padding:0;font-family:"Noto Sans Runes", "DoulosSIL", "Lato", "proxima-nova", "Helvetica Neue", Arial, sans-serif}ul{list-style-type:none;margin:0;padding:0}a{color:currentColor;text-decoration:none}.navbar{height:70px;width:100%;background:black;color:white}.navbar-nav{display:flex;align-items:center;justify-content:space-evenly;height:100%}header{padding:1em;background:red;margin-bottom:1em;padding-bottom:3.5em;text-align:center;clip-path:polygon(50% 0%, 100% 0, 100% 65%, 50% 100%, 0 65%, 0 0)}.dropdown{position:absolute;width:500px;opacity:0;z-index:2;background:blue;border-top:2px solid white;border-bottom-right-radius:8px;border-bottom-left-radius:8px;display:flex;align-items:center;justify-content:space-around;height:3rem;margin-top:2rem;padding:0.5rem;box-shadow:rgba(2,8,20,0.1) 0px 0.175em 0.5em;transform:translateX(-40%);transition:opacity .15s ease-out}#theme-dropdown{width:300px;transform:translateX(-60%)}.has-dropdown:focus-within .dropdown{opacity:1;pointer-events:auto}.dropdown-item a{width:100%;height:100%;size:0.7rem;padding-left:10px;font-weight:bold}
/*# sourceMappingURL=style.css.map */

120
web/style/style.scss Normal file
View File

@ -0,0 +1,120 @@
@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic|Roboto+Slab:400,700|Inconsolata:400,700);
@font-face {
font-family: "DoulosSIL";
font-display: swap;
src: url("https://langue.phundrak.com/fonts/DoulosSIL-R.woff");
}
@font-face {
font-family: "Noto Sans Runes";
font-display: swap;
src: url("../fonts/NotoSansRunic-Regular.ttf");
}
@font-face {
font-family: "Helvetica Neue";
font-display: swap;
src: url("../fonts/HelveticaNeue.ttf");
}
/* Colors ********************************************************************/
$dark: rgba(52, 73, 94, 1);
$accent1: rgba(66, 191, 221, 1);
$accent2: rgba(92, 172, 126, 1);
$accent3: rgba(197, 193, 155, 1);
$light: rgba(250, 250, 255, 1);
$gradient-top: linear-gradient(0deg, $dark, $accent1, $accent2, $accent3, $light);
$gradient-right: linear-gradient(90deg, $dark, $accent1, $accent2, $accent3, $light);
$gradient-bottom: linear-gradient(180deg, $dark, $accent1, $accent2, $accent3, $light);
$gradient-left: linear-gradient(270deg, $dark, $accent1, $accent2, $accent3, $light);
$gradient-top-right: linear-gradient(45deg, $dark, $accent1, $accent2, $accent3, $light);
$gradient-bottom-right: linear-gradient(135deg, $dark, $accent1, $accent2, $accent3, $light);
$gradient-top-left: linear-gradient(225deg, $dark, $accent1, $accent2, $accent3, $light);
$gradient-bottom-left: linear-gradient(315deg, $dark, $accent1, $accent2, $accent3, $light);
$gradient-radial: radial-gradient( $dark, $accent1, $accent2, $accent3, $light);
body {
margin: 0;
padding: 0;
font-family: "Noto Sans Runes", "DoulosSIL", "Lato", "proxima-nova", "Helvetica Neue", Arial, sans-serif;
}
ul {
list-style-type: none;
margin: 0;
padding: 0;
}
a {
color: currentColor;
text-decoration: none;
}
.navbar {
height: 70px;
width: 100%;
background: black;
color: white;
}
.navbar-nav {
display: flex;
align-items: center;
justify-content: space-evenly;
height: 100%;
}
header {
padding: 1em;
background: red;
margin-bottom: 1em;
padding-bottom: 3.5em;
text-align: center;
clip-path: polygon(50% 0%, 100% 0, 100% 65%, 50% 100%, 0 65%, 0 0);
}
.dropdown {
position: absolute;
width: 500px;
opacity: 0;
z-index: 2;
background: blue;
border-top: 2px solid white;
border-bottom-right-radius: 8px;
border-bottom-left-radius: 8px;
display: flex;
align-items: center;
justify-content: space-around;
height: 3rem;
margin-top: 2rem;
padding: 0.5rem;
box-shadow: rgba(2, 8, 20, 0.1) 0px 0.175em 0.5em;
transform: translateX(-40%);
transition: opacity .15s ease-out;
}
#theme-dropdown {
width: 300px;
transform: translateX(-60%);
}
.has-dropdown {
&:focus-within {
.dropdown {
opacity: 1;
pointer-events: auto;
}
}
}
.dropdown-item {
a {
width: 100%;
height: 100%;
size: 0.7rem;
padding-left: 10px;
font-weight: bold;
}
}