diff --git a/config.toml b/config.toml index 89d02a1..0b7f46a 100644 --- a/config.toml +++ b/config.toml @@ -1,4 +1,76 @@ -baseURL = "https://blog.jaseg.de/" +baseURL = "http://jaseg.de/" languageCode = "en-us" -title = "jaseg.de" -theme = "hugo-classic" +title = "Home" +copyright = "Jan Sebastian Götte" +theme = "conspiracy" +enableRobotsTXT = true + +[outputs] +home = ['html', 'rss'] +taxonomy = ['html', 'rss'] + +[params] +fediverse_account = "@jaseg@chaos.social" + +[taxonomies] +category = "Categories" +blog = "Posts" + +[[menu.main]] +name = "Home" +url = "/" +weight = 1 + +[[menu.main]] +name = "Blog" +url = "/blog/" +weight = 2 + +[[menu.main]] +name = "Projects" +url = "/projects/" +weight = 3 + +[[menu.main]] +name = "About" +url = "/about/" +weight = 4 + +[[params.profile_links]] +name = "cgit" +url = "https://git.jaseg.de/" +weight = 1 + +[[params.profile_links]] +name = "Github" +url = "https://github.com/jaseg" +weight = 2 + +[[params.profile_links]] +name = "Gitlab" +url = "https://gitlab.com/neinseg" +weight = 3 + +[[params.profile_links]] +name = "Mastodon" +url = "https://chaos.social/@jaseg" +weight = 4 + +[[params.footer_links]] +name = "About" +url = "/about/" +weight = 1 + +[[params.footer_links]] +name = "Imprint" +url = "/imprint/" +weight = 2 + +[[params.homepage_categories]] +title = "Blog" +key = "blog" +weight = 2 +count = 10 + +[security.exec] +allow = ["^dart-sass-embedded$", "^go$", "^npx$", "^postcss$", "^rst2html$"] diff --git a/content/_index.rst b/content/_index.rst new file mode 100644 index 0000000..ad39a14 --- /dev/null +++ b/content/_index.rst @@ -0,0 +1,9 @@ +--- +title: jaseg.de +--- + +Hi there, and welcome to my personal website. + +I'm jaseg, and I write about my projects here. You can find long-form articles in the blog, and links to my open-source +projects on the projects page. On the top right of this page, there are links to my git repositories and social media +pages. If you want to learn more about me, head over to the about page. diff --git a/content/about.rst b/content/about.rst deleted file mode 100644 index 6d6fc54..0000000 --- a/content/about.rst +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: "About jaseg" ---- - -About ------ - diff --git a/content/about/index.rst b/content/about/index.rst new file mode 100644 index 0000000..2acfee5 --- /dev/null +++ b/content/about/index.rst @@ -0,0 +1,65 @@ +--- +title: "About jaseg" +--- + +About +----- + +Hej, I'm Jan, or jaseg. At the moment I'm doing a PhD (Dr.-Ing.) at TU Darmstadt in Computer Science, specializing on +Hardware Security. This is my personal website where I publish things that I find interesting. + +I self-host my code at `git.jaseg.de `__, but I am also on `github `__ +and on `gitlab `__. I use github for issue tracking for some of my projects such as +`gerbolyze `__ and `python-mpv `__. I maintain +the `python-mpv `__ and `gerbolyze `__ python +packages on PyPI. Release tags on these two repositories are signed with the release signing key found `on github +`__ and below. + +I am not on any social network, but feel free to write me an email at `hello@jaseg.de +`__. + +I do not use application-level email encryption such as S/MIME or PGP. If you need a higher level of secrecy than +regular old email provides, please ask around for my signal contact or email me a file encrypted using `age +`__ with one of the SSH keys listed `on my github +`__. You can find both PGP and other SSH keys that I have used in the past on the +internet, but please consider these keys revoked, and do not use them to encrypt anything you send me. + +Python package release signing key +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +I use this GPG key (key ID ``ED7A208EEEC76F2D``) to sign git release tags of both `gerbolyze `__ and `python-mpv +`__: + +.. code:: + + -----BEGIN PGP PUBLIC KEY BLOCK----- + mDMEXom49xYJKwYBBAHaRw8BAQdA/KrWMt2MKGIZUvlQZnWjNd6i8/ZYjRsBQqEf + PJ8pJ+20NHB5dGhvbi1tcHYgUmVsZWFzZSBTaWduaW5nIEtleSA8cHl0aG9uLW1w + dkBqYXNlZy5kZT6IlgQTFggAPhYhBONvdTB/Cg7C0UX/XO16II7ux28tBQJeibj3 + AhsDBQkSzAMABQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEO16II7ux28thRYA + /3Yl1RdeUGor6K0RTxce9TIBB+DpLNupJgB9f6onuocpAQC614zQ/RQ6rkGTHCwA + ElFClWRQ5eppj0jpAuH15udqAbg4BF6JuPcSCisGAQQBl1UBBQEBB0A0mrXSv6rj + ajCmZR4H4OtowAx477YS+yWARqo1NtdgJwMBCAeIfgQYFggAJhYhBONvdTB/Cg7C + 0UX/XO16II7ux28tBQJeibj3AhsMBQkSzAMAAAoJEO16II7ux28tMZwBAIUpHHvP + gRW2jQuzdw1r06kItfFk/0t+mgNUQ2+vtbhzAP98BoWx7lv+bvlIbBaVgLldusj0 + pHnZI/0y3ksMBkdbBw== + =Mr6G + -----END PGP PUBLIC KEY BLOCK----- + +About this site +--------------- + +This site is made with the hugo static site generator. I made the theme myself, feel free to grab a copy at +`git.jaseg.de `__. The nifty auto-reflowing code embeds are +made with some CSS magic I made that you can find in `style.css +`__. +The body text is typeset in Roboto Slab, created by `Christian Robertson `__ while +working at Google. The headlines are set in Nyght Serif, a font by `Maksym Kobuzan `__. +Check out their other fonts, their work is beautiful! Source code is typeset in Fira Code, a derivate by ... from +Mozilla's `Fira Mono `__ font, designed by `Erik Spiekermann +`__, `Ralph du Carrois `__, `Anja Meiners +`__ and Botio Nikoltchev of Carrois Type Design, now succeeded by `bBoxType +`__ , and Patryk Adamczyk of Mozilla. The photo of mountains +that's used in the background of this site is by `Fabrizio Conti `__ and can be found on +`Unsplash `__. + diff --git a/content/blog/8seg/8seg-digit-circuit.png b/content/blog/8seg/8seg-digit-circuit.png new file mode 100644 index 0000000..001c896 Binary files /dev/null and b/content/blog/8seg/8seg-digit-circuit.png differ diff --git a/content/blog/8seg/index.rst b/content/blog/8seg/index.rst new file mode 100644 index 0000000..6b8d676 --- /dev/null +++ b/content/blog/8seg/index.rst @@ -0,0 +1,203 @@ +--- +title: "8seg Technical Overview" +date: 2023-12-26T15:26:00+01:00 +summary: > + 8seg is a large-scale LED light art installation that displays text on a 1.5 meter high, 30 meter wide + 8-segment display made from cheap LED tape. +--- + +Prologue +-------- + +German hacker culture has this intense love for things that light up in colorful ways. Like for many others in this +community, I have always been fascinated by LEDs. One of the first things on my pile of unfinished projects was to build +my own LED matrix and use it to display text. When I started that project, I was still new to electronics. Back then, +commercial LED matrices were limited to red or green color only, and were very expensive, so there was an incentive to +build your own. At the same time, while individual LEDs were'nt expensive anymore, they hadn't started to be cheap yet, +either. On top of the material cost, back then there were no PCB fabs, and especially no PCB assembly houses that a +hobbyist could afford. Ultimately, I ended up never finishing this project because I felt it was more of a feat of +material wealth than of technical prowess. + +Over time, LEDs came down in price, and peoople started using them in all sorts of fun things. Around the mid-2010s, +cheap-ish, ready-made tapes and chains of RGB LEDs that included WS2811 or similar digitally controllable driver chips +led to a cambrian explosion in projects involving large amounds of colorful LEDs since suddenly, all you needed was an +arduino and a beefy power supply to individually control an almost unlimited number of these LEDs. + +Today, LED technology has advanced even furhter, to a point where now you can buy staggering quantities of the second +generation of these controllable LEDs that provides better color rendering embedded in all sorts of shapes, from tapes +through rings to grids. When I built the first matelight_ in 2013, the matelight's 640 individually-controllable LEDs +were *a lot*. Today, you can buy a roll with several thousand channels for about the price of a nice pizza. + +The idea behind 8seg +-------------------- + +Living through this amazing escalation of LED technology, in 2018, I looked at a then-obsolete piece of single-color, +dumb, non-controllable LED tape with a simple question in mind: Taking this unsophisticated artifact of yesterday's +technology, what would be the coolest thing I could build from it? Can I buld something that not only rivals, but +outmatches the modern controllable LED stuff? From that question, I set myself two goals. First, I wanted to keep the +project's use of financial and labor resources reasonable. A lot of art consists of taking a simple idea, and simply +extrapolating its implementation to a ridiculous scale at the expense of the artist's time and wallet. That wasn't the +point I wanted to make. I wanted to make something cool from an obsolete technology, not prove how much patience I had +soldering. My second goal was to create something that is meaningfully controllable. Controllability is much harder with +these dumb LED tapes, but it is possible nontheless, and I wanted to test out how far you could go with it. + +After thinking through a number of possibilities, I settled on the basics of the 8seg design I ended up realizing. The +installation would be a banner-style display consisting of a series of characters made from non-controllable LED tape. +The banner can be rigged up in any convenient air space, bending and folding to conform to the space's shape and size. +The key idea behind 8seg is that it makes up for it's lack of control fidelity with sheer size. If nothing else, this +non-controllable LED tape is *cheap*. + +The design of a single 8seg character +------------------------------------- + +Each 8seg character consists of 8 *segments* of LED tape that are inter-connected through small circuit boards, four in +the corners, and one in the center. As it turns out, 8 segments arranged in this shape are enough to display all of the +English language's alphabet as well as numbers in a weird, but readable form. + +The electrical design of an 8seg character has one weird trick at its core. To avoid having to run a bunch of wires from +some kind of driver circuit board to each of the eight segments, I thought, why not use the LED tape itself instead for +power and data transmission? Wires are heavy, expensive, and annoying to solder, so if I could find a way to +interconnect the LED tape so that it can all be driven from a driver circuit located at one of the character's +junctions while simultaneously powering that driver circuit, an 8seg character wouldn't need any wires at all anymore. + +8seg achieves this feat using a circuit as shown in the diagram below. Interconnections between the LED tape segments +are done with a small circuit board in each of the four corners. The design is rotationally symmetric, and all four of +these boards are identicaly. The top right and bottom left corners simply use the back side of the same circuit board +used in the top left and bottom right corners. + +.. image:: 8seg-digit-circuit.png + +The driver circuit sits at the center of the character and directly connects to the four diagonal segments. The key +thought behind 8seg's driving scheme is that there are two common phases wound through the display in a zig-zag pattern +as shown in red and blue in the schema below. These phases alternate their polarity at a high frequency. Each segment +has its negative pole connected to one of these two phases, and can be turned on by the driver while that phase is low +and the other phase is high. While a phase is high, the LEDs on all segments connected to that phase are reverse-biased, +and thus these segments remain dark. + +The positive poles of all segments are connected to the driver circuit in the center through a spiral pattern. Each arm +of the spiral is made up of two segments, one diagonal on the inside, and one horizontal or vertical on the outside. +The two segments on each spiral arm are on different phases, one on each of the two phases. Thus, during a single cycle +of the two phases alternating polarity, first one of the two segments has its polarity the right way around, then the +other. The driver can turn on the active segment by connecting the spiral control line to the positive LED supply +voltage. + +Both phases cross at the center where the driver circuit is located, so the driver can power itself from the two phases +using a simple full bridge rectifier. + +Saving copper with point of load regulation +------------------------------------------- + +In the beginning, I experimented with the design above, putting 12V AC on the two phases, and letting the driver switch +its derived LED supply using some cheap MOSFETs. This simple design totally works, but it has an important shortcoming. + +8seg is designed to be physically *very* large. This means that not only does it have a large number of LEDs that +together need a lot of current, it also has to transmit all of that current across significant physical distances. The +consequence of this was that in the initial design, I was looking at either needing hundreds of Euros worth of copper +cables, or burning hundreds of Watts of electricity into heat if I were to use thinner cables. In this case, cables act +like resistors. In a resistor, power dissipation rises with the square of the current inside the cable. This is bad for +8seg since it means halving the amount of copper in those wires increases power dissipation in these wires fourfold. + +Despite that downside, this square law does come with an upside, too. If we assume we have wires of a particular fixed +diameter, if we can halve the current through those wires, we can quarter the wires' power dissipation. If we want to +deliver the same amount of power to the LEDs as before, to halve wire current, we have to double the voltage, and add +some circuitry on the drivers to convert that increased voltage back down to close to our LED tape's nominal 12V. + +Alas, simply doubling the voltage leads to one question: How is it that we can pass double the voltage through our LED +tape to the center control circuit? Isn't the LED tape made for 12V operation only, not 24V? The answer to this +apparent problem is that the center is connected to the AC bus voltage only through the negative side of the LED tapes, +and controls their positive sides to turn them on or off. The AC bus voltage never appears directly across any single of +the eight segments. At the same time, a simple buck converter stepping down our new 24V bus voltage to 12V, and feeding +the segment control transistors with that instead of feeding them straight from the rectified AC bus allows us to feed +the segments with 12V. The only difference between this circuit and the straight 12V variant is that now, during OFF +times, the LED tapes see a negative 24 v across them. To make sure that's not a problem, I tested a number of them with +different LED colors and from different manufacturers, and all of them held up past the 50 V I could easily generate +with my lab power supply. + +Synchronous rectification +------------------------- + +I implemented the point-of-load regulation in a new revision of the center circuit, and built a prototype digit. When I +tested this prototype, to my dismay, I noticed some really strange behavior. In my tests, the LED tape did not properly +light up, and when I checked the voltages with my oscilloscope, I noticed that the center circuit's ground was floating +several volts *below* the AC bus voltage's negative phase. How come? + +After some head-scratching, I found that this problem was due to a simple instance of Kirchhoff's current law. Consider +the point where the AC bus voltage's currently negative phase enters the center circuit board. Let's say that we +dissipate 24 Watts in the segments' LEDs. In this case, at 24 Volts, 1 Ampère will flow into the center circuit's +terminal connected to the currently positive phase, and out from the center circuit's terminal connected to the +currently negative phase. + +Now consider the current through the LED tape. During one half-cycle of the AC bus, the center circuit can only address +the four segments that have their negative rail connected to the currently negative phase of the AC bus. If one of these +four segments is currently on and dissipating our 24 Watts, that segment will be fed 2 Ampère of current from the center +circuit through its positive rail. My mistake was that I did not consider what happened to the return current here. +The corresponding 2 Ampère return current of course flows back through the segment's negative rail into the center +circuit, and herein lies the issue: That negative rail is where our center circuit's supply current comes from! This +means that according to Kirchhoff's current law, the 1 A flowing out from the center circuit at its input are adding up +with the 2 A flowing into it. The result of this is that in the currently positive phase's connection, we get 1 A +flowing into the center circuit, while in the negative phase connection, we get (-1) + (+2) resulting in another 1 A +flowing into it! The only terminal where current flows *out* of the center circuit is the positive terminal connected to +the active segment, out of which 2 A of current are flowing. + +The big problem with this confusing scenario is that this means the bridge recitifier in our center circuit cannot work, +since its negative-side diodes are reverse biased while any of the segments are on. We can't just add more diodes here, +since that would just short both AC bus rails together. Instead, the solution is to add one rather chonky MOSFET in +parallel with each of the two negative-side diodes of the bridge rectifier that are controlled by the center circuit to +act as a sort of synchronous rectifier. When we turn on one of the segments, we have to turn on the MOSFET on the +currently negative rail to allow the segment's return current to bypass the bridge rectifier's negative-side diode. Fun +fact: If we turn on the wrong MOSFET out of the pair, we short the AC bus, resulting in a very quick end of life for that +poor MOSFET. + +Power line data communication +----------------------------- + +As we saw above, the driver providing power to a string of digits has to continuously alternate the polarity of its +output voltage to provide one part of the digit circuits' multiplexing. Since we want to provide the control information +to the center circuits through those same two wires, we can choose between a number of viable power line communication +schemes. These schemes usually require a beefy transmitter adding a modulation at a frequency much larger than the +underlying bus frequency, and a filter circuit at each receiver to filter that signal from the much stronger fundamental +AC waveform. In our application, I saw two issues with these classical approaches. First, they require fairly complex +circuitry, especially the beefy transmitter at the driver. Second, they are susceptible to attenuation with either +changing load or over long distances, which could potentially be a problem with the high currents and long(ish) wiring +runs 8seg needs. + +Because of these disadvantages, I decided on another approach entirely. Instead of modulating our control signal on top +of the AC power waveform, we modulate our control data *into* the AC power waveform. To not interfere with the display +and cause outages or flicker, and to avoid having to blank the display during transmissions, we choose a modulating +technique that leaves the proportions of negative and positive half-waves undisturbed. The practical realization of this +is that instead of alternating positive and negative half-waves, we send a positive half wave for each "one" bit, and a +negative half wave for each "zero" bit, effectively creating a phase shift keyed signal with two states with an +180-degree phase shift, with the transmitted bit rate synchronized to twice the underlying carrier frequency. + +The remaining question is how one can encode arbitrary binary data into a continuous stream of ones and zeros that is +precisely 50 % ones and 50 % zeros across any time span longer than a few dozen bits. There exists a near-optimal +solution to this question from ethernet over copper twisted pairs. In ethernet, the encoded and modulated signal passes +through an isolation transformer to protect the ethernet transceiver from interference or dangerous voltages coming in +through the ethernet port. For this isolation transformer to work, the modulated ethernet signal must be exactly +balanced to avoid saturating the transformer's core with a DC offset. Ethernet solves this issue by using an encoding +known as `8b/10b encoding`_. 8b/10b encoding is named like that because it specifies a way to produce a 10 bit codeword +from any 8 bit input data word while guaranteeing that the resulting codewords are always precisely balanced when +looking at two or more consecutively. + +Framing +------- + +Since 8b/10b encoding maps a space of 256 data words to 1024 code words, there necessarily are a number of unused code +words. While for some of them, leaving them unallocated is beneficial because it improves error tolerance by decreasing +the probability of one code word turning into another undetectably when a single one of its bits is flipped, even +accounting for that it leaves some room for other uses. In 8b/10b, these leftover code words are used for synchronizing +the receiver to the transmitter, and for framing transmissions. Synchronization is necessary for the receiver to know +where a code word stards, and 8b/10b has a handful of special "comma" code words that can be uniquely identified in a +continuous stream of received ones and zeros, because no other combination of 8b/10b code words could produce the same +sequence of ones and zeros of the comma code word anywhere. + +The leftover code words that are not commas are useful, too. They can be used, for instance, as filler code words +betwene actual data transmissions, or to act as framing markers denoting things like the end of a protocol message. + +The 8seg driver produces its modulation waveform by translating all data to be transmitted into 8b/10b codes, padding +the result with framing markers and filler codes, and copy-pasting together the corresponding AC waveform from a small +set of pre-programmed waveform transitions. + +.. _matelight: https://github.com/jaseg/matelight +.. _`8b/10b encoding`: https://en.wikipedia.org/wiki/8b/10b_encoding + diff --git a/content/blog/_index.rst b/content/blog/_index.rst new file mode 100644 index 0000000..9bff67d --- /dev/null +++ b/content/blog/_index.rst @@ -0,0 +1,3 @@ +--- +title: Blog +--- diff --git a/content/blog/ashen-yanartas/ashen-logo-text-dark-plain.svg b/content/blog/ashen-yanartas/ashen-logo-text-dark-plain.svg new file mode 100644 index 0000000..4ed3c9c --- /dev/null +++ b/content/blog/ashen-yanartas/ashen-logo-text-dark-plain.svg @@ -0,0 +1,37 @@ + + + + + + + + + + ashen + + diff --git a/content/blog/ashen-yanartas/ashen-logo-text-light-plain.svg b/content/blog/ashen-yanartas/ashen-logo-text-light-plain.svg new file mode 100644 index 0000000..f3e7460 --- /dev/null +++ b/content/blog/ashen-yanartas/ashen-logo-text-light-plain.svg @@ -0,0 +1,37 @@ + + + + + + + + + + ashen + + diff --git a/content/blog/ashen-yanartas/index.rst b/content/blog/ashen-yanartas/index.rst new file mode 100644 index 0000000..8c37392 --- /dev/null +++ b/content/blog/ashen-yanartas/index.rst @@ -0,0 +1,59 @@ +--- +title: "Project Announcement: Ashen and Yanartas" +date: 2026-05-31T08:00:00+02:00 +summary: > + There are exciting things ahead for the next year: I have been granted funding by both nlnet and by prototype fund + for open-source work on an open source hardware Hardware Security Module. As a vessel for this project, I created a + consulting company, yasec. +--- + +I'm currently in the last days of finishing my PhD (Dr.-Ing.) in Electrical Engineering. To make sure things don't get +boring afterwards, I've been busy looking for new opportunities. As a result, there are exciting things ahead for the +next year: I have been granted funding by both nlnet *and* by Prototype Fund for open-source work on an Open Source +Hardware Hardware Security Module. As infrastructure for these projects, I created a consulting company, `yasec +`__. + +Prototype Fund supports Ashen, the OS for open-source HSMs +---------------------------------------------------------- + +.. raw:: html + + + + + + +Starting June 2026, I will be working on Ashen_, an open-source software stack that provides the operating system layer +for open-source HSMs. The project is funded as part of `Prototype Fund`_'s Class 02. + +Compared to existing open-source HSM software that work at the application level and that don't +consider physical attacks, this stack will provide the underlying operating system services to protect such systems from +physical attacks. A key component of this stack will be a portable mechanism to connect hardware tamper sensors to a +system. The stack will enable deterministic guarantees of the maximum latency until secrets are destroyed after a tamper +alarm was raised. + +.. _Ashen: https://yasec.de/projects/ashen/ +.. _`Prototype Fund`: https://www.prototypefund.de/ + +nlnet supports Yanartas, the OSHW HSM platform +---------------------------------------------- + +After work on the Ashen software stack is completed, I will continue by creating Yanartas_, an Open Source Hardware +design for a complete open-source Hardware Security Module that provides protection against advanced physical attacks +using a security mesh based on the `Inertial HSM`_ technology I developed during my PhD. The design will be customizable +to different use cases and payload sizes from microcontrollers to whole servers. + +.. _Yanartas: https://yasec.de/projects/yanartas/ +.. _`Inertial HSM`: https://tches.iacr.org/index.php/TCHES/article/view/9290 + +Let's talk! +----------- + +In case you're interested to talk about hardware security engineering or open-source hardware, feel free to reach out +through email or on mastodon. The projects are in an early stage, and I'm looking both for collaborators for these +projects, and for opportunities once these projects have been completed. At this time, I only have a small amount of +spare capacity outside of these projects, but that will change with time. I'd love to hear about *your* projects and +your needs for specialist work in case you're interested. + +Follow this blog's `RSS `__ and follow me `on mastodon `__ for +updates! diff --git a/content/blog/ashen-yanartas/yasec-logo-v1-dark-plain.svg b/content/blog/ashen-yanartas/yasec-logo-v1-dark-plain.svg new file mode 100644 index 0000000..ad9a0d2 --- /dev/null +++ b/content/blog/ashen-yanartas/yasec-logo-v1-dark-plain.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + diff --git a/content/blog/ashen-yanartas/yasec-logo-v1-light-plain.svg b/content/blog/ashen-yanartas/yasec-logo-v1-light-plain.svg new file mode 100644 index 0000000..1c70f81 --- /dev/null +++ b/content/blog/ashen-yanartas/yasec-logo-v1-light-plain.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + diff --git a/content/blog/css-only-code-blocks/index.rst b/content/blog/css-only-code-blocks/index.rst new file mode 100644 index 0000000..c9dc2fe --- /dev/null +++ b/content/blog/css-only-code-blocks/index.rst @@ -0,0 +1,209 @@ +--- +title: "Code listings with nice line wrapping and line numbers from plain CSS" +date: 2025-07-23T23:42:00+01:00 +summary: > + Code listings in web pages are often a bit of a pain to use. Usually, they don't wrap on small screens. Also, + copy-pasting code from a code listing often copies the line numbers along with the code. Finally, many + implementations use heavyweight HTML and/or javascript, making them slow to render. For this blog, I wrote a little + CSS hack that renders nice, wrapping code blocks with line continuation markers in plain CSS without any JS. +--- + +Code listings in web pages are often a bit of a pain to use. Often, they don't wrap on small screens. Also, copy-pasting +code from a code listing often copies the line numbers along with the code. Finally, many implementations use +heavyweight HTML and/or javascript, making them slow to render (looking at you, gitlab). + +For this blog, I wrote an implementation that renders HTML code listings entirely without JavaScript, renders line +numbers using plain CSS such that they don't get selected with the code, and that works with the browser to wrap in a +natural way while still supporting the little line continuation arrows that are used to show that a line was soft +wrapped in text editors. + +This blog is rendered as a static site using Hugo_ from a pile of RestructuredText_ documents. RestructuredText renders +code listings using Pygments_ by default. Pygments hard-bakes the line numbers into the generated HTML, so I am using a +`monkey-patched`_ hook that changes the line number rendering to just a bunch of empty ```` elements. The resulting +HTML for a code block then looks like this: + +.. code:: html + +
+        
+        
+            The code!
+        
+        
+    
+ +You can find the (rather short) source of the ``rst2html`` wrapper `below <#rst2html-wrapper>`_. + +The CSS +------- + +This modified HTML structure of the code listing gets accompanied by some CSS to make it flow nicely. Here is a listing +of the complete CSS controlling the listing. The only bit that isn't included here is the actual syntax styling rules +for the pygments tokens. + +.. code:: css + + /*****************************************************/ + /* Code block formatting / syntax highlighting rules */ + /*****************************************************/ + + .code { + font-family: "Fira Code"; + font-size: 13px; + text-align: left; /* Override default content "justify" alignment */ + white-space: pre-wrap; + word-wrap: break-word; + overflow-x: auto; + display: grid; + align-items: start; + grid-template-columns: min-content 1fr; + } + + .code > .line { + padding-left: calc(2em + 5px); + text-indent: -2em; + padding-top: 2px; + min-width: 15em; + } + + /* Make individual syntax tokens wrap anywhere */ + .code > .line > span { + overflow-wrap: anywhere; + white-space: pre-wrap; + } + + /* We render line numbers in CSS! */ + .code > .lineno { + counter-increment: lineno; + word-break: keep-all; + margin: 0; + padding-left: 15px; + padding-right: 5px; + overflow: clip; + position: relative; + text-align: right; + color: var(--c-text-muted); + border-right: 1px solid var(--c-fg-highlight); + align-self: stretch; + } + + /* We also handle line continuation markers in CSS. */ + .code > .lineno::after { + position: absolute; + right: 5px; + content: "\a↳\a↳\a↳\a↳\a↳\a↳\a↳\a↳\a↳\a↳\a↳\a↳\a↳\a↳\a↳\a↳\a↳\a↳"; + white-space: pre; + color: var(--c-text-muted); + } + + /* Insert the actual line number */ + .code > .lineno::before { + content: counter(lineno); + } + + .code::before { + counter-reset: lineno; + } + + .code .hll {} + /* Following are about 50 lines that define the styling of each kind of pygments syntax highlight token. These lines + all look like the following: */ + .code .c { color: var(--c-text); font-weight: 400 } /* Comment */ + +This CSS does a few things: + + 1. It renders the ``
`` code listing element using a two-column CSS ``display: grid`` layout. The left column is
+    used for the line numbers, and the right column is used for the code lines.
+ 2. It numbers the lines using a `CSS Counter`_. CSS counters are meant for things like numbering headings and such, but
+    they are a perfect fit for our purpose.
+ 3. It inserts the counter value as the line number into the ```` element's ``::before``
+    pseudo-element. A side effect of using the ``::before`` pseudo-element is that without doing anything extra, the
+    line numbers will remain outside of the normal text selection so they will neither be highlighted when selecting
+    listing content, nor will they be copied when copy/pasting the listing content.
+ 4. It inserts a string of ``"\a↳\a↳\a↳\a↳\a↳\a↳\a↳\a↳\a↳\a↳\a↳\a↳\a↳\a↳\a↳\a↳\a↳\a↳"`` into the line number span's
+    ``::after`` pseudo-element. This string evaluates to a sequence of unicode arrows separated by line breaks, and
+    starting with an empty line. The ``::after`` pseudo-element is positioned using ``position: absolute``, and the
+    parent ```` has ``position: relative`` set. This way, the arrow pseudo-element gets placed on
+    top of the lineno span without affecting the layout at all. By setting ``overflow: clip`` on the parent ````, the arrow pseudo-element gets cut off vertically wherever the parent lineno element naturally
+    ends.
+
+The line number span is inserted into the parent ``
`` element's CSS grid using ``align-self: stretch``, which
+causes it to vertically stretch to fill the available space. Since the line number span only contains the line number,
+its minimum height is a single line. As a result, it will stretch higher only when the corresponding code line in the
+right grid column stretches vertically because of line wrapping. When that happens, part of the arrow pseudo-element
+starts showing through from behind the ``overflow: clip`` of the line number span, and one arrow gets rendered for each
+wrapped listing line.
+
+When the page is too narrow, we don't want the code listing's lines to wrapp into a column of single characters. To
+prevent that, we simply set a ``min-width`` on the ```` in the right column, and set ``overflow-x:
+auto`` on the listing ``
``. This results in a horizontal scroll bar appearing whenever the listing gets too narrow.
+
+You can try out the line wrapping by resizing this page!
+
+rst2html wrapper
+----------------
+
+Here is the python ``rst2html`` wrapper that monkey-patches code rendering. I made hugo invoke this while building the
+page by simply overriding the ``PATH`` environment variable.
+
+.. code:: python
+
+    #!/usr/bin/env python3
+    # Based on https://gist.github.com/mastbaum/2655700 for the basic plugin scaffolding
+
+    import sys
+    import re
+
+    import docutils.core
+    from docutils.transforms import Transform
+    from docutils.nodes import TextElement, Inline, Text
+    from docutils.parsers.rst import Directive, directives
+    from docutils.writers.html4css1 import Writer, HTMLTranslator
+
+
+    class UnfuckedHTMLTranslator(HTMLTranslator):
+        def __init__(self, *args, **kwargs):
+            super().__init__(*args, **kwargs)
+            self.in_literal_block = False
+
+        def visit_literal_block(self, node):
+            # Insert an empty "lineno" span before each line. We insert the line numbers using pure CSS in a ::before
+            # pseudo-element. This has the added advantage that the line numbers don't get included in text selection.
+            # These line number spans are also used to show line continuation markers when a line is wrapped.
+            self.in_literal_block = True
+            self.body.append(self.starttag(node, 'pre', CLASS='literal-block'))
+            self.body.append('')
+
+        def depart_literal_block(self, node):
+            self.in_literal_block = False
+            self.body.append('\n
\n') + + def visit_Text(self, node): + if self.in_literal_block: + for match in re.finditer('([^\n]*)(\n|$)', node.astext()): + text, end = match.groups() + + if text: + super().visit_Text(Text(text)) + + if end == '\n': + if isinstance(node.parent, Inline): + self.depart_inline(node.parent) + self.body.append(f'
\n') + if isinstance(node.parent, Inline): + self.visit_inline(node.parent) + + else: + super().visit_Text(node) + + + html_writer = Writer() + html_writer.translator_class = UnfuckedHTMLTranslator + docutils.core.publish_cmdline(writer=html_writer) + +.. _Hugo: https://gohugo.io/ +.. _RestructuredText: https://www.sphinx-doc.org/en/master/usage/restructuredtext/index.html +.. _Pygments: https://pygments.org/ +.. _`monkey-patched`: https://en.wikipedia.org/wiki/Monkey_patch +.. _`CSS Counter`: https://developer.mozilla.org/en-US/docs/Web/CSS/counter diff --git a/content/blog/epa-sgd-crypto/index.rst b/content/blog/epa-sgd-crypto/index.rst new file mode 100644 index 0000000..ccbf648 --- /dev/null +++ b/content/blog/epa-sgd-crypto/index.rst @@ -0,0 +1,100 @@ +--- +title: "75 Million Lives, Two Keys" +date: 2025-01-05T23:42:00+01:00 +draft: true +--- + +2025 has begun. In this new year, with its new national healthcare record system, the country of Germany will start one +of the largest rollouts of a cryptographic system in history. While the system has received scrutiny as well as +resulting harsh criticism from a number of parties ranging from NGOs to everyday civilians, the system has received +surprisingly little attention from the academic applied cryptography crowd. Additionally, previous criticism of +the system has largely revolved around organizational issues. While valid, we belive that some cryptographic issues at +the core of the system have escaped attention unitl now. In particular, at the core of the system is a key escrow system +that contains several questionable design choices and that in its overall design seems out of place in 2025. + +The aim of the system is to serve as a shared storage for all healthcare records of a person. In the system, a person's +entire patient file with all documentation on the treatment process including test results, images and other raw data +will be stored in something vaguely resembling cloud storage such that all healthcare providers that the person visits +can access the entire file. This centralized, synchronized storage eliminates the need for transferring this data +between hospitals and doctors offices by fax, mail or physical media as it was common practice until now. After a +development and testing phase lasting approximately five years, the German government decided to roll out the system to +everybody insured under Germany's mandatory national health insurance scheme, totalling approximately 75 million people, +on January 15th 2025. + +In this article, we will give an overview of the system's cryptographic design before highlighting a few odd +design choices that could amount to a viable attack vector to the powerful adversaies + +## Context and involved parties + +Germany has a national, mandatory health insurance system. The system is open to any permanent resident of the country +irrespective of citizenship. The system is mandatory in that while residents can choose between a number of both +publically owned as well as private healthcare providers, it is not possible to opt out of the system. The public health +insurance providers cover approximately 90% of German residents. These providers are organized in an umbrella +organization named "GKV Spitzenverband". The resposibility of this umbrella organization largely revolves around +negotiating prices with pharmaceutical companies and with healthcare providers as a publically sanctioned cartel, but +also includes the specification and operation of shared IT infrastructure for billing and data exchange between +healthcare providers. + +While GKV Spitzenverband is the party that ultimately holds responsibility for the regulatory administration of national +healthcare IT infrastructure, it has delegated large parts of both the technical specification of this infrastructure as +well as its day-to-day operation to Gematik GmbH, a state-owned limited liability corporation created specifically for +the purpose of developing and implementing national healthcare IT standards. The electronic healthcare record system we +describe in this article was standardized and implemented by Gematik GmbH under the direction of GKV Spitzenverband. + +Healthcare providers in Germany need to be registered with GKV Spitzenverband to serve members of public health +insurance providers. Since these public providers constitute approximately 90% market share, the vast majority of +healthcare providers are registered this way. + +Before the new national health record system, a number of healthcare IT processes have already been standardized and +implemented by the parties above. In particular, every insured person already owns a cryptographic smartcard that acts +as their proof of identity when accessing healthcare services. On the other side of such transactions, healthcare +providers are likewise identified by cryptographic smartcards. Until now, these cards were used to facilitate billing of +services from healthcare providers to insurers and to transfer prescriptions from prescribing doctors to pharmacies. + +A central role in this existing infrastructure is assumed by VPN gateways that link healthcare providers to +the centrally-run backend infrastructure. Gematik GmbH calls these devices "Konnektor". They are specially-built +hardware devices that contain multiple smart cards to authenticate the VPN connection towards the backend, and besides +acting as a standard VPN gateway for client applications in the healthcare provider's network to tunnnel their backend +requests through, the Konnektors also perform cryptographic operations in some of Gematik GmbH's protocols, such as +authenticating certain requests using signatures. + +## Design principles + +The new health record system was built on top of the existing infrastructure described above. In particular, access to +health records is managed through keys stored in the patient's and the healthcare provider's existing smartcards, and +all backend communication is tunneled through the existing VPN. Access to the files is mediated through the healthcare +provider's existing patient management software. While in early drafts of the system, access to healthcare records +through the patient's smartcard was gated behind a PIN, the impracticality of making the entire patient populace +remember PINs led the implementors to scrap this provision, meaning that the patient's smartcard is all a healthcare +provider needs to access the patient's record. + +A critical cornerstone in the system's design is that the system's designers decided that a lost smartcard should not +lead to any data loss. As a consequence of this decision, while some of the record's access keys are kept on the +patient smartcard, in contravention to conventional smartcard designs the same keys are kept accessible in a centralized +key escrow system named "Schlüsselgenerierungsdienst" and abbreviated as SGD. Furthermore, these keys are not generated +on the smartcard either -- instead, the key escrow system generates these access keys, one copy of which is then +transmitted and stored inside the smartcard. + +The system supports re-issuing a smartcard to gain access to a healthcare record. Since the record's privacy pivots on +this process, the system incorporates some organziational countermeasures that aim to make it hard to gain access to a +re-issued copy of a patient smartcard without the patient's help or otherwise multiple colluding parties. + +## Cryptographic design + + + +## The implied adversary model + +While Gematik GmbH publishes detailed specifications of the systems they standardize, these specifications and some +associated implementation guidelines are about the extent of public information. Software implementations are being kept +secret, and while standardization results are available, a large fraction of design rationale is discussed behind closed +doors. From an academic perspective, the most glaring omission in Gematik GmbH's public documents is any definition of a +threat model or an adversary model. As a result of this, we will deduce an adversary model below by contextualizing the +published standards in the national healthcare setting. We will base our further analysis of the system on this +adversary model. + + + +## Previous reviews and audits of the system + +[0] https://www.destatis.de/DE/Themen/Arbeit/Arbeitsmarkt/Qualitaet-Arbeit/Dimension-2/krankenversicherungsschutz.html diff --git a/content/posts/hsm-basics/index.rst b/content/blog/hsm-basics/index.rst similarity index 88% rename from content/posts/hsm-basics/index.rst rename to content/blog/hsm-basics/index.rst index 99aedba..74b7275 100644 --- a/content/posts/hsm-basics/index.rst +++ b/content/blog/hsm-basics/index.rst @@ -1,11 +1,11 @@ --- title: "Hardware Security Module Basics" date: 2019-05-17T15:29:20+08:00 +summary: > + I gave a short introduction into Hardware Security Modules at our university workgroup, including an overview on + interesting research directions. --- -Hardware Security Modules and Security Research and Cryptography -================================================================ - On May 17 2019 I gave a short presentation on the fundamentals of hardware security modules at the weekly seminar of Prof. Mori's security research working group at Waseda University. The motivation for this was that outside of low-level hardware security people and people working in the financial industry HSMs are not thought about that often. In @@ -113,21 +113,26 @@ The core component of an HSM blueprint would be a suite of tamper detection mech to improve on the current state of the art of membrane tamper switches plus temperature sensors plus PCB and printed security meshes plus potting. -Improvements on existing techniques ------------------------------------ - -Light sensors -~~~~~~~~~~~~~ -**Advanced analog sensing** -**Self-test functionality** - -Security meshes -~~~~~~~~~~~~~~~ -**Analog sensing** - - DIY or small lab mesh production -------------------------------- +**Analog sensing** meshes are a proven technology where instead of just monitoring for continuity and shorts, analog +parameters of the mesh traces such as inductance and mutual capacitance are monitored. In 2019, `Immler et al. published +a paper `__ where took this principle and turned it all the +way up. They directly derived a cryptographic secret from the analog properties of their HSM's security mesh in an +attempt to built a `Physically Unclonable Function, or PUF +`__. The idea with PUFs is that they reproduce some entropy +that comes from random tolerances of their production process. The same PUF will always yield (approximately) the same +key, but since you cannot control these random production variations, in practice the resulting PUF cannot be cloned. +Note however, that its secrets can of course be copied if you find a way to read them out. + +As Immler et al. demonstrated in their paper, you don't need any secret sauce to create an analog mesh sensing circuit. +All you need are a bunch of (admittedly, expensive) off-the-shelf analog ICs. The interesting bit here is that by +applying more advanced analog sensing, weaknesses of an otherwise coarse mesh desing could maybe be alleviated. That is, +instead of monitoring a very fine mesh for continuity, you could instead closely monitor inductance and capacitance of a +more coarse mesh. This trade-off between sensing circuit complexity (resp. cost) and mesh production capabilities may +allow someone with a poorly equipped lab to still make a decent HSM. The question is, how do you produce a "decent" mesh +given only basic tools? Here are some ideas. + **3D metal patterning techniques** refers to any technique for producing thin, patterned metal structures on a three-dimensional plastic substrate. The basic process would consist of 3D-printing the polymer substrate, depositing a thin metal layer on top and then patterning this metal layer. A good starting point here would be the recent work of diff --git a/content/posts/hsm-basics/mori_semi_hsm_talk_web.pdf b/content/blog/hsm-basics/mori_semi_hsm_talk_web.pdf similarity index 100% rename from content/posts/hsm-basics/mori_semi_hsm_talk_web.pdf rename to content/blog/hsm-basics/mori_semi_hsm_talk_web.pdf diff --git a/content/blog/ihsm-worlds-first-diy-hsm/index.rst b/content/blog/ihsm-worlds-first-diy-hsm/index.rst new file mode 100644 index 0000000..22cf8e4 --- /dev/null +++ b/content/blog/ihsm-worlds-first-diy-hsm/index.rst @@ -0,0 +1,44 @@ +--- +title: "New Paper on Inertial Hardware Security Modules" +date: 2021-11-23T23:42:20+01:00 +summary: > + Paper announcement: We have published a paper on how you can DIY a tamper-sensing hardware security module from any + single-board computer using a moving tamper-sensing mesh made from cheap PCBs. +--- + +World's First DIY HSM +===================== + +Last week, Prof. Dr. Björn Scheuermann and I have `published our first joint paper on Hardware Security Modules +`__. In our paper, we introduce Inertial Hardware Security +Modules (IHSMs), a new way of building high-security HSMs from basic components. I think the technology we demonstrate +in our paper might allow some neat applications where some civil organization deploys a service that no one, not even +they themselves, can snoop on. Anyone can built an IHSM without needing any fancy equipment, which makes me optimistic +that maybe the ideas of the `Cypherpunk movement `__ aren't obsolete +after all, despite even the word "crypto" having been co-opted by radical capitalist environmental destructionists. + +An IHSM is basically an ultra-secure enclosure for something like a server or a raspberry pi that even someone with +unlimited resources would have a really hard time cracking without destroying all data stored in it. The principle of an +IHSM is the same as that of a `normal HSM`_. You have a payload that contains really secret data. There's really no way +to prevent an attacker with physical access to the thing from opening it given enough time and abrasive discs for their +angle grinder. So what you do instead is that you make it self-destruct its secrets within microseconds of anyone +tampering with it. Usually, such HSMs are used for storing credit card pins and other financial data. They're expensive +as fuck, all the while being about the same processing speed as a smartphone. Traditional HSMs use printed or +lithographically patterned conductive foils for their security mesh. These foils are not an off-the-shelf component and +are made in a completely custom manufacturing process. To create your own, you would have to re-engineer that entire +process and probably spend some serious money on production machines. + +Inertial HSMs take the concept of traditional HSMs, but replace the usual tamper detection mesh with a few security mesh +PCBs. These PCBs are coarser than traditional meshes by orders of magnitude, and would alone not even be close to enough +to keep out even a moderately motivated attacker. IHSMs fix this issue by spinning the entire tamper detection mesh at +very high speed. To tamper with the mesh, an attacker would have to stop it. This, in turn, can be easily detected by +the mesh's alarm circuitry using a simple accelerometer as a rotation sensor. + +In our paper, we have shown a working prototype of the core concepts one needs to build such an IHSM. To build an IHSM +you only need a basic electronics lab. I built the prototype in our paper at home during one of Germany's COVID +lockdowns. You can have a look at our code and CAD on `my git `__. What is missing right +now is an integration of all of these fragments into something cohesive that an interested person with the right tools +could go out and build. We are planning to release this sort of documentation at some point, but right now we are +focusing our effort on the next iteration of the design instead. Stay tuned for updates ;) + +.. _`normal HSM`: {{}} diff --git a/content/blog/jupyterlab-notebook-file-oneliner/index.rst b/content/blog/jupyterlab-notebook-file-oneliner/index.rst new file mode 100644 index 0000000..5a543de --- /dev/null +++ b/content/blog/jupyterlab-notebook-file-oneliner/index.rst @@ -0,0 +1,21 @@ +--- +title: "Getting the .ipynb Notebook File Location From a Running Jupyter Lab Notebook" +date: 2025-06-29T23:42:00+01:00 +summary: > + If you need to get the path of the ipynb file in a running #Jupyter notebook, this one-liner will do the trick. It + seems chatgpt is confused, and a bunch of other approaches on the web look fragile and/or unnecessarily complex to + me. +--- + +If you need to get the path of the ipynb file in a running #Jupyter notebook, this one-liner will do the trick. It seems +chatgpt is confused, and a bunch of other approaches on the web look fragile and/or unnecessarily complex to me. + +.. code:: python + + import sys + Path(json.loads(Path(sys.argv[-1]).read_bytes())['jupyter_session']) + +The way this works is that for each notebook, jupyter starts a python "kernel" process that actually runs the notebook's +code. That kernel gets a json file with info on the notebook's location on the disk passed through its command line. +Since we're running code in that exact python process, we can just grab that json file from sys.argv, and read it +ourselves. diff --git a/content/posts/kicad-mesh-plugin/images/anim.webp b/content/blog/kicad-mesh-plugin/images/anim.webp similarity index 100% rename from content/posts/kicad-mesh-plugin/images/anim.webp rename to content/blog/kicad-mesh-plugin/images/anim.webp diff --git a/content/posts/kicad-mesh-plugin/images/cells-0.svg b/content/blog/kicad-mesh-plugin/images/cells-0.svg similarity index 100% rename from content/posts/kicad-mesh-plugin/images/cells-0.svg rename to content/blog/kicad-mesh-plugin/images/cells-0.svg diff --git a/content/posts/kicad-mesh-plugin/images/cells-100.svg b/content/blog/kicad-mesh-plugin/images/cells-100.svg similarity index 100% rename from content/posts/kicad-mesh-plugin/images/cells-100.svg rename to content/blog/kicad-mesh-plugin/images/cells-100.svg diff --git a/content/posts/kicad-mesh-plugin/images/cells-25.svg b/content/blog/kicad-mesh-plugin/images/cells-25.svg similarity index 100% rename from content/posts/kicad-mesh-plugin/images/cells-25.svg rename to content/blog/kicad-mesh-plugin/images/cells-25.svg diff --git a/content/posts/kicad-mesh-plugin/images/cells-50.svg b/content/blog/kicad-mesh-plugin/images/cells-50.svg similarity index 100% rename from content/posts/kicad-mesh-plugin/images/cells-50.svg rename to content/blog/kicad-mesh-plugin/images/cells-50.svg diff --git a/content/posts/kicad-mesh-plugin/images/cells-75.svg b/content/blog/kicad-mesh-plugin/images/cells-75.svg similarity index 100% rename from content/posts/kicad-mesh-plugin/images/cells-75.svg rename to content/blog/kicad-mesh-plugin/images/cells-75.svg diff --git a/content/posts/kicad-mesh-plugin/images/grid-vis-plain.svg b/content/blog/kicad-mesh-plugin/images/grid-vis-plain.svg similarity index 100% rename from content/posts/kicad-mesh-plugin/images/grid-vis-plain.svg rename to content/blog/kicad-mesh-plugin/images/grid-vis-plain.svg diff --git a/content/posts/kicad-mesh-plugin/images/grid-vis.svg b/content/blog/kicad-mesh-plugin/images/grid-vis.svg similarity index 100% rename from content/posts/kicad-mesh-plugin/images/grid-vis.svg rename to content/blog/kicad-mesh-plugin/images/grid-vis.svg diff --git a/content/posts/kicad-mesh-plugin/images/kicad-mesh-outline.png b/content/blog/kicad-mesh-plugin/images/kicad-mesh-outline.png similarity index 100% rename from content/posts/kicad-mesh-plugin/images/kicad-mesh-outline.png rename to content/blog/kicad-mesh-plugin/images/kicad-mesh-outline.png diff --git a/content/posts/kicad-mesh-plugin/images/kicad-mesh-result-large.png b/content/blog/kicad-mesh-plugin/images/kicad-mesh-result-large.png similarity index 100% rename from content/posts/kicad-mesh-plugin/images/kicad-mesh-result-large.png rename to content/blog/kicad-mesh-plugin/images/kicad-mesh-result-large.png diff --git a/content/posts/kicad-mesh-plugin/images/kicad-mesh-settings.png b/content/blog/kicad-mesh-plugin/images/kicad-mesh-settings.png similarity index 100% rename from content/posts/kicad-mesh-plugin/images/kicad-mesh-settings.png rename to content/blog/kicad-mesh-plugin/images/kicad-mesh-settings.png diff --git a/content/posts/kicad-mesh-plugin/images/kicad-mesh-settings2.png b/content/blog/kicad-mesh-plugin/images/kicad-mesh-settings2.png similarity index 100% rename from content/posts/kicad-mesh-plugin/images/kicad-mesh-settings2.png rename to content/blog/kicad-mesh-plugin/images/kicad-mesh-settings2.png diff --git a/content/posts/kicad-mesh-plugin/images/maze_tiles.svg b/content/blog/kicad-mesh-plugin/images/maze_tiles.svg similarity index 100% rename from content/posts/kicad-mesh-plugin/images/maze_tiles.svg rename to content/blog/kicad-mesh-plugin/images/maze_tiles.svg diff --git a/content/posts/kicad-mesh-plugin/images/maze_tiles_plain.svg b/content/blog/kicad-mesh-plugin/images/maze_tiles_plain.svg similarity index 100% rename from content/posts/kicad-mesh-plugin/images/maze_tiles_plain.svg rename to content/blog/kicad-mesh-plugin/images/maze_tiles_plain.svg diff --git a/content/posts/kicad-mesh-plugin/images/modern_art.svg b/content/blog/kicad-mesh-plugin/images/modern_art.svg similarity index 100% rename from content/posts/kicad-mesh-plugin/images/modern_art.svg rename to content/blog/kicad-mesh-plugin/images/modern_art.svg diff --git a/content/posts/kicad-mesh-plugin/images/tiles-25-small.svg b/content/blog/kicad-mesh-plugin/images/tiles-25-small.svg similarity index 100% rename from content/posts/kicad-mesh-plugin/images/tiles-25-small.svg rename to content/blog/kicad-mesh-plugin/images/tiles-25-small.svg diff --git a/content/posts/kicad-mesh-plugin/images/traces-25-small.svg b/content/blog/kicad-mesh-plugin/images/traces-25-small.svg similarity index 100% rename from content/posts/kicad-mesh-plugin/images/traces-25-small.svg rename to content/blog/kicad-mesh-plugin/images/traces-25-small.svg diff --git a/content/posts/kicad-mesh-plugin/index.rst b/content/blog/kicad-mesh-plugin/index.rst similarity index 86% rename from content/posts/kicad-mesh-plugin/index.rst rename to content/blog/kicad-mesh-plugin/index.rst index 85b407c..0969bf3 100644 --- a/content/posts/kicad-mesh-plugin/index.rst +++ b/content/blog/kicad-mesh-plugin/index.rst @@ -1,12 +1,16 @@ --- title: "Kicad Mesh Plugin" date: 2020-08-18T13:15:39+02:00 +summary: > + I wrote a little KiCad plugin that you can use to create security meshes, heaters and other things where you need + one or more traces cover the entire surface of a PCB. The plugin supports arbitrary PCB shapes, cutouts, and can + route around existing footprints and traces on the PCB. --- .. raw:: html -
- +
+
Tamper Detection Meshes @@ -38,7 +42,7 @@ stored on the card, things such as copying of a card can only be hindered by mak .. raw:: html -
+
@@ -68,7 +72,7 @@ DIY Meshes Throughout my studies in security research I have always had an interest in HSMs. I have taken apart my fair share of HSMs and at this point, to understand the technology more, I want to experiment with building my own HSM. In last year's -`HSM basics <{{}}>`_ post I have lined out some ideas for a next generation design that +`HSM basics <{{}}>`_ post I have lined out some ideas for a next generation design that deviates from the bread-and-butter apporoach of using a mesh as the primary security feature. Before embarking on practical experiments with these ideas, I want to first take a stab at replicating the current state of the art as best I can. State of the art meshes often use exotic substrates such as 3D plastic parts with traces chemically deposited on @@ -93,7 +97,7 @@ usable for this task. .. raw:: html -
+
KiCAD showing an irregular board shape with rounded corners and
         indents. In the middle of the board there is a footprint for a 4-pin surface-mount pin header.
The process starts out with the mesh shape being defined inside KiCAD. The mesh's outline is drawn @@ -104,7 +108,7 @@ usable for this task. .. raw:: html -
+
A vizualization of the grid fitting process. Over the mesh's irregular
         outline a grid is drawn. In this picture, all grid cells that are fully inside the grid are shown. Grid cells
         that overlap the mesh border are highlighted. Grid cells outside of the mesh border are not drawn. @@ -125,25 +129,29 @@ means that on every step, the algorithm is choosing a new direction at random. .. raw:: html -
-
- a completely organized looking grid with spiral patterns all over. -
0%
-
- -
25%
-
- -
50%
-
- -
75%
-
- a completely random looking grid with cells aggregating into ireggular
-        areas that look like paint splotches. -
100%
-
-
+
+
+ a completely organized looking grid with spiral patterns all over. +
0%
+
+
+ +
25%
+
+
+ +
50%
+
+
+ +
75%
+
+
+ a completely random looking grid with cells aggregating into ireggular
+            areas that look like paint splotches. +
100%
+
+
After I have built this tree like you would do in a depth-first search, I draw my one or several mesh mesh traces into it. The core observation here is that there is only 16 possible ways a cell can be connected: It has four neighbors, @@ -153,7 +161,7 @@ sides connected, a straight through, a 90 degree bend, and a "T"-junction—see .. raw:: html -
+
There are six possible tile types in our connectivity graph inside its square tiling. This graphic illustrates @@ -165,7 +173,7 @@ After tiling the grid according to the key above, we get the result below. .. raw:: html -
+
An auto-routed mesh with traces colored according to tile types. @@ -174,7 +182,7 @@ After tiling the grid according to the key above, we get the result below. .. raw:: html -
+
The same mesh, but with traces all black. @@ -185,7 +193,7 @@ Putting it all together got me the KiCAD plugin you can see in the screenshot be .. raw:: html -
+
The plugin settings window open. @@ -194,11 +202,11 @@ Putting it all together got me the KiCAD plugin you can see in the screenshot be .. raw:: html -
- -
- After runing the plugin, the generated mesh looks like this in pcbnew. -
+
+ +
+ After runing the plugin, the generated mesh looks like this in pcbnew. +
I am fairly happy with the result, but getting there was a medium pain. Especially KiCAD's plugin API is still very @@ -214,7 +222,7 @@ making a copy of the board file first and treating mesh generation as a non-reve .. raw:: html -
+
diff --git a/content/blog/kicoil-theory/header.png b/content/blog/kicoil-theory/header.png new file mode 100644 index 0000000..2b95b66 Binary files /dev/null and b/content/blog/kicoil-theory/header.png differ diff --git a/content/blog/kicoil-theory/index.rst b/content/blog/kicoil-theory/index.rst new file mode 100644 index 0000000..c746cea --- /dev/null +++ b/content/blog/kicoil-theory/index.rst @@ -0,0 +1,40 @@ +--- +title: "The KiCoil Planar Coil Generator" +date: 2025-12-31T13:15:39+02:00 +summary: > + I wrote a layout tool generating planar coils that can handle spiral coils, toroidal coils, and hybrids in between + the two. +--- + +.. raw:: html + +
+ +
+ +A planar coil is a coil that is made from flat traces in some printing process like PCB or IC manufacturing, instead of +being wound from wire. A few weeks ago, I needed one such planar coil that + + +Project State +------------- + +Currently, circular coils are special cased. Their layouts are directly generated, without the use of polygon +offsetting. Windings are efficiently approximated using circular arcs. The circular coil layout code is solid, and +contains decent (albeit not infallible) parameter sanity checks. Its main limitation is that sometimes, clearances can +be violated a bit. + +The arbitrary shape code path is less stable, and produces faulty output in some cases. The most common error is +crossing traces near the first vertex of the polygon when the polygon has highly convex or concave parts. I'm still +improving this code path, but as long as you check the output, any errors it produces should be easy to fix by hand. + +If you would like to contribute, I'd welcome any ideas on the arbitrary shape code path. I think there is no single +optimal solution here, and a generic algorithm that can be adjusted to favor for instance shape accuracy versus winding +smoothness would be nice. + +All project links are listed on `https://jaseg.de/projects/kicoil/ `__. You can check +out the code on my git at `https://git.jaseg.de/kicoil.git `__. Issues are tracked on +codeberg at `https://codeberg.org/jaseg/kicoil `__. The kicad addon can be installed +from the KiCad plugin manager, and you can install the standalone kicoil python package `from PyPI +`__. + diff --git a/content/posts/led-characterization/images/daylight_spectrum_dvd.jpg b/content/blog/led-characterization/images/daylight_spectrum_dvd.jpg similarity index 100% rename from content/posts/led-characterization/images/daylight_spectrum_dvd.jpg rename to content/blog/led-characterization/images/daylight_spectrum_dvd.jpg diff --git a/content/posts/led-characterization/images/driver_ringing_strong.jpg b/content/blog/led-characterization/images/driver_ringing_strong.jpg similarity index 100% rename from content/posts/led-characterization/images/driver_ringing_strong.jpg rename to content/blog/led-characterization/images/driver_ringing_strong.jpg diff --git a/content/posts/led-characterization/images/driver_ringing_weak.jpg b/content/blog/led-characterization/images/driver_ringing_weak.jpg similarity index 100% rename from content/posts/led-characterization/images/driver_ringing_weak.jpg rename to content/blog/led-characterization/images/driver_ringing_weak.jpg diff --git a/content/posts/led-characterization/images/electronics_whole.jpg b/content/blog/led-characterization/images/electronics_whole.jpg similarity index 100% rename from content/posts/led-characterization/images/electronics_whole.jpg rename to content/blog/led-characterization/images/electronics_whole.jpg diff --git a/content/posts/led-characterization/images/hsv_cylinder.png b/content/blog/led-characterization/images/hsv_cylinder.png similarity index 100% rename from content/posts/led-characterization/images/hsv_cylinder.png rename to content/blog/led-characterization/images/hsv_cylinder.png diff --git a/content/posts/led-characterization/images/photodiode_sensitivity.svg b/content/blog/led-characterization/images/photodiode_sensitivity.svg similarity index 100% rename from content/posts/led-characterization/images/photodiode_sensitivity.svg rename to content/blog/led-characterization/images/photodiode_sensitivity.svg diff --git a/content/posts/led-characterization/images/preamp_back.jpg b/content/blog/led-characterization/images/preamp_back.jpg similarity index 100% rename from content/posts/led-characterization/images/preamp_back.jpg rename to content/blog/led-characterization/images/preamp_back.jpg diff --git a/content/posts/led-characterization/images/preamp_front.jpg b/content/blog/led-characterization/images/preamp_front.jpg similarity index 100% rename from content/posts/led-characterization/images/preamp_front.jpg rename to content/blog/led-characterization/images/preamp_front.jpg diff --git a/content/posts/led-characterization/images/preamp_schematic.jpg b/content/blog/led-characterization/images/preamp_schematic.jpg similarity index 100% rename from content/posts/led-characterization/images/preamp_schematic.jpg rename to content/blog/led-characterization/images/preamp_schematic.jpg diff --git a/content/posts/led-characterization/images/processed_plot_cheap_rgb.svg b/content/blog/led-characterization/images/processed_plot_cheap_rgb.svg similarity index 100% rename from content/posts/led-characterization/images/processed_plot_cheap_rgb.svg rename to content/blog/led-characterization/images/processed_plot_cheap_rgb.svg diff --git a/content/posts/led-characterization/images/raw_plot_cheap_rgb.svg b/content/blog/led-characterization/images/raw_plot_cheap_rgb.svg similarity index 100% rename from content/posts/led-characterization/images/raw_plot_cheap_rgb.svg rename to content/blog/led-characterization/images/raw_plot_cheap_rgb.svg diff --git a/content/posts/led-characterization/images/rgb_cube.svg b/content/blog/led-characterization/images/rgb_cube.svg similarity index 100% rename from content/posts/led-characterization/images/rgb_cube.svg rename to content/blog/led-characterization/images/rgb_cube.svg diff --git a/content/posts/led-characterization/images/spectrograph_step1_parts.jpg b/content/blog/led-characterization/images/spectrograph_step1_parts.jpg similarity index 100% rename from content/posts/led-characterization/images/spectrograph_step1_parts.jpg rename to content/blog/led-characterization/images/spectrograph_step1_parts.jpg diff --git a/content/posts/led-characterization/images/spectrograph_step2.jpg b/content/blog/led-characterization/images/spectrograph_step2.jpg similarity index 100% rename from content/posts/led-characterization/images/spectrograph_step2.jpg rename to content/blog/led-characterization/images/spectrograph_step2.jpg diff --git a/content/posts/led-characterization/images/spectrograph_step3.jpg b/content/blog/led-characterization/images/spectrograph_step3.jpg similarity index 100% rename from content/posts/led-characterization/images/spectrograph_step3.jpg rename to content/blog/led-characterization/images/spectrograph_step3.jpg diff --git a/content/posts/led-characterization/images/spectrograph_step4_complete.jpg b/content/blog/led-characterization/images/spectrograph_step4_complete.jpg similarity index 100% rename from content/posts/led-characterization/images/spectrograph_step4_complete.jpg rename to content/blog/led-characterization/images/spectrograph_step4_complete.jpg diff --git a/content/posts/led-characterization/images/zeus_hammer_breadboard.jpg b/content/blog/led-characterization/images/zeus_hammer_breadboard.jpg similarity index 100% rename from content/posts/led-characterization/images/zeus_hammer_breadboard.jpg rename to content/blog/led-characterization/images/zeus_hammer_breadboard.jpg diff --git a/content/posts/led-characterization/images/zeus_hammer_breadboard_original.jpg b/content/blog/led-characterization/images/zeus_hammer_breadboard_original.jpg similarity index 100% rename from content/posts/led-characterization/images/zeus_hammer_breadboard_original.jpg rename to content/blog/led-characterization/images/zeus_hammer_breadboard_original.jpg diff --git a/content/posts/led-characterization/images/zeus_hammer_schematic.jpg b/content/blog/led-characterization/images/zeus_hammer_schematic.jpg similarity index 100% rename from content/posts/led-characterization/images/zeus_hammer_schematic.jpg rename to content/blog/led-characterization/images/zeus_hammer_schematic.jpg diff --git a/content/posts/led-characterization/images/zeus_hammer_schematic_original.jpg b/content/blog/led-characterization/images/zeus_hammer_schematic_original.jpg similarity index 100% rename from content/posts/led-characterization/images/zeus_hammer_schematic_original.jpg rename to content/blog/led-characterization/images/zeus_hammer_schematic_original.jpg diff --git a/content/posts/led-characterization/index.rst b/content/blog/led-characterization/index.rst similarity index 95% rename from content/posts/led-characterization/index.rst rename to content/blog/led-characterization/index.rst index 6a8c7ee..31e81cc 100644 --- a/content/posts/led-characterization/index.rst +++ b/content/blog/led-characterization/index.rst @@ -1,6 +1,12 @@ --- title: "LED Characterization" date: 2018-05-02T11:18:38+02:00 +summary: > + Recently, I have been working on a small driver for ambient lighting using 12V LED strips like you can get + inexpensively from China. I wanted to be able to just throw one of these somewhere, stick down some LED tape, hook + it up to a small transformer and be able to control it through Wifi. When I was writing the firmware, I noticed that + when fading between different colors, the colors look *all wrong*! This observation led me down a rabbit hole of + color perception and LED peculiarities. --- Preface @@ -19,7 +25,7 @@ really important so you could dim it down a lot without flickering. I ended up u .. raw:: html -
+
An illustration of the RGB color cube.
An illustration of the RGB color cube. Picture by @@ -46,7 +52,7 @@ transformation. .. raw:: html -
+
An illustration of the HSV color space as a cylinder.
An illustration of the HSV color space as a cylinder. Picture by @@ -67,7 +73,7 @@ particular in the blues and greens we loose *a lot* of colors to sRGB. .. raw:: html -
+
\n') + + def visit_Text(self, node): + if self.in_literal_block: + for match in re.finditer('([^\n]*)(\n|$)', node.astext()): + text, end = match.groups() + + if text: + super().visit_Text(Text(text)) + + if end == '\n': + if isinstance(node.parent, Inline): + self.depart_inline(node.parent) + self.body.append(f'
\n') + if isinstance(node.parent, Inline): + self.visit_inline(node.parent) + + else: + super().visit_Text(node) + + +html_writer = Writer() +html_writer.translator_class = UnfuckedHTMLTranslator +docutils.core.publish_cmdline(writer=html_writer) + diff --git a/public/robots.txt b/public/robots.txt deleted file mode 100644 index 1f53798..0000000 --- a/public/robots.txt +++ /dev/null @@ -1,2 +0,0 @@ -User-agent: * -Disallow: / diff --git a/static/pixacao/index.html b/static/pixacao/index.html new file mode 100644 index 0000000..516b1e8 --- /dev/null +++ b/static/pixacao/index.html @@ -0,0 +1,298 @@ + + + + + + Pixação + + + +
+ +
+ +
+ + Print this page to bestow protection from unforeseen circumstances upon your computer. + +
+ +
+
+
+ +
+ +
+ +
+ + + + diff --git a/static/pixacao/template diagram.svg b/static/pixacao/template diagram.svg new file mode 100644 index 0000000..febc7b4 --- /dev/null +++ b/static/pixacao/template diagram.svg @@ -0,0 +1,1085 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/pixacao/template pixacao onepage.svg b/static/pixacao/template pixacao onepage.svg new file mode 100644 index 0000000..cb4dd8d --- /dev/null +++ b/static/pixacao/template pixacao onepage.svg @@ -0,0 +1,1227 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/wsdiff-example.html b/static/wsdiff-example.html new file mode 100644 index 0000000..59f6ceb --- /dev/null +++ b/static/wsdiff-example.html @@ -0,0 +1,889 @@ + + + + + diff: example_old.py / example.py + + + + + + + + +
+
+ Split view + +
+
+
+
+
+
+
+ + +
+
+
‭example.py
+
+ 1#!/usr/bin/env python3 +1#!/usr/bin/env python3 +2 +2 +3import math +3import math +4import itertools +4import itertools +5import textwrap +5import textwrap +
+6 +6 +7import click +7import click +8from reedmuller import reedmuller +8from reedmuller import reedmuller +9 +9 +10 +10 +11class Tag: +11class Tag: +12 """ Helper class to ease creation of SVG. All API functions that create SVG allow you to substitute this with your +12 """ Helper class to ease creation of SVG. All API functions that create SVG allow you to substitute this with your +13 own implementation by passing a ``tag`` parameter. """ +13 own implementation by passing a ``tag`` parameter. """ +14 +14 +15 def __init__(self, name, children=None, root=False, **attrs): +15 def __init__(self, name, children=None, root=False, **attrs): +16 if (fill := attrs.get('fill')) and isinstance(fill, tuple): +16 if (fill := attrs.get('fill')) and isinstance(fill, tuple): +17 attrs['fill'], attrs['fill-opacity'] = fill +17 attrs['fill'], attrs['fill-opacity'] = fill +18 if (stroke := attrs.get('stroke')) and isinstance(stroke, tuple): +18 if (stroke := attrs.get('stroke')) and isinstance(stroke, tuple): +19 attrs['stroke'], attrs['stroke-opacity'] = stroke +19 attrs['stroke'], attrs['stroke-opacity'] = stroke +20 self.name, self.attrs = name, attrs +20 self.name, self.attrs = name, attrs +21 self.children = children or [] +21 self.children = children or [] +22 self.root = root +22 self.root = root +23 +23 +24 def __str__(self): +24 def __str__(self): +25 prefix = '<?xml version="1.0" encoding="utf-8"?>\n' if self.root else '' +25 prefix = '<?xml version="1.0" encoding="utf-8"?>\n' if self.root else '' +26 opening = ' '.join([self.name] + [f'{key.replace("__", ":").replace("_", "-")}="{value}"' for key, value in self.attrs.items()]) +26 opening = ' '.join([self.name] + [f'{key.replace("__", ":").replace("_", "-")}="{value}"' for key, value in self.attrs.items()]) +27 if self.children: +27 if self.children: +28 children = '\n'.join(textwrap.indent(str(c), ' ') for c in self.children) +28 children = '\n'.join(textwrap.indent(str(c), ' ') for c in self.children) +29 return f'{prefix}<{opening}>\n{children}\n</{self.name}>' +29 return f'{prefix}<{opening}>\n{children}\n</{self.name}>' +
+30 else: +30 else: +31 return f'{prefix}<{opening}/>' +31 return f'{prefix}<{opening}/>' +32 +32 +33 +33 +34 @classmethod +34 @classmethod +35 def setup_svg(kls, tags, bounds, margin=0, unit='mm', pagecolor='white'): +35 def setup_svg(kls, tags, bounds, unit='mm', pagecolor='white', inkscape=False): +36 (min_x, min_y), (max_x, max_y) = bounds +36 (min_x, min_y), (max_x, max_y) = bounds +37 + +38 if margin: + +39 min_x -= margin + +40 min_y -= margin + +41 max_x += margin + +42 max_y += margin + +43 +37 +44 w, h = max_x - min_x, max_y - min_y +38 w, h = max_x - min_x, max_y - min_y +45 w = 1.0 if math.isclose(w, 0.0) else w +39 w = 1.0 if math.isclose(w, 0.0) else w +46 h = 1.0 if math.isclose(h, 0.0) else h +40 h = 1.0 if math.isclose(h, 0.0) else h +47 +41 + +42 if inkscape: + +43 tags.insert(0, kls('sodipodi:namedview', [], id='namedview1', pagecolor=pagecolor, + +44 inkscape__document_units=unit)) +48 namespaces = dict( +45 namespaces = dict( +49 xmlns="http://www.w3.org/2000/svg", +46 xmlns="http://www.w3.org/2000/svg", + +47 xmlns__xlink="http://www.w3.org/1999/xlink", + +48 xmlns__sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd', + +49 xmlns__inkscape='http://www.inkscape.org/namespaces/inkscape') + +50 + +51 else: + +52 namespaces = dict( + +53 xmlns="http://www.w3.org/2000/svg", +50 xmlns__xlink="http://www.w3.org/1999/xlink") +54 xmlns__xlink="http://www.w3.org/1999/xlink") +51 +55 +52 return kls('svg', tags, +56 return kls('svg', tags, +53 width=f'{w}{unit}', height=f'{h}{unit}', +57 width=f'{w}{unit}', height=f'{h}{unit}', +54 viewBox=f'{min_x} {min_y} {w} {h}', +58 viewBox=f'{min_x} {min_y} {w} {h}', +55 style=f'background-color:{pagecolor}', +59 style=f'background-color:{pagecolor}', +
+56 **namespaces, +60 **namespaces, +57 root=True) +61 root=True) +58 +62 +59 +63 +60@click.command() +64@click.command() +61@click.option('-h', '--height', type=float, default=20, help='Bar height in mm') +65@click.option('-h', '--height', type=float, default=20, help='Bar height in mm') +62@click.option('-t/-n', '--text/--no-text', default=True, help='Whether to add text containing the data under the bar code') +66@click.option('-t/-n', '--text/--no-text', default=True, help='Whether to add text containing the data under the bar code') +63@click.option('-f', '--font', default='sans-serif', help='Font for the text underneath the bar code') +67@click.option('-f', '--font', default='sans-serif', help='Font for the text underneath the bar code') +64@click.option('-s', '--font-size', type=float, default=12, help='Font size for the text underneath the bar code in points (pt)') +68@click.option('-s', '--font-size', type=float, default=12, help='Font size for the text underneath the bar code in points (pt)') +65@click.option('-b', '--bar-width', type=float, default=1.0, help='Bar width in mm') +69@click.option('-b', '--bar-width', type=float, default=1.0, help='Bar width in mm') +66@click.option('-m', '--margin', type=float, default=3.0, help='Margin around bar code in mm') +70@click.option('-m', '--margin', type=float, default=3.0, help='Margin around bar code in mm') +67@click.option('-c', '--color', default='black', help='SVG color for the bar code') +71@click.option('-c', '--color', default='black', help='SVG color for the bar code') +68@click.option('--text-color', default=None, help='SVG color for the text (defaults to the bar code\'s color)') +72@click.option('--text-color', default=None, help='SVG color for the text (defaults to the bar code\'s color)') +69@click.option('--dpi', type=float, default=96, help='DPI value to assume for internal SVG unit conversions') +73@click.option('--dpi', type=float, default=96, help='DPI value to assume for internal SVG unit conversions') +70@click.argument('data') +74@click.argument('data') +71@click.argument('outfile', type=click.File('w'), default='-') +75@click.argument('outfile', type=click.File('w'), default='-') +72def cli(data, outfile, height, text, font, font_size, bar_width, margin, color, text_color, dpi): +76def cli(data, outfile, height, text, font, font_size, bar_width, margin, color, text_color, dpi): +73 data = int(data, 16) +77 data = int(data, 16) +74 text_color = text_color or color +78 text_color = text_color or color +75 +79 +76 NUM_BITS = 26 +80 NUM_BITS = 26 +77 +81 +78 data_bits = [bool(data & (1<<i)) for i in range(NUM_BITS)] +82 data_bits = [bool(data & (1<<i)) for i in range(NUM_BITS)] +79 data_encoded = itertools.chain(*[ +83 data_encoded = itertools.chain(*[ +80 (a, not a) for a in data_bits +84 (a, not a) for a in data_bits +81 ]) +85 ]) +82 data_encoded = [True, False, True, False, *data_encoded, False, True, True, False, True] +86 data_encoded = [True, False, True, False, *data_encoded, False, True, True, False, True] +83 +87 +84 width = len(data_encoded) * bar_width +88 width = len(data_encoded) * bar_width +85 # 1 px = 0.75 pt +89 # 1 px = 0.75 pt +86 pt_to_mm = lambda pt: pt / 0.75 /dpi * 25.4 +90 pt_to_mm = lambda pt: pt / 0.75 /dpi * 25.4 +87 font_size = pt_to_mm(font_size) +91 font_size = pt_to_mm(font_size) +88 total_height = height + font_size*2 +92 total_height = height + font_size*2 +89 +93 +90 tags = [] +94 tags = [] +91 for key, group in itertools.groupby(enumerate(data_encoded), key=lambda x: x[1]): +95 for key, group in itertools.groupby(enumerate(data_encoded), key=lambda x: x[1]): +92 if key: +96 if key: +93 group = list(group) +97 group = list(group) +94 x0, _key = group[0] +98 x0, _key = group[0] +95 w = len(group) +99 w = len(group) +96 tags.append(Tag('path', stroke=color, stroke_width=w, d=f'M {(x0 + w/2)*bar_width} 0 l 0 {height}')) +100 tags.append(Tag('path', stroke=color, stroke_width=w, d=f'M {(x0 + w/2)*bar_width} 0 l 0 {height}')) +97 +101 +98 if text: +102 if text: +99 tags.append(Tag('text', children=[f'{data:07x}'], +103 tags.append(Tag('text', children=[f'{data:07x}'], +100 x=width/2, y=height + 0.5*font_size, +104 x=width/2, y=height + 0.5*font_size, +101 font_family=font, font_size=f'{font_size:.3f}px', +105 font_family=font, font_size=f'{font_size:.3f}px', +102 text_anchor='middle', dominant_baseline='hanging', +106 text_anchor='middle', dominant_baseline='hanging', +103 fill=text_color)) +107 fill=text_color)) +104 +108 +
+105 outfile.write(str(Tag.setup_svg(tags, bounds=((0, 0), (width, total_height)), margin=margin))) +109 outfile.write(str(Tag.setup_svg(tags, bounds=((0, 0), (width, total_height)), margin=margin))) +106 +110 +107 +111 +108if __name__ == '__main__': +112if __name__ == '__main__': +109 cli() +113 cli() +
+
+
+ + + diff --git a/themes/hugo-classic/LICENSE.md b/themes/conspiracy/LICENSE similarity index 96% rename from themes/hugo-classic/LICENSE.md rename to themes/conspiracy/LICENSE index c7d9150..17993f6 100644 --- a/themes/hugo-classic/LICENSE.md +++ b/themes/conspiracy/LICENSE @@ -1,5 +1,7 @@ The MIT License (MIT) +Copyright (c) 2023 YOUR_NAME_HERE + 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 diff --git a/themes/conspiracy/archetypes/default.md b/themes/conspiracy/archetypes/default.md new file mode 100644 index 0000000..ac36e06 --- /dev/null +++ b/themes/conspiracy/archetypes/default.md @@ -0,0 +1,2 @@ ++++ ++++ diff --git a/themes/conspiracy/assets/css/style.css b/themes/conspiracy/assets/css/style.css new file mode 100644 index 0000000..89e37bb --- /dev/null +++ b/themes/conspiracy/assets/css/style.css @@ -0,0 +1,765 @@ + +html { + --c-bg-backdrop: #0d1015; + --c-bg-behind: #1f232a; + --c-bg-front: #272c35; + --c-bg-highlight: #383f4c; + --c-bg-figure-backdrop: #383f4c; + --c-text: #d0d0d0; + --c-text-inverted: #101010; + --c-text-muted: #a0a0a0; + --c-text-highlight: #ffffff; + --c-fg-highlight: #e0e0e0; + --c-fg-primary: #fc00b9; + --c-bg-primary: #fc0daf; + --c-fg-secondary: #ff9449; + --c-bg-secondary: #ff9449; + + --shadow-opacity: 0.8; + + --default-border: 0.5px dotted rgba(255, 255, 255, 0.3); +} + +/* +@font-face { + font-family: "Manuskript Gothisch"; + src: url("{{ (resources.Get "fonts/manuskript_gothisch/Manuskript Gothisch UNZ1A.ttf").RelPermalink }}"); +} +*/ + +@font-face { + font-family: "Nyght Serif"; + src: url("{{ (resources.Get "fonts/nyght-serif-main/fonts/WEB/NyghtSerif-Light.woff2").RelPermalink }}"); + font-weight: 100; +} + +@font-face { + font-family: "Nyght Serif"; + src: url("{{ (resources.Get "fonts/nyght-serif-main/fonts/WEB/NyghtSerif-LightItalic.woff2").RelPermalink }}"); + font-weight: 100; + font-style: italic; +} + +@font-face { + font-family: "Nyght Serif"; + src: url("{{ (resources.Get "fonts/nyght-serif-main/fonts/WEB/NyghtSerif-Regular.woff2").RelPermalink }}"); + font-weight: 400; +} + +@font-face { + font-family: "Nyght Serif"; + src: url("{{ (resources.Get "fonts/nyght-serif-main/fonts/WEB/NyghtSerif-RegularItalic.woff2").RelPermalink }}"); + font-weight: 400; + font-style: italic; +} + +@font-face { + font-family: "Nyght Serif"; + src: url("{{ (resources.Get "fonts/nyght-serif-main/fonts/WEB/NyghtSerif-Medium.woff2").RelPermalink }}"); + font-weight: 500; +} + +@font-face { + font-family: "Nyght Serif"; + src: url("{{ (resources.Get "fonts/nyght-serif-main/fonts/WEB/NyghtSerif-MediumItalic.woff2").RelPermalink }}"); + font-weight: 500; + font-style: italic; +} + +@font-face { + font-family: "Nyght Serif"; + src: url("{{ (resources.Get "fonts/nyght-serif-main/fonts/WEB/NyghtSerif-Bold.woff2").RelPermalink }}"); + font-weight: 700; +} + +@font-face { + font-family: "Nyght Serif"; + src: url("{{ (resources.Get "fonts/nyght-serif-main/fonts/WEB/NyghtSerif-BoldItalic.woff2").RelPermalink }}"); + font-weight: 700; + font-style: italic; +} + +@font-face { + font-family: "Nyght Serif"; + src: url("{{ (resources.Get "fonts/nyght-serif-main/fonts/WEB/NyghtSerif-Dark.woff2").RelPermalink }}"); + font-weight: 900; +} + +@font-face { + font-family: "Nyght Serif"; + src: url("{{ (resources.Get "fonts/nyght-serif-main/fonts/WEB/NyghtSerif-DarkItalic.woff2").RelPermalink }}"); + font-weight: 900; + font-style: italic; +} + +@font-face { + font-family: "Roboto Slab"; + src: url("{{ (resources.Get "fonts/roboto_slab/RobotoSlab-VariableFont_wght.ttf").RelPermalink }}") format("truetype-variations"); + font-weight: 100 200 300 400 500 600 700 800 900; +} + +/* +@font-face { + font-family: "Bodoni Moda"; + src: url("{{ (resources.Get "fonts/bodoni_moda/static/BodoniModa_9pt/BodoniModa_9pt-MediumItalic.ttf").RelPermalink }}"); + font-style: italic; +} + +@font-face { + font-family: "Bodoni Moda"; + src: url("{{ (resources.Get "fonts/bodoni_moda/static/BodoniModa_18pt/BodoniModa_18pt-Medium.ttf").RelPermalink }}"); +} +*/ + +@font-face { + font-family: "Fira Code"; + src: url("{{ (resources.Get "fonts/fira_code/FiraCode-VariableFont_wght.ttf").RelPermalink }}") format("truetype-variations"); + font-weight: 300 400 500 600 700; +} + +html, body { + border: 0; + margin: 0; + padding: 0; + min-height: 100vh; +} + +body { + position: relative; /* important for sizing of background image ::before pseudo-element */ + display: flex; + flex-direction: column; + align-items: stretch; + font-family: "Roboto Slab"; + font-weight: 350; + color: var(--c-text); +} + +body::before { + content: ""; + position: absolute; + top: 0; left: 0; + z-index: -1000; + width: 100%; + height: 100%; + /* linear-gradient(hsl(0 0% 100% / 0%), hsl(240 20% 12% / 100%)), */ + background: + linear-gradient(to bottom, hsl(0 0% 8% / 80%), hsl(0 0% 3% / 95%)), + linear-gradient(hsl(220 15% 18%), hsl(220 15% 18%)), + center 20% / cover space no-repeat fixed url("{{ (resources.Get "images/fabrizio-conti-TUmjK7ZJgbI-unsplash.jpg").RelPermalink }}"), + var(--c-bg-backdrop); + background-blend-mode: luminosity, color, normal; +} + +::selection { + background-color: var(--c-bg-secondary); + color: var(--c-text-inverted); +} + +strong { + font-family: "Nyght Serif"; + font-style: italic; +} + +a:hover, a:visited, a:active, a:link { + color: var(--c-fg-secondary); + text-decoration: none; +} + +a:hover { + background: var(--c-bg-primary); + color: var(--c-text); +} + +nav { + display: flex; + flex-direction: row; + flex-wrap: wrap; + background-color: var(--c-bg-front); + box-shadow: 0 0 3px 2px hsl(0 0% 10% / var(--shadow-opacity)); + padding: 0 10px 0 10px; + justify-content: space-between; +} + +nav > div { + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: space-around; + border-top: var(--default-border); + margin-top: -1px; +} + +nav a:link, nav a:active, nav a:visited, nav a:hover { + flex-grow: 1; + text-align: center; + color: inherit; + padding: 10px 10px 10px 10px; +} + +nav a:hover { + background: var(--c-bg-primary); +} + +.breadcrumbs { + max-width: 40em; + text-align: center; + align-self: center; + margin: 0; + padding: 0; +} + +.breadcrumbs li { + list-style: none; + display: inline; +} + +.breadcrumbs li + li::before { + content: "/"; + margin: 0 5px 0 5px; +} + +main::before { + content: ""; + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + backdrop-filter: blur(10px); + z-index: -1; +} + +main { + position: relative; + align-self: center; + margin-top: -100px; + padding: 100px; + max-width: min(100%, 60em); + box-sizing: border-box; + box-shadow: 0 0 3px 2px hsl(0 0% 10% / calc(0.6 * var(--shadow-opacity))); + text-align: justify; + background-color: hsl(260 5% 20% / 40%); + hyphens: auto; +} + +main > .intro { + margin-top: 40px; +} + +h1, h2, h3, h4, h5, h6 { + margin-top: 50px; + margin-bottom: 8px; + font-family: "Nyght Serif"; + text-align: left; + font-weight: 700; +} + +h1 { + font-style: italic; +} + +h2 { + font-size: 30px; + font-weight: 400; +} + +h3 { + font-size: 20px; + font-weight: 700; +} + +/* Prevent long literals from breaking the page layout's width */ +span.pre { + white-space: pre-wrap; + word-wrap: break-word; + overflow-x: auto; + overflow-wrap: anywhere; +} + +body > header { + z-index: 1; + margin-top: 100px; + margin-bottom: 200px; + text-align: center; + display: flex; + flex-direction: column; + align-items: center; +} + +body > header > h1 { + text-align: center; + background-image: linear-gradient(to right, var(--c-fg-primary), var(--c-fg-secondary)); + background-clip: text; + -webkit-background-clip: text; + color: transparent; + filter: drop-shadow(0 0 10px rgba(0, 0, 0, var(--shadow-opacity))); + font-size: clamp(20px, 60px, min(10vw, 10vh)); + /* Padding to avoid the first character getting cut off in firefox */ + padding-left: 40px; + padding-right: 40px; +} + +/* https://css-tricks.com/linearly-scale-font-size-with-css-clamp-based-on-the-viewport/ */ +/* +body > header > h1::first-line { + --min-fs: 3; + --max-fs: 10; + --min-vw: 20; + --max-vw: 40; + + --min-fs-rem: var(--min-fs) * 1rem; + --max-fs-rem: var(--max-fs) * 1rem; + --min-vw-rem: var(--min-vw) * 1rem; + + --slope: (var(--max-fs) - var(--min-fs)) * (100vw - var(--min-vw-rem)) / (var(--max-vw) - var(--min-vw)); + + font-size: clamp(var(--min-fs-rem), var(--min-fs-rem) + var(--slope), var(--max-fs-rem)); +} +*/ + +.pagination-links { + width: 100%; + display: flex; + justify-content: center; + align-items: stretch; +} + +.pagination-links > a { + background-color: var(--c-bg-front); + box-shadow: 0 0 3px 1px rgba(0, 0, 0, calc(0.25*var(--shadow-opacity))); + padding: 10px 20px 10px 20px; +} + +.pagination-links > a:hover { + background: var(--c-bg-primary); +} + +.arrow-right { + display: inline-block; + width: 0; + height: 0; + border-top: .3rem solid transparent; + border-bottom: .3rem solid transparent; + border-left: .3rem solid ; + margin-bottom: .05rem; + margin-left: 5px; +} + +.card { + background-color: var(--c-bg-front); + box-shadow: 0 0 3px 1px rgba(0, 0, 0, calc(0.25*var(--shadow-opacity))); + padding: 30px 20px 30px 20px; + margin-top: 50px; + margin-bottom: 30px; +} + +.card > .links { + margin-left: -20px; + margin-bottom: -30px; + border-top: var(--default-border); + margin-top: 20px; + width: calc(100% + 40px); + display: flex; + flex-direction: row; + justify-content: space-around; +} + +.card > .links > a { + padding: 10px 10px 10px 10px; + flex-grow: 1; + text-align: center; +} + +main > .links { + margin: 20px 0px 40px 0px; + border: var(--default-border); + border-left: none; + border-right: none; + width: calc(100%); + max-width: calc(100%); + display: flex; + flex-flow: row wrap; + justify-content: space-around; +} + +main > .links > a { + padding: 10px 10px 10px 10px; + flex-grow: 1; + text-align: center; +} + +/* un-mess-up rst2html output */ +.card > .summary > .document, .card > .summary > .document > p { + display: inline; +} + +.card > h1, +.card > h2, +.card > h3, +.card > h4, +.card > h5, +.card > h6 { + margin-top: 0px; +} + +tt { + font-family: "Fira Code"; + font-weight: bold; + font-size: 14px; +} + +cite { + font-family: "Fira Code"; + font-weight: bold; + font-size: 14px; + font-style: normal; +} + +figure { + margin-top: 2em; + margin-bottom: 2em; + margin-left: auto; + margin-right: auto; + background-color: var(--c-bg-figure-backdrop); + box-shadow: 0 0 3px 2px rgba(0, 0, 0, calc(0.6*var(--shadow-opacity))); + display: flex; + flex-direction: column; +} + +.subfigure { + margin-top: 2em; + margin-bottom: 2em; + display: grid; + grid-template-columns: 1fr 1fr; + justify-items: stretch; + align-items: stretch; + column-gap: 40px; + row-gap: 40px; +} + +.subfigure > figure { + margin-top: 0; + margin-bottom: 0; +} + +figure.side-by-side { + min-width: 15em; + margin: 0 0 0 0; + padding: 0 40px 0 0; +} + +figure img, figure video { + display: block; + margin: 0 auto 0 auto; + width: 100%; +} + +figcaption { + background-color: var(--c-bg-highlight); + line-height: 16pt; + padding: 1em; + flex-grow: 1; +} + + +figure.header { + margin-left: 0; + margin-right: 0; + margin-top: 0; +} + +img { + max-width: 100%; + margin: 40px auto 40px auto; + display: block; + filter: brightness(70%); + transition: filter 100ms; +} + +img:hover { + filter: none; +} + +.dark-mode-invert { + filter: invert(1) hue-rotate(180deg); +} + +/*****************************************************/ +/* Code block formatting / syntax highlighting rules */ +/*****************************************************/ + +.code { + font-family: "Fira Code"; + font-size: 13px; + text-align: left; /* Override default content "justify" alignment */ + white-space: pre-wrap; + word-wrap: break-word; + overflow-x: auto; + display: grid; + align-items: start; + grid-template-columns: min-content 1fr; +} + +.code > .line { + padding-left: calc(2em + 5px); + text-indent: -2em; + padding-top: 2px; + min-width: 15em; +} + +/* Make individual syntax tokens wrap anywhere */ +.code > .line > span { + overflow-wrap: anywhere; + white-space: pre-wrap; +} + +/* We render line numbers in CSS! */ +.code > .lineno { + counter-increment: lineno; + word-break: keep-all; + margin: 0; + padding-left: 15px; + padding-right: 5px; + overflow: clip; + position: relative; + text-align: right; + color: var(--c-text-muted); + border-right: 1px solid var(--c-fg-highlight); + align-self: stretch; +} + +/* We also handle line continuation markers in CSS. */ +.code > .lineno::after { + position: absolute; + right: 5px; + content: "\a↳\a↳\a↳\a↳\a↳\a↳\a↳\a↳\a↳\a↳\a↳\a↳\a↳\a↳\a↳\a↳\a↳\a↳"; + white-space: pre; + color: var(--c-text-muted); +} + +/* Insert the actual line number */ +.code > .lineno::before { + content: counter(lineno); +} + +.code::before { + counter-reset: lineno; +} + +/* Token styling rules for syntax highlighting */ +.code .hll {} +.code .c { color: var(--c-text); font-weight: 400 } /* Comment */ +.code .n { color: var(--c-text); font-weight: 400 } /* Name */ +.code .o { color: var(--c-text); font-weight: 400 } /* Operator */ +.code .cm { color: var(--c-text); font-weight: 400 } /* Comment.Multiline */ +.code .cp { color: var(--c-text); font-weight: 400 } /* Comment.Preproc */ +.code .c1 { color: var(--c-text); font-weight: 400 } /* Comment.Single */ +.code .cs { color: var(--c-text); font-weight: 400 } /* Comment.Special */ +.code .nd { color: var(--c-text); font-weight: 400 } /* Name.Decorator */ +.code .nn { color: var(--c-text); font-weight: 400 } /* Name.Namespace */ +.code .vc { color: var(--c-text); font-weight: 400 } /* Name.Variable.Class */ +.code .vg { color: var(--c-text); font-weight: 400 } /* Name.Variable.Global */ +.code .vi { color: var(--c-text); font-weight: 400 } /* Name.Variable.Instance */ +.code .err { color: var(--c-text-highlight); font-weight: 500 } /* Error */ +.code .k { color: var(--c-text-highlight); font-weight: 500 } /* Keyword */ +.code .l { color: var(--c-text-highlight); font-weight: 500 } /* Literal */ +.code .kc { color: var(--c-text-highlight); font-weight: 500 } /* Keyword.Constant */ +.code .kd { color: var(--c-text-highlight); font-weight: 500 } /* Keyword.Declaration */ +.code .kn { color: var(--c-text-highlight); font-weight: 500 } /* Keyword.Namespace */ +.code .kp { color: var(--c-text-highlight); font-weight: 500 } /* Keyword.Pseudo */ +.code .kr { color: var(--c-text-highlight); font-weight: 500 } /* Keyword.Reserved */ +.code .kt { color: var(--c-text-highlight); font-weight: 500 } /* Keyword.Type */ +.code .na { color: var(--c-text-highlight); font-weight: 500 } /* Name.Attribute */ +.code .nb { color: var(--c-text-highlight); font-weight: 500 } /* Name.Builtin */ +.code .nc { color: var(--c-text-highlight); font-weight: 500 } /* Name.Class */ +.code .no { color: var(--c-text-highlight); font-weight: 500 } /* Name.Constant */ +.code .ni { color: var(--c-text-highlight); font-weight: 500 } /* Name.Entity */ +.code .ne { color: var(--c-text-highlight); font-weight: 500 } /* Name.Exception */ +.code .nf { color: var(--c-text-highlight); font-weight: 500 } /* Name.Function */ +.code .nl { color: var(--c-text-highlight); font-weight: 500 } /* Name.Label */ +.code .nx { color: var(--c-text-highlight); font-weight: 500 } /* Name.Other */ +.code .py { color: var(--c-text-highlight); font-weight: 500 } /* Name.Property */ +.code .nt { color: var(--c-text-highlight); font-weight: 500 } /* Name.Tag */ +.code .nv { color: var(--c-text-highlight); font-weight: 500 } /* Name.Variable */ +.code .ow { color: var(--c-text-highlight); font-weight: 500 } /* Operator.Word */ +.code .bp { color: var(--c-text-highlight); font-weight: 500 } /* Name.Builtin.Pseudo */ +.code .ld { color: var(--c-text); font-weight: 600 } /* Literal.Date */ +.code .m { color: var(--c-text); font-weight: 600 } /* Literal.Number */ +.code .s { color: var(--c-text); font-weight: 600 } /* Literal.String */ +.code .mb { color: var(--c-text); font-weight: 600 } /* Literal.Number.Bin */ +.code .mf { color: var(--c-text); font-weight: 600 } /* Literal.Number.Float */ +.code .mh { color: var(--c-text); font-weight: 600 } /* Literal.Number.Hex */ +.code .mi { color: var(--c-text); font-weight: 600 } /* Literal.Number.Integer */ +.code .mo { color: var(--c-text); font-weight: 600 } /* Literal.Number.Oct */ +.code .sb { color: var(--c-text); font-weight: 600 } /* Literal.String.Backtick */ +.code .sc { color: var(--c-text); font-weight: 600 } /* Literal.String.Char */ +.code .sd { color: var(--c-text); font-weight: 600 } /* Literal.String.Doc */ +.code .s2 { color: var(--c-text); font-weight: 600 } /* Literal.String.Double */ +.code .se { color: var(--c-text); font-weight: 600 } /* Literal.String.Escape */ +.code .sh { color: var(--c-text); font-weight: 600 } /* Literal.String.Heredoc */ +.code .si { color: var(--c-text); font-weight: 600 } /* Literal.String.Interpol */ +.code .sx { color: var(--c-text); font-weight: 600 } /* Literal.String.Other */ +.code .sr { color: var(--c-text); font-weight: 600 } /* Literal.String.Regex */ +.code .s1 { color: var(--c-text); font-weight: 600 } /* Literal.String.Single */ +.code .ss { color: var(--c-text); font-weight: 600 } /* Literal.String.Symbol */ +.code .il { color: var(--c-text); font-weight: 600 } /* Literal.Number.Integer.Long */ + +footer { + margin-top: 30px; + align-self: center; + margin-bottom: 10px; + text-align: center; + padding: 5px 25px 5px 25px; +} + +@media (max-width: 40em) { + nav > div { + flex-grow: 1; + } + + main { + padding-left: 20px; + padding-right: 20px; + } +} + +.search { + align-self: center; + max-width: calc(100vw - 20px); + flex-grow: 1; + margin-left: 10px; + margin-right: 10px; +} + +.pagefind-ui__form { + max-width: 100%; +} + +.search input { + height: 1.5lh; + max-width: 100%; +} + +#search, .pagefind-ui, #search form, #search input { + width: 100%; +} + +.search button { + display: none; +} + +.pagefind-ui__drawer { + position: fixed; + margin-top: 10px; + background: var(--c-bg-highlight); + max-width: min(100%, min(100vw, 40em)); + max-height: 100%; + overflow-x: clip; + overflow-y: scroll; + text-overflow: clip; + z-index: 100; +} + +.pagefind-ui__message { + font-family: "Nyght Serif"; + font-weight: 700; + font-size: 16pt; +} + +.pagefind-ui__results-area { + padding: 10px; +} + +.pagefind-ui__results-area img { + max-width: min(50vw, 200px); +} + +.pagefind-ui__results-area a { + max-width: min(50vw, 200px); + color: var(--c-fg-secondary) !important; + text-decoration: none; + padding: 10px 10px 10px 0 !important; + font-family: "Nyght Serif"; + font-weight: 700; + font-size: 12pt; +} + +.pagefind-ui__results-area figure, .pagefind-ui__results-area div.subfigure, .pagefind-ui__results-area img { + display: none; +} + +@media print, (prefers-color-scheme: light) { + html { + --c-bg-backdrop: hsl(220, 10%, 90%); + --c-bg-behind: hsl(220, 10%, 95%); + --c-bg-front: hsl(220, 10%, 96%); + --c-bg-highlight: #ffffff; + --c-bg-figure-backdrop: #f0f0f0; + --c-text: hsl(220, 20%, 30%); + --c-text-inverted: hsl(220, 20%, 100%); + --c-text-muted: #5d5980; + --c-text-highlight: #000000; + --c-fg-highlight: #3c4b62; + --c-fg-primary: hsl(25, 100%, 64%); + --c-bg-primary: hsl(25, 100%, 64%); + --c-fg-secondary: hsl(319, 98%, 52%); + --c-bg-secondary: hsl(319, 98%, 52%); + + --shadow-opacity: 0.2; + + --default-border: 0.5px dotted hsla(220, 10%, 30%, 50%); + } + + body::before { + background: + linear-gradient(to bottom, hsl(0 0% 100% / 70%), hsl(0 0% 90% / 80%)), + linear-gradient(hsl(260 10% 10%), hsl(260 10% 10%)), + center 20% / cover space no-repeat fixed url("{{ (resources.Get "images/fabrizio-conti-TUmjK7ZJgbI-unsplash.jpg").RelPermalink }}"), + var(--c-bg-backdrop); + } + + main::before { + backdrop-filter: brightness(106%) blur(10px); + } + + main { + background-color: hsl(260 5% 90% / 40%); + } + + body > header > h1 { + filter: drop-shadow(0 0 10px rgba(0, 0, 0, 0.4)); + } + + a:hover, nav a:hover { + color: var(--c-text-inverted); + } + + img { + filter: none; + } + + .dark-mode-invert { + filter: none; + } + + .card { + box-shadow: 0 0 3px 1px rgba(0, 0, 0, calc(0.5*var(--shadow-opacity))); + } +} + +@media print, (max-width: 60em) { + main::before { + backdrop-filter: none; + } + + main { + background-color: hsl(230 10% 15%); + } +} + +@media print, (max-width: 60em) and (prefers-color-scheme: light) { + main { + background-color: hsl(260 5% 90%); + } +} + diff --git a/themes/conspiracy/assets/fonts/bodoni_moda/BodoniModa-Italic-VariableFont_opsz,wght.ttf b/themes/conspiracy/assets/fonts/bodoni_moda/BodoniModa-Italic-VariableFont_opsz,wght.ttf new file mode 100644 index 0000000..c07e0ea Binary files /dev/null and b/themes/conspiracy/assets/fonts/bodoni_moda/BodoniModa-Italic-VariableFont_opsz,wght.ttf differ diff --git a/themes/conspiracy/assets/fonts/bodoni_moda/BodoniModa-VariableFont_opsz,wght.ttf b/themes/conspiracy/assets/fonts/bodoni_moda/BodoniModa-VariableFont_opsz,wght.ttf new file mode 100644 index 0000000..f943195 Binary files /dev/null and b/themes/conspiracy/assets/fonts/bodoni_moda/BodoniModa-VariableFont_opsz,wght.ttf differ diff --git a/themes/conspiracy/assets/fonts/bodoni_moda/OFL.txt b/themes/conspiracy/assets/fonts/bodoni_moda/OFL.txt new file mode 100644 index 0000000..ac5c663 --- /dev/null +++ b/themes/conspiracy/assets/fonts/bodoni_moda/OFL.txt @@ -0,0 +1,93 @@ +Copyright 2020 The Bodoni Moda Project Authors (https://github.com/indestructible-type/Bodoni) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/themes/conspiracy/assets/fonts/bodoni_moda/README.txt b/themes/conspiracy/assets/fonts/bodoni_moda/README.txt new file mode 100644 index 0000000..d0fc50f --- /dev/null +++ b/themes/conspiracy/assets/fonts/bodoni_moda/README.txt @@ -0,0 +1,124 @@ +Bodoni Moda Variable Font +========================= + +This download contains Bodoni Moda as both variable fonts and static fonts. + +Bodoni Moda is a variable font with these axes: + opsz + wght + +This means all the styles are contained in these files: + BodoniModa-VariableFont_opsz,wght.ttf + BodoniModa-Italic-VariableFont_opsz,wght.ttf + +If your app fully supports variable fonts, you can now pick intermediate styles +that aren’t available as static fonts. Not all apps support variable fonts, and +in those cases you can use the static font files for Bodoni Moda: + static/BodoniModa_9pt/BodoniModa_9pt-Regular.ttf + static/BodoniModa_9pt/BodoniModa_9pt-Medium.ttf + static/BodoniModa_9pt/BodoniModa_9pt-SemiBold.ttf + static/BodoniModa_9pt/BodoniModa_9pt-Bold.ttf + static/BodoniModa_9pt/BodoniModa_9pt-ExtraBold.ttf + static/BodoniModa_9pt/BodoniModa_9pt-Black.ttf + static/BodoniModa_18pt/BodoniModa_18pt-Regular.ttf + static/BodoniModa_18pt/BodoniModa_18pt-Medium.ttf + static/BodoniModa_18pt/BodoniModa_18pt-SemiBold.ttf + static/BodoniModa_18pt/BodoniModa_18pt-Bold.ttf + static/BodoniModa_18pt/BodoniModa_18pt-ExtraBold.ttf + static/BodoniModa_18pt/BodoniModa_18pt-Black.ttf + static/BodoniModa_28pt/BodoniModa_28pt-Regular.ttf + static/BodoniModa_28pt/BodoniModa_28pt-Medium.ttf + static/BodoniModa_28pt/BodoniModa_28pt-SemiBold.ttf + static/BodoniModa_28pt/BodoniModa_28pt-Bold.ttf + static/BodoniModa_28pt/BodoniModa_28pt-ExtraBold.ttf + static/BodoniModa_28pt/BodoniModa_28pt-Black.ttf + static/BodoniModa_48pt/BodoniModa_48pt-Regular.ttf + static/BodoniModa_48pt/BodoniModa_48pt-Medium.ttf + static/BodoniModa_48pt/BodoniModa_48pt-SemiBold.ttf + static/BodoniModa_48pt/BodoniModa_48pt-Bold.ttf + static/BodoniModa_48pt/BodoniModa_48pt-ExtraBold.ttf + static/BodoniModa_48pt/BodoniModa_48pt-Black.ttf + static/BodoniModa_72pt/BodoniModa_72pt-Regular.ttf + static/BodoniModa_72pt/BodoniModa_72pt-Medium.ttf + static/BodoniModa_72pt/BodoniModa_72pt-SemiBold.ttf + static/BodoniModa_72pt/BodoniModa_72pt-Bold.ttf + static/BodoniModa_72pt/BodoniModa_72pt-ExtraBold.ttf + static/BodoniModa_72pt/BodoniModa_72pt-Black.ttf + static/BodoniModa_9pt/BodoniModa_9pt-Italic.ttf + static/BodoniModa_9pt/BodoniModa_9pt-MediumItalic.ttf + static/BodoniModa_9pt/BodoniModa_9pt-SemiBoldItalic.ttf + static/BodoniModa_9pt/BodoniModa_9pt-BoldItalic.ttf + static/BodoniModa_9pt/BodoniModa_9pt-ExtraBoldItalic.ttf + static/BodoniModa_9pt/BodoniModa_9pt-BlackItalic.ttf + static/BodoniModa_18pt/BodoniModa_18pt-Italic.ttf + static/BodoniModa_18pt/BodoniModa_18pt-MediumItalic.ttf + static/BodoniModa_18pt/BodoniModa_18pt-SemiBoldItalic.ttf + static/BodoniModa_18pt/BodoniModa_18pt-BoldItalic.ttf + static/BodoniModa_18pt/BodoniModa_18pt-ExtraBoldItalic.ttf + static/BodoniModa_18pt/BodoniModa_18pt-BlackItalic.ttf + static/BodoniModa_28pt/BodoniModa_28pt-Italic.ttf + static/BodoniModa_28pt/BodoniModa_28pt-MediumItalic.ttf + static/BodoniModa_28pt/BodoniModa_28pt-SemiBoldItalic.ttf + static/BodoniModa_28pt/BodoniModa_28pt-BoldItalic.ttf + static/BodoniModa_28pt/BodoniModa_28pt-ExtraBoldItalic.ttf + static/BodoniModa_28pt/BodoniModa_28pt-BlackItalic.ttf + static/BodoniModa_48pt/BodoniModa_48pt-Italic.ttf + static/BodoniModa_48pt/BodoniModa_48pt-MediumItalic.ttf + static/BodoniModa_48pt/BodoniModa_48pt-SemiBoldItalic.ttf + static/BodoniModa_48pt/BodoniModa_48pt-BoldItalic.ttf + static/BodoniModa_48pt/BodoniModa_48pt-ExtraBoldItalic.ttf + static/BodoniModa_48pt/BodoniModa_48pt-BlackItalic.ttf + static/BodoniModa_72pt/BodoniModa_72pt-Italic.ttf + static/BodoniModa_72pt/BodoniModa_72pt-MediumItalic.ttf + static/BodoniModa_72pt/BodoniModa_72pt-SemiBoldItalic.ttf + static/BodoniModa_72pt/BodoniModa_72pt-BoldItalic.ttf + static/BodoniModa_72pt/BodoniModa_72pt-ExtraBoldItalic.ttf + static/BodoniModa_72pt/BodoniModa_72pt-BlackItalic.ttf + +Get started +----------- + +1. Install the font files you want to use + +2. Use your app's font picker to view the font family and all the +available styles + +Learn more about variable fonts +------------------------------- + + https://developers.google.com/web/fundamentals/design-and-ux/typography/variable-fonts + https://variablefonts.typenetwork.com + https://medium.com/variable-fonts + +In desktop apps + + https://theblog.adobe.com/can-variable-fonts-illustrator-cc + https://helpx.adobe.com/nz/photoshop/using/fonts.html#variable_fonts + +Online + + https://developers.google.com/fonts/docs/getting_started + https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Fonts/Variable_Fonts_Guide + https://developer.microsoft.com/en-us/microsoft-edge/testdrive/demos/variable-fonts + +Installing fonts + + MacOS: https://support.apple.com/en-us/HT201749 + Linux: https://www.google.com/search?q=how+to+install+a+font+on+gnu%2Blinux + Windows: https://support.microsoft.com/en-us/help/314960/how-to-install-or-remove-a-font-in-windows + +Android Apps + + https://developers.google.com/fonts/docs/android + https://developer.android.com/guide/topics/ui/look-and-feel/downloadable-fonts + +License +------- +Please read the full license text (OFL.txt) to understand the permissions, +restrictions and requirements for usage, redistribution, and modification. + +You can use them in your products & projects – print or digital, +commercial or otherwise. + +This isn't legal advice, please consider consulting a lawyer and see the full +license for all details. diff --git a/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_18pt/BodoniModa_18pt-Black.ttf b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_18pt/BodoniModa_18pt-Black.ttf new file mode 100644 index 0000000..185d01d Binary files /dev/null and b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_18pt/BodoniModa_18pt-Black.ttf differ diff --git a/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_18pt/BodoniModa_18pt-BlackItalic.ttf b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_18pt/BodoniModa_18pt-BlackItalic.ttf new file mode 100644 index 0000000..0135e30 Binary files /dev/null and b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_18pt/BodoniModa_18pt-BlackItalic.ttf differ diff --git a/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_18pt/BodoniModa_18pt-Bold.ttf b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_18pt/BodoniModa_18pt-Bold.ttf new file mode 100644 index 0000000..f47dfbf Binary files /dev/null and b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_18pt/BodoniModa_18pt-Bold.ttf differ diff --git a/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_18pt/BodoniModa_18pt-BoldItalic.ttf b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_18pt/BodoniModa_18pt-BoldItalic.ttf new file mode 100644 index 0000000..aa8c674 Binary files /dev/null and b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_18pt/BodoniModa_18pt-BoldItalic.ttf differ diff --git a/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_18pt/BodoniModa_18pt-ExtraBold.ttf b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_18pt/BodoniModa_18pt-ExtraBold.ttf new file mode 100644 index 0000000..6f20a92 Binary files /dev/null and b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_18pt/BodoniModa_18pt-ExtraBold.ttf differ diff --git a/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_18pt/BodoniModa_18pt-ExtraBoldItalic.ttf b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_18pt/BodoniModa_18pt-ExtraBoldItalic.ttf new file mode 100644 index 0000000..fd47a26 Binary files /dev/null and b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_18pt/BodoniModa_18pt-ExtraBoldItalic.ttf differ diff --git a/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_18pt/BodoniModa_18pt-Italic.ttf b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_18pt/BodoniModa_18pt-Italic.ttf new file mode 100644 index 0000000..a5e3586 Binary files /dev/null and b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_18pt/BodoniModa_18pt-Italic.ttf differ diff --git a/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_18pt/BodoniModa_18pt-Medium.ttf b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_18pt/BodoniModa_18pt-Medium.ttf new file mode 100644 index 0000000..18728fc Binary files /dev/null and b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_18pt/BodoniModa_18pt-Medium.ttf differ diff --git a/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_18pt/BodoniModa_18pt-MediumItalic.ttf b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_18pt/BodoniModa_18pt-MediumItalic.ttf new file mode 100644 index 0000000..becd9ad Binary files /dev/null and b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_18pt/BodoniModa_18pt-MediumItalic.ttf differ diff --git a/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_18pt/BodoniModa_18pt-Regular.ttf b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_18pt/BodoniModa_18pt-Regular.ttf new file mode 100644 index 0000000..508beea Binary files /dev/null and b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_18pt/BodoniModa_18pt-Regular.ttf differ diff --git a/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_18pt/BodoniModa_18pt-SemiBold.ttf b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_18pt/BodoniModa_18pt-SemiBold.ttf new file mode 100644 index 0000000..65533fa Binary files /dev/null and b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_18pt/BodoniModa_18pt-SemiBold.ttf differ diff --git a/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_18pt/BodoniModa_18pt-SemiBoldItalic.ttf b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_18pt/BodoniModa_18pt-SemiBoldItalic.ttf new file mode 100644 index 0000000..91b43ed Binary files /dev/null and b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_18pt/BodoniModa_18pt-SemiBoldItalic.ttf differ diff --git a/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_28pt/BodoniModa_28pt-Black.ttf b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_28pt/BodoniModa_28pt-Black.ttf new file mode 100644 index 0000000..eba4705 Binary files /dev/null and b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_28pt/BodoniModa_28pt-Black.ttf differ diff --git a/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_28pt/BodoniModa_28pt-BlackItalic.ttf b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_28pt/BodoniModa_28pt-BlackItalic.ttf new file mode 100644 index 0000000..6e44d6a Binary files /dev/null and b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_28pt/BodoniModa_28pt-BlackItalic.ttf differ diff --git a/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_28pt/BodoniModa_28pt-Bold.ttf b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_28pt/BodoniModa_28pt-Bold.ttf new file mode 100644 index 0000000..c1fa8ab Binary files /dev/null and b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_28pt/BodoniModa_28pt-Bold.ttf differ diff --git a/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_28pt/BodoniModa_28pt-BoldItalic.ttf b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_28pt/BodoniModa_28pt-BoldItalic.ttf new file mode 100644 index 0000000..fd03a9e Binary files /dev/null and b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_28pt/BodoniModa_28pt-BoldItalic.ttf differ diff --git a/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_28pt/BodoniModa_28pt-ExtraBold.ttf b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_28pt/BodoniModa_28pt-ExtraBold.ttf new file mode 100644 index 0000000..2a1297d Binary files /dev/null and b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_28pt/BodoniModa_28pt-ExtraBold.ttf differ diff --git a/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_28pt/BodoniModa_28pt-ExtraBoldItalic.ttf b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_28pt/BodoniModa_28pt-ExtraBoldItalic.ttf new file mode 100644 index 0000000..18ff90f Binary files /dev/null and b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_28pt/BodoniModa_28pt-ExtraBoldItalic.ttf differ diff --git a/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_28pt/BodoniModa_28pt-Italic.ttf b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_28pt/BodoniModa_28pt-Italic.ttf new file mode 100644 index 0000000..fc6e85b Binary files /dev/null and b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_28pt/BodoniModa_28pt-Italic.ttf differ diff --git a/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_28pt/BodoniModa_28pt-Medium.ttf b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_28pt/BodoniModa_28pt-Medium.ttf new file mode 100644 index 0000000..da3c186 Binary files /dev/null and b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_28pt/BodoniModa_28pt-Medium.ttf differ diff --git a/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_28pt/BodoniModa_28pt-MediumItalic.ttf b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_28pt/BodoniModa_28pt-MediumItalic.ttf new file mode 100644 index 0000000..024c962 Binary files /dev/null and b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_28pt/BodoniModa_28pt-MediumItalic.ttf differ diff --git a/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_28pt/BodoniModa_28pt-Regular.ttf b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_28pt/BodoniModa_28pt-Regular.ttf new file mode 100644 index 0000000..469edd3 Binary files /dev/null and b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_28pt/BodoniModa_28pt-Regular.ttf differ diff --git a/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_28pt/BodoniModa_28pt-SemiBold.ttf b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_28pt/BodoniModa_28pt-SemiBold.ttf new file mode 100644 index 0000000..43849f4 Binary files /dev/null and b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_28pt/BodoniModa_28pt-SemiBold.ttf differ diff --git a/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_28pt/BodoniModa_28pt-SemiBoldItalic.ttf b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_28pt/BodoniModa_28pt-SemiBoldItalic.ttf new file mode 100644 index 0000000..90cf8c5 Binary files /dev/null and b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_28pt/BodoniModa_28pt-SemiBoldItalic.ttf differ diff --git a/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_48pt/BodoniModa_48pt-Black.ttf b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_48pt/BodoniModa_48pt-Black.ttf new file mode 100644 index 0000000..839aae8 Binary files /dev/null and b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_48pt/BodoniModa_48pt-Black.ttf differ diff --git a/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_48pt/BodoniModa_48pt-BlackItalic.ttf b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_48pt/BodoniModa_48pt-BlackItalic.ttf new file mode 100644 index 0000000..79c3ac0 Binary files /dev/null and b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_48pt/BodoniModa_48pt-BlackItalic.ttf differ diff --git a/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_48pt/BodoniModa_48pt-Bold.ttf b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_48pt/BodoniModa_48pt-Bold.ttf new file mode 100644 index 0000000..2da9788 Binary files /dev/null and b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_48pt/BodoniModa_48pt-Bold.ttf differ diff --git a/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_48pt/BodoniModa_48pt-BoldItalic.ttf b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_48pt/BodoniModa_48pt-BoldItalic.ttf new file mode 100644 index 0000000..a819d79 Binary files /dev/null and b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_48pt/BodoniModa_48pt-BoldItalic.ttf differ diff --git a/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_48pt/BodoniModa_48pt-ExtraBold.ttf b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_48pt/BodoniModa_48pt-ExtraBold.ttf new file mode 100644 index 0000000..d44e897 Binary files /dev/null and b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_48pt/BodoniModa_48pt-ExtraBold.ttf differ diff --git a/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_48pt/BodoniModa_48pt-ExtraBoldItalic.ttf b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_48pt/BodoniModa_48pt-ExtraBoldItalic.ttf new file mode 100644 index 0000000..065496b Binary files /dev/null and b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_48pt/BodoniModa_48pt-ExtraBoldItalic.ttf differ diff --git a/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_48pt/BodoniModa_48pt-Italic.ttf b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_48pt/BodoniModa_48pt-Italic.ttf new file mode 100644 index 0000000..011b785 Binary files /dev/null and b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_48pt/BodoniModa_48pt-Italic.ttf differ diff --git a/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_48pt/BodoniModa_48pt-Medium.ttf b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_48pt/BodoniModa_48pt-Medium.ttf new file mode 100644 index 0000000..b452607 Binary files /dev/null and b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_48pt/BodoniModa_48pt-Medium.ttf differ diff --git a/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_48pt/BodoniModa_48pt-MediumItalic.ttf b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_48pt/BodoniModa_48pt-MediumItalic.ttf new file mode 100644 index 0000000..6adcb7c Binary files /dev/null and b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_48pt/BodoniModa_48pt-MediumItalic.ttf differ diff --git a/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_48pt/BodoniModa_48pt-Regular.ttf b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_48pt/BodoniModa_48pt-Regular.ttf new file mode 100644 index 0000000..591f543 Binary files /dev/null and b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_48pt/BodoniModa_48pt-Regular.ttf differ diff --git a/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_48pt/BodoniModa_48pt-SemiBold.ttf b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_48pt/BodoniModa_48pt-SemiBold.ttf new file mode 100644 index 0000000..26f1e0f Binary files /dev/null and b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_48pt/BodoniModa_48pt-SemiBold.ttf differ diff --git a/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_48pt/BodoniModa_48pt-SemiBoldItalic.ttf b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_48pt/BodoniModa_48pt-SemiBoldItalic.ttf new file mode 100644 index 0000000..1331fbc Binary files /dev/null and b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_48pt/BodoniModa_48pt-SemiBoldItalic.ttf differ diff --git a/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_72pt/BodoniModa_72pt-Black.ttf b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_72pt/BodoniModa_72pt-Black.ttf new file mode 100644 index 0000000..a4afc93 Binary files /dev/null and b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_72pt/BodoniModa_72pt-Black.ttf differ diff --git a/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_72pt/BodoniModa_72pt-BlackItalic.ttf b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_72pt/BodoniModa_72pt-BlackItalic.ttf new file mode 100644 index 0000000..d177644 Binary files /dev/null and b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_72pt/BodoniModa_72pt-BlackItalic.ttf differ diff --git a/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_72pt/BodoniModa_72pt-Bold.ttf b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_72pt/BodoniModa_72pt-Bold.ttf new file mode 100644 index 0000000..6bd141d Binary files /dev/null and b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_72pt/BodoniModa_72pt-Bold.ttf differ diff --git a/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_72pt/BodoniModa_72pt-BoldItalic.ttf b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_72pt/BodoniModa_72pt-BoldItalic.ttf new file mode 100644 index 0000000..2e3df3d Binary files /dev/null and b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_72pt/BodoniModa_72pt-BoldItalic.ttf differ diff --git a/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_72pt/BodoniModa_72pt-ExtraBold.ttf b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_72pt/BodoniModa_72pt-ExtraBold.ttf new file mode 100644 index 0000000..0652136 Binary files /dev/null and b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_72pt/BodoniModa_72pt-ExtraBold.ttf differ diff --git a/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_72pt/BodoniModa_72pt-ExtraBoldItalic.ttf b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_72pt/BodoniModa_72pt-ExtraBoldItalic.ttf new file mode 100644 index 0000000..f0abc45 Binary files /dev/null and b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_72pt/BodoniModa_72pt-ExtraBoldItalic.ttf differ diff --git a/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_72pt/BodoniModa_72pt-Italic.ttf b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_72pt/BodoniModa_72pt-Italic.ttf new file mode 100644 index 0000000..157066c Binary files /dev/null and b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_72pt/BodoniModa_72pt-Italic.ttf differ diff --git a/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_72pt/BodoniModa_72pt-Medium.ttf b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_72pt/BodoniModa_72pt-Medium.ttf new file mode 100644 index 0000000..df6c77e Binary files /dev/null and b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_72pt/BodoniModa_72pt-Medium.ttf differ diff --git a/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_72pt/BodoniModa_72pt-MediumItalic.ttf b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_72pt/BodoniModa_72pt-MediumItalic.ttf new file mode 100644 index 0000000..487d436 Binary files /dev/null and b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_72pt/BodoniModa_72pt-MediumItalic.ttf differ diff --git a/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_72pt/BodoniModa_72pt-Regular.ttf b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_72pt/BodoniModa_72pt-Regular.ttf new file mode 100644 index 0000000..599ef60 Binary files /dev/null and b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_72pt/BodoniModa_72pt-Regular.ttf differ diff --git a/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_72pt/BodoniModa_72pt-SemiBold.ttf b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_72pt/BodoniModa_72pt-SemiBold.ttf new file mode 100644 index 0000000..637df88 Binary files /dev/null and b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_72pt/BodoniModa_72pt-SemiBold.ttf differ diff --git a/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_72pt/BodoniModa_72pt-SemiBoldItalic.ttf b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_72pt/BodoniModa_72pt-SemiBoldItalic.ttf new file mode 100644 index 0000000..831a4c5 Binary files /dev/null and b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_72pt/BodoniModa_72pt-SemiBoldItalic.ttf differ diff --git a/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_9pt/BodoniModa_9pt-Black.ttf b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_9pt/BodoniModa_9pt-Black.ttf new file mode 100644 index 0000000..157ba8c Binary files /dev/null and b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_9pt/BodoniModa_9pt-Black.ttf differ diff --git a/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_9pt/BodoniModa_9pt-BlackItalic.ttf b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_9pt/BodoniModa_9pt-BlackItalic.ttf new file mode 100644 index 0000000..ff3e3cf Binary files /dev/null and b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_9pt/BodoniModa_9pt-BlackItalic.ttf differ diff --git a/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_9pt/BodoniModa_9pt-Bold.ttf b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_9pt/BodoniModa_9pt-Bold.ttf new file mode 100644 index 0000000..cb232c8 Binary files /dev/null and b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_9pt/BodoniModa_9pt-Bold.ttf differ diff --git a/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_9pt/BodoniModa_9pt-BoldItalic.ttf b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_9pt/BodoniModa_9pt-BoldItalic.ttf new file mode 100644 index 0000000..d838ee6 Binary files /dev/null and b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_9pt/BodoniModa_9pt-BoldItalic.ttf differ diff --git a/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_9pt/BodoniModa_9pt-ExtraBold.ttf b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_9pt/BodoniModa_9pt-ExtraBold.ttf new file mode 100644 index 0000000..6d7cd44 Binary files /dev/null and b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_9pt/BodoniModa_9pt-ExtraBold.ttf differ diff --git a/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_9pt/BodoniModa_9pt-ExtraBoldItalic.ttf b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_9pt/BodoniModa_9pt-ExtraBoldItalic.ttf new file mode 100644 index 0000000..7d3195d Binary files /dev/null and b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_9pt/BodoniModa_9pt-ExtraBoldItalic.ttf differ diff --git a/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_9pt/BodoniModa_9pt-Italic.ttf b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_9pt/BodoniModa_9pt-Italic.ttf new file mode 100644 index 0000000..eaf7aaf Binary files /dev/null and b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_9pt/BodoniModa_9pt-Italic.ttf differ diff --git a/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_9pt/BodoniModa_9pt-Medium.ttf b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_9pt/BodoniModa_9pt-Medium.ttf new file mode 100644 index 0000000..76747c2 Binary files /dev/null and b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_9pt/BodoniModa_9pt-Medium.ttf differ diff --git a/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_9pt/BodoniModa_9pt-MediumItalic.ttf b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_9pt/BodoniModa_9pt-MediumItalic.ttf new file mode 100644 index 0000000..30e82bd Binary files /dev/null and b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_9pt/BodoniModa_9pt-MediumItalic.ttf differ diff --git a/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_9pt/BodoniModa_9pt-Regular.ttf b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_9pt/BodoniModa_9pt-Regular.ttf new file mode 100644 index 0000000..a85bcac Binary files /dev/null and b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_9pt/BodoniModa_9pt-Regular.ttf differ diff --git a/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_9pt/BodoniModa_9pt-SemiBold.ttf b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_9pt/BodoniModa_9pt-SemiBold.ttf new file mode 100644 index 0000000..510f964 Binary files /dev/null and b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_9pt/BodoniModa_9pt-SemiBold.ttf differ diff --git a/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_9pt/BodoniModa_9pt-SemiBoldItalic.ttf b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_9pt/BodoniModa_9pt-SemiBoldItalic.ttf new file mode 100644 index 0000000..77f97e9 Binary files /dev/null and b/themes/conspiracy/assets/fonts/bodoni_moda/static/BodoniModa_9pt/BodoniModa_9pt-SemiBoldItalic.ttf differ diff --git a/themes/conspiracy/assets/fonts/fira_code/FiraCode-VariableFont_wght.ttf b/themes/conspiracy/assets/fonts/fira_code/FiraCode-VariableFont_wght.ttf new file mode 100644 index 0000000..f75b2a2 Binary files /dev/null and b/themes/conspiracy/assets/fonts/fira_code/FiraCode-VariableFont_wght.ttf differ diff --git a/themes/conspiracy/assets/fonts/fira_code/OFL.txt b/themes/conspiracy/assets/fonts/fira_code/OFL.txt new file mode 100644 index 0000000..19f4298 --- /dev/null +++ b/themes/conspiracy/assets/fonts/fira_code/OFL.txt @@ -0,0 +1,93 @@ +Copyright 2014-2020 The Fira Code Project Authors (https://github.com/tonsky/FiraCode) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/themes/conspiracy/assets/fonts/fira_code/README.txt b/themes/conspiracy/assets/fonts/fira_code/README.txt new file mode 100644 index 0000000..e70b485 --- /dev/null +++ b/themes/conspiracy/assets/fonts/fira_code/README.txt @@ -0,0 +1,67 @@ +Fira Code Variable Font +======================= + +This download contains Fira Code as both a variable font and static fonts. + +Fira Code is a variable font with this axis: + wght + +This means all the styles are contained in a single file: + FiraCode-VariableFont_wght.ttf + +If your app fully supports variable fonts, you can now pick intermediate styles +that aren’t available as static fonts. Not all apps support variable fonts, and +in those cases you can use the static font files for Fira Code: + static/FiraCode-Light.ttf + static/FiraCode-Regular.ttf + static/FiraCode-Medium.ttf + static/FiraCode-SemiBold.ttf + static/FiraCode-Bold.ttf + +Get started +----------- + +1. Install the font files you want to use + +2. Use your app's font picker to view the font family and all the +available styles + +Learn more about variable fonts +------------------------------- + + https://developers.google.com/web/fundamentals/design-and-ux/typography/variable-fonts + https://variablefonts.typenetwork.com + https://medium.com/variable-fonts + +In desktop apps + + https://theblog.adobe.com/can-variable-fonts-illustrator-cc + https://helpx.adobe.com/nz/photoshop/using/fonts.html#variable_fonts + +Online + + https://developers.google.com/fonts/docs/getting_started + https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Fonts/Variable_Fonts_Guide + https://developer.microsoft.com/en-us/microsoft-edge/testdrive/demos/variable-fonts + +Installing fonts + + MacOS: https://support.apple.com/en-us/HT201749 + Linux: https://www.google.com/search?q=how+to+install+a+font+on+gnu%2Blinux + Windows: https://support.microsoft.com/en-us/help/314960/how-to-install-or-remove-a-font-in-windows + +Android Apps + + https://developers.google.com/fonts/docs/android + https://developer.android.com/guide/topics/ui/look-and-feel/downloadable-fonts + +License +------- +Please read the full license text (OFL.txt) to understand the permissions, +restrictions and requirements for usage, redistribution, and modification. + +You can use them in your products & projects – print or digital, +commercial or otherwise. + +This isn't legal advice, please consider consulting a lawyer and see the full +license for all details. diff --git a/themes/conspiracy/assets/fonts/fira_code/static/FiraCode-Bold.ttf b/themes/conspiracy/assets/fonts/fira_code/static/FiraCode-Bold.ttf new file mode 100644 index 0000000..c0aa0f5 Binary files /dev/null and b/themes/conspiracy/assets/fonts/fira_code/static/FiraCode-Bold.ttf differ diff --git a/themes/conspiracy/assets/fonts/fira_code/static/FiraCode-Light.ttf b/themes/conspiracy/assets/fonts/fira_code/static/FiraCode-Light.ttf new file mode 100644 index 0000000..84801e1 Binary files /dev/null and b/themes/conspiracy/assets/fonts/fira_code/static/FiraCode-Light.ttf differ diff --git a/themes/conspiracy/assets/fonts/fira_code/static/FiraCode-Medium.ttf b/themes/conspiracy/assets/fonts/fira_code/static/FiraCode-Medium.ttf new file mode 100644 index 0000000..570b4d1 Binary files /dev/null and b/themes/conspiracy/assets/fonts/fira_code/static/FiraCode-Medium.ttf differ diff --git a/themes/conspiracy/assets/fonts/fira_code/static/FiraCode-Regular.ttf b/themes/conspiracy/assets/fonts/fira_code/static/FiraCode-Regular.ttf new file mode 100644 index 0000000..82baafc Binary files /dev/null and b/themes/conspiracy/assets/fonts/fira_code/static/FiraCode-Regular.ttf differ diff --git a/themes/conspiracy/assets/fonts/fira_code/static/FiraCode-SemiBold.ttf b/themes/conspiracy/assets/fonts/fira_code/static/FiraCode-SemiBold.ttf new file mode 100644 index 0000000..f3a34fa Binary files /dev/null and b/themes/conspiracy/assets/fonts/fira_code/static/FiraCode-SemiBold.ttf differ diff --git a/themes/conspiracy/assets/fonts/manuskript_gothisch/Manuskript Gothisch UNZ1A.ttf b/themes/conspiracy/assets/fonts/manuskript_gothisch/Manuskript Gothisch UNZ1A.ttf new file mode 100644 index 0000000..f90ba01 Binary files /dev/null and b/themes/conspiracy/assets/fonts/manuskript_gothisch/Manuskript Gothisch UNZ1A.ttf differ diff --git a/themes/conspiracy/assets/fonts/manuskript_gothisch/OFL-FAQ.txt b/themes/conspiracy/assets/fonts/manuskript_gothisch/OFL-FAQ.txt new file mode 100644 index 0000000..1b67d59 --- /dev/null +++ b/themes/conspiracy/assets/fonts/manuskript_gothisch/OFL-FAQ.txt @@ -0,0 +1,242 @@ +Eine kurze deutsche Zusammenfassung der OFL finden Sie auf: +http://de.wikipedia.org/wiki/SIL_Open_Font_License + + + +OFL FAQ - Frequently Asked Questions about the SIL Open Font License (OFL) +Version 1.1-update1 - 31 March 2009 +(See http://scripts.sil.org/OFL for updates) + + +1 ABOUT USING AND DISTRIBUTING FONTS LICENSED UNDER THE OFL + +1.1 Can I use the fonts in any publication, even embedded in the file? +Yes. You may use them like most other fonts, but unlike some fonts you may include an embedded subset of the fonts in your document. Such use does not require you to include this license or other files (listed in OFL condition 2), nor does it require any type of acknowledgement within the publication. Some mention of the font name within the publication information (such as in a colophon) is usually appreciated. If you wish to include the complete font as a separate file, you should distribute the full font package, including all existing acknowledgements, and comply with the OFL conditions. Of course, referencing or embedding an OFL font in any document does not change the license of the document itself. The requirement for fonts to remain under the OFL does not apply to any document created using the fonts and their derivatives. Similarly, creating any kind of graphic using a font under OFL does not make the resulting artwork subject to the OFL. + +1.2 Can I make web pages using these fonts? +Yes! Go ahead! Using CSS (Cascading Style Sheets) is recommended. Direct usage of fonts retrieved from a remote server - also referred to as font linking - using cross-platform open standards like @font-face is encouraged. This is considered to be use and distribution for which the OFL explicitly grants permission. The font file itself is not embedded in the webpage but referenced through a web address (i.e. a URI regardless of file format or access protocol) which will cause the browser to retrieve and use the corresponding font to render the webpage. This usage scenario is different from font embedding within a document (i.e. a PDF) where the font or some of its elements become part of the document. Note that embedding in a document is also permitted by the license as indicated in 1.1. (See 1.10 for details related to URL-based access restrictions methods or DRM mechanisms). + +1.3 Can I make the fonts available to others from my web site? +Yes, as long as you meet the conditions of the license (do not sell by itself, include the necessary files, include the necessary copyright and license information, rename Modified Versions, do not abuse the Author(s)' name(s) and do not sublicense). In the case where you are hosting fonts to be served on the web, make sure the file contains the needed copyright notice(s) and licensing information in its metadata. Please double-check the accuracy of every field to prevent contradictory information. If you are making the font available for use via the @font-face open standard, putting this information in the standard font metadata fields is sufficient. Other font formats, including EOT and proposed superior alternatives, already provide fields for this information. + +1.4 Can the fonts be included with Free/Libre and Open Source Software collections such as GNU/Linux and BSD distributions? +Yes! Fonts licensed under the OFL can be freely aggregated with software under FLOSS (Free/Libre and Open Source Software) licenses. Since fonts are much more useful aggregated to than merged with existing software, possible incompatibility with existing software licenses is not a problem. You can also repackage the fonts and the accompanying components in a .rpm or .deb package and include them in distro CD/DVDs and online repositories. + +1.5 I want to distribute the fonts with my program. Does this mean my program also has to be free/libre and open source software? +No. Only the portions based on the Font Software are required to be released under the OFL. The intent of the license is to allow aggregation or bundling with software under restricted licensing as well. + +1.6 Can I include the fonts on a CD of freeware or commercial fonts? +Yes, as long some other font or software is also on the disk, so the OFL font is not sold by itself. + +1.7 Can I sell a software package that includes these fonts? +Yes, you can do this with both the Original Version and a Modified Version. Examples of bundling made possible by the OFL would include: word processors, design and publishing applications, training and educational software, edutainment software, etc. + +1.8 Why won't the OFL let me sell the fonts alone? +The intent is to keep people from making money by simply redistributing the fonts. The only people who ought to profit directly from the fonts should be the original authors, and those authors have kindly given up potential direct income to distribute their fonts under the OFL. Please honor and respect their contribution! + +1.9 I've come across a font released under the OFL. How can I easily get more information about the Original Version? How can I know where it stands compared to the Original Version or other Modified Versions? +Consult the copyright statement(s) in the license for ways to contact the original authors. Consult the FONTLOG for information on how the font differs from the Original Version, and get in touch with the various contributors via the information in the acknowledgment section. Please consider using the Original Versions of the fonts whenever possible. + +1.10 What do you mean in condition 4? Can you provide examples of abusive promotion / endorsement / advertisement vs. normal acknowledgement? +The intent is that the goodwill and reputation of the author(s) should not be used in a way that makes it sound like the original author(s) endorse or approve of a specific Modified Version or software bundle. For example, it would not be right to advertise a word processor by naming the author(s) in a listing of software features, or to promote a Modified Version on a web site by saying "designed by ...". However, it would be appropriate to acknowledge the author(s) if your software package has a list of people who deserve thanks. We realize that this can seem to be a gray area, but the standard used to judge an acknowledgement is that if the acknowledgement benefits the author(s) it is allowed, but if it primarily benefits other parties, or could reflect poorly on the author(s), then it is not. + +1.11 Can Font Software released under the OFL be subject to URL-based access restrictions methods or DRM mechanisms? +Yes, but these issues are out-of-scope for the OFL. The license itself neither encourages their use nor prohibits them since such mechanisms are not implemented in the components of the Font Software but through external software. Such restrictions are put in place for many different purposes corresponding to various usage scenarios. One common example is to limit potentially dangerous cross-site scripting attacks. However, in the spirit of libre/open fonts and unrestricted writing systems, we strongly encourage open sharing and reuse of OFL fonts, and the establishment of an environment where such restrictions are unnecessary. Note that whether you wish to use such mechanisms or you prefer not to, you must still abide by the rules set forth by the OFL when using fonts released by their authors under this license. Derivative fonts must be licensed under the OFL, even if they are part of a service for which you charge fees and/or for which access to source code is restricted. You may not sell the fonts on their own - they must be part of a larger software package or bundle. For example, even if the OFL font is distributed in a software package or via an online service using a DRM mechanism, the user would still have the right to extract that font, use, study, modify and redistribute it under the OFL. + +1.12 What about distributing fonts with a document? Within a compressed folder structure like an OpenDocument file (.odt) for example? Is it redistribution, bundling or embedding? +The vast majority of the time, documents circulated in electronic form reference a font name which will match the corresponding font on the target system but do not carry the font within themselves. There may, however, be some cases where you need to bundle a font with the document. Certain document formats may allow the inclusion of an unmodified font within their file structure which consists of a compressed folder containing the various resources forming the document (such as pictures and thumbnails). Including fonts within such a structure is understood as being different from embedding but rather similar to bundling (or mere aggregation) for which the licensing makes explicit provision. In this case the font is conveyed unchanged whereas embedding a font transforms it from the original format. The OFL does not allow anyone to extract the font from such a structure to then redistribute it under another license. The explicit permission to redistribute and embed does not cancel the requirement for the Font Software to remain under the license chosen by its Author(s). + +1.13 If OFL fonts are extracted from a document in which they are embedded (such as a PDF file), what can be done with them? Is this a risk to Author(s)? +The few utilities that can extract fonts embedded in a PDF will only output limited amounts of outlines - not a complete font. To create a working font from this method is much more difficult than finding the source of the original OFL font. So there is little chance that an OFL font would be extracted and redistributed inappropriately through this method. Even so, copyright laws address any misrepresentation of authorship. All Font Software released under the OFL and marked as such by the Author(s) is intended to remain under this license regardless of the distribution method, and cannot be redistributed under any other license. We strongly discourage any font extraction - we recommend directly using the font sources instead - but if you extract font outlines from a document please be considerate, use your common sense and respect the work of the Author(s) and the licensing model. + +1.14 What about sharing OFL fonts with friends on a CD, DVD or USB stick? +You are very welcome to share open fonts with friends, family and colleagues on such removable media. Please make sure that you share and share-alike as much as possible from what the Author(s) released and that you don't strip away useful information which may not be present in the binary font files themselves. Just remember that in the case where you sell the font, it has to come bundled with software. + + +2 ABOUT MODIFYING OFL LICENSED FONTS + +2.1 Can I change the fonts? Are there any limitations to what things I can and cannot change? +You are allowed to change anything, as long as such changes do not violate the terms of the license. In other words, you are not allowed to remove the copyright statement(s) from the font, but you could add additional information into it that covers your contribution. + +2.2 I have a font that needs a few extra glyphs - can I take them from an OFL licensed font and copy them into mine? +Yes, but if you distribute that font to others it must be under the OFL, and include the information mentioned in condition 2 of the license. + +2.3 Can I charge people for my additional work? In other words, if I add a bunch of special glyphs and/or OpenType/Graphite code, can I sell the enhanced font? +Not by itself. Derivative fonts must be released under the OFL and cannot be sold by themselves. It is permitted, however, to include them in a larger software package (such as text editors, office suites or operating systems), even if the larger package is sold. In that case, you are strongly encouraged, but not required, to also make that derived font easily and freely available outside of the larger package. + +2.4 Can I pay someone to enhance the fonts for my use and distribution? +Yes. This is a good way to fund the further development of the fonts. Keep in mind, however, that if the font is distributed to others it must be under the OFL. You won't be able to recover your investment by exclusively selling the font, but you will be making a valuable contribution to the community. Please remember how you have benefitted from the contributions of others. + +2.5 I need to make substantial revisions to the font to make it work with my program. It will be a lot of work, and a big investment, and I want to be sure that it can only be distributed with my program. Can I restrict its use? +No. If you redistribute a Modified Version of the font it must be under the OFL. You may not restrict it in any way. This is intended to ensure that all released improvements to the fonts become available to everyone. But you will likely get an edge over competitors by being the first to distribute a bundle with the enhancements. Again, please remember how you have benefitted from the contributions of others. + +2.6 Do I have to make any derivative fonts (including extended source files, build scripts, documentation, etc.) publicly available? +No, but please do share your improvements with others. You may find that you receive more than what you gave in return. + +2.7 Why can't I use the Reserved Font Name(s) in my derivative font names? I'd like people to know where the design came from. +The best way to acknowledge the source of the design is to thank the original authors and any other contributors in the files that are distributed with your revised font (although no acknowledgement is required). The FONTLOG is a natural place to do this. Reserved Font Name(s) ensure that the only fonts that have the original names are the unmodified Original Versions. This allows designers to maintain artistic integrity while allowing collaboration to happen. It eliminates potential confusion and name conflicts. When choosing a name be creative and avoid names that reuse almost all the same letters in the same order or sound like the original. Keep in mind that the Copyright Holder(s) can allow a specific trusted partner to use Reserved Font Name(s) through a separate written agreement. + +2.8 What do you mean by "primary name as presented to the user"? Are you referring to the font menu name? +Yes, the requirement to change the visible name used to differentiate the font from others applies to the font menu name and other mechanisms to specify a font in a document. It would be fine, for example, to keep a text reference to the original fonts in the description field, in your modified source file or in documentation provided alongside your derivative as long as no one could be confused that your modified source is the original. But you cannot use the Reserved Font Names in any way to identify the font to the user (unless the Copyright Holder(s) allow(s) it through a separate agreement; see section 2.7). Users who install derivatives ("Modified Versions") on their systems should not see any of the original names ("Reserved Font Names") in their font menus, for example. Again, this is to ensure that users are not confused and do not mistake a font for another and so expect features only another derivative or the Original Version can actually offer. Ultimately, creating name conflicts will cause many problems for the users as well as for the designer of both the Original and Modified versions, so please think ahead and find a good name for your own derivative. Font substitution systems like fontconfig, or application-level font fallback configuration within OpenOffice.org or Scribus, will also get very confused if the name of the font they are configured to substitute to actually refers to another physical font on the user's hard drive. It will help everyone if Original Versions and Modified Versions can easily be distinguished from one another and from other derivatives. The substitution mechanism itself is outside the scope of the license. Users can always manually change a font reference in a document or set up some kind of substitution at a higher level but at the lower level the fonts themselves have to respect the Reserved Font Name(s) requirement to prevent ambiguity. If a substitution is currently active the user should be aware of it. + +2.9 Am I not allowed to use any part of the Reserved Font Names? +You may not use the words of the font names, but you would be allowed to use parts of words, as long as you do not use any word from the Reserved Font Names entirely. We do not recommend using parts of words because of potential confusion, but it is allowed. For example, if "Foobar" was a Reserved Font Name, you would be allowed to use "Foo" or "bar", although we would not recommend it. Such an unfortunate choice would confuse the users of your fonts as well as make it harder for other designers to contribute. + +2.10 So what should I, as an author, identify as Reserved Font Names? +Original authors are encouraged to name their fonts using clear, distinct names, and only declare the unique parts of the name as Reserved Font Names. For example, the author of a font called "Foobar Sans" would declare "Foobar" as a Reserved Font Name, but not "Sans", as that is a common typographical term, and may be a useful word to use in a derivative font name. Reserved Font Names should also be single words. A font called "Flowing River" should have Reserved Font Names "Flowing" and "River", not "Flowing River". + +2.11 Do I, as an author, have to identify any Reserved Font Names? +No, but we strongly encourage you to do so. This is to avoid confusion between your work and Modified versions. You may, however, give certain trusted parties the right to use any of your Reserved Font Names through separate written agreements. For example, even if "Foobar" is a RFN, you could write up an agreement to give company "XYZ" the right to distribute a modified version with a name that includes "Foobar". This allows for freedom without confusion. + +2.12 Are any names (such as the main font name) reserved by default? +No. That is a change to the license as of version 1.1. If you want any names to be Reserved Font Names, they must be specified after the copyright statement(s). + +2.13 What is this FONTLOG thing exactly? +It has three purposes: 1) to provide basic information on the font to users and other developers, 2) to document changes that have been made to the font or accompanying files, either by the original authors or others, and 3) to provide a place to acknowledge the authors and other contributors. Please use it! See below for details on how changes should be noted. + +2.14 Am I required to update the FONTLOG? +No, but users, designers and other developers might get very frustrated at you if you don't! People need to know how derivative fonts differ from the original, and how to take advantage of the changes, or build on them. + + +3 ABOUT THE FONTLOG + +The FONTLOG can take a variety of formats, but should include these four sections: + +3.1 FONTLOG for +This file provides detailed information on the Font Software. This information should be distributed along with the fonts and any derivative works. + +3.2 Basic Font Information +(Here is where you would describe the purpose and brief specifications for the font project, and where users can find more detailed documentation. It can also include references to how changes can be contributed back to the Original Version. You may also wish to include a short guide to the design, or a reference to such a document.) + +3.3 ChangeLog +(This should list both major and minor changes, most recent first. Here are some examples:) + +7 February 2007 (Pat Johnson) Version 1.3 +- Added Greek and Cyrillic glyphs +- Released as "" + +7 March 2006 (Fred Foobar) Version 1.2 +- Tweaked contextual behaviours +- Released as "" + +1 Feb 2005 (Jane Doe) Version 1.1 +- Improved build script performance and verbosity +- Extended the smart code documentation +- Corrected minor typos in the documentation +- Fixed position of combining inverted breve below (U+032F) +- Added OpenType/Graphite smart code for Armenian +- Added Armenian glyphs (U+0531 -> U+0587) +- Released as "" + +1 Jan 2005 (Joe Smith) Version 1.0 +- Initial release of font "" + +3.4 Acknowledgements +(Here is where contributors can be acknowledged. + +If you make modifications be sure to add your name (N), email (E), web-address (W) and description (D). This list is sorted by last name in alphabetical order.) + +N: Jane Doe +E: jane@university.edu +W: http://art.university.edu/projects/fonts +D: Contributor - Armenian glyphs and code + +N: Fred Foobar +E: fred@foobar.org +W: http://foobar.org +D: Contributor - misc Graphite fixes + +N: Pat Johnson +E: pat@fontstudio.org +W: http://pat.fontstudio.org +D: Designer - Greek & Cyrillic glyphs based on Roman design + +N: Tom Parker +E: tom@company.com +W: http://www.company.com/tom/projects/fonts +D: Engineer - original smart font code + +N: Joe Smith +E: joe@fontstudio.org +W: http://joe.fontstudio.org +D: Designer - original Roman glyphs + +(Original authors can also include information here about their organization.) + + +4 ABOUT MAKING CONTRIBUTIONS + +4.1 Why should I contribute my changes back to the original authors? +It would benefit many people if you contributed back to what you've received. Providing your contributions and improvements to the fonts and other components (data files, source code, build scripts, documentation, etc.) could be a tremendous help and would encourage others to contribute as well and 'give back', which means you will have an opportunity to benefit from other people's contributions as well. Sometimes maintaining your own separate version takes more effort than merging back with the original. Be aware that any contributions, however, must be either your own original creation or work that you own, and you may be asked to affirm that clearly when you contribute. + +4.2 I've made some very nice improvements to the font, will you consider adopting them and putting them into future Original Versions? +Most authors would be very happy to receive such contributions. Keep in mind that it is unlikely that they would want to incorporate major changes that would require additional work on their end. Any contributions would likely need to be made for all the fonts in a family and match the overall design and style. Authors are encouraged to include a guide to the design with the fonts. It would also help to have contributions submitted as patches or clearly marked changes (the use of smart source revision control systems like subversion, svk, mercurial, git or bzr is a good idea). Examples of useful contributions are bug fixes, additional glyphs, stylistic alternates (and the smart font code to access them) or improved hinting. + +4.3 How can I financially support the development of OFL fonts? +It is likely that most authors of OFL fonts would accept financial contributions - contact them for instructions on how to do this. Such contributions would support future development. You can also pay for others to enhance the fonts and contribute the results back to the original authors for inclusion in the Original Version. + +(In case of the font, that comes with this copy of the FAQ-file, you will find a paypal(tm) donation link on the fonts-page of www.peter-wiegel.de) + + +5 ABOUT THE LICENSE + +5.1 I see that this is version 1.1 of the license. Will there be later changes? +Version 1.1 is the first minor revision of the OFL. We are confident that version 1.1 will meet most needs, but are open to future improvements. Any revisions would be for future font releases, and previously existing licenses would remain in effect. No retroactive changes are possible, although the Copyright Holder(s) can re-release the font under a revised OFL. All versions will be available on our web site: http://scripts.sil.org/OFL. + +5.2 Can I use the SIL Open Font License for my own fonts? +Yes! We heartily encourage anyone to use the OFL to distribute their own original fonts. It is a carefully constructed license that allows great freedom along with enough artistic integrity protection for the work of the authors as well as clear rules for other contributors and those who redistribute the fonts. Some additional information about using the OFL is included at the end of this FAQ. + +5.3 Does this license restrict the rights of the Copyright Holder(s)? +No. The Copyright Holder(s) still retain(s) all the rights to their creation; they are only releasing a portion of it for use in a specific way. For example, the Copyright Holder(s) may choose to release a 'basic' version of their font under the OFL, but sell a restricted 'enhanced' version. Only the Copyright Holder(s) can do this. + +5.4 Is the OFL a contract or a license? +The OFL is a license and not a contract and so does not require you to sign it to have legal validity. By using, modifying and redistributing components under the OFL you indicate that you accept the license. + +5.5 How about translating the license and the FAQ into other languages? +SIL certainly recognises the need for people who are not familiar with English to be able to understand the OFL and this FAQ better in their own language. Making the license very clear and readable is a key goal of the OFL. + +If you are an experienced translator, you are very welcome to help by translating the OFL and its FAQ so that designers and users in your language community can understand the license better. But only the original English version of the license has legal value and has been approved by the community. Translations do not count as legal substitutes and should only serve as a way to explain the original license. SIL - as the author and steward of the license for the community at large - does not approve any translation of the OFL as legally valid because even small translation ambiguities could be abused and create problems. + +We give permission to publish unofficial translations into other languages provided that they comply with the following guidelines: + +- put the following disclaimer in both English and the target language stating clearly that the translation is unofficial: + +"This is an unofficial translation of the SIL Open Font License into $language. It was not published by SIL International, and does not legally state the distribution terms for fonts that use the OFL. A release under the OFL is only valid when using the original English text. + +However, we recognize that this unofficial translation will help users and designers not familiar with English to understand the SIL OFL better and make it easier to use and release font families under this collaborative font design model. We encourage designers who consider releasing their creation under the OFL to read the FAQ in their own language if it is available. + +Please go to http://scripts.sil.org/OFL for the official version of the license and the accompanying FAQ." + +- keep your unofficial translation current and update it at our request if needed, for example if there is any ambiguity which could lead to confusion. + +If you start such a unofficial translation effort of the OFL and its accompanying FAQ please let us know, thank you. + + +6 ABOUT SIL INTERNATIONAL + +6.1 Who is SIL International and what does it do? +SIL International is a worldwide faith-based education and development organization (NGO) that studies, documents, and assists in developing the world's lesser-known languages through literacy, linguistics, translation, and other academic disciplines. SIL makes its services available to all without regard to religious belief, political ideology, gender, race, or ethnic background. SIL's members and volunteers share a Christian commitment. + +6.2 What does this have to do with font licensing? +The ability to read, write, type and publish in one's own language is one of the most critical needs for millions of people around the world. This requires fonts that are widely available and support lesser-known languages. SIL develops - and encourages others to develop - a complete stack of writing systems implementation components available under open licenses. This open stack includes input methods, smart fonts, smart rendering libraries and smart applications. There has been a need for a common open license that is specifically applicable to fonts and related software (a crucial component of this stack) so SIL developed the SIL Open Font License with the help of the FLOSS community. + +6.3 How can I contact SIL? +Our main web site is: http://www.sil.org/ +Our site about complex scripts is: http://scripts.sil.org/ +Information about this license (including contact email information) is at: http://scripts.sil.org/OFL + + +7 ABOUT USING THE OFL FOR YOUR ORIGINAL FONTS + +If you want to release your fonts under the OFL, you only need to do the following: + +7.1 Put your copyright and reserved font names information in the beginning of the main OFL file (simply use the dedicated placeholders). +7.2 Put your copyright and the OFL references in your various font files (such as in the copyright, license and description fields) and in your other components (build scripts, glyph databases, documentation, rendering samples, etc). Accurate metadata in your font files is beneficial to you as an increasing number of applications are exposing this information to the user. For example, clickable links can bring users back to your website and let them know about other work you have done or services you provide. Depending on the format of your fonts and sources, you can use template human-readable headers or machine-readable metadata. +7.3 Write an initial FONTLOG for your font and include it in the release package. +7.4 Include the OFL license file in your release package. +7.5 We also highly recommend you include the relevant practical documentation on the license by putting the OFL-FAQ in your package. +7.6 If you wish, you can use the OFL Graphics on your web page. + +That's all. If you have any more questions please get in touch with us. + + diff --git a/themes/conspiracy/assets/fonts/manuskript_gothisch/Open Font License.txt b/themes/conspiracy/assets/fonts/manuskript_gothisch/Open Font License.txt new file mode 100644 index 0000000..71d47ee --- /dev/null +++ b/themes/conspiracy/assets/fonts/manuskript_gothisch/Open Font License.txt @@ -0,0 +1,95 @@ +Copyright (c) 2013, Peter Wiegel, www.peter-wiegel.de, wiegel@peter-wiegel.de +with Reserved Font Name Manuskript Gothisch + + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/themes/conspiracy/assets/fonts/manuskript_gothisch/download.txt b/themes/conspiracy/assets/fonts/manuskript_gothisch/download.txt new file mode 100644 index 0000000..0fa3517 --- /dev/null +++ b/themes/conspiracy/assets/fonts/manuskript_gothisch/download.txt @@ -0,0 +1,2 @@ +Downloaded from: https://www.dafont.com/manuskript-gothisch.font +License included in download: OFL diff --git a/themes/conspiracy/assets/fonts/nyght-serif-main/COPYRIGHT.md b/themes/conspiracy/assets/fonts/nyght-serif-main/COPYRIGHT.md new file mode 100644 index 0000000..d8d9a7c --- /dev/null +++ b/themes/conspiracy/assets/fonts/nyght-serif-main/COPYRIGHT.md @@ -0,0 +1 @@ +Copyright (c) 2023, Maksym Kobuzan diff --git a/themes/conspiracy/assets/fonts/nyght-serif-main/HELLO.txt b/themes/conspiracy/assets/fonts/nyght-serif-main/HELLO.txt new file mode 100644 index 0000000..36f15ee --- /dev/null +++ b/themes/conspiracy/assets/fonts/nyght-serif-main/HELLO.txt @@ -0,0 +1,35 @@ +ENG + + +Hi! + +Thank you for your interest! I put a lot of my time and effort into my fonts. +And I would be very interested to see how you use the NYGHT SERIF and other my typefaces. + +Tag me @mkobuzan or send it to maxkobuzan@gmail.com your Font In Use. I would even repost some of this to my Instagram. + +Enjoy! + +Glory to Ukraine, + +Maksym. + + + + +UKR + + +Привіт! + +Дякую за твоє зацікавлення! Я вкладаю багато часу та зусиль у свої шрифти. +І мені було б дуже цікаво подивитися, як ти використовуєш NYGHT SERIF і інші мої шрифти. + +Познач мене @mkobuzan або надішли на maxkobuzan@gmail.com свій проєкт, в якому використано мій шрифт. +Щось із цього я б репостнув би собі в Instagram. + +Насолоджуйся! + +Слава Україні, + +Максим. diff --git a/themes/conspiracy/assets/fonts/nyght-serif-main/LICENSE.txt b/themes/conspiracy/assets/fonts/nyght-serif-main/LICENSE.txt new file mode 100644 index 0000000..3182580 --- /dev/null +++ b/themes/conspiracy/assets/fonts/nyght-serif-main/LICENSE.txt @@ -0,0 +1,94 @@ +Copyright (c) 2022, Maksym Kobuzan (maxkobuzan@gmail.com), +with Reserved Font Name NYGHT SERIF. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/themes/conspiracy/assets/fonts/nyght-serif-main/README.md b/themes/conspiracy/assets/fonts/nyght-serif-main/README.md new file mode 100644 index 0000000..d8ca75c --- /dev/null +++ b/themes/conspiracy/assets/fonts/nyght-serif-main/README.md @@ -0,0 +1,32 @@ +# NYGHT SERIF v0.5 + +NYGHT SERIF (version 0.5) is a contemporary serif designed by Maksym Kobuzan (www.behance.net/mkobuzan). + +## Description + +NYGHT SERIF is a contemporary serif with a spicy character. Its contrasting forms combine smooth curves and sharp as a blade serifs and spurs. NYGHT SERIF also knows Extended Latin. It also knows Cyrillic. But only the Ukrainian alphabet. NYGHT SERIF is absolutely FREE for personal and commercial use. It also has an Open Font License (OFL). NYGHT SERIF will be published in progress. And there will be many updates. + +## Current Version + +FAMILY UPDATE 0.5 + +1. 6 new styles. Namely Regular, Medium, Bold. And also Italics, of course. Now it's a full-fledged Type Family! 💚 +2. Added support for Bulgarian language. Namely, the letters of the Bulgarian Cyrillic alphabet! +3. Added some basic ligatures like ff tt ft. +4. Balanced the width of some Сapital Letters in Light weight. Some letters have become wider, for example P R B. And some letters have become, on the contrary, a little narrower. +5. And as usual, multiple minor changes in the curves. The curves are smoother and more uniform. Some bugs have also been fixed. 🤌 + +So you need to update all styles as well. And thanks for downloading and enjoying! + +## Visuals + +![specimen1](documentation/images/NyghtSerif01.jpg) +![specimen1](documentation/images/NyghtSerif02.jpg) +![specimen1](documentation/images/NyghtSerif11.jpg) + +## License +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is available [here](http://www.tunera.xyz/licenses/sil-open-font-license-1.1/) + +## Repository Layout +This font repository structure is inspired by [Unified Font Repository v0.3](https://github.com/unified-font-repository/Unified-Font-Repository). diff --git a/themes/conspiracy/assets/fonts/nyght-serif-main/TRADEMARKS.md b/themes/conspiracy/assets/fonts/nyght-serif-main/TRADEMARKS.md new file mode 100644 index 0000000..74072a7 --- /dev/null +++ b/themes/conspiracy/assets/fonts/nyght-serif-main/TRADEMARKS.md @@ -0,0 +1 @@ +NYGHT SERIF is a trademark of Maksym Kobuzan (2023). diff --git a/themes/conspiracy/assets/fonts/nyght-serif-main/fonts/.gitkeep b/themes/conspiracy/assets/fonts/nyght-serif-main/fonts/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/themes/conspiracy/assets/fonts/nyght-serif-main/fonts/WEB/.gitkeep b/themes/conspiracy/assets/fonts/nyght-serif-main/fonts/WEB/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/themes/conspiracy/assets/fonts/nyght-serif-main/fonts/WEB/NyghtSerif-Bold.woff2 b/themes/conspiracy/assets/fonts/nyght-serif-main/fonts/WEB/NyghtSerif-Bold.woff2 new file mode 100644 index 0000000..8e28860 Binary files /dev/null and b/themes/conspiracy/assets/fonts/nyght-serif-main/fonts/WEB/NyghtSerif-Bold.woff2 differ diff --git a/themes/conspiracy/assets/fonts/nyght-serif-main/fonts/WEB/NyghtSerif-BoldItalic.woff2 b/themes/conspiracy/assets/fonts/nyght-serif-main/fonts/WEB/NyghtSerif-BoldItalic.woff2 new file mode 100644 index 0000000..c4a12e0 Binary files /dev/null and b/themes/conspiracy/assets/fonts/nyght-serif-main/fonts/WEB/NyghtSerif-BoldItalic.woff2 differ diff --git a/themes/conspiracy/assets/fonts/nyght-serif-main/fonts/WEB/NyghtSerif-Dark.woff2 b/themes/conspiracy/assets/fonts/nyght-serif-main/fonts/WEB/NyghtSerif-Dark.woff2 new file mode 100644 index 0000000..c255d39 Binary files /dev/null and b/themes/conspiracy/assets/fonts/nyght-serif-main/fonts/WEB/NyghtSerif-Dark.woff2 differ diff --git a/themes/conspiracy/assets/fonts/nyght-serif-main/fonts/WEB/NyghtSerif-DarkItalic.woff2 b/themes/conspiracy/assets/fonts/nyght-serif-main/fonts/WEB/NyghtSerif-DarkItalic.woff2 new file mode 100644 index 0000000..7e0da32 Binary files /dev/null and b/themes/conspiracy/assets/fonts/nyght-serif-main/fonts/WEB/NyghtSerif-DarkItalic.woff2 differ diff --git a/themes/conspiracy/assets/fonts/nyght-serif-main/fonts/WEB/NyghtSerif-Light.woff2 b/themes/conspiracy/assets/fonts/nyght-serif-main/fonts/WEB/NyghtSerif-Light.woff2 new file mode 100644 index 0000000..418f03e Binary files /dev/null and b/themes/conspiracy/assets/fonts/nyght-serif-main/fonts/WEB/NyghtSerif-Light.woff2 differ diff --git a/themes/conspiracy/assets/fonts/nyght-serif-main/fonts/WEB/NyghtSerif-LightItalic.woff2 b/themes/conspiracy/assets/fonts/nyght-serif-main/fonts/WEB/NyghtSerif-LightItalic.woff2 new file mode 100644 index 0000000..b2d3ab9 Binary files /dev/null and b/themes/conspiracy/assets/fonts/nyght-serif-main/fonts/WEB/NyghtSerif-LightItalic.woff2 differ diff --git a/themes/conspiracy/assets/fonts/nyght-serif-main/fonts/WEB/NyghtSerif-Medium.woff2 b/themes/conspiracy/assets/fonts/nyght-serif-main/fonts/WEB/NyghtSerif-Medium.woff2 new file mode 100644 index 0000000..42d677d Binary files /dev/null and b/themes/conspiracy/assets/fonts/nyght-serif-main/fonts/WEB/NyghtSerif-Medium.woff2 differ diff --git a/themes/conspiracy/assets/fonts/nyght-serif-main/fonts/WEB/NyghtSerif-MediumItalic.woff2 b/themes/conspiracy/assets/fonts/nyght-serif-main/fonts/WEB/NyghtSerif-MediumItalic.woff2 new file mode 100644 index 0000000..b092803 Binary files /dev/null and b/themes/conspiracy/assets/fonts/nyght-serif-main/fonts/WEB/NyghtSerif-MediumItalic.woff2 differ diff --git a/themes/conspiracy/assets/fonts/nyght-serif-main/fonts/WEB/NyghtSerif-Regular.woff2 b/themes/conspiracy/assets/fonts/nyght-serif-main/fonts/WEB/NyghtSerif-Regular.woff2 new file mode 100644 index 0000000..5d518dc Binary files /dev/null and b/themes/conspiracy/assets/fonts/nyght-serif-main/fonts/WEB/NyghtSerif-Regular.woff2 differ diff --git a/themes/conspiracy/assets/fonts/nyght-serif-main/fonts/WEB/NyghtSerif-RegularItalic.woff2 b/themes/conspiracy/assets/fonts/nyght-serif-main/fonts/WEB/NyghtSerif-RegularItalic.woff2 new file mode 100644 index 0000000..79adbb6 Binary files /dev/null and b/themes/conspiracy/assets/fonts/nyght-serif-main/fonts/WEB/NyghtSerif-RegularItalic.woff2 differ diff --git a/themes/conspiracy/assets/fonts/roboto_slab/LICENSE.txt b/themes/conspiracy/assets/fonts/roboto_slab/LICENSE.txt new file mode 100644 index 0000000..75b5248 --- /dev/null +++ b/themes/conspiracy/assets/fonts/roboto_slab/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/themes/conspiracy/assets/fonts/roboto_slab/README.txt b/themes/conspiracy/assets/fonts/roboto_slab/README.txt new file mode 100644 index 0000000..091e21f --- /dev/null +++ b/themes/conspiracy/assets/fonts/roboto_slab/README.txt @@ -0,0 +1,71 @@ +Roboto Slab Variable Font +========================= + +This download contains Roboto Slab as both a variable font and static fonts. + +Roboto Slab is a variable font with this axis: + wght + +This means all the styles are contained in a single file: + RobotoSlab-VariableFont_wght.ttf + +If your app fully supports variable fonts, you can now pick intermediate styles +that aren’t available as static fonts. Not all apps support variable fonts, and +in those cases you can use the static font files for Roboto Slab: + static/RobotoSlab-Thin.ttf + static/RobotoSlab-ExtraLight.ttf + static/RobotoSlab-Light.ttf + static/RobotoSlab-Regular.ttf + static/RobotoSlab-Medium.ttf + static/RobotoSlab-SemiBold.ttf + static/RobotoSlab-Bold.ttf + static/RobotoSlab-ExtraBold.ttf + static/RobotoSlab-Black.ttf + +Get started +----------- + +1. Install the font files you want to use + +2. Use your app's font picker to view the font family and all the +available styles + +Learn more about variable fonts +------------------------------- + + https://developers.google.com/web/fundamentals/design-and-ux/typography/variable-fonts + https://variablefonts.typenetwork.com + https://medium.com/variable-fonts + +In desktop apps + + https://theblog.adobe.com/can-variable-fonts-illustrator-cc + https://helpx.adobe.com/nz/photoshop/using/fonts.html#variable_fonts + +Online + + https://developers.google.com/fonts/docs/getting_started + https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Fonts/Variable_Fonts_Guide + https://developer.microsoft.com/en-us/microsoft-edge/testdrive/demos/variable-fonts + +Installing fonts + + MacOS: https://support.apple.com/en-us/HT201749 + Linux: https://www.google.com/search?q=how+to+install+a+font+on+gnu%2Blinux + Windows: https://support.microsoft.com/en-us/help/314960/how-to-install-or-remove-a-font-in-windows + +Android Apps + + https://developers.google.com/fonts/docs/android + https://developer.android.com/guide/topics/ui/look-and-feel/downloadable-fonts + +License +------- +Please read the full license text (LICENSE.txt) to understand the permissions, +restrictions and requirements for usage, redistribution, and modification. + +You can use them in your products & projects – print or digital, +commercial or otherwise. + +This isn't legal advice, please consider consulting a lawyer and see the full +license for all details. diff --git a/themes/conspiracy/assets/fonts/roboto_slab/RobotoSlab-VariableFont_wght.ttf b/themes/conspiracy/assets/fonts/roboto_slab/RobotoSlab-VariableFont_wght.ttf new file mode 100644 index 0000000..c7204ce Binary files /dev/null and b/themes/conspiracy/assets/fonts/roboto_slab/RobotoSlab-VariableFont_wght.ttf differ diff --git a/themes/conspiracy/assets/fonts/roboto_slab/static/RobotoSlab-Black.ttf b/themes/conspiracy/assets/fonts/roboto_slab/static/RobotoSlab-Black.ttf new file mode 100644 index 0000000..0c57d86 Binary files /dev/null and b/themes/conspiracy/assets/fonts/roboto_slab/static/RobotoSlab-Black.ttf differ diff --git a/themes/conspiracy/assets/fonts/roboto_slab/static/RobotoSlab-Bold.ttf b/themes/conspiracy/assets/fonts/roboto_slab/static/RobotoSlab-Bold.ttf new file mode 100644 index 0000000..596898c Binary files /dev/null and b/themes/conspiracy/assets/fonts/roboto_slab/static/RobotoSlab-Bold.ttf differ diff --git a/themes/conspiracy/assets/fonts/roboto_slab/static/RobotoSlab-ExtraBold.ttf b/themes/conspiracy/assets/fonts/roboto_slab/static/RobotoSlab-ExtraBold.ttf new file mode 100644 index 0000000..e8dd4f9 Binary files /dev/null and b/themes/conspiracy/assets/fonts/roboto_slab/static/RobotoSlab-ExtraBold.ttf differ diff --git a/themes/conspiracy/assets/fonts/roboto_slab/static/RobotoSlab-ExtraLight.ttf b/themes/conspiracy/assets/fonts/roboto_slab/static/RobotoSlab-ExtraLight.ttf new file mode 100644 index 0000000..b152888 Binary files /dev/null and b/themes/conspiracy/assets/fonts/roboto_slab/static/RobotoSlab-ExtraLight.ttf differ diff --git a/themes/conspiracy/assets/fonts/roboto_slab/static/RobotoSlab-Light.ttf b/themes/conspiracy/assets/fonts/roboto_slab/static/RobotoSlab-Light.ttf new file mode 100644 index 0000000..1c204ae Binary files /dev/null and b/themes/conspiracy/assets/fonts/roboto_slab/static/RobotoSlab-Light.ttf differ diff --git a/themes/conspiracy/assets/fonts/roboto_slab/static/RobotoSlab-Medium.ttf b/themes/conspiracy/assets/fonts/roboto_slab/static/RobotoSlab-Medium.ttf new file mode 100644 index 0000000..50657b8 Binary files /dev/null and b/themes/conspiracy/assets/fonts/roboto_slab/static/RobotoSlab-Medium.ttf differ diff --git a/themes/conspiracy/assets/fonts/roboto_slab/static/RobotoSlab-Regular.ttf b/themes/conspiracy/assets/fonts/roboto_slab/static/RobotoSlab-Regular.ttf new file mode 100644 index 0000000..cf612b8 Binary files /dev/null and b/themes/conspiracy/assets/fonts/roboto_slab/static/RobotoSlab-Regular.ttf differ diff --git a/themes/conspiracy/assets/fonts/roboto_slab/static/RobotoSlab-SemiBold.ttf b/themes/conspiracy/assets/fonts/roboto_slab/static/RobotoSlab-SemiBold.ttf new file mode 100644 index 0000000..644abc4 Binary files /dev/null and b/themes/conspiracy/assets/fonts/roboto_slab/static/RobotoSlab-SemiBold.ttf differ diff --git a/themes/conspiracy/assets/fonts/roboto_slab/static/RobotoSlab-Thin.ttf b/themes/conspiracy/assets/fonts/roboto_slab/static/RobotoSlab-Thin.ttf new file mode 100644 index 0000000..3e7d3d3 Binary files /dev/null and b/themes/conspiracy/assets/fonts/roboto_slab/static/RobotoSlab-Thin.ttf differ diff --git a/themes/conspiracy/assets/images/fabrizio-conti-TUmjK7ZJgbI-unsplash.jpg b/themes/conspiracy/assets/images/fabrizio-conti-TUmjK7ZJgbI-unsplash.jpg new file mode 100644 index 0000000..1e4e465 Binary files /dev/null and b/themes/conspiracy/assets/images/fabrizio-conti-TUmjK7ZJgbI-unsplash.jpg differ diff --git a/themes/conspiracy/layouts/404.html b/themes/conspiracy/layouts/404.html new file mode 100644 index 0000000..e69de29 diff --git a/themes/conspiracy/layouts/_partials/breadcrumbs.html b/themes/conspiracy/layouts/_partials/breadcrumbs.html new file mode 100644 index 0000000..ff82e73 --- /dev/null +++ b/themes/conspiracy/layouts/_partials/breadcrumbs.html @@ -0,0 +1,7 @@ +{{/* https://github.com/adityatelange/hugo-PaperMod/blob/master/layouts/partials/breadcrumbs.html */}} + diff --git a/themes/conspiracy/layouts/_partials/card.html b/themes/conspiracy/layouts/_partials/card.html new file mode 100644 index 0000000..b158e59 --- /dev/null +++ b/themes/conspiracy/layouts/_partials/card.html @@ -0,0 +1,17 @@ +
+ {{- if .Title }}

{{ .Title }}

{{- end }} + {{- if and .Date (not (isset (index .Ancestors 0).Params "hide_date")) }}{{ .Date.Format "2006-01-02" }}{{- end }} + +
+ {{ .Summary }} + Read more +
+ + {{- if .Params.external_links }} + + {{- end }} +
diff --git a/themes/conspiracy/layouts/_partials/footer.html b/themes/conspiracy/layouts/_partials/footer.html new file mode 100644 index 0000000..adf7aee --- /dev/null +++ b/themes/conspiracy/layouts/_partials/footer.html @@ -0,0 +1,6 @@ +
+ Copyright © {{ now.Year }} {{ site.Copyright }} + {{- range site.Params.footer_links }} + / {{ .name }} + {{- end }} +
diff --git a/themes/conspiracy/layouts/_partials/head.html b/themes/conspiracy/layouts/_partials/head.html new file mode 100644 index 0000000..be59023 --- /dev/null +++ b/themes/conspiracy/layouts/_partials/head.html @@ -0,0 +1,17 @@ + + + {{ if .IsHome }}{{ else }}{{ if .Title }}{{ .Title }} | {{ end }}{{ end }}{{ site.Title }} + + + + + + + {{- $stylesheet := resources.Get "css/style.css" | resources.ExecuteAsTemplate "style.css" . }} + + + + + + + diff --git a/themes/conspiracy/layouts/_partials/header.html b/themes/conspiracy/layouts/_partials/header.html new file mode 100644 index 0000000..9dfaa04 --- /dev/null +++ b/themes/conspiracy/layouts/_partials/header.html @@ -0,0 +1,23 @@ + diff --git a/themes/conspiracy/layouts/baseof.html b/themes/conspiracy/layouts/baseof.html new file mode 100644 index 0000000..32a5423 --- /dev/null +++ b/themes/conspiracy/layouts/baseof.html @@ -0,0 +1,30 @@ + + + {{- partial "head.html" . -}} + + {{- partial "header.html" . -}} + {{- block "main" . }}{{- end }} + {{- partial "footer.html" . -}} + + + + + diff --git a/themes/conspiracy/layouts/home.html b/themes/conspiracy/layouts/home.html new file mode 100644 index 0000000..f865cd3 --- /dev/null +++ b/themes/conspiracy/layouts/home.html @@ -0,0 +1,25 @@ +{{- define "main" }} +
+

{{ .Title }}

+
+
+ {{- if .Content }} +
+ {{ .Content }} +
+ {{- end }} + + {{ range $config := site.Params.homepage_categories }} +

{{ .title }}

+ {{ range $entry := first $config.count (where site.RegularPages "Section" "==" $config.key) }} + {{ partial "card.html" $entry }} + {{ end }} + + + {{ end }} +
+{{- end }} diff --git a/themes/conspiracy/layouts/list.html b/themes/conspiracy/layouts/list.html new file mode 100644 index 0000000..02703b4 --- /dev/null +++ b/themes/conspiracy/layouts/list.html @@ -0,0 +1,18 @@ +{{- define "main" }} + {{- if not .IsHome | and .Title }} +
+

{{ .Title }}

+ {{- partial "breadcrumbs.html" . }} +
+ {{- end }} +
+ {{- if .Content }} +
+ {{ .Content }} +
+ {{- end }} + {{- range .Pages }} + {{ partial "card.html" . }} + {{- end }} +
+{{- end }} diff --git a/themes/conspiracy/layouts/single.html b/themes/conspiracy/layouts/single.html new file mode 100644 index 0000000..c7135f8 --- /dev/null +++ b/themes/conspiracy/layouts/single.html @@ -0,0 +1,23 @@ +{{- define "main" }} + {{- if not .IsHome | and .Title }} +
+

{{ .Title }}

+ {{- partial "breadcrumbs.html" . }} + {{- if .Params.Date }} {{ .Date.Format "2006-01-02" }}{{- end }} +
+ {{- end }} + {{- if .Params.noindex }} +
+ {{- else }} +
+ {{- end }} + {{- if .Params.external_links }} + + {{- end }} + {{ .Content }} +
+{{- end }} diff --git a/themes/conspiracy/theme.toml b/themes/conspiracy/theme.toml new file mode 100644 index 0000000..dbae125 --- /dev/null +++ b/themes/conspiracy/theme.toml @@ -0,0 +1,21 @@ +# theme.toml template for a Hugo theme +# See https://github.com/gohugoio/hugoThemes#themetoml for an example + +name = "Conspiracy" +license = "MIT" +licenselink = "https://github.com/yourname/yourtheme/blob/master/LICENSE" +description = "" +homepage = "http://example.com/" +tags = [] +features = [] +min_version = "0.41.0" + +[author] + name = "" + homepage = "" + +# If porting an existing theme +[original] + name = "" + homepage = "" + repo = "" diff --git a/themes/hugo-classic/README.md b/themes/hugo-classic/README.md deleted file mode 100644 index 5135313..0000000 --- a/themes/hugo-classic/README.md +++ /dev/null @@ -1,73 +0,0 @@ -# Hugo.io - Classic Theme - -Classic is forked from the **XMin** theme, written by [Yihui Xie](https://yihui.name). I made a fresh remix of it for my [personal blog](https://goodroot.ca). It provides some simplifications, `highlight.js` for syntax highlighting, emoji support, and slick fonts. - -### Instructions - -1: Install Hugo. - -``` -brew install hugo -``` - -2: Create a new site. - -``` -hugo new site classic -``` - -3: Change to themes dir. - -``` -cd classic/themes -``` - -4: Clone the repo - -``` -git clone git@github.com:goodroot/hugo-classic.git -``` - -5: Copy the contents of the `exampleSite` directory into {dir}/classic. - -6: Enjoy and customize to your hearts content! - -### New Posts - -To make new posts, simply use the command line: - -``` -hugo new post/good-to-great.md -``` - -### Header Colour - -To adjust the header colour, head to `static/css/style.css` and change... - -``` -header { - background: #613DC1; -} -``` - -... `background:` to any colour value you'd like! - -For header font: - -``` -header a { - color: #fff; -} -``` - -Change `color:` to a nice matching colour. - -#### Screenshot - -![Screenshot of Hugo Classic](https://github.com/goodroot/hugo-classic/raw/master/images/screenshot.png) - -## Blog Posts - -hugo-classic has appeared in... - -[15 Hugo Framework blog themes](https://terrty.net/2018/15-hugo-framework-blog-themes/) by [paskal](https://github.com/paskal) diff --git a/themes/hugo-classic/archetypes/default.md b/themes/hugo-classic/archetypes/default.md deleted file mode 100644 index fb98e92..0000000 --- a/themes/hugo-classic/archetypes/default.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: '' -date: '' ---- diff --git a/themes/hugo-classic/exampleSite/config.toml b/themes/hugo-classic/exampleSite/config.toml deleted file mode 100644 index f5ff3dd..0000000 --- a/themes/hugo-classic/exampleSite/config.toml +++ /dev/null @@ -1,33 +0,0 @@ -baseurl = "/" -languageCode = "en-us" -title = "Classic" -theme = "hugo-classic" -googleAnalytics = "" -ignoreFiles = ["\\.Rmd$", "_files$", "_cache$"] -preserveTaxonomyNames = true -enableEmoji = true -footnotereturnlinkcontents = "↩" - -[permalinks] - post = "/post/:year/:month/:day/:slug/" - -[[menu.main]] - name = "Home" - url = "/" - weight = 1 -[[menu.main]] - name = "Categories" - url = "/categories/" - weight = 2 -[[menu.main]] - name = "Tags" - url = "/tags/" - weight = 3 -[[menu.feed]] - name = "Subscribe" - url = "/index.xml" - -[params] - description = "A simple, minimal blog for those who love text." - footer = "Open-Source | [Github](https://github.com/goodroot/hugo-classic) | [Twitter](https://twitter.com/thegoodroot)" - custom_css = ["css/theme-override.css"] diff --git a/themes/hugo-classic/exampleSite/content/_index.md b/themes/hugo-classic/exampleSite/content/_index.md deleted file mode 100644 index 32af099..0000000 --- a/themes/hugo-classic/exampleSite/content/_index.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -title: Home ---- - -[Github repo](https://github.com/goodroot/hugo-classic) - -# Hugo.io - Classic - -### For text focused goodness - -About twenty years ago Jobs and Wozniak, the founders of Apple, came up with the very strange idea of selling information processing machines for use in the home. The business took off, and its founders made a lot of money and received the credit they deserved for being daring visionaries. But around the same time, Bill Gates and Paul Allen came up with an idea even stranger and more fantastical: **selling computer operating systems**. This was much weirder than the idea of Jobs and Wozniak. - -~~~ruby -def with_value_from_database(value) - self.class.from_database(name, value, type) -end - -def with_cast_value(value) - self.class.with_cast_value(name, value, type) -end -end -~~~ - -A computer at least had some sort of physical reality to it. It came in a box, you could open it up and plug it in and watch lights blink. An operating system had no tangible incarnation at all. It arrived on a disk, of course, but the disk was, in effect, nothing more than the box that the OS came in. - -
- -### Blog diff --git a/themes/hugo-classic/exampleSite/content/post/2012-01-23-juicy-code.md b/themes/hugo-classic/exampleSite/content/post/2012-01-23-juicy-code.md deleted file mode 100644 index 4614e74..0000000 --- a/themes/hugo-classic/exampleSite/content/post/2012-01-23-juicy-code.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Juicy Code -author: Open Source -date: '2012-01-23' -categories: - - Code -tags: - - Juicy -slug: juicy-code ---- - -Check out this JUICY! code: - -~~~ruby -def with_value_from_database(value) - self.class.from_database(name, value, type) -end - -def with_cast_value(value) - self.class.with_cast_value(name, value, type) -end - -def with_type(type) - if changed_in_place? - with_value_from_user(value).with_type(type) - else - self.class.new(name, value_before_type_cast, type, original_attribute) - end -end -~~~ diff --git a/themes/hugo-classic/exampleSite/content/post/2012-04-23-hacker-with-horn.md b/themes/hugo-classic/exampleSite/content/post/2012-04-23-hacker-with-horn.md deleted file mode 100644 index 8511d11..0000000 --- a/themes/hugo-classic/exampleSite/content/post/2012-04-23-hacker-with-horn.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -title: Hacker with Bullhorn -author: Open-Source -date: '2012-04-23' -categories: - - Bullhorn - - Example -slug: hacker-with-horn ---- - -Hacker with bullhorn: "Save your money! Accept one of our free tanks! It is invulnerable, and can drive across rocks and swamps at ninety miles an hour while getting a hundred miles to the gallon!" - -Prospective station wagon buyer: "I know what you say is true...but...er...I don't know how to maintain a tank!" - -Bullhorn: "You don't know how to maintain a station wagon either!" - -Buyer: "But this dealership has mechanics on staff. If something goes wrong with my station wagon, I can take a day off work, bring it here, and pay them to work on it while I sit in the waiting room for hours, listening to elevator music." - -Bullhorn: "But if you accept one of our free tanks we will send volunteers to your house to fix it for free while you sleep!" - -Buyer: "Stay away from my house, you freak!" - -Bullhorn: "But..." - -Buyer: "Can't you see that everyone is buying station wagons?" diff --git a/themes/hugo-classic/exampleSite/content/post/2015-07-23-command-line-awesomeness.md b/themes/hugo-classic/exampleSite/content/post/2015-07-23-command-line-awesomeness.md deleted file mode 100644 index 6914648..0000000 --- a/themes/hugo-classic/exampleSite/content/post/2015-07-23-command-line-awesomeness.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -title: "Command Line Awesomeness" -date: '2012-03-12' -categories: - - Blog -tags: - - HTML ---- - -This crud is called HTML (HyperText Markup Language) and it is basically a very simple programming language instructing your web browser how to draw a page on a screen. Anyone can learn HTML and many people do. The important thing is that no matter what splendid multimedia web pages they might represent, HTML files are just telegrams. - -> When Ronald Reagan was a radio announcer, he used to call baseball games by reading the terse descriptions that trickled in over the telegraph wire and were printed out on a paper tape. He would sit there, all by himself in a padded room with a microphone, and the paper tape would eke out of the machine and crawl over the palm of his hand printed with cryptic abbreviations. If the count went to three and two, Reagan would describe the scene as he saw it in his mind's eye: "The brawny left-hander steps out of the batter's box to wipe the sweat from his brow. The umpire steps forward to sweep the dirt from home plate." and so on. When the cryptogram on the paper tape announced a base hit, he would whack the edge of the table with a pencil, creating a little sound effect, and describe the arc of the ball as if he could actually see it. His listeners, many of whom presumably thought that Reagan was actually at the ballpark watching the game, would reconstruct the scene in their minds according to his descriptions. - -This is exactly how the World Wide Web works: the HTML files are the pithy description on the paper tape, and your Web browser is Ronald Reagan. The same is true of Graphical User Interfaces in general. diff --git a/themes/hugo-classic/exampleSite/content/post/2016-02-14-markdown-guide.md b/themes/hugo-classic/exampleSite/content/post/2016-02-14-markdown-guide.md deleted file mode 100644 index fc64964..0000000 --- a/themes/hugo-classic/exampleSite/content/post/2016-02-14-markdown-guide.md +++ /dev/null @@ -1,171 +0,0 @@ ---- -title: Markdown Guide -author: Open Source -date: '2014-03-14' -categories: - - Example -tags: - - Markdown ---- - -An h1 header -============ - -Paragraphs are separated by a blank line. - -2nd paragraph. *Italic*, **bold**, and `monospace`. Itemized lists -look like: - - * this one - * that one - * the other one - -Note that --- not considering the asterisk --- the actual text -content starts at 4-columns in. - -> Block quotes are -> written like so. -> -> They can span multiple paragraphs, -> if you like. - -Use 3 dashes for an em-dash. Use 2 dashes for ranges (ex., "it's all -in chapters 12--14"). Three dots ... will be converted to an ellipsis. -Unicode is supported. ☺ - - - -An h2 header ------------- - -Here's a numbered list: - - 1. first item - 2. second item - 3. third item - -Note again how the actual text starts at 4 columns in (4 characters -from the left side). Here's a code sample: - - # Let me re-iterate ... - for i in 1 .. 10 { do-something(i) } - -As you probably guessed, indented 4 spaces. By the way, instead of -indenting the block, you can use delimited blocks, if you like: - -~~~ -define foobar() { - print "Welcome to flavor country!"; -} -~~~ - -(which makes copying & pasting easier). You can optionally mark the -delimited block for Pandoc to syntax highlight it: - -~~~python -import time -# Quick, count to ten! -for i in range(10): - # (but not *too* quick) - time.sleep(0.5) - print i -~~~ - - - -### An h3 header ### - -Now a nested list: - - 1. First, get these ingredients: - - * carrots - * celery - * lentils - - 2. Boil some water. - - 3. Dump everything in the pot and follow - this algorithm: - - find wooden spoon - uncover pot - stir - cover pot - balance wooden spoon precariously on pot handle - wait 10 minutes - goto first step (or shut off burner when done) - - Do not bump wooden spoon or it will fall. - -Notice again how text always lines up on 4-space indents (including -that last line which continues item 3 above). - -Here's a link to [a website](http://foo.bar), to a [local -doc](local-doc.html), and to a [section heading in the current -doc](#an-h2-header). Here's a footnote [^1]. - -[^1]: Footnote text goes here. - -Tables can look like this: - -size material color ----- ------------ ------------ -9 leather brown -10 hemp canvas natural -11 glass transparent - -Table: Shoes, their sizes, and what they're made of - -(The above is the caption for the table.) Pandoc also supports -multi-line tables: - --------- ----------------------- -keyword text --------- ----------------------- -red Sunsets, apples, and - other red or reddish - things. - -green Leaves, grass, frogs - and other things it's - not easy being. --------- ----------------------- - -A horizontal rule follows. - -*** - -Here's a definition list: - -apples - : Good for making applesauce. -oranges - : Citrus! -tomatoes - : There's no "e" in tomatoe. - -Again, text is indented 4 spaces. (Put a blank line between each -term/definition pair to spread things out more.) - -Here's a "line block": - -| Line one -| Line too -| Line tree - -and images can be specified like so: - -![example image](example-image.jpg "An exemplary image") - -Inline math equations go in like so: $\omega = d\phi / dt$. Display -math should get its own line and be put in in double-dollarsigns: - -$$I = \int \rho R^{2} dV$$ - -And note that you can backslash-escape any punctuation characters -which you wish to be displayed literally, ex.: \`foo\`, \*bar\*, etc. - -#### Images auto center: - -![Party](http://emojis.slackmojis.com/emojis/images/1475875185/1223/party-dinosaur.gif?1475875185) diff --git a/themes/hugo-classic/exampleSite/static/css/theme-override.css b/themes/hugo-classic/exampleSite/static/css/theme-override.css deleted file mode 100644 index c761e7f..0000000 --- a/themes/hugo-classic/exampleSite/static/css/theme-override.css +++ /dev/null @@ -1 +0,0 @@ -footer { font-size: 90%; font-family: monospace; } diff --git a/themes/hugo-classic/images/partywizard.gif b/themes/hugo-classic/images/partywizard.gif deleted file mode 100644 index 1c1d813..0000000 Binary files a/themes/hugo-classic/images/partywizard.gif and /dev/null differ diff --git a/themes/hugo-classic/images/screenshot.png b/themes/hugo-classic/images/screenshot.png deleted file mode 100644 index 56f82ac..0000000 Binary files a/themes/hugo-classic/images/screenshot.png and /dev/null differ diff --git a/themes/hugo-classic/images/tn.png b/themes/hugo-classic/images/tn.png deleted file mode 100644 index f58c780..0000000 Binary files a/themes/hugo-classic/images/tn.png and /dev/null differ diff --git a/themes/hugo-classic/layouts/404.html b/themes/hugo-classic/layouts/404.html deleted file mode 100644 index c2e4e40..0000000 --- a/themes/hugo-classic/layouts/404.html +++ /dev/null @@ -1,5 +0,0 @@ -{{ partial "header.html" . }} - -404 NOT FOUND - -{{ partial "footer.html" . }} diff --git a/themes/hugo-classic/layouts/_default/list.html b/themes/hugo-classic/layouts/_default/list.html deleted file mode 100644 index 41d9d89..0000000 --- a/themes/hugo-classic/layouts/_default/list.html +++ /dev/null @@ -1,18 +0,0 @@ -{{ partial "header.html" . }} - -{{if not .IsHome }} -

{{ .Title }}

-{{ end }} - -{{ .Content }} - -
    - {{ range (where .Data.Pages "Section" "!=" "") }} -
  • - {{ .Date.Format "2006/01/02" }} - {{ .Title }} -
  • - {{ end }} -
- -{{ partial "footer.html" . }} diff --git a/themes/hugo-classic/layouts/_default/single.html b/themes/hugo-classic/layouts/_default/single.html deleted file mode 100644 index b3b5570..0000000 --- a/themes/hugo-classic/layouts/_default/single.html +++ /dev/null @@ -1,23 +0,0 @@ -{{ partial "header.html" . }} - - -{{ if .Params.toc }} -{{ .TableOfContents }} -{{ end }} - -
-{{ .Content }} -
- -{{ partial "footer.html" . }} diff --git a/themes/hugo-classic/layouts/_default/terms.html b/themes/hugo-classic/layouts/_default/terms.html deleted file mode 100644 index 4f6f544..0000000 --- a/themes/hugo-classic/layouts/_default/terms.html +++ /dev/null @@ -1,16 +0,0 @@ -{{ partial "header.html" . }} - -

{{ .Title }}

- -
    - {{ range $key, $value := .Data.Terms }} -
  • - - {{ $key }} - - ({{ len $value }}) -
  • - {{ end }} -
- -{{ partial "footer.html" . }} diff --git a/themes/hugo-classic/layouts/partials/foot_custom.html b/themes/hugo-classic/layouts/partials/foot_custom.html deleted file mode 100644 index 3d9fb1d..0000000 --- a/themes/hugo-classic/layouts/partials/foot_custom.html +++ /dev/null @@ -1,25 +0,0 @@ - - diff --git a/themes/hugo-classic/layouts/partials/footer.html b/themes/hugo-classic/layouts/partials/footer.html deleted file mode 100644 index 8b721a8..0000000 --- a/themes/hugo-classic/layouts/partials/footer.html +++ /dev/null @@ -1,16 +0,0 @@ - - - diff --git a/themes/hugo-classic/layouts/partials/head_custom.html b/themes/hugo-classic/layouts/partials/head_custom.html deleted file mode 100644 index 6520ca0..0000000 --- a/themes/hugo-classic/layouts/partials/head_custom.html +++ /dev/null @@ -1,33 +0,0 @@ -
- - - - - - -
diff --git a/themes/hugo-classic/layouts/partials/header.html b/themes/hugo-classic/layouts/partials/header.html deleted file mode 100644 index 6ef9a69..0000000 --- a/themes/hugo-classic/layouts/partials/header.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - {{ .Title }} | {{ .Site.Title }} - - - {{ range .Site.Params.custom_css -}} - - {{- end }} - {{ partial "head_custom.html" . }} - - - -
diff --git a/themes/hugo-classic/static/css/fonts.css b/themes/hugo-classic/static/css/fonts.css deleted file mode 100644 index c851143..0000000 --- a/themes/hugo-classic/static/css/fonts.css +++ /dev/null @@ -1,7 +0,0 @@ -body { - font-family: -apple-system, BlinkMacSystemFont, 'Avenir Next', Avenir, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; -} -code { - font-family: "Lucida Console", Monaco, monospace; - font-size: 85%; -} diff --git a/themes/hugo-classic/static/css/style.css b/themes/hugo-classic/static/css/style.css deleted file mode 100644 index 47e5233..0000000 --- a/themes/hugo-classic/static/css/style.css +++ /dev/null @@ -1,273 +0,0 @@ -/* @import url('https://fonts.googleapis.com/css?family=Roboto+Slab:400,700|Source+Serif+Pro'); */ -/* @import url('https://fonts.googleapis.com/css?family=Fredoka+One|Source+Serif+Pro'); */ -@import url('https://fonts.googleapis.com/css?family=Baloo|Source+Serif+Pro'); -@import url('https://fonts.googleapis.com/css?family=Ubuntu+Mono'); - -body { - max-width: 800px; - margin: auto; - padding: .2em; - line-height: 20pt; - font-size: 12pt; -} - -/* Table of Contents, if wanted - -Add to yaml: - -output: -blogdown::html_page: -toc: true - - */ - -#TableOfContents, #TOC { - border: 1px solid #eee; -} - -/* Header and Footer */ -.menu li { display: inline-block; } -.article-meta, .menu a { - text-decoration: none; - background: #ff99cc; - color: #FFF; - padding: 5px; - text-shadow: 0px 1px 1px #fe3ea0; -} - - -.article-meta h1, .article-meta h2 { - margin-top: 1em; - color: white; -} - - -.terms { font-size: .9em; } -.menu, .article-meta, footer { text-align: center; } -.title { font-size: 1.1em; } -footer a { text-decoration: none; } - -.pull-left { - float: left -} -.pull-right { - float: right -} - -a { - color: #ff6bb6; - text-decoration: none; -} - -a:hover { - background: #83cbe3; - color: white; -} - -/* Adjust background at your leisure! */ -header { - position: relative; - width: 100%; - height: 1.75rem; - font-size: .875rem; - background: #83cbe3; - font-family: 'Baloo', sans-serif; -} - -h1, h2, h3, h4, h5, h6 { - margin-top: 2em; - font-family: 'Baloo', sans-serif; - /* color: #ff99cc; */ - color: #ff6bb6; -} - -li { - padding-bottom: 1em; -} - -header ul, -header ol { - margin: 0; - padding: 0; - list-style: none -} -header nav { - padding: 0 0.5rem -} - -header a { - color: #fff; - line-height: 1.75rem; - padding: 0 0.5rem -} -header a:hover, -header .current a { - color: #fff -} - -/* Code Boxes */ -pre { - border: 1px solid #ddd; - box-shadow: 5px 5px 5px #eee; - background: #f8f8f8; - padding: 1em; - overflow-x: auto; -} -code { background: #f9f9f9; } -pre code { background: none; } - -/* Images, tables, misc. */ -img, iframe, video { max-width: 100%; } -main { - text-align: justify; - word-wrap: break-word; - font-family: "Source Serif Pro", "Times New Roman", serif; - color: #555; - hyphens: auto; -} - -/* Caution! duplicate this rule below. */ -::selection { - background: #83cbe3; - color: white; -} - -::-moz-selection { - background: #83cbe3; - color: white; -} - -/* Caution! duplicate this rule below. */ -figcaption::selection { - background: #ff99cc; - color: white; -} - -figcaption::-moz-selection { - background: #ff99cc; - color: white; -} - -/* Caution! duplicate this rule below. */ -a::-moz-selection { - background: #ff99cc; - color: white; -} - -a::selection { - background: #ff99cc; - color: white; -} - -blockquote { - background: #f9f9f9; - border-left: 5px solid #ffc6e3; - padding: 3px 1em 3px; -} - -table { - margin: auto; - border-top: 1px solid #666; - border-bottom: 1px solid #666; -} -table thead th { border-bottom: 1px solid #ddd; } -th, td { padding: 5px; } -tr:nth-child(even) { background: #eee } - -table.footnote { - margin: 0; - border: 0; -} - -table.footnote:nth-of-type(1) { - position: relative; - margin-top: 6em; -} - -table.footnote:nth-of-type(1)::before { - content: "Footnotes:"; - position: absolute; - top: -2em; - border-top: 1px solid black; - border-bottom: 0; - width: 20em; -} - -/* Inline code markup */ -tt.literal { - font-family: 'Ubuntu Mono', monospace; - background: #e2f3f8; - color: #164d60; - font-weight: bold; - font-size: 10pt; - padding: 2px; - border-radius: 0.3em; -} - -figure.side-by-side { - width: 49%; - min-width: 15em; - display: inline-block; - margin: 0 0 0 0; - padding: 0 40px 0 0; - vertical-align: top; - box-sizing: border-box; -} - -/* -figure figure.side-by-side:nth-of-type(2) { - padding: 0; -} -*/ - -figure img, figure video { - display: block; - margin-left: auto; - margin-right: auto; - width: 100%; -} - -figcaption a { - background: white; - color: #83cbe3; -} - -figcaption a:hover { - background: #ff6bb6; -} - -figcaption { - display: block; - line-height: 16pt; - background: #83cbe3; - color: white; - font-family: 'Baloo', sans-serif; - padding: 1em; - border-radius: 0 0 0.5em 0.5em; -} - -figure { - margin-top: 3em; - margin-bottom: 3em; -} - -figure.header { - margin-left: 0; - margin-right: 0; - margin-top: 0; -} - -#license-info img { - vertical-align: middle; -} - -#license-info, -#imprint-info { - color: #aaa; - font-size: 10pt; - font-family: "Source Serif Pro", "Times New Roman", serif; -} - -div.document { - margin-bottom: 4em; -} diff --git a/themes/hugo-classic/theme.toml b/themes/hugo-classic/theme.toml deleted file mode 100644 index 9ca39f4..0000000 --- a/themes/hugo-classic/theme.toml +++ /dev/null @@ -1,17 +0,0 @@ -name = "Hugo - Classic" -license = "MIT" -licenselink = "https://github.com/goodroot/hugo-classic/blob/master/LICENSE.md" -description = "A minimal blog theme, for those who love text. Based off the eXtremely minimal theme by Yihui Xui." -homepage = "https://goodroot.ca" -tags = ["minimal", "blog", "personal", "simple", "clean", "starter", "minimalist"] -features = ["blog"] -min_version = "0.18" - -[author] - name = "Kellen Evan Person" - homepage = "https://goodroot.ca" - -[original] - author = "Yihui Xui" - homepage = "https://xmin.yihui.name/" - repo = "https://github.com/yihui/hugo-xmin"