Compare commits

...

43 Commits

Author SHA1 Message Date
Jez Cope cc479378ef flake: add simple-http-server to shell 2023-07-10 19:33:36 +01:00
Jez Cope bc09db66b2 flake: tidying 2023-07-10 19:33:22 +01:00
Jez Cope 6db97a1957 server: add redirect for old blog post urls 2023-07-10 19:32:57 +01:00
Jez Cope f7dc0749fb Note: Twitter archive 2023-07-10 19:32:20 +01:00
Jez Cope f9f1939aaf Add twitter archive 2023-07-10 17:20:58 +01:00
Jez Cope 1ef9e9ba70 update openpgp key 2023-07-10 09:19:18 +01:00
Jez Cope ed2604b466 Update mastodon; remove twitter 2022-12-15 15:30:43 +00:00
Jez Cope 89911b0c74 Update robots.txt 2022-07-20 17:14:57 +01:00
Jez Cope e0c3e8fe82 Tweaks to projects list 2022-07-20 17:14:23 +01:00
Jez Cope 8e032fb89d Fix erambler package reference in server.nix 2021-09-27 21:32:59 +01:00
Jez Cope 193cbf8f30 Correct import of server.nix 2021-09-27 21:31:43 +01:00
Jez Cope 769a815104 Replace missing nixosModule flake output 2021-09-27 21:29:03 +01:00
Jez Cope 40419cf801 Switch back to using nix-built content root 2021-09-27 21:26:39 +01:00
Jez Cope 8ef51cb9de Update font css filenames in main.sass 2021-09-27 21:20:56 +01:00
Jez Cope 72dc0ac56a Remove talks page from navigation 2021-09-27 21:20:31 +01:00
Jez Cope 5830d2c6e2 Teach nix to build fonts instead of keeping them in-tree 2021-09-27 21:12:30 +01:00
Jez Cope 1dba4581e8 Hide tags if there are none 2021-09-27 19:27:36 +01:00
Jez Cope ff711a80e4 New page: projects 2021-09-26 20:19:07 +01:00
Jez Cope 6169653e0a Minor stylesheet tweaks and improvements 2021-09-26 20:18:57 +01:00
Jez Cope e5ca41b07e Make cactus comment text render correctly 2021-09-24 17:06:08 +01:00
Jez Cope 2d8fadb968 Switch back to static web root for nginx config 2021-09-24 09:31:09 +01:00
Jez Cope e075969731 Fix cactus comments formatting 2021-09-24 09:28:32 +01:00
Jez Cope 6d5821d60e Fix `#+tags[]:` metadata 2021-09-23 20:31:59 +01:00
Jez Cope 04faa08a1b Change post slug 2021-09-23 20:30:51 +01:00
Jez Cope fc93b217b3 Post: missing narratives (update #1) 2021-09-23 20:26:50 +01:00
Jez Cope 0f2716d4a6 Post: missing narratives 2021-09-23 20:12:54 +01:00
Jez Cope d939b0b276 Fix src location for nix build 2021-09-11 21:58:30 +01:00
Jez Cope f98bd316d4 Pass self to server.nix 2021-09-11 21:54:19 +01:00
Jez Cope a250b03255 Fix passing of self argument to server.nix 2021-09-11 21:49:56 +01:00
Jez Cope f11d7a5970 Refactor flake.nix parts into separate files 2021-09-11 21:46:46 +01:00
Jez Cope ac2d5e789c Include .well-known in nix build 2021-09-11 16:26:29 +01:00
Jez Cope 4bbf073ae5 Use defaultPackage as ngnix document root 2021-09-10 21:51:08 +01:00
Jez Cope 434e9c84c9 Add ... arg to nixosModule 2021-09-10 21:34:20 +01:00
Jez Cope ff7c015d70 Add config argument to nixosModule 2021-09-10 21:31:28 +01:00
Jez Cope c5e84d6387 Add server config to flake.nix 2021-09-10 21:25:46 +01:00
Jez Cope a7be6d1b37 Teach flake.nix to build website 2021-09-10 21:18:27 +01:00
Jez Cope 1ef1c82b87 Remove yaspin dependency 2021-09-10 19:17:59 +01:00
Jez Cope 972b9ef6be Add .hgignore 2021-09-04 21:26:12 +01:00
Jez Cope b5bf256c9b Remove netlify badge 2021-09-04 21:22:01 +01:00
Jez Cope ab7f933714 Update tasks.py to deploy via rsync 2021-09-04 21:19:05 +01:00
Jez Cope f71bb12247 Upgrade bulma to 0.9.3 2021-09-04 14:55:53 +01:00
Jez Cope dc5ffba014 Update PGP key under .well-known 2021-09-04 14:53:58 +01:00
Jez Cope 8995ecbb1f Add theme with only required fonts 2021-09-04 14:48:53 +01:00
141 changed files with 32669 additions and 126 deletions

1
.gitignore vendored
View File

@ -6,7 +6,6 @@ output.diff
.doit.db
state_data.json
.ropeproject
node_modules
/drafts/
deploy.yaml
/resources/

14
.hgignore Normal file
View File

@ -0,0 +1,14 @@
public
tmp
.output
output.diff
.cache
.doit.db
state_data.json
.ropeproject
drafts
deploy.yaml
resources
.direnv
.envrc
result

View File

@ -31,21 +31,15 @@ params:
pingback: https://webmention.io/erambler.co.uk/xmlrpc
cactus: erambler.co.uk
netlify:
name: erambler
id: 0599621e-c4b4-4341-8e42-6f8b9c1d33cc
social:
- kind: keyoxide
info: 'D9DA3E47E8BD377DA317B3D09E42CE071C4559D1'
- kind: keybase
info: 'jezcope'
- kind: mastodon
info: ['petrichor', 'scholar.social']
info: ['petrichor', 'digipres.club']
- kind: matrix
info: '@jez:petrichor.me'
- kind: twitter
info: 'jezcope'
- kind: github
info: 'jezcope'
- kind: gitlab

View File

@ -0,0 +1,36 @@
#+title: Request for input: the missing narrative of libraries in research software engineering
#+date: <2021-09-23 Thu>
#+tags[]: RSE Librarianship
#+slug: missing-narrative-libraries-rse
Last week I received an email from a friend inviting me to submit a video to a panel [[https://septembrse.github.io/#/event/L1001]['Missing narratives around diversity and inclusion in Research Software Engineering' hosted as part of SeptembRSE 2021]], the goals of which are:
1) help create inclusive communities in RSE by centring on intersectional voices
2) increase awareness of power imbalances that negatively impact multiple marginalised groups in research
3) provide a call-to-action for diversity and inclusion
# #+begin_quote
# I am writing to invite your contribution to a panel [[https://septembrse.github.io/#/event/L1001]['Missing narratives around diversity and inclusion in Research Software Engineering' hosted as part of SeptembRSE 2021]]. I would like to request you to make an audio/video submission (3-5 minutes) covering: (1) A brief introduction to who you are, (2) what missing narrative you want to highlight, and (3) some thoughts on what you, and others, might be able to do to make that happen.
# […]
# *Goal:* This panel aims to facilitate discussions to (1) help create inclusive communities in RSE by centring on intersectional voices, (2) increase awareness of power imbalances that negatively impact multiple marginalised groups in research, and (3) provide a call-to-action for diversity and inclusion. We will bring together experts who lead different efforts for improving diversity, equity and inclusion in academia, for example, training, recruitment, policy, data-led research, activism and so on.
# #+end_quote
/Obviously/ I'm always flattered to be asked my opinion, but I wasn't sure what a straight, cisgender, middle-class white man could offer to an event on diversity, so I had a chat with one of the organisers. We agreed that issues of race, gender, sexuality, disability and many more would be well covered by other speakers, and that I would focus on another narrative also frequently missing in discussions of Research Software Engineering (RSE): *librarians*.
Librarians are a diverse bunch, but we generally have some or more of the following skills, highly valuable to RSE: information management, metadata, digital preservation, teaching/training, communicating across disciplinary boundaries.
Now, I have my own views on this, but this is *not my narrative alone*, so I would be very grateful for your perspective, dear reader.
Some things that I've thought of so far:
- Librarianship is still perceived as a feminine profession, with all the expectations of quiet uncomplaining service that go along with that; this was neatly captured by the wonderful [[https://twitter.com/Fobettarh][Fobazi Ettarh (@Fobettarh)]] in the concept of [[https://fobaziettarh.com/2017/05/30/vocational-awe/][Vocational Awe]] (see also [[http://www.inthelibrarywiththeleadpipe.org/2018/vocational-awe/][Vocational Awe and Librarianship: The Lies We Tell Ourselves In the Library with the Lead Pipe]])
- Because of that, we're often used only to provide transactional services, but that makes very limited use of our professional knowledge and experience: we're much more effective as collaborators
- Librarianship itself is subject to many of the privileges and oppressions you might expect: while more gender-balanced (for example) than many professions, there are way too few librarians of colour, and it gets maler and whiter the closer you get to senior leadership
- Some university libraries have gone down the route of employing RSEs themselves. I know that St Andrews did at one point but I'm not sure if that's still the case
- The British Library certainly /does/ employ RSEs, as well as collaborating with RSEs in the [[https://www.turing.ac.uk/][Alan Turing Institute]], for projects like [[https://livingwithmachines.ac.uk/][Living With Machines]] (though we're hardly typical in having active research projects within the Library compared with most academic libraries)
- Some (many) dedicated RSE groups are actually really good at collaborating with library colleagues: I was always treated as a peer and collaborator by the RSE team at Sheffield, for example
*Please let me know what other perspectives on this I'm missing*, I don't want this to just be based on my own biased view. You can chime in via the usual methods: the comments below, via [[https://twitter.com/jezcope][Twitter]] or [[https://scholar.social/@petrichor][Mastodon]], via [[https://matrix.to/#/@jez:petrichor.me][Matrix]] or by email if you know it. I'll put the video somewhere public when it's done, and try to credit anyone who contributes either in the video or in a followup post.

View File

@ -0,0 +1,21 @@
---
title: Twitter archive
slug: twitter-archive
date: 2023-07-10T19:02:14+01:00
type: note
tags:
- Social Media
- Twitter
---
Just a quick note to say
that since I've deleted my Twitter account,
I've set up a [static archive of all my tweets](/twitter-archive/).
Yes, even those embarrassing first ones.
This was made possible by Darius Kazemi:
<https://tinysubversions.com/twitter-archive/make-your-own/>
You can still
[find me on Mastodon as @petrichor:digipres.club](https://digipres.club/@petrichor)
or via any of the other links at the bottom of the page.

100
content/projects.org Normal file
View File

@ -0,0 +1,100 @@
#+title: Projects
#+linktitle: projects
#+menu: main
#+type: page
I'm trying to move away from relying on any one [[https://en.wikipedia.org/wiki/Forge_(software)][forge]] (e.g. GitHub, GitLab, etc.) for project hosting, so here's a rundown of some of the little open source projects I have scattered around the web right now.
Some of them have their own issue trackers --- feel free to tell me about bugs or make pull requests there --- but you can also send me bugs, comments or patches at [[mailto:projects@erambler.co.uk][projects@erambler.co.uk]].
------------------------------------------------------------------------------
* Active
:PROPERTIES:
:ID: ae2de630-b353-4fa3-8139-a6cbb2709442
:END:
Projects that can be considered current: I may or may not have made any significant changes to them recently, but I certainly use them and I would love it if you did too!
** mxadm
A simple CLI interface to basic Matrix room admin tasks.
+ Source: [[https://tildegit.org/petrichor/mxadm]]
+ Rust crate: [[https://lib.rs/crates/mxadm][mxadm on lib.rs]]; [[https://crates.io/crates/mxadm][mxadm on crates.io]]
** Template iPython magics 🎩
This package provides simple IPython magics to render cells as templates in a variety of different templating languages. It currently supports [[https://www.makotemplates.org/][Mako]] and [[https://jinja.palletsprojects.com/][Jinja2]].
- Source: [[https://gitlab.com/jezcope/template-ipython-magic]]
- Python package: [[https://pypi.org/project/template-ipython-magic/][template-ipython-magic on PyPI]]
** remarkable-scripts
A small collection of useful scripts for users of [[https://remarkable.com/][reMarkable paper tablets]].
- Source: [[https://tildegit.org/petrichor/remarkable-scripts]]
# ** theme-bl-remark
------------------------------------------------------------------------------
* Dormant or nascent
Projects that I've started and done some work on, often to the point of a working prototype, or that are just ideas so far, and that I intend to develop further at some point.
** pyrefine
Execute OpenRefine JSON scripts without OpenRefine (or Java).
- Source: [[https://github.com/jezcope/pyrefine]]
** csvy-python
Read CSVY (https://csvy.org/) data packages from Python.
- Source: [[https://github.com/jezcope/csvy-python]]
** nix-gently
------------------------------------------------------------------------------
* Experiments & toys
Things that were done to try something out, or to do a very simple job that I no longer need.
- doi2oa
- altmedals2012
- runkeeper-data
- Shipton Mill queue checker
------------------------------------------------------------------------------
* Educational examples
Things that simply exist to demonstrate for others how a thing can be done.
- binder-nix-flakes :: Demo of using the [[https://nixos.wiki/wiki/Flakes]["flakes"]] feature of [[https://nixos.org/][NixOS and it's cross-platform package manager, nix]], to specify the dependencies for a [[https://mybinder.org/][Binder]] of Jupyter notebooks. [[https://tildegit.org/petrichor/binder-nix-flakes]]
- zenodo-example-py :: Demo of accessing the [[https://developers.zenodo.org/][Zenodo REST API]] from Python to fetch records. [[https://gitlab.com/jezcope/zenodo-example-py]]
------------------------------------------------------------------------------
* Abandoned
Stuff that I started and used for a while, but which no longer serve any purpose for me. Feel free to learn from these or [[https://en.wikipedia.org/wiki/Fork_(software_development)][fork]] them as the basis for something of your own
- sagadoc :: A really simple tool to generate documents from data, code and templates. Heavily inspired by [[https://orgmode.org/][Org mode for Emacs]]. I mostly use org-mode or [[https://jupyter.org/][Jupyter Notebooks]] for this these days. [[https://github.com/jezcope/sagadoc]]
- dropbox-conflicts-el :: An [[https://www.gnu.org/software/emacs/][emacs]] package to detect conflicted copies of files in your Dropbox on open. [[https://github.com/jezcope/dropbox-conflicts-el]]
# - beamer-uob
# - theme-sidmouth-nikola
# - theme-sidmouth-hugo
# - Org.tmbundle
# - nikola-series
# - chrome-scroll-back
# - sakaiws-ruby
# - OmniSync
# - minty

View File

@ -4,10 +4,10 @@ date: 2020-10-21 14:00:04 UTC+01:00
slug: talks
type: text
data: data/talks.yaml
menu:
main:
name: talks
weight: 50
# menu:
# main:
# name: talks
# weight: 50
---
Here is a selection of talks that I've given.

View File

@ -2,11 +2,11 @@
"nodes": {
"flake-utils": {
"locked": {
"lastModified": 1623875721,
"narHash": "sha256-A8BU7bjS5GirpAUv4QA+QnJ4CceLHkcXdRp4xITDB0s=",
"lastModified": 1631561581,
"narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "f7e004a55b120c02ecb6219596820fcd32ca8772",
"rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19",
"type": "github"
},
"original": {
@ -17,11 +17,11 @@
},
"nixpkgs": {
"locked": {
"lastModified": 1624992828,
"narHash": "sha256-whhfrjqOa1BUQAQu4J0QSRUG+iZbTeJpnsl52kLPBfc=",
"lastModified": 1632768365,
"narHash": "sha256-dewSDOFvHS9mGXBOB8E4nciQ2QavKpsNRXMSnCKJOxE=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "520da1d00f26d2f4d31eb3cd3c5dc8b3a1e998c6",
"rev": "75b5e5ee2642c28687592c24420d2085c1238f4c",
"type": "github"
},
"original": {
@ -33,7 +33,20 @@
"root": {
"inputs": {
"flake-utils": "flake-utils",
"nixpkgs": "nixpkgs"
"nixpkgs": "nixpkgs",
"twitter-archive": "twitter-archive"
}
},
"twitter-archive": {
"flake": false,
"locked": {
"narHash": "sha256-XOaTvEWedFtofiTODpzzXyq60NZ8DsS4Tp2bLijIELE=",
"type": "tarball",
"url": "https://codeberg.org/api/v1/repos/jezcope/twitter-archive/archive/main.tar.gz"
},
"original": {
"type": "tarball",
"url": "https://codeberg.org/api/v1/repos/jezcope/twitter-archive/archive/main.tar.gz"
}
}
},

View File

@ -1,15 +1,49 @@
{
description = "A very basic flake";
description = "Content and server config for erambler.co.uk";
inputs.nixpkgs.url = "github:NixOS/nixpkgs";
inputs.flake-utils.url = "github:numtide/flake-utils";
inputs.twitter-archive = {
url =
"https://codeberg.org/api/v1/repos/jezcope/twitter-archive/archive/main.tar.gz";
flake = false;
};
outputs = { self, nixpkgs, flake-utils }:
flake-utils.lib.eachDefaultSystem
(system:
let pkgs = nixpkgs.legacyPackages.${system}; in
{
devShell = import ./shell.nix { inherit pkgs; };
}
);
outputs = { self, nixpkgs, flake-utils, twitter-archive }:
{
overlay = self: super:
let
pkgs = nixpkgs.legacyPackages.${super.system};
buildIosevka = pkgs.callPackage ./nix/iosevka.nix;
in rec {
iosevka = buildIosevka { set = "mnemosyne"; };
iosevka-aile = buildIosevka { set = "aile-mnemosyne"; };
iosevka-etoile = buildIosevka { set = "etoile-mnemosyne"; };
fonts = pkgs.symlinkJoin {
name = "mnemosyne-fonts";
paths = [ iosevka iosevka-aile iosevka-etoile ];
};
erambler =
pkgs.callPackage ./nix/build.nix { inherit fonts twitter-archive; };
inherit twitter-archive;
};
nixosModule = import ./nix/server.nix { inherit self; };
} // flake-utils.lib.eachDefaultSystem (system:
let
pkgs = import nixpkgs {
inherit system;
overlays = [ self.overlay ];
};
in {
packages = {
inherit (pkgs) erambler iosevka iosevka-aile iosevka-etoile fonts;
default = pkgs.erambler;
};
devShell = pkgs.callPackage ./nix/shell.nix { };
});
}

16
nix/build.nix Normal file
View File

@ -0,0 +1,16 @@
{ pkgs, fonts, lndir, twitter-archive, ... }:
with pkgs;
stdenv.mkDerivation {
name = "erambler-html";
src = ../.;
nativeBuildInputs = [ hugo fonts twitter-archive ];
buildPhase = "hugo";
installPhase = ''
mkdir $out
cp -R public/* public/.well-known "$out"
mkdir -p "$out/font"
${lndir}/bin/lndir -silent ${fonts} "$out/font"
ln -s ${twitter-archive} "$out/twitter-archive"
'';
}

89
nix/iosevka.nix Normal file
View File

@ -0,0 +1,89 @@
{ stdenv, lib, nodejs, nodePackages, remarshal, ttfautohint-nox
, privateBuildPlan ? builtins.readFile ./private-build-plans.toml
, extraParameters ? null, set ? null }:
assert (privateBuildPlan != null) -> set != null;
assert (extraParameters != null) -> set != null;
let
# We don't know the attribute name for the Iosevka package as it
# changes not when our update script is run (which in turn updates
# node-packages.json, but when node-packages/generate.sh is run
# (which updates node-packages.nix).
#
# Doing it this way ensures that the package can always be built,
# although possibly an older version than ioseva-bin.
nodeIosevka =
(lib.findSingle (drv: drv ? packageName && drv.packageName == "iosevka")
(throw "no 'iosevka' package found in nodePackages")
(throw "multiple 'iosevka' packages found in nodePackages")
(lib.attrValues nodePackages)).override (drv: { dontNpmInstall = true; });
in stdenv.mkDerivation rec {
pname = if set != null then "iosevka-${set}" else "iosevka";
inherit (nodeIosevka) version src;
nativeBuildInputs = [ nodejs nodeIosevka remarshal ttfautohint-nox ];
buildPlan = if builtins.isAttrs privateBuildPlan then
builtins.toJSON { buildPlans.${pname} = privateBuildPlan; }
else
privateBuildPlan;
inherit extraParameters;
passAsFile = [ "buildPlan" "extraParameters" ];
configurePhase = ''
runHook preConfigure
${lib.optionalString (builtins.isAttrs privateBuildPlan) ''
remarshal -i "$buildPlanPath" -o private-build-plans.toml -if json -of toml
''}
${lib.optionalString (builtins.isString privateBuildPlan) ''
cp "$buildPlanPath" private-build-plans.toml
''}
${lib.optionalString (extraParameters != null) ''
echo -e "\n" >> params/parameters.toml
cat "$extraParametersPath" >> params/parameters.toml
''}
ln -s ${nodeIosevka}/lib/node_modules/iosevka/node_modules .
runHook postConfigure
'';
buildPhase = ''
runHook preBuild
npm run build --no-update-notifier -- --jCmd=$NIX_BUILD_CORES contents::$pname >/dev/null
runHook postBuild
'';
installPhase = ''
runHook preInstall
install -d "$out/ttf"
install -d "$out/woff2"
install "dist/$pname/ttf"/* "$out/ttf"
install "dist/$pname/woff2"/* "$out/woff2"
install "dist/$pname/$pname.css" "$out"
runHook postInstall
'';
enableParallelBuilding = true;
passthru = { updateScript = ./update-default.sh; };
meta = with lib; {
homepage = "https://be5invis.github.io/Iosevka";
downloadPage = "https://github.com/be5invis/Iosevka/releases";
description = ''
Slender monospace sans-serif and slab-serif typeface inspired by Pragmata
Pro, M+ and PF DIN Mono, designed to be the ideal font for programming.
'';
license = licenses.ofl;
platforms = platforms.all;
maintainers = with maintainers; [
cstrahan
jfrankenau
ttuegel
babariviere
rileyinman
AluisioASG
];
};
}

View File

@ -0,0 +1,178 @@
[buildPlans.iosevka-mnemosyne]
family = "Iosevka"
spacing = "fixed"
serifs = "sans"
no-cv-ss = true
[buildPlans.iosevka-mnemosyne.weights.regular]
shape = 400
menu = 400
css = 400
[buildPlans.iosevka-mnemosyne.weights.bold]
shape = 700
menu = 700
css = 700
[buildPlans.iosevka-mnemosyne.slopes.upright]
angle = 0
shape = "upright"
menu = "upright"
css = "normal"
[buildPlans.iosevka-mnemosyne.slopes.italic]
angle = 9.4
shape = "italic"
menu = "italic"
css = "italic"
[buildPlans.iosevka-aile-mnemosyne]
family = "Iosevka Aile"
desc = "Sans-serif"
spacing = "quasi-proportional"
snapshotFamily = 'iosevka-aile'
snapshotFeature = '"NWID" off'
export-glyph-names = true
[buildPlans.iosevka-aile-mnemosyne.variants.design]
capital-i = "serifless"
capital-j = "serifless"
capital-k = "straight-serifless"
capital-m = "flat-bottom"
capital-w = "straight-flat-top"
a = "double-storey-serifless"
d = "toothed-serifless"
e = "flat-crossbar"
f = "flat-hook"
g = "single-storey-serifless"
i = "serifless"
j = "flat-hook-serifless"
k = "straight-serifless"
l = "serifless"
r = "compact"
t = "flat-hook"
u = "toothed"
w = "straight-flat-top"
y = "straight"
long-s = "flat-hook"
eszet = "longs-s-lig"
lower-iota = "flat-tailed"
lower-lambda = "straight-turn"
cyrl-ef = "serifless"
cyrl-capital-ka = "symmetric-connected-serifless"
cyrl-ka = "symmetric-connected-serifless"
cyrl-capital-u = "straight"
at = "fourfold"
percent = "rings-continuous-slash"
# Letterform control for U+1D670 ... U+1D6A3
[buildPlans.iosevka-aile-mnemosyne.derivingVariants.mathtt.design]
capital-i = "serifed"
capital-j = "serifless"
capital-k = "straight-serifless"
capital-m = "flat-bottom"
capital-w = "straight-flat-top"
a = "double-storey-serifless"
d = "toothed-serifless"
e = "flat-crossbar"
f = "flat-hook"
g = "single-storey-serifless"
i = "serifed"
j = "flat-hook-serifed"
k = "straight-serifless"
l = "serifed"
r = "compact"
t = "flat-hook"
u = "toothed"
w = "straight-flat-top"
y = "straight"
long-s = "flat-hook"
eszet = "longs-s-lig"
lower-iota = "flat-tailed"
lower-lambda = "straight-turn"
cyrl-ef = "serifless"
cyrl-capital-ka = "symmetric-connected-serifless"
cyrl-ka = "symmetric-connected-serifless"
cyrl-capital-u = "straight"
at = "fourfold"
percent = "rings-continuous-slash"
[buildPlans.iosevka-aile-mnemosyne.widths.normal]
shape = 600
menu = 5
css = "normal"
[buildPlans.iosevka-aile-mnemosyne.weights.regular]
shape = 400
menu = 400
css = 400
[buildPlans.iosevka-aile-mnemosyne.weights.bold]
shape = 700
menu = 700
css = 700
[buildPlans.iosevka-aile-mnemosyne.slopes.upright]
angle = 0
shape = "upright"
menu = "upright"
css = "normal"
[buildPlans.iosevka-aile-mnemosyne.slopes.italic]
angle = 9.4
shape = "italic"
menu = "italic"
css = "italic"
[buildPlans.iosevka-mnemosyne.widths.normal]
shape = 500
menu = 5
css = "normal"
[buildPlans.iosevka-etoile-mnemosyne]
family = "Iosevka Etoile"
desc = "Slab-serif"
spacing = "quasi-proportional"
serifs = 'slab'
snapshotFamily = 'iosevka-etoile'
snapshotFeature = '"NWID" off'
export-glyph-names = true
[buildPlans.iosevka-etoile-mnemosyne.variants.design]
at = 'fourfold'
capital-w = 'straight-flat-top'
f = "flat-hook-serifed"
j = 'flat-hook-serifed'
t = "flat-hook"
w = 'straight-flat-top'
[buildPlans.iosevka-etoile-mnemosyne.variants.italic]
f = "flat-hook-tailed"
[buildPlans.iosevka-etoile-mnemosyne.widths.normal]
shape = 600
menu = 5
css = "normal"
[buildPlans.iosevka-etoile-mnemosyne.weights.regular]
shape = 400
menu = 400
css = 400
[buildPlans.iosevka-etoile-mnemosyne.weights.bold]
shape = 700
menu = 700
css = 700
[buildPlans.iosevka-etoile-mnemosyne.slopes.upright]
angle = 0
shape = "upright"
menu = "upright"
css = "normal"
[buildPlans.iosevka-etoile-mnemosyne.slopes.italic]
angle = 9.4
shape = "italic"
menu = "italic"
css = "italic"

29
nix/server.nix Normal file
View File

@ -0,0 +1,29 @@
{ self }:
{ config, pkgs, ... }:
{
services.nginx = {
enable = true;
virtualHosts."erambler.co.uk" = {
enableACME = true;
forceSSL = true;
root = self.packages.${pkgs.system}.erambler;
extraConfig = ''
rewrite ^/.well-known/(host-meta|webfinger).* https://fed.brid.gy$request_uri redirect;
'';
locations = {
"~ ^/(feed|rss)(\\.xml|/)".return = "301 /index.xml";
"~ ^/tags/([a-zA-Z-]+)\\.xml".return = "301 /tags/$1/index.xml";
"~ ^/20(0\\d|1[0-5])/\\d\\d/\\d//d/(.*)".return = "301 /blog/$2";
"/index.xml".extraConfig = ''
add_header Link '<https://erambler.co.uk/rss.xml>; rel="self"';
'';
};
};
};
networking.firewall.allowedTCPPorts = [ 80 443 ];
}

12
nix/shell.nix Normal file
View File

@ -0,0 +1,12 @@
{ pkgs ? import <nixpkgs> { } }:
with pkgs;
mkShell {
buildInputs = [
(python38.withPackages
(py: with py; [ python invoke rich requests ruamel_yaml sh ]))
yarn
hugo
simple-http-server
];
}

View File

@ -1,31 +0,0 @@
{ pkgs, ... }:
let
python = pkgs.python38;
my_yaspin = python.pkgs.buildPythonPackage rec {
pname = "yaspin";
version = "1.3.0";
src = python.pkgs.fetchPypi {
inherit pname version;
sha256 =
"cc37d35cc7f796dada6c37430b49e471ffa05d0686e6f8de36f83978b732df54";
};
doCheck = false;
meta = {
homepage = "https://github.com/pavdmyt/yaspin";
description = "Yet Another Terminal Spinner for Python";
};
};
pythonWithPackages = python.withPackages (py: [
py.python
# For locally-run tasks
py.invoke
py.rich
py.requests
py.ruamel_yaml
my_yaspin
]);
in pkgs.mkShell {
buildInputs = with pkgs; [ pythonWithPackages yarn hugo ];
}

View File

@ -1 +1,7 @@
Sitemap: http://erambler.co.uk/sitemap.xml
User-agent: TurnitinBot
Disallow: /
User-agent: *
Disallow: /contact/

View File

@ -1,75 +1,27 @@
from invoke import task
from yaspin import yaspin
import requests as rq
from pathlib import Path
from ruamel.yaml import YAML
import sh
yaml = YAML()
CONFIG = yaml.load(Path("deploy.yaml"))
DEPLOY_DIR = Path(__file__).parent / "public"
REMOTE_DIR = "jemisin.petrichor.me:/srv/www/erambler.co.uk/"
@task
def deploy(c, clean=False):
with yaspin().yellow as s:
if clean:
s.text = "clean and rebuild"
c.run(f"rm --recursive --force {CONFIG['deploy-dir']}", hide=True)
c.run("nikola build", hide=True)
s.ok("[done]")
if clean:
print("clean and rebuild...")
sh.rm(DEPLOY_DIR, recursive=True, force=True)
sh.hugo()
print("done")
s.text = "add to IPFS"
s.start()
result = c.run(
f"ipfs add --recursive --hidden --quieter {CONFIG['deploy-dir']}",
hide=True,
)
new_hash = result.stdout.rstrip()
s.ok("[done]")
s.write(f"- published at {new_hash}")
pinata(c, new_hash, "erambler")
update_dnslink(c, f"/ipfs/{new_hash}")
@task
def pinata(c, new_hash, name):
with yaspin(text="pin at pinata").yellow as s:
result = rq.post(
"https://api.pinata.cloud/pinning/pinByHash",
headers={"Authorization": f'Bearer {CONFIG["pinata-key"]}'},
json={
"pinataMetadata": {"name": name},
"hashToPin": new_hash,
},
)
result.raise_for_status()
s.ok("[done]")
details = result.json()
s.write(f'- pin status: {details["status"]}')
@task
def update_dnslink(c, ipfs_path):
with yaspin(text="update dnslink record").yellow as s:
cf_config = CONFIG["cloudflare"]
token = cf_config["token"]
zone_id = cf_config["zone_id"]
record_id = cf_config["record_id"]
result = rq.put(
f"https://api.cloudflare.com/client/v4/zones/{zone_id}/dns_records/{record_id}",
headers={"Authorization": f"Bearer {token}"},
json={
"type": "TXT",
"name": "_dnslink.erambler.co.uk",
"content": f"dnslink={ipfs_path}",
"ttl": 1,
},
)
result.raise_for_status()
details = result.json()
if details["success"]:
s.ok("[done]")
else:
s.fail()
print("push via rsync...")
sh.rsync(
f"{DEPLOY_DIR}/",
REMOTE_DIR,
checksum=True,
archive=True,
verbose=True,
delete=True,
_fg=True,
)
print("done")

20
themes/mnemosyne/LICENSE Normal file
View File

@ -0,0 +1,20 @@
The MIT License (MIT)
Copyright (c) 2021 Jez Cope
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

View File

@ -0,0 +1,33 @@
# Mnemosyne: a minimal Hugo theme
This is the theme that I use for [my blog, eRambler](https://erambler.co.uk).
## Installation
In your Hugo site `themes` directory, run:
```
git clone https://tildegit.org/petrichor/theme-mnemosyne-hugo.git
```
Next, open `config.toml` in the base of the Hugo site and ensure the theme option is set to `mnemosyne`.
```
theme = "mnemosyne"
```
For more information read the official [quick start guide](https://gohugo.io/getting-started/quick-start/) of Hugo.
## Contributing
I don't really have time to test & accept contributions, but feel free to fork this theme and do your own thing with it.
## License
This theme is released under the [MIT license](https://tildegit.org/petrichor/theme-mnemosyne-hugo/src/branch/main/LICENSE).
## Acknowledgements
This theme is based on: [Blank][], a starter [Hugo](https://gohugo.io/) theme for developers. Use it to make your own theme.
[Blank]: https://themes.gohugo.io/theme/blank/

View File

@ -0,0 +1,4 @@
+++
title = "{{ replace .Name "-" " " | title }}"
date = {{ .Date }}
+++

View File

@ -0,0 +1,342 @@
/* webmention.js
Simple thing for embedding webmentions from webmention.io into a page, client-side.
(c)2018-2020 fluffy (http://beesbuzz.biz)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
GitHub repo (for latest released versions, issue tracking, etc.):
https://github.com/PlaidWeb/webmention.js
Basic usage:
<script src="/path/to/webmention.js" data-param="val" ... async />
<div id="webmentions"></div>
Allowed parameters:
page-url:
The base URL to use for this page. Defaults to window.location
add-urls:
Additional URLs to check, separated by |s
id:
The HTML ID for the object to fill in with the webmention data.
Defaults to "webmentions"
wordcount:
The maximum number of words to render in reply mentions.
max-webmentions:
The maximum number of mentions to retrieve. Defaults to 30.
prevent-spoofing:
By default, Webmentions render using the mf2 'url' element, which plays
nicely with webmention bridges (such as brid.gy and telegraph)
but allows certain spoofing attacks. If you would like to prevent
spoofing, set this to a non-empty string (e.g. "true").
sort-by:
What to order the responses by; defaults to 'published'. See
https://github.com/aaronpk/webmention.io#api
sort-dir:
The order to sort the responses by; defaults to 'up' (i.e. oldest
first). See https://github.com/aaronpk/webmention.io#api
comments-are-reactions:
If set to a non-empty string (e.g. "true"), will display comment-type responses
(replies/mentions/etc.) as being part of the reactions
(favorites/bookmarks/etc.) instead of in a separate comment list.
A more detailed example:
<script src="/path/to/webmention.min.js"
data-id="webmentionContainer"
data-wordcount="30"
data-prevent-spoofing="true"
data-comments-are-reactions="true"
/>
*/
(function () {
"use strict";
function getCfg(key, dfl) {
return document.currentScript.getAttribute("data-" + key) || dfl;
}
var refurl = getCfg('page-url',
window.location.href.replace(/#.*$/, ''));
var addurls = getCfg('add-urls', undefined);
var containerID = getCfg('id', "webmentions");
var textMaxWords = getCfg('wordcount');
var maxWebmentions = getCfg('max-webmentions', 30);
var mentionSource = getCfg('prevent-spoofing') ? 'wm-source' : 'url';
var sortBy = getCfg('sort-by', 'published');
var sortDir = getCfg('sort-dir', 'up');
var commentsAreReactions = getCfg('comments-are-reactions');
var reactTitle = {
'in-reply-to': 'replied',
'like-of': 'liked',
'repost-of': 'reposted',
'bookmark-of': 'bookmarked',
'mention-of': 'mentioned',
'rsvp': 'RSVPed',
'follow-of': 'followed'
};
var reactEmoji = {
'in-reply-to': '💬',
'like-of': '❤️',
'repost-of': '🔄',
'bookmark-of': '⭐️',
'mention-of': '💬',
'rsvp': '📅',
'follow-of': '🐜'
};
var rsvpEmoji = {
'yes': '✅',
'no': '❌',
'interested': '💡',
'maybe': '💭'
};
function entities(text) {
return text.replace(/&/g, '&amp;')
.replace(/</g, '&lt;')
.replace(/>/g, '&gt;')
.replace(/"/g, '&quot;');
}
function reactImage(r, isComment) {
var who = entities((r.author && r.author.name)
? r.author.name
: r.url.split('/')[2]);
var response = reactTitle[r['wm-property']] || 'reacted';
if (!isComment && r.content && r.content.text) {
response += ": " + extractComment(r);
}
var html = '<a class="reaction" rel="nofollow ugc" title="' + who + ' ' +
response + '" href="' + r[mentionSource] + '">';
if (r.author && r.author.photo) {
html += '<img src="' + entities(r.author.photo) +
'" loading="lazy" decoding="async" alt="' + who + '">';
}
html += (reactEmoji[r['wm-property']] || '💥');
if (r.rsvp && rsvpEmoji[r.rsvp]) {
html += '<sub>' + rsvpEmoji[r.rsvp] + '</sub>';
}
html += '</a>';
return html;
}
// strip the protocol off a URL
function stripurl(url) {
return url.substr(url.indexOf('//'));
}
// Deduplicate multiple mentions from the same source URL
function dedupe(mentions) {
var filtered = [];
var seen = {};
mentions.forEach(function(r) {
// Strip off the protocol (i.e. treat http and https the same)
var source = stripurl(r.url);
if (!seen[source]) {
filtered.push(r);
seen[source] = true;
}
});
return filtered;
}
function extractComment(c) {
var text = entities(c.content.text);
if (textMaxWords) {
var words = text.replace(/\s+/g,' ')
.split(' ', textMaxWords + 1);
if (words.length > textMaxWords) {
words[textMaxWords - 1] += '&hellip;';
words = words.slice(0, textMaxWords);
text = words.join(' ');
}
}
return text;
}
function formatComments(comments) {
var html = '<h2>' + comments.length + ' Response' +
(comments.length > 1 ? 's' : '') +
'</h2><ul class="comments">';
comments.forEach(function(c) {
html += '<li>';
html += reactImage(c, true);
html += ' <a class="source" rel="nofollow ugc" href="' +
c[mentionSource] + '">';
if (c.author && c.author.name) {
html += entities(c.author.name);
} else {
html += entities(c.url.split('/')[2]);
}
html += '</a>: ';
var linkclass;
var linktext;
if (c.name) {
linkclass = "name";
linktext = c.name;
} else if (c.content && c.content.text) {
linkclass = "text";
linktext = extractComment(c);
} else {
linkclass = "name";
linktext = "(mention)";
}
html += '<span class="' + linkclass + '">' + linktext + '</span>';
html += '</li>';
});
html += '</ul>';
return html;
}
function formatReactions(reacts) {
var html = '<h2>' + reacts.length + ' Reaction' +
(reacts.length > 1 ? 's' : '') +
'</h2><ul class="reacts">';
reacts.forEach(function(r) {
html += reactImage(r);
});
return html;
}
function getData(url, callback) {
if (window.fetch) {
window.fetch(url).then(function(response) {
if (response.status >= 200 && response.status < 300) {
return Promise.resolve(response);
} else {
return Promise.reject(new Error(response.statusText));
}
}).then(function(response) {
return response.json();
}).then(callback).catch(function(error) {
console.error("Request failed", error);
});
} else {
var oReq = new XMLHttpRequest();
oReq.onload = function(data) {
callback(JSON.parse(data));
};
oReq.onerror = function(error) {
console.error("Request failed", error);
};
}
}
window.addEventListener("load", function () {
var container = document.getElementById(containerID);
if (!container) {
// no container, so do nothing
return;
}
var pages = [stripurl(refurl)];
if (!!addurls) {
addurls.split('|').forEach(function (url) {
pages.push(stripurl(url));
})
}
var apiURL = 'https://webmention.io/api/mentions.jf2?per-page=' +
maxWebmentions + '&sort-by=' + sortBy + '&sort-dir=' + sortDir;
pages.forEach(function (path) {
apiURL += '&target[]=' + encodeURIComponent('http:' + path) +
'&target[]=' + encodeURIComponent('https:' + path);
});
getData(apiURL, function(json) {
var html = '';
var comments = [];
var collects = [];
if (commentsAreReactions) {
comments = collects;
}
var mapping = {
"in-reply-to": comments,
"like-of": collects,
"repost-of": collects,
"bookmark-of": collects,
"mention-of": comments,
"rsvp": comments
};
json.children.forEach(function(c) {
var store = mapping[c['wm-property']];
if (store) {
store.push(c);
}
});
// format the comment-type things
if (comments.length > 0 && comments !== collects) {
html += formatComments(dedupe(comments));
}
// format the other reactions
if (collects.length > 0) {
html += formatReactions(dedupe(collects));
}
container.innerHTML = html;
});
});
}());

View File

@ -0,0 +1,82 @@
/* Background */ .chroma { color: #93a1a1; background-color: #002b36 }
/* Other */ .chroma .x { color: #cb4b16 }
/* Error */ .chroma .err { }
/* LineTableTD */ .chroma .lntd { vertical-align: top; padding: 0; margin: 0; border: 0; }
/* LineTable */ .chroma .lntable { border-spacing: 0; padding: 0; margin: 0; border: 0; width: auto; overflow: auto; display: block; }
/* LineHighlight */ .chroma .hl { display: block; width: 100%;background-color: #ffffcc }
/* LineNumbersTable */ .chroma .lnt { margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #495050 }
/* LineNumbers */ .chroma .ln { margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #495050 }
/* Keyword */ .chroma .k { color: #719e07 }
/* KeywordConstant */ .chroma .kc { color: #cb4b16 }
/* KeywordDeclaration */ .chroma .kd { color: #268bd2 }
/* KeywordNamespace */ .chroma .kn { color: #719e07 }
/* KeywordPseudo */ .chroma .kp { color: #719e07 }
/* KeywordReserved */ .chroma .kr { color: #268bd2 }
/* KeywordType */ .chroma .kt { color: #dc322f }
/* Name */ .chroma .n { }
/* NameAttribute */ .chroma .na { }
/* NameBuiltin */ .chroma .nb { color: #b58900 }
/* NameBuiltinPseudo */ .chroma .bp { color: #268bd2 }
/* NameClass */ .chroma .nc { color: #268bd2 }
/* NameConstant */ .chroma .no { color: #cb4b16 }
/* NameDecorator */ .chroma .nd { color: #268bd2 }
/* NameEntity */ .chroma .ni { color: #cb4b16 }
/* NameException */ .chroma .ne { color: #cb4b16 }
/* NameFunction */ .chroma .nf { color: #268bd2 }
/* NameFunctionMagic */ .chroma .fm { }
/* NameLabel */ .chroma .nl { }
/* NameNamespace */ .chroma .nn { }
/* NameOther */ .chroma .nx { }
/* NameProperty */ .chroma .py { }
/* NameTag */ .chroma .nt { color: #268bd2 }
/* NameVariable */ .chroma .nv { color: #268bd2 }
/* NameVariableClass */ .chroma .vc { }
/* NameVariableGlobal */ .chroma .vg { }
/* NameVariableInstance */ .chroma .vi { }
/* NameVariableMagic */ .chroma .vm { }
/* Literal */ .chroma .l { }
/* LiteralDate */ .chroma .ld { }
/* LiteralString */ .chroma .s { color: #2aa198 }
/* LiteralStringAffix */ .chroma .sa { color: #2aa198 }
/* LiteralStringBacktick */ .chroma .sb { color: #586e75 }
/* LiteralStringChar */ .chroma .sc { color: #2aa198 }
/* LiteralStringDelimiter */ .chroma .dl { color: #2aa198 }
/* LiteralStringDoc */ .chroma .sd { }
/* LiteralStringDouble */ .chroma .s2 { color: #2aa198 }
/* LiteralStringEscape */ .chroma .se { color: #cb4b16 }
/* LiteralStringHeredoc */ .chroma .sh { }
/* LiteralStringInterpol */ .chroma .si { color: #2aa198 }
/* LiteralStringOther */ .chroma .sx { color: #2aa198 }
/* LiteralStringRegex */ .chroma .sr { color: #dc322f }
/* LiteralStringSingle */ .chroma .s1 { color: #2aa198 }
/* LiteralStringSymbol */ .chroma .ss { color: #2aa198 }
/* LiteralNumber */ .chroma .m { color: #2aa198 }
/* LiteralNumberBin */ .chroma .mb { color: #2aa198 }
/* LiteralNumberFloat */ .chroma .mf { color: #2aa198 }
/* LiteralNumberHex */ .chroma .mh { color: #2aa198 }
/* LiteralNumberInteger */ .chroma .mi { color: #2aa198 }
/* LiteralNumberIntegerLong */ .chroma .il { color: #2aa198 }
/* LiteralNumberOct */ .chroma .mo { color: #2aa198 }
/* Operator */ .chroma .o { color: #719e07 }
/* OperatorWord */ .chroma .ow { color: #719e07 }
/* Punctuation */ .chroma .p { }
/* Comment */ .chroma .c { color: #586e75 }
/* CommentHashbang */ .chroma .ch { color: #586e75 }
/* CommentMultiline */ .chroma .cm { color: #586e75 }
/* CommentSingle */ .chroma .c1 { color: #586e75 }
/* CommentSpecial */ .chroma .cs { color: #719e07 }
/* CommentPreproc */ .chroma .cp { color: #719e07 }
/* CommentPreprocFile */ .chroma .cpf { color: #719e07 }
/* Generic */ .chroma .g { }
/* GenericDeleted */ .chroma .gd { color: #dc322f }
/* GenericEmph */ .chroma .ge { font-style: italic }
/* GenericError */ .chroma .gr { color: #dc322f; font-weight: bold }
/* GenericHeading */ .chroma .gh { color: #cb4b16 }
/* GenericInserted */ .chroma .gi { color: #719e07 }
/* GenericOutput */ .chroma .go { }
/* GenericPrompt */ .chroma .gp { }
/* GenericStrong */ .chroma .gs { font-weight: bold }
/* GenericSubheading */ .chroma .gu { color: #268bd2 }
/* GenericTraceback */ .chroma .gt { }
/* GenericUnderline */ .chroma .gl { }
/* TextWhitespace */ .chroma .w { }

View File

@ -0,0 +1,3 @@
$main-font-family: 'Iosevka Etoile', sans-serif;
$header-font-family: 'Iosevka Aile', sans-serif;

View File

@ -0,0 +1,216 @@
@charset "utf-8"
@import url('../font/iosevka-aile-mnemosyne.css')
@import url('../font/iosevka-etoile-mnemosyne.css')
@import url('../font/iosevka-mnemosyne.css')
@function make-light($c)
@return scale-color($c, $lightness: 30%, $saturation: -25%)
@function make-lighter($c)
@return scale-color($c, $lightness: 60%, $saturation: -50%)
$family-sans-serif: "Iosevka Aile Web", sans-serif
$family-serif: "Iosevka Etoile Web", serif
$family-monospace: "Iosevka Web", monospace
$turquoise: #236863
$blue: #2D4471
$brown: #552500
$turquoise-light: make-light($turquoise)
$turquoise-lighter: make-lighter($turquoise)
$blue-light: make-light($blue)
$blue-lighter: make-lighter($blue)
$brown-light: make-light($brown)
$brown-lighter: make-lighter($brown)
$family-primary: $family-serif
$link: $turquoise
@import '../../node_modules/bulma/bulma.sass'
@import '_code.scss'
body
font-size: 16px
h1, h2, h3, h4, h5, h6
font-family: $family-sans-serif
color: $brown
&:before
color: $brown-lighter
a
color: inherit
h1
font-size: $size-large
&:before
content: "# "
h2, .content h2
font-size: $size-medium
margin: 2em 0 1em;
&:before
content: "## "
h3, .content h3
margin: 2em 0 1em;
&:before
content: "### "
h3, h4, h5, h6, .content h3, .content h4, .content h5, .content h6
font-size: $body-font-size
h5, h6, .content h5, .content h6
font-style: italic
h6, .content h6
font-weight: normal
.content
strong:before, strong:after
content: "*"
em:before, em:after
content: "_"
a
text-decoration: underline
ul
margin-left: 2ex
*::marker
font-weight: bold
list-style-type: "* "
ul
list-style-type: "+ "
ul
list-style-type: "- "
+mobile
&.taxonomy-list.tags-list
column-count: 2
+tablet-only
&.taxonomy-list.tags-list
column-count: 3
+desktop
&.taxonomy-list.tags-list
column-count: 4
dt
font-weight: bold
font-style: italic
dd
margin-left: 2ex
.summary
@extend .hero
@extend .my-5
@extend .px-3
@extend .py-5
.link-summary
@extend .has-background-link-light
.note-summary
@extend .has-background-info-light
.single, .list
@extend .my-5
@extend .px-3
@extend .py-5
.site-title
@extend h1
padding-left: 0
&:before
content: none
.site-description
background-color: $white-ter
#webmentions
.comments
max-height: 20em
overflow-x: hidden
overflow-y: scroll
font-size: 80%
li
.text
color: #555
font-style: italic
text-decoration: none
.name
color: #111
h2
font-size: medium
margin: 0
padding: 0.5em
&:first-child
border-top-left-radius: 0.5em
border-top-right-radius: 0.5em
.reacts img
margin: 3px -1ex 1px 0
vertical-align: baseline
ul
list-style-type: none
margin: 0
padding: 4px
li
text-indent: -3em
padding-left: 3em
padding-bottom: 0.5em
a.reaction
position: relative
margin-right: 0
margin-right: 1ex
text-decoration: none
text-shadow: 0px 0px 3px white
img
max-height: 2em
margin-right: -1ex
border-radius: 3px
sub
font-size: 50%
.reacts a.reaction
display: inline-block
ul
@extend .menu-list
.cactus-container
.cactus-editor
margin-bottom: 1em
.cactus-comment
padding-bottom: 1em
.cactus-comment-avatar
flex-shrink: 0
.cactus-message-text
@extend .content
#current
font-weight: bold

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 KiB

View File

@ -0,0 +1,26 @@
{{ define "main" }}
<section class="hero is-warning is-medium">
<div class="hero-body">
<div class="container">
<div class="columns">
<main class="column is-8 is-offset-2">
<p class="title">
Page not found
</p>
<div class="content">
<p>
You could:
</p>
<ul>
<li><a href="{{ "/" | relURL }}">Go back to the home page</a></li>
<li><a href="{{ "/tags/" | relURL }}">Take a look at the list of tags</a></li>
<li><a href="https://duckduckgo.com">Try searching for what you're looking for</a></li>
</ul>
</div>
</main>
</div>
</div>
</div>
</section>
{{ end }}

View File

@ -0,0 +1,32 @@
<!DOCTYPE html>
<html lang="{{ .Site.LanguageCode | default "en-us" }}">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>{{ .Title }}</title>
{{ .Scratch.Set "desc" slice }}
{{ with .Site.Params.description }}{{ $.Scratch.Add "desc" (slice .) }}{{ end }}
{{ with .Site.Params.topics }}{{ $.Scratch.Add "desc" (slice (delimit . " & ")) }}{{ end }}
{{ if gt (len (.Scratch.Get "desc")) 0 }}
<meta name="description" content="{{ delimit (.Scratch.Get "desc") " " }}">
{{ end }}
{{ with .Site.Params.author }}<meta name="author" content="{{ . }}">{{ end }}
{{ $style := resources.Get "style/main.sass" | resources.ToCSS }}
<link rel="stylesheet" href="{{ $style.RelPermalink }}">
{{ with .Site.Params.comments.webmention }}<link rel="webmention" href="{{ . }}" />{{ end }}
{{ with .Site.Params.comments.pingback }}<link rel="pingback" href="{{ . }}" />{{ end }}
{{ if .Site.Params.comments.cactus }}<link rel="stylesheet" href="https://latest.cactus.chat/style.css" type="text/css">{{ end }}
{{ with .OutputFormats.Get "RSS" -}}
{{ printf `<link rel="%s" type="%s" href="%s" title="%s">` .Rel .MediaType.Type .RelPermalink $.Site.Title | safeHTML }}
{{- end }}
</head>
<body>
{{ partial "header" . }}
{{ block "main" . }}{{ end }}
{{ partial "footer" . }}
{{ partial "scripts" . }}
</body>
</html>

View File

@ -0,0 +1,7 @@
{{ partial "status" . }}
<div class="page-date">
<strong>Date:</strong>
<time>{{ .Date.Format .Site.Params.DateFormat }}</time>
</div>
{{ partial "series.html" .Params.series }}
{{ partial "tags.html" .Params.tags }}

View File

@ -0,0 +1,4 @@
{{ .Summary }}
{{ if .Truncated }}
<a href="{{ .RelPermalink }}">Read more...</a>
{{ end }}

View File

@ -0,0 +1 @@
[{{ .Type | upper }}] {{ .Title }}

View File

@ -0,0 +1,6 @@
<li>
{{ .Date.Format .Site.Params.DateFormat }}:
<a href="{{ .RelPermalink }}">
{{ .Title }}
</a>
</li>

View File

@ -0,0 +1,25 @@
{{ define "main" }}
<main class="list">
<div class="container">
{{ if or .Title .Content }}
<div class="columns">
<div class="column is-8 is-offset-2">
{{ with .Title }}<h1 class="mb-5">{{ . }}</h1>{{ end }}
{{ with .Content }}<div class="content">{{ . }}<hr /></div>{{ end }}
</div>
</div>
{{ end }}
<div class="columns mb-6">
<div class="column is-8 is-offset-2 content">
<ul class="list {{ .Kind }}-list{{ with .Data.Plural }} {{.}}-list{{ end }}">
{{ $sort_field := "Date" }}
{{ if eq .Kind "taxonomy" }}{{ $sort_field = "Title" }}{{ end }}
{{ range sort .Pages $sort_field "asc" }}
{{ .Render "li" }}
{{ end }}
</ul>
</div>
</div>
</div>
</main>
{{ end }}

View File

@ -0,0 +1,24 @@
{{ define "main" }}
<main class="single">
<article class="container">
<div class="columns">
<div class="column is-8 is-offset-2">
<h1>{{ .Render "frag/title" }}</h1>
</div>
</div>
<div class="columns">
<div class="column is-2">
{{ .Render "frag/metadata" }}
</div>
<div class="column is-8">
{{ partial "series-items" . }}
{{ partial "toc" . }}
<div class="content">
{{ .Content }}
</div>
</div>
</div>
{{ partial "comments" . }}
</article>
</main>
{{ end }}

View File

@ -0,0 +1,20 @@
<article class="summary {{ .Type }}-summary">
<div class="container">
{{ if ne .Type "note" }}
<div class="columns">
<div class="column is-8 is-offset-2">
<h2><a href="{{ with .Params.link }}{{.}}{{ else }}{{ .RelPermalink }}{{ end }}">
{{ .Render "frag/title" }}</a></h2>
</div>
</div>
{{ end }}
<div class="columns">
<div class="column is-2">
{{ .Render "frag/metadata" }}
</div>
<div class="column is-8 content">
{{ .Render "frag/summary-content" }}
</div>
</div>
</div>
</article>

View File

@ -0,0 +1,28 @@
{{ define "main" }}
<section class="hero px-3 site-description">
<div class="hero-body">
<div class="container">
<div class="columns">
<div class="column is-8 is-offset-2">
{{ with .Site.Params.Description }}{{.}}{{ end }}
{{ with .Site.Params.Topics }}
{{ $last := sub (len .) 1 }}
{{ range $i, $x := . }}
<a href="/tags/{{ $x | urlize }}/">{{ $x }}</a>
{{ if lt $i $last }}<span class="ampersand">&</span>{{ end }}
{{ end }}
{{ end }}
</div>
</div>
</div>
</div>
</section>
<main class="mt-6">
{{ $paginator := .Paginate (where .Site.RegularPages "Type" "in" .Site.Params.mainSections) }}
{{ range $paginator.Pages }}
{{ .Render "summary" }}
{{ end }}
{{ partial "pagination" . }}
</main>
{{ end }}

View File

@ -0,0 +1,4 @@
{{ .Content }}
<p>
<a href="{{ .Params.link }}">&gt;&gt;&gt;</a>
</p>

View File

@ -0,0 +1 @@
{{ .Content }}

View File

@ -0,0 +1,2 @@
{{ partial "status" . }}
{{ partial "tags" .Params.tags }}

View File

@ -0,0 +1 @@
{{ .Title }}

View File

@ -0,0 +1,13 @@
<div class="container">
<div class="columns">
<div class="column is-8 is-offset-2">
{{ partial "comments/webmention" . }}
{{ partial "comments/cactus" . }}
{{ with .Site.DisqusShortname }}
<div>
{{ template "_internal/disqus.html" . }}
</div>
{{ end }}
</div>
</div>
</div>

View File

@ -0,0 +1,10 @@
{{ if .Site.Params.comments.cactus }}
<hr />
<div class="content">
<h2>Comments</h2>
</div>
<div id="cactus-comments"></div>
<p>
<em>Powered by <a href="https://cactus.chat/">Cactus Comments 🌵</a></em>
</p>
{{ end }}

View File

@ -0,0 +1,17 @@
{{ if .Site.Params.comments.webmention }}
<hr />
<div class="content">
<h2>Webmentions</h2>
<p>
You can respond to this post, <a href="{{ .Permalink }}">"{{ .Title }}"</a>, by:
liking, boosting or replying to a tweet or <a href="https://joinmastodon.org/">toot</a> that mentions it; or
sending a <a href="https://indieweb.org/Webmention">webmention</a> from your own site to <code>{{ .Permalink }}</code>
</p>
</div>
<div id="webmentions">
Comments &amp; reactions haven't loaded yet. You might have JavaScript disabled but that's cool 😎.
</div>
{{ end }}

View File

@ -0,0 +1,26 @@
<div class="footer">
<div class="container">
<div class="columns">
<footer class="column is-8 is-offset-2 has-text-centered">
{{ partial "social" . }}
<p>
&copy; {{ now.Year }}
<a href="{{ .Site.BaseURL }}">{{ .Site.Params.Author }}</a>
| Built by: <a href="https://gohugo.com/">Hugo</a>
| Theme: <a href="https://tildegit.org/petrichor/theme-mnemosyne-hugo">Mnemosyne</a>
</p>
{{ with .Site.Params.netlify }}
<p class="mt-4">
<a href="https://app.netlify.com/sites/{{.name}}/deploys">
Build status: <img src="https://api.netlify.com/api/v1/badges/{{.id}}/deploy-status">
</a>
</p>
{{ end }}
{{ with .Site.Copyright | safeHTML }}
<hr />
<p>{{.}}</p>
{{ end }}
</footer>
</div>
</div>
</div>

View File

@ -0,0 +1,29 @@
<div class="container p-3">
<div class="columns">
<div class="column is-8 is-offset-2">
<nav class="navbar" role="navigation" aria-label="main navigation">
<div class="navbar-brand">
{{- if .IsHome -}}<h1 class="site-title navbar-item">{{- else -}}<div class="site-title navbar-item">{{- end -}}
<a href="{{ .Site.BaseURL }}">{{ .Site.Title }}</a>
{{- if .IsHome -}}</h1>{{- else -}}</div>{{- end -}}
<a role="button" class="navbar-burger" aria-label="menu" aria-expanded="false" data-target="nav-menu">
<span aria-hidden="true"></span>
<span aria-hidden="true"></span>
<span aria-hidden="true"></span>
</a>
</div>
{{ with .Site.Menus.main }}
<div class="navbar-menu" id="nav-menu">
<div class="navbar-end">
{{ range . }}
<a class="navbar-item" href="{{ .URL | relURL }}">{{ .Name }}</a>
{{ end }}
</div>
</div>
{{ end }}
</nav>
</div>
</div>
</div>

View File

@ -0,0 +1,11 @@
<footer class="columns mb-3">
<div class="column is-8 is-offset-2 has-text-centered">
{{ if .Paginator.HasPrev }}
<a href="{{ .Paginator.Prev.URL }}">Previous Page</a>
{{ end }}
{{ .Paginator.PageNumber }} of {{ .Paginator.TotalPages }}
{{ if .Paginator.HasNext }}
<a href="{{ .Paginator.Next.URL }}">Next Page</a>
{{ end }}
</div>
</footer>

View File

@ -0,0 +1,19 @@
<script type="text/javascript" src="/js/navbar.js"></script>
{{ if .File }}
{{ $page_id := .File.BaseFileName }}
{{ if .Site.Params.comments.webmention }}
{{ $webmention_js := resources.Get "js/webmention.js" | minify }}
<script src="{{ $webmention_js.RelPermalink }}"
data-page-url="{{ .Permalink }}"
async></script>
{{ end }}
{{ with .Site.Params.comments.cactus }}
<script type="text/javascript" src="https://latest.cactus.chat/cactus.js"
data-default-homeserver-url="https://matrix.cactus.chat:8448"
data-server-name="cactus.chat"
data-site-name="{{ . }}"
data-node="#cactus-comments"
data-comment-section-id="{{ $page_id }}"></script>
{{ end }}
{{ end }}

View File

@ -0,0 +1,27 @@
{{ $page := . }}
{{ with .Params.series }}
{{ $series := (site.GetPage "/series").GetPage . }}
<div class="card mb-5">
<header class="card-header has-background-primary has-text-white">
<p class="card-header-title has-text-white">
Series
</p>
</header>
<div class="card-content content is-size-7">
{{ with $series.Params.on }}
<p>This post is part of <a href="{{ $series.RelPermalink }}">a series on {{.}}</a>.</p>
{{ else }}
<p>This post is part of the series <a href="{{ $series.RelPermalink }}" class="has-text-white">{{ $series.Title }}</a></p>
{{ end }}
<ul>
{{ range $series.Pages }}
<li>
{{ if ne . $page }}<a href="{{ .RelPermalink }}">{{ else }}<span id="current">&gt; {{ end }}
{{ .Title }}
{{ if ne . $page }}</a>{{ else }} &lt;</span>{{ end }}
</li>
{{ end }}
</ul>
</div>
</div>
{{ end }}

View File

@ -0,0 +1,7 @@
{{ with . }}
{{ $series := (site.GetPage "/series").GetPage . }}
<div>
<strong>Series:</strong>
<a href="{{ $series.RelPermalink }}">{{ $series.Title }}</a>
</div>
{{ end }}

View File

@ -0,0 +1,14 @@
<aside>
<div>
<div>
<h3>LATEST POSTS</h3>
</div>
<div>
<ul>
{{ range first 5 (where .Site.RegularPages "Type" "in" .Site.Params.mainSections) }}
<li><a href="{{ .RelPermalink }}">{{ .Title }}</a></li>
{{ end }}
</ul>
</div>
</div>
</aside>

View File

@ -0,0 +1,34 @@
{{ with .Site.Params.Social }}
<p>
me elsewhere ::
{{ $last := sub (len .) 1 }}
{{ range $i, $x := . }}
{{ $url := $x.info }}
{{ $text := $x.kind }}
{{ if eq $x.kind "github" }}
{{ $url = printf "https://github.com/%s" $x.info }}
{{ else if eq $x.kind "gitlab" }}
{{ $url = printf "https://gitlab.com/%s" $x.info }}
{{ else if eq $x.kind "linkedin" }}
{{ $url = printf "https://linkedin.com/in/%s" $x.info }}
{{ else if eq $x.kind "twitter" }}
{{ $url = printf "https://twitter.com/%s" $x.info }}
{{ else if eq $x.kind "mastodon" }}
{{ $url = printf "https://%s/@%s" (index $x.info 1) (index $x.info 0) }}
{{ else if eq $x.kind "orcid" }}
{{ $url = printf "https://orcid.org/%s" $x.info }}
{{ else if eq $x.kind "keybase" }}
{{ $url = printf "https://keybase.io/%s" $x.info }}
{{ else if eq $x.kind "keyoxide" }}
{{ $url = printf "https://keyoxide.org/%s" $x.info }}
{{ else if eq $x.kind "matrix" }}
{{ $url = printf "https://matrix.to/#/%s" $x.info }}
{{ else if eq $x.kind "pypi" }}
{{ $url = printf "https://pypi.org/user/%s" $x.info }}
{{ end }}
<a href="{{$url}}" rel="me">{{$text}}</a>
{{ if ne $i $last }}|{{ end }}
{{ end }}
</p>
<hr />
{{ end }}

View File

@ -0,0 +1 @@
{{ if .Params.draft }}<div><strong>Status:</strong> DRAFT ✏️</div>{{ end }}

View File

@ -0,0 +1,8 @@
{{ if . }}
<div class="page-tags">
<strong>Tags:</strong>
{{ range . }}
<a href="{{ "/tags/" | relLangURL }}{{ . | urlize }}">[{{ . }}]</a>
{{ end }}
</div>
{{ end }}

View File

@ -0,0 +1,10 @@
{{ if .Params.ShowTOC }}
<div class="card mb-5">
<div class="card-header has-background-light">
<p class="card-header-title">Contents</p>
</div>
<div class="card-content content is-size-7">
{{ .TableOfContents }}
</div>
</div>
{{ end }}

View File

@ -0,0 +1 @@
{{ .Title }}

View File

@ -0,0 +1,4 @@
<li>
<a href="{{ .RelPermalink }}">{{ .Title }} ({{ .Data.series | len }} posts)</a>
{{- with .Params.summary }}: {{.}}{{ end }}
</li>

View File

@ -0,0 +1,10 @@
<div class="card mb-5">
<header class="card-header{{ with .Get 1 }} has-background-{{.}} has-text-white{{ end }}">
<p class="card-header-title">
{{ .Get 0 | title }}
</p>
</header>
<div class="card-content content">
{{ .Inner | markdownify }}
</div>
</div>

View File

@ -0,0 +1,5 @@
<li>
<a href="{{ .RelPermalink }}">
{{ .Title }}
</a>
</li>

16
themes/mnemosyne/node_modules/.yarn-integrity generated vendored Normal file
View File

@ -0,0 +1,16 @@
{
"systemParams": "linux-x64-83",
"modulesFolders": [
"node_modules"
],
"flags": [],
"linkedModules": [],
"topLevelPatterns": [
"bulma@^0.9.2"
],
"lockfileEntries": {
"bulma@^0.9.2": "https://registry.yarnpkg.com/bulma/-/bulma-0.9.3.tgz#ddccb7436ebe3e21bf47afe01d3c43a296b70243"
},
"files": [],
"artifacts": {}
}

1558
themes/mnemosyne/node_modules/bulma/CHANGELOG.md generated vendored Normal file

File diff suppressed because it is too large Load Diff

21
themes/mnemosyne/node_modules/bulma/LICENSE generated vendored Normal file
View File

@ -0,0 +1,21 @@
The MIT License (MIT)
Copyright (c) 2020 Jeremy Thomas
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

134
themes/mnemosyne/node_modules/bulma/README.md generated vendored Normal file
View File

@ -0,0 +1,134 @@
# [Bulma](https://bulma.io)
Bulma is a **modern CSS framework** based on [Flexbox](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Flexible_Box_Layout/Using_CSS_flexible_boxes).
![Github](https://img.shields.io/github/v/release/jgthms/bulma?logo=Bulma)
[![npm](https://img.shields.io/npm/v/bulma.svg)][npm-link]
[![npm](https://img.shields.io/npm/dm/bulma.svg)][npm-link]
[![](https://data.jsdelivr.com/v1/package/npm/bulma/badge)](https://www.jsdelivr.com/package/npm/bulma)
[![Awesome][awesome-badge]][awesome-link]
[![Join the chat at https://gitter.im/jgthms/bulma](https://badges.gitter.im/jgthms/bulma.svg)](https://gitter.im/jgthms/bulma)
[![Build Status](https://travis-ci.org/jgthms/bulma.svg?branch=master)](https://travis-ci.org/jgthms/bulma)
<a href="https://bulma.io"><img src="https://raw.githubusercontent.com/jgthms/bulma/master/docs/images/bulma-banner.png" alt="Bulma: a Flexbox CSS framework" style="max-width:100%;" width="600"></a>
## Quick install
Bulma is constantly in development! Try it out now:
### NPM
```sh
npm install bulma
```
**or**
### Yarn
```sh
yarn add bulma
```
### Bower
```sh
bower install bulma
```
### Import
After installation, you can import the CSS file into your project using this snippet:
```sh
@import 'bulma/css/bulma.css'
```
### CDN
[https://www.jsdelivr.com/package/npm/bulma](https://www.jsdelivr.com/package/npm/bulma)
Feel free to raise an issue or submit a pull request.
## CSS only
Bulma is a **CSS** framework. As such, the sole output is a single CSS file: [bulma.css](https://github.com/jgthms/bulma/blob/master/css/bulma.css)
You can either use that file, "out of the box", or download the Sass source files to customize the [variables](https://bulma.io/documentation/overview/variables/).
There is **no** JavaScript included. People generally want to use their own JS implementation (and usually already have one). Bulma can be considered "environment agnostic": it's just the style layer on top of the logic.
## Browser Support
Bulma uses [autoprefixer](https://github.com/postcss/autoprefixer) to make (most) Flexbox features compatible with earlier browser versions. According to [Can I use](https://caniuse.com/#feat=flexbox), Bulma is compatible with **recent** versions of:
* Chrome
* Edge
* Firefox
* Opera
* Safari
Internet Explorer (10+) is only partially supported.
## Documentation
The documentation resides in the [docs](docs) directory, and is built with the Ruby-based [Jekyll](https://jekyllrb.com/) tool.
Browse the [online documentation here.](https://bulma.io/documentation/overview/start/)
## Related projects
| Project | Description |
|--------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------|
| [Bulma with Attribute Modules](https://github.com/j5bot/bulma-attribute-selectors) | Adds support for attribute-based selectors |
| [Bulma with Rails](https://github.com/joshuajansen/bulma-rails) | Integrates Bulma with the rails asset pipeline |
| [BulmaRazor](https://github.com/loogn/bulmarazor) | A lightweight component library based on Bulma and Blazor. |
| [Vue Admin (dead)](https://github.com/vue-bulma/vue-admin) | Vue Admin framework powered by Bulma |
| [Bulmaswatch](https://github.com/jenil/bulmaswatch) | Free themes for Bulma |
| [Goldfish (read-only)](https://github.com/Caiyeon/goldfish) | Vault UI with Bulma, Golang, and Vue Admin |
| [ember-bulma](https://github.com/open-tux/ember-bulma) | Ember addon providing a collection of UI components for Bulma |
| [Bloomer](https://bloomer.js.org) | A set of React components for Bulma |
| [React-bulma](https://github.com/kulakowka/react-bulma) | React.js components for Bulma |
| [Buefy](https://buefy.org/) | Lightweight UI components for Vue.js based on Bulma |
| [vue-bulma-components](https://github.com/vouill/vue-bulma-components) | Bulma components for Vue.js with straightforward syntax |
| [BulmaJS](https://github.com/VizuaaLOG/BulmaJS) | Javascript integration for Bulma. Written in ES6 with a data-* API |
| [Bulma-modal-fx](https://github.com/postare/bulma-modal-fx) | A set of modal window effects with CSS transitions and animations for Bulma |
| [Bulma Stylus](https://github.com/groenroos/bulma-stylus) | Up-to-date 1:1 translation to Stylus
| [Bulma.styl (read-only)](https://github.com/log1x/bulma.styl) | 1:1 Stylus translation of Bulma 0.6.11 |
| [elm-bulma](https://github.com/surprisetalk/elm-bulma) | Bulma + Elm |
| [elm-bulma-classes](https://github.com/ahstro/elm-bulma-classes) | Bulma classes prepared for usage with Elm |
| [Bulma Customizer](https://bulma-customizer.bstash.io/) | Bulma Customizer &#8211; Create your own **bespoke** Bulma build |
| [Fulma](https://fulma.github.io/Fulma/) | Wrapper around Bulma for [fable-react](https://github.com/fable-compiler/fable-react) |
| [Laravel Enso](https://github.com/laravel-enso/enso) | SPA Admin Panel built with Bulma, VueJS and Laravel |
| [Django Bulma](https://github.com/timonweb/django-bulma) | Integrates Bulma with Django |
| [Bulma Templates](https://github.com/dansup/bulma-templates) | Free Templates for Bulma |
| [React Bulma Components](https://github.com/couds/react-bulma-components) | Another React wrap on React for Bulma.io |
| [purescript-bulma](https://github.com/sectore/purescript-bulma) | PureScript bindings for Bulma |
| [Vue Datatable](https://github.com/laravel-enso/vuedatatable) | Bulma themed datatable based on Vue, Laravel & JSON templates |
| [bulma-fluent](https://mubaidr.github.io/bulma-fluent/) | Fluent Design Theme for Bulma inspired by Microsofts Fluent Design System |
| [csskrt-csskrt](https://github.com/4d11/csskrt-csskrt) | Automatically add Bulma classes to HTML files |
| [bulma-pagination-react](https://github.com/hipstersmoothie/bulma-pagination-react) | Bulma pagination as a react component |
| [bulma-helpers](https://github.com/jmaczan/bulma-helpers) | Functional / Atomic CSS classes for Bulma |
| [bulma-swatch-hook](https://github.com/hipstersmoothie/bulma-swatch-hook) | Bulma swatches as a react hook and a component |
| [BulmaWP (read-only)](https://github.com/tomhrtly/BulmaWP) | Starter WordPress theme for Bulma |
| [Ralma](https://github.com/aldi/ralma) | Stateless Ractive.js Components for Bulma |
| [Django Simple Bulma](https://github.com/python-discord/django-simple-bulma) | Lightweight integration of Bulma and Bulma-Extensions for your Django app |
| [rbx](https://dfee.github.io/rbx) | Comprehensive React UI Framework written in TypeScript |
| [Awesome Bulma Templates](https://github.com/aldi/awesome-bulma-templates) | Free real-world Templates built with Bulma |
| [Trunx](http://g14n.info/trunx) | Super Saiyan React components, son of awesome Bulma, implemented in TypeScript |
| [@aybolit/bulma](https://github.com/web-padawan/aybolit/tree/master/packages/bulma) | Web Components library inspired by Bulma and Bulma-extensions |
| [Drulma](https://www.drupal.org/project/drulma) | Drupal theme for Bulma. |
| [Bulrush](https://github.com/textbook/bulrush) | A Bulma-based Python Pelican blog theme |
| [Bulma Variable Export](https://github.com/service-paradis/bulma-variables-export) | Access Bulma Variables in Javascript/Typescript in project using Webpack |
| [Bulmil](https://github.com/gomah/bulmil) | An agnostic UI components library based on Web Components, made with Bulma & Stencil. |
| [Svelte Bulma Components](https://github.com/elcobvg/svelte-bulma-components) | Library of UI components to be used in [Svelte.js](https://svelte.technology/) or standalone. |
| [Bulma Nunjucks Starterkit](https://github.com/benninkcorien/nunjucks-starter-kit) | Starterkit for Nunjucks with Bulma. |
| [Bulma-Social](https://github.com/aldi/bulma-social) | Social Buttons and Colors for Bulma |
| [Divjoy](https://divjoy.com/?kit=bulma) | React codebase generator with Bulma templates |
## Copyright and license ![Github](https://img.shields.io/github/license/jgthms/bulma?logo=Github)
Code copyright 2021 Jeremy Thomas. Code released under [the MIT license](https://github.com/jgthms/bulma/blob/master/LICENSE).
[npm-link]: https://www.npmjs.com/package/bulma
[awesome-link]: https://github.com/awesome-css-group/awesome-css
[awesome-badge]: https://cdn.rawgit.com/sindresorhus/awesome/d7305f38d29fed78fa85652e3a63e154dd8e8829/media/badge.svg

10
themes/mnemosyne/node_modules/bulma/bulma.sass generated vendored Normal file
View File

@ -0,0 +1,10 @@
@charset "utf-8"
/*! bulma.io v0.9.3 | MIT License | github.com/jgthms/bulma */
@import "sass/utilities/_all"
@import "sass/base/_all"
@import "sass/elements/_all"
@import "sass/form/_all"
@import "sass/components/_all"
@import "sass/grid/_all"
@import "sass/helpers/_all"
@import "sass/layout/_all"

11811
themes/mnemosyne/node_modules/bulma/css/bulma-rtl.css generated vendored Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

11811
themes/mnemosyne/node_modules/bulma/css/bulma.css generated vendored Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

56
themes/mnemosyne/node_modules/bulma/package.json generated vendored Normal file
View File

@ -0,0 +1,56 @@
{
"name": "bulma",
"version": "0.9.3",
"homepage": "https://bulma.io",
"author": {
"name": "Jeremy Thomas",
"email": "bbxdesign@gmail.com",
"url": "https://jgthms.com"
},
"description": "Modern CSS framework based on Flexbox",
"main": "bulma.sass",
"unpkg": "css/bulma.css",
"style": "bulma/css/bulma.min.css",
"repository": {
"type": "git",
"url": "git+https://github.com/jgthms/bulma.git"
},
"license": "MIT",
"keywords": [
"css",
"sass",
"flexbox",
"responsive",
"framework"
],
"bugs": {
"url": "https://github.com/jgthms/bulma/issues"
},
"devDependencies": {
"autoprefixer": "^9.8.6",
"clean-css-cli": "^4.3.0",
"node-sass": "^4.14.1",
"postcss-cli": "^7.1.2",
"rimraf": "^3.0.2"
},
"scripts": {
"build": "npm run build-sass && npm run build-autoprefix && npm run build-cleancss",
"build-autoprefix": "postcss --use autoprefixer --map false --output css/bulma.css css/bulma.css",
"build-cleancss": "cleancss -o css/bulma.min.css css/bulma.css",
"build-sass": "node-sass --output-style expanded --source-map true bulma.sass css/bulma.css",
"clean": "rimraf css",
"rtl": "npm run rtl-sass && npm run rtl-autoprefix && npm run rtl-cleancss",
"rtl-sass": "node-sass --output-style expanded --source-map true bulma-rtl.sass css/bulma-rtl.css",
"rtl-autoprefix": "postcss --use autoprefixer --map false --output css/bulma-rtl.css css/bulma-rtl.css",
"rtl-cleancss": "cleancss -o css/bulma-rtl.min.css css/bulma-rtl.css",
"deploy": "npm run clean && npm run build && npm run rtl",
"start": "npm run build-sass -- --watch"
},
"files": [
"css",
"sass",
"bulma.sass",
"LICENSE",
"README.md"
]
}

View File

@ -0,0 +1,6 @@
/* Bulma Base */
@charset "utf-8"
@import "minireset"
@import "generic"
@import "animations"

View File

@ -0,0 +1,5 @@
@keyframes spinAround
from
transform: rotate(0deg)
to
transform: rotate(359deg)

View File

@ -0,0 +1,145 @@
@import "../utilities/mixins"
$body-background-color: $scheme-main !default
$body-size: 16px !default
$body-min-width: 300px !default
$body-rendering: optimizeLegibility !default
$body-family: $family-primary !default
$body-overflow-x: hidden !default
$body-overflow-y: scroll !default
$body-color: $text !default
$body-font-size: 1em !default
$body-weight: $weight-normal !default
$body-line-height: 1.5 !default
$code-family: $family-code !default
$code-padding: 0.25em 0.5em 0.25em !default
$code-weight: normal !default
$code-size: 0.875em !default
$small-font-size: 0.875em !default
$hr-background-color: $background !default
$hr-height: 2px !default
$hr-margin: 1.5rem 0 !default
$strong-color: $text-strong !default
$strong-weight: $weight-bold !default
$pre-font-size: 0.875em !default
$pre-padding: 1.25rem 1.5rem !default
$pre-code-font-size: 1em !default
html
background-color: $body-background-color
font-size: $body-size
-moz-osx-font-smoothing: grayscale
-webkit-font-smoothing: antialiased
min-width: $body-min-width
overflow-x: $body-overflow-x
overflow-y: $body-overflow-y
text-rendering: $body-rendering
text-size-adjust: 100%
article,
aside,
figure,
footer,
header,
hgroup,
section
display: block
body,
button,
input,
optgroup,
select,
textarea
font-family: $body-family
code,
pre
-moz-osx-font-smoothing: auto
-webkit-font-smoothing: auto
font-family: $code-family
body
color: $body-color
font-size: $body-font-size
font-weight: $body-weight
line-height: $body-line-height
// Inline
a
color: $link
cursor: pointer
text-decoration: none
strong
color: currentColor
&:hover
color: $link-hover
code
background-color: $code-background
color: $code
font-size: $code-size
font-weight: $code-weight
padding: $code-padding
hr
background-color: $hr-background-color
border: none
display: block
height: $hr-height
margin: $hr-margin
img
height: auto
max-width: 100%
input[type="checkbox"],
input[type="radio"]
vertical-align: baseline
small
font-size: $small-font-size
span
font-style: inherit
font-weight: inherit
strong
color: $strong-color
font-weight: $strong-weight
// Block
fieldset
border: none
pre
+overflow-touch
background-color: $pre-background
color: $pre
font-size: $pre-font-size
overflow-x: auto
padding: $pre-padding
white-space: pre
word-wrap: normal
code
background-color: transparent
color: currentColor
font-size: $pre-code-font-size
padding: 0
table
td,
th
vertical-align: top
&:not([align])
text-align: inherit
th
color: $text-strong

View File

@ -0,0 +1 @@
@warn "The helpers.sass file is DEPRECATED. It has moved into its own /helpers folder. Please import sass/helpers/_all instead."

View File

@ -0,0 +1,79 @@
/*! minireset.css v0.0.6 | MIT License | github.com/jgthms/minireset.css */
// Blocks
html,
body,
p,
ol,
ul,
li,
dl,
dt,
dd,
blockquote,
figure,
fieldset,
legend,
textarea,
pre,
iframe,
hr,
h1,
h2,
h3,
h4,
h5,
h6
margin: 0
padding: 0
// Headings
h1,
h2,
h3,
h4,
h5,
h6
font-size: 100%
font-weight: normal
// List
ul
list-style: none
// Form
button,
input,
select,
textarea
margin: 0
// Box sizing
html
box-sizing: border-box
*
&,
&::before,
&::after
box-sizing: inherit
// Media
img,
video
height: auto
max-width: 100%
// Iframe
iframe
border: 0
// Table
table
border-collapse: collapse
border-spacing: 0
td,
th
padding: 0
&:not([align])
text-align: inherit

View File

@ -0,0 +1,15 @@
/* Bulma Components */
@charset "utf-8"
@import "breadcrumb"
@import "card"
@import "dropdown"
@import "level"
@import "media"
@import "menu"
@import "message"
@import "modal"
@import "navbar"
@import "pagination"
@import "panel"
@import "tabs"

View File

@ -0,0 +1,77 @@
@import "../utilities/mixins"
$breadcrumb-item-color: $link !default
$breadcrumb-item-hover-color: $link-hover !default
$breadcrumb-item-active-color: $text-strong !default
$breadcrumb-item-padding-vertical: 0 !default
$breadcrumb-item-padding-horizontal: 0.75em !default
$breadcrumb-item-separator-color: $border-hover !default
.breadcrumb
@extend %block
@extend %unselectable
font-size: $size-normal
white-space: nowrap
a
align-items: center
color: $breadcrumb-item-color
display: flex
justify-content: center
padding: $breadcrumb-item-padding-vertical $breadcrumb-item-padding-horizontal
&:hover
color: $breadcrumb-item-hover-color
li
align-items: center
display: flex
&:first-child a
+ltr-property("padding", 0, false)
&.is-active
a
color: $breadcrumb-item-active-color
cursor: default
pointer-events: none
& + li::before
color: $breadcrumb-item-separator-color
content: "\0002f"
ul,
ol
align-items: flex-start
display: flex
flex-wrap: wrap
justify-content: flex-start
.icon
&:first-child
+ltr-property("margin", 0.5em)
&:last-child
+ltr-property("margin", 0.5em, false)
// Alignment
&.is-centered
ol,
ul
justify-content: center
&.is-right
ol,
ul
justify-content: flex-end
// Sizes
&.is-small
font-size: $size-small
&.is-medium
font-size: $size-medium
&.is-large
font-size: $size-large
// Styles
&.has-arrow-separator
li + li::before
content: "\02192"
&.has-bullet-separator
li + li::before
content: "\02022"
&.has-dot-separator
li + li::before
content: "\000b7"
&.has-succeeds-separator
li + li::before
content: "\0227B"

View File

@ -0,0 +1,103 @@
@import "../utilities/mixins"
$card-color: $text !default
$card-background-color: $scheme-main !default
$card-shadow: $shadow !default
$card-radius: 0.25rem !default
$card-header-background-color: transparent !default
$card-header-color: $text-strong !default
$card-header-padding: 0.75rem 1rem !default
$card-header-shadow: 0 0.125em 0.25em rgba($scheme-invert, 0.1) !default
$card-header-weight: $weight-bold !default
$card-content-background-color: transparent !default
$card-content-padding: 1.5rem !default
$card-footer-background-color: transparent !default
$card-footer-border-top: 1px solid $border-light !default
$card-footer-padding: 0.75rem !default
$card-media-margin: $block-spacing !default
.card
background-color: $card-background-color
border-radius: $card-radius
box-shadow: $card-shadow
color: $card-color
max-width: 100%
position: relative
%card-item
&:first-child
border-top-left-radius: $card-radius
border-top-right-radius: $card-radius
&:last-child
border-bottom-left-radius: $card-radius
border-bottom-right-radius: $card-radius
.card-header
@extend %card-item
background-color: $card-header-background-color
align-items: stretch
box-shadow: $card-header-shadow
display: flex
.card-header-title
align-items: center
color: $card-header-color
display: flex
flex-grow: 1
font-weight: $card-header-weight
padding: $card-header-padding
&.is-centered
justify-content: center
.card-header-icon
+reset
align-items: center
cursor: pointer
display: flex
justify-content: center
padding: $card-header-padding
.card-image
display: block
position: relative
&:first-child
img
border-top-left-radius: $card-radius
border-top-right-radius: $card-radius
&:last-child
img
border-bottom-left-radius: $card-radius
border-bottom-right-radius: $card-radius
.card-content
@extend %card-item
background-color: $card-content-background-color
padding: $card-content-padding
.card-footer
@extend %card-item
background-color: $card-footer-background-color
border-top: $card-footer-border-top
align-items: stretch
display: flex
.card-footer-item
align-items: center
display: flex
flex-basis: 0
flex-grow: 1
flex-shrink: 0
justify-content: center
padding: $card-footer-padding
&:not(:last-child)
+ltr-property("border", $card-footer-border-top)
// Combinations
.card
.media:not(:last-child)
margin-bottom: $card-media-margin

View File

@ -0,0 +1,83 @@
@import "../utilities/mixins"
$dropdown-menu-min-width: 12rem !default
$dropdown-content-background-color: $scheme-main !default
$dropdown-content-arrow: $link !default
$dropdown-content-offset: 4px !default
$dropdown-content-padding-bottom: 0.5rem !default
$dropdown-content-padding-top: 0.5rem !default
$dropdown-content-radius: $radius !default
$dropdown-content-shadow: $shadow !default
$dropdown-content-z: 20 !default
$dropdown-item-color: $text !default
$dropdown-item-hover-color: $scheme-invert !default
$dropdown-item-hover-background-color: $background !default
$dropdown-item-active-color: $link-invert !default
$dropdown-item-active-background-color: $link !default
$dropdown-divider-background-color: $border-light !default
.dropdown
display: inline-flex
position: relative
vertical-align: top
&.is-active,
&.is-hoverable:hover
.dropdown-menu
display: block
&.is-right
.dropdown-menu
left: auto
right: 0
&.is-up
.dropdown-menu
bottom: 100%
padding-bottom: $dropdown-content-offset
padding-top: initial
top: auto
.dropdown-menu
display: none
+ltr-position(0, false)
min-width: $dropdown-menu-min-width
padding-top: $dropdown-content-offset
position: absolute
top: 100%
z-index: $dropdown-content-z
.dropdown-content
background-color: $dropdown-content-background-color
border-radius: $dropdown-content-radius
box-shadow: $dropdown-content-shadow
padding-bottom: $dropdown-content-padding-bottom
padding-top: $dropdown-content-padding-top
.dropdown-item
color: $dropdown-item-color
display: block
font-size: 0.875rem
line-height: 1.5
padding: 0.375rem 1rem
position: relative
a.dropdown-item,
button.dropdown-item
+ltr-property("padding", 3rem)
text-align: inherit
white-space: nowrap
width: 100%
&:hover
background-color: $dropdown-item-hover-background-color
color: $dropdown-item-hover-color
&.is-active
background-color: $dropdown-item-active-background-color
color: $dropdown-item-active-color
.dropdown-divider
background-color: $dropdown-divider-background-color
border: none
display: block
height: 1px
margin: 0.5rem 0

View File

@ -0,0 +1,79 @@
@import "../utilities/mixins"
$level-item-spacing: ($block-spacing * 0.5) !default
.level
@extend %block
align-items: center
justify-content: space-between
code
border-radius: $radius
img
display: inline-block
vertical-align: top
// Modifiers
&.is-mobile
display: flex
.level-left,
.level-right
display: flex
.level-left + .level-right
margin-top: 0
.level-item
&:not(:last-child)
margin-bottom: 0
+ltr-property("margin", $level-item-spacing)
&:not(.is-narrow)
flex-grow: 1
// Responsiveness
+tablet
display: flex
& > .level-item
&:not(.is-narrow)
flex-grow: 1
.level-item
align-items: center
display: flex
flex-basis: auto
flex-grow: 0
flex-shrink: 0
justify-content: center
.title,
.subtitle
margin-bottom: 0
// Responsiveness
+mobile
&:not(:last-child)
margin-bottom: $level-item-spacing
.level-left,
.level-right
flex-basis: auto
flex-grow: 0
flex-shrink: 0
.level-item
// Modifiers
&.is-flexible
flex-grow: 1
// Responsiveness
+tablet
&:not(:last-child)
+ltr-property("margin", $level-item-spacing)
.level-left
align-items: center
justify-content: flex-start
// Responsiveness
+mobile
& + .level-right
margin-top: 1.5rem
+tablet
display: flex
.level-right
align-items: center
justify-content: flex-end
// Responsiveness
+tablet
display: flex

View File

@ -0,0 +1,59 @@
@import "../utilities/mixins"
$media-border-color: bulmaRgba($border, 0.5) !default
$media-border-size: 1px !default
$media-spacing: 1rem !default
$media-spacing-large: 1.5rem !default
$media-content-spacing: 0.75rem !default
$media-level-1-spacing: 0.75rem !default
$media-level-1-content-spacing: 0.5rem !default
$media-level-2-spacing: 0.5rem !default
.media
align-items: flex-start
display: flex
text-align: inherit
.content:not(:last-child)
margin-bottom: $media-content-spacing
.media
border-top: $media-border-size solid $media-border-color
display: flex
padding-top: $media-level-1-spacing
.content:not(:last-child),
.control:not(:last-child)
margin-bottom: $media-level-1-content-spacing
.media
padding-top: $media-level-2-spacing
& + .media
margin-top: $media-level-2-spacing
& + .media
border-top: $media-border-size solid $media-border-color
margin-top: $media-spacing
padding-top: $media-spacing
// Sizes
&.is-large
& + .media
margin-top: $media-spacing-large
padding-top: $media-spacing-large
.media-left,
.media-right
flex-basis: auto
flex-grow: 0
flex-shrink: 0
.media-left
+ltr-property("margin", $media-spacing)
.media-right
+ltr-property("margin", $media-spacing, false)
.media-content
flex-basis: auto
flex-grow: 1
flex-shrink: 1
text-align: inherit
+mobile
.media-content
overflow-x: auto

View File

@ -0,0 +1,59 @@
@import "../utilities/mixins"
$menu-item-color: $text !default
$menu-item-radius: $radius-small !default
$menu-item-hover-color: $text-strong !default
$menu-item-hover-background-color: $background !default
$menu-item-active-color: $link-invert !default
$menu-item-active-background-color: $link !default
$menu-list-border-left: 1px solid $border !default
$menu-list-line-height: 1.25 !default
$menu-list-link-padding: 0.5em 0.75em !default
$menu-nested-list-margin: 0.75em !default
$menu-nested-list-padding-left: 0.75em !default
$menu-label-color: $text-light !default
$menu-label-font-size: 0.75em !default
$menu-label-letter-spacing: 0.1em !default
$menu-label-spacing: 1em !default
.menu
font-size: $size-normal
// Sizes
&.is-small
font-size: $size-small
&.is-medium
font-size: $size-medium
&.is-large
font-size: $size-large
.menu-list
line-height: $menu-list-line-height
a
border-radius: $menu-item-radius
color: $menu-item-color
display: block
padding: $menu-list-link-padding
&:hover
background-color: $menu-item-hover-background-color
color: $menu-item-hover-color
// Modifiers
&.is-active
background-color: $menu-item-active-background-color
color: $menu-item-active-color
li
ul
+ltr-property("border", $menu-list-border-left, false)
margin: $menu-nested-list-margin
+ltr-property("padding", $menu-nested-list-padding-left, false)
.menu-label
color: $menu-label-color
font-size: $menu-label-font-size
letter-spacing: $menu-label-letter-spacing
text-transform: uppercase
&:not(:first-child)
margin-top: $menu-label-spacing
&:not(:last-child)
margin-bottom: $menu-label-spacing

View File

@ -0,0 +1,101 @@
@import "../utilities/mixins"
$message-background-color: $background !default
$message-radius: $radius !default
$message-header-background-color: $text !default
$message-header-color: $text-invert !default
$message-header-weight: $weight-bold !default
$message-header-padding: 0.75em 1em !default
$message-header-radius: $radius !default
$message-body-border-color: $border !default
$message-body-border-width: 0 0 0 4px !default
$message-body-color: $text !default
$message-body-padding: 1.25em 1.5em !default
$message-body-radius: $radius !default
$message-body-pre-background-color: $scheme-main !default
$message-body-pre-code-background-color: transparent !default
$message-header-body-border-width: 0 !default
$message-colors: $colors !default
.message
@extend %block
background-color: $message-background-color
border-radius: $message-radius
font-size: $size-normal
strong
color: currentColor
a:not(.button):not(.tag):not(.dropdown-item)
color: currentColor
text-decoration: underline
// Sizes
&.is-small
font-size: $size-small
&.is-medium
font-size: $size-medium
&.is-large
font-size: $size-large
// Colors
@each $name, $components in $message-colors
$color: nth($components, 1)
$color-invert: nth($components, 2)
$color-light: null
$color-dark: null
@if length($components) >= 3
$color-light: nth($components, 3)
@if length($components) >= 4
$color-dark: nth($components, 4)
@else
$color-luminance: colorLuminance($color)
$darken-percentage: $color-luminance * 70%
$desaturate-percentage: $color-luminance * 30%
$color-dark: desaturate(darken($color, $darken-percentage), $desaturate-percentage)
@else
$color-lightning: max((100% - lightness($color)) - 2%, 0%)
$color-light: lighten($color, $color-lightning)
&.is-#{$name}
background-color: $color-light
.message-header
background-color: $color
color: $color-invert
.message-body
border-color: $color
color: $color-dark
.message-header
align-items: center
background-color: $message-header-background-color
border-radius: $message-header-radius $message-header-radius 0 0
color: $message-header-color
display: flex
font-weight: $message-header-weight
justify-content: space-between
line-height: 1.25
padding: $message-header-padding
position: relative
.delete
flex-grow: 0
flex-shrink: 0
+ltr-property("margin", 0.75em, false)
& + .message-body
border-width: $message-header-body-border-width
border-top-left-radius: 0
border-top-right-radius: 0
.message-body
border-color: $message-body-border-color
border-radius: $message-body-radius
border-style: solid
border-width: $message-body-border-width
color: $message-body-color
padding: $message-body-padding
code,
pre
background-color: $message-body-pre-background-color
pre code
background-color: $message-body-pre-code-background-color

View File

@ -0,0 +1,117 @@
@import "../utilities/mixins"
$modal-z: 40 !default
$modal-background-background-color: bulmaRgba($scheme-invert, 0.86) !default
$modal-content-width: 640px !default
$modal-content-margin-mobile: 20px !default
$modal-content-spacing-mobile: 160px !default
$modal-content-spacing-tablet: 40px !default
$modal-close-dimensions: 40px !default
$modal-close-right: 20px !default
$modal-close-top: 20px !default
$modal-card-spacing: 40px !default
$modal-card-head-background-color: $background !default
$modal-card-head-border-bottom: 1px solid $border !default
$modal-card-head-padding: 20px !default
$modal-card-head-radius: $radius-large !default
$modal-card-title-color: $text-strong !default
$modal-card-title-line-height: 1 !default
$modal-card-title-size: $size-4 !default
$modal-card-foot-radius: $radius-large !default
$modal-card-foot-border-top: 1px solid $border !default
$modal-card-body-background-color: $scheme-main !default
$modal-card-body-padding: 20px !default
$modal-breakpoint: $tablet !default
.modal
@extend %overlay
align-items: center
display: none
flex-direction: column
justify-content: center
overflow: hidden
position: fixed
z-index: $modal-z
// Modifiers
&.is-active
display: flex
.modal-background
@extend %overlay
background-color: $modal-background-background-color
.modal-content,
.modal-card
margin: 0 $modal-content-margin-mobile
max-height: calc(100vh - #{$modal-content-spacing-mobile})
overflow: auto
position: relative
width: 100%
// Responsiveness
+from($modal-breakpoint)
margin: 0 auto
max-height: calc(100vh - #{$modal-content-spacing-tablet})
width: $modal-content-width
.modal-close
@extend %delete
background: none
height: $modal-close-dimensions
position: fixed
+ltr-position($modal-close-right)
top: $modal-close-top
width: $modal-close-dimensions
.modal-card
display: flex
flex-direction: column
max-height: calc(100vh - #{$modal-card-spacing})
overflow: hidden
-ms-overflow-y: visible
.modal-card-head,
.modal-card-foot
align-items: center
background-color: $modal-card-head-background-color
display: flex
flex-shrink: 0
justify-content: flex-start
padding: $modal-card-head-padding
position: relative
.modal-card-head
border-bottom: $modal-card-head-border-bottom
border-top-left-radius: $modal-card-head-radius
border-top-right-radius: $modal-card-head-radius
.modal-card-title
color: $modal-card-title-color
flex-grow: 1
flex-shrink: 0
font-size: $modal-card-title-size
line-height: $modal-card-title-line-height
.modal-card-foot
border-bottom-left-radius: $modal-card-foot-radius
border-bottom-right-radius: $modal-card-foot-radius
border-top: $modal-card-foot-border-top
.button
&:not(:last-child)
+ltr-property("margin", 0.5em)
.modal-card-body
+overflow-touch
background-color: $modal-card-body-background-color
flex-grow: 1
flex-shrink: 1
overflow: auto
padding: $modal-card-body-padding

View File

@ -0,0 +1,446 @@
@import "../utilities/mixins"
$navbar-background-color: $scheme-main !default
$navbar-box-shadow-size: 0 2px 0 0 !default
$navbar-box-shadow-color: $background !default
$navbar-height: 3.25rem !default
$navbar-padding-vertical: 1rem !default
$navbar-padding-horizontal: 2rem !default
$navbar-z: 30 !default
$navbar-fixed-z: 30 !default
$navbar-item-color: $text !default
$navbar-item-hover-color: $link !default
$navbar-item-hover-background-color: $scheme-main-bis !default
$navbar-item-active-color: $scheme-invert !default
$navbar-item-active-background-color: transparent !default
$navbar-item-img-max-height: 1.75rem !default
$navbar-burger-color: $navbar-item-color !default
$navbar-tab-hover-background-color: transparent !default
$navbar-tab-hover-border-bottom-color: $link !default
$navbar-tab-active-color: $link !default
$navbar-tab-active-background-color: transparent !default
$navbar-tab-active-border-bottom-color: $link !default
$navbar-tab-active-border-bottom-style: solid !default
$navbar-tab-active-border-bottom-width: 3px !default
$navbar-dropdown-background-color: $scheme-main !default
$navbar-dropdown-border-top: 2px solid $border !default
$navbar-dropdown-offset: -4px !default
$navbar-dropdown-arrow: $link !default
$navbar-dropdown-radius: $radius-large !default
$navbar-dropdown-z: 20 !default
$navbar-dropdown-boxed-radius: $radius-large !default
$navbar-dropdown-boxed-shadow: 0 8px 8px bulmaRgba($scheme-invert, 0.1), 0 0 0 1px bulmaRgba($scheme-invert, 0.1) !default
$navbar-dropdown-item-hover-color: $scheme-invert !default
$navbar-dropdown-item-hover-background-color: $background !default
$navbar-dropdown-item-active-color: $link !default
$navbar-dropdown-item-active-background-color: $background !default
$navbar-divider-background-color: $background !default
$navbar-divider-height: 2px !default
$navbar-bottom-box-shadow-size: 0 -2px 0 0 !default
$navbar-breakpoint: $desktop !default
$navbar-colors: $colors !default
=navbar-fixed
left: 0
position: fixed
right: 0
z-index: $navbar-fixed-z
.navbar
background-color: $navbar-background-color
min-height: $navbar-height
position: relative
z-index: $navbar-z
@each $name, $pair in $navbar-colors
$color: nth($pair, 1)
$color-invert: nth($pair, 2)
&.is-#{$name}
background-color: $color
color: $color-invert
.navbar-brand
& > .navbar-item,
.navbar-link
color: $color-invert
& > a.navbar-item,
.navbar-link
&:focus,
&:hover,
&.is-active
background-color: bulmaDarken($color, 5%)
color: $color-invert
.navbar-link
&::after
border-color: $color-invert
.navbar-burger
color: $color-invert
+from($navbar-breakpoint)
.navbar-start,
.navbar-end
& > .navbar-item,
.navbar-link
color: $color-invert
& > a.navbar-item,
.navbar-link
&:focus,
&:hover,
&.is-active
background-color: bulmaDarken($color, 5%)
color: $color-invert
.navbar-link
&::after
border-color: $color-invert
.navbar-item.has-dropdown:focus .navbar-link,
.navbar-item.has-dropdown:hover .navbar-link,
.navbar-item.has-dropdown.is-active .navbar-link
background-color: bulmaDarken($color, 5%)
color: $color-invert
.navbar-dropdown
a.navbar-item
&.is-active
background-color: $color
color: $color-invert
& > .container
align-items: stretch
display: flex
min-height: $navbar-height
width: 100%
&.has-shadow
box-shadow: $navbar-box-shadow-size $navbar-box-shadow-color
&.is-fixed-bottom,
&.is-fixed-top
+navbar-fixed
&.is-fixed-bottom
bottom: 0
&.has-shadow
box-shadow: $navbar-bottom-box-shadow-size $navbar-box-shadow-color
&.is-fixed-top
top: 0
html,
body
&.has-navbar-fixed-top
padding-top: $navbar-height
&.has-navbar-fixed-bottom
padding-bottom: $navbar-height
.navbar-brand,
.navbar-tabs
align-items: stretch
display: flex
flex-shrink: 0
min-height: $navbar-height
.navbar-brand
a.navbar-item
&:focus,
&:hover
background-color: transparent
.navbar-tabs
+overflow-touch
max-width: 100vw
overflow-x: auto
overflow-y: hidden
.navbar-burger
@extend %reset
color: $navbar-burger-color
+hamburger($navbar-height)
+ltr-property("margin", auto, false)
.navbar-menu
display: none
.navbar-item,
.navbar-link
color: $navbar-item-color
display: block
line-height: 1.5
padding: 0.5rem 0.75rem
position: relative
.icon
&:only-child
margin-left: -0.25rem
margin-right: -0.25rem
a.navbar-item,
.navbar-link
cursor: pointer
&:focus,
&:focus-within,
&:hover,
&.is-active
background-color: $navbar-item-hover-background-color
color: $navbar-item-hover-color
.navbar-item
flex-grow: 0
flex-shrink: 0
img
max-height: $navbar-item-img-max-height
&.has-dropdown
padding: 0
&.is-expanded
flex-grow: 1
flex-shrink: 1
&.is-tab
border-bottom: 1px solid transparent
min-height: $navbar-height
padding-bottom: calc(0.5rem - 1px)
&:focus,
&:hover
background-color: $navbar-tab-hover-background-color
border-bottom-color: $navbar-tab-hover-border-bottom-color
&.is-active
background-color: $navbar-tab-active-background-color
border-bottom-color: $navbar-tab-active-border-bottom-color
border-bottom-style: $navbar-tab-active-border-bottom-style
border-bottom-width: $navbar-tab-active-border-bottom-width
color: $navbar-tab-active-color
padding-bottom: calc(0.5rem - #{$navbar-tab-active-border-bottom-width})
.navbar-content
flex-grow: 1
flex-shrink: 1
.navbar-link:not(.is-arrowless)
+ltr-property("padding", 2.5em)
&::after
@extend %arrow
border-color: $navbar-dropdown-arrow
margin-top: -0.375em
+ltr-position(1.125em)
.navbar-dropdown
font-size: 0.875rem
padding-bottom: 0.5rem
padding-top: 0.5rem
.navbar-item
padding-left: 1.5rem
padding-right: 1.5rem
.navbar-divider
background-color: $navbar-divider-background-color
border: none
display: none
height: $navbar-divider-height
margin: 0.5rem 0
+until($navbar-breakpoint)
.navbar > .container
display: block
.navbar-brand,
.navbar-tabs
.navbar-item
align-items: center
display: flex
.navbar-link
&::after
display: none
.navbar-menu
background-color: $navbar-background-color
box-shadow: 0 8px 16px bulmaRgba($scheme-invert, 0.1)
padding: 0.5rem 0
&.is-active
display: block
// Fixed navbar
.navbar
&.is-fixed-bottom-touch,
&.is-fixed-top-touch
+navbar-fixed
&.is-fixed-bottom-touch
bottom: 0
&.has-shadow
box-shadow: 0 -2px 3px bulmaRgba($scheme-invert, 0.1)
&.is-fixed-top-touch
top: 0
&.is-fixed-top,
&.is-fixed-top-touch
.navbar-menu
+overflow-touch
max-height: calc(100vh - #{$navbar-height})
overflow: auto
html,
body
&.has-navbar-fixed-top-touch
padding-top: $navbar-height
&.has-navbar-fixed-bottom-touch
padding-bottom: $navbar-height
+from($navbar-breakpoint)
.navbar,
.navbar-menu,
.navbar-start,
.navbar-end
align-items: stretch
display: flex
.navbar
min-height: $navbar-height
&.is-spaced
padding: $navbar-padding-vertical $navbar-padding-horizontal
.navbar-start,
.navbar-end
align-items: center
a.navbar-item,
.navbar-link
border-radius: $radius
&.is-transparent
a.navbar-item,
.navbar-link
&:focus,
&:hover,
&.is-active
background-color: transparent !important
.navbar-item.has-dropdown
&.is-active,
&.is-hoverable:focus,
&.is-hoverable:focus-within,
&.is-hoverable:hover
.navbar-link
background-color: transparent !important
.navbar-dropdown
a.navbar-item
&:focus,
&:hover
background-color: $navbar-dropdown-item-hover-background-color
color: $navbar-dropdown-item-hover-color
&.is-active
background-color: $navbar-dropdown-item-active-background-color
color: $navbar-dropdown-item-active-color
.navbar-burger
display: none
.navbar-item,
.navbar-link
align-items: center
display: flex
.navbar-item
&.has-dropdown
align-items: stretch
&.has-dropdown-up
.navbar-link::after
transform: rotate(135deg) translate(0.25em, -0.25em)
.navbar-dropdown
border-bottom: $navbar-dropdown-border-top
border-radius: $navbar-dropdown-radius $navbar-dropdown-radius 0 0
border-top: none
bottom: 100%
box-shadow: 0 -8px 8px bulmaRgba($scheme-invert, 0.1)
top: auto
&.is-active,
&.is-hoverable:focus,
&.is-hoverable:focus-within,
&.is-hoverable:hover
.navbar-dropdown
display: block
.navbar.is-spaced &,
&.is-boxed
opacity: 1
pointer-events: auto
transform: translateY(0)
.navbar-menu
flex-grow: 1
flex-shrink: 0
.navbar-start
justify-content: flex-start
+ltr-property("margin", auto)
.navbar-end
justify-content: flex-end
+ltr-property("margin", auto, false)
.navbar-dropdown
background-color: $navbar-dropdown-background-color
border-bottom-left-radius: $navbar-dropdown-radius
border-bottom-right-radius: $navbar-dropdown-radius
border-top: $navbar-dropdown-border-top
box-shadow: 0 8px 8px bulmaRgba($scheme-invert, 0.1)
display: none
font-size: 0.875rem
+ltr-position(0, false)
min-width: 100%
position: absolute
top: 100%
z-index: $navbar-dropdown-z
.navbar-item
padding: 0.375rem 1rem
white-space: nowrap
a.navbar-item
+ltr-property("padding", 3rem)
&:focus,
&:hover
background-color: $navbar-dropdown-item-hover-background-color
color: $navbar-dropdown-item-hover-color
&.is-active
background-color: $navbar-dropdown-item-active-background-color
color: $navbar-dropdown-item-active-color
.navbar.is-spaced &,
&.is-boxed
border-radius: $navbar-dropdown-boxed-radius
border-top: none
box-shadow: $navbar-dropdown-boxed-shadow
display: block
opacity: 0
pointer-events: none
top: calc(100% + (#{$navbar-dropdown-offset}))
transform: translateY(-5px)
transition-duration: $speed
transition-property: opacity, transform
&.is-right
left: auto
right: 0
.navbar-divider
display: block
.navbar > .container,
.container > .navbar
.navbar-brand
+ltr-property("margin", -.75rem, false)
.navbar-menu
+ltr-property("margin", -.75rem)
// Fixed navbar
.navbar
&.is-fixed-bottom-desktop,
&.is-fixed-top-desktop
+navbar-fixed
&.is-fixed-bottom-desktop
bottom: 0
&.has-shadow
box-shadow: 0 -2px 3px bulmaRgba($scheme-invert, 0.1)
&.is-fixed-top-desktop
top: 0
html,
body
&.has-navbar-fixed-top-desktop
padding-top: $navbar-height
&.has-navbar-fixed-bottom-desktop
padding-bottom: $navbar-height
&.has-spaced-navbar-fixed-top
padding-top: $navbar-height + ($navbar-padding-vertical * 2)
&.has-spaced-navbar-fixed-bottom
padding-bottom: $navbar-height + ($navbar-padding-vertical * 2)
// Hover/Active states
a.navbar-item,
.navbar-link
&.is-active
color: $navbar-item-active-color
&.is-active:not(:focus):not(:hover)
background-color: $navbar-item-active-background-color
.navbar-item.has-dropdown
&:focus,
&:hover,
&.is-active
.navbar-link
background-color: $navbar-item-hover-background-color
// Combination
.hero
&.is-fullheight-with-navbar
min-height: calc(100vh - #{$navbar-height})

View File

@ -0,0 +1,166 @@
@import "../utilities/controls"
@import "../utilities/mixins"
$pagination-color: $text-strong !default
$pagination-border-color: $border !default
$pagination-margin: -0.25rem !default
$pagination-min-width: $control-height !default
$pagination-item-font-size: 1em !default
$pagination-item-margin: 0.25rem !default
$pagination-item-padding-left: 0.5em !default
$pagination-item-padding-right: 0.5em !default
$pagination-nav-padding-left: 0.75em !default
$pagination-nav-padding-right: 0.75em !default
$pagination-hover-color: $link-hover !default
$pagination-hover-border-color: $link-hover-border !default
$pagination-focus-color: $link-focus !default
$pagination-focus-border-color: $link-focus-border !default
$pagination-active-color: $link-active !default
$pagination-active-border-color: $link-active-border !default
$pagination-disabled-color: $text-light !default
$pagination-disabled-background-color: $border !default
$pagination-disabled-border-color: $border !default
$pagination-current-color: $link-invert !default
$pagination-current-background-color: $link !default
$pagination-current-border-color: $link !default
$pagination-ellipsis-color: $grey-light !default
$pagination-shadow-inset: inset 0 1px 2px rgba($scheme-invert, 0.2) !default
.pagination
@extend %block
font-size: $size-normal
margin: $pagination-margin
// Sizes
&.is-small
font-size: $size-small
&.is-medium
font-size: $size-medium
&.is-large
font-size: $size-large
&.is-rounded
.pagination-previous,
.pagination-next
padding-left: 1em
padding-right: 1em
border-radius: $radius-rounded
.pagination-link
border-radius: $radius-rounded
.pagination,
.pagination-list
align-items: center
display: flex
justify-content: center
text-align: center
.pagination-previous,
.pagination-next,
.pagination-link,
.pagination-ellipsis
@extend %control
@extend %unselectable
font-size: $pagination-item-font-size
justify-content: center
margin: $pagination-item-margin
padding-left: $pagination-item-padding-left
padding-right: $pagination-item-padding-right
text-align: center
.pagination-previous,
.pagination-next,
.pagination-link
border-color: $pagination-border-color
color: $pagination-color
min-width: $pagination-min-width
&:hover
border-color: $pagination-hover-border-color
color: $pagination-hover-color
&:focus
border-color: $pagination-focus-border-color
&:active
box-shadow: $pagination-shadow-inset
&[disabled]
background-color: $pagination-disabled-background-color
border-color: $pagination-disabled-border-color
box-shadow: none
color: $pagination-disabled-color
opacity: 0.5
.pagination-previous,
.pagination-next
padding-left: $pagination-nav-padding-left
padding-right: $pagination-nav-padding-right
white-space: nowrap
.pagination-link
&.is-current
background-color: $pagination-current-background-color
border-color: $pagination-current-border-color
color: $pagination-current-color
.pagination-ellipsis
color: $pagination-ellipsis-color
pointer-events: none
.pagination-list
flex-wrap: wrap
li
list-style: none
+mobile
.pagination
flex-wrap: wrap
.pagination-previous,
.pagination-next
flex-grow: 1
flex-shrink: 1
.pagination-list
li
flex-grow: 1
flex-shrink: 1
+tablet
.pagination-list
flex-grow: 1
flex-shrink: 1
justify-content: flex-start
order: 1
.pagination-previous,
.pagination-next,
.pagination-link,
.pagination-ellipsis
margin-bottom: 0
margin-top: 0
.pagination-previous
order: 2
.pagination-next
order: 3
.pagination
justify-content: space-between
margin-bottom: 0
margin-top: 0
&.is-centered
.pagination-previous
order: 1
.pagination-list
justify-content: center
order: 2
.pagination-next
order: 3
&.is-right
.pagination-previous
order: 1
.pagination-next
order: 2
.pagination-list
justify-content: flex-end
order: 3

View File

@ -0,0 +1,121 @@
@import "../utilities/mixins"
$panel-margin: $block-spacing !default
$panel-item-border: 1px solid $border-light !default
$panel-radius: $radius-large !default
$panel-shadow: $shadow !default
$panel-heading-background-color: $border-light !default
$panel-heading-color: $text-strong !default
$panel-heading-line-height: 1.25 !default
$panel-heading-padding: 0.75em 1em !default
$panel-heading-radius: $radius !default
$panel-heading-size: 1.25em !default
$panel-heading-weight: $weight-bold !default
$panel-tabs-font-size: 0.875em !default
$panel-tab-border-bottom: 1px solid $border !default
$panel-tab-active-border-bottom-color: $link-active-border !default
$panel-tab-active-color: $link-active !default
$panel-list-item-color: $text !default
$panel-list-item-hover-color: $link !default
$panel-block-color: $text-strong !default
$panel-block-hover-background-color: $background !default
$panel-block-active-border-left-color: $link !default
$panel-block-active-color: $link-active !default
$panel-block-active-icon-color: $link !default
$panel-icon-color: $text-light !default
$panel-colors: $colors !default
.panel
border-radius: $panel-radius
box-shadow: $panel-shadow
font-size: $size-normal
&:not(:last-child)
margin-bottom: $panel-margin
// Colors
@each $name, $components in $panel-colors
$color: nth($components, 1)
$color-invert: nth($components, 2)
&.is-#{$name}
.panel-heading
background-color: $color
color: $color-invert
.panel-tabs a.is-active
border-bottom-color: $color
.panel-block.is-active .panel-icon
color: $color
.panel-tabs,
.panel-block
&:not(:last-child)
border-bottom: $panel-item-border
.panel-heading
background-color: $panel-heading-background-color
border-radius: $panel-radius $panel-radius 0 0
color: $panel-heading-color
font-size: $panel-heading-size
font-weight: $panel-heading-weight
line-height: $panel-heading-line-height
padding: $panel-heading-padding
.panel-tabs
align-items: flex-end
display: flex
font-size: $panel-tabs-font-size
justify-content: center
a
border-bottom: $panel-tab-border-bottom
margin-bottom: -1px
padding: 0.5em
// Modifiers
&.is-active
border-bottom-color: $panel-tab-active-border-bottom-color
color: $panel-tab-active-color
.panel-list
a
color: $panel-list-item-color
&:hover
color: $panel-list-item-hover-color
.panel-block
align-items: center
color: $panel-block-color
display: flex
justify-content: flex-start
padding: 0.5em 0.75em
input[type="checkbox"]
+ltr-property("margin", 0.75em)
& > .control
flex-grow: 1
flex-shrink: 1
width: 100%
&.is-wrapped
flex-wrap: wrap
&.is-active
border-left-color: $panel-block-active-border-left-color
color: $panel-block-active-color
.panel-icon
color: $panel-block-active-icon-color
&:last-child
border-bottom-left-radius: $panel-radius
border-bottom-right-radius: $panel-radius
a.panel-block,
label.panel-block
cursor: pointer
&:hover
background-color: $panel-block-hover-background-color
.panel-icon
+fa(14px, 1em)
color: $panel-icon-color
+ltr-property("margin", 0.75em)
.fa
font-size: inherit
line-height: inherit

View File

@ -0,0 +1,176 @@
@import "../utilities/mixins"
$tabs-border-bottom-color: $border !default
$tabs-border-bottom-style: solid !default
$tabs-border-bottom-width: 1px !default
$tabs-link-color: $text !default
$tabs-link-hover-border-bottom-color: $text-strong !default
$tabs-link-hover-color: $text-strong !default
$tabs-link-active-border-bottom-color: $link !default
$tabs-link-active-color: $link !default
$tabs-link-padding: 0.5em 1em !default
$tabs-boxed-link-radius: $radius !default
$tabs-boxed-link-hover-background-color: $background !default
$tabs-boxed-link-hover-border-bottom-color: $border !default
$tabs-boxed-link-active-background-color: $scheme-main !default
$tabs-boxed-link-active-border-color: $border !default
$tabs-boxed-link-active-border-bottom-color: transparent !default
$tabs-toggle-link-border-color: $border !default
$tabs-toggle-link-border-style: solid !default
$tabs-toggle-link-border-width: 1px !default
$tabs-toggle-link-hover-background-color: $background !default
$tabs-toggle-link-hover-border-color: $border-hover !default
$tabs-toggle-link-radius: $radius !default
$tabs-toggle-link-active-background-color: $link !default
$tabs-toggle-link-active-border-color: $link !default
$tabs-toggle-link-active-color: $link-invert !default
.tabs
@extend %block
+overflow-touch
@extend %unselectable
align-items: stretch
display: flex
font-size: $size-normal
justify-content: space-between
overflow: hidden
overflow-x: auto
white-space: nowrap
a
align-items: center
border-bottom-color: $tabs-border-bottom-color
border-bottom-style: $tabs-border-bottom-style
border-bottom-width: $tabs-border-bottom-width
color: $tabs-link-color
display: flex
justify-content: center
margin-bottom: -#{$tabs-border-bottom-width}
padding: $tabs-link-padding
vertical-align: top
&:hover
border-bottom-color: $tabs-link-hover-border-bottom-color
color: $tabs-link-hover-color
li
display: block
&.is-active
a
border-bottom-color: $tabs-link-active-border-bottom-color
color: $tabs-link-active-color
ul
align-items: center
border-bottom-color: $tabs-border-bottom-color
border-bottom-style: $tabs-border-bottom-style
border-bottom-width: $tabs-border-bottom-width
display: flex
flex-grow: 1
flex-shrink: 0
justify-content: flex-start
&.is-left
padding-right: 0.75em
&.is-center
flex: none
justify-content: center
padding-left: 0.75em
padding-right: 0.75em
&.is-right
justify-content: flex-end
padding-left: 0.75em
.icon
&:first-child
+ltr-property("margin", 0.5em)
&:last-child
+ltr-property("margin", 0.5em, false)
// Alignment
&.is-centered
ul
justify-content: center
&.is-right
ul
justify-content: flex-end
// Styles
&.is-boxed
a
border: 1px solid transparent
+ltr
border-radius: $tabs-boxed-link-radius $tabs-boxed-link-radius 0 0
+rtl
border-radius: 0 0 $tabs-boxed-link-radius $tabs-boxed-link-radius
&:hover
background-color: $tabs-boxed-link-hover-background-color
border-bottom-color: $tabs-boxed-link-hover-border-bottom-color
li
&.is-active
a
background-color: $tabs-boxed-link-active-background-color
border-color: $tabs-boxed-link-active-border-color
border-bottom-color: $tabs-boxed-link-active-border-bottom-color !important
&.is-fullwidth
li
flex-grow: 1
flex-shrink: 0
&.is-toggle
a
border-color: $tabs-toggle-link-border-color
border-style: $tabs-toggle-link-border-style
border-width: $tabs-toggle-link-border-width
margin-bottom: 0
position: relative
&:hover
background-color: $tabs-toggle-link-hover-background-color
border-color: $tabs-toggle-link-hover-border-color
z-index: 2
li
& + li
+ltr-property("margin", -#{$tabs-toggle-link-border-width}, false)
&:first-child a
+ltr
border-top-left-radius: $tabs-toggle-link-radius
border-bottom-left-radius: $tabs-toggle-link-radius
+rtl
border-top-right-radius: $tabs-toggle-link-radius
border-bottom-right-radius: $tabs-toggle-link-radius
&:last-child a
+ltr
border-top-right-radius: $tabs-toggle-link-radius
border-bottom-right-radius: $tabs-toggle-link-radius
+rtl
border-top-left-radius: $tabs-toggle-link-radius
border-bottom-left-radius: $tabs-toggle-link-radius
&.is-active
a
background-color: $tabs-toggle-link-active-background-color
border-color: $tabs-toggle-link-active-border-color
color: $tabs-toggle-link-active-color
z-index: 1
ul
border-bottom: none
&.is-toggle-rounded
li
&:first-child a
+ltr
border-bottom-left-radius: $radius-rounded
border-top-left-radius: $radius-rounded
padding-left: 1.25em
+rtl
border-bottom-right-radius: $radius-rounded
border-top-right-radius: $radius-rounded
padding-right: 1.25em
&:last-child a
+ltr
border-bottom-right-radius: $radius-rounded
border-top-right-radius: $radius-rounded
padding-right: 1.25em
+rtl
border-bottom-left-radius: $radius-rounded
border-top-left-radius: $radius-rounded
padding-left: 1.25em
// Sizes
&.is-small
font-size: $size-small
&.is-medium
font-size: $size-medium
&.is-large
font-size: $size-large

View File

@ -0,0 +1,16 @@
/* Bulma Elements */
@charset "utf-8"
@import "box"
@import "button"
@import "container"
@import "content"
@import "icon"
@import "image"
@import "notification"
@import "progress"
@import "table"
@import "tag"
@import "title"
@import "other"

View File

@ -0,0 +1,26 @@
@import "../utilities/mixins"
$box-color: $text !default
$box-background-color: $scheme-main !default
$box-radius: $radius-large !default
$box-shadow: $shadow !default
$box-padding: 1.25rem !default
$box-link-hover-shadow: 0 0.5em 1em -0.125em rgba($scheme-invert, 0.1), 0 0 0 1px $link !default
$box-link-active-shadow: inset 0 1px 2px rgba($scheme-invert, 0.2), 0 0 0 1px $link !default
.box
@extend %block
background-color: $box-background-color
border-radius: $box-radius
box-shadow: $box-shadow
color: $box-color
display: block
padding: $box-padding
a.box
&:hover,
&:focus
box-shadow: $box-link-hover-shadow
&:active
box-shadow: $box-link-active-shadow

View File

@ -0,0 +1,345 @@
@import "../utilities/controls"
@import "../utilities/mixins"
$button-color: $text-strong !default
$button-background-color: $scheme-main !default
$button-family: false !default
$button-border-color: $border !default
$button-border-width: $control-border-width !default
$button-padding-vertical: calc(0.5em - #{$button-border-width}) !default
$button-padding-horizontal: 1em !default
$button-hover-color: $link-hover !default
$button-hover-border-color: $link-hover-border !default
$button-focus-color: $link-focus !default
$button-focus-border-color: $link-focus-border !default
$button-focus-box-shadow-size: 0 0 0 0.125em !default
$button-focus-box-shadow-color: bulmaRgba($link, 0.25) !default
$button-active-color: $link-active !default
$button-active-border-color: $link-active-border !default
$button-text-color: $text !default
$button-text-decoration: underline !default
$button-text-hover-background-color: $background !default
$button-text-hover-color: $text-strong !default
$button-ghost-background: none !default
$button-ghost-border-color: transparent !default
$button-ghost-color: $link !default
$button-ghost-decoration: none !default
$button-ghost-hover-color: $link !default
$button-ghost-hover-decoration: underline !default
$button-disabled-background-color: $scheme-main !default
$button-disabled-border-color: $border !default
$button-disabled-shadow: none !default
$button-disabled-opacity: 0.5 !default
$button-static-color: $text-light !default
$button-static-background-color: $scheme-main-ter !default
$button-static-border-color: $border !default
$button-colors: $colors !default
// The button sizes use mixins so they can be used at different breakpoints
=button-small
&:not(.is-rounded)
border-radius: $radius-small
font-size: $size-small
=button-normal
font-size: $size-normal
=button-medium
font-size: $size-medium
=button-large
font-size: $size-large
.button
@extend %control
@extend %unselectable
background-color: $button-background-color
border-color: $button-border-color
border-width: $button-border-width
color: $button-color
cursor: pointer
@if $button-family
font-family: $button-family
justify-content: center
padding-bottom: $button-padding-vertical
padding-left: $button-padding-horizontal
padding-right: $button-padding-horizontal
padding-top: $button-padding-vertical
text-align: center
white-space: nowrap
strong
color: inherit
.icon
&,
&.is-small,
&.is-medium,
&.is-large
height: 1.5em
width: 1.5em
&:first-child:not(:last-child)
+ltr-property("margin", calc(#{-0.5 * $button-padding-horizontal} - #{$button-border-width}), false)
+ltr-property("margin", $button-padding-horizontal * 0.25)
&:last-child:not(:first-child)
+ltr-property("margin", $button-padding-horizontal * 0.25, false)
+ltr-property("margin", calc(#{-0.5 * $button-padding-horizontal} - #{$button-border-width}))
&:first-child:last-child
margin-left: calc(#{-0.5 * $button-padding-horizontal} - #{$button-border-width})
margin-right: calc(#{-0.5 * $button-padding-horizontal} - #{$button-border-width})
// States
&:hover,
&.is-hovered
border-color: $button-hover-border-color
color: $button-hover-color
&:focus,
&.is-focused
border-color: $button-focus-border-color
color: $button-focus-color
&:not(:active)
box-shadow: $button-focus-box-shadow-size $button-focus-box-shadow-color
&:active,
&.is-active
border-color: $button-active-border-color
color: $button-active-color
// Colors
&.is-text
background-color: transparent
border-color: transparent
color: $button-text-color
text-decoration: $button-text-decoration
&:hover,
&.is-hovered,
&:focus,
&.is-focused
background-color: $button-text-hover-background-color
color: $button-text-hover-color
&:active,
&.is-active
background-color: bulmaDarken($button-text-hover-background-color, 5%)
color: $button-text-hover-color
&[disabled],
fieldset[disabled] &
background-color: transparent
border-color: transparent
box-shadow: none
&.is-ghost
background: $button-ghost-background
border-color: $button-ghost-border-color
color: $button-ghost-color
text-decoration: $button-ghost-decoration
&:hover,
&.is-hovered
color: $button-ghost-hover-color
text-decoration: $button-ghost-hover-decoration
@each $name, $pair in $button-colors
$color: nth($pair, 1)
$color-invert: nth($pair, 2)
&.is-#{$name}
background-color: $color
border-color: transparent
color: $color-invert
&:hover,
&.is-hovered
background-color: bulmaDarken($color, 2.5%)
border-color: transparent
color: $color-invert
&:focus,
&.is-focused
border-color: transparent
color: $color-invert
&:not(:active)
box-shadow: $button-focus-box-shadow-size bulmaRgba($color, 0.25)
&:active,
&.is-active
background-color: bulmaDarken($color, 5%)
border-color: transparent
color: $color-invert
&[disabled],
fieldset[disabled] &
background-color: $color
border-color: transparent
box-shadow: none
&.is-inverted
background-color: $color-invert
color: $color
&:hover,
&.is-hovered
background-color: bulmaDarken($color-invert, 5%)
&[disabled],
fieldset[disabled] &
background-color: $color-invert
border-color: transparent
box-shadow: none
color: $color
&.is-loading
&::after
border-color: transparent transparent $color-invert $color-invert !important
&.is-outlined
background-color: transparent
border-color: $color
color: $color
&:hover,
&.is-hovered,
&:focus,
&.is-focused
background-color: $color
border-color: $color
color: $color-invert
&.is-loading
&::after
border-color: transparent transparent $color $color !important
&:hover,
&.is-hovered,
&:focus,
&.is-focused
&::after
border-color: transparent transparent $color-invert $color-invert !important
&[disabled],
fieldset[disabled] &
background-color: transparent
border-color: $color
box-shadow: none
color: $color
&.is-inverted.is-outlined
background-color: transparent
border-color: $color-invert
color: $color-invert
&:hover,
&.is-hovered,
&:focus,
&.is-focused
background-color: $color-invert
color: $color
&.is-loading
&:hover,
&.is-hovered,
&:focus,
&.is-focused
&::after
border-color: transparent transparent $color $color !important
&[disabled],
fieldset[disabled] &
background-color: transparent
border-color: $color-invert
box-shadow: none
color: $color-invert
// If light and dark colors are provided
@if length($pair) >= 4
$color-light: nth($pair, 3)
$color-dark: nth($pair, 4)
&.is-light
background-color: $color-light
color: $color-dark
&:hover,
&.is-hovered
background-color: bulmaDarken($color-light, 2.5%)
border-color: transparent
color: $color-dark
&:active,
&.is-active
background-color: bulmaDarken($color-light, 5%)
border-color: transparent
color: $color-dark
// Sizes
&.is-small
+button-small
&.is-normal
+button-normal
&.is-medium
+button-medium
&.is-large
+button-large
// Modifiers
&[disabled],
fieldset[disabled] &
background-color: $button-disabled-background-color
border-color: $button-disabled-border-color
box-shadow: $button-disabled-shadow
opacity: $button-disabled-opacity
&.is-fullwidth
display: flex
width: 100%
&.is-loading
color: transparent !important
pointer-events: none
&::after
@extend %loader
+center(1em)
position: absolute !important
&.is-static
background-color: $button-static-background-color
border-color: $button-static-border-color
color: $button-static-color
box-shadow: none
pointer-events: none
&.is-rounded
border-radius: $radius-rounded
padding-left: calc(#{$button-padding-horizontal} + 0.25em)
padding-right: calc(#{$button-padding-horizontal} + 0.25em)
.buttons
align-items: center
display: flex
flex-wrap: wrap
justify-content: flex-start
.button
margin-bottom: 0.5rem
&:not(:last-child):not(.is-fullwidth)
+ltr-property("margin", 0.5rem)
&:last-child
margin-bottom: -0.5rem
&:not(:last-child)
margin-bottom: 1rem
// Sizes
&.are-small
.button:not(.is-normal):not(.is-medium):not(.is-large)
+button-small
&.are-medium
.button:not(.is-small):not(.is-normal):not(.is-large)
+button-medium
&.are-large
.button:not(.is-small):not(.is-normal):not(.is-medium)
+button-large
&.has-addons
.button
&:not(:first-child)
border-bottom-left-radius: 0
border-top-left-radius: 0
&:not(:last-child)
border-bottom-right-radius: 0
border-top-right-radius: 0
+ltr-property("margin", -1px)
&:last-child
+ltr-property("margin", 0)
&:hover,
&.is-hovered
z-index: 2
&:focus,
&.is-focused,
&:active,
&.is-active,
&.is-selected
z-index: 3
&:hover
z-index: 4
&.is-expanded
flex-grow: 1
flex-shrink: 1
&.is-centered
justify-content: center
&:not(.has-addons)
.button:not(.is-fullwidth)
margin-left: 0.25rem
margin-right: 0.25rem
&.is-right
justify-content: flex-end
&:not(.has-addons)
.button:not(.is-fullwidth)
margin-left: 0.25rem
margin-right: 0.25rem

View File

@ -0,0 +1,29 @@
@import "../utilities/mixins"
$container-offset: (2 * $gap) !default
$container-max-width: $fullhd !default
.container
flex-grow: 1
margin: 0 auto
position: relative
width: auto
&.is-fluid
max-width: none !important
padding-left: $gap
padding-right: $gap
width: 100%
+desktop
max-width: $desktop - $container-offset
+until-widescreen
&.is-widescreen:not(.is-max-desktop)
max-width: min($widescreen, $container-max-width) - $container-offset
+until-fullhd
&.is-fullhd:not(.is-max-desktop):not(.is-max-widescreen)
max-width: min($fullhd, $container-max-width) - $container-offset
+widescreen
&:not(.is-max-desktop)
max-width: min($widescreen, $container-max-width) - $container-offset
+fullhd
&:not(.is-max-desktop):not(.is-max-widescreen)
max-width: min($fullhd, $container-max-width) - $container-offset

View File

@ -0,0 +1,159 @@
@import "../utilities/mixins"
$content-heading-color: $text-strong !default
$content-heading-weight: $weight-semibold !default
$content-heading-line-height: 1.125 !default
$content-blockquote-background-color: $background !default
$content-blockquote-border-left: 5px solid $border !default
$content-blockquote-padding: 1.25em 1.5em !default
$content-pre-padding: 1.25em 1.5em !default
$content-table-cell-border: 1px solid $border !default
$content-table-cell-border-width: 0 0 1px !default
$content-table-cell-padding: 0.5em 0.75em !default
$content-table-cell-heading-color: $text-strong !default
$content-table-head-cell-border-width: 0 0 2px !default
$content-table-head-cell-color: $text-strong !default
$content-table-foot-cell-border-width: 2px 0 0 !default
$content-table-foot-cell-color: $text-strong !default
.content
@extend %block
// Inline
li + li
margin-top: 0.25em
// Block
p,
dl,
ol,
ul,
blockquote,
pre,
table
&:not(:last-child)
margin-bottom: 1em
h1,
h2,
h3,
h4,
h5,
h6
color: $content-heading-color
font-weight: $content-heading-weight
line-height: $content-heading-line-height
h1
font-size: 2em
margin-bottom: 0.5em
&:not(:first-child)
margin-top: 1em
h2
font-size: 1.75em
margin-bottom: 0.5714em
&:not(:first-child)
margin-top: 1.1428em
h3
font-size: 1.5em
margin-bottom: 0.6666em
&:not(:first-child)
margin-top: 1.3333em
h4
font-size: 1.25em
margin-bottom: 0.8em
h5
font-size: 1.125em
margin-bottom: 0.8888em
h6
font-size: 1em
margin-bottom: 1em
blockquote
background-color: $content-blockquote-background-color
+ltr-property("border", $content-blockquote-border-left, false)
padding: $content-blockquote-padding
ol
list-style-position: outside
+ltr-property("margin", 2em, false)
margin-top: 1em
&:not([type])
list-style-type: decimal
&.is-lower-alpha
list-style-type: lower-alpha
&.is-lower-roman
list-style-type: lower-roman
&.is-upper-alpha
list-style-type: upper-alpha
&.is-upper-roman
list-style-type: upper-roman
ul
list-style: disc outside
+ltr-property("margin", 2em, false)
margin-top: 1em
ul
list-style-type: circle
margin-top: 0.5em
ul
list-style-type: square
dd
+ltr-property("margin", 2em, false)
figure
margin-left: 2em
margin-right: 2em
text-align: center
&:not(:first-child)
margin-top: 2em
&:not(:last-child)
margin-bottom: 2em
img
display: inline-block
figcaption
font-style: italic
pre
+overflow-touch
overflow-x: auto
padding: $content-pre-padding
white-space: pre
word-wrap: normal
sup,
sub
font-size: 75%
table
width: 100%
td,
th
border: $content-table-cell-border
border-width: $content-table-cell-border-width
padding: $content-table-cell-padding
vertical-align: top
th
color: $content-table-cell-heading-color
&:not([align])
text-align: inherit
thead
td,
th
border-width: $content-table-head-cell-border-width
color: $content-table-head-cell-color
tfoot
td,
th
border-width: $content-table-foot-cell-border-width
color: $content-table-foot-cell-color
tbody
tr
&:last-child
td,
th
border-bottom-width: 0
.tabs
li + li
margin-top: 0
// Sizes
&.is-small
font-size: $size-small
&.is-normal
font-size: $size-normal
&.is-medium
font-size: $size-medium
&.is-large
font-size: $size-large

View File

@ -0,0 +1 @@
@warn "The form.sass file is DEPRECATED. It has moved into its own /form folder. Please import sass/form/_all instead."

View File

@ -0,0 +1,46 @@
$icon-dimensions: 1.5rem !default
$icon-dimensions-small: 1rem !default
$icon-dimensions-medium: 2rem !default
$icon-dimensions-large: 3rem !default
$icon-text-spacing: 0.25em !default
.icon
align-items: center
display: inline-flex
justify-content: center
height: $icon-dimensions
width: $icon-dimensions
// Sizes
&.is-small
height: $icon-dimensions-small
width: $icon-dimensions-small
&.is-medium
height: $icon-dimensions-medium
width: $icon-dimensions-medium
&.is-large
height: $icon-dimensions-large
width: $icon-dimensions-large
.icon-text
align-items: flex-start
color: inherit
display: inline-flex
flex-wrap: wrap
line-height: $icon-dimensions
vertical-align: top
.icon
flex-grow: 0
flex-shrink: 0
&:not(:last-child)
+ltr
margin-right: $icon-text-spacing
+rtl
margin-left: $icon-text-spacing
&:not(:first-child)
+ltr
margin-left: $icon-text-spacing
+rtl
margin-right: $icon-text-spacing
div.icon-text
display: flex

View File

@ -0,0 +1,73 @@
@import "../utilities/mixins"
$dimensions: 16 24 32 48 64 96 128 !default
.image
display: block
position: relative
img
display: block
height: auto
width: 100%
&.is-rounded
border-radius: $radius-rounded
&.is-fullwidth
width: 100%
// Ratio
&.is-square,
&.is-1by1,
&.is-5by4,
&.is-4by3,
&.is-3by2,
&.is-5by3,
&.is-16by9,
&.is-2by1,
&.is-3by1,
&.is-4by5,
&.is-3by4,
&.is-2by3,
&.is-3by5,
&.is-9by16,
&.is-1by2,
&.is-1by3
img,
.has-ratio
@extend %overlay
height: 100%
width: 100%
&.is-square,
&.is-1by1
padding-top: 100%
&.is-5by4
padding-top: 80%
&.is-4by3
padding-top: 75%
&.is-3by2
padding-top: 66.6666%
&.is-5by3
padding-top: 60%
&.is-16by9
padding-top: 56.25%
&.is-2by1
padding-top: 50%
&.is-3by1
padding-top: 33.3333%
&.is-4by5
padding-top: 125%
&.is-3by4
padding-top: 133.3333%
&.is-2by3
padding-top: 150%
&.is-3by5
padding-top: 166.6666%
&.is-9by16
padding-top: 177.7777%
&.is-1by2
padding-top: 200%
&.is-1by3
padding-top: 300%
// Sizes
@each $dimension in $dimensions
&.is-#{$dimension}x#{$dimension}
height: $dimension * 1px
width: $dimension * 1px

View File

@ -0,0 +1,52 @@
@import "../utilities/mixins"
$notification-background-color: $background !default
$notification-code-background-color: $scheme-main !default
$notification-radius: $radius !default
$notification-padding: 1.25rem 2.5rem 1.25rem 1.5rem !default
$notification-padding-ltr: 1.25rem 2.5rem 1.25rem 1.5rem !default
$notification-padding-rtl: 1.25rem 1.5rem 1.25rem 2.5rem !default
$notification-colors: $colors !default
.notification
@extend %block
background-color: $notification-background-color
border-radius: $notification-radius
position: relative
+ltr
padding: $notification-padding-ltr
+rtl
padding: $notification-padding-rtl
a:not(.button):not(.dropdown-item)
color: currentColor
text-decoration: underline
strong
color: currentColor
code,
pre
background: $notification-code-background-color
pre code
background: transparent
& > .delete
+ltr-position(0.5rem)
position: absolute
top: 0.5rem
.title,
.subtitle,
.content
color: currentColor
// Colors
@each $name, $pair in $notification-colors
$color: nth($pair, 1)
$color-invert: nth($pair, 2)
&.is-#{$name}
background-color: $color
color: $color-invert
// If light and dark colors are provided
@if length($pair) >= 4
$color-light: nth($pair, 3)
$color-dark: nth($pair, 4)
&.is-light
background-color: $color-light
color: $color-dark

View File

@ -0,0 +1,31 @@
@import "../utilities/mixins"
.block
@extend %block
.delete
@extend %delete
.heading
display: block
font-size: 11px
letter-spacing: 1px
margin-bottom: 5px
text-transform: uppercase
.loader
@extend %loader
.number
align-items: center
background-color: $background
border-radius: $radius-rounded
display: inline-flex
font-size: $size-medium
height: 2em
justify-content: center
margin-right: 1.5rem
min-width: 2.5em
padding: 0.25rem 0.5rem
text-align: center
vertical-align: top

Some files were not shown because too many files have changed in this diff Show More